[mapnik] 01/14: Imported Upstream version 3.0.0~rc2+dfsg
Jérémy Lal
kapouer at moszumanska.debian.org
Tue May 26 21:00:48 UTC 2015
This is an automated email from the git hooks/post-receive script.
kapouer pushed a commit to branch master
in repository mapnik.
commit 5685b9fbddd041e1e625d69398507465a84a99e8
Author: Jérémy Lal <kapouer at melix.org>
Date: Sat May 23 19:14:01 2015 +0200
Imported Upstream version 3.0.0~rc2+dfsg
---
.gitignore | 10 +-
.gitmodules | 6 +
.travis.yml | 117 +-
AUTHORS.md | 3 +
CHANGELOG.md | 6 +-
INSTALL.md | 33 +-
Makefile | 66 +-
SConstruct | 405 +-
benchmark/bench_framework.hpp | 57 +-
benchmark/build.py | 4 +-
benchmark/compare_images.hpp | 22 +-
benchmark/data/gdal-wgs.xml | 21 +
benchmark/data/polygon_clipping_agg.png | Bin 4991 -> 8884 bytes
benchmark/data/polygon_clipping_boost.png | Bin 4991 -> 8765 bytes
benchmark/data/polygon_clipping_clipper.png | Bin 5029 -> 8723 bytes
benchmark/data/raster-wgs.xml | 21 +
benchmark/data/valid.geotiff.tif | Bin 0 -> 2736832 bytes
benchmark/run | 20 +-
benchmark/test_array_allocation.cpp | 95 +-
benchmark/test_expression_parse.cpp | 3 +-
benchmark/test_face_ptr_creation.cpp | 3 +-
benchmark/test_font_registration.cpp | 5 +-
benchmark/test_numeric_cast_vs_static_cast.cpp | 87 +
benchmark/test_png_encoding1.cpp | 6 +-
benchmark/test_png_encoding2.cpp | 13 +-
benchmark/test_polygon_clipping.cpp | 454 +-
benchmark/test_polygon_clipping_rendering.cpp | 14 +-
benchmark/test_proj_transform1.cpp | 3 +-
benchmark/test_rendering.cpp | 20 +-
benchmark/test_rendering_shared_map.cpp | 72 +-
benchmark/test_to_bool.cpp | 3 +-
benchmark/test_to_double.cpp | 3 +-
benchmark/test_to_int.cpp | 3 +-
benchmark/test_to_string1.cpp | 3 +-
benchmark/test_to_string2.cpp | 3 +-
benchmark/test_utf_encoding.cpp | 9 +-
bindings/python/boost_std_shared_shim.hpp | 49 -
bindings/python/build.py | 211 -
bindings/python/mapnik/__init__.py | 1074 ---
bindings/python/mapnik/printing.py | 1027 ---
bindings/python/mapnik2/__init__.py | 27 -
bindings/python/mapnik_color.cpp | 104 -
bindings/python/mapnik_coord.cpp | 73 -
bindings/python/mapnik_datasource.cpp | 213 -
bindings/python/mapnik_datasource_cache.cpp | 104 -
bindings/python/mapnik_enumeration.hpp | 88 -
.../mapnik_enumeration_wrapper_converter.hpp | 45 -
bindings/python/mapnik_envelope.cpp | 301 -
bindings/python/mapnik_expression.cpp | 111 -
bindings/python/mapnik_feature.cpp | 255 -
bindings/python/mapnik_featureset.cpp | 93 -
bindings/python/mapnik_font_engine.cpp | 60 -
bindings/python/mapnik_fontset.cpp | 64 -
bindings/python/mapnik_gamma_method.cpp | 49 -
bindings/python/mapnik_geometry.cpp | 281 -
bindings/python/mapnik_grid.cpp | 95 -
bindings/python/mapnik_grid_view.cpp | 64 -
bindings/python/mapnik_image.cpp | 313 -
bindings/python/mapnik_image_view.cpp | 149 -
.../python/mapnik_label_collision_detector.cpp | 131 -
bindings/python/mapnik_layer.cpp | 388 -
bindings/python/mapnik_logger.cpp | 83 -
bindings/python/mapnik_map.cpp | 543 --
bindings/python/mapnik_palette.cpp | 70 -
bindings/python/mapnik_parameters.cpp | 234 -
bindings/python/mapnik_proj_transform.cpp | 154 -
bindings/python/mapnik_projection.cpp | 125 -
bindings/python/mapnik_python.cpp | 948 --
bindings/python/mapnik_query.cpp | 107 -
bindings/python/mapnik_raster_colorizer.cpp | 230 -
bindings/python/mapnik_rule.cpp | 100 -
bindings/python/mapnik_scaling_method.cpp | 58 -
bindings/python/mapnik_style.cpp | 118 -
bindings/python/mapnik_svg.hpp | 56 -
bindings/python/mapnik_svg_generator_grammar.cpp | 28 -
bindings/python/mapnik_symbolizer.cpp | 423 -
bindings/python/mapnik_text_placement.cpp | 587 --
bindings/python/mapnik_threads.hpp | 109 -
bindings/python/mapnik_value_converter.hpp | 90 -
bindings/python/mapnik_view_transform.cpp | 92 -
bindings/python/python_grid_utils.cpp | 405 -
bindings/python/python_grid_utils.hpp | 79 -
bindings/python/python_optional.hpp | 198 -
bindings/python/python_to_value.hpp | 96 -
bootstrap.sh | 137 +
demo/c++/rundemo.cpp | 16 +-
demo/python/rundemo.py | 8 +-
demo/viewer/about_dialog.cpp | 2 +-
demo/viewer/about_dialog.hpp | 2 +-
demo/viewer/info_dialog.cpp | 2 +-
demo/viewer/info_dialog.hpp | 2 +-
demo/viewer/layer_info_dialog.cpp | 2 +-
demo/viewer/layer_info_dialog.hpp | 2 +-
demo/viewer/layerdelegate.cpp | 3 +-
demo/viewer/layerdelegate.hpp | 2 +-
demo/viewer/layerlistmodel.cpp | 2 +-
demo/viewer/layerlistmodel.hpp | 2 +-
demo/viewer/layerwidget.cpp | 2 +-
demo/viewer/layerwidget.hpp | 2 +-
demo/viewer/main.cpp | 2 +-
demo/viewer/mainwindow.cpp | 2 +-
demo/viewer/mainwindow.hpp | 2 +-
demo/viewer/mapwidget.cpp | 103 +-
demo/viewer/mapwidget.hpp | 2 +-
demo/viewer/styles_model.cpp | 14 +-
demo/viewer/styles_model.hpp | 2 +-
deps/agg/include/agg_color_gray.h | 1195 ++-
deps/agg/include/agg_color_rgba.h | 1689 ++--
deps/agg/include/agg_conv_clipper.h | 295 -
deps/agg/include/agg_conv_offset.h | 236 +
deps/agg/include/agg_ellipse.h | 1 +
deps/agg/include/agg_gamma_functions.h | 9 +
deps/agg/include/agg_gamma_lut.h | 212 +-
deps/agg/include/agg_pixfmt_base.h | 97 +
deps/agg/include/agg_pixfmt_gray.h | 545 +-
.../geometry/extensions/index/rtree/helpers.hpp | 68 -
.../geometry/extensions/index/rtree/rtree.hpp | 773 --
.../geometry/extensions/index/rtree/rtree_leaf.hpp | 252 -
.../geometry/extensions/index/rtree/rtree_node.hpp | 493 -
deps/clipper/include/clipper.hpp | 243 +-
deps/clipper/src/clipper.cpp | 3119 ++++---
deps/mapnik/sparsehash/internal/densehashtable.h | 4 +-
docs/contributing.markdown | 54 +
include/mapnik/agg_helpers.hpp | 2 +-
include/mapnik/agg_pattern_source.hpp | 12 +-
include/mapnik/agg_rasterizer.hpp | 6 +-
include/mapnik/agg_render_marker.hpp | 147 +
include/mapnik/agg_renderer.hpp | 19 +-
include/mapnik/attribute.hpp | 15 +-
include/mapnik/attribute_collector.hpp | 14 +-
include/mapnik/attribute_descriptor.hpp | 14 +-
include/mapnik/boolean.hpp | 5 +-
include/mapnik/box2d.hpp | 2 +-
include/mapnik/cairo/cairo_context.hpp | 27 +-
include/mapnik/cairo/cairo_image_util.hpp | 84 +
include/mapnik/cairo/cairo_render_vector.hpp | 10 +-
include/mapnik/cairo/cairo_renderer.hpp | 10 +-
include/mapnik/cairo_io.hpp | 49 +
include/mapnik/color.hpp | 43 +-
include/mapnik/color_factory.hpp | 2 +-
include/mapnik/config.hpp | 2 +-
include/mapnik/config_error.hpp | 2 +-
include/mapnik/coord.hpp | 2 +-
include/mapnik/coord_array.hpp | 113 -
include/mapnik/css_color_grammar.hpp | 2 +-
include/mapnik/css_color_grammar_impl.hpp | 2 +-
include/mapnik/datasource.hpp | 31 +-
include/mapnik/datasource_cache.hpp | 6 +-
include/mapnik/datasource_geometry_type.hpp | 41 +
include/mapnik/debug.hpp | 21 +-
include/mapnik/ellipsoid.hpp | 2 +-
include/mapnik/enumeration.hpp | 19 +-
include/mapnik/evaluate_global_attributes.hpp | 14 +-
include/mapnik/expression.hpp | 2 +-
include/mapnik/expression_evaluator.hpp | 6 +-
include/mapnik/expression_grammar.hpp | 8 +-
include/mapnik/expression_grammar_impl.hpp | 2 +-
include/mapnik/expression_node.hpp | 62 +-
include/mapnik/expression_node_types.hpp | 32 +-
include/mapnik/expression_string.hpp | 2 +-
include/mapnik/factory.hpp | 2 +-
include/mapnik/feature.hpp | 64 +-
include/mapnik/feature_factory.hpp | 2 +-
include/mapnik/feature_kv_iterator.hpp | 2 +-
include/mapnik/feature_layer_desc.hpp | 20 +-
include/mapnik/feature_style_processor.hpp | 2 +-
include/mapnik/feature_style_processor_context.hpp | 2 +-
include/mapnik/feature_style_processor_impl.hpp | 2 +-
include/mapnik/feature_type_style.hpp | 2 +-
include/mapnik/featureset.hpp | 6 +-
include/mapnik/filter_featureset.hpp | 2 +-
include/mapnik/font_engine_freetype.hpp | 6 +-
include/mapnik/font_set.hpp | 2 +-
include/mapnik/geom_util.hpp | 36 +-
include/mapnik/geometry.hpp | 198 +-
include/mapnik/geometry_adapters.hpp | 221 +
include/mapnik/geometry_centroid.hpp | 106 +
include/mapnik/geometry_container.hpp | 39 -
include/mapnik/geometry_correct.hpp | 93 +
include/mapnik/geometry_envelope.hpp | 38 +
include/mapnik/geometry_envelope_impl.hpp | 152 +
include/mapnik/geometry_fusion_adapted.hpp | 53 +
include/mapnik/geometry_is_empty.hpp | 92 +
include/mapnik/geometry_is_simple.hpp | 108 +
include/mapnik/geometry_is_valid.hpp | 112 +
include/mapnik/geometry_reprojection.hpp | 64 +
include/mapnik/geometry_reprojection_impl.hpp | 400 +
include/mapnik/geometry_strategy.hpp | 250 +
include/mapnik/geometry_to_path.hpp | 166 +
include/mapnik/geometry_transform.hpp | 220 +
include/mapnik/geometry_type.hpp | 98 +
include/mapnik/geometry_types.hpp | 45 +
include/mapnik/geometry_unique.hpp | 82 +
include/mapnik/global.hpp | 4 +-
include/mapnik/gradient.hpp | 10 +-
include/mapnik/graphics.hpp | 313 -
include/mapnik/grid/grid.hpp | 49 +-
include/mapnik/grid/grid_marker_helpers.hpp | 236 -
include/mapnik/grid/grid_pixel.hpp | 2 +-
include/mapnik/grid/grid_pixfmt.hpp | 2 +-
include/mapnik/grid/grid_rasterizer.hpp | 6 +-
include/mapnik/grid/grid_render_marker.hpp | 72 +
include/mapnik/grid/grid_renderer.hpp | 8 +-
include/mapnik/grid/grid_renderer_base.hpp | 2 +-
include/mapnik/grid/grid_rendering_buffer.hpp | 2 +-
include/mapnik/grid/grid_util.hpp | 4 +-
include/mapnik/grid/grid_view.hpp | 24 +-
include/mapnik/group/group_layout.hpp | 2 +-
include/mapnik/group/group_layout_manager.hpp | 2 +-
include/mapnik/group/group_rule.hpp | 2 +-
include/mapnik/group/group_symbolizer_helper.hpp | 19 +-
.../mapnik/group/group_symbolizer_properties.hpp | 2 +-
include/mapnik/hextree.hpp | 24 +-
include/mapnik/hit_test_filter.hpp | 140 +-
include/mapnik/image.hpp | 146 +
include/mapnik/image_any.hpp | 85 +
include/mapnik/image_compositing.hpp | 19 +-
include/mapnik/image_copy.hpp | 72 +
include/mapnik/image_data.hpp | 191 -
include/mapnik/image_filter.hpp | 14 +-
include/mapnik/image_filter_grammar.hpp | 2 +-
include/mapnik/image_filter_grammar_impl.hpp | 2 +-
include/mapnik/image_filter_types.hpp | 8 +-
include/mapnik/image_impl.hpp | 317 +
include/mapnik/image_null.hpp | 79 +
include/mapnik/image_options.hpp | 38 +
include/mapnik/image_reader.hpp | 22 +-
include/mapnik/image_scaling.hpp | 33 +-
include/mapnik/image_scaling_traits.hpp | 209 +
include/mapnik/image_util.hpp | 376 +-
include/mapnik/image_util_jpeg.hpp | 44 +
include/mapnik/image_util_png.hpp | 55 +
include/mapnik/image_util_tiff.hpp | 44 +
include/mapnik/image_util_webp.hpp | 44 +
include/mapnik/image_view.hpp | 120 +-
include/mapnik/image_view_any.hpp | 65 +
include/mapnik/image_view_impl.hpp | 160 +
include/mapnik/image_view_null.hpp | 65 +
include/mapnik/jpeg_io.hpp | 4 +-
include/mapnik/json/error_handler.hpp | 7 +-
.../mapnik/json/extract_bounding_box_grammar.hpp | 107 +
.../json/extract_bounding_box_grammar_impl.hpp | 135 +
include/mapnik/json/feature_collection_grammar.hpp | 48 +-
.../json/feature_collection_grammar_impl.hpp | 31 +-
include/mapnik/json/feature_generator.hpp | 4 +-
include/mapnik/json/feature_generator_grammar.hpp | 101 +-
.../mapnik/json/feature_generator_grammar_impl.hpp | 66 +-
include/mapnik/json/feature_grammar.hpp | 24 +-
include/mapnik/json/feature_grammar_impl.hpp | 38 +-
include/mapnik/json/feature_parser.hpp | 10 +-
include/mapnik/json/generic_json.hpp | 113 +-
include/mapnik/json/geometry_generator_grammar.hpp | 127 +-
.../json/geometry_generator_grammar_impl.hpp | 131 +-
include/mapnik/json/geometry_grammar.hpp | 14 +-
include/mapnik/json/geometry_grammar_impl.hpp | 10 +-
include/mapnik/json/geometry_parser.hpp | 18 +-
include/mapnik/json/geometry_util.hpp | 194 +-
include/mapnik/json/positions_grammar.hpp | 10 +-
.../mapnik/json/properties_generator_grammar.hpp | 83 +
.../json/properties_generator_grammar_impl.hpp | 92 +
include/mapnik/json/symbolizer_grammar.hpp | 6 +-
include/mapnik/json/topojson_grammar.hpp | 5 +-
include/mapnik/json/topojson_grammar_impl.hpp | 30 +-
include/mapnik/json/topojson_utils.hpp | 208 +-
include/mapnik/json/topology.hpp | 10 +-
include/mapnik/label_collision_detector.hpp | 10 +-
include/mapnik/layer.hpp | 30 +-
include/mapnik/load_map.hpp | 2 +-
include/mapnik/map.hpp | 4 +-
include/mapnik/mapped_memory_cache.hpp | 6 +-
include/mapnik/marker.hpp | 192 +-
include/mapnik/marker_cache.hpp | 18 +-
include/mapnik/marker_helpers.hpp | 329 +-
include/mapnik/markers_placement.hpp | 6 +-
include/mapnik/markers_placements/interior.hpp | 9 +-
include/mapnik/markers_placements/line.hpp | 215 +-
include/mapnik/markers_placements/point.hpp | 51 +-
.../mapnik/markers_placements/vertext_first.hpp | 10 +-
include/mapnik/markers_placements/vertext_last.hpp | 11 +-
include/mapnik/memory.hpp | 2 +-
include/mapnik/memory_datasource.hpp | 4 +-
include/mapnik/memory_featureset.hpp | 12 +-
include/mapnik/miniz_png.hpp | 16 +-
include/mapnik/noncopyable.hpp | 45 -
include/mapnik/octree.hpp | 16 +-
include/mapnik/offset_converter.hpp | 28 +-
include/mapnik/palette.hpp | 24 +-
include/mapnik/params.hpp | 24 +-
include/mapnik/params_impl.hpp | 66 +-
include/mapnik/parse_path.hpp | 2 +-
include/mapnik/parse_transform.hpp | 2 +-
include/mapnik/path.hpp | 184 +
include/mapnik/path_expression.hpp | 2 +-
include/mapnik/path_expression_grammar.hpp | 2 +-
include/mapnik/path_expression_grammar_impl.hpp | 6 +-
include/mapnik/pixel_position.hpp | 2 +-
include/mapnik/pixel_types.hpp | 61 +
include/mapnik/plugin.hpp | 6 +-
include/mapnik/png_io.hpp | 58 +-
include/mapnik/polygon_clipper.hpp | 283 -
include/mapnik/pool.hpp | 19 +-
include/mapnik/proj_strategy.hpp | 149 +
include/mapnik/proj_transform.hpp | 20 +-
include/mapnik/projection.hpp | 2 +-
include/mapnik/ptree_helpers.hpp | 2 +-
include/mapnik/quad_tree.hpp | 6 +-
include/mapnik/query.hpp | 2 +-
include/mapnik/raster.hpp | 27 +-
include/mapnik/raster_colorizer.hpp | 16 +-
include/mapnik/renderer_common.hpp | 6 +-
.../renderer_common/apply_vertex_converter.hpp | 44 +
.../mapnik/renderer_common/pattern_alignment.hpp | 68 +
.../process_building_symbolizer.hpp | 155 +-
.../renderer_common/process_group_symbolizer.hpp | 88 +-
.../renderer_common/process_markers_symbolizer.hpp | 388 +-
.../renderer_common/process_point_symbolizer.hpp | 74 +-
.../renderer_common/process_polygon_symbolizer.hpp | 21 +-
.../renderer_common/process_raster_symbolizer.hpp | 215 +-
include/mapnik/renderer_common/render_pattern.hpp | 16 +-
include/mapnik/request.hpp | 2 +-
include/mapnik/rule.hpp | 2 +-
include/mapnik/rule_cache.hpp | 6 +-
include/mapnik/save_map.hpp | 2 +-
include/mapnik/scale_denominator.hpp | 2 +-
include/mapnik/segment.hpp | 2 +-
include/mapnik/simplify_converter.hpp | 239 +-
include/mapnik/span_image_filter.hpp | 2 +-
include/mapnik/sql_utils.hpp | 4 +-
include/mapnik/sse.hpp | 156 +
include/mapnik/svg/geometry_svg_generator.hpp | 122 +-
include/mapnik/svg/geometry_svg_generator_impl.hpp | 22 +-
include/mapnik/svg/output/svg_generator.hpp | 8 +-
.../mapnik/svg/output/svg_output_attributes.hpp | 2 +-
include/mapnik/svg/output/svg_output_grammars.hpp | 2 +-
include/mapnik/svg/output/svg_path_iterator.hpp | 4 +-
include/mapnik/svg/output/svg_renderer.hpp | 8 +-
include/mapnik/svg/svg_converter.hpp | 8 +-
include/mapnik/svg/svg_parser.hpp | 6 +-
include/mapnik/svg/svg_path_adapter.hpp | 8 +-
include/mapnik/svg/svg_path_attributes.hpp | 99 +-
include/mapnik/svg/svg_path_commands.hpp | 2 +-
include/mapnik/svg/svg_path_grammar.hpp | 2 +-
include/mapnik/svg/svg_path_parser.hpp | 2 +-
include/mapnik/svg/svg_points_grammar.hpp | 2 +-
include/mapnik/svg/svg_renderer_agg.hpp | 6 +-
include/mapnik/svg/svg_storage.hpp | 6 +-
include/mapnik/svg/svg_transform_grammar.hpp | 2 +-
include/mapnik/symbolizer.hpp | 14 +-
include/mapnik/symbolizer_base.hpp | 6 +-
include/mapnik/symbolizer_default_values.hpp | 7 +
include/mapnik/symbolizer_dispatch.hpp | 2 +-
include/mapnik/symbolizer_enumerations.hpp | 51 +-
include/mapnik/symbolizer_hash.hpp | 6 +-
include/mapnik/symbolizer_keys.hpp | 3 +-
include/mapnik/symbolizer_utils.hpp | 14 +-
.../text/evaluated_format_properties_ptr.hpp | 2 +-
include/mapnik/text/face.hpp | 10 +-
include/mapnik/text/font_library.hpp | 4 +-
include/mapnik/text/formatting/base.hpp | 2 +-
include/mapnik/text/formatting/format.hpp | 2 +-
include/mapnik/text/formatting/layout.hpp | 2 +-
include/mapnik/text/formatting/list.hpp | 2 +-
include/mapnik/text/formatting/registry.hpp | 6 +-
include/mapnik/text/formatting/text.hpp | 2 +-
include/mapnik/text/glyph_info.hpp | 6 +-
include/mapnik/text/glyph_positions.hpp | 18 +-
include/mapnik/text/harfbuzz_shaper.hpp | 8 +-
include/mapnik/text/itemizer.hpp | 8 +-
include/mapnik/text/placement_finder.hpp | 8 +-
include/mapnik/text/placement_finder_impl.hpp | 4 +-
include/mapnik/text/placements/base.hpp | 9 +-
include/mapnik/text/placements/dummy.hpp | 6 +-
include/mapnik/text/placements/list.hpp | 7 +-
include/mapnik/text/placements/registry.hpp | 6 +-
include/mapnik/text/placements/simple.hpp | 29 +-
include/mapnik/text/renderer.hpp | 6 +-
include/mapnik/text/symbolizer_helpers.hpp | 21 +-
include/mapnik/text/text_layout.hpp | 2 +-
include/mapnik/text/text_line.hpp | 6 +-
include/mapnik/text/text_properties.hpp | 8 +-
include/mapnik/text/tolerance_iterator.hpp | 101 -
include/mapnik/text/vertex_cache.hpp | 228 -
include/mapnik/tiff_io.hpp | 417 +-
include/mapnik/timer.hpp | 2 +-
include/mapnik/tolerance_iterator.hpp | 101 +
include/mapnik/transform_expression.hpp | 4 +-
include/mapnik/transform_expression_grammar.hpp | 2 +-
.../mapnik/transform_expression_grammar_impl.hpp | 2 +-
include/mapnik/transform_path_adapter.hpp | 12 +-
include/mapnik/transform_processor.hpp | 6 +-
include/mapnik/unicode.hpp | 9 +-
include/mapnik/unique_lock.hpp | 33 -
include/mapnik/util/container_adapter.hpp | 61 +-
include/mapnik/util/conversions.hpp | 32 +-
include/mapnik/util/dasharray_parser.hpp | 2 +-
include/mapnik/util/feature_to_geojson.hpp | 42 +
include/mapnik/util/featureset_buffer.hpp | 2 +-
include/mapnik/util/file_io.hpp | 6 +-
include/mapnik/util/fs.hpp | 5 +-
include/mapnik/util/geometry_to_ds_type.hpp | 92 +-
include/mapnik/util/geometry_to_geojson.hpp | 16 +-
include/mapnik/util/geometry_to_svg.hpp | 7 +-
include/mapnik/util/geometry_to_wkb.hpp | 259 +-
include/mapnik/util/geometry_to_wkt.hpp | 18 +-
include/mapnik/util/hsl.hpp | 15 +-
include/mapnik/util/is_clockwise.hpp | 43 +
include/mapnik/util/math.hpp | 35 +
include/mapnik/util/noncopyable.hpp | 45 +
include/mapnik/util/path_iterator.hpp | 55 +-
include/mapnik/util/rounding_cast.hpp | 48 +
include/mapnik/util/spirit_transform_attribute.hpp | 208 +
include/mapnik/util/timer.hpp | 2 +-
include/mapnik/util/trim.hpp | 2 +-
include/mapnik/util/variant.hpp | 294 +-
include/mapnik/util/variant_io.hpp | 74 +
include/mapnik/utils.hpp | 5 +-
include/mapnik/value.hpp | 55 +-
include/mapnik/value_error.hpp | 2 +-
include/mapnik/value_hash.hpp | 2 +-
include/mapnik/value_types.hpp | 11 +-
include/mapnik/version.hpp | 2 +-
include/mapnik/vertex.hpp | 7 +-
include/mapnik/vertex_adapters.hpp | 277 +
include/mapnik/vertex_cache.hpp | 237 +
include/mapnik/vertex_converters.hpp | 106 +-
include/mapnik/vertex_processor.hpp | 111 +
include/mapnik/vertex_vector.hpp | 6 +-
include/mapnik/view_strategy.hpp | 95 +
include/mapnik/view_transform.hpp | 3 +-
include/mapnik/warp.hpp | 18 +-
include/mapnik/webp_io.hpp | 50 +-
include/mapnik/well_known_srs.hpp | 35 +-
include/mapnik/wkb.hpp | 24 +-
include/mapnik/wkt/wkt_factory.hpp | 11 +-
include/mapnik/wkt/wkt_generator_grammar.hpp | 166 +-
include/mapnik/wkt/wkt_generator_grammar_impl.hpp | 224 +-
include/mapnik/wkt/wkt_grammar.hpp | 118 +-
include/mapnik/wkt/wkt_grammar_impl.hpp | 129 +-
include/mapnik/xml_attribute_cast.hpp | 11 +-
include/mapnik/xml_loader.hpp | 2 +-
include/mapnik/xml_node.hpp | 2 +-
include/mapnik/xml_tree.hpp | 2 +-
localize.sh | 22 +-
mason_latest.sh | 48 +
plugins/input/csv/csv_datasource.cpp | 40 +-
plugins/input/csv/csv_datasource.hpp | 5 +-
plugins/input/csv/csv_utils.hpp | 6 +-
plugins/input/gdal/gdal_datasource.cpp | 73 +-
plugins/input/gdal/gdal_datasource.hpp | 5 +-
plugins/input/gdal/gdal_featureset.cpp | 257 +-
plugins/input/gdal/gdal_featureset.hpp | 4 +-
plugins/input/geojson/build.py | 76 +-
plugins/input/geojson/geojson_datasource.cpp | 264 +-
plugins/input/geojson/geojson_datasource.hpp | 35 +-
plugins/input/geojson/geojson_featureset.cpp | 8 +-
plugins/input/geojson/geojson_featureset.hpp | 2 +-
plugins/input/geojson/large_geojson_featureset.cpp | 82 +
plugins/input/geojson/large_geojson_featureset.hpp | 54 +
plugins/input/occi/build.py | 16 +-
plugins/input/occi/occi_datasource.cpp | 14 +-
plugins/input/occi/occi_datasource.hpp | 4 +-
plugins/input/occi/occi_featureset.cpp | 28 +-
plugins/input/occi/occi_featureset.hpp | 7 +-
plugins/input/occi/occi_types.cpp | 2 +-
plugins/input/occi/occi_types.hpp | 2 +-
plugins/input/ogr/ogr_converter.cpp | 154 +-
plugins/input/ogr/ogr_converter.hpp | 31 +-
plugins/input/ogr/ogr_datasource.cpp | 36 +-
plugins/input/ogr/ogr_datasource.hpp | 4 +-
plugins/input/ogr/ogr_featureset.cpp | 8 +-
plugins/input/ogr/ogr_featureset.hpp | 2 +-
plugins/input/ogr/ogr_index.hpp | 2 +-
plugins/input/ogr/ogr_index_featureset.cpp | 16 +-
plugins/input/ogr/ogr_index_featureset.hpp | 2 +-
plugins/input/ogr/ogr_layer_ptr.hpp | 2 +-
plugins/input/osm/Makefile.example | 9 -
plugins/input/osm/basiccurl.cpp | 2 +-
plugins/input/osm/dataset_deliverer.cpp | 2 +-
plugins/input/osm/libMakefile | 4 -
plugins/input/osm/osm.cpp | 2 +-
plugins/input/osm/osm_datasource.cpp | 6 +-
plugins/input/osm/osm_datasource.hpp | 4 +-
plugins/input/osm/osm_featureset.cpp | 45 +-
plugins/input/osm/osm_featureset.hpp | 2 +-
plugins/input/osm/render.cpp | 75 -
plugins/input/pgraster/pgraster_datasource.cpp | 18 +-
plugins/input/pgraster/pgraster_datasource.hpp | 2 +-
plugins/input/pgraster/pgraster_featureset.cpp | 119 +-
plugins/input/pgraster/pgraster_featureset.hpp | 2 +-
plugins/input/pgraster/pgraster_wkb_reader.cpp | 121 +-
plugins/input/pgraster/pgraster_wkb_reader.hpp | 7 +-
plugins/input/postgis/asyncresultset.hpp | 4 +-
plugins/input/postgis/connection.hpp | 27 +-
plugins/input/postgis/connection_manager.hpp | 2 +-
plugins/input/postgis/cursorresultset.hpp | 4 +-
plugins/input/postgis/numeric2string.hpp | 144 +
plugins/input/postgis/postgis_datasource.cpp | 95 +-
plugins/input/postgis/postgis_datasource.hpp | 4 +-
plugins/input/postgis/postgis_featureset.cpp | 123 +-
plugins/input/postgis/postgis_featureset.hpp | 2 +-
plugins/input/postgis/resultset.hpp | 4 +-
plugins/input/python/README.md | 241 -
plugins/input/python/build.py | 97 -
.../input/python/examples/concentric_circles.py | 83 -
plugins/input/python/examples/simple_points.py | 34 -
plugins/input/python/examples/simple_xml.py | 8 -
plugins/input/python/examples/simple_xml.xml | 16 -
plugins/input/python/python_datasource.cpp | 238 -
plugins/input/python/python_datasource.hpp | 58 -
plugins/input/python/python_featureset.cpp | 30 -
plugins/input/python/python_featureset.hpp | 38 -
plugins/input/python/python_utils.cpp | 23 -
plugins/input/python/python_utils.hpp | 23 -
plugins/input/raster/raster_datasource.cpp | 16 +-
plugins/input/raster/raster_datasource.hpp | 4 +-
plugins/input/raster/raster_featureset.cpp | 13 +-
plugins/input/raster/raster_featureset.hpp | 2 +-
plugins/input/raster/raster_info.cpp | 2 +-
plugins/input/raster/raster_info.hpp | 2 +-
plugins/input/rasterlite/build.py | 9 +
plugins/input/rasterlite/rasterlite_datasource.cpp | 6 +-
plugins/input/rasterlite/rasterlite_datasource.hpp | 4 +-
plugins/input/rasterlite/rasterlite_featureset.cpp | 19 +-
plugins/input/rasterlite/rasterlite_featureset.hpp | 4 +-
plugins/input/rasterlite/rasterlite_include.hpp | 2 +-
plugins/input/shape/dbf_test.cpp | 2 +-
plugins/input/shape/dbfile.cpp | 2 +-
plugins/input/shape/dbfile.hpp | 6 +-
plugins/input/shape/shape_datasource.cpp | 12 +-
plugins/input/shape/shape_datasource.hpp | 5 +-
plugins/input/shape/shape_featureset.cpp | 17 +-
plugins/input/shape/shape_featureset.hpp | 2 +-
plugins/input/shape/shape_index_featureset.cpp | 17 +-
plugins/input/shape/shape_index_featureset.hpp | 2 +-
plugins/input/shape/shape_io.cpp | 99 +-
plugins/input/shape/shape_io.hpp | 11 +-
plugins/input/shape/shape_utils.cpp | 2 +-
plugins/input/shape/shape_utils.hpp | 2 +-
plugins/input/shape/shapefile.hpp | 23 +-
plugins/input/shape/shp_index.hpp | 2 +-
plugins/input/sqlite/sqlite_connection.hpp | 2 +-
plugins/input/sqlite/sqlite_datasource.cpp | 33 +-
plugins/input/sqlite/sqlite_datasource.hpp | 4 +-
plugins/input/sqlite/sqlite_featureset.cpp | 14 +-
plugins/input/sqlite/sqlite_featureset.hpp | 2 +-
plugins/input/sqlite/sqlite_prepared.hpp | 6 +-
plugins/input/sqlite/sqlite_resultset.hpp | 2 +-
plugins/input/sqlite/sqlite_utils.hpp | 131 +-
plugins/input/templates/README.md | 16 -
plugins/input/templates/helloworld/Makefile | 30 -
plugins/input/templates/helloworld/README.md | 53 -
plugins/input/templates/helloworld/build.py | 86 -
.../templates/helloworld/hello_datasource.cpp | 76 -
.../templates/helloworld/hello_datasource.hpp | 66 -
.../templates/helloworld/hello_featureset.cpp | 70 -
.../templates/helloworld/hello_featureset.hpp | 32 -
plugins/input/templates/helloworld/test.xml | 19 -
plugins/input/topojson/build.py | 74 +-
plugins/input/topojson/topojson_datasource.cpp | 47 +-
plugins/input/topojson/topojson_datasource.hpp | 13 +-
plugins/input/topojson/topojson_featureset.cpp | 346 +-
plugins/input/topojson/topojson_featureset.hpp | 2 +-
run_tests | 21 -
scripts/check-padding | 63 +
src/agg/agg_renderer.cpp | 320 +-
src/agg/process_building_symbolizer.cpp | 31 +-
src/agg/process_debug_symbolizer.cpp | 204 +-
src/agg/process_dot_symbolizer.cpp | 134 +
src/agg/process_group_symbolizer.cpp | 79 +-
src/agg/process_line_pattern_symbolizer.cpp | 270 +-
src/agg/process_line_symbolizer.cpp | 58 +-
src/agg/process_markers_symbolizer.cpp | 115 +-
src/agg/process_point_symbolizer.cpp | 7 +-
src/agg/process_polygon_pattern_symbolizer.cpp | 329 +-
src/agg/process_polygon_symbolizer.cpp | 9 +-
src/agg/process_raster_symbolizer.cpp | 13 +-
src/agg/process_shield_symbolizer.cpp | 14 +-
src/agg/process_text_symbolizer.cpp | 6 +-
src/box2d.cpp | 3 +-
src/build.py | 68 +-
src/cairo/cairo_context.cpp | 5 +-
src/cairo/cairo_render_vector.cpp | 17 +-
src/cairo/cairo_renderer.cpp | 141 +-
src/cairo/process_building_symbolizer.cpp | 20 +-
src/cairo/process_debug_symbolizer.cpp | 57 +-
src/cairo/process_group_symbolizer.cpp | 45 +-
src/cairo/process_line_pattern_symbolizer.cpp | 115 +-
src/cairo/process_line_symbolizer.cpp | 29 +-
src/cairo/process_markers_symbolizer.cpp | 164 +-
src/cairo/process_polygon_pattern_symbolizer.cpp | 104 +-
src/cairo/process_polygon_symbolizer.cpp | 2 +-
src/cairo/process_raster_symbolizer.cpp | 2 +-
src/cairo/process_text_symbolizer.cpp | 11 +-
src/cairo_io.cpp | 131 +
src/color.cpp | 18 +-
src/color_factory.cpp | 2 +-
src/conversions.cpp | 29 +-
src/datasource_cache.cpp | 22 +-
src/datasource_cache_static.cpp | 36 +-
src/debug.cpp | 2 +-
src/expression.cpp | 18 +-
src/expression_node.cpp | 10 +-
src/expression_string.cpp | 4 +-
src/feature_kv_iterator.cpp | 2 +-
src/feature_style_processor.cpp | 12 +-
src/feature_type_style.cpp | 2 +-
src/font_engine_freetype.cpp | 35 +-
src/font_set.cpp | 2 +-
src/fs.cpp | 32 +-
src/geometry_envelope.cpp | 50 +
src/geometry_reprojection.cpp | 73 +
src/gradient.cpp | 28 +-
src/graphics.cpp | 210 -
src/grid/grid.cpp | 10 +-
src/grid/grid_renderer.cpp | 102 +-
src/grid/process_building_symbolizer.cpp | 24 +-
src/grid/process_group_symbolizer.cpp | 74 +-
src/grid/process_line_pattern_symbolizer.cpp | 37 +-
src/grid/process_line_symbolizer.cpp | 24 +-
src/grid/process_markers_symbolizer.cpp | 126 +-
src/grid/process_point_symbolizer.cpp | 2 +-
src/grid/process_polygon_pattern_symbolizer.cpp | 29 +-
src/grid/process_polygon_symbolizer.cpp | 4 +-
src/grid/process_raster_symbolizer.cpp | 2 +-
src/grid/process_shield_symbolizer.cpp | 9 +-
src/grid/process_text_symbolizer.cpp | 2 +-
src/group/group_layout_manager.cpp | 4 +-
src/group/group_rule.cpp | 3 +-
src/group/group_symbolizer_helper.cpp | 45 +-
src/image.cpp | 106 +
src/image_any.cpp | 268 +
src/image_compositing.cpp | 138 +-
src/image_copy.cpp | 361 +
src/image_filter_types.cpp | 2 +-
src/image_options.cpp | 73 +
src/image_reader.cpp | 7 +-
src/image_scaling.cpp | 141 +-
src/image_util.cpp | 2948 ++++--
src/image_util_jpeg.cpp | 128 +
src/image_util_png.cpp | 366 +
src/image_util_tiff.cpp | 204 +
src/image_util_webp.cpp | 386 +
src/image_view.cpp | 45 +
src/image_view_any.cpp | 143 +
src/jpeg_reader.cpp | 31 +-
src/json/build.py | 2 +-
.../mapnik_json_feature_collection_grammar.cpp | 6 +-
src/json/mapnik_json_feature_grammar.cpp | 4 +-
src/json/mapnik_json_generator_grammar.cpp | 15 +-
src/json/mapnik_json_geometry_grammar.cpp | 6 +-
src/json/mapnik_topojson_grammar.cpp | 2 +-
src/layer.cpp | 42 +-
src/libxml2_loader.cpp | 6 +-
src/load_map.cpp | 131 +-
src/map.cpp | 5 +-
src/mapped_memory_cache.cpp | 8 +-
src/marker_cache.cpp | 101 +-
src/marker_helpers.cpp | 17 +-
src/math.cpp | 49 +
src/memory.cpp | 2 +-
src/memory_datasource.cpp | 30 +-
src/miniz_png.cpp | 20 +-
src/palette.cpp | 2 +-
src/params.cpp | 5 +-
src/parse_path.cpp | 8 +-
src/parse_transform.cpp | 2 +-
src/plugin.cpp | 43 +-
src/png_reader.cpp | 35 +-
src/proj_transform.cpp | 219 +-
src/projection.cpp | 42 +-
src/rapidxml_loader.cpp | 6 +-
src/raster_colorizer.cpp | 58 +-
src/renderer_common.cpp | 2 +-
src/renderer_common/process_group_symbolizer.cpp | 130 +-
src/renderer_common/render_pattern.cpp | 24 +-
src/request.cpp | 2 +-
src/rule.cpp | 2 +-
src/save_map.cpp | 48 +-
src/scale_denominator.cpp | 2 +-
src/svg/output/process_line_symbolizer.cpp | 3 +-
src/svg/output/process_polygon_symbolizer.cpp | 2 +-
src/svg/output/process_symbolizers.cpp | 58 +-
src/svg/output/svg_generator.cpp | 4 +-
src/svg/output/svg_output_attributes.cpp | 4 +-
src/svg/output/svg_output_grammars.cpp | 2 +-
src/svg/output/svg_renderer.cpp | 2 +-
src/svg/svg_parser.cpp | 2 +-
src/svg/svg_path_parser.cpp | 2 +-
src/svg/svg_points_parser.cpp | 2 +-
src/svg/svg_transform_parser.cpp | 2 +-
src/symbolizer.cpp | 2 +-
src/symbolizer_enumerations.cpp | 22 +-
src/symbolizer_keys.cpp | 15 +-
src/text/face.cpp | 2 +-
src/text/formatting/base.cpp | 2 +-
src/text/formatting/format.cpp | 2 +-
src/text/formatting/layout.cpp | 2 +-
src/text/formatting/list.cpp | 2 +-
src/text/formatting/registry.cpp | 2 +-
src/text/formatting/text.cpp | 32 +-
src/text/glyph_positions.cpp | 12 +-
src/text/itemizer.cpp | 2 +-
src/text/placement_finder.cpp | 53 +-
src/text/placements/base.cpp | 2 +-
src/text/placements/dummy.cpp | 4 +-
src/text/placements/list.cpp | 4 +-
src/text/placements/registry.cpp | 2 +-
src/text/placements/simple.cpp | 232 +-
src/text/properties_util.cpp | 2 +-
src/text/renderer.cpp | 29 +-
src/text/symbolizer_helpers.cpp | 241 +-
src/text/text_layout.cpp | 22 +-
src/text/text_line.cpp | 2 +-
src/text/text_properties.cpp | 2 +-
src/text/vertex_cache.cpp | 405 -
src/tiff_reader.cpp | 501 +-
src/transform_expression.cpp | 4 +-
src/unicode.cpp | 17 +-
src/utils.cpp | 2 +-
src/vertex_cache.cpp | 418 +
src/warp.cpp | 218 +-
src/webp_reader.cpp | 35 +-
src/well_known_srs.cpp | 2 +-
src/wkb.cpp | 404 +-
src/wkt/mapnik_wkt_generator_grammar.cpp | 7 +-
src/wkt/mapnik_wkt_grammar.cpp | 6 +-
src/xml_tree.cpp | 3 +-
test/build.py | 58 +
test/catch.hpp | 9427 ++++++++++++++++++++
test/run | 34 +
.../agg_rasterizer_integer_overflow_test.cpp | 64 +
test/standalone/csv_test.cpp | 684 ++
test/standalone/font_registration_test.cpp | 191 +
test/unit/README.md | 11 +
test/unit/core/box2d_test.cpp | 163 +
test/unit/core/conversions_test.cpp | 300 +
test/unit/core/copy_move_test.cpp | 78 +
test/unit/core/exceptions_test.cpp | 103 +
test/unit/core/params_test.cpp | 115 +
{tests/cpp_tests => test/unit}/data/cases.txt | 0
test/unit/font/fontset_runtime_test.cpp | 85 +
test/unit/geometry/geometry.cpp | 39 +
test/unit/geometry/geometry_converters_test.cpp | 192 +
test/unit/geometry/geometry_envelope_test.cpp | 153 +
test/unit/geometry/geometry_equal.hpp | 217 +
test/unit/geometry/geometry_hit_test.cpp | 108 +
test/unit/geometry/geometry_is_valid.cpp | 31 +
test/unit/geometry/geometry_reprojection.cpp | 1274 +++
test/unit/geometry/geometry_strategy_test.cpp | 241 +
test/unit/geometry/label_algo_test.cpp | 65 +
test/unit/imaging/image.cpp | 292 +
test/unit/imaging/image_apply_opacity.cpp | 104 +
test/unit/imaging/image_io_test.cpp | 84 +
test/unit/imaging/image_is_solid.cpp | 94 +
test/unit/imaging/image_painted_test.cpp | 69 +
test/unit/imaging/image_premultiply.cpp | 146 +
test/unit/imaging/image_view.cpp | 281 +
test/unit/imaging/tiff_io.cpp | 283 +
test/unit/pixel/agg_blend_src_over_test.cpp | 209 +
test/unit/pixel/palette.cpp | 89 +
test/unit/projection/proj_transform.cpp | 38 +
test/unit/run.cpp | 36 +
test/unit/serialization/wkb_formats_test.cpp | 121 +
test/unit/sql/sql_parse.cpp | 33 +
test/unit/symbolizer/symbolizer_test.cpp | 30 +
test/unit/valgrind.supp | 77 +
test/unit/vertex_adapter/clipping_test.cpp | 120 +
test/unit/vertex_adapter/line_offset_test.cpp | 196 +
.../vertex_adapter/simplify_converters_test.cpp | 82 +
test/unit/vertex_adapter/vertex_adapter.cpp | 269 +
test/visual/compare_images.hpp | 53 +
test/visual/config.hpp | 80 +
test/visual/map_sizes_grammar.hpp | 62 +
test/visual/renderer.hpp | 171 +
test/visual/report.cpp | 200 +
test/visual/report.hpp | 124 +
test/visual/run.cpp | 99 +
test/visual/runner.cpp | 248 +
test/visual/runner.hpp | 70 +
tests/cpp_tests/agg_blend_src_over_test.cpp | 221 -
tests/cpp_tests/build.py | 48 -
tests/cpp_tests/clipping_test.cpp | 138 -
tests/cpp_tests/conversions_test.cpp | 309 -
tests/cpp_tests/copy_move_test.cpp | 92 -
tests/cpp_tests/data/blank.jpg | 0
tests/cpp_tests/data/blank.png | 0
tests/cpp_tests/data/blank.tiff | 0
tests/cpp_tests/data/blank.webp | 0
tests/cpp_tests/exceptions_test.cpp | 111 -
tests/cpp_tests/font_registration_test.cpp | 207 -
tests/cpp_tests/fontset_runtime_test.cpp | 99 -
tests/cpp_tests/geometry_converters_test.cpp | 203 -
tests/cpp_tests/image_io_test.cpp | 124 -
tests/cpp_tests/image_painted_test.cpp | 85 -
tests/cpp_tests/label_algo_test.cpp | 72 -
tests/cpp_tests/line_offset_test.cpp | 236 -
tests/cpp_tests/map_request_test.cpp | 165 -
tests/cpp_tests/params_test.cpp | 96 -
tests/cpp_tests/run | 18 -
...map-request-marker-text-line-expected-cairo.png | Bin 31181 -> 0 bytes
.../map-request-marker-text-line-expected.png | Bin 19010 -> 0 bytes
tests/cpp_tests/symbolizer_test.cpp | 40 -
tests/cpp_tests/utils.hpp | 26 -
tests/cpp_tests/wkb_formats_test.cpp | 124 -
tests/data/broken_maps/amenity.xml | 85 -
tests/data/broken_maps/bgcolor_broken.xml | 2 -
tests/data/broken_maps/bool_value_broken.xml | 8 -
tests/data/broken_maps/css_value_broken.xml | 8 -
tests/data/broken_maps/datasource_type_broken.xml | 12 -
tests/data/broken_maps/datasource_type_missing.xml | 11 -
tests/data/broken_maps/db_host_broken.xml | 15 -
tests/data/broken_maps/db_user_broken.xml | 15 -
tests/data/broken_maps/empty_stylename.xml | 7 -
tests/data/broken_maps/expression_broken.xml | 8 -
tests/data/broken_maps/font_name_broken.xml | 8 -
tests/data/broken_maps/in_valid_whitespace.xml | 4 -
.../data/broken_maps/invalid-scale-hsla-filter.xml | 4 -
tests/data/broken_maps/invalid_layer_srs.xml | 3 -
tests/data/broken_maps/invalid_map_srs.xml | 2 -
tests/data/broken_maps/line_cap_style_broken.xml | 8 -
tests/data/broken_maps/line_join_style_broken.xml | 8 -
tests/data/broken_maps/mapnik_min_version.xml | 3 -
tests/data/broken_maps/max_scale_denom_broken.xml | 8 -
tests/data/broken_maps/min_scale_denom_broken.xml | 8 -
tests/data/broken_maps/missing_fontset.xml | 7 -
.../polygon_pattern_symbolizer_broken.xml | 8 -
.../data/broken_maps/shield_symbolizer_broken.xml | 8 -
tests/data/broken_maps/stroke_dasharray_broken.xml | 8 -
tests/data/broken_maps/style_name_missing.xml | 4 -
tests/data/broken_maps/text_symbolizer_broken.xml | 8 -
tests/data/broken_maps/xml_tag_mismatch.xml | 10 -
tests/data/csv/64bit_int.csv | 3 -
tests/data/csv/blank_rows.csv | 9 -
tests/data/csv/empty_rows.csv | 5 -
tests/data/csv/fails/blank.csv | 1 -
tests/data/csv/fails/cannot_read_a_vrt.vrt | 8 -
...atacouch_dc8364385fc612b847d66ca7886519749c.csv | 39 -
tests/data/csv/fails/invalid_geometries.csv | 3 -
tests/data/csv/fails/invalid_wkt.csv | 2 -
tests/data/csv/fails/mixed_separators.csv | 2 -
.../csv/fails/more_column_values_than_headers.csv | 2 -
tests/data/csv/fails/needs_headers_one_line.csv | 1 -
.../fails/needs_headers_one_line_no_newline.csv | 1 -
tests/data/csv/fails/needs_headers_two_lines.csv | 2 -
tests/data/csv/fails/no_geometry.csv | 2 -
tests/data/csv/fails/no_headers.csv | 1 -
.../fails/unix_newlines_with_windows_inline.csv | 7 -
.../unix_newlines_with_windows_inline_escaped.csv | 2 -
.../geojson_2x_double_quote_filebakery_style.csv | 10 -
tests/data/csv/geojson_double_quote_escape.csv | 10 -
tests/data/csv/geojson_single_quote.csv | 10 -
tests/data/csv/has_attributes_with_slashes.csv | 4 -
tests/data/csv/latitude_longitude.csv | 2 -
tests/data/csv/latitude_longitude_substring.csv | 2 -
tests/data/csv/leading_zeros.csv | 4 -
tests/data/csv/line_wkt.csv | 3 -
tests/data/csv/lng_lat.csv | 2 -
tests/data/csv/lon_lat.csv | 2 -
tests/data/csv/long_lat.csv | 2 -
tests/data/csv/long_lat.vrt | 8 -
tests/data/csv/mac_newlines.csv | 1 -
tests/data/csv/mac_newlines_with_unix_inline.csv | 7 -
.../csv/mac_newlines_with_unix_inline_escaped.csv | 2 -
tests/data/csv/missing_header.csv | 2 -
tests/data/csv/more_headers_than_column_values.csv | 2 -
tests/data/csv/multi_poly_wkt.csv | 5 -
tests/data/csv/nulls_and_booleans_as_strings.csv | 3 -
tests/data/csv/number_types.csv | 9 -
tests/data/csv/numbers_for_headers.csv | 2 -
tests/data/csv/nypd.csv | 3 -
tests/data/csv/pipe_delimiters.csv | 2 -
tests/data/csv/point_wkt.csv | 3 -
tests/data/csv/points.csv | 6 -
tests/data/csv/poly_wkt.csv | 3 -
tests/data/csv/semicolon_delimiters.csv | 2 -
tests/data/csv/tabs.tsv | 3 -
tests/data/csv/tabs_in_csv.csv | 2 -
tests/data/csv/trailing_newline_mac.csv | 1 -
tests/data/csv/trailing_newline_win.csv | 12 -
tests/data/csv/unicode.tsv | 11 -
tests/data/csv/warns/feature_id_counting.csv | 4 -
tests/data/csv/warns/invalid_geometries.csv | 3 -
tests/data/csv/windows_newlines.csv | 2 -
.../data/csv/windows_newlines_with_unix_inline.csv | 7 -
.../windows_newlines_with_unix_inline_escaped.csv | 2 -
tests/data/csv/wkt.csv | 10 -
tests/data/csv/x_y.csv | 2 -
tests/data/fonts/fake.ttf | 0
tests/data/fonts/intentionally-broken.ttf | Bin 49420 -> 0 bytes
tests/data/good_maps/agg_poly_gamma_map.xml | 47 -
tests/data/good_maps/agg_stack_blur.xml | 24 -
tests/data/good_maps/also_and_else_filter.xml | 17 -
tests/data/good_maps/background-image.xml | 2 -
tests/data/good_maps/bool_values.xml | 43 -
tests/data/good_maps/bounds_clipping.xml | 37 -
tests/data/good_maps/building_symbolizer.xml | 17 -
tests/data/good_maps/datasource.xml | 21 -
tests/data/good_maps/empty_parameter1.xml | 12 -
tests/data/good_maps/empty_parameter2.xml | 12 -
tests/data/good_maps/empty_parameter3.xml | 12 -
tests/data/good_maps/empty_parameter4.xml | 12 -
tests/data/good_maps/empty_parameter5.xml | 12 -
tests/data/good_maps/empty_text_symbolizer.xml | 15 -
.../good_maps/extra_arbitary_map_parameters.xml | 24 -
.../data/good_maps/extra_known_map_attributes.xml | 13 -
tests/data/good_maps/filesource.xml | 21 -
tests/data/good_maps/fontset.xml | 8 -
tests/data/good_maps/frame.xml | 23 -
tests/data/good_maps/geometry-transform.xml | 50 -
tests/data/good_maps/interior_point.xml | 30 -
.../data/good_maps/layer_buffer_size_reduction.xml | 17 -
tests/data/good_maps/line_symbolizer.xml | 22 -
tests/data/good_maps/line_symbolizer2.xml | 36 -
tests/data/good_maps/line_symbolizer_offset.xml | 18 -
tests/data/good_maps/marker-text-line.xml | 103 -
tests/data/good_maps/marker_ellipse_transform.xml | 66 -
tests/data/good_maps/marker_ellipse_transform2.xml | 66 -
tests/data/good_maps/markers_symbolizer_lines.xml | 26 -
.../good_maps/markers_symbolizer_lines_file.xml | 26 -
tests/data/good_maps/markers_symbolizer_points.xml | 42 -
.../good_maps/markers_symbolizer_points_file.xml | 17 -
.../markers_symbolizer_points_gradient.xml | 27 -
.../markers_symbolizer_points_stacked.xml | 28 -
tests/data/good_maps/merc2wgs84_reprojection.xml | 15 -
tests/data/good_maps/osm-styles.xml | 752 --
tests/data/good_maps/osm_nodes_ways.xml | 35 -
tests/data/good_maps/path_expression.xml | 20 -
tests/data/good_maps/point_csv.xml | 31 -
tests/data/good_maps/point_json.xml | 31 -
tests/data/good_maps/point_json_inline.xml | 71 -
tests/data/good_maps/point_symbolizer.xml | 46 -
.../point_symbolizer_ignore_placements.xml | 26 -
.../good_maps/point_symbolizer_on_polygon_map.xml | 36 -
tests/data/good_maps/polygon_pattern_seamless.xml | 19 -
.../data/good_maps/polygon_pattern_symbolizer.xml | 30 -
tests/data/good_maps/polygon_symbolizer.xml | 21 -
tests/data/good_maps/rtl_text_map.xml | 20 -
tests/data/good_maps/shield_symbolizer.xml | 38 -
tests/data/good_maps/sqlite.xml | 43 -
tests/data/good_maps/sqlite_attachdb.xml | 36 -
tests/data/good_maps/style_level_comp_op.xml | 49 -
tests/data/good_maps/style_level_image_filter.xml | 68 -
.../good_maps/style_level_opacity_and_blur.xml | 24 -
tests/data/good_maps/text-placement-type-dummy.xml | 11 -
tests/data/good_maps/text_breaks.xml | 66 -
tests/data/good_maps/text_halo_and_collision.xml | 52 -
tests/data/good_maps/text_rotation.xml | 44 -
tests/data/good_maps/unique_filter_map.xml | 25 -
tests/data/good_maps/wgs842merc_reprojection.xml | 15 -
.../whitespace_at_end_of_filter_expression.xml | 10 -
tests/data/good_maps/xinclude/layers.xml | 13 -
.../good_maps/xinclude/layers_with_entities.xml | 15 -
tests/data/good_maps/xinclude/map.xml | 11 -
.../xinclude/map_with_entities_and_includes.xml | 11 -
tests/data/good_maps/xinclude/styles.xml | 18 -
tests/data/good_maps/xinclude/zoom_scales.xml | 67 -
tests/data/gpx/empty.gpx | 9 -
tests/data/images/12_654_1580.png | Bin 160268 -> 0 bytes
tests/data/images/13_4194_2747.png | Bin 33764 -> 0 bytes
tests/data/images/checker.jpg | Bin 4077 -> 0 bytes
tests/data/images/crosshair16x16.png | Bin 216 -> 0 bytes
tests/data/images/dummy.jpeg | Bin 1056 -> 0 bytes
tests/data/images/dummy.jpg | Bin 1056 -> 0 bytes
tests/data/images/dummy.png | Bin 216 -> 0 bytes
tests/data/images/dummy.tif | Bin 330 -> 0 bytes
tests/data/images/dummy.tiff | Bin 330 -> 0 bytes
tests/data/images/marker.png | Bin 1803 -> 0 bytes
tests/data/images/stripes_pattern.png | Bin 135 -> 0 bytes
tests/data/images/xcode-CgBI.png | Bin 812 -> 0 bytes
tests/data/images/yellow_half_trans.png | Bin 77 -> 0 bytes
tests/data/json/escaped.geojson | 28 -
tests/data/json/escaped.topojson | 39 -
.../json/feature_collection_level_properties.json | 18 -
tests/data/json/lines.geojson | 19 -
tests/data/json/null_feature.geojson | 12 -
tests/data/json/points.geojson | 34 -
tests/data/osm/64bit.osm | 14 -
tests/data/osm/nodes.osm | 19 -
tests/data/osm/t.png | Bin 4183 -> 0 bytes
tests/data/osm/ways.osm | 15 -
tests/data/palettes/palette256.act | Bin 772 -> 0 bytes
tests/data/palettes/palette64.act | Bin 772 -> 0 bytes
tests/data/pngsuite/PngSuite.LICENSE | 9 -
tests/data/pngsuite/PngSuite.README | 25 -
tests/data/pngsuite/PngSuite.png | Bin 2262 -> 0 bytes
tests/data/pngsuite/basi0g01.png | Bin 217 -> 0 bytes
tests/data/pngsuite/basi0g02.png | Bin 154 -> 0 bytes
tests/data/pngsuite/basi0g04.png | Bin 247 -> 0 bytes
tests/data/pngsuite/basi0g08.png | Bin 254 -> 0 bytes
tests/data/pngsuite/basi0g16.png | Bin 299 -> 0 bytes
tests/data/pngsuite/basi2c08.png | Bin 315 -> 0 bytes
tests/data/pngsuite/basi2c16.png | Bin 595 -> 0 bytes
tests/data/pngsuite/basi3p01.png | Bin 132 -> 0 bytes
tests/data/pngsuite/basi3p02.png | Bin 193 -> 0 bytes
tests/data/pngsuite/basi3p04.png | Bin 327 -> 0 bytes
tests/data/pngsuite/basi3p08.png | Bin 1527 -> 0 bytes
tests/data/pngsuite/basi4a08.png | Bin 214 -> 0 bytes
tests/data/pngsuite/basi4a16.png | Bin 2855 -> 0 bytes
tests/data/pngsuite/basi6a08.png | Bin 361 -> 0 bytes
tests/data/pngsuite/basi6a16.png | Bin 4180 -> 0 bytes
tests/data/pngsuite/basn0g01.png | Bin 164 -> 0 bytes
tests/data/pngsuite/basn0g02.png | Bin 104 -> 0 bytes
tests/data/pngsuite/basn0g04.png | Bin 145 -> 0 bytes
tests/data/pngsuite/basn0g08.png | Bin 138 -> 0 bytes
tests/data/pngsuite/basn0g16.png | Bin 167 -> 0 bytes
tests/data/pngsuite/basn2c08.png | Bin 145 -> 0 bytes
tests/data/pngsuite/basn2c16.png | Bin 302 -> 0 bytes
tests/data/pngsuite/basn3p01.png | Bin 112 -> 0 bytes
tests/data/pngsuite/basn3p02.png | Bin 146 -> 0 bytes
tests/data/pngsuite/basn3p04.png | Bin 216 -> 0 bytes
tests/data/pngsuite/basn3p08.png | Bin 1286 -> 0 bytes
tests/data/pngsuite/basn4a08.png | Bin 126 -> 0 bytes
tests/data/pngsuite/basn4a16.png | Bin 2206 -> 0 bytes
tests/data/pngsuite/basn6a08.png | Bin 184 -> 0 bytes
tests/data/pngsuite/basn6a16.png | Bin 3435 -> 0 bytes
tests/data/pngsuite/bgai4a08.png | Bin 214 -> 0 bytes
tests/data/pngsuite/bgai4a16.png | Bin 2855 -> 0 bytes
tests/data/pngsuite/bgan6a08.png | Bin 184 -> 0 bytes
tests/data/pngsuite/bgan6a16.png | Bin 3435 -> 0 bytes
tests/data/pngsuite/bgbn4a08.png | Bin 140 -> 0 bytes
tests/data/pngsuite/bggn4a16.png | Bin 2220 -> 0 bytes
tests/data/pngsuite/bgwn6a08.png | Bin 202 -> 0 bytes
tests/data/pngsuite/bgyn6a16.png | Bin 3453 -> 0 bytes
tests/data/pngsuite/ccwn2c08.png | Bin 1514 -> 0 bytes
tests/data/pngsuite/ccwn3p08.png | Bin 1554 -> 0 bytes
tests/data/pngsuite/cdfn2c08.png | Bin 404 -> 0 bytes
tests/data/pngsuite/cdhn2c08.png | Bin 344 -> 0 bytes
tests/data/pngsuite/cdsn2c08.png | Bin 232 -> 0 bytes
tests/data/pngsuite/cdun2c08.png | Bin 724 -> 0 bytes
tests/data/pngsuite/ch1n3p04.png | Bin 258 -> 0 bytes
tests/data/pngsuite/ch2n3p08.png | Bin 1810 -> 0 bytes
tests/data/pngsuite/cm0n0g04.png | Bin 292 -> 0 bytes
tests/data/pngsuite/cm7n0g04.png | Bin 292 -> 0 bytes
tests/data/pngsuite/cm9n0g04.png | Bin 292 -> 0 bytes
tests/data/pngsuite/cs3n2c16.png | Bin 214 -> 0 bytes
tests/data/pngsuite/cs3n3p08.png | Bin 259 -> 0 bytes
tests/data/pngsuite/cs5n2c08.png | Bin 186 -> 0 bytes
tests/data/pngsuite/cs5n3p08.png | Bin 271 -> 0 bytes
tests/data/pngsuite/cs8n2c08.png | Bin 149 -> 0 bytes
tests/data/pngsuite/cs8n3p08.png | Bin 256 -> 0 bytes
tests/data/pngsuite/ct0n0g04.png | Bin 273 -> 0 bytes
tests/data/pngsuite/ct1n0g04.png | Bin 792 -> 0 bytes
tests/data/pngsuite/cten0g04.png | Bin 748 -> 0 bytes
tests/data/pngsuite/ctfn0g04.png | Bin 722 -> 0 bytes
tests/data/pngsuite/ctgn0g04.png | Bin 1188 -> 0 bytes
tests/data/pngsuite/cthn0g04.png | Bin 1275 -> 0 bytes
tests/data/pngsuite/ctjn0g04.png | Bin 947 -> 0 bytes
tests/data/pngsuite/ctzn0g04.png | Bin 753 -> 0 bytes
tests/data/pngsuite/f00n0g08.png | Bin 319 -> 0 bytes
tests/data/pngsuite/f00n2c08.png | Bin 2475 -> 0 bytes
tests/data/pngsuite/f01n0g08.png | Bin 321 -> 0 bytes
tests/data/pngsuite/f01n2c08.png | Bin 1180 -> 0 bytes
tests/data/pngsuite/f02n0g08.png | Bin 355 -> 0 bytes
tests/data/pngsuite/f02n2c08.png | Bin 1729 -> 0 bytes
tests/data/pngsuite/f03n0g08.png | Bin 389 -> 0 bytes
tests/data/pngsuite/f03n2c08.png | Bin 1291 -> 0 bytes
tests/data/pngsuite/f04n0g08.png | Bin 269 -> 0 bytes
tests/data/pngsuite/f04n2c08.png | Bin 985 -> 0 bytes
tests/data/pngsuite/f99n0g04.png | Bin 426 -> 0 bytes
tests/data/pngsuite/g03n0g16.png | Bin 345 -> 0 bytes
tests/data/pngsuite/g03n2c08.png | Bin 370 -> 0 bytes
tests/data/pngsuite/g03n3p04.png | Bin 214 -> 0 bytes
tests/data/pngsuite/g04n0g16.png | Bin 363 -> 0 bytes
tests/data/pngsuite/g04n2c08.png | Bin 377 -> 0 bytes
tests/data/pngsuite/g04n3p04.png | Bin 219 -> 0 bytes
tests/data/pngsuite/g05n0g16.png | Bin 339 -> 0 bytes
tests/data/pngsuite/g05n2c08.png | Bin 350 -> 0 bytes
tests/data/pngsuite/g05n3p04.png | Bin 206 -> 0 bytes
tests/data/pngsuite/g07n0g16.png | Bin 321 -> 0 bytes
tests/data/pngsuite/g07n2c08.png | Bin 340 -> 0 bytes
tests/data/pngsuite/g07n3p04.png | Bin 207 -> 0 bytes
tests/data/pngsuite/g10n0g16.png | Bin 262 -> 0 bytes
tests/data/pngsuite/g10n2c08.png | Bin 285 -> 0 bytes
tests/data/pngsuite/g10n3p04.png | Bin 214 -> 0 bytes
tests/data/pngsuite/g25n0g16.png | Bin 383 -> 0 bytes
tests/data/pngsuite/g25n2c08.png | Bin 405 -> 0 bytes
tests/data/pngsuite/g25n3p04.png | Bin 215 -> 0 bytes
tests/data/pngsuite/linepattern.png | Bin 3354 -> 0 bytes
tests/data/pngsuite/linepattern1.png | Bin 210 -> 0 bytes
tests/data/pngsuite/oi1n0g16.png | Bin 167 -> 0 bytes
tests/data/pngsuite/oi1n2c16.png | Bin 302 -> 0 bytes
tests/data/pngsuite/oi2n0g16.png | Bin 179 -> 0 bytes
tests/data/pngsuite/oi2n2c16.png | Bin 314 -> 0 bytes
tests/data/pngsuite/oi4n0g16.png | Bin 203 -> 0 bytes
tests/data/pngsuite/oi4n2c16.png | Bin 338 -> 0 bytes
tests/data/pngsuite/oi9n0g16.png | Bin 1283 -> 0 bytes
tests/data/pngsuite/oi9n2c16.png | Bin 3038 -> 0 bytes
tests/data/pngsuite/pp0n2c16.png | Bin 962 -> 0 bytes
tests/data/pngsuite/pp0n6a08.png | Bin 818 -> 0 bytes
tests/data/pngsuite/ps1n0g08.png | Bin 1456 -> 0 bytes
tests/data/pngsuite/ps1n2c16.png | Bin 1620 -> 0 bytes
tests/data/pngsuite/ps2n0g08.png | Bin 2320 -> 0 bytes
tests/data/pngsuite/ps2n2c16.png | Bin 2484 -> 0 bytes
tests/data/pngsuite/s01i3p01.png | Bin 113 -> 0 bytes
tests/data/pngsuite/s01n3p01.png | Bin 113 -> 0 bytes
tests/data/pngsuite/s02i3p01.png | Bin 114 -> 0 bytes
tests/data/pngsuite/s02n3p01.png | Bin 115 -> 0 bytes
tests/data/pngsuite/s03i3p01.png | Bin 118 -> 0 bytes
tests/data/pngsuite/s03n3p01.png | Bin 120 -> 0 bytes
tests/data/pngsuite/s04i3p01.png | Bin 126 -> 0 bytes
tests/data/pngsuite/s04n3p01.png | Bin 121 -> 0 bytes
tests/data/pngsuite/s05i3p02.png | Bin 134 -> 0 bytes
tests/data/pngsuite/s05n3p02.png | Bin 129 -> 0 bytes
tests/data/pngsuite/s06i3p02.png | Bin 143 -> 0 bytes
tests/data/pngsuite/s06n3p02.png | Bin 131 -> 0 bytes
tests/data/pngsuite/s07i3p02.png | Bin 149 -> 0 bytes
tests/data/pngsuite/s07n3p02.png | Bin 138 -> 0 bytes
tests/data/pngsuite/s08i3p02.png | Bin 149 -> 0 bytes
tests/data/pngsuite/s08n3p02.png | Bin 139 -> 0 bytes
tests/data/pngsuite/s09i3p02.png | Bin 147 -> 0 bytes
tests/data/pngsuite/s09n3p02.png | Bin 143 -> 0 bytes
tests/data/pngsuite/s32i3p04.png | Bin 355 -> 0 bytes
tests/data/pngsuite/s32n3p04.png | Bin 263 -> 0 bytes
tests/data/pngsuite/s33i3p04.png | Bin 385 -> 0 bytes
tests/data/pngsuite/s33n3p04.png | Bin 329 -> 0 bytes
tests/data/pngsuite/s34i3p04.png | Bin 349 -> 0 bytes
tests/data/pngsuite/s34n3p04.png | Bin 248 -> 0 bytes
tests/data/pngsuite/s35i3p04.png | Bin 399 -> 0 bytes
tests/data/pngsuite/s35n3p04.png | Bin 338 -> 0 bytes
tests/data/pngsuite/s36i3p04.png | Bin 356 -> 0 bytes
tests/data/pngsuite/s36n3p04.png | Bin 258 -> 0 bytes
tests/data/pngsuite/s37i3p04.png | Bin 393 -> 0 bytes
tests/data/pngsuite/s37n3p04.png | Bin 336 -> 0 bytes
tests/data/pngsuite/s38i3p04.png | Bin 357 -> 0 bytes
tests/data/pngsuite/s38n3p04.png | Bin 245 -> 0 bytes
tests/data/pngsuite/s39i3p04.png | Bin 420 -> 0 bytes
tests/data/pngsuite/s39n3p04.png | Bin 352 -> 0 bytes
tests/data/pngsuite/s40i3p04.png | Bin 357 -> 0 bytes
tests/data/pngsuite/s40n3p04.png | Bin 256 -> 0 bytes
tests/data/pngsuite/tbbn0g04.png | Bin 429 -> 0 bytes
tests/data/pngsuite/tbbn2c16.png | Bin 2041 -> 0 bytes
tests/data/pngsuite/tbbn3p08.png | Bin 1499 -> 0 bytes
tests/data/pngsuite/tbgn2c16.png | Bin 2041 -> 0 bytes
tests/data/pngsuite/tbgn3p08.png | Bin 1499 -> 0 bytes
tests/data/pngsuite/tbrn2c08.png | Bin 1633 -> 0 bytes
tests/data/pngsuite/tbwn0g16.png | Bin 1313 -> 0 bytes
tests/data/pngsuite/tbwn3p08.png | Bin 1496 -> 0 bytes
tests/data/pngsuite/tbyn3p08.png | Bin 1499 -> 0 bytes
tests/data/pngsuite/tp0n0g08.png | Bin 719 -> 0 bytes
tests/data/pngsuite/tp0n2c08.png | Bin 1594 -> 0 bytes
tests/data/pngsuite/tp0n3p08.png | Bin 1476 -> 0 bytes
tests/data/pngsuite/tp1n3p08.png | Bin 1483 -> 0 bytes
tests/data/pngsuite/xc1n0g08.png | Bin 138 -> 0 bytes
tests/data/pngsuite/xc9n2c08.png | Bin 145 -> 0 bytes
tests/data/pngsuite/xcrn0g04.png | Bin 145 -> 0 bytes
tests/data/pngsuite/xd0n2c08.png | Bin 145 -> 0 bytes
tests/data/pngsuite/xd3n2c08.png | Bin 145 -> 0 bytes
tests/data/pngsuite/xd9n2c08.png | Bin 145 -> 0 bytes
tests/data/pngsuite/xdtn0g01.png | Bin 61 -> 0 bytes
tests/data/pngsuite/xlfn0g04.png | Bin 145 -> 0 bytes
tests/data/pngsuite/xs1n0g01.png | Bin 164 -> 0 bytes
tests/data/pngsuite/xs2n0g01.png | Bin 164 -> 0 bytes
tests/data/pngsuite/xs4n0g01.png | Bin 164 -> 0 bytes
tests/data/pngsuite/xs7n0g01.png | Bin 164 -> 0 bytes
tests/data/pngsuite/z00n2c08.png | Bin 3172 -> 0 bytes
tests/data/pngsuite/z03n2c08.png | Bin 232 -> 0 bytes
tests/data/pngsuite/z06n2c08.png | Bin 224 -> 0 bytes
tests/data/pngsuite/z09n2c08.png | Bin 224 -> 0 bytes
.../python_plugin/python_circle_datasource.xml | 50 -
.../data/python_plugin/python_point_datasource.xml | 18 -
.../data/raster_tiles/000/000/000/000/000/000.tif | Bin 3427 -> 0 bytes
.../data/raster_tiles/000/000/000/000/000/001.tif | Bin 3427 -> 0 bytes
.../data/raster_tiles/000/000/001/000/000/000.tif | Bin 3427 -> 0 bytes
.../data/raster_tiles/000/000/001/000/000/001.tif | Bin 3423 -> 0 bytes
tests/data/shp/arrows.dbf | Bin 293 -> 0 bytes
tests/data/shp/arrows.shp | Bin 212 -> 0 bytes
tests/data/shp/arrows.shx | Bin 132 -> 0 bytes
tests/data/shp/charplacement.dbf | Bin 487 -> 0 bytes
tests/data/shp/charplacement.shp | Bin 2108 -> 0 bytes
tests/data/shp/charplacement.shx | Bin 204 -> 0 bytes
tests/data/shp/displacement.dbf | Bin 1605 -> 0 bytes
tests/data/shp/displacement.shp | Bin 2772 -> 0 bytes
tests/data/shp/displacement.shx | Bin 308 -> 0 bytes
tests/data/shp/farsi-labels.dbf | Bin 1107 -> 0 bytes
tests/data/shp/farsi-labels.prj | 1 -
tests/data/shp/farsi-labels.shp | Bin 380 -> 0 bytes
tests/data/shp/farsi-labels.shx | Bin 180 -> 0 bytes
tests/data/shp/long_lat.dbf | Bin 688 -> 0 bytes
tests/data/shp/long_lat.dbt | Bin 519 -> 0 bytes
tests/data/shp/long_lat.prj | 1 -
tests/data/shp/long_lat.shp | Bin 128 -> 0 bytes
tests/data/shp/long_lat.shx | Bin 108 -> 0 bytes
tests/data/shp/overlap.dbf | Bin 617 -> 0 bytes
tests/data/shp/overlap.shp | Bin 1972 -> 0 bytes
tests/data/shp/overlap.shx | Bin 260 -> 0 bytes
tests/data/shp/points/ogr_zfield.dbf | Bin 370 -> 0 bytes
tests/data/shp/points/ogr_zfield.prj | 1 -
tests/data/shp/points/ogr_zfield.shp | Bin 208 -> 0 bytes
tests/data/shp/points/ogr_zfield.shx | Bin 124 -> 0 bytes
tests/data/shp/points/poi.dbf | Bin 4933 -> 0 bytes
tests/data/shp/points/poi.prj | 1 -
tests/data/shp/points/poi.shp | Bin 848 -> 0 bytes
tests/data/shp/points/poi.shx | Bin 236 -> 0 bytes
tests/data/shp/points/poi.zip | Bin 4380 -> 0 bytes
tests/data/shp/points/poi_ogr.dbf | Bin 4932 -> 0 bytes
tests/data/shp/points/poi_ogr.prj | 1 -
tests/data/shp/points/poi_ogr.shp | Bin 712 -> 0 bytes
tests/data/shp/points/poi_ogr.shx | Bin 236 -> 0 bytes
tests/data/shp/points/qgis.dbf | Bin 370 -> 0 bytes
tests/data/shp/points/qgis.prj | 1 -
tests/data/shp/points/qgis.qpj | 1 -
tests/data/shp/points/qgis.shp | Bin 184 -> 0 bytes
tests/data/shp/points/qgis.shx | Bin 124 -> 0 bytes
tests/data/shp/points/qgis_multi.dbf | Bin 188 -> 0 bytes
tests/data/shp/points/qgis_multi.prj | 1 -
tests/data/shp/points/qgis_multi.qpj | 1 -
tests/data/shp/points/qgis_multi.shp | Bin 196 -> 0 bytes
tests/data/shp/points/qgis_multi.shx | Bin 108 -> 0 bytes
tests/data/shp/poly.dbf | Bin 529 -> 0 bytes
tests/data/shp/poly.prj | 1 -
tests/data/shp/poly.shp | Bin 4580 -> 0 bytes
tests/data/shp/poly.shx | Bin 180 -> 0 bytes
tests/data/shp/polylines.dbf | Bin 198 -> 0 bytes
tests/data/shp/polylines.prj | 1 -
tests/data/shp/polylines.shp | Bin 5932 -> 0 bytes
tests/data/shp/polylines.shx | Bin 188 -> 0 bytes
tests/data/shp/textspacing.dbf | Bin 403 -> 0 bytes
tests/data/shp/textspacing.shp | Bin 2332 -> 0 bytes
tests/data/shp/textspacing.shx | Bin 236 -> 0 bytes
tests/data/shp/wkt_poly.dbf | Bin 741 -> 0 bytes
tests/data/shp/wkt_poly.shp | Bin 932 -> 0 bytes
tests/data/shp/wkt_poly.shx | Bin 132 -> 0 bytes
tests/data/sqlite/64bit_int.sqlite | Bin 6144 -> 0 bytes
tests/data/sqlite/business.sqlite | Bin 12288 -> 0 bytes
tests/data/sqlite/empty.db | Bin 2048 -> 0 bytes
tests/data/sqlite/qgis_spatiallite.sqlite | Bin 623616 -> 0 bytes
tests/data/sqlite/world.sqlite | Bin 507904 -> 0 bytes
tests/data/svg/README.md | 6 -
tests/data/svg/box.svg | 25 -
tests/data/svg/crosshair16x16.svg | 36 -
tests/data/svg/ellipses.svg | 118 -
tests/data/svg/linepattern.svg | 97 -
tests/data/svg/octocat.svg | 17 -
tests/data/svg/place-of-worship-24.svg | 27 -
tests/data/svg/point.svg | 10 -
tests/data/svg/point_sm.svg | 10 -
tests/data/svg/radial.svg | 15 -
tests/data/svg/radial_combo.svg | 32 -
tests/data/svg/rect.svg | 9 -
tests/data/svg/rect2.svg | 39 -
tests/data/svg/transparent_circle.svg | 70 -
tests/data/vrt/points.vrt | 8 -
.../line_pattern_symbolizer_broken.xml | 8 -
tests/data/warning_maps/missing_icon.xml | 8 -
.../data/warning_maps/point_symbolizer_broken.xml | 8 -
tests/python_tests/__init__.py | 0
.../agg_rasterizer_integer_overflow_test.py | 40 -
tests/python_tests/box2d_test.py | 177 -
tests/python_tests/buffer_clear_test.py | 63 -
tests/python_tests/cairo_test.py | 196 -
tests/python_tests/compositing_test.py | 262 -
tests/python_tests/csv_test.py | 607 --
tests/python_tests/datasource_test.py | 128 -
tests/python_tests/datasource_xml_template_test.py | 24 -
tests/python_tests/extra_map_props_test.py | 37 -
tests/python_tests/feature_id_test.py | 66 -
tests/python_tests/feature_test.py | 118 -
tests/python_tests/filter_test.py | 445 -
tests/python_tests/font_test.py | 16 -
tests/python_tests/fontset_test.py | 42 -
tests/python_tests/geojson_plugin_test.py | 91 -
tests/python_tests/geometry_io_test.py | 347 -
tests/python_tests/grayscale_test.py | 13 -
tests/python_tests/image_encoding_speed_test.py | 127 -
tests/python_tests/image_filters_test.py | 68 -
tests/python_tests/image_test.py | 82 -
tests/python_tests/images/composited/clear.png | Bin 334 -> 0 bytes
tests/python_tests/images/composited/color.png | Bin 13905 -> 0 bytes
.../python_tests/images/composited/color_burn.png | Bin 14804 -> 0 bytes
.../python_tests/images/composited/color_dodge.png | Bin 14898 -> 0 bytes
tests/python_tests/images/composited/contrast.png | Bin 10630 -> 0 bytes
tests/python_tests/images/composited/darken.png | Bin 14551 -> 0 bytes
.../python_tests/images/composited/difference.png | Bin 14926 -> 0 bytes
tests/python_tests/images/composited/divide.png | Bin 10492 -> 0 bytes
tests/python_tests/images/composited/dst.png | Bin 7521 -> 0 bytes
tests/python_tests/images/composited/dst_atop.png | Bin 11764 -> 0 bytes
tests/python_tests/images/composited/dst_in.png | Bin 7563 -> 0 bytes
tests/python_tests/images/composited/dst_out.png | Bin 9501 -> 0 bytes
tests/python_tests/images/composited/dst_over.png | Bin 14402 -> 0 bytes
tests/python_tests/images/composited/exclusion.png | Bin 14219 -> 0 bytes
.../images/composited/grain_extract.png | Bin 9149 -> 0 bytes
.../python_tests/images/composited/grain_merge.png | Bin 13368 -> 0 bytes
.../python_tests/images/composited/hard_light.png | Bin 15018 -> 0 bytes
tests/python_tests/images/composited/hue.png | Bin 13240 -> 0 bytes
tests/python_tests/images/composited/invert.png | Bin 14130 -> 0 bytes
.../python_tests/images/composited/invert_rgb.png | Bin 13952 -> 0 bytes
tests/python_tests/images/composited/lighten.png | Bin 14758 -> 0 bytes
.../python_tests/images/composited/linear_burn.png | Bin 10261 -> 0 bytes
.../images/composited/linear_dodge.png | Bin 14279 -> 0 bytes
tests/python_tests/images/composited/minus.png | Bin 12486 -> 0 bytes
tests/python_tests/images/composited/multiply.png | Bin 14948 -> 0 bytes
tests/python_tests/images/composited/overlay.png | Bin 15167 -> 0 bytes
tests/python_tests/images/composited/plus.png | Bin 13667 -> 0 bytes
.../python_tests/images/composited/saturation.png | Bin 13561 -> 0 bytes
tests/python_tests/images/composited/screen.png | Bin 14839 -> 0 bytes
.../python_tests/images/composited/soft_light.png | Bin 15000 -> 0 bytes
tests/python_tests/images/composited/src.png | Bin 8085 -> 0 bytes
tests/python_tests/images/composited/src_atop.png | Bin 11651 -> 0 bytes
tests/python_tests/images/composited/src_in.png | Bin 8163 -> 0 bytes
tests/python_tests/images/composited/src_out.png | Bin 10273 -> 0 bytes
tests/python_tests/images/composited/src_over.png | Bin 14368 -> 0 bytes
tests/python_tests/images/composited/value.png | Bin 13720 -> 0 bytes
tests/python_tests/images/composited/xor.png | Bin 14733 -> 0 bytes
.../pycairo/cairo-cairo-expected-reduced.png | Bin 2195 -> 0 bytes
.../images/pycairo/cairo-cairo-expected.pdf | Bin 5408 -> 0 bytes
.../images/pycairo/cairo-cairo-expected.png | Bin 4199 -> 0 bytes
.../images/pycairo/cairo-cairo-expected.svg | 50 -
.../pycairo/cairo-surface-expected.building.pdf | Bin 7451 -> 0 bytes
.../pycairo/cairo-surface-expected.building.svg | 261 -
.../pycairo/cairo-surface-expected.point.pdf | Bin 27721 -> 0 bytes
.../pycairo/cairo-surface-expected.point.svg | 488 -
.../pycairo/cairo-surface-expected.polygon.pdf | Bin 5620 -> 0 bytes
.../pycairo/cairo-surface-expected.polygon.svg | 35 -
tests/python_tests/images/style-comp-op/clear.png | Bin 334 -> 0 bytes
tests/python_tests/images/style-comp-op/color.png | Bin 13951 -> 0 bytes
.../images/style-comp-op/color_burn.png | Bin 14928 -> 0 bytes
.../images/style-comp-op/color_dodge.png | Bin 14528 -> 0 bytes
.../python_tests/images/style-comp-op/contrast.png | Bin 14545 -> 0 bytes
tests/python_tests/images/style-comp-op/darken.png | Bin 14370 -> 0 bytes
.../images/style-comp-op/difference.png | Bin 14692 -> 0 bytes
tests/python_tests/images/style-comp-op/divide.png | Bin 3587 -> 0 bytes
tests/python_tests/images/style-comp-op/dst.png | Bin 11363 -> 0 bytes
.../python_tests/images/style-comp-op/dst_atop.png | Bin 7619 -> 0 bytes
tests/python_tests/images/style-comp-op/dst_in.png | Bin 7619 -> 0 bytes
.../python_tests/images/style-comp-op/dst_out.png | Bin 14894 -> 0 bytes
.../python_tests/images/style-comp-op/dst_over.png | Bin 11363 -> 0 bytes
.../images/style-comp-op/exclusion.png | Bin 14320 -> 0 bytes
.../images/style-comp-op/grain_extract.png | Bin 7257 -> 0 bytes
.../images/style-comp-op/grain_merge.png | Bin 14249 -> 0 bytes
.../images/style-comp-op/hard_light.png | Bin 14879 -> 0 bytes
tests/python_tests/images/style-comp-op/hue.png | Bin 13000 -> 0 bytes
tests/python_tests/images/style-comp-op/invert.png | Bin 13608 -> 0 bytes
.../python_tests/images/style-comp-op/lighten.png | Bin 12935 -> 0 bytes
.../images/style-comp-op/linear_burn.png | Bin 2356 -> 0 bytes
.../images/style-comp-op/linear_dodge.png | Bin 14410 -> 0 bytes
tests/python_tests/images/style-comp-op/minus.png | Bin 14384 -> 0 bytes
.../python_tests/images/style-comp-op/multiply.png | Bin 14724 -> 0 bytes
.../python_tests/images/style-comp-op/overlay.png | Bin 14395 -> 0 bytes
tests/python_tests/images/style-comp-op/plus.png | Bin 14410 -> 0 bytes
.../images/style-comp-op/saturation.png | Bin 13789 -> 0 bytes
tests/python_tests/images/style-comp-op/screen.png | Bin 14255 -> 0 bytes
.../images/style-comp-op/soft_light.png | Bin 14227 -> 0 bytes
tests/python_tests/images/style-comp-op/src.png | Bin 4979 -> 0 bytes
.../python_tests/images/style-comp-op/src_atop.png | Bin 14801 -> 0 bytes
tests/python_tests/images/style-comp-op/src_in.png | Bin 4979 -> 0 bytes
.../python_tests/images/style-comp-op/src_out.png | Bin 334 -> 0 bytes
.../python_tests/images/style-comp-op/src_over.png | Bin 14778 -> 0 bytes
tests/python_tests/images/style-comp-op/value.png | Bin 14463 -> 0 bytes
tests/python_tests/images/style-comp-op/xor.png | Bin 14936 -> 0 bytes
.../images/style-image-filter/agg-stack-blur22.png | Bin 33631 -> 0 bytes
.../images/style-image-filter/blur.png | Bin 27360 -> 0 bytes
.../images/style-image-filter/edge-detect.png | Bin 22507 -> 0 bytes
.../images/style-image-filter/emboss.png | Bin 24609 -> 0 bytes
.../images/style-image-filter/gray.png | Bin 23621 -> 0 bytes
.../images/style-image-filter/invert.png | Bin 24135 -> 0 bytes
.../images/style-image-filter/none.png | Bin 24126 -> 0 bytes
.../images/style-image-filter/sharpen.png | Bin 22800 -> 0 bytes
.../images/style-image-filter/sobel.png | Bin 23980 -> 0 bytes
.../images/style-image-filter/x-gradient.png | Bin 27033 -> 0 bytes
.../images/style-image-filter/y-gradient.png | Bin 27265 -> 0 bytes
tests/python_tests/images/support/a.png | Bin 7543 -> 0 bytes
tests/python_tests/images/support/b.png | Bin 8084 -> 0 bytes
.../encoding-opts/aerial_rgba-png+e=miniz.png | Bin 47214 -> 0 bytes
.../support/encoding-opts/aerial_rgba-png+t=0.png | Bin 46310 -> 0 bytes
.../support/encoding-opts/aerial_rgba-png.png | Bin 46310 -> 0 bytes
.../encoding-opts/aerial_rgba-png32+e=miniz.png | Bin 160552 -> 0 bytes
.../encoding-opts/aerial_rgba-png32+t=0.png | Bin 143537 -> 0 bytes
.../support/encoding-opts/aerial_rgba-png32.png | Bin 160268 -> 0 bytes
.../encoding-opts/aerial_rgba-png8+e=miniz.png | Bin 47214 -> 0 bytes
.../encoding-opts/aerial_rgba-png8+m=h+c=1+t=0.png | Bin 103 -> 0 bytes
.../encoding-opts/aerial_rgba-png8+m=h+c=1.png | Bin 103 -> 0 bytes
.../encoding-opts/aerial_rgba-png8+m=h+t=0.png | Bin 46310 -> 0 bytes
.../encoding-opts/aerial_rgba-png8+m=h+t=1.png | Bin 46310 -> 0 bytes
.../encoding-opts/aerial_rgba-png8+m=h+t=2.png | Bin 46310 -> 0 bytes
.../support/encoding-opts/aerial_rgba-png8+m=h.png | Bin 46310 -> 0 bytes
.../encoding-opts/aerial_rgba-png8+m=o+c=1+t=0.png | Bin 103 -> 0 bytes
.../encoding-opts/aerial_rgba-png8+m=o+c=1.png | Bin 103 -> 0 bytes
.../encoding-opts/aerial_rgba-png8+m=o+t=0.png | Bin 43267 -> 0 bytes
.../encoding-opts/aerial_rgba-png8+m=o+t=1.png | Bin 43267 -> 0 bytes
.../encoding-opts/aerial_rgba-png8+m=o+t=2.png | Bin 43267 -> 0 bytes
.../support/encoding-opts/aerial_rgba-png8+m=o.png | Bin 43267 -> 0 bytes
.../aerial_rgba-webp+alpha=false.webp | Bin 10544 -> 0 bytes
.../aerial_rgba-webp+alpha_compression=0.webp | Bin 10544 -> 0 bytes
.../aerial_rgba-webp+alpha_filtering=2.webp | Bin 10544 -> 0 bytes
.../aerial_rgba-webp+alpha_quality=50.webp | Bin 10544 -> 0 bytes
.../aerial_rgba-webp+autofilter=0.webp | Bin 10544 -> 0 bytes
.../aerial_rgba-webp+filter_sharpness=4.webp | Bin 10544 -> 0 bytes
.../aerial_rgba-webp+filter_strength=50.webp | Bin 10544 -> 0 bytes
...erial_rgba-webp+filter_type=1+autofilter=1.webp | Bin 10544 -> 0 bytes
.../encoding-opts/aerial_rgba-webp+method=0.webp | Bin 11794 -> 0 bytes
.../encoding-opts/aerial_rgba-webp+method=6.webp | Bin 10054 -> 0 bytes
.../aerial_rgba-webp+partition_limit=50.webp | Bin 10572 -> 0 bytes
.../aerial_rgba-webp+partitions=3.webp | Bin 10544 -> 0 bytes
.../encoding-opts/aerial_rgba-webp+pass=10.webp | Bin 10526 -> 0 bytes
.../aerial_rgba-webp+preprocessing=1.webp | Bin 10546 -> 0 bytes
.../encoding-opts/aerial_rgba-webp+quality=64.webp | Bin 9338 -> 0 bytes
.../encoding-opts/aerial_rgba-webp+segments=3.webp | Bin 10528 -> 0 bytes
.../aerial_rgba-webp+sns_strength=50.webp | Bin 10544 -> 0 bytes
.../aerial_rgba-webp+target_PSNR=.5.webp | Bin 10544 -> 0 bytes
.../aerial_rgba-webp+target_size=100.webp | Bin 10544 -> 0 bytes
.../support/encoding-opts/aerial_rgba-webp.webp | Bin 10544 -> 0 bytes
.../support/encoding-opts/blank-png+e=miniz.png | Bin 103 -> 0 bytes
.../images/support/encoding-opts/blank-png+t=0.png | Bin 103 -> 0 bytes
.../images/support/encoding-opts/blank-png.png | Bin 103 -> 0 bytes
.../support/encoding-opts/blank-png32+e=miniz.png | Bin 985 -> 0 bytes
.../support/encoding-opts/blank-png32+t=0.png | Bin 851 -> 0 bytes
.../images/support/encoding-opts/blank-png32.png | Bin 915 -> 0 bytes
.../support/encoding-opts/blank-png8+e=miniz.png | Bin 103 -> 0 bytes
.../encoding-opts/blank-png8+m=h+c=1+t=0.png | Bin 103 -> 0 bytes
.../support/encoding-opts/blank-png8+m=h+c=1.png | Bin 103 -> 0 bytes
.../support/encoding-opts/blank-png8+m=h+t=0.png | Bin 103 -> 0 bytes
.../support/encoding-opts/blank-png8+m=h+t=1.png | Bin 103 -> 0 bytes
.../support/encoding-opts/blank-png8+m=h+t=2.png | Bin 103 -> 0 bytes
.../support/encoding-opts/blank-png8+m=h.png | Bin 103 -> 0 bytes
.../encoding-opts/blank-png8+m=o+c=1+t=0.png | Bin 103 -> 0 bytes
.../support/encoding-opts/blank-png8+m=o+c=1.png | Bin 103 -> 0 bytes
.../support/encoding-opts/blank-png8+m=o+t=0.png | Bin 103 -> 0 bytes
.../support/encoding-opts/blank-png8+m=o+t=1.png | Bin 103 -> 0 bytes
.../support/encoding-opts/blank-png8+m=o+t=2.png | Bin 103 -> 0 bytes
.../support/encoding-opts/blank-png8+m=o.png | Bin 103 -> 0 bytes
.../encoding-opts/blank-webp+alpha=false.webp | Bin 180 -> 0 bytes
.../blank-webp+alpha_compression=0.webp | Bin 65744 -> 0 bytes
.../blank-webp+alpha_filtering=2.webp | Bin 226 -> 0 bytes
.../encoding-opts/blank-webp+alpha_quality=50.webp | Bin 226 -> 0 bytes
.../encoding-opts/blank-webp+autofilter=0.webp | Bin 226 -> 0 bytes
.../blank-webp+filter_sharpness=4.webp | Bin 226 -> 0 bytes
.../blank-webp+filter_strength=50.webp | Bin 226 -> 0 bytes
.../blank-webp+filter_type=1+autofilter=1.webp | Bin 222 -> 0 bytes
.../support/encoding-opts/blank-webp+method=0.webp | Bin 304 -> 0 bytes
.../support/encoding-opts/blank-webp+method=6.webp | Bin 242 -> 0 bytes
.../blank-webp+partition_limit=50.webp | Bin 226 -> 0 bytes
.../encoding-opts/blank-webp+partitions=3.webp | Bin 226 -> 0 bytes
.../support/encoding-opts/blank-webp+pass=10.webp | Bin 226 -> 0 bytes
.../encoding-opts/blank-webp+preprocessing=1.webp | Bin 226 -> 0 bytes
.../encoding-opts/blank-webp+quality=64.webp | Bin 224 -> 0 bytes
.../encoding-opts/blank-webp+segments=3.webp | Bin 224 -> 0 bytes
.../encoding-opts/blank-webp+sns_strength=50.webp | Bin 226 -> 0 bytes
.../encoding-opts/blank-webp+target_PSNR=.5.webp | Bin 226 -> 0 bytes
.../encoding-opts/blank-webp+target_size=100.webp | Bin 226 -> 0 bytes
.../images/support/encoding-opts/blank-webp.webp | Bin 226 -> 0 bytes
.../support/encoding-opts/solid-png+e=miniz.png | Bin 116 -> 0 bytes
.../images/support/encoding-opts/solid-png+t=0.png | Bin 103 -> 0 bytes
.../images/support/encoding-opts/solid-png.png | Bin 116 -> 0 bytes
.../support/encoding-opts/solid-png32+e=miniz.png | Bin 334 -> 0 bytes
.../support/encoding-opts/solid-png32+t=0.png | Bin 270 -> 0 bytes
.../images/support/encoding-opts/solid-png32.png | Bin 334 -> 0 bytes
.../support/encoding-opts/solid-png8+e=miniz.png | Bin 116 -> 0 bytes
.../encoding-opts/solid-png8+m=h+c=1+t=0.png | Bin 103 -> 0 bytes
.../support/encoding-opts/solid-png8+m=h+c=1.png | Bin 116 -> 0 bytes
.../support/encoding-opts/solid-png8+m=h+t=0.png | Bin 103 -> 0 bytes
.../support/encoding-opts/solid-png8+m=h+t=1.png | Bin 116 -> 0 bytes
.../support/encoding-opts/solid-png8+m=h+t=2.png | Bin 116 -> 0 bytes
.../support/encoding-opts/solid-png8+m=h.png | Bin 116 -> 0 bytes
.../encoding-opts/solid-png8+m=o+c=1+t=0.png | Bin 103 -> 0 bytes
.../support/encoding-opts/solid-png8+m=o+c=1.png | Bin 116 -> 0 bytes
.../support/encoding-opts/solid-png8+m=o+t=0.png | Bin 103 -> 0 bytes
.../support/encoding-opts/solid-png8+m=o+t=1.png | Bin 116 -> 0 bytes
.../support/encoding-opts/solid-png8+m=o+t=2.png | Bin 116 -> 0 bytes
.../support/encoding-opts/solid-png8+m=o.png | Bin 116 -> 0 bytes
.../encoding-opts/solid-webp+alpha=false.webp | Bin 200 -> 0 bytes
.../solid-webp+alpha_compression=0.webp | Bin 200 -> 0 bytes
.../solid-webp+alpha_filtering=2.webp | Bin 200 -> 0 bytes
.../encoding-opts/solid-webp+alpha_quality=50.webp | Bin 200 -> 0 bytes
.../encoding-opts/solid-webp+autofilter=0.webp | Bin 200 -> 0 bytes
.../solid-webp+filter_sharpness=4.webp | Bin 200 -> 0 bytes
.../solid-webp+filter_strength=50.webp | Bin 200 -> 0 bytes
.../solid-webp+filter_type=1+autofilter=1.webp | Bin 196 -> 0 bytes
.../support/encoding-opts/solid-webp+method=0.webp | Bin 474 -> 0 bytes
.../support/encoding-opts/solid-webp+method=6.webp | Bin 216 -> 0 bytes
.../solid-webp+partition_limit=50.webp | Bin 200 -> 0 bytes
.../encoding-opts/solid-webp+partitions=3.webp | Bin 200 -> 0 bytes
.../support/encoding-opts/solid-webp+pass=10.webp | Bin 200 -> 0 bytes
.../encoding-opts/solid-webp+preprocessing=1.webp | Bin 200 -> 0 bytes
.../encoding-opts/solid-webp+quality=64.webp | Bin 196 -> 0 bytes
.../encoding-opts/solid-webp+segments=3.webp | Bin 200 -> 0 bytes
.../encoding-opts/solid-webp+sns_strength=50.webp | Bin 200 -> 0 bytes
.../encoding-opts/solid-webp+target_PSNR=.5.webp | Bin 200 -> 0 bytes
.../encoding-opts/solid-webp+target_size=100.webp | Bin 200 -> 0 bytes
.../images/support/encoding-opts/solid-webp.webp | Bin 200 -> 0 bytes
.../images/support/mapnik-layer-buffer-size.png | Bin 2461 -> 0 bytes
.../support/mapnik-marker-ellipse-render1.png | Bin 16049 -> 0 bytes
.../support/mapnik-marker-ellipse-render2.png | Bin 14207 -> 0 bytes
.../mapnik-merc2merc-reprojection-render1.png | Bin 45677 -> 0 bytes
.../mapnik-merc2merc-reprojection-render2.png | Bin 45515 -> 0 bytes
.../mapnik-merc2wgs84-reprojection-render.png | Bin 40566 -> 0 bytes
.../images/support/mapnik-palette-test.png | Bin 12148 -> 0 bytes
.../support/mapnik-python-circle-render1.png | Bin 126206 -> 0 bytes
.../images/support/mapnik-python-point-render1.png | Bin 4165 -> 0 bytes
.../images/support/mapnik-style-level-opacity.png | Bin 42379 -> 0 bytes
.../mapnik-wgs842merc-reprojection-render.png | Bin 48145 -> 0 bytes
.../images/support/marker-in-center-not-placed.png | Bin 116 -> 0 bytes
.../images/support/marker-in-center.png | Bin 250 -> 0 bytes
.../marker-text-line-scale-factor-0.005.png | Bin 1877 -> 0 bytes
.../support/marker-text-line-scale-factor-0.1.png | Bin 3897 -> 0 bytes
.../marker-text-line-scale-factor-0.899.png | Bin 17562 -> 0 bytes
.../support/marker-text-line-scale-factor-1.5.png | Bin 11472 -> 0 bytes
.../support/marker-text-line-scale-factor-1.png | Bin 18701 -> 0 bytes
.../support/marker-text-line-scale-factor-10.png | Bin 8340 -> 0 bytes
.../support/marker-text-line-scale-factor-100.png | Bin 2698 -> 0 bytes
.../marker-text-line-scale-factor-1e-05.png | Bin 1637 -> 0 bytes
.../support/marker-text-line-scale-factor-2.png | Bin 11856 -> 0 bytes
.../support/marker-text-line-scale-factor-5.png | Bin 13987 -> 0 bytes
tests/python_tests/images/support/raster-alpha.png | Bin 4442 -> 0 bytes
tests/python_tests/images/support/spacing.png | Bin 48120 -> 0 bytes
.../images/support/transparency/aerial_rgb.png | Bin 143537 -> 0 bytes
.../images/support/transparency/aerial_rgba.png | Bin 160268 -> 0 bytes
.../images/support/transparency/white0.png | Bin 242 -> 0 bytes
.../images/support/transparency/white0.webp | Bin 744 -> 0 bytes
.../images/support/transparency/white1.png | Bin 257 -> 0 bytes
.../images/support/transparency/white2.png | Bin 258 -> 0 bytes
tests/python_tests/introspection_test.py | 61 -
tests/python_tests/json_feature_properties_test.py | 103 -
tests/python_tests/layer_buffer_size_test.py | 35 -
tests/python_tests/layer_modification_test.py | 75 -
tests/python_tests/layer_test.py | 28 -
tests/python_tests/load_map_test.py | 61 -
tests/python_tests/map_query_test.py | 104 -
tests/python_tests/mapnik_config_test.py | 80 -
tests/python_tests/mapnik_logger_test.py | 18 -
tests/python_tests/mapnik_test_data_test.py | 61 -
.../python_tests/markers_complex_rendering_test.py | 40 -
tests/python_tests/memory_datasource_test.py | 34 -
tests/python_tests/multi_tile_raster_test.py | 68 -
tests/python_tests/object_test.py | 569 --
.../python_tests/ogr_and_shape_geometries_test.py | 45 -
tests/python_tests/ogr_test.py | 101 -
tests/python_tests/osm_test.py | 52 -
tests/python_tests/palette_test.py | 50 -
tests/python_tests/parameters_test.py | 61 -
tests/python_tests/pgraster_test.py | 756 --
tests/python_tests/pickling_test.py | 45 -
tests/python_tests/png_encoding_test.py | 164 -
tests/python_tests/pngsuite_test.py | 35 -
tests/python_tests/postgis_test.py | 1032 ---
tests/python_tests/projection_test.py | 118 -
tests/python_tests/python_plugin_test.py | 160 -
tests/python_tests/query_test.py | 37 -
tests/python_tests/query_tolerance_test.py | 43 -
tests/python_tests/raster_colorizer_test.py | 90 -
tests/python_tests/raster_symbolizer_test.py | 199 -
tests/python_tests/render_grid_test.py | 355 -
tests/python_tests/render_test.py | 241 -
tests/python_tests/reprojection_test.py | 92 -
tests/python_tests/save_map_test.py | 69 -
tests/python_tests/shapefile_test.py | 113 -
tests/python_tests/sqlite_rtree_test.py | 170 -
tests/python_tests/sqlite_test.py | 421 -
tests/python_tests/style_test.py | 19 -
tests/python_tests/topojson_plugin_test.py | 91 -
tests/python_tests/utilities.py | 88 -
tests/python_tests/webp_encoding_test.py | 162 -
tests/run_tests.py | 91 -
tests/visual_tests/.gitignore | 1 -
tests/visual_tests/clean.sh | 2 -
tests/visual_tests/compare.py | 85 -
tests/visual_tests/data/Yosemite_L9.tfw | 6 -
tests/visual_tests/data/Yosemite_L9.tif | Bin 1640865 -> 0 bytes
tests/visual_tests/data/aerial_rgba.tiff | Bin 718874 -> 0 bytes
tests/visual_tests/data/bug1532.csv | 5 -
tests/visual_tests/data/bug1533.csv | 5 -
tests/visual_tests/data/charplacement.dbf | Bin 487 -> 0 bytes
tests/visual_tests/data/charplacement.shp | Bin 2108 -> 0 bytes
tests/visual_tests/data/charplacement.shx | Bin 204 -> 0 bytes
tests/visual_tests/data/crossing-lines.csv | 7 -
tests/visual_tests/data/displacement.dbf | Bin 1605 -> 0 bytes
tests/visual_tests/data/displacement.shp | Bin 2772 -> 0 bytes
tests/visual_tests/data/displacement.shx | Bin 308 -> 0 bytes
tests/visual_tests/data/grouped-rendering.sqlite | Bin 196608 -> 0 bytes
tests/visual_tests/data/heat.tif | Bin 250608 -> 0 bytes
tests/visual_tests/data/heat_nodata.tif | Bin 250620 -> 0 bytes
tests/visual_tests/data/heat_rgb.tif | Bin 187954 -> 0 bytes
tests/visual_tests/data/hex.dbf | Bin 69 -> 0 bytes
tests/visual_tests/data/hex.prj | 1 -
tests/visual_tests/data/hex.shp | Bin 14768 -> 0 bytes
tests/visual_tests/data/hex.shx | Bin 108 -> 0 bytes
tests/visual_tests/data/line-offset.csv | 9 -
tests/visual_tests/data/line.dbf | Bin 72 -> 0 bytes
tests/visual_tests/data/line.shp | Bin 316 -> 0 bytes
tests/visual_tests/data/line.shx | Bin 108 -> 0 bytes
tests/visual_tests/data/lines.csv | 10 -
tests/visual_tests/data/lines2.csv | 17 -
tests/visual_tests/data/lower_columbia.tif | Bin 100279 -> 0 bytes
tests/visual_tests/data/marker-multi-policy.csv | 3 -
tests/visual_tests/data/marker-on-line.csv | 2 -
tests/visual_tests/data/overlap.dbf | Bin 617 -> 0 bytes
tests/visual_tests/data/overlap.shp | Bin 1972 -> 0 bytes
tests/visual_tests/data/overlap.shx | Bin 260 -> 0 bytes
tests/visual_tests/data/pattern.png | Bin 21447 -> 0 bytes
tests/visual_tests/data/points.csv | 11 -
tests/visual_tests/data/repeat-labels.csv | 10 -
tests/visual_tests/data/satellite.png | Bin 382439 -> 0 bytes
tests/visual_tests/data/snow-cover.tif | Bin 2876 -> 0 bytes
tests/visual_tests/data/text-data-binding.sqlite | Bin 18432 -> 0 bytes
tests/visual_tests/data/textspacing.dbf | Bin 403 -> 0 bytes
tests/visual_tests/data/textspacing.shp | Bin 2332 -> 0 bytes
tests/visual_tests/data/textspacing.shx | Bin 236 -> 0 bytes
tests/visual_tests/data/whole-centroid.csv | 2 -
...bolizer-opacity-512-512-1.0-grid-reference.json | 138 -
...bolizer-opacity-512-512-2.0-grid-reference.json | 138 -
.../charspacing-200-400-1.0-grid-reference.json | 109 -
.../charspacing-200-400-2.0-grid-reference.json | 109 -
...arspacing-lines-300-300-1.0-grid-reference.json | 84 -
...arspacing-lines-300-300-2.0-grid-reference.json | 84 -
.../collision-600-400-1.0-grid-reference.json | 109 -
.../collision-600-400-2.0-grid-reference.json | 109 -
...colorize-alpha1-512-512-1.0-grid-reference.json | 283 -
...colorize-alpha1-512-512-2.0-grid-reference.json | 283 -
...colorize-alpha2-512-512-1.0-grid-reference.json | 283 -
...colorize-alpha2-512-512-2.0-grid-reference.json | 283 -
...colorize-alpha3-500-100-1.0-grid-reference.json | 134 -
...colorize-alpha3-512-512-1.0-grid-reference.json | 283 -
...colorize-alpha3-512-512-2.0-grid-reference.json | 283 -
...ver-compositing-512-512-1.0-grid-reference.json | 140 -
...ver-compositing-512-512-2.0-grid-reference.json | 140 -
...xpressionformat-500-100-1.0-grid-reference.json | 43 -
...xpressionformat-500-100-2.0-grid-reference.json | 43 -
.../formatting-1-500-100-1.0-grid-reference.json | 43 -
.../formatting-1-500-100-2.0-grid-reference.json | 43 -
.../formatting-2-500-100-1.0-grid-reference.json | 43 -
.../formatting-2-500-100-2.0-grid-reference.json | 43 -
.../formatting-3-500-100-1.0-grid-reference.json | 43 -
.../formatting-3-500-100-2.0-grid-reference.json | 43 -
.../formatting-4-500-100-1.0-grid-reference.json | 43 -
.../formatting-4-500-100-2.0-grid-reference.json | 43 -
.../formatting-5-500-100-1.0-grid-reference.json | 43 -
.../formatting-5-500-100-2.0-grid-reference.json | 43 -
.../formatting-6-500-100-1.0-grid-reference.json | 43 -
.../formatting-6-500-100-2.0-grid-reference.json | 43 -
.../formatting-7-500-100-1.0-grid-reference.json | 43 -
.../formatting-7-500-100-2.0-grid-reference.json | 43 -
.../formatting-8-500-100-1.0-grid-reference.json | 43 -
.../formatting-8-500-100-2.0-grid-reference.json | 43 -
...-expr-alignment-500-500-1.0-grid-reference.json | 145 -
...-expr-alignment-500-500-2.0-grid-reference.json | 145 -
...nal-expressions-256-256-1.0-grid-reference.json | 74 -
...nal-expressions-256-256-2.0-grid-reference.json | 74 -
...ressions-length-512-512-1.0-grid-reference.json | 142 -
...ressions-length-512-512-2.0-grid-reference.json | 138 -
...l-filter-factor-600-400-1.0-grid-reference.json | 108 -
...l-filter-factor-600-400-2.0-grid-reference.json | 108 -
...transform-scale-500-500-1.0-grid-reference.json | 134 -
...transform-scale-500-500-2.0-grid-reference.json | 134 -
...-scale-patterns-500-500-1.0-grid-reference.json | 134 -
...-scale-patterns-500-500-2.0-grid-reference.json | 134 -
...sform-translate-200-200-1.0-grid-reference.json | 59 -
...sform-translate-200-200-2.0-grid-reference.json | 59 -
...nslate-patterns-200-200-1.0-grid-reference.json | 59 -
...nslate-patterns-200-200-2.0-grid-reference.json | 59 -
...te-patterns-svg-200-200-1.0-grid-reference.json | 58 -
...te-patterns-svg-200-200-2.0-grid-reference.json | 58 -
...up-symbolizer-1-512-512-1.0-grid-reference.json | 137 -
...up-symbolizer-1-512-512-2.0-grid-reference.json | 137 -
...up-symbolizer-2-512-512-1.0-grid-reference.json | 138 -
...up-symbolizer-2-512-512-2.0-grid-reference.json | 138 -
...up-symbolizer-3-512-256-1.0-grid-reference.json | 74 -
...up-symbolizer-3-512-256-2.0-grid-reference.json | 74 -
...mbolizer-line-1-512-512-1.0-grid-reference.json | 137 -
...mbolizer-line-1-512-512-2.0-grid-reference.json | 137 -
...mbolizer-line-2-512-512-1.0-grid-reference.json | 138 -
...mbolizer-line-2-512-512-2.0-grid-reference.json | 138 -
...op-on-satellite-450-450-1.0-grid-reference.json | 121 -
...op-on-satellite-450-450-2.0-grid-reference.json | 121 -
.../grids/harfbuzz-800-200-1.0-grid-reference.json | 68 -
.../grids/harfbuzz-800-200-2.0-grid-reference.json | 68 -
.../hb-fontsets-800-200-1.0-grid-reference.json | 62 -
.../hb-fontsets-800-200-2.0-grid-reference.json | 60 -
...-filters-galore-512-512-1.0-grid-reference.json | 290 -
...-filters-galore-512-512-2.0-grid-reference.json | 290 -
...ters-multi-blur-512-512-1.0-grid-reference.json | 289 -
...ters-multi-blur-512-512-2.0-grid-reference.json | 288 -
...ti-blur-inflate-512-512-1.0-grid-reference.json | 289 -
...ti-blur-inflate-512-512-2.0-grid-reference.json | 288 -
.../jalign-auto-200-200-1.0-grid-reference.json | 59 -
.../jalign-auto-200-200-2.0-grid-reference.json | 59 -
.../grids/khmer-800-200-1.0-grid-reference.json | 68 -
.../grids/khmer-800-200-2.0-grid-reference.json | 68 -
.../line-offset-900-250-1.0-grid-reference.json | 79 -
.../line-offset-900-250-2.0-grid-reference.json | 79 -
...ty-multi-render-512-512-1.0-grid-reference.json | 137 -
...ty-multi-render-512-512-2.0-grid-reference.json | 137 -
...ooth-and-offset-500-100-1.0-grid-reference.json | 34 -
...ooth-and-offset-512-512-1.0-grid-reference.json | 137 -
...ooth-and-offset-512-512-2.0-grid-reference.json | 137 -
...tern-symbolizer-900-250-1.0-grid-reference.json | 78 -
...tern-symbolizer-900-250-2.0-grid-reference.json | 79 -
...bolizer-opacity-512-512-1.0-grid-reference.json | 144 -
...bolizer-opacity-512-512-2.0-grid-reference.json | 144 -
...ooth-and-offset-512-512-1.0-grid-reference.json | 137 -
...ooth-and-offset-512-512-2.0-grid-reference.json | 137 -
...zer-expressions-256-256-1.0-grid-reference.json | 73 -
...zer-expressions-256-256-2.0-grid-reference.json | 73 -
...expressions-all-256-256-1.0-grid-reference.json | 73 -
...expressions-all-256-256-2.0-grid-reference.json | 73 -
.../line_break-800-800-1.0-grid-reference.json | 218 -
.../line_break-800-800-2.0-grid-reference.json | 218 -
.../grids/lines-1-200-200-1.0-grid-reference.json | 67 -
.../grids/lines-1-200-200-2.0-grid-reference.json | 66 -
.../grids/lines-1-400-400-1.0-grid-reference.json | 117 -
.../grids/lines-1-400-400-2.0-grid-reference.json | 117 -
.../grids/lines-1-600-600-1.0-grid-reference.json | 167 -
.../grids/lines-1-600-600-2.0-grid-reference.json | 167 -
.../grids/lines-1-800-800-1.0-grid-reference.json | 217 -
.../grids/lines-1-800-800-2.0-grid-reference.json | 217 -
.../grids/lines-2-200-200-1.0-grid-reference.json | 67 -
.../grids/lines-2-200-200-2.0-grid-reference.json | 66 -
.../grids/lines-2-400-400-1.0-grid-reference.json | 117 -
.../grids/lines-2-400-400-2.0-grid-reference.json | 117 -
.../grids/lines-2-600-600-1.0-grid-reference.json | 167 -
.../grids/lines-2-600-600-2.0-grid-reference.json | 167 -
.../grids/lines-2-800-800-1.0-grid-reference.json | 217 -
.../grids/lines-2-800-800-2.0-grid-reference.json | 217 -
.../grids/lines-3-200-200-1.0-grid-reference.json | 67 -
.../grids/lines-3-200-200-2.0-grid-reference.json | 66 -
.../grids/lines-3-400-400-1.0-grid-reference.json | 117 -
.../grids/lines-3-400-400-2.0-grid-reference.json | 117 -
.../grids/lines-3-600-600-1.0-grid-reference.json | 167 -
.../grids/lines-3-600-600-2.0-grid-reference.json | 167 -
.../grids/lines-3-800-800-1.0-grid-reference.json | 217 -
.../grids/lines-3-800-800-2.0-grid-reference.json | 217 -
.../grids/lines-4-200-200-1.0-grid-reference.json | 74 -
.../grids/lines-4-200-200-2.0-grid-reference.json | 74 -
.../grids/lines-4-400-400-1.0-grid-reference.json | 124 -
.../grids/lines-4-400-400-2.0-grid-reference.json | 124 -
.../grids/lines-4-600-600-1.0-grid-reference.json | 174 -
.../grids/lines-4-600-600-2.0-grid-reference.json | 174 -
.../grids/lines-4-800-800-1.0-grid-reference.json | 224 -
.../grids/lines-4-800-800-2.0-grid-reference.json | 224 -
.../grids/lines-5-200-200-1.0-grid-reference.json | 74 -
.../grids/lines-5-200-200-2.0-grid-reference.json | 74 -
.../grids/lines-5-400-400-1.0-grid-reference.json | 124 -
.../grids/lines-5-400-400-2.0-grid-reference.json | 124 -
.../grids/lines-5-600-600-1.0-grid-reference.json | 174 -
.../grids/lines-5-600-600-2.0-grid-reference.json | 174 -
.../grids/lines-5-800-800-1.0-grid-reference.json | 224 -
.../grids/lines-5-800-800-2.0-grid-reference.json | 224 -
.../grids/lines-6-200-200-1.0-grid-reference.json | 74 -
.../grids/lines-6-200-200-2.0-grid-reference.json | 74 -
.../grids/lines-6-400-400-1.0-grid-reference.json | 124 -
.../grids/lines-6-400-400-2.0-grid-reference.json | 124 -
.../grids/lines-6-600-600-1.0-grid-reference.json | 174 -
.../grids/lines-6-600-600-2.0-grid-reference.json | 174 -
.../grids/lines-6-800-800-1.0-grid-reference.json | 224 -
.../grids/lines-6-800-800-2.0-grid-reference.json | 224 -
.../grids/lines-7-200-200-1.0-grid-reference.json | 59 -
.../grids/lines-7-200-200-2.0-grid-reference.json | 59 -
.../grids/lines-7-400-400-1.0-grid-reference.json | 109 -
.../grids/lines-7-400-400-2.0-grid-reference.json | 109 -
.../grids/lines-7-600-600-1.0-grid-reference.json | 159 -
.../grids/lines-7-600-600-2.0-grid-reference.json | 159 -
.../grids/lines-7-800-800-1.0-grid-reference.json | 209 -
.../grids/lines-7-800-800-2.0-grid-reference.json | 209 -
...-multi-layout-1-800-800-1.0-grid-reference.json | 224 -
...-multi-layout-1-800-800-2.0-grid-reference.json | 224 -
...-multi-layout-2-800-800-1.0-grid-reference.json | 209 -
...-multi-layout-2-800-800-2.0-grid-reference.json | 209 -
...i-layout-shield-800-800-1.0-grid-reference.json | 217 -
...i-layout-shield-800-800-2.0-grid-reference.json | 217 -
.../lines-shield-200-200-1.0-grid-reference.json | 65 -
.../lines-shield-200-200-2.0-grid-reference.json | 66 -
.../lines-shield-400-400-1.0-grid-reference.json | 117 -
.../lines-shield-400-400-2.0-grid-reference.json | 116 -
.../lines-shield-600-600-1.0-grid-reference.json | 167 -
.../lines-shield-600-600-2.0-grid-reference.json | 166 -
.../lines-shield-800-800-1.0-grid-reference.json | 217 -
.../lines-shield-800-800-2.0-grid-reference.json | 217 -
.../grids/list-100-100-1.0-grid-reference.json | 43 -
.../grids/list-100-100-2.0-grid-reference.json | 43 -
.../grids/list-150-100-1.0-grid-reference.json | 43 -
.../grids/list-150-100-2.0-grid-reference.json | 43 -
.../grids/list-250-100-1.0-grid-reference.json | 43 -
.../grids/list-250-100-2.0-grid-reference.json | 43 -
.../grids/list-300-100-1.0-grid-reference.json | 43 -
.../grids/list-300-100-2.0-grid-reference.json | 43 -
.../grids/list-400-100-1.0-grid-reference.json | 43 -
.../grids/list-400-100-2.0-grid-reference.json | 43 -
.../grids/list-600-100-1.0-grid-reference.json | 43 -
.../grids/list-600-100-2.0-grid-reference.json | 43 -
.../grids/list-800-100-1.0-grid-reference.json | 43 -
.../grids/list-800-100-2.0-grid-reference.json | 43 -
...age-compositing-512-512-1.0-grid-reference.json | 137 -
...age-compositing-512-512-2.0-grid-reference.json | 137 -
.../marker-collide-512-512-1.0-grid-reference.json | 137 -
.../marker-collide-512-512-2.0-grid-reference.json | 137 -
...terior-position-600-400-1.0-grid-reference.json | 109 -
...terior-position-600-400-2.0-grid-reference.json | 109 -
...er-multi-policy-600-400-1.0-grid-reference.json | 110 -
...er-multi-policy-600-400-2.0-grid-reference.json | 110 -
...ker-on-hex-grid-257-256-1.0-grid-reference.json | 73 -
...ker-on-hex-grid-257-256-2.0-grid-reference.json | 73 -
...ker-on-hex-grid-400-600-1.0-grid-reference.json | 159 -
...ker-on-hex-grid-400-600-2.0-grid-reference.json | 159 -
...ker-on-hex-grid-600-400-1.0-grid-reference.json | 109 -
...ker-on-hex-grid-600-400-2.0-grid-reference.json | 109 -
.../marker-on-line-600-400-1.0-grid-reference.json | 109 -
.../marker-on-line-600-400-2.0-grid-reference.json | 109 -
...and-avoid-edges-512-512-1.0-grid-reference.json | 137 -
...and-avoid-edges-512-512-2.0-grid-reference.json | 137 -
...-line-placement-600-400-1.0-grid-reference.json | 109 -
...-line-placement-600-400-2.0-grid-reference.json | 109 -
...first-placement-600-400-1.0-grid-reference.json | 111 -
...first-placement-600-400-2.0-grid-reference.json | 111 -
...-last-placement-600-400-1.0-grid-reference.json | 111 -
...-last-placement-600-400-2.0-grid-reference.json | 111 -
...pacing-eq-width-600-400-1.0-grid-reference.json | 109 -
...pacing-eq-width-600-400-2.0-grid-reference.json | 109 -
...q-width-overlap-600-400-1.0-grid-reference.json | 109 -
...q-width-overlap-600-400-2.0-grid-reference.json | 109 -
...path-expression-500-100-1.0-grid-reference.json | 34 -
...path-expression-500-100-2.0-grid-reference.json | 34 -
...ecenter-collide-256-128-1.0-grid-reference.json | 42 -
...ecenter-collide-256-128-2.0-grid-reference.json | 42 -
...empty-g-element-500-100-1.0-grid-reference.json | 34 -
...empty-g-element-500-100-2.0-grid-reference.json | 34 -
...ker-svg-opacity-500-100-1.0-grid-reference.json | 37 -
...ker-svg-opacity-500-100-2.0-grid-reference.json | 37 -
...er-svg-opacity2-500-100-1.0-grid-reference.json | 34 -
...er-svg-opacity2-500-100-2.0-grid-reference.json | 34 -
...expressions-all-256-256-1.0-grid-reference.json | 73 -
...expressions-all-256-256-2.0-grid-reference.json | 73 -
...marker-vs-point-512-512-1.0-grid-reference.json | 139 -
...marker-vs-point-512-512-2.0-grid-reference.json | 139 -
...e-multi-polygon-512-512-1.0-grid-reference.json | 332 -
...e-multi-polygon-512-512-2.0-grid-reference.json | 295 -
...ackground-image-257-256-1.0-grid-reference.json | 73 -
...ackground-image-257-256-2.0-grid-reference.json | 72 -
...ackground-image-400-600-1.0-grid-reference.json | 159 -
...ackground-image-400-600-2.0-grid-reference.json | 159 -
...ackground-image-600-400-1.0-grid-reference.json | 109 -
...ackground-image-600-400-2.0-grid-reference.json | 109 -
...-hsla-transform-257-256-1.0-grid-reference.json | 73 -
...-hsla-transform-257-256-2.0-grid-reference.json | 72 -
...-hsla-transform-400-600-1.0-grid-reference.json | 159 -
...-hsla-transform-400-600-2.0-grid-reference.json | 159 -
...-hsla-transform-600-400-1.0-grid-reference.json | 109 -
...-hsla-transform-600-400-2.0-grid-reference.json | 109 -
...-linear-comp-op-500-100-1.0-grid-reference.json | 34 -
...-linear-comp-op-500-100-2.0-grid-reference.json | 33 -
...ement_on_points-500-100-1.0-grid-reference.json | 40 -
...ement_on_points-500-100-2.0-grid-reference.json | 38 -
.../orientation-800-200-1.0-grid-reference.json | 68 -
.../orientation-800-200-2.0-grid-reference.json | 68 -
...zer-expressions-256-256-1.0-grid-reference.json | 73 -
...zer-expressions-256-256-2.0-grid-reference.json | 73 -
...expressions-all-256-256-1.0-grid-reference.json | 73 -
...expressions-all-256-256-2.0-grid-reference.json | 73 -
...-placement-expr-500-500-1.0-grid-reference.json | 157 -
...-placement-expr-500-500-2.0-grid-reference.json | 157 -
...zer-expressions-256-256-1.0-grid-reference.json | 73 -
...zer-expressions-256-256-2.0-grid-reference.json | 73 -
...expressions-all-256-256-1.0-grid-reference.json | 73 -
...expressions-all-256-256-2.0-grid-reference.json | 73 -
...n-winding-order-300-300-1.0-grid-reference.json | 84 -
...n-winding-order-300-300-2.0-grid-reference.json | 84 -
.../postgis-inline-512-512-1.0-grid-reference.json | 137 -
.../postgis-inline-512-512-2.0-grid-reference.json | 137 -
...color-to-alpha1-512-512-1.0-grid-reference.json | 136 -
...color-to-alpha1-512-512-2.0-grid-reference.json | 136 -
...color-to-alpha2-512-512-1.0-grid-reference.json | 136 -
...color-to-alpha2-512-512-2.0-grid-reference.json | 136 -
...color-to-alpha3-512-512-1.0-grid-reference.json | 136 -
...color-to-alpha3-512-512-2.0-grid-reference.json | 136 -
...color-to-alpha4-512-512-1.0-grid-reference.json | 136 -
...color-to-alpha4-512-512-2.0-grid-reference.json | 136 -
...color-to-alpha5-512-512-1.0-grid-reference.json | 136 -
...color-to-alpha5-512-512-2.0-grid-reference.json | 136 -
...aster_colorizer-512-512-1.0-grid-reference.json | 136 -
...aster_colorizer-512-512-2.0-grid-reference.json | 136 -
...ster_symbolizer-512-512-1.0-grid-reference.json | 136 -
...ster_symbolizer-512-512-2.0-grid-reference.json | 136 -
...repeat-labels-1-750-250-1.0-grid-reference.json | 79 -
...repeat-labels-1-750-250-2.0-grid-reference.json | 79 -
...repeat-labels-2-750-250-1.0-grid-reference.json | 79 -
...repeat-labels-2-750-250-2.0-grid-reference.json | 79 -
...repeat-labels-3-750-250-1.0-grid-reference.json | 79 -
...repeat-labels-3-750-250-2.0-grid-reference.json | 79 -
...repeat-labels-4-750-250-1.0-grid-reference.json | 79 -
...repeat-labels-4-750-250-2.0-grid-reference.json | 79 -
...ouped-rendering-500-100-1.0-grid-reference.json | 344 -
...ouped-rendering-600-600-1.0-grid-reference.json | 888 --
...ouped-rendering-600-600-2.0-grid-reference.json | 847 --
...ouped-rendering-600-600-1.0-grid-reference.json | 892 --
...ouped-rendering-600-600-2.0-grid-reference.json | 856 --
.../rtl-point-200-200-1.0-grid-reference.json | 59 -
.../rtl-point-200-200-2.0-grid-reference.json | 59 -
...and-avoid-edges-512-512-1.0-grid-reference.json | 137 -
...and-avoid-edges-512-512-2.0-grid-reference.json | 137 -
...pacing-eq-width-600-400-1.0-grid-reference.json | 109 -
...pacing-eq-width-600-400-2.0-grid-reference.json | 109 -
...ield-on-polygon-500-100-1.0-grid-reference.json | 39 -
...ield-on-polygon-600-400-1.0-grid-reference.json | 115 -
...ield-on-polygon-600-400-2.0-grid-reference.json | 115 -
...eldsymbolizer-1-490-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-1-490-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-1-495-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-1-495-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-1-497-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-1-497-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-1-498-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-1-498-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-1-499-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-1-499-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-1-500-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-1-500-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-1-501-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-1-501-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-1-502-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-1-502-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-1-505-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-1-505-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-1-510-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-1-510-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-2-490-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-2-490-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-2-495-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-2-495-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-2-497-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-2-497-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-2-498-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-2-498-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-2-499-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-2-499-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-2-500-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-2-500-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-2-501-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-2-501-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-2-502-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-2-502-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-2-505-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-2-505-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-2-510-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-2-510-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-3-490-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-3-490-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-3-495-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-3-495-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-3-497-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-3-497-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-3-498-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-3-498-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-3-499-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-3-499-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-3-500-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-3-500-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-3-501-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-3-501-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-3-502-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-3-502-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-3-505-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-3-505-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-3-510-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-3-510-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-4-490-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-4-490-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-4-495-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-4-495-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-4-497-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-4-497-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-4-498-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-4-498-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-4-499-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-4-499-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-4-500-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-4-500-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-4-501-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-4-501-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-4-502-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-4-502-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-4-505-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-4-505-100-2.0-grid-reference.json | 43 -
...eldsymbolizer-4-510-100-1.0-grid-reference.json | 43 -
...eldsymbolizer-4-510-100-2.0-grid-reference.json | 43 -
.../grids/simple-100-100-1.0-grid-reference.json | 40 -
.../grids/simple-100-100-2.0-grid-reference.json | 37 -
.../grids/simple-150-100-1.0-grid-reference.json | 42 -
.../grids/simple-150-100-2.0-grid-reference.json | 38 -
.../grids/simple-250-100-1.0-grid-reference.json | 43 -
.../grids/simple-250-100-2.0-grid-reference.json | 42 -
.../grids/simple-300-100-1.0-grid-reference.json | 43 -
.../grids/simple-300-100-2.0-grid-reference.json | 42 -
.../grids/simple-400-100-1.0-grid-reference.json | 43 -
.../grids/simple-400-100-2.0-grid-reference.json | 42 -
.../grids/simple-600-100-1.0-grid-reference.json | 43 -
.../grids/simple-600-100-2.0-grid-reference.json | 43 -
.../grids/simple-800-100-1.0-grid-reference.json | 43 -
.../grids/simple-800-100-2.0-grid-reference.json | 43 -
.../grids/simple-E-500-100-1.0-grid-reference.json | 34 -
.../grids/simple-E-500-100-2.0-grid-reference.json | 34 -
.../grids/simple-N-500-100-1.0-grid-reference.json | 34 -
.../grids/simple-N-500-100-2.0-grid-reference.json | 34 -
.../simple-NE-500-100-1.0-grid-reference.json | 34 -
.../simple-NE-500-100-2.0-grid-reference.json | 34 -
.../simple-NW-500-100-1.0-grid-reference.json | 34 -
.../simple-NW-500-100-2.0-grid-reference.json | 34 -
.../grids/simple-S-500-100-1.0-grid-reference.json | 34 -
.../grids/simple-S-500-100-2.0-grid-reference.json | 34 -
.../simple-SE-500-100-1.0-grid-reference.json | 34 -
.../simple-SE-500-100-2.0-grid-reference.json | 34 -
.../simple-SW-500-100-1.0-grid-reference.json | 34 -
.../simple-SW-500-100-2.0-grid-reference.json | 34 -
.../grids/simple-W-500-100-1.0-grid-reference.json | 34 -
.../grids/simple-W-500-100-2.0-grid-reference.json | 34 -
.../simple-shield-500-100-1.0-grid-reference.json | 43 -
.../simple-shield-500-100-2.0-grid-reference.json | 43 -
.../simple-shield-600-400-1.0-grid-reference.json | 118 -
.../simple-shield-600-400-2.0-grid-reference.json | 118 -
...iting-tiled-0,0-512-512-1.0-grid-reference.json | 190 -
...iting-tiled-0,0-512-512-2.0-grid-reference.json | 190 -
...iting-tiled-0,1-512-512-1.0-grid-reference.json | 152 -
...iting-tiled-0,1-512-512-2.0-grid-reference.json | 152 -
...iting-tiled-1,0-512-512-1.0-grid-reference.json | 248 -
...iting-tiled-1,0-512-512-2.0-grid-reference.json | 248 -
...iting-tiled-1,1-512-512-1.0-grid-reference.json | 170 -
...iting-tiled-1,1-512-512-2.0-grid-reference.json | 170 -
...ow-overlap-expr-500-500-1.0-grid-reference.json | 145 -
...ow-overlap-expr-500-500-2.0-grid-reference.json | 145 -
.../text-bengali-800-100-1.0-grid-reference.json | 36 -
.../text-bengali-800-100-2.0-grid-reference.json | 36 -
.../text-bug1532-600-165-1.0-grid-reference.json | 54 -
.../text-bug1532-600-165-2.0-grid-reference.json | 54 -
.../text-bug1533-600-600-1.0-grid-reference.json | 162 -
.../text-bug1533-600-600-2.0-grid-reference.json | 162 -
.../text-bug1820+0-600-300-1.0-grid-reference.json | 93 -
.../text-bug1820+0-600-300-2.0-grid-reference.json | 93 -
.../text-bug1820+1-600-300-1.0-grid-reference.json | 93 -
.../text-bug1820+1-600-300-2.0-grid-reference.json | 93 -
.../text-bug1820-1-600-300-1.0-grid-reference.json | 93 -
.../text-bug1820-1-600-300-2.0-grid-reference.json | 93 -
.../text-bug2037-800-300-1.0-grid-reference.json | 87 -
.../text-bug2037-800-300-2.0-grid-reference.json | 86 -
...t-charplacement-512-512-1.0-grid-reference.json | 148 -
...t-charplacement-512-512-2.0-grid-reference.json | 148 -
...xt-data-binding-500-500-1.0-grid-reference.json | 134 -
...xt-data-binding-500-500-2.0-grid-reference.json | 133 -
...xt-displacement-512-512-1.0-grid-reference.json | 162 -
...xt-displacement-512-512-2.0-grid-reference.json | 160 -
...ionformat-color-800-100-1.0-grid-reference.json | 43 -
...ionformat-color-800-100-2.0-grid-reference.json | 43 -
...t-font-features-500-500-1.0-grid-reference.json | 140 -
...t-font-features-500-500-2.0-grid-reference.json | 140 -
.../text-halign-800-800-1.0-grid-reference.json | 224 -
.../text-halign-800-800-2.0-grid-reference.json | 224 -
...t-halign-adjust-800-800-1.0-grid-reference.json | 224 -
...t-halign-adjust-800-800-2.0-grid-reference.json | 224 -
...djust-multiline-800-800-1.0-grid-reference.json | 224 -
...djust-multiline-800-800-2.0-grid-reference.json | 224 -
...xt-halo-opacity-512-512-1.0-grid-reference.json | 140 -
...xt-halo-opacity-512-512-2.0-grid-reference.json | 140 -
...halo-rasterizer-600-400-1.0-grid-reference.json | 124 -
...halo-rasterizer-600-400-2.0-grid-reference.json | 124 -
...-halo-transform-600-400-1.0-grid-reference.json | 124 -
...-halo-transform-600-400-2.0-grid-reference.json | 124 -
.../text-line-wrap-512-512-1.0-grid-reference.json | 138 -
.../text-line-wrap-512-512-2.0-grid-reference.json | 138 -
.../text-malayalam-800-100-1.0-grid-reference.json | 34 -
.../text-malayalam-800-100-2.0-grid-reference.json | 34 -
...-multi-layout-1-512-512-1.0-grid-reference.json | 142 -
...-multi-layout-1-512-512-2.0-grid-reference.json | 142 -
...-multi-layout-2-512-512-1.0-grid-reference.json | 137 -
...-multi-layout-2-512-512-2.0-grid-reference.json | 137 -
.../text-overlap-512-512-1.0-grid-reference.json | 156 -
.../text-overlap-512-512-2.0-grid-reference.json | 156 -
.../text-spacing-512-512-1.0-grid-reference.json | 153 -
.../text-spacing-512-512-2.0-grid-reference.json | 153 -
.../text-ttc-font-600-400-1.0-grid-reference.json | 124 -
.../text-ttc-font-600-400-2.0-grid-reference.json | 124 -
...ext-typographic-512-512-1.0-grid-reference.json | 138 -
...ext-typographic-512-512-2.0-grid-reference.json | 138 -
...tical-alignment-800-800-1.0-grid-reference.json | 224 -
...tical-alignment-800-800-2.0-grid-reference.json | 224 -
...ssoc-alpha-gdal-600-400-1.0-grid-reference.json | 108 -
...ssoc-alpha-gdal-600-400-2.0-grid-reference.json | 108 -
...tiff-alpha-gdal-600-400-1.0-grid-reference.json | 108 -
...tiff-alpha-gdal-600-400-2.0-grid-reference.json | 108 -
...a-gradient-gdal-600-400-1.0-grid-reference.json | 108 -
...a-gradient-gdal-600-400-2.0-grid-reference.json | 108 -
...alignment-gdal1-255-257-1.0-grid-reference.json | 73 -
...alignment-gdal1-255-257-2.0-grid-reference.json | 73 -
...alignment-gdal1-256-256-1.0-grid-reference.json | 72 -
...alignment-gdal1-256-256-2.0-grid-reference.json | 72 -
...alignment-gdal2-255-257-1.0-grid-reference.json | 73 -
...alignment-gdal2-255-257-2.0-grid-reference.json | 73 -
...alignment-gdal2-256-256-1.0-grid-reference.json | 72 -
...alignment-gdal2-256-256-2.0-grid-reference.json | 72 -
...odata-edge-gdal-600-400-1.0-grid-reference.json | 108 -
...odata-edge-gdal-600-400-2.0-grid-reference.json | 108 -
...odata-edge-gdal-969-793-1.0-grid-reference.json | 207 -
...odata-edge-gdal-969-793-2.0-grid-reference.json | 207 -
...odata-edge-rgba-500-100-1.0-grid-reference.json | 33 -
...odata-edge-rgba-512-512-1.0-grid-reference.json | 136 -
...odata-edge-rgba-512-512-2.0-grid-reference.json | 136 -
...tiff-nodata-rgb-512-512-1.0-grid-reference.json | 136 -
...tiff-nodata-rgb-512-512-2.0-grid-reference.json | 136 -
...iff-nodata-rgba-512-512-1.0-grid-reference.json | 136 -
...iff-nodata-rgba-512-512-2.0-grid-reference.json | 136 -
...odata-tolerance-512-512-1.0-grid-reference.json | 136 -
...odata-tolerance-512-512-2.0-grid-reference.json | 136 -
...paque-edge-gdal-256-256-1.0-grid-reference.json | 72 -
...paque-edge-gdal-256-256-2.0-grid-reference.json | 72 -
...paque-edge-gdal-969-793-1.0-grid-reference.json | 207 -
...paque-edge-gdal-969-793-2.0-grid-reference.json | 207 -
...aque-edge-gdal2-600-400-1.0-grid-reference.json | 108 -
...aque-edge-gdal2-600-400-2.0-grid-reference.json | 108 -
...aque-edge-gdal2-969-793-1.0-grid-reference.json | 207 -
...aque-edge-gdal2-969-793-2.0-grid-reference.json | 207 -
...ue-edge-raster2-600-400-1.0-grid-reference.json | 108 -
...ue-edge-raster2-600-400-2.0-grid-reference.json | 108 -
...ue-edge-raster2-969-793-1.0-grid-reference.json | 207 -
...ue-edge-raster2-969-793-2.0-grid-reference.json | 207 -
...-reprojection-1-250-250-1.0-grid-reference.json | 71 -
...-reprojection-1-250-250-2.0-grid-reference.json | 71 -
...-reprojection-2-250-250-1.0-grid-reference.json | 71 -
...-reprojection-2-250-250-2.0-grid-reference.json | 71 -
...tiff-resampling-600-400-1.0-grid-reference.json | 108 -
...tiff-resampling-600-400-2.0-grid-reference.json | 108 -
...tiff_colortable-256-256-1.0-grid-reference.json | 72 -
...tiff_colortable-256-256-2.0-grid-reference.json | 72 -
...e_custom_nodata-256-256-1.0-grid-reference.json | 72 -
...e_custom_nodata-256-256-2.0-grid-reference.json | 72 -
.../vrt_colortable-256-256-1.0-grid-reference.json | 72 -
.../vrt_colortable-256-256-2.0-grid-reference.json | 72 -
.../whole-centroid-600-400-1.0-grid-reference.json | 109 -
.../whole-centroid-600-400-2.0-grid-reference.json | 109 -
tests/visual_tests/html_report_template.html | 33 -
...ymbolizer-opacity-512-512-1.0-agg-reference.png | Bin 15029 -> 0 bytes
...bolizer-opacity-512-512-1.0-cairo-reference.png | Bin 22372 -> 0 bytes
...ymbolizer-opacity-512-512-2.0-agg-reference.png | Bin 15626 -> 0 bytes
...bolizer-opacity-512-512-2.0-cairo-reference.png | Bin 23378 -> 0 bytes
.../charspacing-200-400-1.0-agg-reference.png | Bin 7323 -> 0 bytes
.../charspacing-200-400-1.0-cairo-reference.png | Bin 3719 -> 0 bytes
.../charspacing-200-400-2.0-agg-reference.png | Bin 13340 -> 0 bytes
.../charspacing-200-400-2.0-cairo-reference.png | Bin 6275 -> 0 bytes
...charspacing-lines-300-300-1.0-agg-reference.png | Bin 7597 -> 0 bytes
...arspacing-lines-300-300-1.0-cairo-reference.png | Bin 4037 -> 0 bytes
...charspacing-lines-300-300-2.0-agg-reference.png | Bin 12746 -> 0 bytes
...arspacing-lines-300-300-2.0-cairo-reference.png | Bin 6389 -> 0 bytes
.../images/collision-600-400-1.0-agg-reference.png | Bin 30191 -> 0 bytes
.../images/collision-600-400-1.0-agg.png | Bin 30565 -> 0 bytes
.../collision-600-400-1.0-cairo-reference.png | Bin 26875 -> 0 bytes
.../images/collision-600-400-1.0-cairo.png | Bin 28021 -> 0 bytes
.../images/collision-600-400-1.0-grid.json | 109 -
.../images/collision-600-400-2.0-agg-reference.png | Bin 31821 -> 0 bytes
.../images/collision-600-400-2.0-agg.png | Bin 31145 -> 0 bytes
.../collision-600-400-2.0-cairo-reference.png | Bin 29563 -> 0 bytes
.../images/collision-600-400-2.0-cairo.png | Bin 27260 -> 0 bytes
.../colorize-alpha1-512-512-1.0-agg-reference.png | Bin 21051 -> 0 bytes
...colorize-alpha1-512-512-1.0-cairo-reference.png | Bin 21324 -> 0 bytes
.../colorize-alpha1-512-512-2.0-agg-reference.png | Bin 26890 -> 0 bytes
...colorize-alpha1-512-512-2.0-cairo-reference.png | Bin 25904 -> 0 bytes
.../colorize-alpha2-512-512-1.0-agg-reference.png | Bin 21053 -> 0 bytes
...colorize-alpha2-512-512-1.0-cairo-reference.png | Bin 21324 -> 0 bytes
.../colorize-alpha2-512-512-2.0-agg-reference.png | Bin 25521 -> 0 bytes
...colorize-alpha2-512-512-2.0-cairo-reference.png | Bin 25904 -> 0 bytes
.../colorize-alpha3-512-512-1.0-agg-reference.png | Bin 21093 -> 0 bytes
...colorize-alpha3-512-512-1.0-cairo-reference.png | Bin 21324 -> 0 bytes
.../colorize-alpha3-512-512-2.0-agg-reference.png | Bin 25900 -> 0 bytes
...colorize-alpha3-512-512-2.0-cairo-reference.png | Bin 25904 -> 0 bytes
...-over-compositing-512-512-1.0-agg-reference.png | Bin 333 -> 0 bytes
...ver-compositing-512-512-1.0-cairo-reference.png | Bin 126 -> 0 bytes
...-over-compositing-512-512-2.0-agg-reference.png | Bin 436 -> 0 bytes
...ver-compositing-512-512-2.0-cairo-reference.png | Bin 126 -> 0 bytes
.../expressionformat-500-100-1.0-agg-reference.png | Bin 1480 -> 0 bytes
...xpressionformat-500-100-1.0-cairo-reference.png | Bin 1357 -> 0 bytes
.../expressionformat-500-100-2.0-agg-reference.png | Bin 2175 -> 0 bytes
...xpressionformat-500-100-2.0-cairo-reference.png | Bin 2026 -> 0 bytes
.../formatting-1-500-100-1.0-agg-reference.png | Bin 3744 -> 0 bytes
.../formatting-1-500-100-1.0-cairo-reference.png | Bin 2062 -> 0 bytes
.../formatting-1-500-100-2.0-agg-reference.png | Bin 3933 -> 0 bytes
.../formatting-1-500-100-2.0-cairo-reference.png | Bin 2947 -> 0 bytes
.../formatting-2-500-100-1.0-agg-reference.png | Bin 3744 -> 0 bytes
.../formatting-2-500-100-1.0-cairo-reference.png | Bin 2062 -> 0 bytes
.../formatting-2-500-100-2.0-agg-reference.png | Bin 3933 -> 0 bytes
.../formatting-2-500-100-2.0-cairo-reference.png | Bin 2947 -> 0 bytes
.../formatting-3-500-100-1.0-agg-reference.png | Bin 2489 -> 0 bytes
.../formatting-3-500-100-1.0-cairo-reference.png | Bin 1425 -> 0 bytes
.../formatting-3-500-100-2.0-agg-reference.png | Bin 2906 -> 0 bytes
.../formatting-3-500-100-2.0-cairo-reference.png | Bin 2196 -> 0 bytes
.../formatting-4-500-100-1.0-agg-reference.png | Bin 227 -> 0 bytes
.../formatting-4-500-100-1.0-cairo-reference.png | Bin 227 -> 0 bytes
.../formatting-4-500-100-2.0-agg-reference.png | Bin 235 -> 0 bytes
.../formatting-4-500-100-2.0-cairo-reference.png | Bin 279 -> 0 bytes
.../formatting-5-500-100-1.0-agg-reference.png | Bin 3744 -> 0 bytes
.../formatting-5-500-100-1.0-cairo-reference.png | Bin 2062 -> 0 bytes
.../formatting-5-500-100-2.0-agg-reference.png | Bin 3933 -> 0 bytes
.../formatting-5-500-100-2.0-cairo-reference.png | Bin 2947 -> 0 bytes
.../formatting-6-500-100-1.0-agg-reference.png | Bin 3744 -> 0 bytes
.../formatting-6-500-100-1.0-cairo-reference.png | Bin 2062 -> 0 bytes
.../formatting-6-500-100-2.0-agg-reference.png | Bin 3933 -> 0 bytes
.../formatting-6-500-100-2.0-cairo-reference.png | Bin 2947 -> 0 bytes
.../formatting-7-500-100-1.0-agg-reference.png | Bin 3744 -> 0 bytes
.../formatting-7-500-100-1.0-cairo-reference.png | Bin 2062 -> 0 bytes
.../formatting-7-500-100-2.0-agg-reference.png | Bin 3933 -> 0 bytes
.../formatting-7-500-100-2.0-cairo-reference.png | Bin 2947 -> 0 bytes
.../formatting-8-500-100-1.0-agg-reference.png | Bin 3744 -> 0 bytes
.../formatting-8-500-100-1.0-cairo-reference.png | Bin 2062 -> 0 bytes
.../formatting-8-500-100-2.0-agg-reference.png | Bin 3933 -> 0 bytes
.../formatting-8-500-100-2.0-cairo-reference.png | Bin 2947 -> 0 bytes
...ng-expr-alignment-500-500-1.0-agg-reference.png | Bin 3066 -> 0 bytes
...-expr-alignment-500-500-1.0-cairo-reference.png | Bin 1936 -> 0 bytes
...ng-expr-alignment-500-500-2.0-agg-reference.png | Bin 4630 -> 0 bytes
...-expr-alignment-500-500-2.0-cairo-reference.png | Bin 2941 -> 0 bytes
...ional-expressions-256-256-1.0-agg-reference.png | Bin 4615 -> 0 bytes
...nal-expressions-256-256-1.0-cairo-reference.png | Bin 4826 -> 0 bytes
...ional-expressions-256-256-2.0-agg-reference.png | Bin 6843 -> 0 bytes
...nal-expressions-256-256-2.0-cairo-reference.png | Bin 6877 -> 0 bytes
...xpressions-length-512-512-1.0-agg-reference.png | Bin 8357 -> 0 bytes
...ressions-length-512-512-1.0-cairo-reference.png | Bin 8360 -> 0 bytes
...xpressions-length-512-512-2.0-agg-reference.png | Bin 10628 -> 0 bytes
...ressions-length-512-512-2.0-cairo-reference.png | Bin 10308 -> 0 bytes
...dal-filter-factor-600-400-1.0-agg-reference.png | Bin 89364 -> 0 bytes
...l-filter-factor-600-400-1.0-cairo-reference.png | Bin 89364 -> 0 bytes
...dal-filter-factor-600-400-2.0-agg-reference.png | Bin 89364 -> 0 bytes
...l-filter-factor-600-400-2.0-cairo-reference.png | Bin 89364 -> 0 bytes
...y-transform-scale-500-500-1.0-agg-reference.png | Bin 10895 -> 0 bytes
...transform-scale-500-500-1.0-cairo-reference.png | Bin 9505 -> 0 bytes
...y-transform-scale-500-500-2.0-agg-reference.png | Bin 12220 -> 0 bytes
...transform-scale-500-500-2.0-cairo-reference.png | Bin 11580 -> 0 bytes
...rm-scale-patterns-500-500-1.0-agg-reference.png | Bin 41395 -> 0 bytes
...-scale-patterns-500-500-1.0-cairo-reference.png | Bin 42524 -> 0 bytes
...rm-scale-patterns-500-500-2.0-agg-reference.png | Bin 49411 -> 0 bytes
...-scale-patterns-500-500-2.0-cairo-reference.png | Bin 50471 -> 0 bytes
...ansform-translate-200-200-1.0-agg-reference.png | Bin 987 -> 0 bytes
...sform-translate-200-200-1.0-cairo-reference.png | Bin 924 -> 0 bytes
...ansform-translate-200-200-2.0-agg-reference.png | Bin 1108 -> 0 bytes
...sform-translate-200-200-2.0-cairo-reference.png | Bin 1183 -> 0 bytes
...ranslate-patterns-200-200-1.0-agg-reference.png | Bin 8582 -> 0 bytes
...nslate-patterns-200-200-1.0-cairo-reference.png | Bin 8689 -> 0 bytes
...ranslate-patterns-200-200-2.0-agg-reference.png | Bin 8779 -> 0 bytes
...nslate-patterns-200-200-2.0-cairo-reference.png | Bin 8862 -> 0 bytes
...late-patterns-svg-200-200-1.0-agg-reference.png | Bin 7986 -> 0 bytes
...te-patterns-svg-200-200-1.0-cairo-reference.png | Bin 7938 -> 0 bytes
...late-patterns-svg-200-200-2.0-agg-reference.png | Bin 10689 -> 0 bytes
...te-patterns-svg-200-200-2.0-cairo-reference.png | Bin 10955 -> 0 bytes
...roup-symbolizer-1-512-512-1.0-agg-reference.png | Bin 2091 -> 0 bytes
...up-symbolizer-1-512-512-1.0-cairo-reference.png | Bin 2094 -> 0 bytes
...roup-symbolizer-1-512-512-2.0-agg-reference.png | Bin 2908 -> 0 bytes
...up-symbolizer-1-512-512-2.0-cairo-reference.png | Bin 3018 -> 0 bytes
...roup-symbolizer-2-512-512-1.0-agg-reference.png | Bin 3824 -> 0 bytes
...up-symbolizer-2-512-512-1.0-cairo-reference.png | Bin 3049 -> 0 bytes
...roup-symbolizer-2-512-512-2.0-agg-reference.png | Bin 6110 -> 0 bytes
...up-symbolizer-2-512-512-2.0-cairo-reference.png | Bin 4919 -> 0 bytes
...roup-symbolizer-3-512-256-1.0-agg-reference.png | Bin 1519 -> 0 bytes
...up-symbolizer-3-512-256-1.0-cairo-reference.png | Bin 1525 -> 0 bytes
...roup-symbolizer-3-512-256-2.0-agg-reference.png | Bin 2241 -> 0 bytes
...up-symbolizer-3-512-256-2.0-cairo-reference.png | Bin 2448 -> 0 bytes
...symbolizer-line-1-512-512-1.0-agg-reference.png | Bin 13261 -> 0 bytes
...mbolizer-line-1-512-512-1.0-cairo-reference.png | Bin 7842 -> 0 bytes
...symbolizer-line-1-512-512-2.0-agg-reference.png | Bin 14390 -> 0 bytes
...mbolizer-line-1-512-512-2.0-cairo-reference.png | Bin 8870 -> 0 bytes
...symbolizer-line-2-512-512-1.0-agg-reference.png | Bin 3540 -> 0 bytes
...mbolizer-line-2-512-512-1.0-cairo-reference.png | Bin 2861 -> 0 bytes
...symbolizer-line-2-512-512-2.0-agg-reference.png | Bin 5071 -> 0 bytes
...mbolizer-line-2-512-512-2.0-cairo-reference.png | Bin 4283 -> 0 bytes
...p-op-on-satellite-450-450-1.0-agg-reference.png | Bin 103650 -> 0 bytes
...op-on-satellite-450-450-1.0-cairo-reference.png | Bin 104050 -> 0 bytes
...p-op-on-satellite-450-450-2.0-agg-reference.png | Bin 98030 -> 0 bytes
...op-on-satellite-450-450-2.0-cairo-reference.png | Bin 103527 -> 0 bytes
.../images/harfbuzz-800-200-1.0-agg-reference.png | Bin 4534 -> 0 bytes
.../harfbuzz-800-200-1.0-cairo-reference.png | Bin 4260 -> 0 bytes
.../images/harfbuzz-800-200-2.0-agg-reference.png | Bin 6437 -> 0 bytes
.../harfbuzz-800-200-2.0-cairo-reference.png | Bin 6115 -> 0 bytes
.../hb-fontsets-800-200-1.0-agg-reference.png | Bin 5372 -> 0 bytes
.../hb-fontsets-800-200-1.0-cairo-reference.png | Bin 4162 -> 0 bytes
.../hb-fontsets-800-200-2.0-agg-reference.png | Bin 6726 -> 0 bytes
.../hb-fontsets-800-200-2.0-cairo-reference.png | Bin 5482 -> 0 bytes
...ge-filters-galore-512-512-1.0-agg-reference.png | Bin 19030 -> 0 bytes
...-filters-galore-512-512-1.0-cairo-reference.png | Bin 11212 -> 0 bytes
...ge-filters-galore-512-512-2.0-agg-reference.png | Bin 19030 -> 0 bytes
...-filters-galore-512-512-2.0-cairo-reference.png | Bin 11212 -> 0 bytes
...ilters-multi-blur-512-512-1.0-agg-reference.png | Bin 47131 -> 0 bytes
...ters-multi-blur-512-512-1.0-cairo-reference.png | Bin 21440 -> 0 bytes
...ilters-multi-blur-512-512-2.0-agg-reference.png | Bin 48950 -> 0 bytes
...ters-multi-blur-512-512-2.0-cairo-reference.png | Bin 20115 -> 0 bytes
...ulti-blur-inflate-512-512-1.0-agg-reference.png | Bin 49664 -> 0 bytes
...ti-blur-inflate-512-512-1.0-cairo-reference.png | Bin 21440 -> 0 bytes
...ulti-blur-inflate-512-512-2.0-agg-reference.png | Bin 52677 -> 0 bytes
...ti-blur-inflate-512-512-2.0-cairo-reference.png | Bin 20115 -> 0 bytes
.../jalign-auto-200-200-1.0-agg-reference.png | Bin 3001 -> 0 bytes
.../jalign-auto-200-200-1.0-cairo-reference.png | Bin 991 -> 0 bytes
.../jalign-auto-200-200-2.0-agg-reference.png | Bin 4200 -> 0 bytes
.../jalign-auto-200-200-2.0-cairo-reference.png | Bin 1507 -> 0 bytes
.../images/khmer-800-200-1.0-agg-reference.png | Bin 4945 -> 0 bytes
.../images/khmer-800-200-1.0-cairo-reference.png | Bin 3564 -> 0 bytes
.../images/khmer-800-200-2.0-agg-reference.png | Bin 8531 -> 0 bytes
.../images/khmer-800-200-2.0-cairo-reference.png | Bin 6018 -> 0 bytes
.../line-offset-900-250-1.0-agg-reference.png | Bin 15386 -> 0 bytes
.../line-offset-900-250-1.0-cairo-reference.png | Bin 14303 -> 0 bytes
.../line-offset-900-250-2.0-agg-reference.png | Bin 14361 -> 0 bytes
.../line-offset-900-250-2.0-cairo-reference.png | Bin 12328 -> 0 bytes
...city-multi-render-512-512-1.0-agg-reference.png | Bin 583 -> 0 bytes
...ty-multi-render-512-512-1.0-cairo-reference.png | Bin 582 -> 0 bytes
...city-multi-render-512-512-2.0-agg-reference.png | Bin 622 -> 0 bytes
...ty-multi-render-512-512-2.0-cairo-reference.png | Bin 625 -> 0 bytes
...smooth-and-offset-500-100-1.0-agg-reference.png | Bin 8515 -> 0 bytes
...ooth-and-offset-500-100-1.0-cairo-reference.png | Bin 8594 -> 0 bytes
...smooth-and-offset-500-100-2.0-agg-reference.png | Bin 8201 -> 0 bytes
...ooth-and-offset-500-100-2.0-cairo-reference.png | Bin 9097 -> 0 bytes
...smooth-and-offset-512-512-1.0-agg-reference.png | Bin 32496 -> 0 bytes
...ooth-and-offset-512-512-1.0-cairo-reference.png | Bin 32255 -> 0 bytes
...smooth-and-offset-512-512-2.0-agg-reference.png | Bin 38618 -> 0 bytes
...ooth-and-offset-512-512-2.0-cairo-reference.png | Bin 38676 -> 0 bytes
...attern-symbolizer-900-250-1.0-agg-reference.png | Bin 15750 -> 0 bytes
...tern-symbolizer-900-250-1.0-cairo-reference.png | Bin 17508 -> 0 bytes
...attern-symbolizer-900-250-2.0-agg-reference.png | Bin 17322 -> 0 bytes
...tern-symbolizer-900-250-2.0-cairo-reference.png | Bin 19425 -> 0 bytes
...ymbolizer-opacity-512-512-1.0-agg-reference.png | Bin 10664 -> 0 bytes
...bolizer-opacity-512-512-1.0-cairo-reference.png | Bin 15983 -> 0 bytes
...ymbolizer-opacity-512-512-2.0-agg-reference.png | Bin 10664 -> 0 bytes
...bolizer-opacity-512-512-2.0-cairo-reference.png | Bin 15983 -> 0 bytes
...smooth-and-offset-512-512-1.0-agg-reference.png | Bin 24514 -> 0 bytes
...ooth-and-offset-512-512-1.0-cairo-reference.png | Bin 24694 -> 0 bytes
...smooth-and-offset-512-512-2.0-agg-reference.png | Bin 24925 -> 0 bytes
...ooth-and-offset-512-512-2.0-cairo-reference.png | Bin 25011 -> 0 bytes
...lizer-expressions-256-256-1.0-agg-reference.png | Bin 1920 -> 0 bytes
...zer-expressions-256-256-1.0-cairo-reference.png | Bin 1660 -> 0 bytes
...lizer-expressions-256-256-2.0-agg-reference.png | Bin 3434 -> 0 bytes
...zer-expressions-256-256-2.0-cairo-reference.png | Bin 2811 -> 0 bytes
...r-expressions-all-256-256-1.0-agg-reference.png | Bin 3389 -> 0 bytes
...expressions-all-256-256-1.0-cairo-reference.png | Bin 2430 -> 0 bytes
...r-expressions-all-256-256-2.0-agg-reference.png | Bin 6271 -> 0 bytes
...expressions-all-256-256-2.0-cairo-reference.png | Bin 3927 -> 0 bytes
.../line_break-800-800-1.0-agg-reference.png | Bin 42059 -> 0 bytes
.../line_break-800-800-1.0-cairo-reference.png | Bin 20355 -> 0 bytes
.../line_break-800-800-2.0-agg-reference.png | Bin 65511 -> 0 bytes
.../line_break-800-800-2.0-cairo-reference.png | Bin 38557 -> 0 bytes
.../images/lines-1-200-200-1.0-agg-reference.png | Bin 2063 -> 0 bytes
.../images/lines-1-200-200-1.0-cairo-reference.png | Bin 1987 -> 0 bytes
.../images/lines-1-200-200-2.0-agg-reference.png | Bin 1154 -> 0 bytes
.../images/lines-1-200-200-2.0-cairo-reference.png | Bin 1149 -> 0 bytes
.../images/lines-1-400-400-1.0-agg-reference.png | Bin 6782 -> 0 bytes
.../images/lines-1-400-400-1.0-cairo-reference.png | Bin 5520 -> 0 bytes
.../images/lines-1-400-400-2.0-agg-reference.png | Bin 4508 -> 0 bytes
.../images/lines-1-400-400-2.0-cairo-reference.png | Bin 4311 -> 0 bytes
.../images/lines-1-600-600-1.0-agg-reference.png | Bin 15408 -> 0 bytes
.../images/lines-1-600-600-1.0-cairo-reference.png | Bin 11015 -> 0 bytes
.../images/lines-1-600-600-2.0-agg-reference.png | Bin 8660 -> 0 bytes
.../images/lines-1-600-600-2.0-cairo-reference.png | Bin 7800 -> 0 bytes
.../images/lines-1-800-800-1.0-agg-reference.png | Bin 17847 -> 0 bytes
.../images/lines-1-800-800-1.0-cairo-reference.png | Bin 13367 -> 0 bytes
.../images/lines-1-800-800-2.0-agg-reference.png | Bin 14807 -> 0 bytes
.../images/lines-1-800-800-2.0-cairo-reference.png | Bin 12340 -> 0 bytes
.../images/lines-2-200-200-1.0-agg-reference.png | Bin 2397 -> 0 bytes
.../images/lines-2-200-200-1.0-cairo-reference.png | Bin 2303 -> 0 bytes
.../images/lines-2-200-200-2.0-agg-reference.png | Bin 1154 -> 0 bytes
.../images/lines-2-200-200-2.0-cairo-reference.png | Bin 1149 -> 0 bytes
.../images/lines-2-400-400-1.0-agg-reference.png | Bin 5709 -> 0 bytes
.../images/lines-2-400-400-1.0-cairo-reference.png | Bin 5363 -> 0 bytes
.../images/lines-2-400-400-2.0-agg-reference.png | Bin 5319 -> 0 bytes
.../images/lines-2-400-400-2.0-cairo-reference.png | Bin 5063 -> 0 bytes
.../images/lines-2-600-600-1.0-agg-reference.png | Bin 10096 -> 0 bytes
.../images/lines-2-600-600-1.0-cairo-reference.png | Bin 8558 -> 0 bytes
.../images/lines-2-600-600-2.0-agg-reference.png | Bin 6954 -> 0 bytes
.../images/lines-2-600-600-2.0-cairo-reference.png | Bin 6650 -> 0 bytes
.../images/lines-2-800-800-1.0-agg-reference.png | Bin 12185 -> 0 bytes
.../images/lines-2-800-800-1.0-cairo-reference.png | Bin 10736 -> 0 bytes
.../images/lines-2-800-800-2.0-agg-reference.png | Bin 13369 -> 0 bytes
.../images/lines-2-800-800-2.0-cairo-reference.png | Bin 10935 -> 0 bytes
.../images/lines-3-200-200-1.0-agg-reference.png | Bin 2063 -> 0 bytes
.../images/lines-3-200-200-1.0-cairo-reference.png | Bin 1987 -> 0 bytes
.../images/lines-3-200-200-2.0-agg-reference.png | Bin 1154 -> 0 bytes
.../images/lines-3-200-200-2.0-cairo-reference.png | Bin 1149 -> 0 bytes
.../images/lines-3-400-400-1.0-agg-reference.png | Bin 6849 -> 0 bytes
.../images/lines-3-400-400-1.0-cairo-reference.png | Bin 5192 -> 0 bytes
.../images/lines-3-400-400-2.0-agg-reference.png | Bin 4508 -> 0 bytes
.../images/lines-3-400-400-2.0-cairo-reference.png | Bin 4311 -> 0 bytes
.../images/lines-3-600-600-1.0-agg-reference.png | Bin 15587 -> 0 bytes
.../images/lines-3-600-600-1.0-cairo-reference.png | Bin 11213 -> 0 bytes
.../images/lines-3-600-600-2.0-agg-reference.png | Bin 9382 -> 0 bytes
.../images/lines-3-600-600-2.0-cairo-reference.png | Bin 7915 -> 0 bytes
.../images/lines-3-800-800-1.0-agg-reference.png | Bin 18578 -> 0 bytes
.../images/lines-3-800-800-1.0-cairo-reference.png | Bin 14339 -> 0 bytes
.../images/lines-3-800-800-2.0-agg-reference.png | Bin 15042 -> 0 bytes
.../images/lines-3-800-800-2.0-cairo-reference.png | Bin 12488 -> 0 bytes
.../images/lines-4-200-200-1.0-agg-reference.png | Bin 10290 -> 0 bytes
.../images/lines-4-200-200-1.0-cairo-reference.png | Bin 10057 -> 0 bytes
.../images/lines-4-200-200-2.0-agg-reference.png | Bin 3835 -> 0 bytes
.../images/lines-4-200-200-2.0-cairo-reference.png | Bin 3758 -> 0 bytes
.../images/lines-4-400-400-1.0-agg-reference.png | Bin 24897 -> 0 bytes
.../images/lines-4-400-400-1.0-cairo-reference.png | Bin 24410 -> 0 bytes
.../images/lines-4-400-400-2.0-agg-reference.png | Bin 22505 -> 0 bytes
.../images/lines-4-400-400-2.0-cairo-reference.png | Bin 22551 -> 0 bytes
.../images/lines-4-600-600-1.0-agg-reference.png | Bin 40820 -> 0 bytes
.../images/lines-4-600-600-1.0-cairo-reference.png | Bin 39231 -> 0 bytes
.../images/lines-4-600-600-2.0-agg-reference.png | Bin 37584 -> 0 bytes
.../images/lines-4-600-600-2.0-cairo-reference.png | Bin 37159 -> 0 bytes
.../images/lines-4-800-800-1.0-agg-reference.png | Bin 55048 -> 0 bytes
.../images/lines-4-800-800-1.0-cairo-reference.png | Bin 53417 -> 0 bytes
.../images/lines-4-800-800-2.0-agg-reference.png | Bin 58655 -> 0 bytes
.../images/lines-4-800-800-2.0-cairo-reference.png | Bin 57792 -> 0 bytes
.../images/lines-5-200-200-1.0-agg-reference.png | Bin 12135 -> 0 bytes
.../images/lines-5-200-200-1.0-cairo-reference.png | Bin 11983 -> 0 bytes
.../images/lines-5-200-200-2.0-agg-reference.png | Bin 10025 -> 0 bytes
.../images/lines-5-200-200-2.0-cairo-reference.png | Bin 9815 -> 0 bytes
.../images/lines-5-400-400-1.0-agg-reference.png | Bin 27390 -> 0 bytes
.../images/lines-5-400-400-1.0-cairo-reference.png | Bin 26508 -> 0 bytes
.../images/lines-5-400-400-2.0-agg-reference.png | Bin 29365 -> 0 bytes
.../images/lines-5-400-400-2.0-cairo-reference.png | Bin 28941 -> 0 bytes
.../images/lines-5-600-600-1.0-agg-reference.png | Bin 48867 -> 0 bytes
.../images/lines-5-600-600-1.0-cairo-reference.png | Bin 45429 -> 0 bytes
.../images/lines-5-600-600-2.0-agg-reference.png | Bin 49078 -> 0 bytes
.../images/lines-5-600-600-2.0-cairo-reference.png | Bin 47666 -> 0 bytes
.../images/lines-5-800-800-1.0-agg-reference.png | Bin 68708 -> 0 bytes
.../images/lines-5-800-800-1.0-cairo-reference.png | Bin 62464 -> 0 bytes
.../images/lines-5-800-800-2.0-agg-reference.png | Bin 66016 -> 0 bytes
.../images/lines-5-800-800-2.0-cairo-reference.png | Bin 64942 -> 0 bytes
.../images/lines-6-200-200-1.0-agg-reference.png | Bin 11190 -> 0 bytes
.../images/lines-6-200-200-1.0-cairo-reference.png | Bin 10607 -> 0 bytes
.../images/lines-6-200-200-2.0-agg-reference.png | Bin 7893 -> 0 bytes
.../images/lines-6-200-200-2.0-cairo-reference.png | Bin 7644 -> 0 bytes
.../images/lines-6-400-400-1.0-agg-reference.png | Bin 25823 -> 0 bytes
.../images/lines-6-400-400-1.0-cairo-reference.png | Bin 24879 -> 0 bytes
.../images/lines-6-400-400-2.0-agg-reference.png | Bin 27193 -> 0 bytes
.../images/lines-6-400-400-2.0-cairo-reference.png | Bin 26284 -> 0 bytes
.../images/lines-6-600-600-1.0-agg-reference.png | Bin 41760 -> 0 bytes
.../images/lines-6-600-600-1.0-cairo-reference.png | Bin 41070 -> 0 bytes
.../images/lines-6-600-600-2.0-agg-reference.png | Bin 43330 -> 0 bytes
.../images/lines-6-600-600-2.0-cairo-reference.png | Bin 42581 -> 0 bytes
.../images/lines-6-800-800-1.0-agg-reference.png | Bin 55161 -> 0 bytes
.../images/lines-6-800-800-1.0-cairo-reference.png | Bin 52936 -> 0 bytes
.../images/lines-6-800-800-2.0-agg-reference.png | Bin 64210 -> 0 bytes
.../images/lines-6-800-800-2.0-cairo-reference.png | Bin 63621 -> 0 bytes
.../images/lines-7-200-200-1.0-agg-reference.png | Bin 9568 -> 0 bytes
.../images/lines-7-200-200-1.0-cairo-reference.png | Bin 9191 -> 0 bytes
.../images/lines-7-200-200-2.0-agg-reference.png | Bin 8216 -> 0 bytes
.../images/lines-7-200-200-2.0-cairo-reference.png | Bin 7875 -> 0 bytes
.../images/lines-7-400-400-1.0-agg-reference.png | Bin 20621 -> 0 bytes
.../images/lines-7-400-400-1.0-cairo-reference.png | Bin 19754 -> 0 bytes
.../images/lines-7-400-400-2.0-agg-reference.png | Bin 22163 -> 0 bytes
.../images/lines-7-400-400-2.0-cairo-reference.png | Bin 21204 -> 0 bytes
.../images/lines-7-600-600-1.0-agg-reference.png | Bin 31466 -> 0 bytes
.../images/lines-7-600-600-1.0-cairo-reference.png | Bin 29609 -> 0 bytes
.../images/lines-7-600-600-2.0-agg-reference.png | Bin 36361 -> 0 bytes
.../images/lines-7-600-600-2.0-cairo-reference.png | Bin 34560 -> 0 bytes
.../images/lines-7-800-800-1.0-agg-reference.png | Bin 43230 -> 0 bytes
.../images/lines-7-800-800-1.0-cairo-reference.png | Bin 40803 -> 0 bytes
.../images/lines-7-800-800-2.0-agg-reference.png | Bin 49379 -> 0 bytes
.../images/lines-7-800-800-2.0-cairo-reference.png | Bin 47160 -> 0 bytes
...es-multi-layout-1-800-800-1.0-agg-reference.png | Bin 72792 -> 0 bytes
...-multi-layout-1-800-800-1.0-cairo-reference.png | Bin 65751 -> 0 bytes
...es-multi-layout-1-800-800-2.0-agg-reference.png | Bin 70919 -> 0 bytes
...-multi-layout-1-800-800-2.0-cairo-reference.png | Bin 67367 -> 0 bytes
...es-multi-layout-2-800-800-1.0-agg-reference.png | Bin 25524 -> 0 bytes
...-multi-layout-2-800-800-1.0-cairo-reference.png | Bin 24435 -> 0 bytes
...es-multi-layout-2-800-800-2.0-agg-reference.png | Bin 27449 -> 0 bytes
...-multi-layout-2-800-800-2.0-cairo-reference.png | Bin 27424 -> 0 bytes
...lti-layout-shield-800-800-1.0-agg-reference.png | Bin 12992 -> 0 bytes
...i-layout-shield-800-800-1.0-cairo-reference.png | Bin 10814 -> 0 bytes
...lti-layout-shield-800-800-2.0-agg-reference.png | Bin 13211 -> 0 bytes
...i-layout-shield-800-800-2.0-cairo-reference.png | Bin 11696 -> 0 bytes
.../lines-shield-200-200-1.0-agg-reference.png | Bin 1973 -> 0 bytes
.../lines-shield-200-200-1.0-cairo-reference.png | Bin 1970 -> 0 bytes
.../lines-shield-200-200-2.0-agg-reference.png | Bin 2608 -> 0 bytes
.../lines-shield-200-200-2.0-cairo-reference.png | Bin 2661 -> 0 bytes
.../lines-shield-400-400-1.0-agg-reference.png | Bin 4606 -> 0 bytes
.../lines-shield-400-400-1.0-cairo-reference.png | Bin 4416 -> 0 bytes
.../lines-shield-400-400-2.0-agg-reference.png | Bin 4493 -> 0 bytes
.../lines-shield-400-400-2.0-cairo-reference.png | Bin 4299 -> 0 bytes
.../lines-shield-600-600-1.0-agg-reference.png | Bin 6509 -> 0 bytes
.../lines-shield-600-600-1.0-cairo-reference.png | Bin 6405 -> 0 bytes
.../lines-shield-600-600-2.0-agg-reference.png | Bin 7282 -> 0 bytes
.../lines-shield-600-600-2.0-cairo-reference.png | Bin 6818 -> 0 bytes
.../lines-shield-800-800-1.0-agg-reference.png | Bin 8764 -> 0 bytes
.../lines-shield-800-800-1.0-cairo-reference.png | Bin 8271 -> 0 bytes
.../lines-shield-800-800-2.0-agg-reference.png | Bin 10304 -> 0 bytes
.../lines-shield-800-800-2.0-cairo-reference.png | Bin 9338 -> 0 bytes
.../images/list-100-100-1.0-agg-reference.png | Bin 1202 -> 0 bytes
.../images/list-100-100-1.0-cairo-reference.png | Bin 1166 -> 0 bytes
.../images/list-100-100-2.0-agg-reference.png | Bin 1689 -> 0 bytes
.../images/list-100-100-2.0-cairo-reference.png | Bin 1667 -> 0 bytes
.../images/list-150-100-1.0-agg-reference.png | Bin 1680 -> 0 bytes
.../images/list-150-100-1.0-cairo-reference.png | Bin 1578 -> 0 bytes
.../images/list-150-100-2.0-agg-reference.png | Bin 2115 -> 0 bytes
.../images/list-150-100-2.0-cairo-reference.png | Bin 2107 -> 0 bytes
.../images/list-250-100-1.0-agg-reference.png | Bin 2601 -> 0 bytes
.../images/list-250-100-1.0-cairo-reference.png | Bin 1968 -> 0 bytes
.../images/list-250-100-2.0-agg-reference.png | Bin 2819 -> 0 bytes
.../images/list-250-100-2.0-cairo-reference.png | Bin 2770 -> 0 bytes
.../images/list-300-100-1.0-agg-reference.png | Bin 2851 -> 0 bytes
.../images/list-300-100-1.0-cairo-reference.png | Bin 2026 -> 0 bytes
.../images/list-300-100-2.0-agg-reference.png | Bin 3536 -> 0 bytes
.../images/list-300-100-2.0-cairo-reference.png | Bin 3387 -> 0 bytes
.../images/list-400-100-1.0-agg-reference.png | Bin 3617 -> 0 bytes
.../images/list-400-100-1.0-cairo-reference.png | Bin 2103 -> 0 bytes
.../images/list-400-100-2.0-agg-reference.png | Bin 4786 -> 0 bytes
.../images/list-400-100-2.0-cairo-reference.png | Bin 3654 -> 0 bytes
.../images/list-600-100-1.0-agg-reference.png | Bin 3853 -> 0 bytes
.../images/list-600-100-1.0-cairo-reference.png | Bin 2188 -> 0 bytes
.../images/list-600-100-2.0-agg-reference.png | Bin 5989 -> 0 bytes
.../images/list-600-100-2.0-cairo-reference.png | Bin 4401 -> 0 bytes
.../images/list-800-100-1.0-agg-reference.png | Bin 4418 -> 0 bytes
.../images/list-800-100-1.0-cairo-reference.png | Bin 2360 -> 0 bytes
.../images/list-800-100-2.0-agg-reference.png | Bin 7382 -> 0 bytes
.../images/list-800-100-2.0-cairo-reference.png | Bin 4320 -> 0 bytes
...image-compositing-512-512-1.0-agg-reference.png | Bin 81860 -> 0 bytes
...age-compositing-512-512-1.0-cairo-reference.png | Bin 87213 -> 0 bytes
...image-compositing-512-512-2.0-agg-reference.png | Bin 104855 -> 0 bytes
...age-compositing-512-512-2.0-cairo-reference.png | Bin 112624 -> 0 bytes
.../marker-collide-512-512-1.0-agg-reference.png | Bin 30559 -> 0 bytes
.../marker-collide-512-512-1.0-cairo-reference.png | Bin 27120 -> 0 bytes
.../marker-collide-512-512-2.0-agg-reference.png | Bin 27946 -> 0 bytes
.../marker-collide-512-512-2.0-cairo-reference.png | Bin 26323 -> 0 bytes
...interior-position-600-400-1.0-agg-reference.png | Bin 1211 -> 0 bytes
...terior-position-600-400-1.0-cairo-reference.png | Bin 1196 -> 0 bytes
...interior-position-600-400-2.0-agg-reference.png | Bin 1330 -> 0 bytes
...terior-position-600-400-2.0-cairo-reference.png | Bin 1978 -> 0 bytes
...rker-multi-policy-600-400-1.0-agg-reference.png | Bin 5015 -> 0 bytes
...er-multi-policy-600-400-1.0-cairo-reference.png | Bin 5135 -> 0 bytes
...rker-multi-policy-600-400-2.0-agg-reference.png | Bin 6728 -> 0 bytes
...er-multi-policy-600-400-2.0-cairo-reference.png | Bin 7158 -> 0 bytes
...arker-on-hex-grid-257-256-1.0-agg-reference.png | Bin 5138 -> 0 bytes
...ker-on-hex-grid-257-256-1.0-cairo-reference.png | Bin 5366 -> 0 bytes
...arker-on-hex-grid-257-256-2.0-agg-reference.png | Bin 6487 -> 0 bytes
...ker-on-hex-grid-257-256-2.0-cairo-reference.png | Bin 6741 -> 0 bytes
...arker-on-hex-grid-400-600-1.0-agg-reference.png | Bin 23045 -> 0 bytes
...ker-on-hex-grid-400-600-1.0-cairo-reference.png | Bin 23572 -> 0 bytes
...arker-on-hex-grid-400-600-2.0-agg-reference.png | Bin 13111 -> 0 bytes
...ker-on-hex-grid-400-600-2.0-cairo-reference.png | Bin 12801 -> 0 bytes
...arker-on-hex-grid-600-400-1.0-agg-reference.png | Bin 18937 -> 0 bytes
...ker-on-hex-grid-600-400-1.0-cairo-reference.png | Bin 18215 -> 0 bytes
...arker-on-hex-grid-600-400-2.0-agg-reference.png | Bin 11944 -> 0 bytes
...ker-on-hex-grid-600-400-2.0-cairo-reference.png | Bin 10162 -> 0 bytes
.../marker-on-line-600-400-1.0-agg-reference.png | Bin 2501 -> 0 bytes
.../marker-on-line-600-400-1.0-cairo-reference.png | Bin 2435 -> 0 bytes
.../marker-on-line-600-400-2.0-agg-reference.png | Bin 2966 -> 0 bytes
.../marker-on-line-600-400-2.0-cairo-reference.png | Bin 2825 -> 0 bytes
...e-and-avoid-edges-512-512-1.0-agg-reference.png | Bin 17764 -> 0 bytes
...and-avoid-edges-512-512-1.0-cairo-reference.png | Bin 18272 -> 0 bytes
...e-and-avoid-edges-512-512-2.0-agg-reference.png | Bin 15331 -> 0 bytes
...and-avoid-edges-512-512-2.0-cairo-reference.png | Bin 15168 -> 0 bytes
...nd-line-placement-600-400-1.0-agg-reference.png | Bin 11602 -> 0 bytes
...-line-placement-600-400-1.0-cairo-reference.png | Bin 11499 -> 0 bytes
...nd-line-placement-600-400-2.0-agg-reference.png | Bin 12570 -> 0 bytes
...-line-placement-600-400-2.0-cairo-reference.png | Bin 12389 -> 0 bytes
...x-first-placement-600-400-1.0-agg-reference.png | Bin 878 -> 0 bytes
...first-placement-600-400-1.0-cairo-reference.png | Bin 1103 -> 0 bytes
...x-first-placement-600-400-2.0-agg-reference.png | Bin 1381 -> 0 bytes
...first-placement-600-400-2.0-cairo-reference.png | Bin 1449 -> 0 bytes
...ex-last-placement-600-400-1.0-agg-reference.png | Bin 876 -> 0 bytes
...-last-placement-600-400-1.0-cairo-reference.png | Bin 1097 -> 0 bytes
...ex-last-placement-600-400-2.0-agg-reference.png | Bin 1360 -> 0 bytes
...-last-placement-600-400-2.0-cairo-reference.png | Bin 1450 -> 0 bytes
...-spacing-eq-width-600-400-1.0-agg-reference.png | Bin 13500 -> 0 bytes
...pacing-eq-width-600-400-1.0-cairo-reference.png | Bin 13313 -> 0 bytes
...-spacing-eq-width-600-400-2.0-agg-reference.png | Bin 15276 -> 0 bytes
...pacing-eq-width-600-400-2.0-cairo-reference.png | Bin 15226 -> 0 bytes
...-eq-width-overlap-600-400-1.0-agg-reference.png | Bin 16330 -> 0 bytes
...q-width-overlap-600-400-1.0-cairo-reference.png | Bin 16268 -> 0 bytes
...-eq-width-overlap-600-400-2.0-agg-reference.png | Bin 20682 -> 0 bytes
...q-width-overlap-600-400-2.0-cairo-reference.png | Bin 20922 -> 0 bytes
...r-path-expression-500-100-1.0-agg-reference.png | Bin 207 -> 0 bytes
...path-expression-500-100-1.0-cairo-reference.png | Bin 203 -> 0 bytes
...r-path-expression-500-100-2.0-agg-reference.png | Bin 221 -> 0 bytes
...path-expression-500-100-2.0-cairo-reference.png | Bin 261 -> 0 bytes
...-recenter-collide-256-128-1.0-agg-reference.png | Bin 310 -> 0 bytes
...ecenter-collide-256-128-1.0-cairo-reference.png | Bin 319 -> 0 bytes
...-recenter-collide-256-128-2.0-agg-reference.png | Bin 593 -> 0 bytes
...ecenter-collide-256-128-2.0-cairo-reference.png | Bin 653 -> 0 bytes
...g-empty-g-element-500-100-1.0-agg-reference.png | Bin 328 -> 0 bytes
...empty-g-element-500-100-1.0-cairo-reference.png | Bin 342 -> 0 bytes
...g-empty-g-element-500-100-2.0-agg-reference.png | Bin 500 -> 0 bytes
...empty-g-element-500-100-2.0-cairo-reference.png | Bin 620 -> 0 bytes
...arker-svg-opacity-500-100-1.0-agg-reference.png | Bin 229 -> 0 bytes
...ker-svg-opacity-500-100-1.0-cairo-reference.png | Bin 229 -> 0 bytes
...arker-svg-opacity-500-100-2.0-agg-reference.png | Bin 261 -> 0 bytes
...ker-svg-opacity-500-100-2.0-cairo-reference.png | Bin 317 -> 0 bytes
...rker-svg-opacity2-500-100-1.0-agg-reference.png | Bin 145 -> 0 bytes
...er-svg-opacity2-500-100-1.0-cairo-reference.png | Bin 145 -> 0 bytes
...rker-svg-opacity2-500-100-2.0-agg-reference.png | Bin 151 -> 0 bytes
...er-svg-opacity2-500-100-2.0-cairo-reference.png | Bin 151 -> 0 bytes
...r-expressions-all-256-256-1.0-agg-reference.png | Bin 2852 -> 0 bytes
...expressions-all-256-256-1.0-cairo-reference.png | Bin 2746 -> 0 bytes
...r-expressions-all-256-256-2.0-agg-reference.png | Bin 4190 -> 0 bytes
...expressions-all-256-256-2.0-cairo-reference.png | Bin 3933 -> 0 bytes
.../marker-vs-point-512-512-1.0-agg-reference.png | Bin 76063 -> 0 bytes
...marker-vs-point-512-512-1.0-cairo-reference.png | Bin 81216 -> 0 bytes
.../marker-vs-point-512-512-2.0-agg-reference.png | Bin 116097 -> 0 bytes
...marker-vs-point-512-512-2.0-cairo-reference.png | Bin 124796 -> 0 bytes
...ole-multi-polygon-512-512-1.0-agg-reference.png | Bin 30129 -> 0 bytes
...e-multi-polygon-512-512-1.0-cairo-reference.png | Bin 30099 -> 0 bytes
...ole-multi-polygon-512-512-2.0-agg-reference.png | Bin 25418 -> 0 bytes
...e-multi-polygon-512-512-2.0-cairo-reference.png | Bin 25311 -> 0 bytes
...-background-image-257-256-1.0-agg-reference.png | Bin 13812 -> 0 bytes
...ackground-image-257-256-1.0-cairo-reference.png | Bin 13375 -> 0 bytes
...-background-image-257-256-2.0-agg-reference.png | Bin 9424 -> 0 bytes
...ackground-image-257-256-2.0-cairo-reference.png | Bin 8515 -> 0 bytes
...-background-image-400-600-1.0-agg-reference.png | Bin 15675 -> 0 bytes
...ackground-image-400-600-1.0-cairo-reference.png | Bin 15753 -> 0 bytes
...-background-image-400-600-2.0-agg-reference.png | Bin 23715 -> 0 bytes
...ackground-image-400-600-2.0-cairo-reference.png | Bin 23051 -> 0 bytes
...-background-image-600-400-1.0-agg-reference.png | Bin 22483 -> 0 bytes
...ackground-image-600-400-1.0-cairo-reference.png | Bin 21935 -> 0 bytes
...-background-image-600-400-2.0-agg-reference.png | Bin 32711 -> 0 bytes
...ackground-image-600-400-2.0-cairo-reference.png | Bin 32048 -> 0 bytes
...nd-hsla-transform-257-256-1.0-agg-reference.png | Bin 12868 -> 0 bytes
...-hsla-transform-257-256-1.0-cairo-reference.png | Bin 13375 -> 0 bytes
...nd-hsla-transform-257-256-2.0-agg-reference.png | Bin 8777 -> 0 bytes
...-hsla-transform-257-256-2.0-cairo-reference.png | Bin 8515 -> 0 bytes
...nd-hsla-transform-400-600-1.0-agg-reference.png | Bin 15610 -> 0 bytes
...-hsla-transform-400-600-1.0-cairo-reference.png | Bin 15753 -> 0 bytes
...nd-hsla-transform-400-600-2.0-agg-reference.png | Bin 22050 -> 0 bytes
...-hsla-transform-400-600-2.0-cairo-reference.png | Bin 23051 -> 0 bytes
...nd-hsla-transform-600-400-1.0-agg-reference.png | Bin 21003 -> 0 bytes
...-hsla-transform-600-400-1.0-cairo-reference.png | Bin 21935 -> 0 bytes
...nd-hsla-transform-600-400-2.0-agg-reference.png | Bin 30260 -> 0 bytes
...-hsla-transform-600-400-2.0-cairo-reference.png | Bin 32048 -> 0 bytes
...ge-linear-comp-op-500-100-1.0-agg-reference.png | Bin 6419 -> 0 bytes
...-linear-comp-op-500-100-1.0-cairo-reference.png | Bin 7564 -> 0 bytes
...ge-linear-comp-op-500-100-2.0-agg-reference.png | Bin 4137 -> 0 bytes
...-linear-comp-op-500-100-2.0-cairo-reference.png | Bin 5219 -> 0 bytes
...acement_on_points-500-100-1.0-agg-reference.png | Bin 966 -> 0 bytes
...ement_on_points-500-100-1.0-cairo-reference.png | Bin 986 -> 0 bytes
...acement_on_points-500-100-2.0-agg-reference.png | Bin 1160 -> 0 bytes
...ement_on_points-500-100-2.0-cairo-reference.png | Bin 1214 -> 0 bytes
.../orientation-800-200-1.0-agg-reference.png | Bin 3623 -> 0 bytes
.../orientation-800-200-1.0-cairo-reference.png | Bin 2865 -> 0 bytes
.../orientation-800-200-2.0-agg-reference.png | Bin 4964 -> 0 bytes
.../orientation-800-200-2.0-cairo-reference.png | Bin 3853 -> 0 bytes
...lizer-expressions-256-256-1.0-agg-reference.png | Bin 809 -> 0 bytes
...zer-expressions-256-256-1.0-cairo-reference.png | Bin 872 -> 0 bytes
...lizer-expressions-256-256-2.0-agg-reference.png | Bin 1248 -> 0 bytes
...zer-expressions-256-256-2.0-cairo-reference.png | Bin 1186 -> 0 bytes
...r-expressions-all-256-256-1.0-agg-reference.png | Bin 3091 -> 0 bytes
...expressions-all-256-256-1.0-cairo-reference.png | Bin 3058 -> 0 bytes
...r-expressions-all-256-256-2.0-agg-reference.png | Bin 4569 -> 0 bytes
...expressions-all-256-256-2.0-cairo-reference.png | Bin 4291 -> 0 bytes
...ap-placement-expr-500-500-1.0-agg-reference.png | Bin 1146 -> 0 bytes
...-placement-expr-500-500-1.0-cairo-reference.png | Bin 2465 -> 0 bytes
...ap-placement-expr-500-500-2.0-agg-reference.png | Bin 1605 -> 0 bytes
...-placement-expr-500-500-2.0-cairo-reference.png | Bin 3864 -> 0 bytes
...lizer-expressions-256-256-1.0-agg-reference.png | Bin 2456 -> 0 bytes
...zer-expressions-256-256-1.0-cairo-reference.png | Bin 2469 -> 0 bytes
...lizer-expressions-256-256-2.0-agg-reference.png | Bin 3808 -> 0 bytes
...zer-expressions-256-256-2.0-cairo-reference.png | Bin 3747 -> 0 bytes
...r-expressions-all-256-256-1.0-agg-reference.png | Bin 3085 -> 0 bytes
...expressions-all-256-256-1.0-cairo-reference.png | Bin 3113 -> 0 bytes
...r-expressions-all-256-256-2.0-agg-reference.png | Bin 4979 -> 0 bytes
...expressions-all-256-256-2.0-cairo-reference.png | Bin 4690 -> 0 bytes
...gon-winding-order-300-300-1.0-agg-reference.png | Bin 1220 -> 0 bytes
...n-winding-order-300-300-1.0-cairo-reference.png | Bin 1178 -> 0 bytes
...gon-winding-order-300-300-2.0-agg-reference.png | Bin 1738 -> 0 bytes
...n-winding-order-300-300-2.0-cairo-reference.png | Bin 1754 -> 0 bytes
.../postgis-inline-512-512-1.0-agg-reference.png | Bin 3080 -> 0 bytes
.../postgis-inline-512-512-1.0-cairo-reference.png | Bin 3059 -> 0 bytes
.../postgis-inline-512-512-2.0-agg-reference.png | Bin 3990 -> 0 bytes
.../postgis-inline-512-512-2.0-cairo-reference.png | Bin 3945 -> 0 bytes
.../images/python-Format-reference.png | Bin 1580 -> 0 bytes
.../images/python-IfElse-reference.png | Bin 1739 -> 0 bytes
.../visual_tests/images/python-List-reference.png | Bin 2862 -> 0 bytes
.../images/python-MyText-reference.png | Bin 2416 -> 0 bytes
.../images/python-TextNode-reference.png | Bin 1587 -> 0 bytes
...r-color-to-alpha1-512-512-1.0-agg-reference.png | Bin 73162 -> 0 bytes
...color-to-alpha1-512-512-1.0-cairo-reference.png | Bin 70685 -> 0 bytes
...r-color-to-alpha1-512-512-2.0-agg-reference.png | Bin 73162 -> 0 bytes
...color-to-alpha1-512-512-2.0-cairo-reference.png | Bin 70685 -> 0 bytes
...r-color-to-alpha2-512-512-1.0-agg-reference.png | Bin 6925 -> 0 bytes
...color-to-alpha2-512-512-1.0-cairo-reference.png | Bin 10477 -> 0 bytes
...r-color-to-alpha2-512-512-2.0-agg-reference.png | Bin 6925 -> 0 bytes
...color-to-alpha2-512-512-2.0-cairo-reference.png | Bin 10477 -> 0 bytes
...r-color-to-alpha3-512-512-1.0-agg-reference.png | Bin 6748 -> 0 bytes
...color-to-alpha3-512-512-1.0-cairo-reference.png | Bin 12863 -> 0 bytes
...r-color-to-alpha3-512-512-2.0-agg-reference.png | Bin 6748 -> 0 bytes
...color-to-alpha3-512-512-2.0-cairo-reference.png | Bin 12863 -> 0 bytes
...r-color-to-alpha4-512-512-1.0-agg-reference.png | Bin 6426 -> 0 bytes
...color-to-alpha4-512-512-1.0-cairo-reference.png | Bin 7787 -> 0 bytes
...r-color-to-alpha4-512-512-2.0-agg-reference.png | Bin 6426 -> 0 bytes
...color-to-alpha4-512-512-2.0-cairo-reference.png | Bin 7787 -> 0 bytes
...r-color-to-alpha5-512-512-1.0-agg-reference.png | Bin 7777 -> 0 bytes
...color-to-alpha5-512-512-1.0-cairo-reference.png | Bin 7787 -> 0 bytes
...r-color-to-alpha5-512-512-2.0-agg-reference.png | Bin 7777 -> 0 bytes
...color-to-alpha5-512-512-2.0-cairo-reference.png | Bin 7787 -> 0 bytes
.../raster_colorizer-512-512-1.0-agg-reference.png | Bin 7787 -> 0 bytes
...aster_colorizer-512-512-1.0-cairo-reference.png | Bin 7787 -> 0 bytes
.../raster_colorizer-512-512-2.0-agg-reference.png | Bin 7787 -> 0 bytes
...aster_colorizer-512-512-2.0-cairo-reference.png | Bin 7787 -> 0 bytes
...raster_symbolizer-512-512-1.0-agg-reference.png | Bin 19638 -> 0 bytes
...ster_symbolizer-512-512-1.0-cairo-reference.png | Bin 19638 -> 0 bytes
...raster_symbolizer-512-512-2.0-agg-reference.png | Bin 19638 -> 0 bytes
...ster_symbolizer-512-512-2.0-cairo-reference.png | Bin 19638 -> 0 bytes
.../repeat-labels-1-750-250-1.0-agg-reference.png | Bin 7569 -> 0 bytes
...repeat-labels-1-750-250-1.0-cairo-reference.png | Bin 4566 -> 0 bytes
.../repeat-labels-1-750-250-2.0-agg-reference.png | Bin 7087 -> 0 bytes
...repeat-labels-1-750-250-2.0-cairo-reference.png | Bin 5391 -> 0 bytes
.../repeat-labels-2-750-250-1.0-agg-reference.png | Bin 5438 -> 0 bytes
...repeat-labels-2-750-250-1.0-cairo-reference.png | Bin 3247 -> 0 bytes
.../repeat-labels-2-750-250-2.0-agg-reference.png | Bin 3091 -> 0 bytes
...repeat-labels-2-750-250-2.0-cairo-reference.png | Bin 3248 -> 0 bytes
.../repeat-labels-3-750-250-1.0-agg-reference.png | Bin 9343 -> 0 bytes
...repeat-labels-3-750-250-1.0-cairo-reference.png | Bin 5011 -> 0 bytes
.../repeat-labels-3-750-250-2.0-agg-reference.png | Bin 9380 -> 0 bytes
...repeat-labels-3-750-250-2.0-cairo-reference.png | Bin 6900 -> 0 bytes
.../repeat-labels-4-750-250-1.0-agg-reference.png | Bin 9417 -> 0 bytes
...repeat-labels-4-750-250-1.0-cairo-reference.png | Bin 5101 -> 0 bytes
.../repeat-labels-4-750-250-2.0-agg-reference.png | Bin 9497 -> 0 bytes
...repeat-labels-4-750-250-2.0-cairo-reference.png | Bin 7044 -> 0 bytes
...grouped-rendering-600-600-1.0-agg-reference.png | Bin 97311 -> 0 bytes
...ouped-rendering-600-600-1.0-cairo-reference.png | Bin 97392 -> 0 bytes
...grouped-rendering-600-600-2.0-agg-reference.png | Bin 85899 -> 0 bytes
...ouped-rendering-600-600-2.0-cairo-reference.png | Bin 86275 -> 0 bytes
...grouped-rendering-600-600-1.0-agg-reference.png | Bin 97650 -> 0 bytes
...ouped-rendering-600-600-1.0-cairo-reference.png | Bin 99163 -> 0 bytes
...grouped-rendering-600-600-2.0-agg-reference.png | Bin 85131 -> 0 bytes
...ouped-rendering-600-600-2.0-cairo-reference.png | Bin 86195 -> 0 bytes
.../images/rtl-point-200-200-1.0-agg-reference.png | Bin 1047 -> 0 bytes
.../rtl-point-200-200-1.0-cairo-reference.png | Bin 1007 -> 0 bytes
.../images/rtl-point-200-200-2.0-agg-reference.png | Bin 1370 -> 0 bytes
.../rtl-point-200-200-2.0-cairo-reference.png | Bin 1397 -> 0 bytes
...e-and-avoid-edges-512-512-1.0-agg-reference.png | Bin 10951 -> 0 bytes
...and-avoid-edges-512-512-1.0-cairo-reference.png | Bin 21137 -> 0 bytes
...e-and-avoid-edges-512-512-2.0-agg-reference.png | Bin 14757 -> 0 bytes
...and-avoid-edges-512-512-2.0-cairo-reference.png | Bin 20410 -> 0 bytes
...-spacing-eq-width-600-400-1.0-agg-reference.png | Bin 10263 -> 0 bytes
...pacing-eq-width-600-400-1.0-cairo-reference.png | Bin 8521 -> 0 bytes
...-spacing-eq-width-600-400-2.0-agg-reference.png | Bin 16403 -> 0 bytes
...pacing-eq-width-600-400-2.0-cairo-reference.png | Bin 10440 -> 0 bytes
...ield-on-polygon-500-100-1.0-cairo-reference.png | Bin 3443 -> 0 bytes
...ield-on-polygon-500-100-2.0-cairo-reference.png | Bin 6009 -> 0 bytes
...shield-on-polygon-600-400-1.0-agg-reference.png | Bin 10797 -> 0 bytes
...ield-on-polygon-600-400-1.0-cairo-reference.png | Bin 10694 -> 0 bytes
...shield-on-polygon-600-400-2.0-agg-reference.png | Bin 16974 -> 0 bytes
...ield-on-polygon-600-400-2.0-cairo-reference.png | Bin 15763 -> 0 bytes
...hieldsymbolizer-1-490-100-1.0-agg-reference.png | Bin 1532 -> 0 bytes
...eldsymbolizer-1-490-100-1.0-cairo-reference.png | Bin 1384 -> 0 bytes
...hieldsymbolizer-1-490-100-2.0-agg-reference.png | Bin 2734 -> 0 bytes
...eldsymbolizer-1-490-100-2.0-cairo-reference.png | Bin 2566 -> 0 bytes
...hieldsymbolizer-1-495-100-1.0-agg-reference.png | Bin 1603 -> 0 bytes
...eldsymbolizer-1-495-100-1.0-cairo-reference.png | Bin 1535 -> 0 bytes
...hieldsymbolizer-1-495-100-2.0-agg-reference.png | Bin 3048 -> 0 bytes
...eldsymbolizer-1-495-100-2.0-cairo-reference.png | Bin 2941 -> 0 bytes
...hieldsymbolizer-1-497-100-1.0-agg-reference.png | Bin 1769 -> 0 bytes
...eldsymbolizer-1-497-100-1.0-cairo-reference.png | Bin 1672 -> 0 bytes
...hieldsymbolizer-1-497-100-2.0-agg-reference.png | Bin 3385 -> 0 bytes
...eldsymbolizer-1-497-100-2.0-cairo-reference.png | Bin 3313 -> 0 bytes
...hieldsymbolizer-1-498-100-1.0-agg-reference.png | Bin 1753 -> 0 bytes
...eldsymbolizer-1-498-100-1.0-cairo-reference.png | Bin 1639 -> 0 bytes
...hieldsymbolizer-1-498-100-2.0-agg-reference.png | Bin 3311 -> 0 bytes
...eldsymbolizer-1-498-100-2.0-cairo-reference.png | Bin 3302 -> 0 bytes
...hieldsymbolizer-1-499-100-1.0-agg-reference.png | Bin 1750 -> 0 bytes
...eldsymbolizer-1-499-100-1.0-cairo-reference.png | Bin 1680 -> 0 bytes
...hieldsymbolizer-1-499-100-2.0-agg-reference.png | Bin 3324 -> 0 bytes
...eldsymbolizer-1-499-100-2.0-cairo-reference.png | Bin 3368 -> 0 bytes
...hieldsymbolizer-1-500-100-1.0-agg-reference.png | Bin 1559 -> 0 bytes
...eldsymbolizer-1-500-100-1.0-cairo-reference.png | Bin 1359 -> 0 bytes
...hieldsymbolizer-1-500-100-2.0-agg-reference.png | Bin 2707 -> 0 bytes
...eldsymbolizer-1-500-100-2.0-cairo-reference.png | Bin 2600 -> 0 bytes
...hieldsymbolizer-1-501-100-1.0-agg-reference.png | Bin 1761 -> 0 bytes
...eldsymbolizer-1-501-100-1.0-cairo-reference.png | Bin 1663 -> 0 bytes
...hieldsymbolizer-1-501-100-2.0-agg-reference.png | Bin 3225 -> 0 bytes
...eldsymbolizer-1-501-100-2.0-cairo-reference.png | Bin 3322 -> 0 bytes
...hieldsymbolizer-1-502-100-1.0-agg-reference.png | Bin 1745 -> 0 bytes
...eldsymbolizer-1-502-100-1.0-cairo-reference.png | Bin 1623 -> 0 bytes
...hieldsymbolizer-1-502-100-2.0-agg-reference.png | Bin 3297 -> 0 bytes
...eldsymbolizer-1-502-100-2.0-cairo-reference.png | Bin 3238 -> 0 bytes
...hieldsymbolizer-1-505-100-1.0-agg-reference.png | Bin 1597 -> 0 bytes
...eldsymbolizer-1-505-100-1.0-cairo-reference.png | Bin 1521 -> 0 bytes
...hieldsymbolizer-1-505-100-2.0-agg-reference.png | Bin 3066 -> 0 bytes
...eldsymbolizer-1-505-100-2.0-cairo-reference.png | Bin 2955 -> 0 bytes
...hieldsymbolizer-1-510-100-1.0-agg-reference.png | Bin 1529 -> 0 bytes
...eldsymbolizer-1-510-100-1.0-cairo-reference.png | Bin 1379 -> 0 bytes
...hieldsymbolizer-1-510-100-2.0-agg-reference.png | Bin 2732 -> 0 bytes
...eldsymbolizer-1-510-100-2.0-cairo-reference.png | Bin 2580 -> 0 bytes
...hieldsymbolizer-2-490-100-1.0-agg-reference.png | Bin 1577 -> 0 bytes
...eldsymbolizer-2-490-100-1.0-cairo-reference.png | Bin 1272 -> 0 bytes
...hieldsymbolizer-2-490-100-2.0-agg-reference.png | Bin 2721 -> 0 bytes
...eldsymbolizer-2-490-100-2.0-cairo-reference.png | Bin 2385 -> 0 bytes
...hieldsymbolizer-2-495-100-1.0-agg-reference.png | Bin 1643 -> 0 bytes
...eldsymbolizer-2-495-100-1.0-cairo-reference.png | Bin 1421 -> 0 bytes
...hieldsymbolizer-2-495-100-2.0-agg-reference.png | Bin 2993 -> 0 bytes
...eldsymbolizer-2-495-100-2.0-cairo-reference.png | Bin 2696 -> 0 bytes
...hieldsymbolizer-2-497-100-1.0-agg-reference.png | Bin 1761 -> 0 bytes
...eldsymbolizer-2-497-100-1.0-cairo-reference.png | Bin 1618 -> 0 bytes
...hieldsymbolizer-2-497-100-2.0-agg-reference.png | Bin 3353 -> 0 bytes
...eldsymbolizer-2-497-100-2.0-cairo-reference.png | Bin 3087 -> 0 bytes
...hieldsymbolizer-2-498-100-1.0-agg-reference.png | Bin 1756 -> 0 bytes
...eldsymbolizer-2-498-100-1.0-cairo-reference.png | Bin 1527 -> 0 bytes
...hieldsymbolizer-2-498-100-2.0-agg-reference.png | Bin 3229 -> 0 bytes
...eldsymbolizer-2-498-100-2.0-cairo-reference.png | Bin 3042 -> 0 bytes
...hieldsymbolizer-2-499-100-1.0-agg-reference.png | Bin 1713 -> 0 bytes
...eldsymbolizer-2-499-100-1.0-cairo-reference.png | Bin 1642 -> 0 bytes
...hieldsymbolizer-2-499-100-2.0-agg-reference.png | Bin 3285 -> 0 bytes
...eldsymbolizer-2-499-100-2.0-cairo-reference.png | Bin 3120 -> 0 bytes
...hieldsymbolizer-2-500-100-1.0-agg-reference.png | Bin 1556 -> 0 bytes
...eldsymbolizer-2-500-100-1.0-cairo-reference.png | Bin 1266 -> 0 bytes
...hieldsymbolizer-2-500-100-2.0-agg-reference.png | Bin 2642 -> 0 bytes
...eldsymbolizer-2-500-100-2.0-cairo-reference.png | Bin 2401 -> 0 bytes
...hieldsymbolizer-2-501-100-1.0-agg-reference.png | Bin 1738 -> 0 bytes
...eldsymbolizer-2-501-100-1.0-cairo-reference.png | Bin 1607 -> 0 bytes
...hieldsymbolizer-2-501-100-2.0-agg-reference.png | Bin 3235 -> 0 bytes
...eldsymbolizer-2-501-100-2.0-cairo-reference.png | Bin 3107 -> 0 bytes
...hieldsymbolizer-2-502-100-1.0-agg-reference.png | Bin 1727 -> 0 bytes
...eldsymbolizer-2-502-100-1.0-cairo-reference.png | Bin 1512 -> 0 bytes
...hieldsymbolizer-2-502-100-2.0-agg-reference.png | Bin 3225 -> 0 bytes
...eldsymbolizer-2-502-100-2.0-cairo-reference.png | Bin 3028 -> 0 bytes
...hieldsymbolizer-2-505-100-1.0-agg-reference.png | Bin 1659 -> 0 bytes
...eldsymbolizer-2-505-100-1.0-cairo-reference.png | Bin 1428 -> 0 bytes
...hieldsymbolizer-2-505-100-2.0-agg-reference.png | Bin 3002 -> 0 bytes
...eldsymbolizer-2-505-100-2.0-cairo-reference.png | Bin 2699 -> 0 bytes
...hieldsymbolizer-2-510-100-1.0-agg-reference.png | Bin 1576 -> 0 bytes
...eldsymbolizer-2-510-100-1.0-cairo-reference.png | Bin 1288 -> 0 bytes
...hieldsymbolizer-2-510-100-2.0-agg-reference.png | Bin 2717 -> 0 bytes
...eldsymbolizer-2-510-100-2.0-cairo-reference.png | Bin 2391 -> 0 bytes
...hieldsymbolizer-3-490-100-1.0-agg-reference.png | Bin 1484 -> 0 bytes
...eldsymbolizer-3-490-100-1.0-cairo-reference.png | Bin 1294 -> 0 bytes
...hieldsymbolizer-3-490-100-2.0-agg-reference.png | Bin 2090 -> 0 bytes
...eldsymbolizer-3-490-100-2.0-cairo-reference.png | Bin 1766 -> 0 bytes
...hieldsymbolizer-3-495-100-1.0-agg-reference.png | Bin 1539 -> 0 bytes
...eldsymbolizer-3-495-100-1.0-cairo-reference.png | Bin 1390 -> 0 bytes
...hieldsymbolizer-3-495-100-2.0-agg-reference.png | Bin 2322 -> 0 bytes
...eldsymbolizer-3-495-100-2.0-cairo-reference.png | Bin 1913 -> 0 bytes
...hieldsymbolizer-3-497-100-1.0-agg-reference.png | Bin 1707 -> 0 bytes
...eldsymbolizer-3-497-100-1.0-cairo-reference.png | Bin 1564 -> 0 bytes
...hieldsymbolizer-3-497-100-2.0-agg-reference.png | Bin 2370 -> 0 bytes
...eldsymbolizer-3-497-100-2.0-cairo-reference.png | Bin 2170 -> 0 bytes
...hieldsymbolizer-3-498-100-1.0-agg-reference.png | Bin 1680 -> 0 bytes
...eldsymbolizer-3-498-100-1.0-cairo-reference.png | Bin 1539 -> 0 bytes
...hieldsymbolizer-3-498-100-2.0-agg-reference.png | Bin 2312 -> 0 bytes
...eldsymbolizer-3-498-100-2.0-cairo-reference.png | Bin 2063 -> 0 bytes
...hieldsymbolizer-3-499-100-1.0-agg-reference.png | Bin 1678 -> 0 bytes
...eldsymbolizer-3-499-100-1.0-cairo-reference.png | Bin 1552 -> 0 bytes
...hieldsymbolizer-3-499-100-2.0-agg-reference.png | Bin 2413 -> 0 bytes
...eldsymbolizer-3-499-100-2.0-cairo-reference.png | Bin 2119 -> 0 bytes
...hieldsymbolizer-3-500-100-1.0-agg-reference.png | Bin 1494 -> 0 bytes
...eldsymbolizer-3-500-100-1.0-cairo-reference.png | Bin 1301 -> 0 bytes
...hieldsymbolizer-3-500-100-2.0-agg-reference.png | Bin 2098 -> 0 bytes
...eldsymbolizer-3-500-100-2.0-cairo-reference.png | Bin 1777 -> 0 bytes
...hieldsymbolizer-3-501-100-1.0-agg-reference.png | Bin 1730 -> 0 bytes
...eldsymbolizer-3-501-100-1.0-cairo-reference.png | Bin 1567 -> 0 bytes
...hieldsymbolizer-3-501-100-2.0-agg-reference.png | Bin 2561 -> 0 bytes
...eldsymbolizer-3-501-100-2.0-cairo-reference.png | Bin 2143 -> 0 bytes
...hieldsymbolizer-3-502-100-1.0-agg-reference.png | Bin 1682 -> 0 bytes
...eldsymbolizer-3-502-100-1.0-cairo-reference.png | Bin 1524 -> 0 bytes
...hieldsymbolizer-3-502-100-2.0-agg-reference.png | Bin 2310 -> 0 bytes
...eldsymbolizer-3-502-100-2.0-cairo-reference.png | Bin 2054 -> 0 bytes
...hieldsymbolizer-3-505-100-1.0-agg-reference.png | Bin 1548 -> 0 bytes
...eldsymbolizer-3-505-100-1.0-cairo-reference.png | Bin 1412 -> 0 bytes
...hieldsymbolizer-3-505-100-2.0-agg-reference.png | Bin 2421 -> 0 bytes
...eldsymbolizer-3-505-100-2.0-cairo-reference.png | Bin 1928 -> 0 bytes
...hieldsymbolizer-3-510-100-1.0-agg-reference.png | Bin 1496 -> 0 bytes
...eldsymbolizer-3-510-100-1.0-cairo-reference.png | Bin 1304 -> 0 bytes
...hieldsymbolizer-3-510-100-2.0-agg-reference.png | Bin 2086 -> 0 bytes
...eldsymbolizer-3-510-100-2.0-cairo-reference.png | Bin 1768 -> 0 bytes
...hieldsymbolizer-4-490-100-1.0-agg-reference.png | Bin 1600 -> 0 bytes
...eldsymbolizer-4-490-100-1.0-cairo-reference.png | Bin 1357 -> 0 bytes
...hieldsymbolizer-4-490-100-2.0-agg-reference.png | Bin 2318 -> 0 bytes
...eldsymbolizer-4-490-100-2.0-cairo-reference.png | Bin 2086 -> 0 bytes
...hieldsymbolizer-4-495-100-1.0-agg-reference.png | Bin 1674 -> 0 bytes
...eldsymbolizer-4-495-100-1.0-cairo-reference.png | Bin 1441 -> 0 bytes
...hieldsymbolizer-4-495-100-2.0-agg-reference.png | Bin 2391 -> 0 bytes
...eldsymbolizer-4-495-100-2.0-cairo-reference.png | Bin 2172 -> 0 bytes
...hieldsymbolizer-4-497-100-1.0-agg-reference.png | Bin 1735 -> 0 bytes
...eldsymbolizer-4-497-100-1.0-cairo-reference.png | Bin 1528 -> 0 bytes
...hieldsymbolizer-4-497-100-2.0-agg-reference.png | Bin 2436 -> 0 bytes
...eldsymbolizer-4-497-100-2.0-cairo-reference.png | Bin 2217 -> 0 bytes
...hieldsymbolizer-4-498-100-1.0-agg-reference.png | Bin 1705 -> 0 bytes
...eldsymbolizer-4-498-100-1.0-cairo-reference.png | Bin 1450 -> 0 bytes
...hieldsymbolizer-4-498-100-2.0-agg-reference.png | Bin 2389 -> 0 bytes
...eldsymbolizer-4-498-100-2.0-cairo-reference.png | Bin 2232 -> 0 bytes
...hieldsymbolizer-4-499-100-1.0-agg-reference.png | Bin 1702 -> 0 bytes
...eldsymbolizer-4-499-100-1.0-cairo-reference.png | Bin 1498 -> 0 bytes
...hieldsymbolizer-4-499-100-2.0-agg-reference.png | Bin 2453 -> 0 bytes
...eldsymbolizer-4-499-100-2.0-cairo-reference.png | Bin 2229 -> 0 bytes
...hieldsymbolizer-4-500-100-1.0-agg-reference.png | Bin 1576 -> 0 bytes
...eldsymbolizer-4-500-100-1.0-cairo-reference.png | Bin 1315 -> 0 bytes
...hieldsymbolizer-4-500-100-2.0-agg-reference.png | Bin 2328 -> 0 bytes
...eldsymbolizer-4-500-100-2.0-cairo-reference.png | Bin 2096 -> 0 bytes
...hieldsymbolizer-4-501-100-1.0-agg-reference.png | Bin 1725 -> 0 bytes
...eldsymbolizer-4-501-100-1.0-cairo-reference.png | Bin 1529 -> 0 bytes
...hieldsymbolizer-4-501-100-2.0-agg-reference.png | Bin 2468 -> 0 bytes
...eldsymbolizer-4-501-100-2.0-cairo-reference.png | Bin 2244 -> 0 bytes
...hieldsymbolizer-4-502-100-1.0-agg-reference.png | Bin 1719 -> 0 bytes
...eldsymbolizer-4-502-100-1.0-cairo-reference.png | Bin 1445 -> 0 bytes
...hieldsymbolizer-4-502-100-2.0-agg-reference.png | Bin 2392 -> 0 bytes
...eldsymbolizer-4-502-100-2.0-cairo-reference.png | Bin 2190 -> 0 bytes
...hieldsymbolizer-4-505-100-1.0-agg-reference.png | Bin 1665 -> 0 bytes
...eldsymbolizer-4-505-100-1.0-cairo-reference.png | Bin 1389 -> 0 bytes
...hieldsymbolizer-4-505-100-2.0-agg-reference.png | Bin 2433 -> 0 bytes
...eldsymbolizer-4-505-100-2.0-cairo-reference.png | Bin 2090 -> 0 bytes
...hieldsymbolizer-4-510-100-1.0-agg-reference.png | Bin 1597 -> 0 bytes
...eldsymbolizer-4-510-100-1.0-cairo-reference.png | Bin 1361 -> 0 bytes
...hieldsymbolizer-4-510-100-2.0-agg-reference.png | Bin 2314 -> 0 bytes
...eldsymbolizer-4-510-100-2.0-cairo-reference.png | Bin 2057 -> 0 bytes
.../images/simple-100-100-1.0-agg-reference.png | Bin 1392 -> 0 bytes
.../images/simple-100-100-1.0-cairo-reference.png | Bin 1039 -> 0 bytes
.../images/simple-100-100-2.0-agg-reference.png | Bin 1590 -> 0 bytes
.../images/simple-100-100-2.0-cairo-reference.png | Bin 1455 -> 0 bytes
.../images/simple-150-100-1.0-agg-reference.png | Bin 2024 -> 0 bytes
.../images/simple-150-100-1.0-cairo-reference.png | Bin 1472 -> 0 bytes
.../images/simple-150-100-2.0-agg-reference.png | Bin 2204 -> 0 bytes
.../images/simple-150-100-2.0-cairo-reference.png | Bin 1830 -> 0 bytes
.../images/simple-250-100-1.0-agg-reference.png | Bin 3448 -> 0 bytes
.../images/simple-250-100-1.0-cairo-reference.png | Bin 1983 -> 0 bytes
.../images/simple-250-100-2.0-agg-reference.png | Bin 3460 -> 0 bytes
.../images/simple-250-100-2.0-cairo-reference.png | Bin 2416 -> 0 bytes
.../images/simple-300-100-1.0-agg-reference.png | Bin 3552 -> 0 bytes
.../images/simple-300-100-1.0-cairo-reference.png | Bin 2052 -> 0 bytes
.../images/simple-300-100-2.0-agg-reference.png | Bin 4070 -> 0 bytes
.../images/simple-300-100-2.0-cairo-reference.png | Bin 2905 -> 0 bytes
.../images/simple-400-100-1.0-agg-reference.png | Bin 4044 -> 0 bytes
.../images/simple-400-100-1.0-cairo-reference.png | Bin 2149 -> 0 bytes
.../images/simple-400-100-2.0-agg-reference.png | Bin 6023 -> 0 bytes
.../images/simple-400-100-2.0-cairo-reference.png | Bin 3755 -> 0 bytes
.../images/simple-600-100-1.0-agg-reference.png | Bin 4331 -> 0 bytes
.../images/simple-600-100-1.0-cairo-reference.png | Bin 2246 -> 0 bytes
.../images/simple-600-100-2.0-agg-reference.png | Bin 6628 -> 0 bytes
.../images/simple-600-100-2.0-cairo-reference.png | Bin 3880 -> 0 bytes
.../images/simple-800-100-1.0-agg-reference.png | Bin 4212 -> 0 bytes
.../images/simple-800-100-1.0-cairo-reference.png | Bin 2416 -> 0 bytes
.../images/simple-800-100-2.0-agg-reference.png | Bin 6685 -> 0 bytes
.../images/simple-800-100-2.0-cairo-reference.png | Bin 3895 -> 0 bytes
.../images/simple-E-500-100-1.0-agg-reference.png | Bin 838 -> 0 bytes
.../simple-E-500-100-1.0-cairo-reference.png | Bin 782 -> 0 bytes
.../images/simple-E-500-100-2.0-agg-reference.png | Bin 1359 -> 0 bytes
.../simple-E-500-100-2.0-cairo-reference.png | Bin 1233 -> 0 bytes
.../images/simple-N-500-100-1.0-agg-reference.png | Bin 839 -> 0 bytes
.../simple-N-500-100-1.0-cairo-reference.png | Bin 791 -> 0 bytes
.../images/simple-N-500-100-2.0-agg-reference.png | Bin 1354 -> 0 bytes
.../simple-N-500-100-2.0-cairo-reference.png | Bin 1237 -> 0 bytes
.../images/simple-NE-500-100-1.0-agg-reference.png | Bin 843 -> 0 bytes
.../simple-NE-500-100-1.0-cairo-reference.png | Bin 789 -> 0 bytes
.../images/simple-NE-500-100-2.0-agg-reference.png | Bin 1381 -> 0 bytes
.../simple-NE-500-100-2.0-cairo-reference.png | Bin 1241 -> 0 bytes
.../images/simple-NW-500-100-1.0-agg-reference.png | Bin 844 -> 0 bytes
.../simple-NW-500-100-1.0-cairo-reference.png | Bin 798 -> 0 bytes
.../images/simple-NW-500-100-2.0-agg-reference.png | Bin 1365 -> 0 bytes
.../simple-NW-500-100-2.0-cairo-reference.png | Bin 1242 -> 0 bytes
.../images/simple-S-500-100-1.0-agg-reference.png | Bin 839 -> 0 bytes
.../simple-S-500-100-1.0-cairo-reference.png | Bin 791 -> 0 bytes
.../images/simple-S-500-100-2.0-agg-reference.png | Bin 1355 -> 0 bytes
.../simple-S-500-100-2.0-cairo-reference.png | Bin 1237 -> 0 bytes
.../images/simple-SE-500-100-1.0-agg-reference.png | Bin 843 -> 0 bytes
.../simple-SE-500-100-1.0-cairo-reference.png | Bin 789 -> 0 bytes
.../images/simple-SE-500-100-2.0-agg-reference.png | Bin 1384 -> 0 bytes
.../simple-SE-500-100-2.0-cairo-reference.png | Bin 1241 -> 0 bytes
.../images/simple-SW-500-100-1.0-agg-reference.png | Bin 844 -> 0 bytes
.../simple-SW-500-100-1.0-cairo-reference.png | Bin 798 -> 0 bytes
.../images/simple-SW-500-100-2.0-agg-reference.png | Bin 1369 -> 0 bytes
.../simple-SW-500-100-2.0-cairo-reference.png | Bin 1245 -> 0 bytes
.../images/simple-W-500-100-1.0-agg-reference.png | Bin 845 -> 0 bytes
.../simple-W-500-100-1.0-cairo-reference.png | Bin 804 -> 0 bytes
.../images/simple-W-500-100-2.0-agg-reference.png | Bin 1346 -> 0 bytes
.../simple-W-500-100-2.0-cairo-reference.png | Bin 1248 -> 0 bytes
.../simple-shield-600-400-1.0-agg-reference.png | Bin 4529 -> 0 bytes
.../simple-shield-600-400-1.0-cairo-reference.png | Bin 124 -> 0 bytes
.../simple-shield-600-400-2.0-agg-reference.png | Bin 6903 -> 0 bytes
.../simple-shield-600-400-2.0-cairo-reference.png | Bin 124 -> 0 bytes
...ositing-tiled-0,0-512-512-1.0-agg-reference.png | Bin 35229 -> 0 bytes
...iting-tiled-0,0-512-512-1.0-cairo-reference.png | Bin 18826 -> 0 bytes
...ositing-tiled-0,0-512-512-2.0-agg-reference.png | Bin 35229 -> 0 bytes
...iting-tiled-0,0-512-512-2.0-cairo-reference.png | Bin 18826 -> 0 bytes
...ositing-tiled-0,1-512-512-1.0-agg-reference.png | Bin 7897 -> 0 bytes
...iting-tiled-0,1-512-512-1.0-cairo-reference.png | Bin 2583 -> 0 bytes
...ositing-tiled-0,1-512-512-2.0-agg-reference.png | Bin 7897 -> 0 bytes
...iting-tiled-0,1-512-512-2.0-cairo-reference.png | Bin 2583 -> 0 bytes
...ositing-tiled-1,0-512-512-1.0-agg-reference.png | Bin 29887 -> 0 bytes
...iting-tiled-1,0-512-512-1.0-cairo-reference.png | Bin 22728 -> 0 bytes
...ositing-tiled-1,0-512-512-2.0-agg-reference.png | Bin 29887 -> 0 bytes
...iting-tiled-1,0-512-512-2.0-cairo-reference.png | Bin 22728 -> 0 bytes
...ositing-tiled-1,1-512-512-1.0-agg-reference.png | Bin 9013 -> 0 bytes
...iting-tiled-1,1-512-512-1.0-cairo-reference.png | Bin 6432 -> 0 bytes
...ositing-tiled-1,1-512-512-2.0-agg-reference.png | Bin 9013 -> 0 bytes
...iting-tiled-1,1-512-512-2.0-cairo-reference.png | Bin 6432 -> 0 bytes
...llow-overlap-expr-500-500-1.0-agg-reference.png | Bin 2582 -> 0 bytes
...ow-overlap-expr-500-500-1.0-cairo-reference.png | Bin 2544 -> 0 bytes
...llow-overlap-expr-500-500-2.0-agg-reference.png | Bin 4100 -> 0 bytes
...ow-overlap-expr-500-500-2.0-cairo-reference.png | Bin 4099 -> 0 bytes
.../text-bengali-800-100-1.0-agg-reference.png | Bin 947 -> 0 bytes
.../text-bengali-800-100-1.0-cairo-reference.png | Bin 918 -> 0 bytes
.../text-bengali-800-100-2.0-agg-reference.png | Bin 1915 -> 0 bytes
.../text-bengali-800-100-2.0-cairo-reference.png | Bin 1828 -> 0 bytes
.../text-bug1532-600-165-1.0-agg-reference.png | Bin 3489 -> 0 bytes
.../text-bug1532-600-165-1.0-cairo-reference.png | Bin 2770 -> 0 bytes
.../text-bug1532-600-165-2.0-agg-reference.png | Bin 4858 -> 0 bytes
.../text-bug1532-600-165-2.0-cairo-reference.png | Bin 4487 -> 0 bytes
.../text-bug1533-600-600-1.0-agg-reference.png | Bin 6948 -> 0 bytes
.../text-bug1533-600-600-1.0-cairo-reference.png | Bin 6563 -> 0 bytes
.../text-bug1533-600-600-2.0-agg-reference.png | Bin 10636 -> 0 bytes
.../text-bug1533-600-600-2.0-cairo-reference.png | Bin 9661 -> 0 bytes
.../text-bug1820+0-600-300-1.0-agg-reference.png | Bin 3870 -> 0 bytes
.../text-bug1820+0-600-300-1.0-cairo-reference.png | Bin 2915 -> 0 bytes
.../text-bug1820+0-600-300-2.0-agg-reference.png | Bin 4399 -> 0 bytes
.../text-bug1820+0-600-300-2.0-cairo-reference.png | Bin 3360 -> 0 bytes
.../text-bug1820+1-600-300-1.0-agg-reference.png | Bin 3576 -> 0 bytes
.../text-bug1820+1-600-300-1.0-cairo-reference.png | Bin 2793 -> 0 bytes
.../text-bug1820+1-600-300-2.0-agg-reference.png | Bin 4270 -> 0 bytes
.../text-bug1820+1-600-300-2.0-cairo-reference.png | Bin 3247 -> 0 bytes
.../text-bug1820-1-600-300-1.0-agg-reference.png | Bin 3839 -> 0 bytes
.../text-bug1820-1-600-300-1.0-cairo-reference.png | Bin 2934 -> 0 bytes
.../text-bug1820-1-600-300-2.0-agg-reference.png | Bin 4411 -> 0 bytes
.../text-bug1820-1-600-300-2.0-cairo-reference.png | Bin 3333 -> 0 bytes
.../text-bug2037-800-300-1.0-agg-reference.png | Bin 3637 -> 0 bytes
.../text-bug2037-800-300-1.0-cairo-reference.png | Bin 2732 -> 0 bytes
.../text-bug2037-800-300-2.0-agg-reference.png | Bin 5469 -> 0 bytes
.../text-bug2037-800-300-2.0-cairo-reference.png | Bin 4802 -> 0 bytes
...ext-charplacement-512-512-1.0-agg-reference.png | Bin 23940 -> 0 bytes
...t-charplacement-512-512-1.0-cairo-reference.png | Bin 22084 -> 0 bytes
...ext-charplacement-512-512-2.0-agg-reference.png | Bin 15457 -> 0 bytes
...t-charplacement-512-512-2.0-cairo-reference.png | Bin 15507 -> 0 bytes
...text-data-binding-500-500-1.0-agg-reference.png | Bin 29338 -> 0 bytes
...xt-data-binding-500-500-1.0-cairo-reference.png | Bin 27736 -> 0 bytes
...text-data-binding-500-500-2.0-agg-reference.png | Bin 24320 -> 0 bytes
...xt-data-binding-500-500-2.0-cairo-reference.png | Bin 24473 -> 0 bytes
...text-displacement-512-512-1.0-agg-reference.png | Bin 14707 -> 0 bytes
...xt-displacement-512-512-1.0-cairo-reference.png | Bin 14707 -> 0 bytes
...text-displacement-512-512-2.0-agg-reference.png | Bin 13790 -> 0 bytes
...xt-displacement-512-512-2.0-cairo-reference.png | Bin 13315 -> 0 bytes
...ssionformat-color-800-100-1.0-agg-reference.png | Bin 3002 -> 0 bytes
...ionformat-color-800-100-1.0-cairo-reference.png | Bin 2672 -> 0 bytes
...ssionformat-color-800-100-2.0-agg-reference.png | Bin 1539 -> 0 bytes
...ionformat-color-800-100-2.0-cairo-reference.png | Bin 1549 -> 0 bytes
...ext-font-features-500-500-1.0-agg-reference.png | Bin 4987 -> 0 bytes
...t-font-features-500-500-1.0-cairo-reference.png | Bin 3983 -> 0 bytes
...ext-font-features-500-500-2.0-agg-reference.png | Bin 8956 -> 0 bytes
...t-font-features-500-500-2.0-cairo-reference.png | Bin 6718 -> 0 bytes
.../text-halign-800-800-1.0-agg-reference.png | Bin 35936 -> 0 bytes
.../text-halign-800-800-1.0-cairo-reference.png | Bin 34681 -> 0 bytes
.../text-halign-800-800-2.0-agg-reference.png | Bin 48147 -> 0 bytes
.../text-halign-800-800-2.0-cairo-reference.png | Bin 47404 -> 0 bytes
...ext-halign-adjust-800-800-1.0-agg-reference.png | Bin 30677 -> 0 bytes
...t-halign-adjust-800-800-1.0-cairo-reference.png | Bin 30233 -> 0 bytes
...ext-halign-adjust-800-800-2.0-agg-reference.png | Bin 41042 -> 0 bytes
...t-halign-adjust-800-800-2.0-cairo-reference.png | Bin 40049 -> 0 bytes
...-adjust-multiline-800-800-1.0-agg-reference.png | Bin 36295 -> 0 bytes
...djust-multiline-800-800-1.0-cairo-reference.png | Bin 35419 -> 0 bytes
...-adjust-multiline-800-800-2.0-agg-reference.png | Bin 40801 -> 0 bytes
...djust-multiline-800-800-2.0-cairo-reference.png | Bin 39525 -> 0 bytes
...text-halo-opacity-512-512-1.0-agg-reference.png | Bin 9002 -> 0 bytes
...xt-halo-opacity-512-512-1.0-cairo-reference.png | Bin 8653 -> 0 bytes
...text-halo-opacity-512-512-2.0-agg-reference.png | Bin 17095 -> 0 bytes
...xt-halo-opacity-512-512-2.0-cairo-reference.png | Bin 17005 -> 0 bytes
...t-halo-rasterizer-600-400-1.0-agg-reference.png | Bin 8934 -> 0 bytes
...halo-rasterizer-600-400-1.0-cairo-reference.png | Bin 7840 -> 0 bytes
...t-halo-rasterizer-600-400-2.0-agg-reference.png | Bin 16296 -> 0 bytes
...halo-rasterizer-600-400-2.0-cairo-reference.png | Bin 14181 -> 0 bytes
...xt-halo-transform-600-400-1.0-agg-reference.png | Bin 11174 -> 0 bytes
...-halo-transform-600-400-1.0-cairo-reference.png | Bin 7840 -> 0 bytes
...xt-halo-transform-600-400-2.0-agg-reference.png | Bin 21247 -> 0 bytes
...-halo-transform-600-400-2.0-cairo-reference.png | Bin 14181 -> 0 bytes
.../text-line-wrap-512-512-1.0-agg-reference.png | Bin 2961 -> 0 bytes
.../text-line-wrap-512-512-1.0-cairo-reference.png | Bin 2923 -> 0 bytes
.../text-line-wrap-512-512-2.0-agg-reference.png | Bin 4904 -> 0 bytes
.../text-line-wrap-512-512-2.0-cairo-reference.png | Bin 4573 -> 0 bytes
.../text-malayalam-800-100-1.0-agg-reference.png | Bin 1176 -> 0 bytes
.../text-malayalam-800-100-1.0-cairo-reference.png | Bin 1174 -> 0 bytes
.../text-malayalam-800-100-2.0-agg-reference.png | Bin 2102 -> 0 bytes
.../text-malayalam-800-100-2.0-cairo-reference.png | Bin 2092 -> 0 bytes
...xt-multi-layout-1-512-512-1.0-agg-reference.png | Bin 4943 -> 0 bytes
...-multi-layout-1-512-512-1.0-cairo-reference.png | Bin 4816 -> 0 bytes
...xt-multi-layout-1-512-512-2.0-agg-reference.png | Bin 7344 -> 0 bytes
...-multi-layout-1-512-512-2.0-cairo-reference.png | Bin 7209 -> 0 bytes
...xt-multi-layout-2-512-512-1.0-agg-reference.png | Bin 13211 -> 0 bytes
...-multi-layout-2-512-512-1.0-cairo-reference.png | Bin 11620 -> 0 bytes
...xt-multi-layout-2-512-512-2.0-agg-reference.png | Bin 26253 -> 0 bytes
...-multi-layout-2-512-512-2.0-cairo-reference.png | Bin 22769 -> 0 bytes
.../text-overlap-512-512-1.0-agg-reference.png | Bin 14783 -> 0 bytes
.../text-overlap-512-512-1.0-cairo-reference.png | Bin 13491 -> 0 bytes
.../text-overlap-512-512-2.0-agg-reference.png | Bin 16178 -> 0 bytes
.../text-overlap-512-512-2.0-cairo-reference.png | Bin 14062 -> 0 bytes
.../text-spacing-512-512-1.0-agg-reference.png | Bin 17440 -> 0 bytes
.../text-spacing-512-512-1.0-cairo-reference.png | Bin 17283 -> 0 bytes
.../text-spacing-512-512-2.0-agg-reference.png | Bin 27687 -> 0 bytes
.../text-spacing-512-512-2.0-cairo-reference.png | Bin 26512 -> 0 bytes
.../text-ttc-font-600-400-1.0-agg-reference.png | Bin 25323 -> 0 bytes
.../text-ttc-font-600-400-1.0-cairo-reference.png | Bin 24269 -> 0 bytes
.../text-ttc-font-600-400-2.0-agg-reference.png | Bin 43765 -> 0 bytes
.../text-ttc-font-600-400-2.0-cairo-reference.png | Bin 45820 -> 0 bytes
.../text-typographic-512-512-1.0-agg-reference.png | Bin 30377 -> 0 bytes
...ext-typographic-512-512-1.0-cairo-reference.png | Bin 26247 -> 0 bytes
.../text-typographic-512-512-2.0-agg-reference.png | Bin 35527 -> 0 bytes
...ext-typographic-512-512-2.0-cairo-reference.png | Bin 34586 -> 0 bytes
...ertical-alignment-800-800-1.0-agg-reference.png | Bin 49442 -> 0 bytes
...tical-alignment-800-800-1.0-cairo-reference.png | Bin 48050 -> 0 bytes
...ertical-alignment-800-800-2.0-agg-reference.png | Bin 76902 -> 0 bytes
...tical-alignment-800-800-2.0-cairo-reference.png | Bin 74537 -> 0 bytes
...-assoc-alpha-gdal-600-400-1.0-agg-reference.png | Bin 909 -> 0 bytes
...ssoc-alpha-gdal-600-400-1.0-cairo-reference.png | Bin 909 -> 0 bytes
...-assoc-alpha-gdal-600-400-2.0-agg-reference.png | Bin 909 -> 0 bytes
...ssoc-alpha-gdal-600-400-2.0-cairo-reference.png | Bin 909 -> 0 bytes
.../tiff-alpha-gdal-600-400-1.0-agg-reference.png | Bin 909 -> 0 bytes
...tiff-alpha-gdal-600-400-1.0-cairo-reference.png | Bin 909 -> 0 bytes
.../tiff-alpha-gdal-600-400-2.0-agg-reference.png | Bin 909 -> 0 bytes
...tiff-alpha-gdal-600-400-2.0-cairo-reference.png | Bin 909 -> 0 bytes
...pha-gradient-gdal-600-400-1.0-agg-reference.png | Bin 8398 -> 0 bytes
...a-gradient-gdal-600-400-1.0-cairo-reference.png | Bin 8398 -> 0 bytes
...pha-gradient-gdal-600-400-2.0-agg-reference.png | Bin 8398 -> 0 bytes
...a-gradient-gdal-600-400-2.0-cairo-reference.png | Bin 8398 -> 0 bytes
...e-alignment-gdal1-255-257-1.0-agg-reference.png | Bin 22814 -> 0 bytes
...alignment-gdal1-255-257-1.0-cairo-reference.png | Bin 22814 -> 0 bytes
...e-alignment-gdal1-255-257-2.0-agg-reference.png | Bin 22814 -> 0 bytes
...alignment-gdal1-255-257-2.0-cairo-reference.png | Bin 22814 -> 0 bytes
...e-alignment-gdal1-256-256-1.0-agg-reference.png | Bin 23024 -> 0 bytes
...alignment-gdal1-256-256-1.0-cairo-reference.png | Bin 23024 -> 0 bytes
...e-alignment-gdal1-256-256-2.0-agg-reference.png | Bin 23024 -> 0 bytes
...alignment-gdal1-256-256-2.0-cairo-reference.png | Bin 23024 -> 0 bytes
...e-alignment-gdal2-255-257-1.0-agg-reference.png | Bin 19824 -> 0 bytes
...alignment-gdal2-255-257-1.0-cairo-reference.png | Bin 19824 -> 0 bytes
...e-alignment-gdal2-255-257-2.0-agg-reference.png | Bin 19824 -> 0 bytes
...alignment-gdal2-255-257-2.0-cairo-reference.png | Bin 19824 -> 0 bytes
...e-alignment-gdal2-256-256-1.0-agg-reference.png | Bin 19572 -> 0 bytes
...alignment-gdal2-256-256-1.0-cairo-reference.png | Bin 19572 -> 0 bytes
...e-alignment-gdal2-256-256-2.0-agg-reference.png | Bin 19572 -> 0 bytes
...alignment-gdal2-256-256-2.0-cairo-reference.png | Bin 19572 -> 0 bytes
...-nodata-edge-gdal-600-400-1.0-agg-reference.png | Bin 70934 -> 0 bytes
...odata-edge-gdal-600-400-1.0-cairo-reference.png | Bin 70934 -> 0 bytes
...-nodata-edge-gdal-600-400-2.0-agg-reference.png | Bin 70934 -> 0 bytes
...odata-edge-gdal-600-400-2.0-cairo-reference.png | Bin 70934 -> 0 bytes
...-nodata-edge-gdal-969-793-1.0-agg-reference.png | Bin 87085 -> 0 bytes
...odata-edge-gdal-969-793-1.0-cairo-reference.png | Bin 87085 -> 0 bytes
...-nodata-edge-gdal-969-793-2.0-agg-reference.png | Bin 87085 -> 0 bytes
...odata-edge-gdal-969-793-2.0-cairo-reference.png | Bin 87085 -> 0 bytes
...-nodata-edge-rgba-500-100-1.0-agg-reference.png | Bin 4079 -> 0 bytes
...odata-edge-rgba-500-100-1.0-cairo-reference.png | Bin 4090 -> 0 bytes
...-nodata-edge-rgba-500-100-2.0-agg-reference.png | Bin 4079 -> 0 bytes
...odata-edge-rgba-500-100-2.0-cairo-reference.png | Bin 4090 -> 0 bytes
...-nodata-edge-rgba-512-512-1.0-agg-reference.png | Bin 42545 -> 0 bytes
...odata-edge-rgba-512-512-1.0-cairo-reference.png | Bin 42555 -> 0 bytes
...-nodata-edge-rgba-512-512-2.0-agg-reference.png | Bin 42545 -> 0 bytes
...odata-edge-rgba-512-512-2.0-cairo-reference.png | Bin 42555 -> 0 bytes
.../tiff-nodata-rgb-512-512-1.0-agg-reference.png | Bin 52592 -> 0 bytes
...tiff-nodata-rgb-512-512-1.0-cairo-reference.png | Bin 52217 -> 0 bytes
.../tiff-nodata-rgb-512-512-2.0-agg-reference.png | Bin 52592 -> 0 bytes
...tiff-nodata-rgb-512-512-2.0-cairo-reference.png | Bin 52217 -> 0 bytes
.../tiff-nodata-rgba-512-512-1.0-agg-reference.png | Bin 55015 -> 0 bytes
...iff-nodata-rgba-512-512-1.0-cairo-reference.png | Bin 55557 -> 0 bytes
.../tiff-nodata-rgba-512-512-2.0-agg-reference.png | Bin 55015 -> 0 bytes
...iff-nodata-rgba-512-512-2.0-cairo-reference.png | Bin 55557 -> 0 bytes
...-nodata-tolerance-512-512-1.0-agg-reference.png | Bin 27842 -> 0 bytes
...odata-tolerance-512-512-1.0-cairo-reference.png | Bin 27842 -> 0 bytes
...-nodata-tolerance-512-512-2.0-agg-reference.png | Bin 27842 -> 0 bytes
...odata-tolerance-512-512-2.0-cairo-reference.png | Bin 27842 -> 0 bytes
...-opaque-edge-gdal-256-256-1.0-agg-reference.png | Bin 3348 -> 0 bytes
...paque-edge-gdal-256-256-1.0-cairo-reference.png | Bin 3348 -> 0 bytes
...-opaque-edge-gdal-256-256-2.0-agg-reference.png | Bin 3348 -> 0 bytes
...paque-edge-gdal-256-256-2.0-cairo-reference.png | Bin 3348 -> 0 bytes
...-opaque-edge-gdal-969-793-1.0-agg-reference.png | Bin 8907 -> 0 bytes
...paque-edge-gdal-969-793-1.0-cairo-reference.png | Bin 8907 -> 0 bytes
...-opaque-edge-gdal-969-793-2.0-agg-reference.png | Bin 8907 -> 0 bytes
...paque-edge-gdal-969-793-2.0-cairo-reference.png | Bin 8907 -> 0 bytes
...opaque-edge-gdal2-600-400-1.0-agg-reference.png | Bin 8177 -> 0 bytes
...aque-edge-gdal2-600-400-1.0-cairo-reference.png | Bin 8177 -> 0 bytes
...opaque-edge-gdal2-600-400-2.0-agg-reference.png | Bin 8177 -> 0 bytes
...aque-edge-gdal2-600-400-2.0-cairo-reference.png | Bin 8177 -> 0 bytes
...opaque-edge-gdal2-969-793-1.0-agg-reference.png | Bin 8907 -> 0 bytes
...aque-edge-gdal2-969-793-1.0-cairo-reference.png | Bin 8907 -> 0 bytes
...opaque-edge-gdal2-969-793-2.0-agg-reference.png | Bin 8907 -> 0 bytes
...aque-edge-gdal2-969-793-2.0-cairo-reference.png | Bin 8907 -> 0 bytes
...aque-edge-raster2-600-400-1.0-agg-reference.png | Bin 8179 -> 0 bytes
...ue-edge-raster2-600-400-1.0-cairo-reference.png | Bin 8179 -> 0 bytes
...aque-edge-raster2-600-400-2.0-agg-reference.png | Bin 8179 -> 0 bytes
...ue-edge-raster2-600-400-2.0-cairo-reference.png | Bin 8179 -> 0 bytes
...aque-edge-raster2-969-793-1.0-agg-reference.png | Bin 8907 -> 0 bytes
...ue-edge-raster2-969-793-1.0-cairo-reference.png | Bin 8907 -> 0 bytes
...aque-edge-raster2-969-793-2.0-agg-reference.png | Bin 8907 -> 0 bytes
...ue-edge-raster2-969-793-2.0-cairo-reference.png | Bin 8907 -> 0 bytes
...ff-reprojection-1-250-250-1.0-agg-reference.png | Bin 14764 -> 0 bytes
...-reprojection-1-250-250-1.0-cairo-reference.png | Bin 14764 -> 0 bytes
...ff-reprojection-1-250-250-2.0-agg-reference.png | Bin 14764 -> 0 bytes
...-reprojection-1-250-250-2.0-cairo-reference.png | Bin 14764 -> 0 bytes
...ff-reprojection-2-250-250-1.0-agg-reference.png | Bin 13392 -> 0 bytes
...-reprojection-2-250-250-1.0-cairo-reference.png | Bin 13392 -> 0 bytes
...ff-reprojection-2-250-250-2.0-agg-reference.png | Bin 13392 -> 0 bytes
...-reprojection-2-250-250-2.0-cairo-reference.png | Bin 13392 -> 0 bytes
.../tiff-resampling-600-400-1.0-agg-reference.png | Bin 10240 -> 0 bytes
...tiff-resampling-600-400-1.0-cairo-reference.png | Bin 10377 -> 0 bytes
.../tiff-resampling-600-400-2.0-agg-reference.png | Bin 10240 -> 0 bytes
...tiff-resampling-600-400-2.0-cairo-reference.png | Bin 10377 -> 0 bytes
.../tiff_colortable-256-256-1.0-agg-reference.png | Bin 3639 -> 0 bytes
...tiff_colortable-256-256-1.0-cairo-reference.png | Bin 3639 -> 0 bytes
.../tiff_colortable-256-256-2.0-agg-reference.png | Bin 3639 -> 0 bytes
...tiff_colortable-256-256-2.0-cairo-reference.png | Bin 3639 -> 0 bytes
...ble_custom_nodata-256-256-1.0-agg-reference.png | Bin 3717 -> 0 bytes
...e_custom_nodata-256-256-1.0-cairo-reference.png | Bin 3717 -> 0 bytes
...ble_custom_nodata-256-256-2.0-agg-reference.png | Bin 3717 -> 0 bytes
...e_custom_nodata-256-256-2.0-cairo-reference.png | Bin 3717 -> 0 bytes
.../vrt_colortable-256-256-1.0-agg-reference.png | Bin 1863 -> 0 bytes
.../vrt_colortable-256-256-1.0-cairo-reference.png | Bin 1863 -> 0 bytes
.../vrt_colortable-256-256-2.0-agg-reference.png | Bin 1863 -> 0 bytes
.../vrt_colortable-256-256-2.0-cairo-reference.png | Bin 1863 -> 0 bytes
.../whole-centroid-600-400-1.0-agg-reference.png | Bin 6876 -> 0 bytes
.../whole-centroid-600-400-1.0-cairo-reference.png | Bin 6919 -> 0 bytes
.../whole-centroid-600-400-2.0-agg-reference.png | Bin 8278 -> 0 bytes
.../whole-centroid-600-400-2.0-cairo-reference.png | Bin 8215 -> 0 bytes
.../styles/building-symbolizer-opacity.xml | 21 -
tests/visual_tests/styles/charspacing-lines.xml | 37 -
tests/visual_tests/styles/charspacing.xml | 33 -
tests/visual_tests/styles/collision.xml | 44 -
tests/visual_tests/styles/colorize-alpha1.xml | 49 -
tests/visual_tests/styles/colorize-alpha2.xml | 49 -
tests/visual_tests/styles/colorize-alpha3.xml | 49 -
tests/visual_tests/styles/colorize-alpha4.xml | 49 -
tests/visual_tests/styles/dst-over-compositing.xml | 19 -
tests/visual_tests/styles/expressionformat.xml | 22 -
tests/visual_tests/styles/formatting-1.xml | 22 -
tests/visual_tests/styles/formatting-2.xml | 22 -
tests/visual_tests/styles/formatting-3.xml | 22 -
tests/visual_tests/styles/formatting-4.xml | 21 -
tests/visual_tests/styles/formatting-5.xml | 25 -
tests/visual_tests/styles/formatting-6.xml | 28 -
tests/visual_tests/styles/formatting-7.xml | 25 -
tests/visual_tests/styles/formatting-8.xml | 25 -
.../styles/formatting-expr-alignment.xml | 37 -
tests/visual_tests/styles/formatting.xml | 21 -
.../styles/functional-expressions-length.xml | 116 -
.../visual_tests/styles/functional-expressions.xml | 64 -
tests/visual_tests/styles/gdal-filter-factor.xml | 17 -
.../styles/geometry-transform-scale-patterns.xml | 67 -
.../styles/geometry-transform-scale.xml | 60 -
.../geometry-transform-translate-patterns-svg.xml | 106 -
.../geometry-transform-translate-patterns.xml | 99 -
.../styles/geometry-transform-translate.xml | 100 -
tests/visual_tests/styles/group-symbolizer-1.xml | 68 -
tests/visual_tests/styles/group-symbolizer-2.xml | 114 -
tests/visual_tests/styles/group-symbolizer-3.xml | 87 -
.../styles/group-symbolizer-line-1.xml | 85 -
.../styles/group-symbolizer-line-2.xml | 106 -
.../styles/halo-comp-op-on-satellite.xml | 102 -
tests/visual_tests/styles/harfbuzz.xml | 44 -
tests/visual_tests/styles/hb-fontsets.xml | 48 -
tests/visual_tests/styles/image-filters-galore.xml | 31 -
.../styles/image-filters-multi-blur-inflate.xml | 31 -
.../styles/image-filters-multi-blur.xml | 31 -
tests/visual_tests/styles/jalign-auto.xml | 30 -
tests/visual_tests/styles/khmer.xml | 38 -
tests/visual_tests/styles/line-offset.xml | 29 -
.../styles/line-opacity-multi-render.xml | 80 -
.../styles/line-pattern-smooth-and-offset.xml | 26 -
.../styles/line-pattern-symbolizer-opacity.xml | 21 -
.../styles/line-pattern-symbolizer.xml | 28 -
.../visual_tests/styles/line-smooth-and-offset.xml | 22 -
.../styles/line-symbolizer-expressions-all.xml | 91 -
.../styles/line-symbolizer-expressions.xml | 71 -
tests/visual_tests/styles/line_break.xml | 36 -
tests/visual_tests/styles/lines-1.xml | 21 -
tests/visual_tests/styles/lines-2.xml | 21 -
tests/visual_tests/styles/lines-3.xml | 21 -
tests/visual_tests/styles/lines-4.xml | 27 -
tests/visual_tests/styles/lines-5.xml | 31 -
tests/visual_tests/styles/lines-6.xml | 36 -
tests/visual_tests/styles/lines-7.xml | 35 -
tests/visual_tests/styles/lines-multi-layout-1.xml | 34 -
tests/visual_tests/styles/lines-multi-layout-2.xml | 33 -
.../styles/lines-multi-layout-shield.xml | 33 -
tests/visual_tests/styles/lines-shield.xml | 21 -
tests/visual_tests/styles/list.xml | 24 -
.../styles/map-background-image-compositing.xml | 54 -
tests/visual_tests/styles/marker-collide.xml | 52 -
.../styles/marker-interior-position.xml | 25 -
tests/visual_tests/styles/marker-multi-policy.xml | 36 -
tests/visual_tests/styles/marker-on-hex-grid.xml | 25 -
.../styles/marker-on-line-and-avoid-edges.xml | 49 -
.../styles/marker-on-line-and-line-placement.xml | 28 -
.../marker-on-line-and-vertex-first-placement.xml | 28 -
.../marker-on-line-and-vertex-last-placement.xml | 28 -
.../marker-on-line-spacing-eq-width-overlap.xml | 54 -
.../styles/marker-on-line-spacing-eq-width.xml | 53 -
tests/visual_tests/styles/marker-on-line.xml | 22 -
.../visual_tests/styles/marker-path-expression.xml | 43 -
.../styles/marker-recenter-collide.xml | 25 -
.../styles/marker-svg-empty-g-element.xml | 43 -
tests/visual_tests/styles/marker-svg-opacity.xml | 58 -
tests/visual_tests/styles/marker-svg-opacity2.xml | 42 -
.../styles/marker-symbolizer-expressions-all.xml | 81 -
tests/visual_tests/styles/marker-vs-point.xml | 74 -
.../styles/marker-whole-multi-polygon.xml | 17 -
...er-with-background-image-and-hsla-transform.xml | 69 -
...marker-with-background-image-linear-comp-op.xml | 67 -
.../styles/marker-with-background-image.xml | 66 -
.../styles/marker_line_placement_on_points.xml | 36 -
tests/visual_tests/styles/orientation.xml | 66 -
.../styles/point-symbolizer-expressions-all.xml | 80 -
.../styles/point-symbolizer-expressions.xml | 56 -
.../point-symbolizer-overlap-placement-expr.xml | 75 -
.../styles/polygon-symbolizer-expressions-all.xml | 71 -
.../styles/polygon-symbolizer-expressions.xml | 66 -
.../visual_tests/styles/polygon-winding-order.xml | 61 -
tests/visual_tests/styles/postgis-inline.xml | 44 -
.../visual_tests/styles/raster-color-to-alpha1.xml | 19 -
.../visual_tests/styles/raster-color-to-alpha2.xml | 20 -
.../visual_tests/styles/raster-color-to-alpha3.xml | 20 -
.../visual_tests/styles/raster-color-to-alpha4.xml | 27 -
.../visual_tests/styles/raster-color-to-alpha5.xml | 27 -
tests/visual_tests/styles/raster_colorizer.xml | 71 -
tests/visual_tests/styles/raster_symbolizer.xml | 35 -
tests/visual_tests/styles/repeat-labels-1.xml | 43 -
tests/visual_tests/styles/repeat-labels-2.xml | 43 -
tests/visual_tests/styles/repeat-labels-3.xml | 43 -
tests/visual_tests/styles/repeat-labels-4.xml | 43 -
.../styles/road-casings-grouped-rendering.xml | 69 -
.../styles/road-casings-non-grouped-rendering.xml | 67 -
tests/visual_tests/styles/rtl-point.xml | 21 -
.../styles/shield-on-line-and-avoid-edges.xml | 33 -
.../styles/shield-on-line-spacing-eq-width.xml | 99 -
tests/visual_tests/styles/shield-on-polygon.xml | 49 -
tests/visual_tests/styles/shieldsymbolizer-1.xml | 60 -
tests/visual_tests/styles/shieldsymbolizer-2.xml | 60 -
tests/visual_tests/styles/shieldsymbolizer-3.xml | 60 -
tests/visual_tests/styles/shieldsymbolizer-4.xml | 63 -
tests/visual_tests/styles/simple-E.xml | 21 -
tests/visual_tests/styles/simple-N.xml | 21 -
tests/visual_tests/styles/simple-NE.xml | 21 -
tests/visual_tests/styles/simple-NW.xml | 21 -
tests/visual_tests/styles/simple-S.xml | 21 -
tests/visual_tests/styles/simple-SE.xml | 21 -
tests/visual_tests/styles/simple-SW.xml | 21 -
tests/visual_tests/styles/simple-W.xml | 21 -
tests/visual_tests/styles/simple-shield.xml | 32 -
tests/visual_tests/styles/simple.xml | 20 -
.../styles/style-level-compositing-tiled-0,0.xml | 30 -
.../styles/style-level-compositing-tiled-0,1.xml | 30 -
.../styles/style-level-compositing-tiled-1,0.xml | 30 -
.../styles/style-level-compositing-tiled-1,1.xml | 30 -
.../styles/text-allow-overlap-expr.xml | 48 -
tests/visual_tests/styles/text-bengali.xml | 32 -
tests/visual_tests/styles/text-bug1532.xml | 41 -
tests/visual_tests/styles/text-bug1533.xml | 29 -
tests/visual_tests/styles/text-bug1820+0.xml | 20 -
tests/visual_tests/styles/text-bug1820+1.xml | 20 -
tests/visual_tests/styles/text-bug1820-1.xml | 20 -
tests/visual_tests/styles/text-bug2037.xml | 30 -
tests/visual_tests/styles/text-charplacement.xml | 18 -
tests/visual_tests/styles/text-data-binding.xml | 99 -
tests/visual_tests/styles/text-displacement.xml | 17 -
.../styles/text-expressionformat-color.xml | 23 -
tests/visual_tests/styles/text-font-features.xml | 33 -
.../styles/text-halign-adjust-multiline.xml | 30 -
tests/visual_tests/styles/text-halign-adjust.xml | 30 -
tests/visual_tests/styles/text-halign.xml | 21 -
tests/visual_tests/styles/text-halo-opacity.xml | 85 -
tests/visual_tests/styles/text-halo-rasterizer.xml | 224 -
tests/visual_tests/styles/text-halo-transform.xml | 240 -
tests/visual_tests/styles/text-line-wrap.xml | 74 -
tests/visual_tests/styles/text-malayalam.xml | 20 -
tests/visual_tests/styles/text-multi-layout-1.xml | 65 -
tests/visual_tests/styles/text-multi-layout-2.xml | 48 -
tests/visual_tests/styles/text-overlap.xml | 18 -
tests/visual_tests/styles/text-spacing.xml | 18 -
tests/visual_tests/styles/text-ttc-font.xml | 80 -
tests/visual_tests/styles/text-typographic.xml | 79 -
.../styles/text-vertical-alignment.xml | 37 -
.../styles/tiff-alpha-broken-assoc-alpha-gdal.xml | 21 -
.../tiff-alpha-broken-assoc-alpha-raster.xml | 22 -
tests/visual_tests/styles/tiff-alpha-gdal.xml | 19 -
.../styles/tiff-alpha-gradient-gdal.xml | 19 -
.../styles/tiff-alpha-gradient-raster.xml | 20 -
tests/visual_tests/styles/tiff-alpha-raster.xml | 20 -
.../styles/tiff-edge-alignment-gdal1.xml | 17 -
.../styles/tiff-edge-alignment-gdal2.xml | 17 -
.../visual_tests/styles/tiff-nodata-edge-gdal.xml | 20 -
.../styles/tiff-nodata-edge-raster.xml | 22 -
.../visual_tests/styles/tiff-nodata-edge-rgba.xml | 17 -
tests/visual_tests/styles/tiff-nodata-rgb.xml | 17 -
tests/visual_tests/styles/tiff-nodata-rgba.xml | 16 -
.../visual_tests/styles/tiff-nodata-tolerance.xml | 19 -
.../visual_tests/styles/tiff-opaque-edge-gdal.xml | 19 -
.../visual_tests/styles/tiff-opaque-edge-gdal2.xml | 17 -
.../styles/tiff-opaque-edge-raster.xml | 18 -
.../styles/tiff-opaque-edge-raster2.xml | 18 -
tests/visual_tests/styles/tiff-reprojection-1.xml | 15 -
tests/visual_tests/styles/tiff-reprojection-2.xml | 19 -
tests/visual_tests/styles/tiff-resampling.xml | 18 -
tests/visual_tests/styles/tiff_colortable.xml | 15 -
.../styles/tiff_colortable_custom_nodata.xml | 16 -
tests/visual_tests/styles/vrt_colortable.xml | 15 -
tests/visual_tests/styles/whole-centroid.xml | 21 -
tests/visual_tests/test.py | 502 --
tests/visual_tests/test_python.py | 109 -
tests/visual_tests/xml_output/.gitignore | 1 -
utils/geometry_to_wkb/Jamroot | 12 +-
utils/geometry_to_wkb/main.cpp | 28 +-
utils/mapnik-config/build.py | 17 +-
utils/mapnik-config/mapnik-config.template.sh | 15 +
utils/nik2img/nik2img.cpp | 47 +-
utils/ogrindex/ogrindex.cpp | 4 +-
utils/performance/build.py | 32 -
utils/performance/mapnik-speed-check | 63 -
utils/pgsql2sqlite/main.cpp | 2 +-
utils/pgsql2sqlite/pgsql2sqlite.hpp | 17 +-
utils/pgsql2sqlite/sqlite.cpp | 2 +-
utils/pgsql2sqlite/sqlite.hpp | 10 +-
utils/shapeindex/quadtree.hpp | 2 +-
utils/shapeindex/shapeindex.cpp | 57 +-
utils/stats/mapdef_stats.py | 29 -
utils/svg2png/svg2png.cpp | 160 +-
utils/upgrade_map_xml/build.py | 31 -
utils/upgrade_map_xml/upgrade_map_xml.py | 275 -
utils/upgrade_map_xml/upgrade_map_xml_keep_ent.py | 194 -
3383 files changed, 45838 insertions(+), 110102 deletions(-)
diff --git a/.gitignore b/.gitignore
index bbf225e..b090f4c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,14 @@
.DS_Store
+*.gcov
+*.gcda
+*.gcno
*~
*.o
*.pyc
*.os
*.so
*.a
+*.swp
*.dylib
plugins/input/*.input
plugins/input/templates/*.input
@@ -13,6 +17,8 @@ bindings/python/mapnik/paths.py
config.cache
config.log
config.py
+mason_packages/
+.mason/
.sconf_temp/
.sconsign.dblite
demo/viewer/viewer.ini
@@ -43,4 +49,6 @@ demo/viewer/release/
demo/viewer/ui_about.h
demo/viewer/ui_info.h
demo/viewer/ui_layer_info.h
-tests/cpp_tests/*-bin
+test/standalone/*-bin
+test/unit/run
+test/visual/run
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..8ca2e98
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,6 @@
+[submodule "test/data"]
+ path = test/data
+ url = https://github.com/mapnik/test-data.git
+[submodule "test/data-visual"]
+ path = test/data-visual
+ url = https://github.com/mapnik/test-data-visual.git
diff --git a/.travis.yml b/.travis.yml
index fa546ed..f5a8d29 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,53 +1,88 @@
language: cpp
-compiler:
- - clang
- - gcc
+sudo: false
+
+git:
+ depth: 10
+ submodules: true
env:
- matrix:
- - DEBUG=False ENABLE_LOG=True DEFAULT_LOG_SEVERITY=debug XMLPARSER="libxml2" DEMO=False BENCHMARK=False CUSTOM_CXXFLAGS="" CUSTOM_LDFLAGS=""
- - DEBUG=False ENABLE_LOG=False DEFAULT_LOG_SEVERITY=none XMLPARSER="ptree" DEMO=False BENCHMARK=False CUSTOM_CXXFLAGS="" CUSTOM_LDFLAGS=""
+ global:
+ - secure: "N3a5nzzsgpuu45k8qWdYsHNxrSnqeAGLTOYpfYoAH7B94vuf7pa7XV1tQjXbxrnx2D6ryTdtUtyRKwy7zXbwXxGt4DpczWEo8f6DUd6+obAp3kdnXABg2Sj4oA7KMs0F0CmoADy0jdUZD5YyOJHu64LCIIgzEQ9q49PFMNbU3IE="
+ - secure: "iQYPNpMtejcgYeUkWZGIWz1msIco5qydJrhZTSCQOYahAQerdT7q5WZEpEo3G6IWOGgO1eo7GFuY8DvqQjw1+jC9b9mhkRNdo3LhGTKS9Gsbl5Q27k0rjlaFZmmQHrfPlQJwhfAIp+KLugHtQw5bCoLh+95E3j0F0DayF1tuJ3s="
+addons:
+ postgresql: "9.4"
+ apt:
+ sources:
+ - ubuntu-toolchain-r-test
+ - llvm-toolchain-precise-3.5
+ packages:
+ - clang-3.5
+
+cache:
+ directories:
+ - $HOME/.ccache
+
+matrix:
+ include:
+ - os: linux
+ compiler: clang
+ env: JOBS=8 MASON_PUBLISH=true
+ - os: linux
+ compiler: gcc
+ env: JOBS=6
+ - os: osx
+ compiler: clang
+ env: JOBS=8 MASON_PUBLISH=true
+ - os: osx
+ compiler: clang
+ env: JOBS=8 COVERAGE=true
-# travis + ubuntugis with gdal and postggis leads to many potential dead-end conflicts
-# the below is thanks to https://github.com/CartoDB/Windshaft/blob/d82fe08b32fc7907bbe907ab290f8a082215ae26/.travis.yml#L1
before_install:
- - export PGUSER=postgres
- - sudo mv /etc/apt/sources.list.d/pgdg-source.list* /tmp
- - sudo apt-get -qq purge postgis* postgresql*
- - sudo apt-add-repository -y ppa:cartodb/postgresql-9.3
- - sudo apt-add-repository -y ppa:cartodb/gis
- # grab harfbuzz from ppa
- - sudo apt-add-repository -y ppa:fontforge/fontforge
- # we need at least g++-4.7 for c++11 features
- - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
- # enable to test against latest boost rather that v1.48
- #- sudo add-apt-repository -y ppa:boost-latest/ppa
- - sudo rm -Rf /var/lib/postgresql /etc/postgresql
- - sudo apt-get update -qq
- - sudo apt-get install -q libharfbuzz-dev postgresql-9.3-postgis-2.1 postgresql-contrib-9.3 gdal-bin libgdal-dev
- - echo -e "local\tall\tall\ttrust\nhost\tall\tall\t127.0.0.1/32\ttrust\nhost\tall\tall\t::1/128\ttrust" |sudo tee /etc/postgresql/9.3/main/pg_hba.conf
- - sudo service postgresql restart
+ - export COVERAGE=${COVERAGE:-false}
+ - export MASON_PUBLISH=${MASON_PUBLISH:-false}
+ - if [[ ${TRAVIS_BRANCH} != 'master' ]]; then export MASON_PUBLISH=false; fi
+ - if [[ ${TRAVIS_PULL_REQUEST} != 'false' ]]; then export MASON_PUBLISH=false; fi
install:
- # enable to test against boost ppa
- #- sudo apt-get install -y boost1.55
- - sudo apt-get install -y libboost-python1.48-dev libboost-thread1.48-dev libboost-filesystem1.48-dev libboost-regex1.48-dev libboost-program-options1.48-dev
- - sudo apt-get install -y ttf-wqy-microhei make libstdc++6 libstdc++-4.8-dev valgrind python-nose libicu-dev libproj-dev libcairo-dev python-cairo-dev libcairo-dev python-cairo-dev libpng-dev libjpeg-dev libtiff-dev libwebp-dev libz-dev libfreetype6-dev libxml2-dev libsqlite3-dev
-
-before_script:
- - psql -U postgres -c 'create database template_postgis'
- - psql -U postgres -c 'create extension postgis' -d template_postgis
- - if [[ "${CXX}" == 'g++' ]]; then export JOBS=2; sudo apt-get install gcc-4.8 g++-4.8; export CXX="$(which g++-4.8)"; export CC="$(which gcc-4.8)"; fi;
- - if [[ "${CXX}" == 'clang++' ]]; then export JOBS=4; export CXX="$(which clang++)"; export CC="$(which clang)"; fi;
+ - if [[ $(uname -s) == 'Linux' ]]; then
+ psql -U postgres -c 'create database template_postgis;' -U postgres;
+ psql -U postgres -c 'create extension postgis;' -d template_postgis -U postgres;
+ export CXX="ccache clang++-3.5 -Qunused-arguments";
+ export CC="ccache clang-3.5 -Qunused-arguments";
+ export PYTHONPATH=$(pwd)/mason_packages/.link/lib/python2.7/site-packages;
+ else
+ export PYTHONPATH=$(pwd)/mason_packages/.link/lib/python/site-packages;
+ fi
+ - if [[ ${COVERAGE} == true ]]; then
+ PYTHONUSERBASE=$(pwd)/mason_packages/.link pip install --user cpp-coveralls;
+ fi
script:
- - rm -rf ./git
- - ./configure CXX="${CXX}" CC="${CC}" CUSTOM_CXXFLAGS="${CUSTOM_CXXFLAGS}" CUSTOM_LDFLAGS="${CUSTOM_LDFLAGS}" XML_PARSER="${XML_PARSER}" ENABLE_LOG="${ENABLE_LOG}" DEBUG="${DEBUG}" DEMO="${DEMO}" BENCHMARK="${BENCHMARK}" CPP_TESTS=True CAIRO=True FAST=True || cat config.log
- - if [[ "${DEBUG}" == True ]]; then export JOBS=$((JOBS/2)); fi;
+ - source bootstrap.sh
+ - if [[ ${COVERAGE} == true ]]; then
+ ./configure CUSTOM_LDFLAGS='--coverage' CUSTOM_CXXFLAGS='--coverage' CUSTOM_CFLAGS='--coverage' DEBUG=True;
+ elif [[ ${MASON_PUBLISH} == true ]]; then
+ export MASON_NAME=mapnik;
+ export MASON_VERSION=latest;
+ export MASON_LIB_FILE=lib/libmapnik-wkt.a;
+ source ./.mason/mason.sh;
+ ./configure PREFIX=${MASON_PREFIX} PATH_REPLACE='' MAPNIK_BUNDLED_SHARE_DIRECTORY=True;
+ else
+ ./configure;
+ fi
- make
- - git clone --depth=1 https://github.com/mapbox/mapnik-test-data tests/data/mapnik-test-data
- make test
- - source localize.sh && make grind
- - if [[ ${BENCHMARK} != False ]]; then make bench; fi;
- - if [[ ${BENCHMARK} != False ]]; then for i in $(ls tests/visual_tests/styles/*xml); do echo $i;./benchmark/out/test_rendering --name "text rendering" --map $i --width 1024 --height 1024 --iterations 2 --threads 10;done;fi
+ - if [[ ${COVERAGE} == true ]]; then
+ ./mason_packages/.link/bin/cpp-coveralls --build-root . --gcov-options '\-lp' --exclude mason_packages --exclude .sconf_temp --exclude benchmark --exclude deps --exclude scons --exclude test --exclude demo --exclude docs --exclude fonts --exclude utils > /dev/null;
+ fi
+ - if [[ ${COVERAGE} != true ]]; then
+ make bench;
+ fi
+
+after_success:
+ - if [[ ${MASON_PUBLISH} == true ]]; then
+ ./mason_latest.sh build;
+ ./mason_latest.sh link;
+ ./mason_latest.sh publish;
+ fi
diff --git a/AUTHORS.md b/AUTHORS.md
index 25aa969..75589bf 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -41,6 +41,7 @@ Mapnik is written by Artem Pavlenko with contributions from:
* Carlos López
* Dennis Luxen
* Tom MacWright
+* Sara Metz
* Michal Migurski
* Andrii Mishkovskyi
* Ben Moores
@@ -51,6 +52,7 @@ Mapnik is written by Artem Pavlenko with contributions from:
* Igor Podolskiy
* Reid Priedhorsky
* Brian Quinion
+* Even Rouault
* Marcin Rudowski
* Sandro Santilli
* Christopher Schmidt
@@ -67,6 +69,7 @@ Mapnik is written by Artem Pavlenko with contributions from:
* Dave Stubbs
* River Tarnell
* Cezary Tarnowski
+* Blake Thompson
* Oliver Tonnhofer
* Jochen Topf
* Alberto Valverde
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ce99eba..49849e3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,10 +8,12 @@ For a complete change history, see the git log.
## 3.0.0
+- Added new and experimental `dot` symbolizer for fast rendering of points
- Improved support for International Text (now uses harfbuzz library for text shaping)
- Uses latest c++11 features for better performance (especially map loading)
-- Expressions everywhere: all symbolizer properties can now be data driven expression (which the exception of `face-name` and `fontset-name`).
+- Expressions everywhere: all symbolizer properties can now be data driven expressions (with the exception of `face-name` and `fontset-name` on the `TextSymbolizer`).
- New functions supported in expressions: `exp`, `sin`, `cos`, `tan`, `atan`, `abs`.
+- New constants supported in expressions: `PI`, `DEG_TO_RAD`, `RAD_TO_DEG`
- Pattern symbolizers now support SVG input and applying transformations on them dynamically
- Experimental / interface may change: `@variables` can be passed to renderer and evaluated in expressions
- Supports being built with clang++ using `-fvisibility=hidden -flto` for smaller binaries
@@ -21,7 +23,7 @@ For a complete change history, see the git log.
geometry.
- `TextSymbolizer` now supports `smooth`, `simplify`, `halo-opacity`, `halo-comp-op`, and `halo-transform`
- `ShieldSymbolizer` now supports `smooth`, `simplify`, `halo-opacity`, `halo-comp-op`, and `halo-transform`
-
+- New GroupSymbolizer for applying multiple symbolizers in a single layout
Released ...
diff --git a/INSTALL.md b/INSTALL.md
index f2787e6..974a280 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -1,6 +1,6 @@
# Mapnik Installation
-Mapnik is cross platform and runs on Linux, Mac OSX, Solaris, *BSD, and Windows.
+Mapnik runs on Linux, OS X, Windows, and BSD systems.
To configure and build Mapnik do:
@@ -15,7 +15,7 @@ To trigger parallel compilation you can pass a JOBS value to make:
$ JOBS=4 make
```
-(Note that compiling Mapnik needs several GBytes of RAM. If you use parallel compiliation it needs more.)
+(Note that compiling Mapnik needs several GBytes of RAM. If you use parallel compilation it needs more.)
To use a Python interpreter that is not named `python` for your build, do
something like the following instead:
@@ -29,15 +29,16 @@ NOTE: the above will not work on windows, rather see https://github.com/mapnik/m
Then to run the tests locally (without needing to install):
- make test-local
+ git submodule update --init
+ make test
Install like:
- sudo make install
+ make install
If you need to uninstall do:
- sudo make uninstall
+ make uninstall
For more details see the `Building` Section below.
@@ -62,7 +63,6 @@ Mapnik Core depends on:
- These libraries are used:
- filesystem
- system
- - thread (for python bindings only)
- regex (optionally built with icu regex support)
- program_options (optionally for mapnik command line programs)
* libicuuc >= 4.0 (ideally >= 4.2) - International Components for Unicode
@@ -79,19 +79,10 @@ Mapnik Core optionally depends on:
* libwebp - WEBP graphics (Default enabled, if found)
* libproj - PROJ.4 projection library (Default enabled, if found)
-Mapnik Python bindings depend on:
-
- * Python 2.5-2.7 or >= 3.2
- * Boost python
- * simplejson module if using <= 2.5
-
-Note: Python 3.x is supported, see: https://github.com/mapnik/mapnik/wiki/Python3k
-
Additional optional dependencies:
* Cairo >= 1.6.0 - Graphics library for output formats like PDF, PS, and SVG
- pkg-config - Required for building with cairo support
- - pycairo - Python bindings for cairo
* PostgreSQL (for PostGIS plugin support)
- libpq - PostreSQL libraries
- pg_config - PostgreSQL installation capabilities
@@ -160,17 +151,7 @@ For more details on usage see:
You can run the Mapnik tests locally (without installing) like:
- make test-local # see the Makefile for how this works
-
-Or you can install and test like:
-
- make install && make test
-
-Many of the tests are written in python and you can run them individually like:
-
- make install
- python tests/python_tests/shapefile_test.py
-
+ make test
## Learning Mapnik
diff --git a/Makefile b/Makefile
index 0ae5d41..46307d5 100755
--- a/Makefile
+++ b/Makefile
@@ -12,7 +12,31 @@ all: mapnik
install:
$(PYTHON) scons/scons.py -j$(JOBS) --config=cache --implicit-cache --max-drift=1 install
-mapnik:
+python:
+ if [[ ! -d ./bindings/python ]]; then git clone git at github.com:mapnik/python-mapnik.git --recursive ./bindings/python; else (cd bindings/python && git pull && git submodule update --init); fi;
+ make
+ python bindings/python/test/visual.py -q
+
+src/json/libmapnik-json.a:
+ # we first build memory intensive files with -j1
+ $(PYTHON) scons/scons.py -j1 \
+ --config=cache --implicit-cache --max-drift=1 \
+ src/renderer_common/process_group_symbolizer.os \
+ src/json/libmapnik-json.a \
+ src/wkt/libmapnik-wkt.a \
+ src/css_color_grammar.os \
+ src/expression_grammar.os \
+ src/transform_expression_grammar.os \
+ src/image_filter_types.os \
+ src/agg/process_markers_symbolizer.os \
+ src/agg/process_group_symbolizer.os \
+ src/grid/process_markers_symbolizer.os \
+ src/grid/process_group_symbolizer.os \
+ src/cairo/process_markers_symbolizer.os \
+ src/cairo/process_group_symbolizer.os \
+
+mapnik: src/json/libmapnik-json.a
+ # then install the rest with -j$(JOBS)
$(PYTHON) scons/scons.py -j$(JOBS) --config=cache --implicit-cache --max-drift=1
clean:
@@ -23,12 +47,10 @@ clean:
@if test -e ".sconf_temp/"; then rm -r ".sconf_temp/"; fi
@find ./ -name "*.pyc" -exec rm {} \;
@find ./ -name "*.os" -exec rm {} \;
- @find ./ -name "*.dylib" -exec rm {} \;
- @find ./ -name "*.so" -exec rm {} \;
+ @find ./src/ -name "*.dylib" -exec rm {} \;
+ @find ./src/ -name "*.so" -exec rm {} \;
@find ./ -name "*.o" -exec rm {} \;
- @find ./ -name "*.a" -exec rm {} \;
- @find ./ -name "*.pyc" -exec rm {} \;
- @if test -e "bindings/python/mapnik/paths.py"; then rm "bindings/python/mapnik/paths.py"; fi
+ @find ./src/ -name "*.a" -exec rm {} \;
distclean:
if test -e "config.py"; then mv "config.py" "config.py.backup"; fi
@@ -41,22 +63,13 @@ rebuild:
uninstall:
@$(PYTHON) scons/scons.py -j$(JOBS) --config=cache --implicit-cache --max-drift=1 uninstall
-test:
- ./run_tests
-
-test-local:
- make test
-
-test-visual:
- bash -c "source ./localize.sh && python tests/visual_tests/test.py -q"
-
-test-python:
- bash -c "source ./localize.sh && python tests/run_tests.py -q"
+test/data:
+ git submodule update --init
-test-cpp:
- ./tests/cpp_tests/run
+test: ./test/data
+ @./test/run
-check: test-local
+check: test
bench:
./benchmark/run
@@ -67,13 +80,18 @@ demo:
pep8:
# https://gist.github.com/1903033
# gsed on osx
- @pep8 -r --select=W293 -q --filename=*.py `pwd`/tests/ | xargs gsed -i 's/^[ \r\t]*$//'
- @pep8 -r --select=W391 -q --filename=*.py `pwd`/tests/ | xargs gsed -i -e :a -e '/^\n*$/{$d;N;ba' -e '}'
+ @pep8 -r --select=W293 -q --filename=*.py `pwd`/tests/ | xargs gsed -i 's/^[ \r\t]*$$//'
+ @pep8 -r --select=W391 -q --filename=*.py `pwd`/tests/ | xargs gsed -i -e :a -e '/^\n*$$/{$$d;N;ba' -e '}'
+ @pep8 -r --select=W391 -q --filename=*.py `pwd`/tests/ | xargs ged -i '/./,/^$$/!d'
+# note: pass --gen-suppressions=yes to create new suppression entries
grind:
- @for FILE in tests/cpp_tests/*-bin; do \
- valgrind --leak-check=full --log-fd=1 $${FILE} | grep definitely; \
+ @source localize.sh && source mapnik-settings.env && \
+ for FILE in test/standalone/*-bin; do \
+ valgrind --suppressions=./test/unit/valgrind.supp --leak-check=full --log-fd=1 $${FILE} | grep definitely; \
done
+ @source localize.sh && source mapnik-settings.env && \
+ valgrind --suppressions=./test/unit/valgrind.supp --leak-check=full --log-fd=1 ./test/unit/run | grep definitely;
render:
@for FILE in tests/data/good_maps/*xml; do \
diff --git a/SConstruct b/SConstruct
index 80786fe..c5266d0 100644
--- a/SConstruct
+++ b/SConstruct
@@ -66,17 +66,20 @@ BOOST_SEARCH_PREFIXES = ['/usr/local','/opt/local','/sw','/usr',]
BOOST_MIN_VERSION = '1.47'
#CAIRO_MIN_VERSION = '1.8.0'
+HARFBUZZ_MIN_VERSION = (0, 9, 34)
+HARFBUZZ_MIN_VERSION_STRING = "%s.%s.%s" % HARFBUZZ_MIN_VERSION
+
+
DEFAULT_LINK_PRIORITY = ['internal','other','frameworks','user','system']
pretty_dep_names = {
- 'ociei':'Oracle database library | configure with OCCI_LIBS & OCCI_INCLUDES | more info: https://github.com/mapnik/mapnik/wiki/OCCI',
+ 'clntsh':'Oracle database library | configure with OCCI_LIBS & OCCI_INCLUDES | more info: https://github.com/mapnik/mapnik/wiki/OCCI',
'gdal':'GDAL C++ library | configured using gdal-config program | try setting GDAL_CONFIG SCons option | more info: https://github.com/mapnik/mapnik/wiki/GDAL',
'ogr':'OGR-enabled GDAL C++ Library | configured using gdal-config program | try setting GDAL_CONFIG SCons option | more info: https://github.com/mapnik/mapnik/wiki/OGR',
'cairo':'Cairo C library | configured using pkg-config | try setting PKG_CONFIG_PATH SCons option',
- 'pycairo':'Python bindings to Cairo library | configured using pkg-config | try setting PKG_CONFIG_PATH SCons option',
'proj':'Proj.4 C Projections library | configure with PROJ_LIBS & PROJ_INCLUDES | more info: http://trac.osgeo.org/proj/',
- 'pg':'Postgres C Library required for PostGIS plugin | configure with pg_config program | more info: https://github.com/mapnik/mapnik/wiki/PostGIS',
+ 'pg':'Postgres C Library required for PostGIS plugin | configure with pg_config program or configure with PG_LIBS & PG_INCLUDES | more info: https://github.com/mapnik/mapnik/wiki/PostGIS',
'sqlite3':'SQLite3 C Library | configure with SQLITE_LIBS & SQLITE_INCLUDES | more info: https://github.com/mapnik/mapnik/wiki/SQLite',
'jpeg':'JPEG C library | configure with JPEG_LIBS & JPEG_INCLUDES',
'tiff':'TIFF C library | configure with TIFF_LIBS & TIFF_INCLUDES',
@@ -84,14 +87,17 @@ pretty_dep_names = {
'webp':'WEBP C library | configure with WEBP_LIBS & WEBP_INCLUDES',
'icuuc':'ICU C++ library | configure with ICU_LIBS & ICU_INCLUDES or use ICU_LIB_NAME to specify custom lib name | more info: http://site.icu-project.org/',
'harfbuzz':'HarfBuzz text shaping library | configure with HB_LIBS & HB_INCLUDES',
+ 'harfbuzz-min-version':'HarfBuzz >= %s (required for font-feature-settings support)' % HARFBUZZ_MIN_VERSION_STRING,
'z':'Z compression library | more info: http://www.zlib.net/',
'm':'Basic math library, part of C++ stlib',
'pkg-config':'pkg-config tool | more info: http://pkg-config.freedesktop.org',
'pg_config':'pg_config program | try setting PG_CONFIG SCons option',
- 'xml2-config':'xml2-config program | try setting XML2_CONFIG SCons option',
- 'libxml2':'libxml2 library | try setting XML2_CONFIG SCons option to point to location of xml2-config program',
+ 'pq':'libpq library (postgres client) | try setting PG_CONFIG SCons option or configure with PG_LIBS & PG_INCLUDES',
+ 'xml2-config':'xml2-config program | try setting XML2_CONFIG SCons option or avoid the need for xml2-config command by configuring with XML2_LIBS & XML2_INCLUDES',
+ 'libxml2':'libxml2 library | try setting XML2_CONFIG SCons option to point to location of xml2-config program or configure with XML2_LIBS & XML2_INCLUDES',
'gdal-config':'gdal-config program | try setting GDAL_CONFIG SCons option',
- 'freetype-config':'freetype-config program | try setting FREETYPE_CONFIG SCons option',
+ 'freetype-config':'freetype-config program | try setting FREETYPE_CONFIG SCons option or configure with FREETYPE_LIBS & FREETYPE_INCLUDES',
+ 'freetype':'libfreetype library | try setting FREETYPE_CONFIG SCons option or configure with FREETYPE_LIBS & FREETYPE_INCLUDES',
'osm':'more info: https://github.com/mapnik/mapnik/wiki/OsmPlugin',
'boost_regex_icu':'libboost_regex built with optional ICU unicode support is needed for unicode regex support in mapnik.',
'sqlite_rtree':'The SQLite plugin requires libsqlite3 built with RTREE support (-DSQLITE_ENABLE_RTREE=1)',
@@ -107,7 +113,7 @@ PLUGINS = { # plugins with external dependencies
'gdal': {'default':True,'path':None,'inc':'gdal_priv.h','lib':'gdal','lang':'C++'},
'ogr': {'default':True,'path':None,'inc':'ogrsf_frmts.h','lib':'gdal','lang':'C++'},
# configured with custom paths, hence 'path': PREFIX/INCLUDES/LIBS
- 'occi': {'default':False,'path':'OCCI','inc':'occi.h','lib':'ociei','lang':'C++'},
+ 'occi': {'default':False,'path':'OCCI','inc':'occi.h','lib':'clntsh','lang':'C++'},
'sqlite': {'default':True,'path':'SQLITE','inc':'sqlite3.h','lib':'sqlite3','lang':'C'},
'rasterlite': {'default':False,'path':'RASTERLITE','inc':['sqlite3.h','rasterlite.h'],'lib':'rasterlite','lang':'C'},
@@ -119,8 +125,7 @@ PLUGINS = { # plugins with external dependencies
'csv': {'default':True,'path':None,'inc':None,'lib':None,'lang':'C++'},
'raster': {'default':True,'path':None,'inc':None,'lib':None,'lang':'C++'},
'geojson': {'default':True,'path':None,'inc':None,'lib':None,'lang':'C++'},
- 'topojson':{'default':True,'path':None,'inc':None,'lib':None,'lang':'C++'},
- 'python': {'default':False,'path':None,'inc':None,'lib':None,'lang':'C++'},
+ 'topojson':{'default':True,'path':None,'inc':None,'lib':None,'lang':'C++'}
}
@@ -136,6 +141,9 @@ def init_environment(env):
env = Environment(ENV=os.environ)
init_environment(env)
+def fix_path(path):
+ return os.path.abspath(path)
+
def color_print(color,text,newline=True):
# 1 - red
# 2 - green
@@ -311,12 +319,12 @@ opts.AddVariables(
# Install Variables
('PREFIX', 'The install path "prefix"', '/usr/local'),
('LIBDIR_SCHEMA', 'The library sub-directory appended to the "prefix", sometimes lib64 on 64bit linux systems', LIBDIR_SCHEMA_DEFAULT),
- ('PYTHON_PREFIX','Custom install path "prefix" for python bindings (default of no prefix)',''),
('DESTDIR', 'The root directory to install into. Useful mainly for binary package building', '/'),
('PATH', 'A custom path (or multiple paths divided by ":") to append to the $PATH env to prioritize usage of command line programs (if multiple are present on the system)', ''),
('PATH_REMOVE', 'A path prefix to exclude from all known command and compile paths (create multiple excludes separated by :)', ''),
('PATH_REPLACE', 'Two path prefixes (divided with a :) to search/replace from all known command and compile paths', ''),
('MAPNIK_NAME', 'Name of library', 'mapnik'),
+ BoolVariable('MAPNIK_BUNDLED_SHARE_DIRECTORY', 'For portable packaging: instruct mapnik-config to report relative paths to bundled GDAL_DATA, PROJ_LIB, and ICU_DATA','False'),
# Boost variables
# default is '/usr/include', see FindBoost method below
@@ -326,7 +334,6 @@ opts.AddVariables(
('BOOST_TOOLKIT','Specify boost toolkit, e.g., gcc41.','',False),
('BOOST_ABI', 'Specify boost ABI, e.g., d.','',False),
('BOOST_VERSION','Specify boost version, e.g., 1_35.','',False),
- ('BOOST_PYTHON_LIB','Specify library name to specific Boost Python lib (e.g. "boost_python-py26")','boost_python'),
# Variables for required dependencies
('FREETYPE_CONFIG', 'The path to the freetype-config executable.', 'freetype-config'),
@@ -351,6 +358,12 @@ opts.AddVariables(
BoolVariable('PROJ', 'Build Mapnik with proj4 support to enable transformations between many different projections', 'True'),
PathVariable('PROJ_INCLUDES', 'Search path for PROJ.4 include files', '/usr/include', PathVariable.PathAccept),
PathVariable('PROJ_LIBS', 'Search path for PROJ.4 library files', '/usr/' + LIBDIR_SCHEMA_DEFAULT, PathVariable.PathAccept),
+ ('PG_INCLUDES', 'Search path for libpq (postgres client) include files', ''),
+ ('PG_LIBS', 'Search path for libpq (postgres client) library files', ''),
+ ('FREETYPE_INCLUDES', 'Search path for Freetype include files', ''),
+ ('FREETYPE_LIBS', 'Search path for Freetype library files', ''),
+ ('XML2_INCLUDES', 'Search path for libxml2 include files', ''),
+ ('XML2_LIBS', 'Search path for libxml2 library files', ''),
('PKG_CONFIG_PATH', 'Use this path to point pkg-config to .pc files instead of the PKG_CONFIG_PATH environment setting',''),
# Variables affecting rendering back-ends
@@ -388,12 +401,8 @@ opts.AddVariables(
('SYSTEM_FONTS','Provide location for python bindings to register fonts (if provided then the bundled DejaVu fonts are not installed)',''),
('LIB_DIR_NAME','Name to use for the subfolder beside libmapnik where fonts and plugins are installed','mapnik'),
PathVariable('PYTHON','Full path to Python executable used to build bindings', sys.executable),
- BoolVariable('FRAMEWORK_PYTHON', 'Link against Framework Python on Mac OS X', 'True'),
- BoolVariable('PYTHON_DYNAMIC_LOOKUP', 'On OSX, do not directly link python lib, but rather dynamically lookup symbols', 'True'),
- ('FRAMEWORK_SEARCH_PATH','Custom framework search path on Mac OS X', ''),
BoolVariable('FULL_LIB_PATH', 'Embed the full and absolute path to libmapnik when linking ("install_name" on OS X/rpath on Linux)', 'True'),
BoolVariable('ENABLE_SONAME', 'Embed a soname in libmapnik on Linux', 'True'),
- ListVariable('BINDINGS','Language bindings to build','all',['python']),
EnumVariable('THREADING','Set threading support','multi', ['multi','single']),
EnumVariable('XMLPARSER','Set xml parser','libxml2', ['libxml2','ptree']),
BoolVariable('DEMO', 'Compile demo c++ application', 'True'),
@@ -402,7 +411,6 @@ opts.AddVariables(
BoolVariable('SVG2PNG', 'Compile and install a utility to generate render an svg file to a png on the command line', 'False'),
BoolVariable('NIK2IMG', 'Compile and install a utility to generate render a map to an image', 'True'),
BoolVariable('COLOR_PRINT', 'Print build status information in color', 'True'),
- BoolVariable('SAMPLE_INPUT_PLUGINS', 'Compile and install sample plugins', 'False'),
BoolVariable('BIGINT', 'Compile support for 64-bit integers in mapnik::value', 'True'),
)
@@ -437,16 +445,12 @@ pickle_store = [# Scons internal variables
'BOOST_APPEND',
'LIBDIR_SCHEMA',
'REQUESTED_PLUGINS',
- 'PYTHON_VERSION',
- 'PYTHON_INCLUDES',
- 'PYTHON_INSTALL_LOCATION',
- 'PYTHON_SYS_PREFIX',
'COLOR_PRINT',
'HAS_CAIRO',
+ 'MAPNIK_HAS_DLFCN',
'HAS_PYCAIRO',
+ 'PYCAIRO_PATHS',
'HAS_LIBXML2',
- 'PYTHON_IS_64BIT',
- 'SAMPLE_INPUT_PLUGINS',
'PKG_CONFIG_PATH',
'PATH',
'PATH_REMOVE',
@@ -458,6 +462,7 @@ pickle_store = [# Scons internal variables
'MAPNIK_INPUT_PLUGINS_DEST',
'MAPNIK_FONTS',
'MAPNIK_FONTS_DEST',
+ 'MAPNIK_BUNDLED_SHARE_DIRECTORY',
'MAPNIK_LIB_BASE',
'MAPNIK_LIB_BASE_DEST',
'EXTRA_FREETYPE_LIBS',
@@ -666,8 +671,8 @@ def parse_pg_config(context, config):
if ret:
lib_path = call('%s --libdir' % env[config])
inc_path = call('%s --includedir' % env[config])
- env.AppendUnique(CPPPATH = os.path.realpath(inc_path))
- env.AppendUnique(LIBPATH = os.path.realpath(lib_path))
+ env.AppendUnique(CPPPATH = fix_path(inc_path))
+ env.AppendUnique(LIBPATH = fix_path(lib_path))
lpq = env['PLUGINS']['postgis']['lib']
env.Append(LIBS = lpq)
else:
@@ -768,8 +773,8 @@ def FindBoost(context, prefixes, thread_flag):
env['BOOST_APPEND'] = '-'.join(append_params)
msg += '\nFound boost lib name extension: %s' % env['BOOST_APPEND']
- env.AppendUnique(CPPPATH = os.path.realpath(env['BOOST_INCLUDES']))
- env.AppendUnique(LIBPATH = os.path.realpath(env['BOOST_LIBS']))
+ env.AppendUnique(CPPPATH = fix_path(env['BOOST_INCLUDES']))
+ env.AppendUnique(LIBPATH = fix_path(env['BOOST_LIBS']))
if env['COLOR_PRINT']:
msg = "\033[94m%s\033[0m" % (msg)
ret = context.Result(msg)
@@ -829,6 +834,24 @@ int main()
rm_path(item,'CPPPATH',context.env)
return ret
+def CheckHasDlfcn(context, silent=False):
+ if not silent:
+ context.Message('Checking for dlfcn.h support ... ')
+ ret = context.TryCompile("""
+
+#include <dlfcn.h>
+
+int main()
+{
+ return 0;
+}
+
+""", '.cpp')
+ if silent:
+ context.did_show_result=1
+ context.Result(ret)
+ return ret
+
def GetBoostLibVersion(context):
ret = context.TryRun("""
@@ -848,6 +871,24 @@ return 0;
context.Result(ret[0])
return ret[1].strip()
+def CheckBoostScopedEnum(context, silent=False):
+ if not silent:
+ context.Message('Checking whether Boost was compiled with C++11 scoped enums ... ')
+ ret = context.TryLink("""
+#include <boost/filesystem.hpp>
+
+int main()
+{
+ boost::filesystem::path a, b;
+ boost::filesystem::copy_file(a, b);
+ return 0;
+}
+""", '.cpp')
+ if silent:
+ context.did_show_result=1
+ context.Result(ret)
+ return ret
+
def icu_at_least_four_two(context):
ret = context.TryRun("""
@@ -877,6 +918,35 @@ int main()
color_print(1,'\nFound insufficient icu version... %s' % result)
return False
+def harfbuzz_version(context):
+ ret = context.TryRun("""
+
+#include "harfbuzz/hb.h"
+#include <iostream>
+
+int main()
+{
+ std::cout << HB_VERSION_ATLEAST(%s, %s, %s) << ";" << HB_VERSION_STRING;
+ return 0;
+}
+
+""" % HARFBUZZ_MIN_VERSION, '.cpp')
+ # hack to avoid printed output
+ context.Message('Checking for HarfBuzz version >= %s... ' % HARFBUZZ_MIN_VERSION_STRING)
+ context.did_show_result=1
+ result = ret[1].strip()
+ if not result:
+ context.Result('error, could not get version from hb.h')
+ return False
+
+ items = result.split(';')
+ if items[0] == '1':
+ color_print(4,'found: HarfBuzz %s' % items[1])
+ return True
+
+ color_print(1,'\nHarfbuzz >= %s required but found ... %s' % (HARFBUZZ_MIN_VERSION_STRING,items[1]))
+ return False
+
def boost_regex_has_icu(context):
if env['RUNTIME_LINK'] == 'static':
# re-order icu libs to ensure linux linker is happy
@@ -989,6 +1059,7 @@ conf_tests = { 'prioritize_paths' : prioritize_paths,
'FindBoost' : FindBoost,
'CheckBoost' : CheckBoost,
'CheckCairoHasFreetype' : CheckCairoHasFreetype,
+ 'CheckHasDlfcn' : CheckHasDlfcn,
'GetBoostLibVersion' : GetBoostLibVersion,
'parse_config' : parse_config,
'parse_pg_config' : parse_pg_config,
@@ -996,9 +1067,11 @@ conf_tests = { 'prioritize_paths' : prioritize_paths,
'get_pkg_lib' : get_pkg_lib,
'rollback_option' : rollback_option,
'icu_at_least_four_two' : icu_at_least_four_two,
+ 'harfbuzz_version' : harfbuzz_version,
'boost_regex_has_icu' : boost_regex_has_icu,
'sqlite_has_rtree' : sqlite_has_rtree,
'supports_cxx11' : supports_cxx11,
+ 'CheckBoostScopedEnum' : CheckBoostScopedEnum,
}
def GetMapnikLibVersion():
@@ -1069,6 +1142,7 @@ if not preconfigured:
env['CAIRO_ALL_LIBS'] = []
env['CAIRO_CPPPATHS'] = []
env['HAS_PYCAIRO'] = False
+ env['PYCAIRO_PATHS'] = []
env['HAS_LIBXML2'] = False
env['LIBMAPNIK_LIBS'] = []
env['LIBMAPNIK_LINKFLAGS'] = []
@@ -1078,7 +1152,6 @@ if not preconfigured:
env['PLUGINS'] = PLUGINS
env['EXTRA_FREETYPE_LIBS'] = []
env['SQLITE_LINKFLAGS'] = []
- env['PYTHON_INCLUDES'] = []
# previously a leading / was expected for LIB_DIR_NAME
# now strip it to ensure expected behavior
if env['LIB_DIR_NAME'].startswith(os.path.sep):
@@ -1099,7 +1172,7 @@ if not preconfigured:
# install prefix is a pre-pended base location to
# re-route the install and only intended for package building
# we normalize to ensure no trailing slash and proper pre-pending to the absolute prefix
- install_prefix = os.path.normpath(os.path.realpath(env['DESTDIR'])) + os.path.realpath(env['PREFIX'])
+ install_prefix = os.path.normpath(fix_path(env['DESTDIR'])) + fix_path(env['PREFIX'])
env['INSTALL_PREFIX'] = strip_first(install_prefix,'//','/')
# all values from above based on install_prefix
# if env['DESTDIR'] == '/' these should be unchanged
@@ -1117,11 +1190,11 @@ if not preconfigured:
env['MAPNIK_LIB_NAME'] = '${SHLIBPREFIX}${MAPNIK_NAME}${SHLIBSUFFIX}'
if env['PKG_CONFIG_PATH']:
- env['ENV']['PKG_CONFIG_PATH'] = os.path.realpath(env['PKG_CONFIG_PATH'])
+ env['ENV']['PKG_CONFIG_PATH'] = fix_path(env['PKG_CONFIG_PATH'])
# otherwise this variable == os.environ["PKG_CONFIG_PATH"]
if env['PATH']:
- env['ENV']['PATH'] = os.path.realpath(env['PATH']) + ':' + env['ENV']['PATH']
+ env['ENV']['PATH'] = fix_path(env['PATH']) + ':' + env['ENV']['PATH']
if env['SYSTEM_FONTS']:
if not os.path.isdir(env['SYSTEM_FONTS']):
@@ -1170,10 +1243,24 @@ if not preconfigured:
for required in ('ICU', 'SQLITE', 'HB'):
inc_path = env['%s_INCLUDES' % required]
lib_path = env['%s_LIBS' % required]
- env.AppendUnique(CPPPATH = os.path.realpath(inc_path))
- env.AppendUnique(LIBPATH = os.path.realpath(lib_path))
+ env.AppendUnique(CPPPATH = fix_path(inc_path))
+ env.AppendUnique(LIBPATH = fix_path(lib_path))
+
+ REQUIRED_LIBSHEADERS = [
+ ['z', 'zlib.h', True,'C'],
+ [env['ICU_LIB_NAME'],'unicode/unistr.h',True,'C++'],
+ ['harfbuzz', 'harfbuzz/hb.h',True,'C++']
+ ]
- if conf.parse_config('FREETYPE_CONFIG'):
+ if env.get('FREETYPE_LIBS') or env.get('FREETYPE_INCLUDES'):
+ REQUIRED_LIBSHEADERS.insert(0,['freetype','ft2build.h',True,'C'])
+ if env.get('FREETYPE_INCLUDES'):
+ inc_path = env['FREETYPE_INCLUDES']
+ env.AppendUnique(CPPPATH = fix_path(inc_path))
+ if env.get('FREETYPE_LIBS'):
+ lib_path = env['FREETYPE_LIBS']
+ env.AppendUnique(LIBPATH = fix_path(lib_path))
+ elif conf.parse_config('FREETYPE_CONFIG'):
# check if freetype links to bz2
if env['RUNTIME_LINK'] == 'static':
temp_env = env.Clone()
@@ -1188,16 +1275,24 @@ if not preconfigured:
# libxml2 should be optional but is currently not
# https://github.com/mapnik/mapnik/issues/913
- if conf.parse_config('XML2_CONFIG',checks='--cflags'):
+ if env.get('XML2_LIBS') or env.get('XML2_INCLUDES'):
+ REQUIRED_LIBSHEADERS.insert(0,['libxml2','libxml/parser.h',True,'C'])
+ if env.get('XML2_INCLUDES'):
+ inc_path = env['XML2_INCLUDES']
+ env.AppendUnique(CPPPATH = fix_path(inc_path))
+ if env.get('XML2_LIBS'):
+ lib_path = env['XML2_LIBS']
+ env.AppendUnique(LIBPATH = fix_path(lib_path))
+ elif conf.parse_config('XML2_CONFIG',checks='--cflags'):
env['HAS_LIBXML2'] = True
else:
env['MISSING_DEPS'].append('libxml2')
- REQUIRED_LIBSHEADERS = [
- ['z', 'zlib.h', True,'C'],
- [env['ICU_LIB_NAME'],'unicode/unistr.h',True,'C++'],
- ['harfbuzz', 'harfbuzz/hb.h',True,'C++']
- ]
+ if not env['HOST']:
+ if conf.CheckHasDlfcn():
+ env.Append(CPPDEFINES = '-DMAPNIK_HAS_DLCFN')
+ else:
+ env['SKIPPED_DEPS'].extend(['dlfcn'])
OPTIONAL_LIBSHEADERS = []
@@ -1205,8 +1300,8 @@ if not preconfigured:
OPTIONAL_LIBSHEADERS.append(['jpeg', ['stdio.h', 'jpeglib.h'], False,'C','-DHAVE_JPEG'])
inc_path = env['%s_INCLUDES' % 'JPEG']
lib_path = env['%s_LIBS' % 'JPEG']
- env.AppendUnique(CPPPATH = os.path.realpath(inc_path))
- env.AppendUnique(LIBPATH = os.path.realpath(lib_path))
+ env.AppendUnique(CPPPATH = fix_path(inc_path))
+ env.AppendUnique(LIBPATH = fix_path(lib_path))
else:
env['SKIPPED_DEPS'].extend(['jpeg'])
@@ -1214,8 +1309,8 @@ if not preconfigured:
OPTIONAL_LIBSHEADERS.append(['proj', 'proj_api.h', False,'C','-DMAPNIK_USE_PROJ4'])
inc_path = env['%s_INCLUDES' % 'PROJ']
lib_path = env['%s_LIBS' % 'PROJ']
- env.AppendUnique(CPPPATH = os.path.realpath(inc_path))
- env.AppendUnique(LIBPATH = os.path.realpath(lib_path))
+ env.AppendUnique(CPPPATH = fix_path(inc_path))
+ env.AppendUnique(LIBPATH = fix_path(lib_path))
else:
env['SKIPPED_DEPS'].extend(['proj'])
@@ -1223,8 +1318,8 @@ if not preconfigured:
OPTIONAL_LIBSHEADERS.append(['png', 'png.h', False,'C','-DHAVE_PNG'])
inc_path = env['%s_INCLUDES' % 'PNG']
lib_path = env['%s_LIBS' % 'PNG']
- env.AppendUnique(CPPPATH = os.path.realpath(inc_path))
- env.AppendUnique(LIBPATH = os.path.realpath(lib_path))
+ env.AppendUnique(CPPPATH = fix_path(inc_path))
+ env.AppendUnique(LIBPATH = fix_path(lib_path))
else:
env['SKIPPED_DEPS'].extend(['png'])
@@ -1232,8 +1327,8 @@ if not preconfigured:
OPTIONAL_LIBSHEADERS.append(['webp', 'webp/decode.h', False,'C','-DHAVE_WEBP'])
inc_path = env['%s_INCLUDES' % 'WEBP']
lib_path = env['%s_LIBS' % 'WEBP']
- env.AppendUnique(CPPPATH = os.path.realpath(inc_path))
- env.AppendUnique(LIBPATH = os.path.realpath(lib_path))
+ env.AppendUnique(CPPPATH = fix_path(inc_path))
+ env.AppendUnique(LIBPATH = fix_path(lib_path))
else:
env['SKIPPED_DEPS'].extend(['webp'])
@@ -1241,8 +1336,8 @@ if not preconfigured:
OPTIONAL_LIBSHEADERS.append(['tiff', 'tiff.h', False,'C','-DHAVE_TIFF'])
inc_path = env['%s_INCLUDES' % 'TIFF']
lib_path = env['%s_LIBS' % 'TIFF']
- env.AppendUnique(CPPPATH = os.path.realpath(inc_path))
- env.AppendUnique(LIBPATH = os.path.realpath(lib_path))
+ env.AppendUnique(CPPPATH = fix_path(inc_path))
+ env.AppendUnique(LIBPATH = fix_path(lib_path))
else:
env['SKIPPED_DEPS'].extend(['tiff'])
@@ -1251,7 +1346,7 @@ if not preconfigured:
conf.prioritize_paths(silent=True)
# test for C++11 support, which is required
- if not conf.supports_cxx11():
+ if not env['HOST'] and not conf.supports_cxx11():
color_print(1,"C++ compiler does not support C++11 standard (-std=c++11), which is required. Please upgrade your compiler to at least g++ 4.7 (ideally 4.8)")
Exit(1)
@@ -1264,12 +1359,15 @@ if not preconfigured:
else:
color_print(4, 'Could not find optional header or shared library for %s' % libname)
env['SKIPPED_DEPS'].append(libname)
-
- if not env['HOST']:
- if env['ICU_LIB_NAME'] not in env['MISSING_DEPS']:
- if not conf.icu_at_least_four_two():
- # expression_string.cpp and map.cpp use fromUTF* function only available in >= ICU 4.2
- env['MISSING_DEPS'].append(env['ICU_LIB_NAME'])
+ else:
+ if libname == env['ICU_LIB_NAME']:
+ if env['ICU_LIB_NAME'] not in env['MISSING_DEPS']:
+ if not conf.icu_at_least_four_two():
+ # expression_string.cpp and map.cpp use fromUTF* function only available in >= ICU 4.2
+ env['MISSING_DEPS'].append(env['ICU_LIB_NAME'])
+ elif libname == 'harfbuzz':
+ if not conf.harfbuzz_version():
+ env['SKIPPED_DEPS'].append('harfbuzz-min-version')
if env['BIGINT']:
env.Append(CPPDEFINES = '-DBIGINT')
@@ -1333,6 +1431,19 @@ if not preconfigured:
color_print(4,'Could not find optional header or shared library for boost %s' % libinfo[0])
env['SKIPPED_DEPS'].append('boost ' + libinfo[0])
+ # Boost versions before 1.57 are broken when the system package and
+ # Mapnik are compiled against different standards. On Ubuntu 14.04
+ # using boost 1.54, it breaks scoped enums. It's a bit of a hack to
+ # just turn it off like this, but seems the only available work-
+ # around. See https://svn.boost.org/trac/boost/ticket/6779 for more
+ # details.
+ boost_version = [int(x) for x in env.get('BOOST_LIB_VERSION_FROM_HEADER').split('_')]
+ if not conf.CheckBoostScopedEnum():
+ if boost_version < [1, 51]:
+ env.Append(CXXFLAGS = '-DBOOST_NO_SCOPED_ENUMS')
+ elif boost_version < [1, 57]:
+ env.Append(CXXFLAGS = '-DBOOST_NO_CXX11_SCOPED_ENUMS')
+
if not env['HOST'] and env['ICU_LIB_NAME'] not in env['MISSING_DEPS']:
# http://lists.boost.org/Archives/boost/2009/03/150076.php
# we need libicui18n if using static boost libraries, so it is
@@ -1387,7 +1498,22 @@ if not preconfigured:
else:
details['lib'] = libname
elif plugin == 'postgis' or plugin == 'pgraster':
- conf.parse_pg_config('PG_CONFIG')
+ if env.get('PG_LIBS') or env.get('PG_INCLUDES'):
+ libname = details['lib']
+ if env.get('PG_INCLUDES'):
+ inc_path = env['PG_INCLUDES']
+ env.AppendUnique(CPPPATH = fix_path(inc_path))
+ if env.get('PG_LIBS'):
+ lib_path = env['PG_LIBS']
+ env.AppendUnique(LIBPATH = fix_path(lib_path))
+ if not conf.CheckLibWithHeader(libname, details['inc'], details['lang']):
+ env['SKIPPED_DEPS'].append(libname)
+ if libname in env['LIBS']:
+ env['LIBS'].remove(libname)
+ else:
+ details['lib'] = libname
+ else:
+ conf.parse_pg_config('PG_CONFIG')
elif plugin == 'ogr':
if conf.ogr_enabled():
if conf.parse_config('GDAL_CONFIG',checks='--libs'):
@@ -1407,8 +1533,8 @@ if not preconfigured:
# to the beginning of the path list even if they already exist
incpath = env['%s_INCLUDES' % details['path']]
libpath = env['%s_LIBS' % details['path']]
- env.PrependUnique(CPPPATH = os.path.realpath(incpath),delete_existing=True)
- env.PrependUnique(LIBPATH = os.path.realpath(libpath),delete_existing=True)
+ env.PrependUnique(CPPPATH = fix_path(incpath),delete_existing=True)
+ env.PrependUnique(LIBPATH = fix_path(libpath),delete_existing=True)
if not conf.CheckLibWithHeader(details['lib'], details['inc'], details['lang']):
env.Replace(**backup)
env['SKIPPED_DEPS'].append(details['lib'])
@@ -1416,7 +1542,7 @@ if not preconfigured:
sqlite_backup = env.Clone().Dictionary()
# if statically linking, on linux we likely
# need to link sqlite to pthreads and dl
- if env['RUNTIME_LINK'] == 'static':
+ if env['RUNTIME_LINK'] == 'static' and not env['PLATFORM'] == 'Darwin':
if CHECK_PKG_CONFIG and conf.CheckPKG('sqlite3'):
sqlite_env = env.Clone()
try:
@@ -1426,7 +1552,15 @@ if not preconfigured:
env["SQLITE_LINKFLAGS"].append(lib)
env.Append(LIBS=lib)
except OSError,e:
- pass
+ for lib in ["sqlite3","dl","pthread"]:
+ if not lib in env['LIBS']:
+ env["SQLITE_LINKFLAGS"].append("lib")
+ env.Append(LIBS=lib)
+ else:
+ for lib in ["sqlite3","dl","pthread"]:
+ if not lib in env['LIBS']:
+ env["SQLITE_LINKFLAGS"].append("lib")
+ env.Append(LIBS=lib)
SQLITE_HAS_RTREE = conf.sqlite_has_rtree()
if not SQLITE_HAS_RTREE:
env.Replace(**sqlite_backup)
@@ -1448,8 +1582,8 @@ if not preconfigured:
if env['PGSQL2SQLITE']:
if 'sqlite3' not in env['LIBS']:
env.AppendUnique(LIBS='sqlite3')
- env.AppendUnique(CPPPATH = os.path.realpath(env['SQLITE_INCLUDES']))
- env.AppendUnique(LIBPATH = os.path.realpath(env['SQLITE_LIBS']))
+ env.AppendUnique(CPPPATH = fix_path(env['SQLITE_INCLUDES']))
+ env.AppendUnique(LIBPATH = fix_path(env['SQLITE_LIBS']))
if 'pq' not in env['LIBS']:
if not conf.parse_pg_config('PG_CONFIG'):
env['PGSQL2SQLITE'] = False
@@ -1469,11 +1603,11 @@ if not preconfigured:
if env['CAIRO_LIBS'] or env['CAIRO_INCLUDES']:
c_inc = env['CAIRO_INCLUDES']
if env['CAIRO_LIBS']:
- env["CAIRO_LIBPATHS"].append(os.path.realpath(env['CAIRO_LIBS']))
+ env["CAIRO_LIBPATHS"].append(fix_path(env['CAIRO_LIBS']))
if not env['CAIRO_INCLUDES']:
c_inc = env['CAIRO_LIBS'].replace('lib','',1)
if c_inc:
- c_inc = os.path.normpath(os.path.realpath(env['CAIRO_INCLUDES']))
+ c_inc = os.path.normpath(fix_path(env['CAIRO_INCLUDES']))
if c_inc.endswith('include'):
c_inc = os.path.dirname(c_inc)
env["CAIRO_CPPPATHS"].extend(
@@ -1531,93 +1665,12 @@ if not preconfigured:
env['SKIPPED_DEPS'].append('cairo')
env['HAS_CAIRO'] = False
- if 'python' in env['BINDINGS'] or 'python' in env['REQUESTED_PLUGINS']:
- if not os.access(env['PYTHON'], os.X_OK):
- color_print(1,"Cannot run python interpreter at '%s', make sure that you have the permissions to execute it." % env['PYTHON'])
- Exit(1)
-
- py3 = 'True' in os.popen('''%s -c "import sys as s;s.stdout.write(str(s.version_info[0] == 3))"''' % env['PYTHON']).read().strip()
-
- if py3:
- sys_prefix = '''%s -c "import sys; print(sys.prefix)"''' % env['PYTHON']
- else:
- sys_prefix = '''%s -c "import sys; print sys.prefix"''' % env['PYTHON']
- env['PYTHON_SYS_PREFIX'] = call(sys_prefix)
-
- if HAS_DISTUTILS:
- if py3:
- sys_version = '''%s -c "from distutils.sysconfig import get_python_version; print(get_python_version())"''' % env['PYTHON']
- else:
- sys_version = '''%s -c "from distutils.sysconfig import get_python_version; print get_python_version()"''' % env['PYTHON']
- env['PYTHON_VERSION'] = call(sys_version)
-
- if py3:
- py_includes = '''%s -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())"''' % env['PYTHON']
- else:
- py_includes = '''%s -c "from distutils.sysconfig import get_python_inc; print get_python_inc()"''' % env['PYTHON']
- env['PYTHON_INCLUDES'].append(call(py_includes))
-
- # also append platform specific includes
- if py3:
- py_plat_includes = '''%s -c "from distutils.sysconfig import get_python_inc; print(get_python_inc(plat_specific=True))"''' % env['PYTHON']
- else:
- py_plat_includes = '''%s -c "from distutils.sysconfig import get_python_inc; print get_python_inc(plat_specific=True)"''' % env['PYTHON']
- env['PYTHON_INCLUDES'].append(call(py_plat_includes))
-
- # Note: we use the plat_specific argument here to make sure to respect the arch-specific site-packages location
- if py3:
- site_packages = '''%s -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(plat_specific=True))"''' % env['PYTHON']
- else:
- site_packages = '''%s -c "from distutils.sysconfig import get_python_lib; print get_python_lib(plat_specific=True)"''' % env['PYTHON']
- env['PYTHON_SITE_PACKAGES'] = call(site_packages)
- else:
- env['PYTHON_SYS_PREFIX'] = os.popen('''%s -c "import sys; print sys.prefix"''' % env['PYTHON']).read().strip()
- env['PYTHON_VERSION'] = os.popen('''%s -c "import sys; print sys.version"''' % env['PYTHON']).read()[0:3]
- env['PYTHON_INCLUDES'] = [env['PYTHON_SYS_PREFIX'] + '/include/python' + env['PYTHON_VERSION']]
- env['PYTHON_SITE_PACKAGES'] = env['DESTDIR'] + os.path.sep + env['PYTHON_SYS_PREFIX'] + os.path.sep + env['LIBDIR_SCHEMA'] + '/python' + env['PYTHON_VERSION'] + '/site-packages/'
-
- # if user-requested custom prefix fall back to manual concatenation for building subdirectories
- if env['PYTHON_PREFIX']:
- py_relative_install = env['LIBDIR_SCHEMA'] + '/python' + env['PYTHON_VERSION'] + '/site-packages/'
- env['PYTHON_INSTALL_LOCATION'] = env['DESTDIR'] + os.path.sep + env['PYTHON_PREFIX'] + os.path.sep + py_relative_install
- else:
- env['PYTHON_INSTALL_LOCATION'] = env['DESTDIR'] + os.path.sep + env['PYTHON_SITE_PACKAGES']
-
- if py3:
- is_64_bit = '''%s -c "import sys; print(sys.maxsize == 9223372036854775807)"''' % env['PYTHON']
- else:
- is_64_bit = '''%s -c "import sys; print sys.maxint == 9223372036854775807"''' % env['PYTHON']
-
- if is_64_bit:
- env['PYTHON_IS_64BIT'] = True
- else:
- env['PYTHON_IS_64BIT'] = False
-
- if has_boost_devel and 'python' in env['BINDINGS']:
- if py3 and env['BOOST_PYTHON_LIB'] == 'boost_python':
- env['BOOST_PYTHON_LIB'] = 'boost_python3%s' % env['BOOST_APPEND']
- elif env['BOOST_PYTHON_LIB'] == 'boost_python':
- env['BOOST_PYTHON_LIB'] = 'boost_python%s' % env['BOOST_APPEND']
- if not env['HOST']:
- if not conf.CheckHeader(header='boost/python/detail/config.hpp',language='C++'):
- color_print(1,'Could not find required header files for boost python')
- env['MISSING_DEPS'].append('boost python')
-
- if env['CAIRO']:
- if CHECK_PKG_CONFIG and conf.CheckPKG('pycairo'):
- env['HAS_PYCAIRO'] = True
- else:
- env['SKIPPED_DEPS'].extend(['pycairo'])
- else:
- color_print(4,'Not building with pycairo support, pass CAIRO=True to enable')
-
-
#### End Config Stage for Required Dependencies ####
if env['MISSING_DEPS']:
# if required dependencies are missing, print warnings and then let SCons finish without building or saving local config
color_print(1,'\nExiting... the following required dependencies were not found:\n - %s' % '\n - '.join([pretty_dep(dep) for dep in env['MISSING_DEPS']]))
- color_print(1,"\nSee '%s' for details on possible problems." % (os.path.realpath(SCONS_LOCAL_LOG)))
+ color_print(1,"\nSee '%s' for details on possible problems." % (fix_path(SCONS_LOCAL_LOG)))
if env['SKIPPED_DEPS']:
color_print(4,'\nAlso, these OPTIONAL dependencies were not found:\n - %s' % '\n - '.join([pretty_dep(dep) for dep in env['SKIPPED_DEPS']]))
color_print(4,"\nSet custom paths to these libraries and header files on the command-line or in a file called '%s'" % SCONS_LOCAL_CONFIG)
@@ -1725,8 +1778,8 @@ if not preconfigured:
env.Append(CPPDEFINES = ndebug_defines)
# Common flags for g++/clang++ CXX compiler.
- # TODO: clean up code more to make -Wextra -Wsign-conversion -Wconversion -Wshadow viable
- common_cxx_flags = '-Wall -Wsign-compare %s %s -ftemplate-depth-300 ' % (env['WARNING_CXXFLAGS'], pthread)
+ # TODO: clean up code more to make -Wextra -Wsign-compare -Wsign-conversion -Wconversion -Wshadow viable
+ common_cxx_flags = '-Wall %s %s -ftemplate-depth-300 ' % (env['WARNING_CXXFLAGS'], pthread)
if 'clang++' in env['CXX']:
common_cxx_flags += ' -Wno-unknown-pragmas -Wno-unsequenced '
@@ -1742,29 +1795,6 @@ if not preconfigured:
if env['DEBUG_UNDEFINED']:
env.Append(CXXFLAGS = '-fsanitize=undefined-trap -fsanitize-undefined-trap-on-error -ftrapv -fwrapv')
- if 'python' in env['BINDINGS'] or 'python' in env['REQUESTED_PLUGINS']:
- majver, minver = env['PYTHON_VERSION'].split('.')
- # we don't want the includes it in the main environment...
- # as they are later set in the python build.py
- # ugly hack needed until we have env specific conf
- backup = env.Clone().Dictionary()
- for pyinc in env['PYTHON_INCLUDES']:
- env.AppendUnique(CPPPATH = os.path.realpath(pyinc))
-
- if not conf.CheckHeader(header='Python.h',language='C'):
- color_print(1,'Could not find required header files for the Python language (version %s)' % env['PYTHON_VERSION'])
- Exit(1)
-
- if (int(majver), int(minver)) < (2, 2):
- color_print(1,"Python version 2.2 or greater required")
- Exit(1)
-
- if 'python' in env['BINDINGS']:
- color_print(4,'Bindings Python version... %s' % env['PYTHON_VERSION'])
- color_print(4,'Python %s prefix... %s' % (env['PYTHON_VERSION'], env['PYTHON_SYS_PREFIX']))
- color_print(4,'Python bindings will install in... %s' % os.path.normpath(env['PYTHON_INSTALL_LOCATION']))
- env.Replace(**backup)
-
# if requested, sort LIBPATH and CPPPATH one last time before saving...
if env['PRIORITIZE_LINKING']:
conf.prioritize_paths(silent=True)
@@ -1815,11 +1845,11 @@ if not HELP_REQUESTED:
env['create_uninstall_target'] = create_uninstall_target
if env['PKG_CONFIG_PATH']:
- env['ENV']['PKG_CONFIG_PATH'] = os.path.realpath(env['PKG_CONFIG_PATH'])
+ env['ENV']['PKG_CONFIG_PATH'] = fix_path(env['PKG_CONFIG_PATH'])
# otherwise this variable == os.environ["PKG_CONFIG_PATH"]
if env['PATH']:
- env['ENV']['PATH'] = os.path.realpath(env['PATH']) + ':' + env['ENV']['PATH']
+ env['ENV']['PATH'] = fix_path(env['PATH']) + ':' + env['ENV']['PATH']
if env['PATH_REMOVE']:
for p in env['PATH_REMOVE'].split(':'):
@@ -1948,39 +1978,20 @@ if not HELP_REQUESTED:
else :
color_print(1,"WARNING: Cannot find boost_program_options. 'shapeindex' and other command line programs will not be available")
- # Build the Python bindings
- if 'python' in env['BINDINGS']:
- SConscript('bindings/python/build.py')
-
- # Install the python speed testing scripts if python bindings will be available
- SConscript('utils/performance/build.py')
-
- # Install the mapnik upgrade script
- SConscript('utils/upgrade_map_xml/build.py')
-
# Configure fonts and if requested install the bundled DejaVu fonts
SConscript('fonts/build.py')
# build C++ tests
- SConscript('tests/cpp_tests/build.py')
+ SConscript('test/build.py')
if env['BENCHMARK']:
SConscript('benchmark/build.py')
+ if os.path.exists('./bindings/python/build.py'):
+ SConscript('./bindings/python/build.py')
+
# install mapnik-config script
SConscript('utils/mapnik-config/build.py')
# write the viewer.ini file
SConscript('demo/viewer/build.py')
-
- # if requested, build the sample input plugins
- if env['SAMPLE_INPUT_PLUGINS']:
- SConscript('plugins/input/templates/helloworld/build.py')
- else:
- if 'install' in COMMAND_LINE_TARGETS:
- plugin_path = os.path.join(env['MAPNIK_INPUT_PLUGINS_DEST'],'hello.input')
- if os.path.exists(plugin_path):
- color_print(4,"Notice: removing out of date plugin: '%s'" % plugin_path)
- os.unlink(plugin_path)
- if os.path.exists('plugins/input/templates/hello.input'):
- os.unlink('plugins/input/templates/hello.input')
diff --git a/benchmark/bench_framework.hpp b/benchmark/bench_framework.hpp
index f2afc48..33c5b0f 100644
--- a/benchmark/bench_framework.hpp
+++ b/benchmark/bench_framework.hpp
@@ -37,7 +37,7 @@ public:
return iterations_;
}
virtual bool validate() const = 0;
- virtual void operator()() const = 0;
+ virtual bool operator()() const = 0;
virtual ~test_case() {}
};
@@ -85,35 +85,40 @@ int run(T const& test_runner, std::string const& name)
std::clog << "test did not validate: " << name << "\n";
return -1;
}
- std::chrono::high_resolution_clock::time_point start;
- std::chrono::high_resolution_clock::duration elapsed;
- std::stringstream s;
- s << name << ":"
- << std::setw(45 - (int)s.tellp()) << std::right
- << " t:" << test_runner.threads()
- << " i:" << test_runner.iterations();
- if (test_runner.threads() > 0)
+ // run test once before timing
+ // if it returns false then we'll abort timing
+ if (test_runner())
{
- using thread_group = std::vector<std::unique_ptr<std::thread> >;
- using value_type = thread_group::value_type;
- thread_group tg;
- for (std::size_t i=0;i<test_runner.threads();++i)
+ std::chrono::high_resolution_clock::time_point start;
+ std::chrono::high_resolution_clock::duration elapsed;
+ std::stringstream s;
+ s << name << ":"
+ << std::setw(45 - (int)s.tellp()) << std::right
+ << " t:" << test_runner.threads()
+ << " i:" << test_runner.iterations();
+ if (test_runner.threads() > 0)
{
- tg.emplace_back(new std::thread(test_runner));
+ using thread_group = std::vector<std::unique_ptr<std::thread> >;
+ using value_type = thread_group::value_type;
+ thread_group tg;
+ for (std::size_t i=0;i<test_runner.threads();++i)
+ {
+ tg.emplace_back(new std::thread(test_runner));
+ }
+ start = std::chrono::high_resolution_clock::now();
+ std::for_each(tg.begin(), tg.end(), [](value_type & t) {if (t->joinable()) t->join();});
+ elapsed = std::chrono::high_resolution_clock::now() - start;
}
- start = std::chrono::high_resolution_clock::now();
- std::for_each(tg.begin(), tg.end(), [](value_type & t) {if (t->joinable()) t->join();});
- elapsed = std::chrono::high_resolution_clock::now() - start;
- }
- else
- {
- start = std::chrono::high_resolution_clock::now();
- test_runner();
- elapsed = std::chrono::high_resolution_clock::now() - start;
+ else
+ {
+ start = std::chrono::high_resolution_clock::now();
+ test_runner();
+ elapsed = std::chrono::high_resolution_clock::now() - start;
+ }
+ s << std::setw(65 - (int)s.tellp()) << std::right
+ << std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count() << " milliseconds\n";
+ std::clog << s.str();
}
- s << std::setw(65 - (int)s.tellp()) << std::right
- << std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count() << " milliseconds\n";
- std::clog << s.str();
return 0;
}
catch (std::exception const& ex)
diff --git a/benchmark/build.py b/benchmark/build.py
index 3b5ff20..e84f421 100644
--- a/benchmark/build.py
+++ b/benchmark/build.py
@@ -8,6 +8,7 @@ test_env = env.Clone()
test_env['LIBS'] = [env['MAPNIK_NAME']]
test_env.AppendUnique(LIBS=copy(env['LIBMAPNIK_LIBS']))
+test_env.AppendUnique(LIBS='mapnik-wkt')
if env['PLATFORM'] == 'Linux':
test_env.AppendUnique(LIBS='dl')
test_env.AppendUnique(LIBS='rt')
@@ -34,7 +35,7 @@ benchmarks = [
#"test_to_double.cpp",
#"test_to_int.cpp",
#"test_utf_encoding.cpp"
- #"test_polygon_clipping.cpp",
+ "test_polygon_clipping.cpp",
#"test_polygon_clipping_rendering.cpp",
"test_proj_transform1.cpp",
"test_expression_parse.cpp",
@@ -42,6 +43,7 @@ benchmarks = [
"test_font_registration.cpp",
"test_rendering.cpp",
"test_rendering_shared_map.cpp",
+# "test_numeric_cast_vs_static_cast.cpp",
]
for cpp_test in benchmarks:
test_program = test_env_local.Program('out/'+cpp_test.replace('.cpp',''), source=[cpp_test])
diff --git a/benchmark/compare_images.hpp b/benchmark/compare_images.hpp
index 8e4f177..8fc6b19 100644
--- a/benchmark/compare_images.hpp
+++ b/benchmark/compare_images.hpp
@@ -1,8 +1,7 @@
#ifndef __MAPNIK_COMPARE_IMAGES_HPP__
-#define __MAPNIK_COMPARE_IMAGES_HPP__
+#define __MAPNIK_COMPARE_IMAGES_HPP__
-#include <mapnik/graphics.hpp>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
#include <mapnik/image_util.hpp>
#include <mapnik/image_reader.hpp>
@@ -17,27 +16,26 @@ namespace benchmark {
{
throw mapnik::image_reader_exception("Failed to load: " + dest_fn);
}
- std::shared_ptr<image_32> image_ptr1 = std::make_shared<image_32>(reader1->width(),reader1->height());
- reader1->read(0,0,image_ptr1->data());
std::unique_ptr<mapnik::image_reader> reader2(mapnik::get_image_reader(src_fn,"png"));
if (!reader2.get())
{
throw mapnik::image_reader_exception("Failed to load: " + src_fn);
}
- std::shared_ptr<image_32> image_ptr2 = std::make_shared<image_32>(reader2->width(),reader2->height());
- reader2->read(0,0,image_ptr2->data());
- image_data_32 const& dest = image_ptr1->data();
- image_data_32 const& src = image_ptr2->data();
+ const image_any desc_any = reader1->read(0,0,reader1->width(), reader1->height());
+ const image_any src_any = reader2->read(0,0,reader2->width(), reader2->height());
+
+ image_rgba8 const& dest = util::get<image_rgba8>(desc_any);
+ image_rgba8 const& src = util::get<image_rgba8>(src_any);
unsigned int width = src.width();
unsigned int height = src.height();
if ((width != dest.width()) || height != dest.height()) return false;
for (unsigned int y = 0; y < height; ++y)
{
- const unsigned int* row_from = src.getRow(y);
- const unsigned int* row_to = dest.getRow(y);
+ const unsigned int* row_from = src.get_row(y);
+ const unsigned int* row_to = dest.get_row(y);
for (unsigned int x = 0; x < width; ++x)
{
if (row_from[x] != row_to[x]) return false;
@@ -48,4 +46,4 @@ namespace benchmark {
}
-#endif // __MAPNIK_COMPARE_IMAGES_HPP__
\ No newline at end of file
+#endif // __MAPNIK_COMPARE_IMAGES_HPP__
diff --git a/benchmark/data/gdal-wgs.xml b/benchmark/data/gdal-wgs.xml
new file mode 100644
index 0000000..aa58665
--- /dev/null
+++ b/benchmark/data/gdal-wgs.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE Map[]>
+<Map
+ srs="+init=epsg:4326"
+ background-color="#dfd8c9">
+
+<Style name="style">
+ <Rule>
+ <RasterSymbolizer />
+ </Rule>
+</Style>
+<Layer name="layer"
+ srs="+init=epsg:4326">
+ <StyleName>style</StyleName>
+ <Datasource>
+ <Parameter name="file">./valid.geotiff.tif</Parameter>
+ <Parameter name="type">gdal</Parameter>
+ </Datasource>
+ </Layer>
+
+</Map>
diff --git a/benchmark/data/polygon_clipping_agg.png b/benchmark/data/polygon_clipping_agg.png
index 34709ab..6c38b39 100644
Binary files a/benchmark/data/polygon_clipping_agg.png and b/benchmark/data/polygon_clipping_agg.png differ
diff --git a/benchmark/data/polygon_clipping_boost.png b/benchmark/data/polygon_clipping_boost.png
index 34709ab..21760b7 100644
Binary files a/benchmark/data/polygon_clipping_boost.png and b/benchmark/data/polygon_clipping_boost.png differ
diff --git a/benchmark/data/polygon_clipping_clipper.png b/benchmark/data/polygon_clipping_clipper.png
index a52fd50..d2e5ed4 100644
Binary files a/benchmark/data/polygon_clipping_clipper.png and b/benchmark/data/polygon_clipping_clipper.png differ
diff --git a/benchmark/data/raster-wgs.xml b/benchmark/data/raster-wgs.xml
new file mode 100644
index 0000000..3ee054d
--- /dev/null
+++ b/benchmark/data/raster-wgs.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE Map[]>
+<Map
+ srs="+init=epsg:4326"
+ background-color="#dfd8c9">
+
+<Style name="style">
+ <Rule>
+ <RasterSymbolizer />
+ </Rule>
+</Style>
+<Layer name="layer"
+ srs="+init=epsg:4326">
+ <StyleName>style</StyleName>
+ <Datasource>
+ <Parameter name="file">./valid.geotiff.tif</Parameter>
+ <Parameter name="type">raster</Parameter>
+ </Datasource>
+ </Layer>
+
+</Map>
diff --git a/benchmark/data/valid.geotiff.tif b/benchmark/data/valid.geotiff.tif
new file mode 100644
index 0000000..b2fe90d
Binary files /dev/null and b/benchmark/data/valid.geotiff.tif differ
diff --git a/benchmark/run b/benchmark/run
index 901c276..13e7e49 100755
--- a/benchmark/run
+++ b/benchmark/run
@@ -29,4 +29,22 @@ run test_font_registration 10 1000
--width 600 \
--height 600 \
--iterations 20 \
- --threads 10
\ No newline at end of file
+ --threads 10
+
+./benchmark/out/test_rendering \
+ --name "gdal tiff rendering" \
+ --map benchmark/data/gdal-wgs.xml \
+ --extent -180.0,-120.0,180.0,120.0 \
+ --width 600 \
+ --height 600 \
+ --iterations 20 \
+ --threads 10
+
+./benchmark/out/test_rendering \
+ --name "raster tiff rendering" \
+ --map benchmark/data/raster-wgs.xml \
+ --extent -180.0,-120.0,180.0,120.0 \
+ --width 600 \
+ --height 600 \
+ --iterations 20 \
+ --threads 10
diff --git a/benchmark/test_array_allocation.cpp b/benchmark/test_array_allocation.cpp
index e0e4fad..05da7ae 100644
--- a/benchmark/test_array_allocation.cpp
+++ b/benchmark/test_array_allocation.cpp
@@ -1,6 +1,7 @@
#include "bench_framework.hpp"
#include <cstring>
#include <cstdlib>
+#include <deque>
#include <stdexcept>
#include <array>
#include <valarray>
@@ -40,7 +41,7 @@ public:
{
return true;
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
// NOTE: sizeof(uint8_t) == 1
@@ -49,6 +50,7 @@ public:
ensure_zero(data,size_);
free(data);
}
+ return true;
}
};
@@ -65,7 +67,7 @@ public:
{
return true;
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
// NOTE: sizeof(uint8_t) == 1
@@ -74,6 +76,7 @@ public:
ensure_zero(data,size_);
free(data);
}
+ return true;
}
};
@@ -90,7 +93,7 @@ public:
{
return true;
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
uint8_t *data = static_cast<uint8_t *>(::operator new(sizeof(uint8_t) * size_));
@@ -98,6 +101,7 @@ public:
ensure_zero(data,size_);
::operator delete(data);
}
+ return true;
}
};
@@ -115,7 +119,7 @@ public:
{
return true;
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
uint8_t * data = static_cast<uint8_t*>(::operator new(sizeof(uint8_t)*size_));
@@ -123,6 +127,7 @@ public:
ensure_zero(data,size_);
::operator delete(data),data=0;
}
+ return true;
}
};
@@ -139,12 +144,13 @@ public:
{
return true;
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
std::vector<uint8_t> data(size_);
ensure_zero(&data[0],data.size());
}
+ return true;
}
};
@@ -162,13 +168,14 @@ public:
{
return true;
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
std::vector<uint8_t> data(0);
data.resize(size_,0);
ensure_zero(&data[0],data.size());
}
+ return true;
}
};
@@ -186,13 +193,68 @@ public:
{
return true;
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
std::vector<uint8_t> data(0);
data.assign(size_,0);
ensure_zero(&data[0],data.size());
}
+ return true;
+ }
+};
+
+class test3d : public benchmark::test_case
+{
+public:
+ uint32_t size_;
+ std::vector<uint8_t> array_;
+ test3d(mapnik::parameters const& params)
+ : test_case(params),
+ size_(*params.get<mapnik::value_integer>("size",256*256)),
+ array_(size_,0) { }
+ bool validate() const
+ {
+ return true;
+ }
+ bool operator()() const
+ {
+ for (std::size_t i=0;i<iterations_;++i) {
+ std::deque<uint8_t> data(size_);
+ for (std::size_t i=0;i<size_;++i) {
+ if (data[i] != 0) {
+ throw std::runtime_error("found non zero value");
+ }
+ }
+ }
+ return true;
+ }
+};
+
+class test3d : public benchmark::test_case
+{
+public:
+ uint32_t size_;
+ std::vector<uint8_t> array_;
+ test3d(mapnik::parameters const& params)
+ : test_case(params),
+ size_(*params.get<mapnik::value_integer>("size",256*256)),
+ array_(size_,0) { }
+ bool validate() const
+ {
+ return true;
+ }
+ bool operator()() const
+ {
+ for (std::size_t i=0;i<iterations_;++i) {
+ std::deque<uint8_t> data(size_);
+ for (std::size_t i=0;i<size_;++i) {
+ if (data[i] != 0) {
+ throw std::runtime_error("found non zero value");
+ }
+ }
+ }
+ return true;
}
};
@@ -209,13 +271,14 @@ public:
{
return true;
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
uint8_t *data = (uint8_t *)calloc(size_,sizeof(uint8_t));
ensure_zero(data,size_);
free(data);
}
+ return true;
}
};
@@ -232,12 +295,13 @@ public:
{
return true;
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
std::string data(array_.begin(),array_.end());
ensure_zero((uint8_t *)&data[0],size_);
}
+ return true;
}
};
@@ -254,12 +318,13 @@ public:
{
return true;
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
std::string data(&array_[0],array_.size());
ensure_zero((uint8_t *)&data[0],size_);
}
+ return true;
}
};
@@ -281,12 +346,13 @@ public:
{
return true;
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
std::valarray<uint8_t> data(static_cast<uint8_t>(0),static_cast<size_t>(size_));
ensure_zero(&data[0],size_);
}
+ return true;
}
};
@@ -307,12 +373,13 @@ public:
{
return true;
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
boost::container::static_vector<uint8_t,256*256> data(size_,0);
ensure_zero(&data[0],size_);
}
+ return true;
}
};
#endif
@@ -354,6 +421,10 @@ int main(int argc, char** argv)
run(test_runner,"vector/assign");
}
{
+ test3d test_runner(params);
+ run(test_runner,"deque(N)");
+ }
+ {
test5 test_runner(params);
run(test_runner,"std::string range");
}
diff --git a/benchmark/test_expression_parse.cpp b/benchmark/test_expression_parse.cpp
index 857dde6..704a69c 100644
--- a/benchmark/test_expression_parse.cpp
+++ b/benchmark/test_expression_parse.cpp
@@ -22,11 +22,12 @@ public:
}
return ret;
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
mapnik::expression_ptr expr = mapnik::parse_expression(expr_);
}
+ return true;
}
};
diff --git a/benchmark/test_face_ptr_creation.cpp b/benchmark/test_face_ptr_creation.cpp
index 9e3aa95..186b2ee 100644
--- a/benchmark/test_face_ptr_creation.cpp
+++ b/benchmark/test_face_ptr_creation.cpp
@@ -26,7 +26,7 @@ public:
}
return count == expected_count;
}
- void operator()() const
+ bool operator()() const
{
std::size_t expected_count = mapnik::freetype_engine::face_names().size();
for (unsigned i=0;i<iterations_;++i)
@@ -49,6 +49,7 @@ public:
std::clog << "warning: face creation not working as expected\n";
}
}
+ return true;
}
};
diff --git a/benchmark/test_font_registration.cpp b/benchmark/test_font_registration.cpp
index 2c57ac3..0fd9f8d 100644
--- a/benchmark/test_font_registration.cpp
+++ b/benchmark/test_font_registration.cpp
@@ -12,7 +12,7 @@ public:
{
return mapnik::freetype_engine::register_fonts("./fonts", true);
}
- void operator()() const
+ bool operator()() const
{
unsigned long count = 0;
for (unsigned i=0;i<iterations_;++i)
@@ -20,7 +20,8 @@ public:
mapnik::freetype_engine::register_fonts("./fonts", true);
count++;
}
+ return true;
}
};
-BENCHMARK(test,"font registration")
\ No newline at end of file
+BENCHMARK(test,"font registration")
diff --git a/benchmark/test_numeric_cast_vs_static_cast.cpp b/benchmark/test_numeric_cast_vs_static_cast.cpp
new file mode 100644
index 0000000..52865ac
--- /dev/null
+++ b/benchmark/test_numeric_cast_vs_static_cast.cpp
@@ -0,0 +1,87 @@
+#include "bench_framework.hpp"
+// boost
+#include <boost/numeric/conversion/cast.hpp>
+
+static double STEP_NUM = 0.0000000001;
+static std::uint8_t START_NUM = 2;
+
+class test_static : public benchmark::test_case
+{
+ double step_;
+ std::uint8_t start_;
+public:
+ test_static(mapnik::parameters const& params)
+ : test_case(params),
+ step_(STEP_NUM),
+ start_(START_NUM) {}
+ bool validate() const
+ {
+ return true;
+ }
+ bool operator()() const
+ {
+ double value_ = 0.0;
+ std::uint8_t x;
+ for (std::size_t i=0;i<iterations_;++i) {
+ double c = static_cast<double>(start_) * value_;
+ if (c >= 256.0) c = 255.0;
+ if (c < 0.0) c = 0.0;
+ x = static_cast<std::uint8_t>(c);
+ value_ += step_;
+ }
+ return static_cast<double>(x) < (static_cast<double>(start_) * value_);
+ }
+};
+
+using boost::numeric::positive_overflow;
+using boost::numeric::negative_overflow;
+
+class test_numeric : public benchmark::test_case
+{
+ double step_;
+ std::uint8_t start_;
+public:
+ test_numeric(mapnik::parameters const& params)
+ : test_case(params),
+ step_(STEP_NUM),
+ start_(START_NUM) {}
+ bool validate() const
+ {
+ return true;
+ }
+ bool operator()() const
+ {
+ double value_ = 0.0;
+ std::uint8_t x;
+ for (std::size_t i=0;i<iterations_;++i) {
+ try {
+ x = boost::numeric_cast<std::uint8_t>(start_ * value_);
+ }
+ catch(negative_overflow&)
+ {
+ x = std::numeric_limits<std::uint8_t>::min();
+ }
+ catch(positive_overflow&)
+ {
+ x = std::numeric_limits<std::uint8_t>::max();
+ }
+ value_ += step_;
+ }
+ return static_cast<double>(x) < (static_cast<double>(start_) * value_);
+ }
+};
+
+int main(int argc, char** argv)
+{
+ mapnik::parameters params;
+ benchmark::handle_args(argc,argv,params);
+ {
+ test_static test_runner(params);
+ run(test_runner,"static_cast");
+ }
+ {
+ test_numeric test_runner(params);
+ run(test_runner,"numeric_cast");
+ }
+ return 0;
+}
diff --git a/benchmark/test_png_encoding1.cpp b/benchmark/test_png_encoding1.cpp
index f06a0ef..55d3f18 100644
--- a/benchmark/test_png_encoding1.cpp
+++ b/benchmark/test_png_encoding1.cpp
@@ -1,10 +1,9 @@
#include "bench_framework.hpp"
#include <mapnik/image_util.hpp>
-#include <mapnik/graphics.hpp>
class test : public benchmark::test_case
{
- mapnik::image_data_32 im_;
+ mapnik::image_rgba8 im_;
public:
test(mapnik::parameters const& params)
: test_case(params),
@@ -13,7 +12,7 @@ public:
{
return true;
}
- void operator()() const
+ bool operator()() const
{
std::string out;
for (std::size_t i=0;i<iterations_;++i) {
@@ -21,6 +20,7 @@ public:
out = mapnik::save_to_string(im_,"png8:m=h:z=1");
}
}
+ return true;
};
BENCHMARK(test,"encoding blank png")
diff --git a/benchmark/test_png_encoding2.cpp b/benchmark/test_png_encoding2.cpp
index 12b2f25..640050c 100644
--- a/benchmark/test_png_encoding2.cpp
+++ b/benchmark/test_png_encoding2.cpp
@@ -3,7 +3,7 @@
class test : public benchmark::test_case
{
- std::shared_ptr<image_32> im_;
+ std::shared_ptr<image_rgba8> im_;
public:
test(mapnik::parameters const& params)
: test_case(params) {
@@ -13,24 +13,25 @@ public:
{
throw mapnik::image_reader_exception("Failed to load: " + filename);
}
- im_ = std::make_shared<image_32>(reader->width(),reader->height());
- reader->read(0,0,im_->data());
+ im_ = std::make_shared<image_rgba8>(reader->width(),reader->height());
+ reader->read(0,0,*im_);
}
bool validate() const
{
std::string expected("./benchmark/data/multicolor-hextree-expected.png");
std::string actual("./benchmark/data/multicolor-hextree-actual.png");
- mapnik::save_to_file(im_->data(),actual, "png8:m=h:z=1");
+ mapnik::save_to_file(*im_,actual, "png8:m=h:z=1");
return benchmark::compare_images(actual,expected);
}
- void operator()() const
+ bool operator()() const
{
std::string out;
for (std::size_t i=0;i<iterations_;++i) {
out.clear();
- out = mapnik::save_to_string(im_->data(),"png8:m=h:z=1");
+ out = mapnik::save_to_string(*im_,"png8:m=h:z=1");
}
}
+ return true;
};
BENCHMARK(test,"encoding multicolor png")
diff --git a/benchmark/test_polygon_clipping.cpp b/benchmark/test_polygon_clipping.cpp
index e72a0aa..1591fb1 100644
--- a/benchmark/test_polygon_clipping.cpp
+++ b/benchmark/test_polygon_clipping.cpp
@@ -1,23 +1,25 @@
#include "bench_framework.hpp"
#include "compare_images.hpp"
-#include "agg_conv_clip_polygon.h"
-#include <mapnik/geometry.hpp>
#include <mapnik/vertex.hpp>
#include <mapnik/transform_path_adapter.hpp>
#include <mapnik/view_transform.hpp>
-#include <mapnik/graphics.hpp>
#include <mapnik/wkt/wkt_factory.hpp>
-#include <mapnik/wkt/wkt_grammar_impl.hpp>
-#include <mapnik/geometry.hpp>
#include <mapnik/projection.hpp>
#include <mapnik/proj_transform.hpp>
#include <mapnik/util/fs.hpp>
-#include <mapnik/polygon_clipper.hpp>
+#include <mapnik/geometry.hpp>
+#include <mapnik/vertex_adapters.hpp>
+#include <mapnik/geometry_adapters.hpp>
+#include <mapnik/geometry_envelope.hpp>
+#include <mapnik/geometry_correct.hpp>
+#include <mapnik/geometry_is_empty.hpp>
#include <mapnik/image_util.hpp>
+#include <mapnik/color.hpp>
+#include <boost/geometry.hpp>
// agg
#include "agg_conv_clip_polygon.h"
// clipper
-#include "agg_conv_clipper.h"
+#include "clipper.hpp"
#include "agg_path_storage.h"
// rendering
#include "agg_basics.h"
@@ -29,33 +31,37 @@
// stl
#include <fstream>
+#include <iostream>
+#include <cstdlib>
-void render(mapnik::geometry_type & geom,
+void render(mapnik::geometry::multi_polygon<double> const& geom,
mapnik::box2d<double> const& extent,
std::string const& name)
{
- using path_type = mapnik::transform_path_adapter<mapnik::view_transform,mapnik::geometry_type>;
+ using path_type = mapnik::transform_path_adapter<mapnik::view_transform,mapnik::geometry::polygon_vertex_adapter<double>>;
using ren_base = agg::renderer_base<agg::pixfmt_rgba32_plain>;
using renderer = agg::renderer_scanline_aa_solid<ren_base>;
- mapnik::image_32 im(256,256);
- im.set_background(mapnik::color("white"));
- mapnik::box2d<double> padded_extent = extent;
+ mapnik::image_rgba8 im(256,256);
+ mapnik::fill(im, mapnik::color("white"));
+ mapnik::box2d<double> padded_extent(155,134,665,466);//extent;
padded_extent.pad(10);
mapnik::view_transform tr(im.width(),im.height(),padded_extent,0,0);
- agg::rendering_buffer buf(im.raw_data(),im.width(),im.height(), im.width() * 4);
+ agg::rendering_buffer buf(im.bytes(),im.width(),im.height(), im.row_size());
agg::pixfmt_rgba32_plain pixf(buf);
ren_base renb(pixf);
renderer ren(renb);
+ mapnik::proj_transform prj_trans(mapnik::projection("+init=epsg:4326"),mapnik::projection("+init=epsg:4326"));
ren.color(agg::rgba8(127,127,127,255));
agg::rasterizer_scanline_aa<> ras;
- mapnik::proj_transform prj_trans(mapnik::projection("+init=epsg:4326"),mapnik::projection("+init=epsg:4326"));
- geom.rewind(0);
- path_type path(tr,geom,prj_trans);
- ras.add_path(path);
+ for (auto const& poly : geom)
+ {
+ mapnik::geometry::polygon_vertex_adapter<double> va(poly);
+ path_type path(tr,va,prj_trans);
+ ras.add_path(path);
+ }
agg::scanline_u8 sl;
agg::render_scanlines(ras, sl, ren);
mapnik::save_to_file(im,name);
- geom.rewind(0);
}
class test1 : public benchmark::test_case
@@ -64,7 +70,7 @@ class test1 : public benchmark::test_case
mapnik::box2d<double> extent_;
std::string expected_;
public:
- using conv_clip = agg::conv_clip_polygon<mapnik::geometry_type>;
+ using conv_clip = agg::conv_clip_polygon<mapnik::geometry::polygon_vertex_adapter<double>>;
test1(mapnik::parameters const& params,
std::string const& wkt_in,
mapnik::box2d<double> const& extent)
@@ -74,214 +80,415 @@ public:
expected_("./benchmark/data/polygon_clipping_agg") {}
bool validate() const
{
- std::string expected_wkt("Polygon((181 286.666667,233 454,315 340,421 446,463 324,559 466,631 321.320755,631 234.386861,528 178,394 229,329 138,212 134,183 228,200 264,181 238.244444),(313 190,440 256,470 248,510 305,533 237,613 263,553 397,455 262,405 378,343 287,249 334,229 191,313 190,313 190))");
- boost::ptr_vector<mapnik::geometry_type> paths;
- if (!mapnik::from_wkt(wkt_in_, paths))
+ mapnik::geometry::geometry<double> geom;
+ if (!mapnik::from_wkt(wkt_in_, geom))
{
throw std::runtime_error("Failed to parse WKT");
}
- if (paths.size() != 1)
+ if (mapnik::geometry::is_empty(geom))
{
- std::clog << "paths.size() != 1\n";
+ std::clog << "empty geom!\n";
return false;
}
- mapnik::geometry_type & geom = paths[0];
- conv_clip clipped(geom);
+ if (!geom.is<mapnik::geometry::polygon<double>>())
+ {
+ std::clog << "not a polygon!\n";
+ return false;
+ }
+ mapnik::geometry::polygon<double> const& poly = mapnik::util::get<mapnik::geometry::polygon<double>>(geom);
+ mapnik::geometry::polygon_vertex_adapter<double> va(poly);
+
+
+ conv_clip clipped(va);
clipped.clip_box(
extent_.minx(),
extent_.miny(),
extent_.maxx(),
extent_.maxy());
+
+
+ clipped.rewind(0);
+ mapnik::geometry::polygon<double> poly2;
+ mapnik::geometry::linear_ring<double> ring;
+ // exterior ring
unsigned cmd;
- double x,y;
- mapnik::geometry_type geom2(mapnik::geometry_type::types::Polygon);
- while ((cmd = clipped.vertex(&x, &y)) != mapnik::SEG_END) {
- geom2.push_vertex(x,y,(mapnik::CommandType)cmd);
+ double x, y, x0, y0;
+ while ((cmd = clipped.vertex(&x, &y)) != mapnik::SEG_END)
+ {
+ if (cmd == mapnik::SEG_MOVETO)
+ {
+ x0 = x; y0 = y;
+ }
+
+ if (cmd == mapnik::SEG_CLOSE)
+ {
+ ring.add_coord(x0, y0);
+ break;
+ }
+ ring.add_coord(x,y);
}
+ poly2.set_exterior_ring(std::move(ring));
+ // interior rings
+ ring.clear();
+ while ((cmd = clipped.vertex(&x, &y)) != mapnik::SEG_END)
+ {
+ if (cmd == mapnik::SEG_MOVETO)
+ {
+ x0 = x; y0 = y;
+ }
+ else if (cmd == mapnik::SEG_CLOSE)
+ {
+ ring.add_coord(x0,y0);
+ poly2.add_hole(std::move(ring));
+ ring.clear();
+ continue;
+ }
+ ring.add_coord(x,y);
+ }
+
std::string expect = expected_+".png";
std::string actual = expected_+"_actual.png";
- if (!mapnik::util::exists(expect))
+ mapnik::geometry::multi_polygon<double> mp;
+ mp.emplace_back(poly2);
+ auto env = mapnik::geometry::envelope(mp);
+ if (!mapnik::util::exists(expect) || (std::getenv("UPDATE") != nullptr))
{
std::clog << "generating expected image: " << expect << "\n";
- render(geom2,geom.envelope(),expect);
+ render(mp,env,expect);
}
- render(geom2,geom.envelope(),actual);
+ render(mp,env,actual);
return benchmark::compare_images(actual,expect);
}
- void operator()() const
+ bool operator()() const
{
- boost::ptr_vector<mapnik::geometry_type> paths;
- if (!mapnik::from_wkt(wkt_in_, paths))
+ mapnik::geometry::geometry<double> geom;
+ if (!mapnik::from_wkt(wkt_in_, geom))
{
throw std::runtime_error("Failed to parse WKT");
}
+ if (mapnik::geometry::is_empty(geom))
+ {
+ std::clog << "empty geom!\n";
+ return false;
+ }
+ if (!geom.is<mapnik::geometry::polygon<double>>())
+ {
+ std::clog << "not a polygon!\n";
+ return false;
+ }
+ bool valid = true;
for (unsigned i=0;i<iterations_;++i)
{
- for (mapnik::geometry_type & geom : paths)
- {
- conv_clip clipped(geom);
- clipped.clip_box(
- extent_.minx(),
- extent_.miny(),
- extent_.maxx(),
- extent_.maxy());
- unsigned cmd;
- double x,y;
- while ((cmd = clipped.vertex(&x, &y)) != mapnik::SEG_END) {}
+ unsigned count = 0;
+ mapnik::geometry::polygon<double> const& poly = mapnik::util::get<mapnik::geometry::polygon<double>>(geom);
+ mapnik::geometry::polygon_vertex_adapter<double> va(poly);
+ conv_clip clipped(va);
+ clipped.clip_box(
+ extent_.minx(),
+ extent_.miny(),
+ extent_.maxx(),
+ extent_.maxy());
+ unsigned cmd;
+ double x,y;
+ // NOTE: this rewind is critical otherwise
+ // agg_conv_adapter_vpgen will give garbage
+ // values for the first vertex
+ clipped.rewind(0);
+ while ((cmd = clipped.vertex(&x, &y)) != mapnik::SEG_END) {
+ count++;
+ }
+ unsigned expected_count = 30;
+ if (count != expected_count) {
+ std::clog << "test1: clipping failed: processed " << count << " verticies but expected " << expected_count << "\n";
+ valid = false;
}
}
+ return valid;
}
};
-class test2 : public benchmark::test_case
+
+class test3 : public benchmark::test_case
{
std::string wkt_in_;
mapnik::box2d<double> extent_;
std::string expected_;
public:
- using poly_clipper = agg::conv_clipper<mapnik::geometry_type, agg::path_storage>;
- test2(mapnik::parameters const& params,
+ test3(mapnik::parameters const& params,
std::string const& wkt_in,
mapnik::box2d<double> const& extent)
: test_case(params),
wkt_in_(wkt_in),
extent_(extent),
- expected_("./benchmark/data/polygon_clipping_clipper") {}
+ expected_("./benchmark/data/polygon_clipping_boost") {}
bool validate() const
{
- std::string expected_wkt("Polygon((212 134,329 138,394 229,528 178,631 234.4,631 321.3,559 466,463 324,421 446,315 340,233 454,181 286.7,181 238.2,200 264,183 228),(313 190,229 191,249 334,343 287,405 378,455 262,553 397,613 263,533 237,510 305,470 248,440 256))");
- boost::ptr_vector<mapnik::geometry_type> paths;
- if (!mapnik::from_wkt(wkt_in_, paths))
+ mapnik::geometry::geometry<double> geom;
+ if (!mapnik::from_wkt(wkt_in_, geom))
{
throw std::runtime_error("Failed to parse WKT");
}
- agg::path_storage ps;
- ps.move_to(extent_.minx(), extent_.miny());
- ps.line_to(extent_.minx(), extent_.maxy());
- ps.line_to(extent_.maxx(), extent_.maxy());
- ps.line_to(extent_.maxx(), extent_.miny());
- ps.close_polygon();
- if (paths.size() != 1)
+ if (mapnik::geometry::is_empty(geom))
{
- std::clog << "paths.size() != 1\n";
+ std::clog << "empty geom!\n";
return false;
}
- mapnik::geometry_type & geom = paths[0];
- poly_clipper clipped(geom,ps,
- agg::clipper_and,
- agg::clipper_non_zero,
- agg::clipper_non_zero,
- 1);
- clipped.rewind(0);
- unsigned cmd;
- double x,y;
- mapnik::geometry_type geom2(mapnik::geometry_type::types::Polygon);
- while ((cmd = clipped.vertex(&x, &y)) != mapnik::SEG_END) {
- geom2.push_vertex(x,y,(mapnik::CommandType)cmd);
+ if (!geom.is<mapnik::geometry::polygon<double> >())
+ {
+ std::clog << "not a polygon!\n";
+ return false;
}
+ mapnik::geometry::polygon<double> & poly = mapnik::util::get<mapnik::geometry::polygon<double> >(geom);
+ mapnik::geometry::correct(poly);
+
+ std::deque<mapnik::geometry::polygon<double> > result;
+ boost::geometry::intersection(extent_,poly,result);
+
std::string expect = expected_+".png";
std::string actual = expected_+"_actual.png";
- if (!mapnik::util::exists(expect))
+ mapnik::geometry::multi_polygon<double> mp;
+ for (auto const& geom: result)
+ {
+ //std::clog << boost::geometry::dsv(geom) << "\n";
+ mp.emplace_back(geom);
+ }
+ mapnik::geometry::geometry<double> geom2(mp);
+ auto env = mapnik::geometry::envelope(geom2);
+ if (!mapnik::util::exists(expect) || (std::getenv("UPDATE") != nullptr))
{
std::clog << "generating expected image: " << expect << "\n";
- render(geom2,geom.envelope(),expect);
+ render(mp,env,expect);
}
- render(geom2,geom.envelope(),actual);
+ render(mp,env,actual);
return benchmark::compare_images(actual,expect);
}
- void operator()() const
+ bool operator()() const
{
- boost::ptr_vector<mapnik::geometry_type> paths;
- if (!mapnik::from_wkt(wkt_in_, paths))
+ mapnik::geometry::geometry<double> geom;
+ if (!mapnik::from_wkt(wkt_in_, geom))
{
throw std::runtime_error("Failed to parse WKT");
}
- agg::path_storage ps;
- ps.move_to(extent_.minx(), extent_.miny());
- ps.line_to(extent_.minx(), extent_.maxy());
- ps.line_to(extent_.maxx(), extent_.maxy());
- ps.line_to(extent_.maxx(), extent_.miny());
- ps.close_polygon();
+ if (mapnik::geometry::is_empty(geom))
+ {
+ std::clog << "empty geom!\n";
+ return false;
+ }
+ if (!geom.is<mapnik::geometry::polygon<double> >())
+ {
+ std::clog << "not a polygon!\n";
+ return false;
+ }
+ mapnik::geometry::polygon<double> & poly = mapnik::util::get<mapnik::geometry::polygon<double> >(geom);
+ mapnik::geometry::correct(poly);
+
+ bool valid = true;
for (unsigned i=0;i<iterations_;++i)
{
- for (mapnik::geometry_type & geom : paths)
+ std::deque<mapnik::geometry::polygon<double> > result;
+ boost::geometry::intersection(extent_,poly,result);
+ unsigned count = 0;
+ for (auto const& geom : result)
{
- poly_clipper clipped(geom,ps,
- agg::clipper_and,
- agg::clipper_non_zero,
- agg::clipper_non_zero,
- 1);
- clipped.rewind(0);
+ mapnik::geometry::polygon_vertex_adapter<double> va(geom);
unsigned cmd;
double x,y;
- while ((cmd = clipped.vertex(&x, &y)) != mapnik::SEG_END) {}
+ while ((cmd = va.vertex(&x, &y)) != mapnik::SEG_END) {
+ ++count;
+ }
+ unsigned expected_count = 29;
+ if (count != expected_count) {
+ std::clog << "test3: clipping failed: processed " << count << " verticies but expected " << expected_count << "\n";
+ valid = false;
+ }
}
}
+ return valid;
}
};
-class test3 : public benchmark::test_case
+inline void process_polynode_branch(ClipperLib::PolyNode* polynode,
+ mapnik::geometry::multi_polygon<double> & mp)
+{
+ mapnik::geometry::polygon<double> polygon;
+ mapnik::geometry::linear_ring<double> outer;
+ for (auto const& pt : polynode->Contour)
+ {
+ outer.emplace_back(static_cast<double>(pt.x),static_cast<double>(pt.y));
+ }
+ if (outer.front() != outer.back())
+ {
+ outer.emplace_back(outer.front().x, outer.front().y);
+ }
+ polygon.set_exterior_ring(std::move(outer));
+ for (auto * ring : polynode->Childs)
+ {
+ mapnik::geometry::linear_ring<double> inner;
+ for (auto const& pt : ring->Contour)
+ {
+ inner.emplace_back(static_cast<double>(pt.x),static_cast<double>(pt.y));
+ }
+ if (inner.front() != inner.back())
+ {
+ inner.emplace_back(inner.front().x, inner.front().y);
+ }
+ polygon.add_hole(std::move(inner));
+ }
+ mp.emplace_back(std::move(polygon));
+ for (auto * ring : polynode->Childs)
+ {
+ for (auto * sub_ring : ring->Childs)
+ {
+ process_polynode_branch(sub_ring, mp);
+ }
+ }
+}
+
+class test4 : public benchmark::test_case
{
std::string wkt_in_;
mapnik::box2d<double> extent_;
std::string expected_;
public:
- using poly_clipper = mapnik::polygon_clipper<mapnik::geometry_type>;
- test3(mapnik::parameters const& params,
+ test4(mapnik::parameters const& params,
std::string const& wkt_in,
mapnik::box2d<double> const& extent)
: test_case(params),
wkt_in_(wkt_in),
extent_(extent),
- expected_("./benchmark/data/polygon_clipping_boost") {}
+ expected_("./benchmark/data/polygon_clipping_clipper") {}
bool validate() const
{
- std::string expected_wkt("Polygon((181 286.666667,233 454,315 340,421 446,463 324,559 466,631 321.320755,631 234.386861,528 178,394 229,329 138,212 134,183 228,200 264,181 238.244444,181 286.666667),(313 190,440 256,470 248,510 305,533 237,613 263,553 397,455 262,405 378,343 287,249 334,229 191,313 190))");
- boost::ptr_vector<mapnik::geometry_type> paths;
- if (!mapnik::from_wkt(wkt_in_, paths))
+ mapnik::geometry::geometry<double> geom;
+ if (!mapnik::from_wkt(wkt_in_, geom))
{
throw std::runtime_error("Failed to parse WKT");
}
- if (paths.size() != 1)
+ if (mapnik::geometry::is_empty(geom))
{
- std::clog << "paths.size() != 1\n";
+ std::clog << "empty geom!\n";
return false;
}
- mapnik::geometry_type & geom = paths[0];
- poly_clipper clipped(extent_, geom);
- unsigned cmd;
- double x,y;
- mapnik::geometry_type geom2(mapnik::geometry_type::types::Polygon);
- while ((cmd = clipped.vertex(&x, &y)) != mapnik::SEG_END) {
- geom2.push_vertex(x,y,(mapnik::CommandType)cmd);
+ if (!geom.is<mapnik::geometry::polygon<double> >())
+ {
+ std::clog << "not a polygon!\n";
+ return false;
+ }
+ mapnik::geometry::polygon<double> & poly = mapnik::util::get<mapnik::geometry::polygon<double> >(geom);
+ mapnik::geometry::correct(poly);
+ ClipperLib::Clipper clipper;
+
+ mapnik::geometry::line_string<std::int64_t> path;
+ for (auto const& pt : poly.exterior_ring)
+ {
+ double x = pt.x;
+ double y = pt.y;
+ path.emplace_back(static_cast<ClipperLib::cInt>(x),static_cast<ClipperLib::cInt>(y));
+ }
+ double area = ClipperLib::Area(path);
+ if (area > 0)
+ {
+ std::reverse(path.begin(), path.end());
+ }
+ if (!clipper.AddPath(path, ClipperLib::ptSubject, true))
+ {
+ std::clog << "ptSubject ext failed!\n";
+ }
+ for (auto const& ring : poly.interior_rings)
+ {
+ path.clear();
+ for (auto const& pt : ring)
+ {
+ double x = pt.x;
+ double y = pt.y;
+ path.emplace_back(static_cast<ClipperLib::cInt>(x),static_cast<ClipperLib::cInt>(y));
+ }
+ area = ClipperLib::Area(path);
+ if (area < 0)
+ {
+ std::reverse(path.begin(), path.end());
+ }
+ if (!clipper.AddPath(path, ClipperLib::ptSubject, true))
+ {
+ std::clog << "ptSubject ext failed!\n";
+ }
+ }
+ std::cerr << "path size=" << path.size() << std::endl;
+ mapnik::geometry::line_string<std::int64_t> clip_box;
+ clip_box.emplace_back(static_cast<ClipperLib::cInt>(extent_.minx()),static_cast<ClipperLib::cInt>(extent_.miny()));
+ clip_box.emplace_back(static_cast<ClipperLib::cInt>(extent_.maxx()),static_cast<ClipperLib::cInt>(extent_.miny()));
+ clip_box.emplace_back(static_cast<ClipperLib::cInt>(extent_.maxx()),static_cast<ClipperLib::cInt>(extent_.maxy()));
+ clip_box.emplace_back(static_cast<ClipperLib::cInt>(extent_.minx()),static_cast<ClipperLib::cInt>(extent_.maxy()));
+ clip_box.emplace_back(static_cast<ClipperLib::cInt>(extent_.minx()),static_cast<ClipperLib::cInt>(extent_.miny()));
+
+ if (!clipper.AddPath( clip_box, ClipperLib::ptClip, true ))
+ {
+ std::clog << "ptClip failed!\n";
+ }
+
+ ClipperLib::PolyTree polygons;
+ clipper.Execute(ClipperLib::ctIntersection, polygons);// ClipperLib::pftNonZero);
+ clipper.Clear();
+ mapnik::geometry::multi_polygon<double> mp;
+ for (auto * polynode : polygons.Childs)
+ {
+ process_polynode_branch(polynode, mp);
}
std::string expect = expected_+".png";
std::string actual = expected_+"_actual.png";
- if (!mapnik::util::exists(expect))
+ //mapnik::geometry::geometry<double> geom2(mp);
+ auto env = mapnik::geometry::envelope(mp);
+ if (!mapnik::util::exists(expect) || (std::getenv("UPDATE") != nullptr))
{
std::clog << "generating expected image: " << expect << "\n";
- render(geom2,geom.envelope(),expect);
+ render(mp,env,expect);
}
- render(geom2,geom.envelope(),actual);
+ render(mp,env,actual);
return benchmark::compare_images(actual,expect);
}
- void operator()() const
+ bool operator()() const
{
- boost::ptr_vector<mapnik::geometry_type> paths;
- if (!mapnik::from_wkt(wkt_in_, paths))
+ mapnik::geometry::geometry<double> geom;
+ if (!mapnik::from_wkt(wkt_in_, geom))
{
throw std::runtime_error("Failed to parse WKT");
}
+ if (mapnik::geometry::is_empty(geom))
+ {
+ std::clog << "empty geom!\n";
+ return false;
+ }
+ if (!geom.is<mapnik::geometry::polygon<double> >())
+ {
+ std::clog << "not a polygon!\n";
+ return false;
+ }
+ mapnik::geometry::polygon<double> & poly = mapnik::util::get<mapnik::geometry::polygon<double> >(geom);
+ mapnik::geometry::correct(poly);
+
+ bool valid = true;
for (unsigned i=0;i<iterations_;++i)
{
- for ( mapnik::geometry_type & geom : paths)
+ std::deque<mapnik::geometry::polygon<double> > result;
+ boost::geometry::intersection(extent_,poly,result);
+
+ unsigned count = 0;
+ for (auto const& geom : result)
{
- poly_clipper clipped(extent_, geom);
+ mapnik::geometry::polygon_vertex_adapter<double> va(geom);
unsigned cmd;
double x,y;
- while ((cmd = clipped.vertex(&x, &y)) != mapnik::SEG_END) {}
+ while ((cmd = va.vertex(&x, &y)) != mapnik::SEG_END) {
+ ++count;
+ }
+ unsigned expected_count = 29;
+ if (count != expected_count) {
+ std::clog << "test3: clipping failed: processed " << count << " verticies but expected " << expected_count << "\n";
+ valid = false;
+ }
}
}
+ return valid;
}
};
@@ -308,13 +515,12 @@ int main(int argc, char** argv)
run(test_runner,"clipping polygon with agg");
}
{
- test2 test_runner(params,wkt_in,clipping_box);
- run(test_runner,"clipping polygon with clipper");
- }
- {
test3 test_runner(params,wkt_in,clipping_box);
run(test_runner,"clipping polygon with boost");
}
-
+ {
+ test4 test_runner(params,wkt_in,clipping_box);
+ run(test_runner,"clipping polygon with clipper_tree");
+ }
return 0;
}
diff --git a/benchmark/test_polygon_clipping_rendering.cpp b/benchmark/test_polygon_clipping_rendering.cpp
index 61bfea2..88f20d5 100644
--- a/benchmark/test_polygon_clipping_rendering.cpp
+++ b/benchmark/test_polygon_clipping_rendering.cpp
@@ -1,7 +1,6 @@
#include "bench_framework.hpp"
#include <mapnik/map.hpp>
#include <mapnik/load_map.hpp>
-#include <mapnik/graphics.hpp>
#include <mapnik/agg_renderer.hpp>
#include <mapnik/datasource_cache.hpp>
@@ -22,23 +21,24 @@ public:
mapnik::Map m(256,256);
mapnik::load_map(m,xml_);
m.zoom_to_box(extent_);
- mapnik::image_32 im(m.width(),m.height());
- mapnik::agg_renderer<mapnik::image_32> ren(m,im);
+ mapnik::image_rgba8 im(m.width(),m.height());
+ mapnik::agg_renderer<mapnik::image_rgba8> ren(m,im);
ren.apply();
- //mapnik::save_to_file(im,"test.png");
+ //mapnik::save_to_file(im.data(),"test.png");
return true;
}
- void operator()() const
+ bool operator()() const
{
mapnik::Map m(256,256);
mapnik::load_map(m,xml_);
m.zoom_to_box(extent_);
for (unsigned i=0;i<iterations_;++i)
{
- mapnik::image_32 im(m.width(),m.height());
- mapnik::agg_renderer<mapnik::image_32> ren(m,im);
+ mapnik::image_rgba8 im(m.width(),m.height());
+ mapnik::agg_renderer<mapnik::image_rgba8> ren(m,im);
ren.apply();
}
+ return true;
}
};
diff --git a/benchmark/test_proj_transform1.cpp b/benchmark/test_proj_transform1.cpp
index 180fcca..38fcf8b 100644
--- a/benchmark/test_proj_transform1.cpp
+++ b/benchmark/test_proj_transform1.cpp
@@ -36,7 +36,7 @@ public:
(std::fabs(bbox.maxy() - to_.maxy()) < .5)
);
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
for (int i=-180;i<180;i=i+5)
@@ -51,6 +51,7 @@ public:
}
}
}
+ return true;
}
};
diff --git a/benchmark/test_rendering.cpp b/benchmark/test_rendering.cpp
index 1096aaa..30e80be 100644
--- a/benchmark/test_rendering.cpp
+++ b/benchmark/test_rendering.cpp
@@ -2,7 +2,6 @@
#include <mapnik/map.hpp>
#include <mapnik/image_util.hpp>
#include <mapnik/load_map.hpp>
-#include <mapnik/graphics.hpp>
#include <mapnik/agg_renderer.hpp>
#include <mapnik/datasource_cache.hpp>
#include <mapnik/font_engine_freetype.hpp>
@@ -55,14 +54,20 @@ public:
} else {
m.zoom_all();
}
- mapnik::image_32 im(m.width(),m.height());
- mapnik::agg_renderer<mapnik::image_32> ren(m,im,scale_factor_);
+ mapnik::image_rgba8 im(m.width(),m.height());
+ mapnik::agg_renderer<mapnik::image_rgba8> ren(m,im,scale_factor_);
ren.apply();
- if (!preview_.empty()) mapnik::save_to_file(im,preview_);
+ if (!preview_.empty()) {
+ std::clog << "preview available at " << preview_ << "\n";
+ mapnik::save_to_file(im,preview_);
+ }
return true;
}
- void operator()() const
+ bool operator()() const
{
+ if (!preview_.empty()) {
+ return false;
+ }
mapnik::Map m(width_,height_);
mapnik::load_map(m,xml_);
if (extent_.valid()) {
@@ -72,10 +77,11 @@ public:
}
for (unsigned i=0;i<iterations_;++i)
{
- mapnik::image_32 im(m.width(),m.height());
- mapnik::agg_renderer<mapnik::image_32> ren(m,im,scale_factor_);
+ mapnik::image_rgba8 im(m.width(),m.height());
+ mapnik::agg_renderer<mapnik::image_rgba8> ren(m,im,scale_factor_);
ren.apply();
}
+ return true;
}
};
diff --git a/benchmark/test_rendering_shared_map.cpp b/benchmark/test_rendering_shared_map.cpp
index 3f98f7f..0b57053 100644
--- a/benchmark/test_rendering_shared_map.cpp
+++ b/benchmark/test_rendering_shared_map.cpp
@@ -2,7 +2,6 @@
#include <mapnik/map.hpp>
#include <mapnik/image_util.hpp>
#include <mapnik/load_map.hpp>
-#include <mapnik/graphics.hpp>
#include <mapnik/agg_renderer.hpp>
#include <mapnik/datasource_cache.hpp>
#include <mapnik/font_engine_freetype.hpp>
@@ -26,13 +25,7 @@ template <typename Renderer> void process_layers(Renderer & ren,
if (lyr.visible(scale_denom))
{
std::set<std::string> names;
- mapnik::parameters p;
- p["type"]="csv";
- p["file"]="benchmark/data/roads.csv";
- mapnik::datasource_ptr ds = mapnik::datasource_cache::instance().create(p);
mapnik::layer l(lyr);
- l.set_datasource(ds);
- l.add_style("labels");
ren.apply_to_layer(l,
ren,
map_proj,
@@ -56,6 +49,7 @@ class test : public benchmark::test_case
std::shared_ptr<mapnik::Map> m_;
double scale_factor_;
std::string preview_;
+ mutable mapnik::image_rgba8 im_;
public:
test(mapnik::parameters const& params)
: test_case(params),
@@ -65,7 +59,8 @@ public:
height_(*params.get<mapnik::value_integer>("height",256)),
m_(new mapnik::Map(width_,height_)),
scale_factor_(*params.get<mapnik::value_double>("scale_factor",2.0)),
- preview_(*params.get<std::string>("preview",""))
+ preview_(*params.get<std::string>("preview","")),
+ im_(m_->width(),m_->height())
{
boost::optional<std::string> map = params.get<std::string>("map");
if (!map)
@@ -75,6 +70,7 @@ public:
xml_ = *map;
boost::optional<std::string> ext = params.get<std::string>("extent");
+ mapnik::load_map(*m_,xml_,true);
if (ext && !ext->empty())
{
if (!extent_.from_string(*ext))
@@ -82,51 +78,67 @@ public:
}
else
{
- throw std::runtime_error("please provide a --extent=<minx,miny,maxx,maxy> arg");
+ m_->zoom_all();
+ extent_ = m_->get_current_extent();
+ std::clog << "Defaulting to max extent " << extent_ << "\n";
+ std::clog << " (pass --extent=<minx,miny,maxx,maxy> to restrict bounds)\n";
}
- mapnik::load_map(*m_,xml_,true);
}
bool validate() const
{
mapnik::request m_req(width_,height_,extent_);
- mapnik::image_32 im(m_->width(),m_->height());
mapnik::attributes variables;
m_req.set_buffer_size(m_->buffer_size());
mapnik::projection map_proj(m_->srs(),true);
double scale_denom = mapnik::scale_denominator(m_req.scale(),map_proj.is_geographic());
scale_denom *= scale_factor_;
- mapnik::agg_renderer<mapnik::image_32> ren(*m_,m_req,variables,im,scale_factor_);
+ mapnik::agg_renderer<mapnik::image_rgba8> ren(*m_,m_req,variables,im_,scale_factor_);
ren.start_map_processing(*m_);
std::vector<mapnik::layer> const& layers = m_->layers();
process_layers(ren,m_req,map_proj,layers,scale_denom);
ren.end_map_processing(*m_);
if (!preview_.empty()) {
std::clog << "preview available at " << preview_ << "\n";
- mapnik::save_to_file(im,preview_);
+ mapnik::save_to_file(im_,preview_);
}
return true;
}
- void operator()() const
+ bool operator()() const
{
- if (preview_.empty()) {
- for (unsigned i=0;i<iterations_;++i)
+ if (!preview_.empty()) {
+ return false;
+ }
+ for (unsigned i=0;i<iterations_;++i)
+ {
+ mapnik::request m_req(width_,height_,extent_);
+ mapnik::image_rgba8 im(m_->width(),m_->height());
+ mapnik::attributes variables;
+ m_req.set_buffer_size(m_->buffer_size());
+ mapnik::projection map_proj(m_->srs(),true);
+ double scale_denom = mapnik::scale_denominator(m_req.scale(),map_proj.is_geographic());
+ scale_denom *= scale_factor_;
+ mapnik::agg_renderer<mapnik::image_rgba8> ren(*m_,m_req,variables,im,scale_factor_);
+ ren.start_map_processing(*m_);
+ std::vector<mapnik::layer> const& layers = m_->layers();
+ process_layers(ren,m_req,map_proj,layers,scale_denom);
+ ren.end_map_processing(*m_);
+ bool diff = false;
+ mapnik::image_rgba8 const& dest = im;
+ mapnik::image_rgba8 const& src = im_;
+ for (unsigned int y = 0; y < height_; ++y)
{
- mapnik::request m_req(width_,height_,extent_);
- mapnik::image_32 im(m_->width(),m_->height());
- mapnik::attributes variables;
- m_req.set_buffer_size(m_->buffer_size());
- mapnik::projection map_proj(m_->srs(),true);
- double scale_denom = mapnik::scale_denominator(m_req.scale(),map_proj.is_geographic());
- scale_denom *= scale_factor_;
- mapnik::agg_renderer<mapnik::image_32> ren(*m_,m_req,variables,im,scale_factor_);
- ren.start_map_processing(*m_);
- std::vector<mapnik::layer> const& layers = m_->layers();
- process_layers(ren,m_req,map_proj,layers,scale_denom);
- ren.end_map_processing(*m_);
- }
+ const unsigned int* row_from = src.get_row(y);
+ const unsigned int* row_to = dest.get_row(y);
+ for (unsigned int x = 0; x < width_; ++x)
+ {
+ if (row_from[x] != row_to[x]) diff = true;
+ }
+ }
+ if (diff) throw std::runtime_error("images differ");
}
+ return true;
}
};
@@ -147,7 +159,7 @@ int main(int argc, char** argv)
mapnik::datasource_cache::instance().register_datasources("./plugins/input/");
{
test test_runner(params);
- run(test_runner,*name);
+ run(test_runner,*name);
}
}
catch (std::exception const& ex)
diff --git a/benchmark/test_to_bool.cpp b/benchmark/test_to_bool.cpp
index 92f0731..83759ba 100644
--- a/benchmark/test_to_bool.cpp
+++ b/benchmark/test_to_bool.cpp
@@ -16,13 +16,14 @@ public:
mapnik::util::string2bool(value_,result);
return (result == true);
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
bool result = false;
mapnik::util::string2bool(value_,result);
mapnik::util::string2bool(value_.data(),value_.data()+value_.size(),result);
}
+ return true;
}
};
diff --git a/benchmark/test_to_double.cpp b/benchmark/test_to_double.cpp
index 1605dcd..9fcd2d5 100644
--- a/benchmark/test_to_double.cpp
+++ b/benchmark/test_to_double.cpp
@@ -18,13 +18,14 @@ public:
if (result != 1.23456789) return false;
return true;
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
double result = 0;
mapnik::util::string2double(value_,result);
mapnik::util::string2double(value_.data(),value_.data()+value_.size(),result);
}
+ return true;
}
};
diff --git a/benchmark/test_to_int.cpp b/benchmark/test_to_int.cpp
index 195d033..c8367c6 100644
--- a/benchmark/test_to_int.cpp
+++ b/benchmark/test_to_int.cpp
@@ -18,13 +18,14 @@ public:
if (result != 123456789) return false;
return true;
}
- void operator()() const
+ bool operator()() const
{
for (std::size_t i=0;i<iterations_;++i) {
mapnik::value_integer result = 0;
mapnik::util::string2int(value_,result);
mapnik::util::string2int(value_.data(),value_.data()+value_.size(),result);
}
+ return true;
}
};
diff --git a/benchmark/test_to_string1.cpp b/benchmark/test_to_string1.cpp
index 0479246..187d231 100644
--- a/benchmark/test_to_string1.cpp
+++ b/benchmark/test_to_string1.cpp
@@ -14,13 +14,14 @@ public:
mapnik::util::to_string(s,value_);
return (s == "-0.1234");
}
- void operator()() const
+ bool operator()() const
{
std::string out;
for (std::size_t i=0;i<iterations_;++i) {
out.clear();
mapnik::util::to_string(out,value_);
}
+ return true;
}
};
diff --git a/benchmark/test_to_string2.cpp b/benchmark/test_to_string2.cpp
index 85243bf..c179711 100644
--- a/benchmark/test_to_string2.cpp
+++ b/benchmark/test_to_string2.cpp
@@ -14,7 +14,7 @@ public:
s << value_;
return (s.str() == "-0.1234");
}
- void operator()() const
+ bool operator()() const
{
std::string out;
for (std::size_t i=0;i<iterations_;++i) {
@@ -22,6 +22,7 @@ public:
s << value_;
out = s.str();
}
+ return true;
}
};
diff --git a/benchmark/test_utf_encoding.cpp b/benchmark/test_utf_encoding.cpp
index ea11eda..100cbd6 100644
--- a/benchmark/test_utf_encoding.cpp
+++ b/benchmark/test_utf_encoding.cpp
@@ -23,13 +23,14 @@ public:
utf32[3] != 0x5dd) return false;
return true;
}
- void operator()() const
+ bool operator()() const
{
std::u32string utf32;
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> utf32conv;
for (std::size_t i=0;i<iterations_;++i) {
utf32 = utf32conv.from_bytes(utf8_);
}
+ return true;
}
};
@@ -52,12 +53,13 @@ public:
utf32[3] != 0x5dd) return false;
return true;
}
- void operator()() const
+ bool operator()() const
{
std::u32string utf32;
for (std::size_t i=0;i<iterations_;++i) {
utf32 = boost::locale::conv::utf_to_utf<char32_t>(utf8_);
}
+ return true;
}
};
@@ -80,13 +82,14 @@ public:
utf32[3] != 0x5dd) return false;
return true;
}
- void operator()() const
+ bool operator()() const
{
mapnik::transcoder tr_("utf-8");
mapnik::value_unicode_string utf32;
for (std::size_t i=0;i<iterations_;++i) {
utf32 = tr_.transcode(utf8_.data(),utf8_.size());
}
+ return true;
}
};
diff --git a/bindings/python/boost_std_shared_shim.hpp b/bindings/python/boost_std_shared_shim.hpp
deleted file mode 100644
index e25560a..0000000
--- a/bindings/python/boost_std_shared_shim.hpp
+++ /dev/null
@@ -1,49 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2013 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#ifndef MAPNIK_PYTHON_BOOST_STD_SHARED_SHIM
-#define MAPNIK_PYTHON_BOOST_STD_SHARED_SHIM
-
-// boost
-#include <boost/version.hpp>
-#include <boost/config.hpp>
-
-#if BOOST_VERSION < 105300 || defined BOOST_NO_CXX11_SMART_PTR
-
-// https://github.com/mapnik/mapnik/issues/2022
-#include <memory>
-
-namespace boost {
-template<class T> const T* get_pointer(std::shared_ptr<T> const& p)
-{
- return p.get();
-}
-
-template<class T> T* get_pointer(std::shared_ptr<T>& p)
-{
- return p.get();
-}
-} // namespace boost
-
-#endif
-
-#endif // MAPNIK_PYTHON_BOOST_STD_SHARED_SHIM
diff --git a/bindings/python/build.py b/bindings/python/build.py
deleted file mode 100644
index 9599a78..0000000
--- a/bindings/python/build.py
+++ /dev/null
@@ -1,211 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2013 Artem Pavlenko
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-#
-#
-
-import os, re, sys, glob
-from subprocess import Popen, PIPE
-
-
-Import('env')
-
-def call(cmd, silent=True):
- stdin, stderr = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE).communicate()
- if not stderr:
- return stdin.strip()
- elif not silent:
- print stderr
-
-def run_2to3(*args,**kwargs):
- call('2to3 -w %s' % os.path.dirname(kwargs['target'][0].path))
-
-def is_py3():
- return 'True' in os.popen('''%s -c "import sys as s;s.stdout.write(str(s.version_info[0] == 3))"''' % env['PYTHON']).read().strip()
-
-
-prefix = env['PREFIX']
-target_path = os.path.normpath(env['PYTHON_INSTALL_LOCATION'] + os.path.sep + env['MAPNIK_NAME'])
-target_path_deprecated = os.path.normpath(env['PYTHON_INSTALL_LOCATION'] + os.path.sep + 'mapnik2')
-
-py_env = env.Clone()
-py_env.Append(CPPPATH = env['PYTHON_INCLUDES'])
-
-py_env.Append(CPPDEFINES = env['LIBMAPNIK_DEFINES'])
-
-py_env['LIBS'] = [env['MAPNIK_NAME'],env['BOOST_PYTHON_LIB']]
-
-link_all_libs = env['LINKING'] == 'static' or env['RUNTIME_LINK'] == 'static' or (env['PLATFORM'] == 'Darwin' and not env['PYTHON_DYNAMIC_LOOKUP'])
-
-# even though boost_thread is no longer used in mapnik core
-# we need to link in for boost_python to avoid missing symbol: _ZN5boost6detail12get_tss_dataEPKv / boost::detail::get_tss_data
-py_env.AppendUnique(LIBS = 'boost_thread%s' % env['BOOST_APPEND'])
-
-if link_all_libs:
- py_env.AppendUnique(LIBS=env['LIBMAPNIK_LIBS'])
-
-# note: on linux -lrt must be linked after thread to avoid: undefined symbol: clock_gettime
-if env['RUNTIME_LINK'] == 'static' and env['PLATFORM'] == 'Linux':
- py_env.AppendUnique(LIBS='rt')
-
-# TODO - do solaris/fedora need direct linking too?
-if env['PLATFORM'] == 'Darwin':
- ##### Python linking on OS X is tricky ###
- # Confounding problems are:
- # 1) likelyhood of multiple python installs of the same major.minor version
- # because apple supplies python built-in and many users may have installed
- # further versions using macports
- # 2) boost python directly links to a python version
- # 3) the below will directly link _mapnik.so to a python version
- # 4) _mapnik.so must link to the same python lib as boost_python.dylib otherwise
- # python will Abort with a Version Mismatch error.
- # See https://github.com/mapnik/mapnik/issues/453 for the seeds of a better approach
- # for now we offer control over method of direct linking...
- # The default below is to link against the python dylib in the form of
- #/path/to/Python.framework/Python instead of -lpython
-
- # http://developer.apple.com/mac/library/DOCUMENTATION/Darwin/Reference/ManPages/man1/ld.1.html
-
- if env['PYTHON_DYNAMIC_LOOKUP']:
- python_link_flag = '-undefined dynamic_lookup'
- elif env['FRAMEWORK_PYTHON']:
- if env['FRAMEWORK_SEARCH_PATH']:
- # if the user has supplied a custom root path to search for
- # a given Python framework, then use that to direct the linker
- python_link_flag = '-F%s -framework Python -Z' % env['FRAMEWORK_SEARCH_PATH']
- else:
- # otherwise be as explicit as possible for linking to the same Framework
- # as the executable we are building with (or is pointed to by the PYTHON variable)
- # otherwise we may accidentally link against either:
- # /System/Library/Frameworks/Python.framework/Python/Versions/
- # or
- # /Library/Frameworks/Python.framework/Python/Versions/
- # See: https://github.com/mapnik/mapnik/issues/380
- link_prefix = env['PYTHON_SYS_PREFIX']
- if '.framework' in link_prefix:
- python_link_flag = '-F%s -framework Python -Z' % os.path.dirname(link_prefix.split('.')[0])
- elif '/System' in link_prefix:
- python_link_flag = '-F/System/Library/Frameworks/ -framework Python -Z'
- else:
- # should we fall back to -lpython here?
- python_link_flag = '-F/ -framework Python'
- # if we are not linking to a framework then use the *nix standard approach
- else:
- # TODO - do we need to pass -L/?
- python_link_flag = '-lpython%s' % env['PYTHON_VERSION']
-
-elif env['PLATFORM'] == 'SunOS':
- # make sure to explicitly link mapnik.so against
- # libmapnik in its installed location
- python_link_flag = '-R%s' % env['MAPNIK_LIB_BASE']
-else:
- # all other platforms we don't directly link python
- python_link_flag = ''
-
-paths = '''
-"""Configuration paths of Mapnik fonts and input plugins (auto-generated by SCons)."""
-
-from os.path import normpath,join,dirname
-
-mapniklibpath = '%s'
-mapniklibpath = normpath(join(dirname(__file__),mapniklibpath))
-'''
-
-paths += "inputpluginspath = join(mapniklibpath,'input')\n"
-
-if env['SYSTEM_FONTS']:
- paths += "fontscollectionpath = normpath('%s')\n" % env['SYSTEM_FONTS']
-else:
- paths += "fontscollectionpath = join(mapniklibpath,'fonts')\n"
-
-paths += "__all__ = [mapniklibpath,inputpluginspath,fontscollectionpath]\n"
-
-if not os.path.exists(env['MAPNIK_NAME']):
- os.mkdir(env['MAPNIK_NAME'])
-
-file('mapnik/paths.py','w').write(paths % (env['MAPNIK_LIB_DIR']))
-
-# force open perms temporarily so that `sudo scons install`
-# does not later break simple non-install non-sudo rebuild
-try:
- os.chmod('mapnik/paths.py',0666)
-except: pass
-
-# install the shared object beside the module directory
-sources = glob.glob('*.cpp')
-
-if 'install' in COMMAND_LINE_TARGETS:
- # install the core mapnik python files, including '__init__.py'
- init_files = glob.glob('mapnik/*.py')
- if 'mapnik/paths.py' in init_files:
- init_files.remove('mapnik/paths.py')
- init_module = env.Install(target_path, init_files)
- env.Alias(target='install', source=init_module)
- # install mapnik2 module which redirects to mapnik and issues DeprecatedWarning
- init_mapnik2 = env.Install(target_path_deprecated, 'mapnik2/__init__.py')
- env.Alias(target='install', source=init_mapnik2)
-
- # fix perms and install the custom generated 'paths.py'
- targetp = os.path.join(target_path,'paths.py')
- env.Alias("install", targetp)
- # use env.Command rather than env.Install
- # to enable setting proper perms on `paths.py`
- env.Command( targetp, 'mapnik/paths.py',
- [
- Copy("$TARGET","$SOURCE"),
- Chmod("$TARGET", 0644),
- ])
-
-if 'uninstall' not in COMMAND_LINE_TARGETS:
- if env['HAS_CAIRO']:
- py_env.Append(CPPPATH = env['CAIRO_CPPPATHS'])
- py_env.Append(CPPDEFINES = '-DHAVE_CAIRO')
- if link_all_libs:
- py_env.Append(LIBS=env['CAIRO_ALL_LIBS'])
-
- if env['HAS_PYCAIRO']:
- py_env.ParseConfig('pkg-config --cflags pycairo')
- py_env.Append(CPPDEFINES = '-DHAVE_PYCAIRO')
-
-py_env.Append(LINKFLAGS=python_link_flag)
-py_env.AppendUnique(LIBS='mapnik-json')
-py_env.AppendUnique(LIBS='mapnik-wkt')
-
-_mapnik = py_env.LoadableModule('mapnik/_mapnik', sources, LDMODULEPREFIX='', LDMODULESUFFIX='.so')
-
-Depends(_mapnik, env.subst('../../src/%s' % env['MAPNIK_LIB_NAME']))
-Depends(_mapnik, env.subst('../../src/json/libmapnik-json${LIBSUFFIX}'))
-Depends(_mapnik, env.subst('../../src/wkt/libmapnik-wkt${LIBSUFFIX}'))
-
-if env['PLATFORM'] == 'SunOS' and env['PYTHON_IS_64BIT']:
- # http://mail.python.org/pipermail/python-dev/2006-August/068528.html
- cxx_module_path = os.path.join(target_path,'64')
-else:
- cxx_module_path = target_path
-
-if 'uninstall' not in COMMAND_LINE_TARGETS:
- pymapniklib = env.Install(cxx_module_path,_mapnik)
- py_env.Alias(target='install',source=pymapniklib)
- if 'install' in COMMAND_LINE_TARGETS:
- if is_py3():
- env.AddPostAction(pymapniklib, run_2to3)
-
-
-env['create_uninstall_target'](env, target_path)
-env['create_uninstall_target'](env, target_path_deprecated)
-
diff --git a/bindings/python/mapnik/__init__.py b/bindings/python/mapnik/__init__.py
deleted file mode 100644
index b3e2eda..0000000
--- a/bindings/python/mapnik/__init__.py
+++ /dev/null
@@ -1,1074 +0,0 @@
-#
-# This file is part of Mapnik (C++/Python mapping toolkit)
-# Copyright (C) 2009 Artem Pavlenko
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or any later version.
-#
-# This program 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 this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-
-"""Mapnik Python module.
-
-Boost Python bindings to the Mapnik C++ shared library.
-
-Several things happen when you do:
-
- >>> import mapnik
-
- 1) Mapnik C++ objects are imported via the '__init__.py' from the '_mapnik.so' shared object
- (_mapnik.pyd on win) which references libmapnik.so (linux), libmapnik.dylib (mac), or
- mapnik.dll (win32).
-
- 2) The paths to the input plugins and font directories are imported from the 'paths.py'
- file which was constructed and installed during SCons installation.
-
- 3) All available input plugins and TrueType fonts are automatically registered.
-
- 4) Boost Python metaclass injectors are used in the '__init__.py' to extend several
- objects adding extra convenience when accessed via Python.
-
-"""
-
-import itertools
-import os
-import sys
-import warnings
-try:
- import json
-except ImportError:
- import simplejson as json
-
-def bootstrap_env():
- """
- If an optional settings file exists, inherit its
- environment settings before loading the mapnik library.
-
- This feature is intended for customized packages of mapnik.
-
- The settings file should be a python file with an 'env' variable
- that declares a dictionary of key:value pairs to push into the
- global process environment, if not already set, like:
-
- env = {'ICU_DATA':'/usr/local/share/icu/'}
- """
- if os.path.exists(os.path.join(os.path.dirname(__file__),'mapnik_settings.py')):
- from mapnik_settings import env
- process_keys = os.environ.keys()
- for key, value in env.items():
- if key not in process_keys:
- os.environ[key] = value
-
-bootstrap_env()
-
-from _mapnik import *
-
-import printing
-printing.renderer = render
-
-# The base Boost.Python class
-BoostPythonMetaclass = Coord.__class__
-
-class _MapnikMetaclass(BoostPythonMetaclass):
- def __init__(self, name, bases, dict):
- for b in bases:
- if type(b) not in (self, type):
- for k,v in list(dict.items()):
- if hasattr(b, k):
- setattr(b, '_c_'+k, getattr(b, k))
- setattr(b,k,v)
- return type.__init__(self, name, bases, dict)
-
-# metaclass injector compatible with both python 2 and 3
-# http://mikewatkins.ca/2008/11/29/python-2-and-3-metaclasses/
-_injector = _MapnikMetaclass('_injector', (object, ), {})
-
-def Filter(*args,**kwargs):
- warnings.warn("'Filter' is deprecated and will be removed in Mapnik 3.x, use 'Expression' instead",
- DeprecationWarning, 2)
- return Expression(*args, **kwargs)
-
-class Envelope(Box2d):
- def __init__(self, *args, **kwargs):
- warnings.warn("'Envelope' is deprecated and will be removed in Mapnik 3.x, use 'Box2d' instead",
- DeprecationWarning, 2)
- Box2d.__init__(self, *args, **kwargs)
-
-class _Coord(Coord,_injector):
- """
- Represents a point with two coordinates (either lon/lat or x/y).
-
- Following operators are defined for Coord:
-
- Addition and subtraction of Coord objects:
-
- >>> Coord(10, 10) + Coord(20, 20)
- Coord(30.0, 30.0)
- >>> Coord(10, 10) - Coord(20, 20)
- Coord(-10.0, -10.0)
-
- Addition, subtraction, multiplication and division between
- a Coord and a float:
-
- >>> Coord(10, 10) + 1
- Coord(11.0, 11.0)
- >>> Coord(10, 10) - 1
- Coord(-9.0, -9.0)
- >>> Coord(10, 10) * 2
- Coord(20.0, 20.0)
- >>> Coord(10, 10) / 2
- Coord(5.0, 5.0)
-
- Equality of coords (as pairwise equality of components):
- >>> Coord(10, 10) is Coord(10, 10)
- False
- >>> Coord(10, 10) == Coord(10, 10)
- True
- """
- def __repr__(self):
- return 'Coord(%s,%s)' % (self.x, self.y)
-
- def forward(self, projection):
- """
- Projects the point from the geographic coordinate
- space into the cartesian space. The x component is
- considered to be longitude, the y component the
- latitude.
-
- Returns the easting (x) and northing (y) as a
- coordinate pair.
-
- Example: Project the geographic coordinates of the
- city center of Stuttgart into the local
- map projection (GK Zone 3/DHDN, EPSG 31467)
- >>> p = Projection('+init=epsg:31467')
- >>> Coord(9.1, 48.7).forward(p)
- Coord(3507360.12813,5395719.2749)
- """
- return forward_(self, projection)
-
- def inverse(self, projection):
- """
- Projects the point from the cartesian space
- into the geographic space. The x component is
- considered to be the easting, the y component
- to be the northing.
-
- Returns the longitude (x) and latitude (y) as a
- coordinate pair.
-
- Example: Project the cartesian coordinates of the
- city center of Stuttgart in the local
- map projection (GK Zone 3/DHDN, EPSG 31467)
- into geographic coordinates:
- >>> p = Projection('+init=epsg:31467')
- >>> Coord(3507360.12813,5395719.2749).inverse(p)
- Coord(9.1, 48.7)
- """
- return inverse_(self, projection)
-
-class _Box2d(Box2d,_injector):
- """
- Represents a spatial envelope (i.e. bounding box).
-
-
- Following operators are defined for Box2d:
-
- Addition:
- e1 + e2 is equvalent to e1.expand_to_include(e2) but yields
- a new envelope instead of modifying e1
-
- Subtraction:
- Currently e1 - e2 returns e1.
-
- Multiplication and division with floats:
- Multiplication and division change the width and height of the envelope
- by the given factor without modifying its center..
-
- That is, e1 * x is equivalent to:
- e1.width(x * e1.width())
- e1.height(x * e1.height()),
- except that a new envelope is created instead of modifying e1.
-
- e1 / x is equivalent to e1 * (1.0/x).
-
- Equality: two envelopes are equal if their corner points are equal.
- """
-
- def __repr__(self):
- return 'Box2d(%s,%s,%s,%s)' % \
- (self.minx,self.miny,self.maxx,self.maxy)
-
- def forward(self, projection):
- """
- Projects the envelope from the geographic space
- into the cartesian space by projecting its corner
- points.
-
- See also:
- Coord.forward(self, projection)
- """
- return forward_(self, projection)
-
- def inverse(self, projection):
- """
- Projects the envelope from the cartesian space
- into the geographic space by projecting its corner
- points.
-
- See also:
- Coord.inverse(self, projection).
- """
- return inverse_(self, projection)
-
-class _Projection(Projection,_injector):
-
- def __repr__(self):
- return "Projection('%s')" % self.params()
-
- def forward(self,obj):
- """
- Projects the given object (Box2d or Coord)
- from the geographic space into the cartesian space.
-
- See also:
- Box2d.forward(self, projection),
- Coord.forward(self, projection).
- """
- return forward_(obj,self)
-
- def inverse(self,obj):
- """
- Projects the given object (Box2d or Coord)
- from the cartesian space into the geographic space.
-
- See also:
- Box2d.inverse(self, projection),
- Coord.inverse(self, projection).
- """
- return inverse_(obj,self)
-
-class _Feature(Feature,_injector):
- __geo_interface__ = property(lambda self: json.loads(self.to_geojson()))
-
-class _Path(Path,_injector):
- __geo_interface__ = property(lambda self: json.loads(self.to_geojson()))
-
-class _Datasource(Datasource,_injector):
-
- def all_features(self,fields=None,variables={}):
- query = Query(self.envelope())
- query.set_variables(variables);
- attributes = fields or self.fields()
- for fld in attributes:
- query.add_property_name(fld)
- return self.features(query).features
-
- def featureset(self,fields=None,variables={}):
- query = Query(self.envelope())
- query.set_variables(variables);
- attributes = fields or self.fields()
- for fld in attributes:
- query.add_property_name(fld)
- return self.features(query)
-
-class _Color(Color,_injector):
- def __repr__(self):
- return "Color(R=%d,G=%d,B=%d,A=%d)" % (self.r,self.g,self.b,self.a)
-
-class _SymbolizerBase(SymbolizerBase,_injector):
- # back compatibility
- @property
- def filename(self):
- return self['file']
-
- @filename.setter
- def filename(self, val):
- self['file'] = val
-
-def _add_symbol_method_to_symbolizers(vars=globals()):
-
- def symbol_for_subcls(self):
- return self
-
- def symbol_for_cls(self):
- return getattr(self,self.type())()
-
- for name, obj in vars.items():
- if name.endswith('Symbolizer') and not name.startswith('_'):
- if name == 'Symbolizer':
- symbol = symbol_for_cls
- else:
- symbol = symbol_for_subcls
- type('dummy', (obj,_injector), {'symbol': symbol})
-_add_symbol_method_to_symbolizers()
-
-def Datasource(**keywords):
- """Wrapper around CreateDatasource.
-
- Create a Mapnik Datasource using a dictionary of parameters.
-
- Keywords must include:
-
- type='plugin_name' # e.g. type='gdal'
-
- See the convenience factory methods of each input plugin for
- details on additional required keyword arguments.
-
- """
-
- return CreateDatasource(keywords)
-
-# convenience factory methods
-
-def Shapefile(**keywords):
- """Create a Shapefile Datasource.
-
- Required keyword arguments:
- file -- path to shapefile without extension
-
- Optional keyword arguments:
- base -- path prefix (default None)
- encoding -- file encoding (default 'utf-8')
-
- >>> from mapnik import Shapefile, Layer
- >>> shp = Shapefile(base='/home/mapnik/data',file='world_borders')
- >>> lyr = Layer('Shapefile Layer')
- >>> lyr.datasource = shp
-
- """
- keywords['type'] = 'shape'
- return CreateDatasource(keywords)
-
-def CSV(**keywords):
- """Create a CSV Datasource.
-
- Required keyword arguments:
- file -- path to csv
-
- Optional keyword arguments:
- inline -- inline CSV string (if provided 'file' argument will be ignored and non-needed)
- base -- path prefix (default None)
- encoding -- file encoding (default 'utf-8')
- row_limit -- integer limit of rows to return (default: 0)
- strict -- throw an error if an invalid row is encountered
- escape -- The escape character to use for parsing data
- quote -- The quote character to use for parsing data
- separator -- The separator character to use for parsing data
- headers -- A comma separated list of header names that can be set to add headers to data that lacks them
- filesize_max -- The maximum filesize in MB that will be accepted
-
- >>> from mapnik import CSV
- >>> csv = CSV(file='test.csv')
-
- >>> from mapnik import CSV
- >>> csv = CSV(inline='''wkt,Name\n"POINT (120.15 48.47)","Winthrop, WA"''')
-
- For more information see https://github.com/mapnik/mapnik/wiki/CSV-Plugin
-
- """
- keywords['type'] = 'csv'
- return CreateDatasource(keywords)
-
-def GeoJSON(**keywords):
- """Create a GeoJSON Datasource.
-
- Required keyword arguments:
- file -- path to json
-
- Optional keyword arguments:
- encoding -- file encoding (default 'utf-8')
- base -- path prefix (default None)
-
- >>> from mapnik import GeoJSON
- >>> geojson = GeoJSON(file='test.json')
-
- """
- keywords['type'] = 'geojson'
- return CreateDatasource(keywords)
-
-def PostGIS(**keywords):
- """Create a PostGIS Datasource.
-
- Required keyword arguments:
- dbname -- database name to connect to
- table -- table name or subselect query
-
- *Note: if using subselects for the 'table' value consider also
- passing the 'geometry_field' and 'srid' and 'extent_from_subquery'
- options and/or specifying the 'geometry_table' option.
-
- Optional db connection keyword arguments:
- user -- database user to connect as (default: see postgres docs)
- password -- password for database user (default: see postgres docs)
- host -- portgres hostname (default: see postgres docs)
- port -- postgres port (default: see postgres docs)
- initial_size -- integer size of connection pool (default: 1)
- max_size -- integer max of connection pool (default: 10)
- persist_connection -- keep connection open (default: True)
-
- Optional table-level keyword arguments:
- extent -- manually specified data extent (comma delimited string, default: None)
- estimate_extent -- boolean, direct PostGIS to use the faster, less accurate `estimate_extent` over `extent` (default: False)
- extent_from_subquery -- boolean, direct Mapnik to query Postgis for the extent of the raw 'table' value (default: uses 'geometry_table')
- geometry_table -- specify geometry table to use to look up metadata (default: automatically parsed from 'table' value)
- geometry_field -- specify geometry field to use (default: first entry in geometry_columns)
- srid -- specify srid to use (default: auto-detected from geometry_field)
- row_limit -- integer limit of rows to return (default: 0)
- cursor_size -- integer size of binary cursor to use (default: 0, no binary cursor is used)
-
- >>> from mapnik import PostGIS, Layer
- >>> params = dict(dbname=env['MAPNIK_NAME'],table='osm',user='postgres',password='gis')
- >>> params['estimate_extent'] = False
- >>> params['extent'] = '-20037508,-19929239,20037508,19929239'
- >>> postgis = PostGIS(**params)
- >>> lyr = Layer('PostGIS Layer')
- >>> lyr.datasource = postgis
-
- """
- keywords['type'] = 'postgis'
- return CreateDatasource(keywords)
-
-def PgRaster(**keywords):
- """Create a PgRaster Datasource.
-
- Required keyword arguments:
- dbname -- database name to connect to
- table -- table name or subselect query
-
- *Note: if using subselects for the 'table' value consider also
- passing the 'raster_field' and 'srid' and 'extent_from_subquery'
- options and/or specifying the 'raster_table' option.
-
- Optional db connection keyword arguments:
- user -- database user to connect as (default: see postgres docs)
- password -- password for database user (default: see postgres docs)
- host -- portgres hostname (default: see postgres docs)
- port -- postgres port (default: see postgres docs)
- initial_size -- integer size of connection pool (default: 1)
- max_size -- integer max of connection pool (default: 10)
- persist_connection -- keep connection open (default: True)
-
- Optional table-level keyword arguments:
- extent -- manually specified data extent (comma delimited string, default: None)
- estimate_extent -- boolean, direct PostGIS to use the faster, less accurate `estimate_extent` over `extent` (default: False)
- extent_from_subquery -- boolean, direct Mapnik to query Postgis for the extent of the raw 'table' value (default: uses 'geometry_table')
- raster_table -- specify geometry table to use to look up metadata (default: automatically parsed from 'table' value)
- raster_field -- specify geometry field to use (default: first entry in raster_columns)
- srid -- specify srid to use (default: auto-detected from geometry_field)
- row_limit -- integer limit of rows to return (default: 0)
- cursor_size -- integer size of binary cursor to use (default: 0, no binary cursor is used)
- use_overviews -- boolean, use overviews when available (default: false)
- prescale_rasters -- boolean, scale rasters on the db side (default: false)
- clip_rasters -- boolean, clip rasters on the db side (default: false)
- band -- integer, if non-zero interprets the given band (1-based offset) as a data raster (default: 0)
-
- >>> from mapnik import PgRaster, Layer
- >>> params = dict(dbname='mapnik',table='osm',user='postgres',password='gis')
- >>> params['estimate_extent'] = False
- >>> params['extent'] = '-20037508,-19929239,20037508,19929239'
- >>> pgraster = PgRaster(**params)
- >>> lyr = Layer('PgRaster Layer')
- >>> lyr.datasource = pgraster
-
- """
- keywords['type'] = 'pgraster'
- return CreateDatasource(keywords)
-
-def Raster(**keywords):
- """Create a Raster (Tiff) Datasource.
-
- Required keyword arguments:
- file -- path to stripped or tiled tiff
- lox -- lowest (min) x/longitude of tiff extent
- loy -- lowest (min) y/latitude of tiff extent
- hix -- highest (max) x/longitude of tiff extent
- hiy -- highest (max) y/latitude of tiff extent
-
- Hint: lox,loy,hix,hiy make a Mapnik Box2d
-
- Optional keyword arguments:
- base -- path prefix (default None)
- multi -- whether the image is in tiles on disk (default False)
-
- Multi-tiled keyword arguments:
- x_width -- virtual image number of tiles in X direction (required)
- y_width -- virtual image number of tiles in Y direction (required)
- tile_size -- if an image is in tiles, how large are the tiles (default 256)
- tile_stride -- if an image is in tiles, what's the increment between rows/cols (default 1)
-
- >>> from mapnik import Raster, Layer
- >>> raster = Raster(base='/home/mapnik/data',file='elevation.tif',lox=-122.8,loy=48.5,hix=-122.7,hiy=48.6)
- >>> lyr = Layer('Tiff Layer')
- >>> lyr.datasource = raster
-
- """
- keywords['type'] = 'raster'
- return CreateDatasource(keywords)
-
-def Gdal(**keywords):
- """Create a GDAL Raster Datasource.
-
- Required keyword arguments:
- file -- path to GDAL supported dataset
-
- Optional keyword arguments:
- base -- path prefix (default None)
- shared -- boolean, open GdalDataset in shared mode (default: False)
- bbox -- tuple (minx, miny, maxx, maxy). If specified, overrides the bbox detected by GDAL.
-
- >>> from mapnik import Gdal, Layer
- >>> dataset = Gdal(base='/home/mapnik/data',file='elevation.tif')
- >>> lyr = Layer('GDAL Layer from TIFF file')
- >>> lyr.datasource = dataset
-
- """
- keywords['type'] = 'gdal'
- if 'bbox' in keywords:
- if isinstance(keywords['bbox'], (tuple, list)):
- keywords['bbox'] = ','.join([str(item) for item in keywords['bbox']])
- return CreateDatasource(keywords)
-
-def Occi(**keywords):
- """Create a Oracle Spatial (10g) Vector Datasource.
-
- Required keyword arguments:
- user -- database user to connect as
- password -- password for database user
- host -- oracle host to connect to (does not refer to SID in tsnames.ora)
- table -- table name or subselect query
-
- Optional keyword arguments:
- initial_size -- integer size of connection pool (default 1)
- max_size -- integer max of connection pool (default 10)
- extent -- manually specified data extent (comma delimited string, default None)
- estimate_extent -- boolean, direct Oracle to use the faster, less accurate estimate_extent() over extent() (default False)
- encoding -- file encoding (default 'utf-8')
- geometry_field -- specify geometry field (default 'GEOLOC')
- use_spatial_index -- boolean, force the use of the spatial index (default True)
-
- >>> from mapnik import Occi, Layer
- >>> params = dict(host='myoracle',user='scott',password='tiger',table='test')
- >>> params['estimate_extent'] = False
- >>> params['extent'] = '-20037508,-19929239,20037508,19929239'
- >>> oracle = Occi(**params)
- >>> lyr = Layer('Oracle Spatial Layer')
- >>> lyr.datasource = oracle
- """
- keywords['type'] = 'occi'
- return CreateDatasource(keywords)
-
-def Ogr(**keywords):
- """Create a OGR Vector Datasource.
-
- Required keyword arguments:
- file -- path to OGR supported dataset
- layer -- name of layer to use within datasource (optional if layer_by_index or layer_by_sql is used)
-
- Optional keyword arguments:
- layer_by_index -- choose layer by index number instead of by layer name or sql.
- layer_by_sql -- choose layer by sql query number instead of by layer name or index.
- base -- path prefix (default None)
- encoding -- file encoding (default 'utf-8')
-
- >>> from mapnik import Ogr, Layer
- >>> datasource = Ogr(base='/home/mapnik/data',file='rivers.geojson',layer='OGRGeoJSON')
- >>> lyr = Layer('OGR Layer from GeoJSON file')
- >>> lyr.datasource = datasource
-
- """
- keywords['type'] = 'ogr'
- return CreateDatasource(keywords)
-
-def SQLite(**keywords):
- """Create a SQLite Datasource.
-
- Required keyword arguments:
- file -- path to SQLite database file
- table -- table name or subselect query
-
- Optional keyword arguments:
- base -- path prefix (default None)
- encoding -- file encoding (default 'utf-8')
- extent -- manually specified data extent (comma delimited string, default None)
- metadata -- name of auxillary table containing record for table with xmin, ymin, xmax, ymax, and f_table_name
- geometry_field -- name of geometry field (default 'the_geom')
- key_field -- name of primary key field (default 'OGC_FID')
- row_offset -- specify a custom integer row offset (default 0)
- row_limit -- specify a custom integer row limit (default 0)
- wkb_format -- specify a wkb type of 'spatialite' (default None)
- use_spatial_index -- boolean, instruct sqlite plugin to use Rtree spatial index (default True)
-
- >>> from mapnik import SQLite, Layer
- >>> sqlite = SQLite(base='/home/mapnik/data',file='osm.db',table='osm',extent='-20037508,-19929239,20037508,19929239')
- >>> lyr = Layer('SQLite Layer')
- >>> lyr.datasource = sqlite
-
- """
- keywords['type'] = 'sqlite'
- return CreateDatasource(keywords)
-
-def Rasterlite(**keywords):
- """Create a Rasterlite Datasource.
-
- Required keyword arguments:
- file -- path to Rasterlite database file
- table -- table name or subselect query
-
- Optional keyword arguments:
- base -- path prefix (default None)
- extent -- manually specified data extent (comma delimited string, default None)
-
- >>> from mapnik import Rasterlite, Layer
- >>> rasterlite = Rasterlite(base='/home/mapnik/data',file='osm.db',table='osm',extent='-20037508,-19929239,20037508,19929239')
- >>> lyr = Layer('Rasterlite Layer')
- >>> lyr.datasource = rasterlite
-
- """
- keywords['type'] = 'rasterlite'
- return CreateDatasource(keywords)
-
-def Osm(**keywords):
- """Create a Osm Datasource.
-
- Required keyword arguments:
- file -- path to OSM file
-
- Optional keyword arguments:
- encoding -- file encoding (default 'utf-8')
- url -- url to fetch data (default None)
- bbox -- data bounding box for fetching data (default None)
-
- >>> from mapnik import Osm, Layer
- >>> datasource = Osm(file='test.osm')
- >>> lyr = Layer('Osm Layer')
- >>> lyr.datasource = datasource
-
- """
- # note: parser only supports libxml2 so not exposing option
- # parser -- xml parser to use (default libxml2)
- keywords['type'] = 'osm'
- return CreateDatasource(keywords)
-
-def Python(**keywords):
- """Create a Python Datasource.
-
- >>> from mapnik import Python, PythonDatasource
- >>> datasource = Python('PythonDataSource')
- >>> lyr = Layer('Python datasource')
- >>> lyr.datasource = datasource
- """
- keywords['type'] = 'python'
- return CreateDatasource(keywords)
-
-def MemoryDatasource(**keywords):
- """Create a Memory Datasource.
-
- Optional keyword arguments:
- (TODO)
- """
- params = Parameters()
- params.append(Parameter('type','memory'))
- return MemoryDatasourceBase(params)
-
-class PythonDatasource(object):
- """A base class for a Python data source.
-
- Optional arguments:
- envelope -- a mapnik.Box2d (minx, miny, maxx, maxy) envelope of the data source, default (-180,-90,180,90)
- geometry_type -- one of the DataGeometryType enumeration values, default Point
- data_type -- one of the DataType enumerations, default Vector
- """
- def __init__(self, envelope=None, geometry_type=None, data_type=None):
- self.envelope = envelope or Box2d(-180, -90, 180, 90)
- self.geometry_type = geometry_type or DataGeometryType.Point
- self.data_type = data_type or DataType.Vector
-
- def features(self, query):
- """Return an iterable which yields instances of Feature for features within the passed query.
-
- Required arguments:
- query -- a Query instance specifying the region for which features should be returned
- """
- return None
-
- def features_at_point(self, point):
- """Rarely uses. Return an iterable which yields instances of Feature for the specified point."""
- return None
-
- @classmethod
- def wkb_features(cls, keys, features):
- """A convenience function to wrap an iterator yielding pairs of WKB format geometry and dictionaries of
- key-value pairs into mapnik features. Return this from PythonDatasource.features() passing it a sequence of keys
- to appear in the output and an iterator yielding features.
-
- For example. One might have a features() method in a derived class like the following:
-
- def features(self, query):
- # ... create WKB features feat1 and feat2
-
- return mapnik.PythonDatasource.wkb_features(
- keys = ( 'name', 'author' ),
- features = [
- (feat1, { 'name': 'feat1', 'author': 'alice' }),
- (feat2, { 'name': 'feat2', 'author': 'bob' }),
- ]
- )
-
- """
- ctx = Context()
- [ctx.push(x) for x in keys]
-
- def make_it(feat, idx):
- f = Feature(ctx, idx)
- geom, attrs = feat
- f.add_geometries_from_wkb(geom)
- for k, v in attrs.iteritems():
- f[k] = v
- return f
-
- return itertools.imap(make_it, features, itertools.count(1))
-
- @classmethod
- def wkt_features(cls, keys, features):
- """A convenience function to wrap an iterator yielding pairs of WKT format geometry and dictionaries of
- key-value pairs into mapnik features. Return this from PythonDatasource.features() passing it a sequence of keys
- to appear in the output and an iterator yielding features.
-
- For example. One might have a features() method in a derived class like the following:
-
- def features(self, query):
- # ... create WKT features feat1 and feat2
-
- return mapnik.PythonDatasource.wkt_features(
- keys = ( 'name', 'author' ),
- features = [
- (feat1, { 'name': 'feat1', 'author': 'alice' }),
- (feat2, { 'name': 'feat2', 'author': 'bob' }),
- ]
- )
-
- """
- ctx = Context()
- [ctx.push(x) for x in keys]
-
- def make_it(feat, idx):
- f = Feature(ctx, idx)
- geom, attrs = feat
- f.add_geometries_from_wkt(geom)
- for k, v in attrs.iteritems():
- f[k] = v
- return f
-
- return itertools.imap(make_it, features, itertools.count(1))
-
-class _TextSymbolizer(TextSymbolizer,_injector):
- @property
- def name(self):
- if isinstance(self.properties.format_tree, FormattingText):
- return self.properties.format_tree.text
- else:
- # There is no single expression which could be returned as name
- raise RuntimeError("TextSymbolizer uses complex formatting features, but old compatibility interface is used to access it. Use self.properties.format_tree instead.")
-
- @name.setter
- def name(self, name):
- self.properties.format_tree = FormattingText(name)
-
- @property
- def text_size(self):
- return self.format.text_size
-
- @text_size.setter
- def text_size(self, text_size):
- self.format.text_size = text_size
-
- @property
- def face_name(self):
- return self.format.face_name
-
- @face_name.setter
- def face_name(self, face_name):
- self.format.face_name = face_name
-
-
- @property
- def fontset(self):
- return self.format.fontset
-
- @fontset.setter
- def fontset(self, fontset):
- self.format.fontset = fontset
-
-
- @property
- def character_spacing(self):
- return self.format.character_spacing
-
- @character_spacing.setter
- def character_spacing(self, character_spacing):
- self.format.character_spacing = character_spacing
-
-
- @property
- def line_spacing(self):
- return self.format.line_spacing
-
- @line_spacing.setter
- def line_spacing(self, line_spacing):
- self.format.line_spacing = line_spacing
-
-
- @property
- def text_opacity(self):
- return self.format.text_opacity
-
- @text_opacity.setter
- def text_opacity(self, text_opacity):
- self.format.text_opacity = text_opacity
-
-
- @property
- def wrap_before(self):
- return self.format.wrap_before
-
- @wrap_before.setter
- def wrap_before(self, wrap_before):
- self.format.wrap_before = wrap_before
-
-
- @property
- def text_transform(self):
- return self.format.text_transform
-
- @text_transform.setter
- def text_transform(self, text_transform):
- self.format.text_transform = text_transform
-
-
- @property
- def fill(self):
- return self.format.fill
-
- @fill.setter
- def fill(self, fill):
- self.format.fill = fill
-
-
- @property
- def halo_fill(self):
- return self.format.halo_fill
-
- @halo_fill.setter
- def halo_fill(self, halo_fill):
- self.format.halo_fill = halo_fill
-
-
-
- @property
- def halo_radius(self):
- return self.format.halo_radius
-
- @halo_radius.setter
- def halo_radius(self, halo_radius):
- self.format.halo_radius = halo_radius
-
-
- @property
- def label_placement(self):
- return self.properties.label_placement
-
- @label_placement.setter
- def label_placement(self, label_placement):
- self.properties.label_placement = label_placement
-
-
-
- @property
- def horizontal_alignment(self):
- return self.properties.horizontal_alignment
-
- @horizontal_alignment.setter
- def horizontal_alignment(self, horizontal_alignment):
- self.properties.horizontal_alignment = horizontal_alignment
-
-
-
- @property
- def justify_alignment(self):
- return self.properties.justify_alignment
-
- @justify_alignment.setter
- def justify_alignment(self, justify_alignment):
- self.properties.justify_alignment = justify_alignment
-
-
-
- @property
- def vertical_alignment(self):
- return self.properties.vertical_alignment
-
- @vertical_alignment.setter
- def vertical_alignment(self, vertical_alignment):
- self.properties.vertical_alignment = vertical_alignment
-
-
-
- @property
- def orientation(self):
- return self.properties.orientation
-
- @orientation.setter
- def orientation(self, orientation):
- self.properties.orientation = orientation
-
-
-
- @property
- def displacement(self):
- return self.properties.displacement
-
- @displacement.setter
- def displacement(self, displacement):
- self.properties.displacement = displacement
-
-
-
- @property
- def label_spacing(self):
- return self.properties.label_spacing
-
- @label_spacing.setter
- def label_spacing(self, label_spacing):
- self.properties.label_spacing = label_spacing
-
-
-
- @property
- def label_position_tolerance(self):
- return self.properties.label_position_tolerance
-
- @label_position_tolerance.setter
- def label_position_tolerance(self, label_position_tolerance):
- self.properties.label_position_tolerance = label_position_tolerance
-
-
-
- @property
- def avoid_edges(self):
- return self.properties.avoid_edges
-
- @avoid_edges.setter
- def avoid_edges(self, avoid_edges):
- self.properties.avoid_edges = avoid_edges
-
-
-
- @property
- def minimum_distance(self):
- return self.properties.minimum_distance
-
- @minimum_distance.setter
- def minimum_distance(self, minimum_distance):
- self.properties.minimum_distance = minimum_distance
-
-
-
- @property
- def minimum_padding(self):
- return self.properties.minimum_padding
-
- @minimum_padding.setter
- def minimum_padding(self, minimum_padding):
- self.properties.minimum_padding = minimum_padding
-
-
-
- @property
- def minimum_path_length(self):
- return self.properties.minimum_path_length
-
- @minimum_path_length.setter
- def minimum_path_length(self, minimum_path_length):
- self.properties.minimum_path_length = minimum_path_length
-
-
-
- @property
- def maximum_angle_char_delta(self):
- return self.properties.maximum_angle_char_delta
-
- @maximum_angle_char_delta.setter
- def maximum_angle_char_delta(self, maximum_angle_char_delta):
- self.properties.maximum_angle_char_delta = maximum_angle_char_delta
-
-
- @property
- def allow_overlap(self):
- return self.properties.allow_overlap
-
- @allow_overlap.setter
- def allow_overlap(self, allow_overlap):
- self.properties.allow_overlap = allow_overlap
-
-
-
- @property
- def text_ratio(self):
- return self.properties.text_ratio
-
- @text_ratio.setter
- def text_ratio(self, text_ratio):
- self.properties.text_ratio = text_ratio
-
-
-
- @property
- def wrap_width(self):
- return self.properties.wrap_width
-
- @wrap_width.setter
- def wrap_width(self, wrap_width):
- self.properties.wrap_width = wrap_width
-
-
-def mapnik_version_from_string(version_string):
- """Return the Mapnik version from a string."""
- n = version_string.split('.')
- return (int(n[0]) * 100000) + (int(n[1]) * 100) + (int(n[2]));
-
-def register_plugins(path=None):
- """Register plugins located by specified path"""
- if not path:
- if os.environ.has_key('MAPNIK_INPUT_PLUGINS_DIRECTORY'):
- path = os.environ.get('MAPNIK_INPUT_PLUGINS_DIRECTORY')
- else:
- from paths import inputpluginspath
- path = inputpluginspath
- DatasourceCache.register_datasources(path)
-
-def register_fonts(path=None,valid_extensions=['.ttf','.otf','.ttc','.pfa','.pfb','.ttc','.dfont','.woff']):
- """Recursively register fonts using path argument as base directory"""
- if not path:
- if os.environ.has_key('MAPNIK_FONT_DIRECTORY'):
- path = os.environ.get('MAPNIK_FONT_DIRECTORY')
- else:
- from paths import fontscollectionpath
- path = fontscollectionpath
- for dirpath, _, filenames in os.walk(path):
- for filename in filenames:
- if os.path.splitext(filename.lower())[1] in valid_extensions:
- FontEngine.instance().register_font(os.path.join(dirpath, filename))
-
-# auto-register known plugins and fonts
-register_plugins()
-register_fonts()
diff --git a/bindings/python/mapnik/printing.py b/bindings/python/mapnik/printing.py
deleted file mode 100644
index a354c49..0000000
--- a/bindings/python/mapnik/printing.py
+++ /dev/null
@@ -1,1027 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""Mapnik classes to assist in creating printable maps
-
-basic usage is along the lines of
-
-import mapnik
-
-page = mapnik.printing.PDFPrinter()
-m = mapnik.Map(100,100)
-mapnik.load_map(m, "my_xml_map_description", True)
-m.zoom_all()
-page.render_map(m,"my_output_file.pdf")
-
-see the documentation of mapnik.printing.PDFPrinter() for options
-
-"""
-from __future__ import absolute_import
-
-from . import render, Map, Box2d, Layer, Feature, Projection, ProjTransform, Coord, Style, Rule, Geometry2d
-import math
-import os
-import tempfile
-
-try:
- import cairo
- HAS_PYCAIRO_MODULE = True
-except ImportError:
- HAS_PYCAIRO_MODULE = False
-
-try:
- import pangocairo
- import pango
- HAS_PANGOCAIRO_MODULE = True
-except ImportError:
- HAS_PANGOCAIRO_MODULE = False
-
-try:
- import pyPdf
- HAS_PYPDF = True
-except ImportError:
- HAS_PYPDF = False
-
-class centering:
- """Style of centering to use with the map, the default is constrained
-
- none: map will be placed flush with the margin/box in the top left corner
- constrained: map will be centered on the most constrained axis (for a portrait page
- and a square map this will be horizontally)
- unconstrained: map will be centered on the unconstrained axis
- vertical:
- horizontal:
- both:
- """
- none=0
- constrained=1
- unconstrained=2
- vertical=3
- horizontal=4
- both=5
-
-"""Some predefined page sizes custom sizes can also be passed
-a tuple of the page width and height in meters"""
-pagesizes = {
- "a0": (0.841000,1.189000),
- "a0l": (1.189000,0.841000),
- "b0": (1.000000,1.414000),
- "b0l": (1.414000,1.000000),
- "c0": (0.917000,1.297000),
- "c0l": (1.297000,0.917000),
- "a1": (0.594000,0.841000),
- "a1l": (0.841000,0.594000),
- "b1": (0.707000,1.000000),
- "b1l": (1.000000,0.707000),
- "c1": (0.648000,0.917000),
- "c1l": (0.917000,0.648000),
- "a2": (0.420000,0.594000),
- "a2l": (0.594000,0.420000),
- "b2": (0.500000,0.707000),
- "b2l": (0.707000,0.500000),
- "c2": (0.458000,0.648000),
- "c2l": (0.648000,0.458000),
- "a3": (0.297000,0.420000),
- "a3l": (0.420000,0.297000),
- "b3": (0.353000,0.500000),
- "b3l": (0.500000,0.353000),
- "c3": (0.324000,0.458000),
- "c3l": (0.458000,0.324000),
- "a4": (0.210000,0.297000),
- "a4l": (0.297000,0.210000),
- "b4": (0.250000,0.353000),
- "b4l": (0.353000,0.250000),
- "c4": (0.229000,0.324000),
- "c4l": (0.324000,0.229000),
- "a5": (0.148000,0.210000),
- "a5l": (0.210000,0.148000),
- "b5": (0.176000,0.250000),
- "b5l": (0.250000,0.176000),
- "c5": (0.162000,0.229000),
- "c5l": (0.229000,0.162000),
- "a6": (0.105000,0.148000),
- "a6l": (0.148000,0.105000),
- "b6": (0.125000,0.176000),
- "b6l": (0.176000,0.125000),
- "c6": (0.114000,0.162000),
- "c6l": (0.162000,0.114000),
- "a7": (0.074000,0.105000),
- "a7l": (0.105000,0.074000),
- "b7": (0.088000,0.125000),
- "b7l": (0.125000,0.088000),
- "c7": (0.081000,0.114000),
- "c7l": (0.114000,0.081000),
- "a8": (0.052000,0.074000),
- "a8l": (0.074000,0.052000),
- "b8": (0.062000,0.088000),
- "b8l": (0.088000,0.062000),
- "c8": (0.057000,0.081000),
- "c8l": (0.081000,0.057000),
- "a9": (0.037000,0.052000),
- "a9l": (0.052000,0.037000),
- "b9": (0.044000,0.062000),
- "b9l": (0.062000,0.044000),
- "c9": (0.040000,0.057000),
- "c9l": (0.057000,0.040000),
- "a10": (0.026000,0.037000),
- "a10l": (0.037000,0.026000),
- "b10": (0.031000,0.044000),
- "b10l": (0.044000,0.031000),
- "c10": (0.028000,0.040000),
- "c10l": (0.040000,0.028000),
- "letter": (0.216,0.279),
- "letterl": (0.279,0.216),
- "legal": (0.216,0.356),
- "legall": (0.356,0.216),
-}
-"""size of a pt in meters"""
-pt_size=0.0254/72.0
-
-def m2pt(x):
- """convert distance from meters to points"""
- return x/pt_size
-
-def pt2m(x):
- """convert distance from points to meters"""
- return x*pt_size
-
-def m2in(x):
- """convert distance from meters to inches"""
- return x/0.0254
-
-def m2px(x,resolution):
- """convert distance from meters to pixels at the given resolution in DPI/PPI"""
- return m2in(x)*resolution
-
-class resolutions:
- """some predefined resolutions in DPI"""
- dpi72=72
- dpi150=150
- dpi300=300
- dpi600=600
-
-def any_scale(scale):
- """Scale helper function that allows any scale"""
- return scale
-
-def sequence_scale(scale,scale_sequence):
- """Default scale helper, this rounds scale to a 'sensible' value"""
- factor = math.floor(math.log10(scale))
- norm = scale/(10**factor)
-
- for s in scale_sequence:
- if norm <= s:
- return s*10**factor
- return scale_sequence[0]*10**(factor+1)
-
-def default_scale(scale):
- """Default scale helper, this rounds scale to a 'sensible' value"""
- return sequence_scale(scale, (1,1.25,1.5,1.75,2,2.5,3,4,5,6,7.5,8,9,10))
-
-def deg_min_sec_scale(scale):
- for x in (1.0/3600,
- 2.0/3600,
- 5.0/3600,
- 10.0/3600,
- 30.0/3600,
- 1.0/60,
- 2.0/60,
- 5.0/60,
- 10.0/60,
- 30.0/60,
- 1,
- 2,
- 5,
- 10,
- 30,
- 60
- ):
- if scale < x:
- return x
- else:
- return x
-
-def format_deg_min_sec(value):
- deg = math.floor(value)
- min = math.floor((value-deg)/(1.0/60))
- sec = int((value - deg*1.0/60)/1.0/3600)
- return "%d°%d'%d\"" % (deg,min,sec)
-
-def round_grid_generator(first,last,step):
- val = (math.floor(first / step) + 1) * step
- yield val
- while val < last:
- val += step
- yield val
-
-
-def convert_pdf_pages_to_layers(filename,output_name=None,layer_names=(),reverse_all_but_last=True):
- """
- opens the given multipage PDF and converts each page to be a layer in a single page PDF
- layer_names should be a sequence of the user visible names of the layers, if not given
- or if shorter than num pages generic names will be given to the unnamed layers
-
- if output_name is not provided a temporary file will be used for the conversion which
- will then be copied back over the source file.
-
- requires pyPdf >= 1.13 to be available"""
-
-
- if not HAS_PYPDF:
- raise Exception("pyPdf Not available")
-
- infile = file(filename, 'rb')
- if output_name:
- outfile = file(output_name, 'wb')
- else:
- (outfd,outfilename) = tempfile.mkstemp(dir=os.path.dirname(filename))
- outfile = os.fdopen(outfd,'wb')
-
- i = pyPdf.PdfFileReader(infile)
- o = pyPdf.PdfFileWriter()
-
- template_page_size = i.pages[0].mediaBox
- op = o.addBlankPage(width=template_page_size.getWidth(),height=template_page_size.getHeight())
-
- contentkey = pyPdf.generic.NameObject('/Contents')
- resourcekey = pyPdf.generic.NameObject('/Resources')
- propertieskey = pyPdf.generic.NameObject('/Properties')
- op[contentkey] = pyPdf.generic.ArrayObject()
- op[resourcekey] = pyPdf.generic.DictionaryObject()
- properties = pyPdf.generic.DictionaryObject()
- ocgs = pyPdf.generic.ArrayObject()
-
- for (i, p) in enumerate(i.pages):
- # first start an OCG for the layer
- ocgname = pyPdf.generic.NameObject('/oc%d' % i)
- ocgstart = pyPdf.generic.DecodedStreamObject()
- ocgstart._data = "/OC %s BDC\n" % ocgname
- ocgend = pyPdf.generic.DecodedStreamObject()
- ocgend._data = "EMC\n"
- if isinstance(p['/Contents'],pyPdf.generic.ArrayObject):
- p[pyPdf.generic.NameObject('/Contents')].insert(0,ocgstart)
- p[pyPdf.generic.NameObject('/Contents')].append(ocgend)
- else:
- p[pyPdf.generic.NameObject('/Contents')] = pyPdf.generic.ArrayObject((ocgstart,p['/Contents'],ocgend))
-
- op.mergePage(p)
-
- ocg = pyPdf.generic.DictionaryObject()
- ocg[pyPdf.generic.NameObject('/Type')] = pyPdf.generic.NameObject('/OCG')
- if len(layer_names) > i:
- ocg[pyPdf.generic.NameObject('/Name')] = pyPdf.generic.TextStringObject(layer_names[i])
- else:
- ocg[pyPdf.generic.NameObject('/Name')] = pyPdf.generic.TextStringObject('Layer %d' % (i+1))
- indirect_ocg = o._addObject(ocg)
- properties[ocgname] = indirect_ocg
- ocgs.append(indirect_ocg)
-
- op[resourcekey][propertieskey] = o._addObject(properties)
-
- ocproperties = pyPdf.generic.DictionaryObject()
- ocproperties[pyPdf.generic.NameObject('/OCGs')] = ocgs
- defaultview = pyPdf.generic.DictionaryObject()
- defaultview[pyPdf.generic.NameObject('/Name')] = pyPdf.generic.TextStringObject('Default')
- defaultview[pyPdf.generic.NameObject('/BaseState ')] = pyPdf.generic.NameObject('/ON ')
- defaultview[pyPdf.generic.NameObject('/ON')] = ocgs
- if reverse_all_but_last:
- defaultview[pyPdf.generic.NameObject('/Order')] = pyPdf.generic.ArrayObject(reversed(ocgs[:-1]))
- defaultview[pyPdf.generic.NameObject('/Order')].append(ocgs[-1])
- else:
- defaultview[pyPdf.generic.NameObject('/Order')] = pyPdf.generic.ArrayObject(reversed(ocgs))
- defaultview[pyPdf.generic.NameObject('/OFF')] = pyPdf.generic.ArrayObject()
-
- ocproperties[pyPdf.generic.NameObject('/D')] = o._addObject(defaultview)
-
- o._root.getObject()[pyPdf.generic.NameObject('/OCProperties')] = o._addObject(ocproperties)
-
- o.write(outfile)
-
- outfile.close()
- infile.close()
-
- if not output_name:
- os.rename(outfilename, filename)
-
-class PDFPrinter:
- """Main class for creating PDF print outs, basically contruct an instance
- with appropriate options and then call render_map with your mapnik map
- """
- def __init__(self,
- pagesize=pagesizes["a4"],
- margin=0.005,
- box=None,
- percent_box=None,
- scale=default_scale,
- resolution=resolutions.dpi72,
- preserve_aspect=True,
- centering=centering.constrained,
- is_latlon=False,
- use_ocg_layers=False):
- """Creates a cairo surface and context to render a PDF with.
-
- pagesize: tuple of page size in meters, see predefined sizes in pagessizes dict (default a4)
- margin: page margin in meters (default 0.01)
- box: box within the page to render the map into (will not render over margin). This should be
- a Mapnik Box2d object. Default is the full page within the margin
- percent_box: as per box, but specified as a percent (0->1) of the full page size. If both box
- and percent_box are specified percent_box will be used.
- scale: scale helper to use when rounding the map scale. This should be a function that
- takes a single float and returns a float which is at least as large as the value
- passed in. This is a 1:x scale.
- resolution: the resolution to render non vector elements at (in DPI), defaults to 72 DPI
- preserve_aspect: whether to preserve map aspect ratio. This defaults to True and it
- is recommended you do not change it unless you know what you are doing
- scales and so on will not work if this is False.
- centering: Centering rules for maps where the scale rounding has reduced the map size.
- This should be a value from the centering class. The default is to center on the
- maps constrained axis, typically this will be horizontal for portrait pages and
- vertical for landscape pages.
- is_latlon: Is the map in lat lon degrees. If true magic anti meridian logic is enabled
- use_ocg_layers: Create OCG layers in the PDF, requires pyPdf >= 1.13
- """
- self._pagesize = pagesize
- self._margin = margin
- self._box = box
- self._scale = scale
- self._resolution = resolution
- self._preserve_aspect = preserve_aspect
- self._centering = centering
- self._is_latlon = is_latlon
- self._use_ocg_layers = use_ocg_layers
-
- self._s = None
- self._layer_names = []
- self._filename = None
-
- self.map_box = None
- self.scale = None
-
- # don't both to round the scale if they are not preserving the aspect ratio
- if not preserve_aspect:
- self._scale = any_scale
-
- if percent_box:
- self._box = Box2d(percent_box[0]*pagesize[0],percent_box[1]*pagesize[1],
- percent_box[2]*pagesize[0],percent_box[3]*pagesize[1])
-
- if not HAS_PYCAIRO_MODULE:
- raise Exception("PDF rendering only available when pycairo is available")
-
- self.font_name = "DejaVu Sans"
-
- def finish(self):
- if self._s:
- self._s.finish()
- self._s = None
-
- if self._use_ocg_layers:
- convert_pdf_pages_to_layers(self._filename,layer_names=self._layer_names + ["Legend and Information"],reverse_all_but_last=True)
-
- def add_geospatial_pdf_header(self,m,filename,epsg=None,wkt=None):
- """ Postprocessing step to add geospatial PDF information to PDF file as per
- PDF standard 1.7 extension level 3 (also in draft PDF v2 standard at time of writing)
-
- one of either the epsg code or wkt text for the projection must be provided
-
- Should be called *after* the page has had .finish() called"""
- if HAS_PYPDF and (epsg or wkt):
- infile=file(filename,'rb')
- (outfd,outfilename) = tempfile.mkstemp(dir=os.path.dirname(filename))
- outfile = os.fdopen(outfd,'wb')
-
- i=pyPdf.PdfFileReader(infile)
- o=pyPdf.PdfFileWriter()
-
- # preserve OCProperties at document root if we have one
- if i.trailer['/Root'].has_key(pyPdf.generic.NameObject('/OCProperties')):
- o._root.getObject()[pyPdf.generic.NameObject('/OCProperties')] = i.trailer['/Root'].getObject()[pyPdf.generic.NameObject('/OCProperties')]
-
- for p in i.pages:
- gcs = pyPdf.generic.DictionaryObject()
- gcs[pyPdf.generic.NameObject('/Type')]=pyPdf.generic.NameObject('/PROJCS')
- if epsg:
- gcs[pyPdf.generic.NameObject('/EPSG')]=pyPdf.generic.NumberObject(int(epsg))
- if wkt:
- gcs[pyPdf.generic.NameObject('/WKT')]=pyPdf.generic.TextStringObject(wkt)
-
- measure = pyPdf.generic.DictionaryObject()
- measure[pyPdf.generic.NameObject('/Type')]=pyPdf.generic.NameObject('/Measure')
- measure[pyPdf.generic.NameObject('/Subtype')]=pyPdf.generic.NameObject('/GEO')
- measure[pyPdf.generic.NameObject('/GCS')]=gcs
- bounds=pyPdf.generic.ArrayObject()
- for x in (0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0):
- bounds.append(pyPdf.generic.FloatObject(str(x)))
- measure[pyPdf.generic.NameObject('/Bounds')]=bounds
- measure[pyPdf.generic.NameObject('/LPTS')]=bounds
- gpts=pyPdf.generic.ArrayObject()
-
- proj=Projection(m.srs)
- env=m.envelope()
- for x in ((env.minx, env.miny), (env.minx, env.maxy), (env.maxx, env.maxy), (env.maxx, env.miny)):
- latlon_corner=proj.inverse(Coord(*x))
- # these are in lat,lon order according to the standard
- gpts.append(pyPdf.generic.FloatObject(str(latlon_corner.y)))
- gpts.append(pyPdf.generic.FloatObject(str(latlon_corner.x)))
- measure[pyPdf.generic.NameObject('/GPTS')]=gpts
-
- vp=pyPdf.generic.DictionaryObject()
- vp[pyPdf.generic.NameObject('/Type')]=pyPdf.generic.NameObject('/Viewport')
- bbox=pyPdf.generic.ArrayObject()
-
- for x in self.map_box:
- bbox.append(pyPdf.generic.FloatObject(str(x)))
- vp[pyPdf.generic.NameObject('/BBox')]=bbox
- vp[pyPdf.generic.NameObject('/Measure')]=measure
-
- vpa = pyPdf.generic.ArrayObject()
- vpa.append(vp)
- p[pyPdf.generic.NameObject('/VP')]=vpa
- o.addPage(p)
-
- o.write(outfile)
- infile=None
- outfile.close()
- os.rename(outfilename,filename)
-
-
- def get_context(self):
- """allow access so that extra 'bits' can be rendered to the page directly"""
- return cairo.Context(self._s)
-
- def get_width(self):
- return self._pagesize[0]
-
- def get_height(self):
- return self._pagesize[1]
-
- def get_margin(self):
- return self._margin
-
- def write_text(self,ctx,text,box_width=None,size=10, fill_color=(0.0, 0.0, 0.0), alignment=None):
- if HAS_PANGOCAIRO_MODULE:
- (attr,t,accel) = pango.parse_markup(text)
- pctx = pangocairo.CairoContext(ctx)
- l = pctx.create_layout()
- l.set_attributes(attr)
- fd = pango.FontDescription("%s %d" % (self.font_name,size))
- l.set_font_description(fd)
- if box_width:
- l.set_width(int(box_width*pango.SCALE))
- if alignment:
- l.set_alignment(alignment)
- pctx.update_layout(l)
- l.set_text(t)
- pctx.set_source_rgb(*fill_color)
- pctx.show_layout(l)
- return l.get_pixel_extents()[0]
-
- else:
- ctx.rel_move_to(0,size)
- ctx.select_font_face(self.font_name, cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
- ctx.set_font_size(size)
- ctx.show_text(text)
- ctx.rel_move_to(0,size)
- return (0,0,len(text)*size,size)
-
- def _get_context(self):
- if HAS_PANGOCAIRO_MODULE:
- return
- elif HAS_PYCAIRO_MODULE:
- return cairo.Context(self._s)
- return None
-
- def _get_render_area(self):
- """return a bounding box with the area of the page we are allowed to render out map to
- in page coordinates (i.e. meters)
- """
- # take off our page margins
- render_area = Box2d(self._margin,self._margin,self._pagesize[0]-self._margin,self._pagesize[1]-self._margin)
-
- #then if user specified a box to render get intersection with that
- if self._box:
- return render_area.intersect(self._box)
-
- return render_area
-
- def _get_render_area_size(self):
- """Get the width and height (in meters) of the area we can render the map to, returned as a tuple"""
- render_area = self._get_render_area()
- return (render_area.width(),render_area.height())
-
- def _is_h_contrained(self,m):
- """Test if the map size is constrained on the horizontal or vertical axes"""
- available_area = self._get_render_area_size()
- map_aspect = m.envelope().width()/m.envelope().height()
- page_aspect = available_area[0]/available_area[1]
-
- return map_aspect > page_aspect
-
- def _get_meta_info_corner(self,render_size,m):
- """Get the corner (in page coordinates) of a possibly
- sensible place to render metadata such as a legend or scale"""
- (x,y) = self._get_render_corner(render_size,m)
- if self._is_h_contrained(m):
- y += render_size[1]+0.005
- x = self._margin
- else:
- x += render_size[0]+0.005
- y = self._margin
-
- return (x,y)
-
- def _get_render_corner(self,render_size,m):
- """Get the corner of the box we should render our map into"""
- available_area = self._get_render_area()
-
- x=available_area[0]
- y=available_area[1]
-
- h_is_contrained = self._is_h_contrained(m)
-
- if (self._centering == centering.both or
- self._centering == centering.horizontal or
- (self._centering == centering.constrained and h_is_contrained) or
- (self._centering == centering.unconstrained and not h_is_contrained)):
- x+=(available_area.width()-render_size[0])/2
-
- if (self._centering == centering.both or
- self._centering == centering.vertical or
- (self._centering == centering.constrained and not h_is_contrained) or
- (self._centering == centering.unconstrained and h_is_contrained)):
- y+=(available_area.height()-render_size[1])/2
- return (x,y)
-
- def _get_map_pixel_size(self, width_page_m, height_page_m):
- """for a given map size in paper coordinates return a tuple of the map 'pixel' size we
- should create at the defined resolution"""
- return (int(m2px(width_page_m,self._resolution)), int(m2px(height_page_m,self._resolution)))
-
- def render_map(self,m, filename):
- """Render the given map to filename"""
-
- # store this for later so we can post process the PDF
- self._filename = filename
-
- # work out the best scale to render out map at given the available space
- (eff_width,eff_height) = self._get_render_area_size()
- map_aspect = m.envelope().width()/m.envelope().height()
- page_aspect = eff_width/eff_height
-
- scalex=m.envelope().width()/eff_width
- scaley=m.envelope().height()/eff_height
-
- scale=max(scalex,scaley)
-
- rounded_mapscale=self._scale(scale)
- scalefactor = scale/rounded_mapscale
- mapw=eff_width*scalefactor
- maph=eff_height*scalefactor
- if self._preserve_aspect:
- if map_aspect > page_aspect:
- maph=mapw*(1/map_aspect)
- else:
- mapw=maph*map_aspect
-
- # set the map size so that raster elements render at the correct resolution
- m.resize(*self._get_map_pixel_size(mapw,maph))
- # calculate the translation for the map starting point
- (tx,ty) = self._get_render_corner((mapw,maph),m)
-
- # create our cairo surface and context and then render the map into it
- self._s = cairo.PDFSurface(filename, m2pt(self._pagesize[0]),m2pt(self._pagesize[1]))
- ctx=cairo.Context(self._s)
-
- for l in m.layers:
- # extract the layer names for naming layers if we use OCG
- self._layer_names.append(l.name)
-
- layer_map = Map(m.width,m.height,m.srs)
- layer_map.layers.append(l)
- for s in l.styles:
- layer_map.append_style(s,m.find_style(s))
- layer_map.zoom_to_box(m.envelope())
-
- def render_map():
- ctx.save()
- ctx.translate(m2pt(tx),m2pt(ty))
- #cairo defaults to 72dpi
- ctx.scale(72.0/self._resolution,72.0/self._resolution)
- render(layer_map, ctx)
- ctx.restore()
-
- # antimeridian
- render_map()
- if self._is_latlon and (m.envelope().minx < -180 or m.envelope().maxx > 180):
- old_env = m.envelope()
- if m.envelope().minx < -180:
- delta = 360
- else:
- delta = -360
- m.zoom_to_box(Box2d(old_env.minx+delta,old_env.miny,old_env.maxx+delta,old_env.maxy))
- render_map()
- # restore the original env
- m.zoom_to_box(old_env)
-
- if self._use_ocg_layers:
- self._s.show_page()
-
- self.scale = rounded_mapscale
- self.map_box = Box2d(tx,ty,tx+mapw,ty+maph)
-
- def render_on_map_lat_lon_grid(self,m,dec_degrees=True):
- # don't render lat_lon grid if we are already in latlon
- if self._is_latlon:
- return
- p2=Projection(m.srs)
-
- latlon_bounds = p2.inverse(m.envelope())
- if p2.inverse(m.envelope().center()).x > latlon_bounds.maxx:
- latlon_bounds = Box2d(latlon_bounds.maxx,latlon_bounds.miny,latlon_bounds.minx+360,latlon_bounds.maxy)
-
- if p2.inverse(m.envelope().center()).y > latlon_bounds.maxy:
- latlon_bounds = Box2d(latlon_bounds.miny,latlon_bounds.maxy,latlon_bounds.maxx,latlon_bounds.miny+360)
-
- latlon_mapwidth = latlon_bounds.width()
- # render an extra 20% so we generally won't miss the ends of lines
- latlon_buffer = 0.2*latlon_mapwidth
- if dec_degrees:
- latlon_divsize = default_scale(latlon_mapwidth/7.0)
- else:
- latlon_divsize = deg_min_sec_scale(latlon_mapwidth/7.0)
- latlon_interpsize = latlon_mapwidth/m.width
-
- self._render_lat_lon_axis(m,p2,latlon_bounds.minx,latlon_bounds.maxx,latlon_bounds.miny,latlon_bounds.maxy,latlon_buffer,latlon_interpsize,latlon_divsize,dec_degrees,True)
- self._render_lat_lon_axis(m,p2,latlon_bounds.miny,latlon_bounds.maxy,latlon_bounds.minx,latlon_bounds.maxx,latlon_buffer,latlon_interpsize,latlon_divsize,dec_degrees,False)
-
- def _render_lat_lon_axis(self,m,p2,x1,x2,y1,y2,latlon_buffer,latlon_interpsize,latlon_divsize,dec_degrees,is_x_axis):
- ctx=cairo.Context(self._s)
- ctx.set_source_rgb(1,0,0)
- ctx.set_line_width(1)
- latlon_labelsize = 6
-
- ctx.translate(m2pt(self.map_box.minx),m2pt(self.map_box.miny))
- ctx.rectangle(0,0,m2pt(self.map_box.width()),m2pt(self.map_box.height()))
- ctx.clip()
-
- ctx.select_font_face("DejaVu", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
- ctx.set_font_size(latlon_labelsize)
-
- box_top = self.map_box.height()
- if not is_x_axis:
- ctx.translate(m2pt(self.map_box.width()/2),m2pt(self.map_box.height()/2))
- ctx.rotate(-math.pi/2)
- ctx.translate(-m2pt(self.map_box.height()/2),-m2pt(self.map_box.width()/2))
- box_top = self.map_box.width()
-
- for xvalue in round_grid_generator(x1 - latlon_buffer,x2 + latlon_buffer,latlon_divsize):
- yvalue = y1 - latlon_buffer
- start_cross = None
- end_cross = None
- while yvalue < y2+latlon_buffer:
- if is_x_axis:
- start = m.view_transform().forward(p2.forward(Coord(xvalue,yvalue)))
- else:
- temp = m.view_transform().forward(p2.forward(Coord(yvalue,xvalue)))
- start = Coord(m2pt(self.map_box.height())-temp.y,temp.x)
- yvalue += latlon_interpsize
- if is_x_axis:
- end = m.view_transform().forward(p2.forward(Coord(xvalue,yvalue)))
- else:
- temp = m.view_transform().forward(p2.forward(Coord(yvalue,xvalue)))
- end = Coord(m2pt(self.map_box.height())-temp.y,temp.x)
-
- ctx.move_to(start.x,start.y)
- ctx.line_to(end.x,end.y)
- ctx.stroke()
-
- if cmp(start.y, 0) != cmp(end.y,0):
- start_cross = end.x
- if cmp(start.y,m2pt(self.map_box.height())) != cmp(end.y, m2pt(self.map_box.height())):
- end_cross = end.x
-
- if dec_degrees:
- line_text = "%g" % (xvalue)
- else:
- line_text = format_deg_min_sec(xvalue)
- if start_cross:
- ctx.move_to(start_cross+2,latlon_labelsize)
- ctx.show_text(line_text)
- if end_cross:
- ctx.move_to(end_cross+2,m2pt(box_top)-2)
- ctx.show_text(line_text)
-
- def render_on_map_scale(self,m):
- (div_size,page_div_size) = self._get_sensible_scalebar_size(m)
-
- first_value_x = (math.floor(m.envelope().minx / div_size) + 1) * div_size
- first_value_x_percent = (first_value_x-m.envelope().minx)/m.envelope().width()
- self._render_scale_axis(first_value_x,first_value_x_percent,self.map_box.minx,self.map_box.maxx,page_div_size,div_size,self.map_box.miny,self.map_box.maxy,True)
-
- first_value_y = (math.floor(m.envelope().miny / div_size) + 1) * div_size
- first_value_y_percent = (first_value_y-m.envelope().miny)/m.envelope().height()
- self._render_scale_axis(first_value_y,first_value_y_percent,self.map_box.miny,self.map_box.maxy,page_div_size,div_size,self.map_box.minx,self.map_box.maxx,False)
-
- if self._use_ocg_layers:
- self._s.show_page()
- self._layer_names.append("Coordinate Grid Overlay")
-
- def _get_sensible_scalebar_size(self,m,width=-1):
- # aim for about 8 divisions across the map
- # also make sure we can fit the bar with in page area width if specified
- div_size = sequence_scale(m.envelope().width()/8, [1,2,5])
- page_div_size = self.map_box.width()*div_size/m.envelope().width()
- while width > 0 and page_div_size > width:
- div_size /=2
- page_div_size /= 2
- return (div_size,page_div_size)
-
- def _render_box(self,ctx,x,y,w,h,text=None,stroke_color=(0,0,0),fill_color=(0,0,0)):
- ctx.set_line_width(1)
- ctx.set_source_rgb(*fill_color)
- ctx.rectangle(x,y,w,h)
- ctx.fill()
-
- ctx.set_source_rgb(*stroke_color)
- ctx.rectangle(x,y,w,h)
- ctx.stroke()
-
- if text:
- ctx.move_to(x+1,y)
- self.write_text(ctx,text,fill_color=[1-z for z in fill_color],size=h-2)
-
- def _render_scale_axis(self,first,first_percent,start,end,page_div_size,div_size,boundary_start,boundary_end,is_x_axis):
- prev = start
- text = None
- fill=(0,0,0)
- border_size=8
- value = first_percent * (end-start) + start
- label_value = first-div_size
- if self._is_latlon and label_value < -180:
- label_value += 360
-
- ctx=cairo.Context(self._s)
-
- if not is_x_axis:
- ctx.translate(m2pt(self.map_box.center().x),m2pt(self.map_box.center().y))
- ctx.rotate(-math.pi/2)
- ctx.translate(-m2pt(self.map_box.center().y),-m2pt(self.map_box.center().x))
-
- while value < end:
- ctx.move_to(m2pt(value),m2pt(boundary_start))
- ctx.line_to(m2pt(value),m2pt(boundary_end))
- ctx.set_source_rgb(0.5,0.5,0.5)
- ctx.set_line_width(1)
- ctx.stroke()
-
- for bar in (m2pt(boundary_start)-border_size,m2pt(boundary_end)):
- self._render_box(ctx,m2pt(prev),bar,m2pt(value-prev),border_size,text,fill_color=fill)
-
- prev = value
- value+=page_div_size
- fill = [1-z for z in fill]
- label_value += div_size
- if self._is_latlon and label_value > 180:
- label_value -= 360
- text = "%d" % label_value
- else:
- for bar in (m2pt(boundary_start)-border_size,m2pt(boundary_end)):
- self._render_box(ctx,m2pt(prev),bar,m2pt(end-prev),border_size,fill_color=fill)
-
-
- def render_scale(self,m,ctx=None,width=0.05):
- """ m: map to render scale for
- ctx: A cairo context to render the scale to. If this is None (the default) then
- automatically create a context and choose the best location for the scale bar.
- width: Width of area available to render scale bar in (in m)
-
- will return the size of the rendered scale block in pts
- """
-
- (w,h) = (0,0)
-
- # don't render scale if we are lat lon
- # dont report scale if we have warped the aspect ratio
- if self._preserve_aspect and not self._is_latlon:
- bar_size=8.0
- box_count=3
- if ctx is None:
- ctx=cairo.Context(self._s)
- (tx,ty) = self._get_meta_info_corner((self.map_box.width(),self.map_box.height()),m)
- ctx.translate(tx,ty)
-
- (div_size,page_div_size) = self._get_sensible_scalebar_size(m, width/box_count)
-
-
- div_unit = "m"
- if div_size > 1000:
- div_size /= 1000
- div_unit = "km"
-
- text = "0%s" % div_unit
- ctx.save()
- if width > 0:
- ctx.translate(m2pt(width-box_count*page_div_size)/2,0)
- for ii in range(box_count):
- fill=(ii%2,)*3
- self._render_box(ctx, m2pt(ii*page_div_size), h, m2pt(page_div_size), bar_size, text, fill_color=fill)
- fill = [1-z for z in fill]
- text = "%g%s" % ((ii+1)*div_size,div_unit)
- #else:
- # self._render_box(ctx, m2pt(box_count*page_div_size), h, m2pt(page_div_size), bar_size, text, fill_color=(1,1,1), stroke_color=(1,1,1))
- w = (box_count)*page_div_size
- h += bar_size
- ctx.restore()
-
- if width > 0:
- box_width=m2pt(width)
- else:
- box_width = None
-
- font_size=6
- ctx.move_to(0,h)
- if HAS_PANGOCAIRO_MODULE:
- alignment = pango.ALIGN_CENTER
- else:
- alignment = None
-
- text_ext=self.write_text(ctx,"Scale 1:%d" % self.scale,box_width=box_width,size=font_size, alignment=alignment)
- h+=text_ext[3]+2
-
- return (w,h)
-
- def render_legend(self,m, page_break=False, ctx=None, collumns=1,width=None, height=None, item_per_rule=False, attribution={}, legend_item_box_size=(0.015,0.0075)):
- """ m: map to render legend for
- ctx: A cairo context to render the legend to. If this is None (the default) then
- automatically create a context and choose the best location for the legend.
- width: Width of area available to render legend in (in m)
- page_break: move to next page if legen over flows this one
- collumns: number of collumns available in legend box
- attribution: additional text that will be rendered in gray under the layer name. keyed by layer name
- legend_item_box_size: two tuple with width and height of legend item box size in meters
-
- will return the size of the rendered block in pts
- """
-
- (w,h) = (0,0)
- if self._s:
- if ctx is None:
- ctx=cairo.Context(self._s)
- (tx,ty) = self._get_meta_info_corner((self.map_box.width(),self.map_box.height()),m)
- ctx.translate(m2pt(tx),m2pt(ty))
- width = self._pagesize[0]-2*tx
- height = self._pagesize[1]-self._margin-ty
-
- x=0
- y=0
- if width:
- cwidth = width/collumns
- w=m2pt(width)
- else:
- cwidth = None
- current_collumn = 0
-
- processed_layers = []
- for l in reversed(m.layers):
- have_layer_header = False
- added_styles={}
- layer_title = l.name
- if layer_title in processed_layers:
- continue
- processed_layers.append(layer_title)
-
- # check through the features to find which combinations of styles are active
- # for each unique combination add a legend entry
- for f in l.datasource.all_features():
- if f.num_geometries() > 0:
- active_rules = []
- rule_text = ""
- for s in l.styles:
- st = m.find_style(s)
- for r in st.rules:
- # we need to do the scale test here as well so we don't
- # add unused scale rules to the legend description
- if ((not r.filter) or r.filter.evaluate(f) == '1') and \
- r.min_scale <= m.scale_denominator() and m.scale_denominator() < r.max_scale:
- active_rules.append((s,r.name))
- if r.filter and str(r.filter) != "true":
- if len(rule_text) > 0:
- rule_text += " AND "
- if r.name:
- rule_text += r.name
- else:
- rule_text += str(r.filter)
- active_rules = tuple(active_rules)
- if added_styles.has_key(active_rules):
- continue
-
- added_styles[active_rules] = (f,rule_text)
- if not item_per_rule:
- break
- else:
- added_styles[l] = (None,None)
-
- legend_items = added_styles.keys()
- legend_items.sort()
- for li in legend_items:
- if True:
- (f,rule_text) = added_styles[li]
-
-
- legend_map_size = (int(m2pt(legend_item_box_size[0])),int(m2pt(legend_item_box_size[1])))
- lemap=Map(legend_map_size[0],legend_map_size[1],srs=m.srs)
- if m.background:
- lemap.background = m.background
- # the buffer is needed to ensure that text labels that overflow the edge of the
- # map still render for the legend
- lemap.buffer_size=1000
- for s in l.styles:
- sty=m.find_style(s)
- lestyle = Style()
- for r in sty.rules:
- for sym in r.symbols:
- try:
- sym.avoid_edges=False
- except:
- print "**** Cant set avoid edges for rule", r.name
- if r.min_scale <= m.scale_denominator() and m.scale_denominator() < r.max_scale:
- lerule = r
- lerule.min_scale = 0
- lerule.max_scale = float("inf")
- lestyle.rules.append(lerule)
- lemap.append_style(s,lestyle)
-
- ds = MemoryDatasource()
- if f is None:
- ds=l.datasource
- layer_srs = l.srs
- elif f.envelope().width() == 0:
- ds.add_feature(Feature(f.id(),Geometry2d.from_wkt("POINT(0 0)"),**f.attributes))
- lemap.zoom_to_box(Box2d(-1,-1,1,1))
- layer_srs = m.srs
- else:
- ds.add_feature(f)
- layer_srs = l.srs
-
- lelayer = Layer("LegendLayer",layer_srs)
- lelayer.datasource = ds
- for s in l.styles:
- lelayer.styles.append(s)
- lemap.layers.append(lelayer)
-
- if f is None or f.envelope().width() != 0:
- lemap.zoom_all()
- lemap.zoom(1.1)
-
- item_size = legend_map_size[1]
- if not have_layer_header:
- item_size += 8
-
- if y+item_size > m2pt(height):
- current_collumn += 1
- y=0
- if current_collumn >= collumns:
- if page_break:
- self._s.show_page()
- x=0
- current_collumn = 0
- else:
- break
-
- if not have_layer_header and item_per_rule:
- ctx.move_to(x+m2pt(current_collumn*cwidth),y)
- e=self.write_text(ctx, l.name, m2pt(cwidth), 8)
- y+=e[3]+2
- have_layer_header = True
- ctx.save()
- ctx.translate(x+m2pt(current_collumn*cwidth),y)
- #extra save around map render as it sets up a clip box and doesn't clear it
- ctx.save()
- render(lemap, ctx)
- ctx.restore()
-
- ctx.rectangle(0,0,*legend_map_size)
- ctx.set_source_rgb(0.5,0.5,0.5)
- ctx.set_line_width(1)
- ctx.stroke()
- ctx.restore()
-
- ctx.move_to(x+legend_map_size[0]+m2pt(current_collumn*cwidth)+2,y)
- legend_entry_size = legend_map_size[1]
- legend_text_size = 0
- if not item_per_rule:
- rule_text = layer_title
- if rule_text:
- e=self.write_text(ctx, rule_text, m2pt(cwidth-legend_item_box_size[0]-0.005), 6)
- legend_text_size += e[3]
- ctx.rel_move_to(0,e[3])
- if attribution.has_key(layer_title):
- e=self.write_text(ctx, attribution[layer_title], m2pt(cwidth-legend_item_box_size[0]-0.005), 6, fill_color=(0.5,0.5,0.5))
- legend_text_size += e[3]
-
- if legend_text_size > legend_entry_size:
- legend_entry_size=legend_text_size
-
- y+=legend_entry_size +2
- if y > h:
- h = y
- return (w,h)
diff --git a/bindings/python/mapnik2/__init__.py b/bindings/python/mapnik2/__init__.py
deleted file mode 100644
index b208110..0000000
--- a/bindings/python/mapnik2/__init__.py
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# This file is part of Mapnik (C++/Python mapping toolkit)
-# Copyright (C) 2011 Artem Pavlenko
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or any later version.
-#
-# This program 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 this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-
-# mapnik2 module (Deprecated)
-
-import warnings
-from mapnik import *
-warnings.simplefilter("default")
-msg=""" mapnik2 module has been deprecated,
- please use 'import mapnik' """
-warnings.warn(msg, DeprecationWarning)
diff --git a/bindings/python/mapnik_color.cpp b/bindings/python/mapnik_color.cpp
deleted file mode 100644
index 067a73d..0000000
--- a/bindings/python/mapnik_color.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-#include "boost_std_shared_shim.hpp"
-
-// boost
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#pragma GCC diagnostic pop
-
-//mapnik
-#include <mapnik/color.hpp>
-
-
-using mapnik::color;
-
-struct color_pickle_suite : boost::python::pickle_suite
-{
- static boost::python::tuple
- getinitargs(const color& c)
- {
- using namespace boost::python;
- return boost::python::make_tuple(c.red(),c.green(),c.blue(),c.alpha());
- }
-};
-
-void export_color ()
-{
- using namespace boost::python;
- class_<color>("Color", init<int,int,int,int>(
- ( arg("r"), arg("g"), arg("b"), arg("a") ),
- "Creates a new color from its RGB components\n"
- "and an alpha value.\n"
- "All values between 0 and 255.\n")
- )
- .def(init<int,int,int>(
- ( arg("r"), arg("g"), arg("b") ),
- "Creates a new color from its RGB components.\n"
- "All values between 0 and 255.\n")
- )
- .def(init<std::string>(
- ( arg("color_string") ),
- "Creates a new color from its CSS string representation.\n"
- "The string may be a CSS color name (e.g. 'blue')\n"
- "or a hex color string (e.g. '#0000ff').\n")
- )
- .add_property("r",
- &color::red,
- &color::set_red,
- "Gets or sets the red component.\n"
- "The value is between 0 and 255.\n")
- .add_property("g",
- &color::green,
- &color::set_green,
- "Gets or sets the green component.\n"
- "The value is between 0 and 255.\n")
- .add_property("b",
- &color::blue,
- &color::set_blue,
- "Gets or sets the blue component.\n"
- "The value is between 0 and 255.\n")
- .add_property("a",
- &color::alpha,
- &color::set_alpha,
- "Gets or sets the alpha component.\n"
- "The value is between 0 and 255.\n")
- .def(self == self)
- .def(self != self)
- .def_pickle(color_pickle_suite())
- .def("__str__",&color::to_string)
- .def("packed",&color::rgba)
- .def("to_hex_string",&color::to_hex_string,
- "Returns the hexadecimal representation of this color.\n"
- "\n"
- "Example:\n"
- ">>> c = Color('blue')\n"
- ">>> c.to_hex_string()\n"
- "'#0000ff'\n")
- ;
-}
diff --git a/bindings/python/mapnik_coord.cpp b/bindings/python/mapnik_coord.cpp
deleted file mode 100644
index 222f5b4..0000000
--- a/bindings/python/mapnik_coord.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-#include <mapnik/config.hpp>
-#include "boost_std_shared_shim.hpp"
-
-// boost
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#pragma GCC diagnostic pop
-
-
-// mapnik
-#include <mapnik/coord.hpp>
-
-using mapnik::coord;
-
-struct coord_pickle_suite : boost::python::pickle_suite
-{
- static boost::python::tuple
- getinitargs(const coord<double,2>& c)
- {
- using namespace boost::python;
- return boost::python::make_tuple(c.x,c.y);
- }
-};
-
-void export_coord()
-{
- using namespace boost::python;
- class_<coord<double,2> >("Coord",init<double, double>(
- // class docstring is in mapnik/__init__.py, class _Coord
- (arg("x"), arg("y")),
- "Constructs a new point with the given coordinates.\n")
- )
- .def_pickle(coord_pickle_suite())
- .def_readwrite("x", &coord<double,2>::x,
- "Gets or sets the x/lon coordinate of the point.\n")
- .def_readwrite("y", &coord<double,2>::y,
- "Gets or sets the y/lat coordinate of the point.\n")
- .def(self == self) // __eq__
- .def(self + self) // __add__
- .def(self + float())
- .def(float() + self)
- .def(self - self) // __sub__
- .def(self - float())
- .def(self * float()) //__mult__
- .def(float() * self)
- .def(self / float()) // __div__
- ;
-}
diff --git a/bindings/python/mapnik_datasource.cpp b/bindings/python/mapnik_datasource.cpp
deleted file mode 100644
index df63fe0..0000000
--- a/bindings/python/mapnik_datasource.cpp
+++ /dev/null
@@ -1,213 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/noncopyable.hpp>
-#include <boost/version.hpp>
-#pragma GCC diagnostic pop
-
-// stl
-#include <vector>
-
-// mapnik
-#include <mapnik/box2d.hpp>
-#include <mapnik/datasource.hpp>
-#include <mapnik/datasource_cache.hpp>
-#include <mapnik/feature_layer_desc.hpp>
-#include <mapnik/memory_datasource.hpp>
-
-
-using mapnik::datasource;
-using mapnik::memory_datasource;
-using mapnik::layer_descriptor;
-using mapnik::attribute_descriptor;
-using mapnik::parameters;
-
-namespace
-{
-//user-friendly wrapper that uses Python dictionary
-using namespace boost::python;
-std::shared_ptr<mapnik::datasource> create_datasource(dict const& d)
-{
- mapnik::parameters params;
- boost::python::list keys=d.keys();
- for (int i=0; i < len(keys); ++i)
- {
- std::string key = extract<std::string>(keys[i]);
- object obj = d[key];
- if (PyUnicode_Check(obj.ptr()))
- {
- PyObject* temp = PyUnicode_AsUTF8String(obj.ptr());
- if (temp)
- {
-#if PY_VERSION_HEX >= 0x03000000
- char* c_str = PyBytes_AsString(temp);
-#else
- char* c_str = PyString_AsString(temp);
-#endif
- params[key] = std::string(c_str);
- Py_DecRef(temp);
- }
- continue;
- }
-
- extract<std::string> ex0(obj);
- extract<mapnik::value_integer> ex1(obj);
- extract<double> ex2(obj);
- if (ex0.check())
- {
- params[key] = ex0();
- }
- else if (ex1.check())
- {
- params[key] = ex1();
- }
- else if (ex2.check())
- {
- params[key] = ex2();
- }
- }
-
- return mapnik::datasource_cache::instance().create(params);
-}
-
-boost::python::dict describe(std::shared_ptr<mapnik::datasource> const& ds)
-{
- boost::python::dict description;
- mapnik::layer_descriptor ld = ds->get_descriptor();
- description["type"] = ds->type();
- description["name"] = ld.get_name();
- description["geometry_type"] = ds->get_geometry_type();
- description["encoding"] = ld.get_encoding();
- return description;
-}
-
-boost::python::list fields(std::shared_ptr<mapnik::datasource> const& ds)
-{
- boost::python::list flds;
- if (ds)
- {
- layer_descriptor ld = ds->get_descriptor();
- std::vector<attribute_descriptor> const& desc_ar = ld.get_descriptors();
- std::vector<attribute_descriptor>::const_iterator it = desc_ar.begin();
- std::vector<attribute_descriptor>::const_iterator end = desc_ar.end();
- for (; it != end; ++it)
- {
- flds.append(it->get_name());
- }
- }
- return flds;
-}
-boost::python::list field_types(std::shared_ptr<mapnik::datasource> const& ds)
-{
- boost::python::list fld_types;
- if (ds)
- {
- layer_descriptor ld = ds->get_descriptor();
- std::vector<attribute_descriptor> const& desc_ar = ld.get_descriptors();
- std::vector<attribute_descriptor>::const_iterator it = desc_ar.begin();
- std::vector<attribute_descriptor>::const_iterator end = desc_ar.end();
- for (; it != end; ++it)
- {
- unsigned type = it->get_type();
- if (type == mapnik::Integer)
- // this crashes, so send back strings instead
- //fld_types.append(boost::python::object(boost::python::handle<>(&PyInt_Type)));
- fld_types.append(boost::python::str("int"));
- else if (type == mapnik::Float)
- fld_types.append(boost::python::str("float"));
- else if (type == mapnik::Double)
- fld_types.append(boost::python::str("float"));
- else if (type == mapnik::String)
- fld_types.append(boost::python::str("str"));
- else if (type == mapnik::Boolean)
- fld_types.append(boost::python::str("bool"));
- else if (type == mapnik::Geometry)
- fld_types.append(boost::python::str("geometry"));
- else if (type == mapnik::Object)
- fld_types.append(boost::python::str("object"));
- else
- fld_types.append(boost::python::str("unknown"));
- }
- }
- return fld_types;
-}}
-
-mapnik::parameters const& (mapnik::datasource::*params_const)() const = &mapnik::datasource::params;
-
-
-void export_datasource()
-{
- using namespace boost::python;
-
- enum_<mapnik::datasource::datasource_t>("DataType")
- .value("Vector",mapnik::datasource::Vector)
- .value("Raster",mapnik::datasource::Raster)
- ;
-
- enum_<mapnik::datasource::geometry_t>("DataGeometryType")
- .value("Point",mapnik::datasource::Point)
- .value("LineString",mapnik::datasource::LineString)
- .value("Polygon",mapnik::datasource::Polygon)
- .value("Collection",mapnik::datasource::Collection)
- ;
-
- class_<datasource,std::shared_ptr<datasource>,
- boost::noncopyable>("Datasource",no_init)
- .def("type",&datasource::type)
- .def("geometry_type",&datasource::get_geometry_type)
- .def("describe",&describe)
- .def("envelope",&datasource::envelope)
- .def("features",&datasource::features)
- .def("fields",&fields)
- .def("field_types",&field_types)
- .def("features_at_point",&datasource::features_at_point, (arg("coord"),arg("tolerance")=0))
- .def("params",make_function(params_const,return_value_policy<copy_const_reference>()),
- "The configuration parameters of the data source. "
- "These vary depending on the type of data source.")
- .def(self == self)
- ;
-
- def("CreateDatasource",&create_datasource);
-
- class_<memory_datasource,
- bases<datasource>, std::shared_ptr<memory_datasource>,
- boost::noncopyable>("MemoryDatasourceBase", init<parameters>())
- .def("add_feature",&memory_datasource::push,
- "Adds a Feature:\n"
- ">>> ms = MemoryDatasource()\n"
- ">>> feature = Feature(1)\n"
- ">>> ms.add_feature(Feature(1))\n")
- .def("num_features",&memory_datasource::size)
- ;
-
- implicitly_convertible<std::shared_ptr<memory_datasource>,std::shared_ptr<datasource> >();
-}
diff --git a/bindings/python/mapnik_datasource_cache.cpp b/bindings/python/mapnik_datasource_cache.cpp
deleted file mode 100644
index d33ece8..0000000
--- a/bindings/python/mapnik_datasource_cache.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-#include <boost/python.hpp>
-#include <boost/noncopyable.hpp>
-#pragma GCC diagnostic pop
-
-#include <mapnik/value_types.hpp>
-#include <mapnik/params.hpp>
-#include <mapnik/datasource.hpp>
-#include <mapnik/datasource_cache.hpp>
-
-namespace {
-
-using namespace boost::python;
-
-std::shared_ptr<mapnik::datasource> create_datasource(const dict& d)
-{
- mapnik::parameters params;
- boost::python::list keys=d.keys();
- for (int i=0; i<len(keys); ++i)
- {
- std::string key = extract<std::string>(keys[i]);
- object obj = d[key];
- extract<std::string> ex0(obj);
- extract<mapnik::value_integer> ex1(obj);
- extract<double> ex2(obj);
-
- if (ex0.check())
- {
- params[key] = ex0();
- }
- else if (ex1.check())
- {
- params[key] = ex1();
- }
- else if (ex2.check())
- {
- params[key] = ex2();
- }
- }
-
- return mapnik::datasource_cache::instance().create(params);
-}
-
-void register_datasources(std::string const& path)
-{
- mapnik::datasource_cache::instance().register_datasources(path);
-}
-
-std::vector<std::string> plugin_names()
-{
- return mapnik::datasource_cache::instance().plugin_names();
-}
-
-std::string plugin_directories()
-{
- return mapnik::datasource_cache::instance().plugin_directories();
-}
-
-}
-
-void export_datasource_cache()
-{
- using mapnik::datasource_cache;
- class_<datasource_cache,
- boost::noncopyable>("DatasourceCache",no_init)
- .def("create",&create_datasource)
- .staticmethod("create")
- .def("register_datasources",®ister_datasources)
- .staticmethod("register_datasources")
- .def("plugin_names",&plugin_names)
- .staticmethod("plugin_names")
- .def("plugin_directories",&plugin_directories)
- .staticmethod("plugin_directories")
- ;
-}
diff --git a/bindings/python/mapnik_enumeration.hpp b/bindings/python/mapnik_enumeration.hpp
deleted file mode 100644
index 33da826..0000000
--- a/bindings/python/mapnik_enumeration.hpp
+++ /dev/null
@@ -1,88 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-#ifndef MAPNIK_PYTHON_BINDING_ENUMERATION_INCLUDED
-#define MAPNIK_PYTHON_BINDING_ENUMERATION_INCLUDED
-
-#include <boost/python/converter/registered.hpp> // for registered
-#include <boost/python/enum.hpp> // for enum_
-#include <boost/python/implicit.hpp> // for implicitly_convertible
-#include <boost/python/to_python_converter.hpp>
-
-namespace mapnik {
-
-template <typename EnumWrapper>
-class enumeration_ :
- public boost::python::enum_<typename EnumWrapper::native_type>
-{
- // some short cuts
- using base_type = boost::python::enum_<typename EnumWrapper::native_type>;
- using native_type = typename EnumWrapper::native_type;
-public:
- enumeration_() :
- base_type( EnumWrapper::get_name().c_str() )
- {
- init();
- }
- enumeration_(const char * python_alias) :
- base_type( python_alias )
- {
- init();
- }
- enumeration_(const char * python_alias, const char * doc) :
- base_type( python_alias, doc )
- {
- init();
- }
-
-private:
- struct converter
- {
- static PyObject* convert(EnumWrapper const& v)
- {
- // Redirect conversion to a static method of our base class's
- // base class. A free template converter will not work because
- // the base_type::base typedef is protected.
- // Lets hope MSVC agrees that this is legal C++
- using namespace boost::python::converter;
- return base_type::base::to_python(
- registered<native_type>::converters.m_class_object
- , static_cast<long>( v ));
-
- }
- };
-
- void init() {
- boost::python::implicitly_convertible<native_type, EnumWrapper>();
- boost::python::to_python_converter<EnumWrapper, converter >();
-
- for (unsigned i = 0; i < EnumWrapper::MAX; ++i)
- {
- // Register the strings already defined for this enum.
- base_type::value( EnumWrapper::get_string( i ), native_type( i ) );
- }
- }
-
-};
-
-} // end of namespace mapnik
-
-#endif // MAPNIK_PYTHON_BINDING_ENUMERATION_INCLUDED
diff --git a/bindings/python/mapnik_enumeration_wrapper_converter.hpp b/bindings/python/mapnik_enumeration_wrapper_converter.hpp
deleted file mode 100644
index 4918d3c..0000000
--- a/bindings/python/mapnik_enumeration_wrapper_converter.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2013 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#ifndef MAPNIK_BINDINGS_PYTHON_ENUMERATION_WRAPPPER
-#define MAPNIK_BINDINGS_PYTHON_ENUMERATION_WRAPPPER
-
-// mapnik
-#include <mapnik/symbolizer.hpp>
-
-// boost
-#include <boost/python.hpp>
-
-
-namespace boost { namespace python {
-
- struct mapnik_enumeration_wrapper_to_python
- {
- static PyObject* convert(mapnik::enumeration_wrapper const& v)
- {
- return ::PyLong_FromLongLong(v.value); // FIXME: this is a temp hack!!
- }
- };
-
-}}
-
-#endif // MAPNIK_BINDINGS_PYTHON_ENUMERATION_WRAPPPER
diff --git a/bindings/python/mapnik_envelope.cpp b/bindings/python/mapnik_envelope.cpp
deleted file mode 100644
index 04f1851..0000000
--- a/bindings/python/mapnik_envelope.cpp
+++ /dev/null
@@ -1,301 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-#include <boost/python.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/box2d.hpp>
-#include <mapnik/value_error.hpp>
-
-using mapnik::coord;
-using mapnik::box2d;
-
-struct envelope_pickle_suite : boost::python::pickle_suite
-{
- static boost::python::tuple
- getinitargs(const box2d<double>& e)
- {
- using namespace boost::python;
- return boost::python::make_tuple(e.minx(),e.miny(),e.maxx(),e.maxy());
- }
-};
-
-box2d<double> from_string(std::string const& s)
-{
- box2d<double> bbox;
- bool success = bbox.from_string(s);
- if (success)
- {
- return bbox;
- }
- else
- {
- std::stringstream ss;
- ss << "Could not parse bbox from string: '" << s << "'";
- throw mapnik::value_error(ss.str());
- }
-}
-
-//define overloads here
-void (box2d<double>::*width_p1)(double) = &box2d<double>::width;
-double (box2d<double>::*width_p2)() const = &box2d<double>::width;
-
-void (box2d<double>::*height_p1)(double) = &box2d<double>::height;
-double (box2d<double>::*height_p2)() const = &box2d<double>::height;
-
-void (box2d<double>::*expand_to_include_p1)(double,double) = &box2d<double>::expand_to_include;
-void (box2d<double>::*expand_to_include_p2)(coord<double,2> const& ) = &box2d<double>::expand_to_include;
-void (box2d<double>::*expand_to_include_p3)(box2d<double> const& ) = &box2d<double>::expand_to_include;
-
-bool (box2d<double>::*contains_p1)(double,double) const = &box2d<double>::contains;
-bool (box2d<double>::*contains_p2)(coord<double,2> const&) const = &box2d<double>::contains;
-bool (box2d<double>::*contains_p3)(box2d<double> const&) const = &box2d<double>::contains;
-
-//intersects
-bool (box2d<double>::*intersects_p1)(double,double) const = &box2d<double>::intersects;
-bool (box2d<double>::*intersects_p2)(coord<double,2> const&) const = &box2d<double>::intersects;
-bool (box2d<double>::*intersects_p3)(box2d<double> const&) const = &box2d<double>::intersects;
-
-// intersect
-box2d<double> (box2d<double>::*intersect)(box2d<double> const&) const = &box2d<double>::intersect;
-
-// re_center
-void (box2d<double>::*re_center_p1)(double,double) = &box2d<double>::re_center;
-void (box2d<double>::*re_center_p2)(coord<double,2> const& ) = &box2d<double>::re_center;
-
-// clip
-void (box2d<double>::*clip)(box2d<double> const&) = &box2d<double>::clip;
-
-// pad
-void (box2d<double>::*pad)(double) = &box2d<double>::pad;
-
-// deepcopy
-box2d<double> box2d_deepcopy(box2d<double> & obj, boost::python::dict const&)
-{
- // FIXME::ignore memo for now
- box2d<double> result(obj);
- return result;
-}
-
-void export_envelope()
-{
- using namespace boost::python;
- class_<box2d<double> >("Box2d",
- // class docstring is in mapnik/__init__.py, class _Coord
- init<double,double,double,double>(
- (arg("minx"),arg("miny"),arg("maxx"),arg("maxy")),
- "Constructs a new envelope from the coordinates\n"
- "of its lower left and upper right corner points.\n"))
- .def(init<>("Equivalent to Box2d(0, 0, -1, -1).\n"))
- .def(init<const coord<double,2>&, const coord<double,2>&>(
- (arg("ll"),arg("ur")),
- "Equivalent to Box2d(ll.x, ll.y, ur.x, ur.y).\n"))
- .def("from_string",from_string)
- .staticmethod("from_string")
- .add_property("minx", &box2d<double>::minx,
- "X coordinate for the lower left corner")
- .add_property("miny", &box2d<double>::miny,
- "Y coordinate for the lower left corner")
- .add_property("maxx", &box2d<double>::maxx,
- "X coordinate for the upper right corner")
- .add_property("maxy", &box2d<double>::maxy,
- "Y coordinate for the upper right corner")
- .def("center", &box2d<double>::center,
- "Returns the coordinates of the center of the bounding box.\n"
- "\n"
- "Example:\n"
- ">>> e = Box2d(0, 0, 100, 100)\n"
- ">>> e.center()\n"
- "Coord(50, 50)\n")
- .def("center", re_center_p1,
- (arg("x"), arg("y")),
- "Moves the envelope so that the given coordinates become its new center.\n"
- "The width and the height are preserved.\n"
- "\n "
- "Example:\n"
- ">>> e = Box2d(0, 0, 100, 100)\n"
- ">>> e.center(60, 60)\n"
- ">>> e.center()\n"
- "Coord(60.0,60.0)\n"
- ">>> (e.width(), e.height())\n"
- "(100.0, 100.0)\n"
- ">>> e\n"
- "Box2d(10.0, 10.0, 110.0, 110.0)\n"
- )
- .def("center", re_center_p2,
- (arg("Coord")),
- "Moves the envelope so that the given coordinates become its new center.\n"
- "The width and the height are preserved.\n"
- "\n "
- "Example:\n"
- ">>> e = Box2d(0, 0, 100, 100)\n"
- ">>> e.center(Coord60, 60)\n"
- ">>> e.center()\n"
- "Coord(60.0,60.0)\n"
- ">>> (e.width(), e.height())\n"
- "(100.0, 100.0)\n"
- ">>> e\n"
- "Box2d(10.0, 10.0, 110.0, 110.0)\n"
- )
- .def("clip", clip,
- (arg("other")),
- "Clip the envelope based on the bounds of another envelope.\n"
- "\n "
- "Example:\n"
- ">>> e = Box2d(0, 0, 100, 100)\n"
- ">>> c = Box2d(-50, -50, 50, 50)\n"
- ">>> e.clip(c)\n"
- ">>> e\n"
- "Box2d(0.0,0.0,50.0,50.0\n"
- )
- .def("pad", pad,
- (arg("padding")),
- "Pad the envelope based on a padding value.\n"
- "\n "
- "Example:\n"
- ">>> e = Box2d(0, 0, 100, 100)\n"
- ">>> e.pad(10)\n"
- ">>> e\n"
- "Box2d(-10.0,-10.0,110.0,110.0\n"
- )
- .def("width", width_p1,
- (arg("new_width")),
- "Sets the width to new_width of the envelope preserving its center.\n"
- "\n "
- "Example:\n"
- ">>> e = Box2d(0, 0, 100, 100)\n"
- ">>> e.width(120)\n"
- ">>> e.center()\n"
- "Coord(50.0,50.0)\n"
- ">>> e\n"
- "Box2d(-10.0, 0.0, 110.0, 100.0)\n"
- )
- .def("width", width_p2,
- "Returns the width of this envelope.\n"
- )
- .def("height", height_p1,
- (arg("new_height")),
- "Sets the height to new_height of the envelope preserving its center.\n"
- "\n "
- "Example:\n"
- ">>> e = Box2d(0, 0, 100, 100)\n"
- ">>> e.height(120)\n"
- ">>> e.center()\n"
- "Coord(50.0,50.0)\n"
- ">>> e\n"
- "Box2d(0.0, -10.0, 100.0, 110.0)\n"
- )
- .def("height", height_p2,
- "Returns the height of this envelope.\n"
- )
- .def("expand_to_include",expand_to_include_p1,
- (arg("x"),arg("y")),
- "Expands this envelope to include the point given by x and y.\n"
- "\n"
- "Example:\n",
- ">>> e = Box2d(0, 0, 100, 100)\n"
- ">>> e.expand_to_include(110, 110)\n"
- ">>> e\n"
- "Box2d(0.0, 00.0, 110.0, 110.0)\n"
- )
- .def("expand_to_include",expand_to_include_p2,
- (arg("p")),
- "Equivalent to expand_to_include(p.x, p.y)\n"
- )
- .def("expand_to_include",expand_to_include_p3,
- (arg("other")),
- "Equivalent to:\n"
- " expand_to_include(other.minx, other.miny)\n"
- " expand_to_include(other.maxx, other.maxy)\n"
- )
- .def("contains",contains_p1,
- (arg("x"),arg("y")),
- "Returns True iff this envelope contains the point\n"
- "given by x and y.\n"
- )
- .def("contains",contains_p2,
- (arg("p")),
- "Equivalent to contains(p.x, p.y)\n"
- )
- .def("contains",contains_p3,
- (arg("other")),
- "Equivalent to:\n"
- " contains(other.minx, other.miny) and contains(other.maxx, other.maxy)\n"
- )
- .def("intersects",intersects_p1,
- (arg("x"),arg("y")),
- "Returns True iff this envelope intersects the point\n"
- "given by x and y.\n"
- "\n"
- "Note: For points, intersection is equivalent\n"
- "to containment, i.e. the following holds:\n"
- " e.contains(x, y) == e.intersects(x, y)\n"
- )
- .def("intersects",intersects_p2,
- (arg("p")),
- "Equivalent to contains(p.x, p.y)\n")
- .def("intersects",intersects_p3,
- (arg("other")),
- "Returns True iff this envelope intersects the other envelope,\n"
- "This relationship is symmetric."
- "\n"
- "Example:\n"
- ">>> e1 = Box2d(0, 0, 100, 100)\n"
- ">>> e2 = Box2d(50, 50, 150, 150)\n"
- ">>> e1.intersects(e2)\n"
- "True\n"
- ">>> e1.contains(e2)\n"
- "False\n"
- )
- .def("intersect",intersect,
- (arg("other")),
- "Returns the overlap of this envelope and the other envelope\n"
- "as a new envelope.\n"
- "\n"
- "Example:\n"
- ">>> e1 = Box2d(0, 0, 100, 100)\n"
- ">>> e2 = Box2d(50, 50, 150, 150)\n"
- ">>> e1.intersect(e2)\n"
- "Box2d(50.0, 50.0, 100.0, 100.0)\n"
- )
- .def(self == self) // __eq__
- .def(self != self) // __neq__
- .def(self + self) // __add__
- .def(self * float()) // __mult__
- .def(float() * self)
- .def(self / float()) // __div__
- .def("__getitem__",&box2d<double>::operator[])
- .def("valid",&box2d<double>::valid)
- .def_pickle(envelope_pickle_suite())
- .def("__deepcopy__", &box2d_deepcopy)
- ;
-
-}
diff --git a/bindings/python/mapnik_expression.cpp b/bindings/python/mapnik_expression.cpp
deleted file mode 100644
index 75f3527..0000000
--- a/bindings/python/mapnik_expression.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-#include "python_to_value.hpp"
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/noncopyable.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/util/variant.hpp>
-#include <mapnik/feature.hpp>
-#include <mapnik/expression.hpp>
-#include <mapnik/expression_string.hpp>
-#include <mapnik/expression_evaluator.hpp>
-#include <mapnik/parse_path.hpp>
-#include <mapnik/value.hpp>
-
-using mapnik::expression_ptr;
-using mapnik::parse_expression;
-using mapnik::to_expression_string;
-using mapnik::path_expression_ptr;
-
-
-// expression
-expression_ptr parse_expression_(std::string const& wkt)
-{
- return parse_expression(wkt);
-}
-
-std::string expression_to_string_(mapnik::expr_node const& expr)
-{
- return mapnik::to_expression_string(expr);
-}
-
-mapnik::value expression_evaluate_(mapnik::expr_node const& expr, mapnik::feature_impl const& f, boost::python::dict const& d)
-{
- // will be auto-converted to proper python type by `mapnik_value_to_python`
- return mapnik::util::apply_visitor(mapnik::evaluate<mapnik::feature_impl,mapnik::value,mapnik::attributes>(f,mapnik::dict2attr(d)),expr);
-}
-
-bool expression_evaluate_to_bool_(mapnik::expr_node const& expr, mapnik::feature_impl const& f, boost::python::dict const& d)
-{
- return mapnik::util::apply_visitor(mapnik::evaluate<mapnik::feature_impl,mapnik::value,mapnik::attributes>(f,mapnik::dict2attr(d)),expr).to_bool();
-}
-
-// path expression
-path_expression_ptr parse_path_(std::string const& path)
-{
- return mapnik::parse_path(path);
-}
-
-std::string path_to_string_(mapnik::path_expression const& expr)
-{
- return mapnik::path_processor_type::to_string(expr);
-}
-
-std::string path_evaluate_(mapnik::path_expression const& expr, mapnik::feature_impl const& f)
-{
- return mapnik::path_processor_type::evaluate(expr, f);
-}
-
-void export_expression()
-{
- using namespace boost::python;
- class_<mapnik::expr_node ,boost::noncopyable>("Expression",
- "TODO"
- "",no_init)
- .def("evaluate", &expression_evaluate_,(arg("feature"),arg("variables")=boost::python::dict()))
- .def("to_bool", &expression_evaluate_to_bool_,(arg("feature"),arg("variables")=boost::python::dict()))
- .def("__str__",&expression_to_string_);
- ;
-
- def("Expression",&parse_expression_,(arg("expr")),"Expression string");
-
- class_<mapnik::path_expression ,boost::noncopyable>("PathExpression",
- "TODO"
- "",no_init)
- .def("evaluate", &path_evaluate_) // note: "pass" is a reserved word in Python
- .def("__str__",&path_to_string_);
- ;
-
- def("PathExpression",&parse_path_,(arg("expr")),"PathExpression string");
-}
diff --git a/bindings/python/mapnik_feature.cpp b/bindings/python/mapnik_feature.cpp
deleted file mode 100644
index bb6f3f3..0000000
--- a/bindings/python/mapnik_feature.cpp
+++ /dev/null
@@ -1,255 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/python/iterator.hpp>
-#include <boost/python/call_method.hpp>
-#include <boost/python/tuple.hpp>
-#include <boost/python/to_python_converter.hpp>
-#include <boost/noncopyable.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/value_types.hpp>
-#include <mapnik/feature.hpp>
-#include <mapnik/feature_factory.hpp>
-#include <mapnik/feature_kv_iterator.hpp>
-#include <mapnik/datasource.hpp>
-#include <mapnik/wkb.hpp>
-#include <mapnik/wkt/wkt_factory.hpp>
-#include <mapnik/json/feature_parser.hpp>
-#include <mapnik/json/feature_generator.hpp>
-
-// stl
-#include <stdexcept>
-
-namespace {
-
-using mapnik::geometry_utils;
-using mapnik::context_type;
-using mapnik::context_ptr;
-using mapnik::feature_kv_iterator;
-
-mapnik::geometry_type const& (mapnik::feature_impl::*get_geometry_by_const_ref)(std::size_t) const = &mapnik::feature_impl::get_geometry;
-mapnik::geometry_container const& (mapnik::feature_impl::*get_paths_by_const_ref)() const = &mapnik::feature_impl::paths;
-
-void feature_add_geometries_from_wkb(mapnik::feature_impl & feature, std::string wkb)
-{
- bool result = geometry_utils::from_wkb(feature.paths(), wkb.c_str(), wkb.size());
- if (!result) throw std::runtime_error("Failed to parse WKB");
-}
-
-void feature_add_geometries_from_wkt(mapnik::feature_impl & feature, std::string const& wkt)
-{
- bool result = mapnik::from_wkt(wkt, feature.paths());
- if (!result) throw std::runtime_error("Failed to parse WKT");
-}
-
-mapnik::feature_ptr from_geojson_impl(std::string const& json, mapnik::context_ptr const& ctx)
-{
- mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx,1));
- if (!mapnik::json::from_geojson(json,*feature))
- {
- throw std::runtime_error("Failed to parse geojson feature");
- }
- return feature;
-}
-
-std::string feature_to_geojson(mapnik::feature_impl const& feature)
-{
- std::string json;
- if (!mapnik::json::to_geojson(json,feature))
- {
- throw std::runtime_error("Failed to generate GeoJSON");
- }
- return json;
-}
-
-mapnik::value __getitem__(mapnik::feature_impl const& feature, std::string const& name)
-{
- return feature.get(name);
-}
-
-mapnik::value __getitem2__(mapnik::feature_impl const& feature, std::size_t index)
-{
- return feature.get(index);
-}
-
-void __setitem__(mapnik::feature_impl & feature, std::string const& name, mapnik::value const& val)
-{
- feature.put_new(name,val);
-}
-
-boost::python::dict attributes(mapnik::feature_impl const& f)
-{
- boost::python::dict attributes;
- feature_kv_iterator itr = f.begin();
- feature_kv_iterator end = f.end();
-
- for ( ;itr!=end; ++itr)
- {
- attributes[std::get<0>(*itr)] = std::get<1>(*itr);
- }
-
- return attributes;
-}
-
-} // end anonymous namespace
-
-struct unicode_string_from_python_str
-{
- unicode_string_from_python_str()
- {
- boost::python::converter::registry::push_back(
- &convertible,
- &construct,
- boost::python::type_id<mapnik::value_unicode_string>());
- }
-
- static void* convertible(PyObject* obj_ptr)
- {
- if (!(
-#if PY_VERSION_HEX >= 0x03000000
- PyBytes_Check(obj_ptr)
-#else
- PyString_Check(obj_ptr)
-#endif
- || PyUnicode_Check(obj_ptr)))
- return 0;
- return obj_ptr;
- }
-
- static void construct(
- PyObject* obj_ptr,
- boost::python::converter::rvalue_from_python_stage1_data* data)
- {
- char * value=0;
- if (PyUnicode_Check(obj_ptr)) {
- PyObject *encoded = PyUnicode_AsEncodedString(obj_ptr, "utf8", "replace");
- if (encoded) {
-#if PY_VERSION_HEX >= 0x03000000
- value = PyBytes_AsString(encoded);
-#else
- value = PyString_AsString(encoded);
-#endif
- Py_DecRef(encoded);
- }
- } else {
-#if PY_VERSION_HEX >= 0x03000000
- value = PyBytes_AsString(obj_ptr);
-#else
- value = PyString_AsString(obj_ptr);
-#endif
- }
- if (value == 0) boost::python::throw_error_already_set();
- void* storage = (
- (boost::python::converter::rvalue_from_python_storage<mapnik::value_unicode_string>*)
- data)->storage.bytes;
- new (storage) mapnik::value_unicode_string(value);
- data->convertible = storage;
- }
-};
-
-
-struct value_null_from_python
-{
- value_null_from_python()
- {
- boost::python::converter::registry::push_back(
- &convertible,
- &construct,
- boost::python::type_id<mapnik::value_null>());
- }
-
- static void* convertible(PyObject* obj_ptr)
- {
- if (obj_ptr == Py_None) return obj_ptr;
- return 0;
- }
-
- static void construct(
- PyObject* obj_ptr,
- boost::python::converter::rvalue_from_python_stage1_data* data)
- {
- if (obj_ptr != Py_None) boost::python::throw_error_already_set();
- void* storage = (
- (boost::python::converter::rvalue_from_python_storage<mapnik::value_null>*)
- data)->storage.bytes;
- new (storage) mapnik::value_null();
- data->convertible = storage;
- }
-};
-
-void export_feature()
-{
- using namespace boost::python;
-
- // Python to mapnik::value converters
- // NOTE: order matters here. For example value_null must be listed before
- // bool otherwise Py_None will be interpreted as bool (false)
- implicitly_convertible<mapnik::value_unicode_string,mapnik::value>();
- implicitly_convertible<mapnik::value_null,mapnik::value>();
- implicitly_convertible<mapnik::value_integer,mapnik::value>();
- implicitly_convertible<mapnik::value_double,mapnik::value>();
- implicitly_convertible<mapnik::value_bool,mapnik::value>();
-
- // http://misspent.wordpress.com/2009/09/27/how-to-write-boost-python-converters/
- unicode_string_from_python_str();
- value_null_from_python();
-
- class_<context_type,context_ptr,boost::noncopyable>
- ("Context",init<>("Default ctor."))
- .def("push", &context_type::push)
- ;
-
- class_<mapnik::feature_impl,std::shared_ptr<mapnik::feature_impl>,
- boost::noncopyable>("Feature",init<context_ptr,mapnik::value_integer>("Default ctor."))
- .def("id",&mapnik::feature_impl::id)
- .def("add_geometries_from_wkb", &feature_add_geometries_from_wkb)
- .def("add_geometries_from_wkt", &feature_add_geometries_from_wkt)
- .def("add_geometry", &mapnik::feature_impl::add_geometry)
- .def("num_geometries",&mapnik::feature_impl::num_geometries)
- .def("get_geometry", make_function(get_geometry_by_const_ref,return_value_policy<reference_existing_object>()))
- .def("geometries",make_function(get_paths_by_const_ref,return_value_policy<reference_existing_object>()))
- .def("envelope", &mapnik::feature_impl::envelope)
- .def("has_key", &mapnik::feature_impl::has_key)
- .add_property("attributes",&attributes)
- .def("__setitem__",&__setitem__)
- .def("__contains__",&__getitem__)
- .def("__getitem__",&__getitem__)
- .def("__getitem__",&__getitem2__)
- .def("__len__", &mapnik::feature_impl::size)
- .def("context",&mapnik::feature_impl::context)
- .def("to_geojson",&feature_to_geojson)
- .def("from_geojson",from_geojson_impl)
- .staticmethod("from_geojson")
- ;
-}
diff --git a/bindings/python/mapnik_featureset.cpp b/bindings/python/mapnik_featureset.cpp
deleted file mode 100644
index b6d0fe3..0000000
--- a/bindings/python/mapnik_featureset.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/noncopyable.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/feature.hpp>
-#include <mapnik/datasource.hpp>
-
-namespace {
-using namespace boost::python;
-
-inline list features(mapnik::featureset_ptr const& itr)
-{
- list l;
- while (true)
- {
- mapnik::feature_ptr fp = itr->next();
- if (!fp)
- {
- break;
- }
- l.append(fp);
- }
- return l;
-}
-
-inline object pass_through(object const& o) { return o; }
-
-inline mapnik::feature_ptr next(mapnik::featureset_ptr const& itr)
-{
- mapnik::feature_ptr f = itr->next();
- if (!f)
- {
- PyErr_SetString(PyExc_StopIteration, "No more features.");
- boost::python::throw_error_already_set();
- }
-
- return f;
-}
-
-}
-
-void export_featureset()
-{
- using namespace boost::python;
- class_<mapnik::Featureset,std::shared_ptr<mapnik::Featureset>,
- boost::noncopyable>("Featureset",no_init)
- .def("__iter__",pass_through)
- .def("next",next)
- .add_property("features",features,
- "The list of features.\n"
- "\n"
- "Usage:\n"
- ">>> m.query_map_point(0, 10, 10)\n"
- "<mapnik._mapnik.Featureset object at 0x1004d2938>\n"
- ">>> fs = m.query_map_point(0, 10, 10)\n"
- ">>> for f in fs.features:\n"
- ">>> print f\n"
- "<mapnik.Feature object at 0x105e64140>\n"
- )
- ;
-}
diff --git a/bindings/python/mapnik_font_engine.cpp b/bindings/python/mapnik_font_engine.cpp
deleted file mode 100644
index 0da036f..0000000
--- a/bindings/python/mapnik_font_engine.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/noncopyable.hpp>
-#pragma GCC diagnostic pop
-
-#include <mapnik/font_engine_freetype.hpp>
-#include <mapnik/utils.hpp>
-
-void export_font_engine()
-{
- using mapnik::freetype_engine;
- using mapnik::singleton;
- using mapnik::CreateStatic;
- using namespace boost::python;
- class_<singleton<freetype_engine,CreateStatic>,boost::noncopyable>("Singleton",no_init)
- .def("instance",&singleton<freetype_engine,CreateStatic>::instance,
- return_value_policy<reference_existing_object>())
- .staticmethod("instance")
- ;
-
- class_<freetype_engine,bases<singleton<freetype_engine,CreateStatic> >,
- boost::noncopyable>("FontEngine",no_init)
- .def("register_font",&freetype_engine::register_font)
- .def("register_fonts",&freetype_engine::register_fonts)
- .def("face_names",&freetype_engine::face_names)
- .staticmethod("register_font")
- .staticmethod("register_fonts")
- .staticmethod("face_names")
- ;
-}
diff --git a/bindings/python/mapnik_fontset.cpp b/bindings/python/mapnik_fontset.cpp
deleted file mode 100644
index 89668a0..0000000
--- a/bindings/python/mapnik_fontset.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2011 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#pragma GCC diagnostic pop
-
-//mapnik
-#include <mapnik/font_set.hpp>
-
-
-using mapnik::font_set;
-
-void export_fontset ()
-{
- using namespace boost::python;
- class_<font_set>("FontSet", init<std::string const&>("default fontset constructor")
- )
- .add_property("name",
- make_function(&font_set::get_name,return_value_policy<copy_const_reference>()),
- &font_set::set_name,
- "Get/Set the name of the FontSet.\n"
- )
- .def("add_face_name",&font_set::add_face_name,
- (arg("name")),
- "Add a face-name to the fontset.\n"
- "\n"
- "Example:\n"
- ">>> fs = Fontset('book-fonts')\n"
- ">>> fs.add_face_name('DejaVu Sans Book')\n")
- .add_property("names",make_function
- (&font_set::get_face_names,
- return_value_policy<reference_existing_object>()),
- "List of face names belonging to a FontSet.\n"
- )
- ;
-}
diff --git a/bindings/python/mapnik_gamma_method.cpp b/bindings/python/mapnik_gamma_method.cpp
deleted file mode 100644
index 7d82d41..0000000
--- a/bindings/python/mapnik_gamma_method.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#pragma GCC diagnostic pop
-
-#include <mapnik/symbolizer_enumerations.hpp>
-#include "mapnik_enumeration.hpp"
-
-void export_gamma_method()
-{
- using namespace boost::python;
-
- mapnik::enumeration_<mapnik::gamma_method_e>("gamma_method")
- .value("POWER", mapnik::GAMMA_POWER)
- .value("LINEAR",mapnik::GAMMA_LINEAR)
- .value("NONE", mapnik::GAMMA_NONE)
- .value("THRESHOLD", mapnik::GAMMA_THRESHOLD)
- .value("MULTIPLY", mapnik::GAMMA_MULTIPLY)
- ;
-
-}
diff --git a/bindings/python/mapnik_geometry.cpp b/bindings/python/mapnik_geometry.cpp
deleted file mode 100644
index fb0e6da..0000000
--- a/bindings/python/mapnik_geometry.cpp
+++ /dev/null
@@ -1,281 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/python/def.hpp>
-#include <boost/python/exception_translator.hpp>
-#include <boost/python/manage_new_object.hpp>
-#include <boost/python/iterator.hpp>
-#include <boost/noncopyable.hpp>
-#include <boost/version.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/geometry.hpp>
-#include <mapnik/geometry_container.hpp>
-#include <mapnik/wkt/wkt_factory.hpp> // from_wkt
-#include <mapnik/util/geometry_to_wkt.hpp>
-#include <mapnik/json/geometry_parser.hpp> // from_geojson
-#include <mapnik/util/geometry_to_geojson.hpp>
-#include <mapnik/util/geometry_to_svg.hpp>
-#include <mapnik/wkb.hpp>
-#include <mapnik/util/geometry_to_wkb.hpp>
-
-// stl
-#include <stdexcept>
-
-namespace {
-
-mapnik::geometry_type const& getitem_impl(mapnik::geometry_container & p, int key)
-{
- if (key >=0 && key < static_cast<int>(p.size()))
- return p[key];
- PyErr_SetString(PyExc_IndexError, "Index is out of range");
- throw boost::python::error_already_set();
-}
-
-void add_wkt_impl(mapnik::geometry_container& p, std::string const& wkt)
-{
- if (!mapnik::from_wkt(wkt , p))
- throw std::runtime_error("Failed to parse WKT");
-}
-
-void add_wkb_impl(mapnik::geometry_container& p, std::string const& wkb)
-{
- if (!mapnik::geometry_utils::from_wkb(p, wkb.c_str(), wkb.size()))
- throw std::runtime_error("Failed to parse WKB");
-}
-
-void add_geojson_impl(mapnik::geometry_container& paths, std::string const& json)
-{
- if (!mapnik::json::from_geojson(json, paths))
- throw std::runtime_error("Failed to parse geojson geometry");
-}
-
-std::shared_ptr<mapnik::geometry_container> from_wkt_impl(std::string const& wkt)
-{
- std::shared_ptr<mapnik::geometry_container> paths = std::make_shared<mapnik::geometry_container>();
- if (!mapnik::from_wkt(wkt, *paths))
- throw std::runtime_error("Failed to parse WKT");
- return paths;
-}
-
-std::shared_ptr<mapnik::geometry_container> from_wkb_impl(std::string const& wkb)
-{
- std::shared_ptr<mapnik::geometry_container> paths = std::make_shared<mapnik::geometry_container>();
- if (!mapnik::geometry_utils::from_wkb(*paths, wkb.c_str(), wkb.size()))
- throw std::runtime_error("Failed to parse WKB");
- return paths;
-}
-
-std::shared_ptr<mapnik::geometry_container> from_geojson_impl(std::string const& json)
-{
- std::shared_ptr<mapnik::geometry_container> paths = std::make_shared<mapnik::geometry_container>();
- if (!mapnik::json::from_geojson(json, *paths))
- throw std::runtime_error("Failed to parse geojson geometry");
- return paths;
-}
-
-mapnik::box2d<double> envelope_impl(mapnik::geometry_container & p)
-{
- mapnik::box2d<double> b;
- bool first = true;
- for (mapnik::geometry_type const& geom : p)
- {
- if (first)
- {
- b = geom.envelope();
- first=false;
- }
- else
- {
- b.expand_to_include(geom.envelope());
- }
- }
- return b;
-}
-
-}
-
-inline std::string boost_version()
-{
- std::ostringstream s;
- s << BOOST_VERSION/100000 << "." << BOOST_VERSION/100 % 1000 << "." << BOOST_VERSION % 100;
- return s.str();
-}
-
-PyObject* to_wkb(mapnik::geometry_type const& geom, mapnik::util::wkbByteOrder byte_order)
-{
- mapnik::util::wkb_buffer_ptr wkb = mapnik::util::to_wkb(geom,byte_order);
- if (wkb)
- {
- return
-#if PY_VERSION_HEX >= 0x03000000
- ::PyBytes_FromStringAndSize
-#else
- ::PyString_FromStringAndSize
-#endif
- ((const char*)wkb->buffer(),wkb->size());
- }
- else
- {
- Py_RETURN_NONE;
- }
-}
-
-PyObject* to_wkb2( mapnik::geometry_container const& p, mapnik::util::wkbByteOrder byte_order)
-{
- mapnik::util::wkb_buffer_ptr wkb = mapnik::util::to_wkb(p,byte_order);
- if (wkb)
- {
- return
-#if PY_VERSION_HEX >= 0x03000000
- ::PyBytes_FromStringAndSize
-#else
- ::PyString_FromStringAndSize
-#endif
- ((const char*)wkb->buffer(),wkb->size());
- }
- else
- {
- Py_RETURN_NONE;
- }
-}
-
-std::string to_wkt(mapnik::geometry_type const& geom)
-{
- std::string wkt;
- if (!mapnik::util::to_wkt(wkt,geom))
- {
- throw std::runtime_error("Generate WKT failed");
- }
- return wkt;
-}
-
-std::string to_wkt2(mapnik::geometry_container const& geom)
-{
- std::string wkt;
- if (!mapnik::util::to_wkt(wkt,geom))
- {
- throw std::runtime_error("Generate WKT failed");
- }
- return wkt;
-}
-
-std::string to_geojson(mapnik::geometry_type const& geom)
-{
- std::string wkt;
- if (!mapnik::util::to_geojson(wkt,geom))
- {
- throw std::runtime_error("Generate JSON failed");
- }
- return wkt;
-}
-
-std::string to_geojson2(mapnik::geometry_container const& geom)
-{
- std::string wkt;
- if (!mapnik::util::to_geojson(wkt,geom))
- {
- throw std::runtime_error("Generate JSON failed");
- }
- return wkt;
-}
-
-std::string to_svg(mapnik::geometry_type const& geom)
-{
- std::string svg;
- if (!mapnik::util::to_svg(svg,geom))
- {
- throw std::runtime_error("Generate SVG failed");
- }
- return svg;
-}
-
-/*
-// https://github.com/mapnik/mapnik/issues/1437
-std::string to_svg2( mapnik::geometry_container const& geom)
-{
- std::string svg; // Use Python String directly ?
- bool result = mapnik::util::to_svg(svg,geom);
- if (!result)
- {
- throw std::runtime_error("Generate WKT failed");
- }
- return svg;
-}*/
-
-
-void export_geometry()
-{
- using namespace boost::python;
-
- enum_<mapnik::geometry_type::types>("GeometryType")
- .value("Point",mapnik::geometry_type::types::Point)
- .value("LineString",mapnik::geometry_type::types::LineString)
- .value("Polygon",mapnik::geometry_type::types::Polygon)
- ;
-
- enum_<mapnik::util::wkbByteOrder>("wkbByteOrder")
- .value("XDR",mapnik::util::wkbXDR)
- .value("NDR",mapnik::util::wkbNDR)
- ;
-
- using mapnik::geometry_type;
- class_<mapnik::geometry_type, std::shared_ptr<mapnik::geometry_type>, boost::noncopyable>("Geometry2d",no_init)
- .def("envelope",&mapnik::geometry_type::envelope)
- // .def("__str__",&mapnik::geometry_type::to_string)
- .def("type",&mapnik::geometry_type::type)
- .def("to_wkb",&to_wkb)
- .def("to_wkt",&to_wkt)
- .def("to_geojson",&to_geojson)
- .def("to_svg",&to_svg)
- // TODO add other geometry_type methods
- ;
-
- class_<mapnik::geometry_container, std::shared_ptr<mapnik::geometry_container>, boost::noncopyable>("Path")
- .def("__getitem__", getitem_impl,return_value_policy<reference_existing_object>())
- .def("__len__", &mapnik::geometry_container::size)
- .def("envelope",envelope_impl)
- .def("add_wkt",add_wkt_impl)
- .def("add_wkb",add_wkb_impl)
- .def("add_geojson",add_geojson_impl)
- .def("to_wkt",&to_wkt2)
- //.def("to_svg",&to_svg2)
- .def("to_wkb",&to_wkb2)
- .def("from_wkt",from_wkt_impl)
- .def("from_wkb",from_wkb_impl)
- .def("from_geojson",from_geojson_impl)
- .def("to_geojson",&to_geojson2)
- .staticmethod("from_wkt")
- .staticmethod("from_wkb")
- .staticmethod("from_geojson")
- ;
-
-}
diff --git a/bindings/python/mapnik_grid.cpp b/bindings/python/mapnik_grid.cpp
deleted file mode 100644
index 2bb5f2b..0000000
--- a/bindings/python/mapnik_grid.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2011 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#if defined(GRID_RENDERER)
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/python/module.hpp>
-#include <boost/python/def.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/grid/grid.hpp>
-#include "python_grid_utils.hpp"
-
-using namespace boost::python;
-
-// help compiler see template definitions
-static dict (*encode)( mapnik::grid const&, std::string const& , bool, unsigned int) = mapnik::grid_encode;
-
-bool painted(mapnik::grid const& grid)
-{
- return grid.painted();
-}
-
-mapnik::grid::value_type get_pixel(mapnik::grid const& grid, int x, int y)
-{
- if (x < static_cast<int>(grid.width()) && y < static_cast<int>(grid.height()))
- {
- mapnik::grid::data_type const & data = grid.data();
- return data(x,y);
- }
- PyErr_SetString(PyExc_IndexError, "invalid x,y for grid dimensions");
- boost::python::throw_error_already_set();
- return 0;
-}
-
-void export_grid()
-{
- class_<mapnik::grid,std::shared_ptr<mapnik::grid> >(
- "Grid",
- "This class represents a feature hitgrid.",
- init<int,int,std::string,unsigned>(
- ( boost::python::arg("width"), boost::python::arg("height"),boost::python::arg("key")="__id__", boost::python::arg("resolution")=1 ),
- "Create a mapnik.Grid object\n"
- ))
- .def("painted",&painted)
- .def("width",&mapnik::grid::width)
- .def("height",&mapnik::grid::height)
- .def("view",&mapnik::grid::get_view)
- .def("get_pixel",&get_pixel)
- .def("clear",&mapnik::grid::clear)
- .def("encode",encode,
- ( boost::python::arg("encoding")="utf", boost::python::arg("features")=true,boost::python::arg("resolution")=4 ),
- "Encode the grid as as optimized json\n"
- )
- .add_property("key",
- make_function(&mapnik::grid::get_key,return_value_policy<copy_const_reference>()),
- &mapnik::grid::set_key,
- "Get/Set key to be used as unique indentifier for features\n"
- "The value should either be __id__ to refer to the feature.id()\n"
- "or some globally unique integer or string attribute field\n"
- )
- ;
-
-}
-
-#endif
diff --git a/bindings/python/mapnik_grid_view.cpp b/bindings/python/mapnik_grid_view.cpp
deleted file mode 100644
index 0666283..0000000
--- a/bindings/python/mapnik_grid_view.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2011 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#if defined(GRID_RENDERER)
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/python/module.hpp>
-#include <boost/python/def.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <string>
-#include <mapnik/grid/grid_view.hpp>
-#include <mapnik/grid/grid.hpp>
-#include "python_grid_utils.hpp"
-
-using namespace boost::python;
-
-// help compiler see template definitions
-static dict (*encode)( mapnik::grid_view const&, std::string const& , bool, unsigned int) = mapnik::grid_encode;
-
-void export_grid_view()
-{
- class_<mapnik::grid_view,
- std::shared_ptr<mapnik::grid_view> >("GridView",
- "This class represents a feature hitgrid subset.",no_init)
- .def("width",&mapnik::grid_view::width)
- .def("height",&mapnik::grid_view::height)
- .def("encode",encode,
- ( boost::python::arg("encoding")="utf",boost::python::arg("add_features")=true,boost::python::arg("resolution")=4 ),
- "Encode the grid as as optimized json\n"
- )
- ;
-}
-
-#endif
diff --git a/bindings/python/mapnik_image.cpp b/bindings/python/mapnik_image.cpp
deleted file mode 100644
index 0e16c7d..0000000
--- a/bindings/python/mapnik_image.cpp
+++ /dev/null
@@ -1,313 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/python/module.hpp>
-#include <boost/python/def.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/graphics.hpp>
-#include <mapnik/palette.hpp>
-#include <mapnik/image_util.hpp>
-#include <mapnik/image_reader.hpp>
-#include <mapnik/image_compositing.hpp>
-
-// cairo
-#if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
-#include <mapnik/cairo/cairo_context.hpp>
-#include <pycairo.h>
-#include <cairo.h>
-#endif
-
-using mapnik::image_32;
-using mapnik::image_reader;
-using mapnik::get_image_reader;
-using mapnik::type_from_filename;
-using mapnik::save_to_file;
-using mapnik::save_to_string;
-
-using namespace boost::python;
-
-// output 'raw' pixels
-PyObject* tostring1( image_32 const& im)
-{
- int size = im.width() * im.height() * 4;
- return
-#if PY_VERSION_HEX >= 0x03000000
- ::PyBytes_FromStringAndSize
-#else
- ::PyString_FromStringAndSize
-#endif
- ((const char*)im.raw_data(),size);
-}
-
-// encode (png,jpeg)
-PyObject* tostring2(image_32 const & im, std::string const& format)
-{
- std::string s = save_to_string(im, format);
- return
-#if PY_VERSION_HEX >= 0x03000000
- ::PyBytes_FromStringAndSize
-#else
- ::PyString_FromStringAndSize
-#endif
- (s.data(),s.size());
-}
-
-PyObject* tostring3(image_32 const & im, std::string const& format, mapnik::rgba_palette const& pal)
-{
- std::string s = save_to_string(im, format, pal);
- return
-#if PY_VERSION_HEX >= 0x03000000
- ::PyBytes_FromStringAndSize
-#else
- ::PyString_FromStringAndSize
-#endif
- (s.data(),s.size());
-}
-
-
-void save_to_file1(mapnik::image_32 const& im, std::string const& filename)
-{
- save_to_file(im,filename);
-}
-
-void save_to_file2(mapnik::image_32 const& im, std::string const& filename, std::string const& type)
-{
- save_to_file(im,filename,type);
-}
-
-void save_to_file3(mapnik::image_32 const& im, std::string const& filename, std::string const& type, mapnik::rgba_palette const& pal)
-{
- save_to_file(im,filename,type,pal);
-}
-
-bool painted(mapnik::image_32 const& im)
-{
- return im.painted();
-}
-
-bool is_solid(mapnik::image_32 const& im)
-{
- if (im.width() > 0 && im.height() > 0)
- {
- mapnik::image_data_32 const & data = im.data();
- mapnik::image_data_32::pixel_type const* first_row = data.getRow(0);
- mapnik::image_data_32::pixel_type const first_pixel = first_row[0];
- for (unsigned y = 0; y < im.height(); ++y)
- {
- mapnik::image_data_32::pixel_type const * row = data.getRow(y);
- for (unsigned x = 0; x < im.width(); ++x)
- {
- if (first_pixel != row[x])
- {
- return false;
- }
- }
- }
- }
- return true;
-}
-
-unsigned get_pixel(mapnik::image_32 const& im, int x, int y)
-{
- if (x < static_cast<int>(im.width()) && y < static_cast<int>(im.height()))
- {
- mapnik::image_data_32 const & data = im.data();
- return data(x,y);
- }
- PyErr_SetString(PyExc_IndexError, "invalid x,y for image dimensions");
- boost::python::throw_error_already_set();
- return 0;
-}
-
-void set_pixel(mapnik::image_32 & im, unsigned x, unsigned y, mapnik::color const& c)
-{
- im.setPixel(x, y, c.rgba());
-}
-
-std::shared_ptr<image_32> open_from_file(std::string const& filename)
-{
- boost::optional<std::string> type = type_from_filename(filename);
- if (type)
- {
- std::unique_ptr<image_reader> reader(get_image_reader(filename,*type));
- if (reader.get())
- {
-
- std::shared_ptr<image_32> image_ptr = std::make_shared<image_32>(reader->width(),reader->height());
- reader->read(0,0,image_ptr->data());
- return image_ptr;
- }
- throw mapnik::image_reader_exception("Failed to load: " + filename);
- }
- throw mapnik::image_reader_exception("Unsupported image format:" + filename);
-}
-
-std::shared_ptr<image_32> fromstring(std::string const& str)
-{
- std::unique_ptr<image_reader> reader(get_image_reader(str.c_str(),str.size()));
- if (reader.get())
- {
- std::shared_ptr<image_32> image_ptr = std::make_shared<image_32>(reader->width(),reader->height());
- reader->read(0,0,image_ptr->data());
- return image_ptr;
- }
- throw mapnik::image_reader_exception("Failed to load image from buffer" );
-}
-
-std::shared_ptr<image_32> frombuffer(PyObject * obj)
-{
- void const* buffer=0;
- Py_ssize_t buffer_len;
- if (PyObject_AsReadBuffer(obj, &buffer, &buffer_len) == 0)
- {
- std::unique_ptr<image_reader> reader(get_image_reader(reinterpret_cast<char const*>(buffer),buffer_len));
- if (reader.get())
- {
- std::shared_ptr<image_32> image_ptr = std::make_shared<image_32>(reader->width(),reader->height());
- reader->read(0,0,image_ptr->data());
- return image_ptr;
- }
- }
- throw mapnik::image_reader_exception("Failed to load image from buffer" );
-}
-
-
-void blend (image_32 & im, unsigned x, unsigned y, image_32 const& im2, float opacity)
-{
- im.set_rectangle_alpha2(im2.data(),x,y,opacity);
-}
-
-void composite(image_32 & dst, image_32 & src, mapnik::composite_mode_e mode, float opacity)
-{
- mapnik::composite(dst.data(),src.data(),mode,opacity,0,0,false);
-}
-
-#if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
-std::shared_ptr<image_32> from_cairo(PycairoSurface* py_surface)
-{
- mapnik::cairo_surface_ptr surface(cairo_surface_reference(py_surface->surface), mapnik::cairo_surface_closer());
- std::shared_ptr<image_32> image_ptr = std::make_shared<image_32>(surface);
- return image_ptr;
-}
-#endif
-
-void export_image()
-{
- using namespace boost::python;
- // NOTE: must match list in include/mapnik/image_compositing.hpp
- enum_<mapnik::composite_mode_e>("CompositeOp")
- .value("clear", mapnik::clear)
- .value("src", mapnik::src)
- .value("dst", mapnik::dst)
- .value("src_over", mapnik::src_over)
- .value("dst_over", mapnik::dst_over)
- .value("src_in", mapnik::src_in)
- .value("dst_in", mapnik::dst_in)
- .value("src_out", mapnik::src_out)
- .value("dst_out", mapnik::dst_out)
- .value("src_atop", mapnik::src_atop)
- .value("dst_atop", mapnik::dst_atop)
- .value("xor", mapnik::_xor)
- .value("plus", mapnik::plus)
- .value("minus", mapnik::minus)
- .value("multiply", mapnik::multiply)
- .value("screen", mapnik::screen)
- .value("overlay", mapnik::overlay)
- .value("darken", mapnik::darken)
- .value("lighten", mapnik::lighten)
- .value("color_dodge", mapnik::color_dodge)
- .value("color_burn", mapnik::color_burn)
- .value("hard_light", mapnik::hard_light)
- .value("soft_light", mapnik::soft_light)
- .value("difference", mapnik::difference)
- .value("exclusion", mapnik::exclusion)
- .value("contrast", mapnik::contrast)
- .value("invert", mapnik::invert)
- .value("grain_merge", mapnik::grain_merge)
- .value("grain_extract", mapnik::grain_extract)
- .value("hue", mapnik::hue)
- .value("saturation", mapnik::saturation)
- .value("color", mapnik::_color)
- .value("value", mapnik::_value)
- .value("linear_dodge", mapnik::linear_dodge)
- .value("linear_burn", mapnik::linear_burn)
- .value("divide", mapnik::divide)
- ;
-
- class_<image_32,std::shared_ptr<image_32> >("Image","This class represents a 32 bit RGBA image.",init<int,int>())
- .def("width",&image_32::width)
- .def("height",&image_32::height)
- .def("view",&image_32::get_view)
- .def("painted",&painted)
- .def("is_solid",&is_solid)
- .add_property("background",make_function
- (&image_32::get_background,return_value_policy<copy_const_reference>()),
- &image_32::set_background, "The background color of the image.")
- .def("set_grayscale_to_alpha",&image_32::set_grayscale_to_alpha, "Set the grayscale values to the alpha channel of the Image")
- .def("set_color_to_alpha",&image_32::set_color_to_alpha, "Set a given color to the alpha channel of the Image")
- .def("set_alpha",&image_32::set_alpha, "Set the overall alpha channel of the Image")
- .def("blend",&blend)
- .def("composite",&composite,
- ( arg("self"),
- arg("image"),
- arg("mode")=mapnik::src_over,
- arg("opacity")=1.0f
- ))
- .def("premultiplied",&image_32::premultiplied)
- .def("premultiply",&image_32::premultiply)
- .def("demultiply",&image_32::demultiply)
- .def("set_pixel",&set_pixel)
- .def("get_pixel",&get_pixel)
- .def("clear",&image_32::clear)
- //TODO(haoyu) The method name 'tostring' might be confusing since they actually return bytes in Python 3
-
- .def("tostring",&tostring1)
- .def("tostring",&tostring2)
- .def("tostring",&tostring3)
- .def("save", &save_to_file1)
- .def("save", &save_to_file2)
- .def("save", &save_to_file3)
- .def("open",open_from_file)
- .staticmethod("open")
- .def("frombuffer",&frombuffer)
- .staticmethod("frombuffer")
- .def("fromstring",&fromstring)
- .staticmethod("fromstring")
-#if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
- .def("from_cairo",&from_cairo)
- .staticmethod("from_cairo")
-#endif
- ;
-
-}
diff --git a/bindings/python/mapnik_image_view.cpp b/bindings/python/mapnik_image_view.cpp
deleted file mode 100644
index d68afa2..0000000
--- a/bindings/python/mapnik_image_view.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/python/module.hpp>
-#include <boost/python/def.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/image_data.hpp>
-#include <mapnik/image_view.hpp>
-#include <mapnik/image_util.hpp>
-#include <mapnik/palette.hpp>
-#include <mapnik/image_view.hpp>
-#include <sstream>
-
-using mapnik::image_data_32;
-using mapnik::image_view;
-using mapnik::save_to_file;
-
-// output 'raw' pixels
-PyObject* view_tostring1(image_view<image_data_32> const& view)
-{
- std::ostringstream ss(std::ios::out|std::ios::binary);
- for (unsigned i=0;i<view.height();i++)
- {
- ss.write(reinterpret_cast<const char*>(view.getRow(i)),
- view.width() * sizeof(image_view<image_data_32>::pixel_type));
- }
- return
-#if PY_VERSION_HEX >= 0x03000000
- ::PyBytes_FromStringAndSize
-#else
- ::PyString_FromStringAndSize
-#endif
- ((const char*)ss.str().c_str(),ss.str().size());
-}
-
-// encode (png,jpeg)
-PyObject* view_tostring2(image_view<image_data_32> const & view, std::string const& format)
-{
- std::string s = save_to_string(view, format);
- return
-#if PY_VERSION_HEX >= 0x03000000
- ::PyBytes_FromStringAndSize
-#else
- ::PyString_FromStringAndSize
-#endif
- (s.data(),s.size());
-}
-
-PyObject* view_tostring3(image_view<image_data_32> const & view, std::string const& format, mapnik::rgba_palette const& pal)
-{
- std::string s = save_to_string(view, format, pal);
- return
-#if PY_VERSION_HEX >= 0x03000000
- ::PyBytes_FromStringAndSize
-#else
- ::PyString_FromStringAndSize
-#endif
- (s.data(),s.size());
-}
-
-bool is_solid(image_view<image_data_32> const& view)
-{
- if (view.width() > 0 && view.height() > 0)
- {
- mapnik::image_view<image_data_32>::pixel_type const* first_row = view.getRow(0);
- mapnik::image_view<image_data_32>::pixel_type const first_pixel = first_row[0];
- for (unsigned y = 0; y < view.height(); ++y)
- {
- mapnik::image_view<image_data_32>::pixel_type const * row = view.getRow(y);
- for (unsigned x = 0; x < view.width(); ++x)
- {
- if (first_pixel != row[x])
- {
- return false;
- }
- }
- }
- }
- return true;
-}
-
-void save_view1(image_view<image_data_32> const& view,
- std::string const& filename)
-{
- save_to_file(view,filename);
-}
-
-void save_view2(image_view<image_data_32> const& view,
- std::string const& filename,
- std::string const& type)
-{
- save_to_file(view,filename,type);
-}
-
-void save_view3(image_view<image_data_32> const& view,
- std::string const& filename,
- std::string const& type,
- mapnik::rgba_palette const& pal)
-{
- save_to_file(view,filename,type,pal);
-}
-
-
-void export_image_view()
-{
- using namespace boost::python;
- class_<image_view<image_data_32> >("ImageView","A view into an image.",no_init)
- .def("width",&image_view<image_data_32>::width)
- .def("height",&image_view<image_data_32>::height)
- .def("is_solid",&is_solid)
- .def("tostring",&view_tostring1)
- .def("tostring",&view_tostring2)
- .def("tostring",&view_tostring3)
- .def("save",&save_view1)
- .def("save",&save_view2)
- .def("save",&save_view3)
- ;
-}
diff --git a/bindings/python/mapnik_label_collision_detector.cpp b/bindings/python/mapnik_label_collision_detector.cpp
deleted file mode 100644
index 762f925..0000000
--- a/bindings/python/mapnik_label_collision_detector.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2011 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/python/module.hpp>
-#include <boost/python/def.hpp>
-#pragma GCC diagnostic pop
-
-#include <mapnik/label_collision_detector.hpp>
-#include <mapnik/map.hpp>
-
-#include <list>
-
-using mapnik::label_collision_detector4;
-using mapnik::box2d;
-using mapnik::Map;
-
-namespace
-{
-
-std::shared_ptr<label_collision_detector4>
-create_label_collision_detector_from_extent(box2d<double> const &extent)
-{
- return std::make_shared<label_collision_detector4>(extent);
-}
-
-std::shared_ptr<label_collision_detector4>
-create_label_collision_detector_from_map(Map const &m)
-{
- double buffer = m.buffer_size();
- box2d<double> extent(-buffer, -buffer, m.width() + buffer, m.height() + buffer);
- return std::make_shared<label_collision_detector4>(extent);
-}
-
-boost::python::list
-make_label_boxes(std::shared_ptr<label_collision_detector4> det)
-{
- boost::python::list boxes;
-
- for (label_collision_detector4::query_iterator jtr = det->begin();
- jtr != det->end(); ++jtr)
- {
- boxes.append<box2d<double> >(jtr->box);
- }
-
- return boxes;
-}
-
-}
-
-void export_label_collision_detector()
-{
- using namespace boost::python;
-
- // for overload resolution
- void (label_collision_detector4::*insert_box)(box2d<double> const &) = &label_collision_detector4::insert;
-
- class_<label_collision_detector4, std::shared_ptr<label_collision_detector4>, boost::noncopyable>
- ("LabelCollisionDetector",
- "Object to detect collisions between labels, used in the rendering process.",
- no_init)
-
- .def("__init__", make_constructor(create_label_collision_detector_from_extent),
- "Creates an empty collision detection object with a given extent. Note "
- "that the constructor from Map objects is a sensible default and usually "
- "what you want to do.\n"
- "\n"
- "Example:\n"
- ">>> m = Map(size_x, size_y)\n"
- ">>> buf_sz = m.buffer_size\n"
- ">>> extent = mapnik.Box2d(-buf_sz, -buf_sz, m.width + buf_sz, m.height + buf_sz)\n"
- ">>> detector = mapnik.LabelCollisionDetector(extent)")
-
- .def("__init__", make_constructor(create_label_collision_detector_from_map),
- "Creates an empty collision detection object matching the given Map object. "
- "The created detector will have the same size, including the buffer, as the "
- "map object. This is usually what you want to do.\n"
- "\n"
- "Example:\n"
- ">>> m = Map(size_x, size_y)\n"
- ">>> detector = mapnik.LabelCollisionDetector(m)")
-
- .def("extent", &label_collision_detector4::extent, return_value_policy<copy_const_reference>(),
- "Returns the total extent (bounding box) of all labels inside the detector.\n"
- "\n"
- "Example:\n"
- ">>> detector.extent()\n"
- "Box2d(573.252589209,494.789179821,584.261023823,496.83610261)")
-
- .def("boxes", &make_label_boxes,
- "Returns a list of all the label boxes inside the detector.")
-
- .def("insert", insert_box,
- "Insert a 2d box into the collision detector. This can be used to ensure that "
- "some space is left clear on the map for later overdrawing, for example by "
- "non-Mapnik processes.\n"
- "\n"
- "Example:\n"
- ">>> m = Map(size_x, size_y)\n"
- ">>> detector = mapnik.LabelCollisionDetector(m)"
- ">>> detector.insert(mapnik.Box2d(196, 254, 291, 389))")
- ;
-}
diff --git a/bindings/python/mapnik_layer.cpp b/bindings/python/mapnik_layer.cpp
deleted file mode 100644
index e463afe..0000000
--- a/bindings/python/mapnik_layer.cpp
+++ /dev/null
@@ -1,388 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/layer.hpp>
-#include <mapnik/datasource.hpp>
-#include <mapnik/datasource_cache.hpp>
-
-using mapnik::layer;
-using mapnik::parameters;
-using mapnik::datasource_cache;
-
-
-struct layer_pickle_suite : boost::python::pickle_suite
-{
- static boost::python::tuple
- getinitargs(const layer& l)
- {
- return boost::python::make_tuple(l.name(),l.srs());
- }
-
- static boost::python::tuple
- getstate(const layer& l)
- {
- boost::python::list s;
- std::vector<std::string> const& style_names = l.styles();
- for (unsigned i = 0; i < style_names.size(); ++i)
- {
- s.append(style_names[i]);
- }
- return boost::python::make_tuple(l.clear_label_cache(),l.min_zoom(),l.max_zoom(),l.queryable(),l.datasource()->params(),l.cache_features(),s);
- }
-
- static void
- setstate (layer& l, boost::python::tuple state)
- {
- using namespace boost::python;
- if (len(state) != 9)
- {
- PyErr_SetObject(PyExc_ValueError,
- ("expected 9-item tuple in call to __setstate__; got %s"
- % state).ptr()
- );
- throw_error_already_set();
- }
-
- l.set_clear_label_cache(extract<bool>(state[0]));
-
- l.set_min_zoom(extract<double>(state[1]));
-
- l.set_max_zoom(extract<double>(state[2]));
-
- l.set_queryable(extract<bool>(state[3]));
-
- mapnik::parameters params = extract<parameters>(state[4]);
- l.set_datasource(datasource_cache::instance().create(params));
-
- boost::python::list s = extract<boost::python::list>(state[5]);
- for (int i=0;i<len(s);++i)
- {
- l.add_style(extract<std::string>(s[i]));
- }
-
- l.set_cache_features(extract<bool>(state[6]));
- }
-};
-
-std::vector<std::string> & (mapnik::layer::*_styles_)() = &mapnik::layer::styles;
-
-void set_maximum_extent(mapnik::layer & l, boost::optional<mapnik::box2d<double> > const& box)
-{
- if (box)
- {
- l.set_maximum_extent(*box);
- }
- else
- {
- l.reset_maximum_extent();
- }
-}
-
-void set_buffer_size(mapnik::layer & l, boost::optional<int> const& buffer_size)
-{
- if (buffer_size)
- {
- l.set_buffer_size(*buffer_size);
- }
- else
- {
- l.reset_buffer_size();
- }
-}
-
-PyObject * get_buffer_size(mapnik::layer & l)
-{
- boost::optional<int> buffer_size = l.buffer_size();
- if (buffer_size)
- {
-#if PY_VERSION_HEX >= 0x03000000
- return PyLong_FromLong(*buffer_size);
-#else
- return PyInt_FromLong(*buffer_size);
-#endif
- }
- else
- {
- Py_RETURN_NONE;
- }
-}
-
-void export_layer()
-{
- using namespace boost::python;
- class_<std::vector<std::string> >("Names")
- .def(vector_indexing_suite<std::vector<std::string>,true >())
- ;
-
- class_<layer>("Layer", "A Mapnik map layer.", init<std::string const&,optional<std::string const&> >(
- "Create a Layer with a named string and, optionally, an srs string.\n"
- "\n"
- "The srs can be either a Proj.4 epsg code ('+init=epsg:<code>') or\n"
- "of a Proj.4 literal ('+proj=<literal>').\n"
- "If no srs is specified it will default to '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Layer\n"
- ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
- ">>> lyr\n"
- "<mapnik._mapnik.Layer object at 0x6a270>\n"
- ))
-
- .def_pickle(layer_pickle_suite())
-
- .def("envelope",&layer::envelope,
- "Return the geographic envelope/bounding box."
- "\n"
- "Determined based on the layer datasource.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Layer\n"
- ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
- ">>> lyr.envelope()\n"
- "box2d(-1.0,-1.0,0.0,0.0) # default until a datasource is loaded\n"
- )
-
- .def("visible", &layer::visible,
- "Return True if this layer's data is active and visible at a given scale.\n"
- "\n"
- "Otherwise returns False.\n"
- "Accepts a scale value as an integer or float input.\n"
- "Will return False if:\n"
- "\tscale >= minzoom - 1e-6\n"
- "\tor:\n"
- "\tscale < maxzoom + 1e-6\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Layer\n"
- ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
- ">>> lyr.visible(1.0/1000000)\n"
- "True\n"
- ">>> lyr.active = False\n"
- ">>> lyr.visible(1.0/1000000)\n"
- "False\n"
- )
-
- .add_property("active",
- &layer::active,
- &layer::set_active,
- "Get/Set whether this layer is active and will be rendered (same as status property).\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Layer\n"
- ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
- ">>> lyr.active\n"
- "True # Active by default\n"
- ">>> lyr.active = False # set False to disable layer rendering\n"
- ">>> lyr.active\n"
- "False\n"
- )
-
- .add_property("status",
- &layer::active,
- &layer::set_active,
- "Get/Set whether this layer is active and will be rendered.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Layer\n"
- ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
- ">>> lyr.status\n"
- "True # Active by default\n"
- ">>> lyr.status = False # set False to disable layer rendering\n"
- ">>> lyr.status\n"
- "False\n"
- )
-
- .add_property("clear_label_cache",
- &layer::clear_label_cache,
- &layer::set_clear_label_cache,
- "Get/Set whether to clear the label collision detector cache for this layer during rendering\n"
- "\n"
- "Usage:\n"
- ">>> lyr.clear_label_cache\n"
- "False # False by default, meaning label positions from other layers will impact placement \n"
- ">>> lyr.clear_label_cache = True # set to True to clear the label collision detector cache\n"
- )
-
- .add_property("cache_features",
- &layer::cache_features,
- &layer::set_cache_features,
- "Get/Set whether features should be cached during rendering if used between multiple styles\n"
- "\n"
- "Usage:\n"
- ">>> lyr.cache_features\n"
- "False # False by default\n"
- ">>> lyr.cache_features = True # set to True to enable feature caching\n"
- )
-
- .add_property("datasource",
- &layer::datasource,
- &layer::set_datasource,
- "The datasource attached to this layer.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Layer, Datasource\n"
- ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
- ">>> lyr.datasource = Datasource(type='shape',file='world_borders')\n"
- ">>> lyr.datasource\n"
- "<mapnik.Datasource object at 0x65470>\n"
- )
-
- .add_property("buffer_size",
- &get_buffer_size,
- &set_buffer_size,
- "Get/Set the size of buffer around layer in pixels.\n"
- "\n"
- "Usage:\n"
- ">>> print(l.buffer_size)\n"
- "None # None by default\n"
- ">>> l.buffer_size = 2\n"
- ">>> l.buffer_size\n"
- "2\n"
- )
-
- .add_property("maximum_extent",make_function
- (&layer::maximum_extent,return_value_policy<copy_const_reference>()),
- &set_maximum_extent,
- "The maximum extent of the map.\n"
- "\n"
- "Usage:\n"
- ">>> m.maximum_extent = Box2d(-180,-90,180,90)\n"
- )
-
- .add_property("maxzoom",
- &layer::max_zoom,
- &layer::set_max_zoom,
- "Get/Set the maximum zoom lever of the layer.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Layer\n"
- ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
- ">>> lyr.maxzoom\n"
- "1.7976931348623157e+308 # default is the numerical maximum\n"
- ">>> lyr.maxzoom = 1.0/1000000\n"
- ">>> lyr.maxzoom\n"
- "9.9999999999999995e-07\n"
- )
-
- .add_property("minzoom",
- &layer::min_zoom,
- &layer::set_min_zoom,
- "Get/Set the minimum zoom lever of the layer.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Layer\n"
- ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
- ">>> lyr.minzoom # default is 0\n"
- "0.0\n"
- ">>> lyr.minzoom = 1.0/1000000\n"
- ">>> lyr.minzoom\n"
- "9.9999999999999995e-07\n"
- )
-
- .add_property("name",
- make_function(&layer::name, return_value_policy<copy_const_reference>()),
- &layer::set_name,
- "Get/Set the name of the layer.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Layer\n"
- ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
- ">>> lyr.name\n"
- "'My Layer'\n"
- ">>> lyr.name = 'New Name'\n"
- ">>> lyr.name\n"
- "'New Name'\n"
- )
-
- .add_property("queryable",
- &layer::queryable,
- &layer::set_queryable,
- "Get/Set whether this layer is queryable.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import layer\n"
- ">>> lyr = layer('My layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
- ">>> lyr.queryable\n"
- "False # Not queryable by default\n"
- ">>> lyr.queryable = True\n"
- ">>> lyr.queryable\n"
- "True\n"
- )
-
- .add_property("srs",
- make_function(&layer::srs,return_value_policy<copy_const_reference>()),
- &layer::set_srs,
- "Get/Set the SRS of the layer.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import layer\n"
- ">>> lyr = layer('My layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
- ">>> lyr.srs\n"
- "'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' # The default srs if not initialized with custom srs\n"
- ">>> # set to google mercator with Proj.4 literal\n"
- "... \n"
- ">>> lyr.srs = '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over'\n"
- )
-
- .add_property("group_by",
- make_function(&layer::group_by,return_value_policy<copy_const_reference>()),
- &layer::set_group_by,
- "Get/Set the optional layer group name.\n"
- "\n"
- "More details at https://github.com/mapnik/mapnik/wiki/Grouped-rendering:\n"
- )
-
- .add_property("styles",
- make_function(_styles_,return_value_policy<reference_existing_object>()),
- "The styles list attached to this layer.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import layer\n"
- ">>> lyr = layer('My layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
- ">>> lyr.styles\n"
- "<mapnik._mapnik.Names object at 0x6d3e8>\n"
- ">>> len(lyr.styles)\n"
- "0\n # no styles until you append them\n"
- "lyr.styles.append('My Style') # mapnik uses named styles for flexibility\n"
- ">>> len(lyr.styles)\n"
- "1\n"
- ">>> lyr.styles[0]\n"
- "'My Style'\n"
- )
- // comparison
- .def(self == self)
- ;
-}
diff --git a/bindings/python/mapnik_logger.cpp b/bindings/python/mapnik_logger.cpp
deleted file mode 100644
index d26c2ff..0000000
--- a/bindings/python/mapnik_logger.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/noncopyable.hpp>
-#pragma GCC diagnostic pop
-
-#include <mapnik/debug.hpp>
-#include <mapnik/utils.hpp>
-#include "mapnik_enumeration.hpp"
-
-void export_logger()
-{
- using mapnik::logger;
- using mapnik::singleton;
- using mapnik::CreateStatic;
- using namespace boost::python;
-
- class_<singleton<logger,CreateStatic>,boost::noncopyable>("Singleton",no_init)
- .def("instance",&singleton<logger,CreateStatic>::instance,
- return_value_policy<reference_existing_object>())
- .staticmethod("instance")
- ;
-
- enum_<mapnik::logger::severity_type>("severity_type")
- .value("Debug", logger::debug)
- .value("Warn", logger::warn)
- .value("Error", logger::error)
- .value("None", logger::none)
- ;
-
- class_<logger,bases<singleton<logger,CreateStatic> >,
- boost::noncopyable>("logger",no_init)
- .def("get_severity", &logger::get_severity)
- .def("set_severity", &logger::set_severity)
- .def("get_object_severity", &logger::get_object_severity)
- .def("set_object_severity", &logger::set_object_severity)
- .def("clear_object_severity", &logger::clear_object_severity)
- .def("get_format", &logger::get_format)
- .def("set_format", &logger::set_format)
- .def("str", &logger::str)
- .def("use_file", &logger::use_file)
- .def("use_console", &logger::use_console)
- .staticmethod("get_severity")
- .staticmethod("set_severity")
- .staticmethod("get_object_severity")
- .staticmethod("set_object_severity")
- .staticmethod("clear_object_severity")
- .staticmethod("get_format")
- .staticmethod("set_format")
- .staticmethod("str")
- .staticmethod("use_file")
- .staticmethod("use_console")
- ;
-}
diff --git a/bindings/python/mapnik_map.cpp b/bindings/python/mapnik_map.cpp
deleted file mode 100644
index 3363e53..0000000
--- a/bindings/python/mapnik_map.cpp
+++ /dev/null
@@ -1,543 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/noncopyable.hpp>
-#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
-#include <boost/python/iterator.hpp>
-#include <boost/iterator/transform_iterator.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/rule.hpp>
-#include <mapnik/layer.hpp>
-#include <mapnik/map.hpp>
-#include <mapnik/projection.hpp>
-#include <mapnik/view_transform.hpp>
-#include <mapnik/feature_type_style.hpp>
-#include "mapnik_enumeration.hpp"
-
-using mapnik::color;
-using mapnik::coord;
-using mapnik::box2d;
-using mapnik::layer;
-using mapnik::Map;
-
-std::vector<layer>& (Map::*layers_nonconst)() = &Map::layers;
-std::vector<layer> const& (Map::*layers_const)() const = &Map::layers;
-mapnik::parameters& (Map::*params_nonconst)() = &Map::get_extra_parameters;
-
-void insert_style(mapnik::Map & m, std::string const& name, mapnik::feature_type_style const& style)
-{
- m.insert_style(name,style);
-}
-
-void insert_fontset(mapnik::Map & m, std::string const& name, mapnik::font_set const& fontset)
-{
- m.insert_fontset(name,fontset);
-}
-
-mapnik::feature_type_style find_style(mapnik::Map const& m, std::string const& name)
-{
- boost::optional<mapnik::feature_type_style const&> style = m.find_style(name);
- if (!style)
- {
- PyErr_SetString(PyExc_KeyError, "Invalid style name");
- boost::python::throw_error_already_set();
- }
- return *style;
-}
-
-mapnik::font_set find_fontset(mapnik::Map const& m, std::string const& name)
-{
- boost::optional<mapnik::font_set const&> fontset = m.find_fontset(name);
- if (!fontset)
- {
- PyErr_SetString(PyExc_KeyError, "Invalid font_set name");
- boost::python::throw_error_already_set();
- }
- return *fontset;
-}
-
-// TODO - we likely should allow indexing by negative number from python
-// for now, protect against negative values and kindly throw
-mapnik::featureset_ptr query_point(mapnik::Map const& m, int index, double x, double y)
-{
- if (index < 0){
- PyErr_SetString(PyExc_IndexError, "Please provide a layer index >= 0");
- boost::python::throw_error_already_set();
- }
- unsigned idx = index;
- return m.query_point(idx, x, y);
-}
-
-mapnik::featureset_ptr query_map_point(mapnik::Map const& m, int index, double x, double y)
-{
- if (index < 0){
- PyErr_SetString(PyExc_IndexError, "Please provide a layer index >= 0");
- boost::python::throw_error_already_set();
- }
- unsigned idx = index;
- return m.query_map_point(idx, x, y);
-}
-
-void set_maximum_extent(mapnik::Map & m, boost::optional<mapnik::box2d<double> > const& box)
-{
- if (box)
- {
- m.set_maximum_extent(*box);
- }
- else
- {
- m.reset_maximum_extent();
- }
-}
-
-struct extract_style
-{
- using result_type = boost::python::tuple;
- result_type operator() (std::map<std::string, mapnik::feature_type_style>::value_type const& val) const
- {
- return boost::python::make_tuple(val.first,val.second);
- }
-};
-
-using style_extract_iterator = boost::transform_iterator<extract_style, Map::const_style_iterator>;
-using style_range = std::pair<style_extract_iterator,style_extract_iterator>;
-
-style_range _styles_ (mapnik::Map const& m)
-{
- return style_range(
- boost::make_transform_iterator<extract_style>(m.begin_styles(), extract_style()),
- boost::make_transform_iterator<extract_style>(m.end_styles(), extract_style()));
-}
-
-void export_map()
-{
- using namespace boost::python;
-
- // aspect ratio fix modes
- mapnik::enumeration_<mapnik::aspect_fix_mode_e>("aspect_fix_mode")
- .value("GROW_BBOX", mapnik::Map::GROW_BBOX)
- .value("GROW_CANVAS",mapnik::Map::GROW_CANVAS)
- .value("SHRINK_BBOX",mapnik::Map::SHRINK_BBOX)
- .value("SHRINK_CANVAS",mapnik::Map::SHRINK_CANVAS)
- .value("ADJUST_BBOX_WIDTH",mapnik::Map::ADJUST_BBOX_WIDTH)
- .value("ADJUST_BBOX_HEIGHT",mapnik::Map::ADJUST_BBOX_HEIGHT)
- .value("ADJUST_CANVAS_WIDTH",mapnik::Map::ADJUST_CANVAS_WIDTH)
- .value("ADJUST_CANVAS_HEIGHT", mapnik::Map::ADJUST_CANVAS_HEIGHT)
- .value("RESPECT", mapnik::Map::RESPECT)
- ;
-
- class_<std::vector<layer> >("Layers")
- .def(vector_indexing_suite<std::vector<layer> >())
- ;
-
- class_<style_range>("StyleRange")
- .def("__iter__",
- boost::python::range(&style_range::first, &style_range::second))
- ;
-
- class_<Map>("Map","The map object.",init<int,int,optional<std::string const&> >(
- ( arg("width"),arg("height"),arg("srs") ),
- "Create a Map with a width and height as integers and, optionally,\n"
- "an srs string either with a Proj.4 epsg code ('+init=epsg:<code>')\n"
- "or with a Proj.4 literal ('+proj=<literal>').\n"
- "If no srs is specified the map will default to '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Map\n"
- ">>> m = Map(600,400)\n"
- ">>> m\n"
- "<mapnik._mapnik.Map object at 0x6a240>\n"
- ">>> m.srs\n"
- "'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'\n"
- ))
-
- .def("append_style",insert_style,
- (arg("style_name"),arg("style_object")),
- "Insert a Mapnik Style onto the map by appending it.\n"
- "\n"
- "Usage:\n"
- ">>> sty\n"
- "<mapnik._mapnik.Style object at 0x6a330>\n"
- ">>> m.append_style('Style Name', sty)\n"
- "True # style object added to map by name\n"
- ">>> m.append_style('Style Name', sty)\n"
- "False # you can only append styles with unique names\n"
- )
-
- .def("append_fontset",insert_fontset,
- (arg("fontset")),
- "Add a FontSet to the map."
- )
-
- .def("buffered_envelope",
- &Map::get_buffered_extent,
- "Get the Box2d() of the Map given\n"
- "the Map.buffer_size.\n"
- "\n"
- "Usage:\n"
- ">>> m = Map(600,400)\n"
- ">>> m.envelope()\n"
- "Box2d(-1.0,-1.0,0.0,0.0)\n"
- ">>> m.buffered_envelope()\n"
- "Box2d(-1.0,-1.0,0.0,0.0)\n"
- ">>> m.buffer_size = 1\n"
- ">>> m.buffered_envelope()\n"
- "Box2d(-1.02222222222,-1.02222222222,0.0222222222222,0.0222222222222)\n"
- )
-
- .def("envelope",
- make_function(&Map::get_current_extent,
- return_value_policy<copy_const_reference>()),
- "Return the Map Box2d object\n"
- "and print the string representation\n"
- "of the current extent of the map.\n"
- "\n"
- "Usage:\n"
- ">>> m.envelope()\n"
- "Box2d(-0.185833333333,-0.96,0.189166666667,-0.71)\n"
- ">>> dir(m.envelope())\n"
- "...'center', 'contains', 'expand_to_include', 'forward',\n"
- "...'height', 'intersect', 'intersects', 'inverse', 'maxx',\n"
- "...'maxy', 'minx', 'miny', 'width'\n"
- )
-
- .def("find_fontset",find_fontset,
- (arg("name")),
- "Find a fontset by name."
- )
-
- .def("find_style",
- find_style,
- (arg("name")),
- "Query the Map for a style by name and return\n"
- "a style object if found or raise KeyError\n"
- "style if not found.\n"
- "\n"
- "Usage:\n"
- ">>> m.find_style('Style Name')\n"
- "<mapnik._mapnik.Style object at 0x654f0>\n"
- )
-
- .add_property("styles", _styles_)
-
- .def("pan",&Map::pan,
- (arg("x"),arg("y")),
- "Set the Map center at a given x,y location\n"
- "as integers in the coordinates of the pixmap or map surface.\n"
- "\n"
- "Usage:\n"
- ">>> m = Map(600,400)\n"
- ">>> m.envelope().center()\n"
- "Coord(-0.5,-0.5) # default Map center\n"
- ">>> m.pan(-1,-1)\n"
- ">>> m.envelope().center()\n"
- "Coord(0.00166666666667,-0.835)\n"
- )
-
- .def("pan_and_zoom",&Map::pan_and_zoom,
- (arg("x"),arg("y"),arg("factor")),
- "Set the Map center at a given x,y location\n"
- "and zoom factor as a float.\n"
- "\n"
- "Usage:\n"
- ">>> m = Map(600,400)\n"
- ">>> m.envelope().center()\n"
- "Coord(-0.5,-0.5) # default Map center\n"
- ">>> m.scale()\n"
- "-0.0016666666666666668\n"
- ">>> m.pan_and_zoom(-1,-1,0.25)\n"
- ">>> m.scale()\n"
- "0.00062500000000000001\n"
- )
-
- .def("query_map_point",query_map_point,
- (arg("layer_idx"),arg("pixel_x"),arg("pixel_y")),
- "Query a Map Layer (by layer index) for features \n"
- "intersecting the given x,y location in the pixel\n"
- "coordinates of the rendered map image.\n"
- "Layer index starts at 0 (first layer in map).\n"
- "Will return a Mapnik Featureset if successful\n"
- "otherwise will return None.\n"
- "\n"
- "Usage:\n"
- ">>> featureset = m.query_map_point(0,200,200)\n"
- ">>> featureset\n"
- "<mapnik._mapnik.Featureset object at 0x23b0b0>\n"
- ">>> featureset.features\n"
- ">>> [<mapnik.Feature object at 0x3995630>]\n"
- )
-
- .def("query_point",query_point,
- (arg("layer idx"),arg("x"),arg("y")),
- "Query a Map Layer (by layer index) for features \n"
- "intersecting the given x,y location in the coordinates\n"
- "of map projection.\n"
- "Layer index starts at 0 (first layer in map).\n"
- "Will return a Mapnik Featureset if successful\n"
- "otherwise will return None.\n"
- "\n"
- "Usage:\n"
- ">>> featureset = m.query_point(0,-122,48)\n"
- ">>> featureset\n"
- "<mapnik._mapnik.Featureset object at 0x23b0b0>\n"
- ">>> featureset.features\n"
- ">>> [<mapnik.Feature object at 0x3995630>]\n"
- )
-
- .def("remove_all",&Map::remove_all,
- "Remove all Mapnik Styles and layers from the Map.\n"
- "\n"
- "Usage:\n"
- ">>> m.remove_all()\n"
- )
-
- .def("remove_style",&Map::remove_style,
- (arg("style_name")),
- "Remove a Mapnik Style from the map.\n"
- "\n"
- "Usage:\n"
- ">>> m.remove_style('Style Name')\n"
- )
-
- .def("resize",&Map::resize,
- (arg("width"),arg("height")),
- "Resize a Mapnik Map.\n"
- "\n"
- "Usage:\n"
- ">>> m.resize(64,64)\n"
- )
-
- .def("scale", &Map::scale,
- "Return the Map Scale.\n"
- "Usage:\n"
- "\n"
- ">>> m.scale()\n"
- )
-
- .def("scale_denominator", &Map::scale_denominator,
- "Return the Map Scale Denominator.\n"
- "Usage:\n"
- "\n"
- ">>> m.scale_denominator()\n"
- )
-
- .def("view_transform",&Map::transform,
- "Return the map ViewTransform object\n"
- "which is used internally to convert between\n"
- "geographic coordinates and screen coordinates.\n"
- "\n"
- "Usage:\n"
- ">>> m.view_transform()\n"
- )
-
- .def("zoom",&Map::zoom,
- (arg("factor")),
- "Zoom in or out by a given factor.\n"
- "positive number larger than 1, zooms out\n"
- "positive number smaller than 1, zooms in\n"
- "\n"
- "Usage:\n"
- "\n"
- ">>> m.zoom(0.25)\n"
- )
-
- .def("zoom_all",&Map::zoom_all,
- "Set the geographical extent of the map\n"
- "to the combined extents of all active layers.\n"
- "\n"
- "Usage:\n"
- ">>> m.zoom_all()\n"
- )
-
- .def("zoom_to_box",&Map::zoom_to_box,
- (arg("Boxd2")),
- "Set the geographical extent of the map\n"
- "by specifying a Mapnik Box2d.\n"
- "\n"
- "Usage:\n"
- ">>> extext = Box2d(-180.0, -90.0, 180.0, 90.0)\n"
- ">>> m.zoom_to_box(extent)\n"
- )
-
- .add_property("parameters",make_function(params_nonconst,return_value_policy<reference_existing_object>()),"TODO")
-
- .add_property("aspect_fix_mode",
- &Map::get_aspect_fix_mode,
- &Map::set_aspect_fix_mode,
- // TODO - how to add arg info to properties?
- //(arg("aspect_fix_mode")),
- "Get/Set aspect fix mode.\n"
- "Usage:\n"
- "\n"
- ">>> m.aspect_fix_mode = aspect_fix_mode.GROW_BBOX\n"
- )
-
- .add_property("background",make_function
- (&Map::background,return_value_policy<copy_const_reference>()),
- &Map::set_background,
- "The background color of the map (same as background_color property).\n"
- "\n"
- "Usage:\n"
- ">>> m.background = Color('steelblue')\n"
- )
-
- .add_property("background_color",make_function
- (&Map::background,return_value_policy<copy_const_reference>()),
- &Map::set_background,
- "The background color of the map.\n"
- "\n"
- "Usage:\n"
- ">>> m.background_color = Color('steelblue')\n"
- )
-
- .add_property("background_image",make_function
- (&Map::background_image,return_value_policy<copy_const_reference>()),
- &Map::set_background_image,
- "The optional background image of the map.\n"
- "\n"
- "Usage:\n"
- ">>> m.background_image = '/path/to/image.png'\n"
- )
-
- .add_property("background_image_comp_op",&Map::background_image_comp_op,
- &Map::set_background_image_comp_op,
- "The background image compositing operation.\n"
- "\n"
- "Usage:\n"
- ">>> m.background_image_comp_op = mapnik.CompositeOp.src_over\n"
- )
-
- .add_property("background_image_opacity",&Map::background_image_opacity,
- &Map::set_background_image_opacity,
- "The background image opacity.\n"
- "\n"
- "Usage:\n"
- ">>> m.background_image_opacity = 1.0\n"
- )
-
- .add_property("base",
- make_function(&Map::base_path,return_value_policy<copy_const_reference>()),
- &Map::set_base_path,
- "The base path of the map where any files using relative \n"
- "paths will be interpreted as relative to.\n"
- "\n"
- "Usage:\n"
- ">>> m.base_path = '.'\n"
- )
-
- .add_property("buffer_size",
- &Map::buffer_size,
- &Map::set_buffer_size,
- "Get/Set the size of buffer around map in pixels.\n"
- "\n"
- "Usage:\n"
- ">>> m.buffer_size\n"
- "0 # zero by default\n"
- ">>> m.buffer_size = 2\n"
- ">>> m.buffer_size\n"
- "2\n"
- )
-
- .add_property("height",
- &Map::height,
- &Map::set_height,
- "Get/Set the height of the map in pixels.\n"
- "Minimum settable size is 16 pixels.\n"
- "\n"
- "Usage:\n"
- ">>> m.height\n"
- "400\n"
- ">>> m.height = 600\n"
- ">>> m.height\n"
- "600\n"
- )
-
- .add_property("layers",make_function
- (layers_nonconst,return_value_policy<reference_existing_object>()),
- "The list of map layers.\n"
- "\n"
- "Usage:\n"
- ">>> m.layers\n"
- "<mapnik._mapnik.layers object at 0x6d458>"
- ">>> m.layers[0]\n"
- "<mapnik._mapnik.layer object at 0x5fe130>\n"
- )
-
- .add_property("maximum_extent",make_function
- (&Map::maximum_extent,return_value_policy<copy_const_reference>()),
- &set_maximum_extent,
- "The maximum extent of the map.\n"
- "\n"
- "Usage:\n"
- ">>> m.maximum_extent = Box2d(-180,-90,180,90)\n"
- )
-
- .add_property("srs",
- make_function(&Map::srs,return_value_policy<copy_const_reference>()),
- &Map::set_srs,
- "Spatial reference in Proj.4 format.\n"
- "Either an epsg code or proj literal.\n"
- "For example, a proj literal:\n"
- "\t'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'\n"
- "and a proj epsg code:\n"
- "\t'+init=epsg:4326'\n"
- "\n"
- "Note: using epsg codes requires the installation of\n"
- "the Proj.4 'epsg' data file normally found in '/usr/local/share/proj'\n"
- "\n"
- "Usage:\n"
- ">>> m.srs\n"
- "'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' # The default srs if not initialized with custom srs\n"
- ">>> # set to google mercator with Proj.4 literal\n"
- "... \n"
- ">>> m.srs = '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over'\n"
- )
-
- .add_property("width",
- &Map::width,
- &Map::set_width,
- "Get/Set the width of the map in pixels.\n"
- "Minimum settable size is 16 pixels.\n"
- "\n"
- "Usage:\n"
- ">>> m.width\n"
- "600\n"
- ">>> m.width = 800\n"
- ">>> m.width\n"
- "800\n"
- )
- // comparison
- .def(self == self)
- ;
-}
diff --git a/bindings/python/mapnik_palette.cpp b/bindings/python/mapnik_palette.cpp
deleted file mode 100644
index 878ecb6..0000000
--- a/bindings/python/mapnik_palette.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2011 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/noncopyable.hpp>
-#pragma GCC diagnostic pop
-
-//mapnik
-#include <mapnik/palette.hpp>
-
-// stl
-#include <stdexcept>
-
-static std::shared_ptr<mapnik::rgba_palette> make_palette( std::string const& palette, std::string const& format )
-{
- mapnik::rgba_palette::palette_type type = mapnik::rgba_palette::PALETTE_RGBA;
- if (format == "rgb")
- type = mapnik::rgba_palette::PALETTE_RGB;
- else if (format == "act")
- type = mapnik::rgba_palette::PALETTE_ACT;
- else
- throw std::runtime_error("invalid type passed for mapnik.Palette: must be either rgba, rgb, or act");
- return std::make_shared<mapnik::rgba_palette>(palette, type);
-}
-
-void export_palette ()
-{
- using namespace boost::python;
-
- class_<mapnik::rgba_palette,
- std::shared_ptr<mapnik::rgba_palette>,
- boost::noncopyable >("Palette",no_init)
- //, init<std::string,std::string>(
- // ( arg("palette"), arg("type")),
- // "Creates a new color palette from a file\n"
- // )
- .def( "__init__", boost::python::make_constructor(make_palette))
- .def("to_string", &mapnik::rgba_palette::to_string,
- "Returns the palette as a string.\n"
- )
- ;
-}
diff --git a/bindings/python/mapnik_parameters.cpp b/bindings/python/mapnik_parameters.cpp
deleted file mode 100644
index 7074e72..0000000
--- a/bindings/python/mapnik_parameters.cpp
+++ /dev/null
@@ -1,234 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2011 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/debug.hpp>
-#include <mapnik/params.hpp>
-#include <mapnik/unicode.hpp>
-#include <mapnik/value_types.hpp>
-#include <mapnik/value.hpp>
-// stl
-#include <iterator>
-
-using mapnik::parameter;
-using mapnik::parameters;
-
-struct parameter_pickle_suite : boost::python::pickle_suite
-{
- static boost::python::tuple
- getinitargs(const parameter& p)
- {
- using namespace boost::python;
- return boost::python::make_tuple(p.first,p.second);
- }
-};
-
-struct parameters_pickle_suite : boost::python::pickle_suite
-{
- static boost::python::tuple
- getstate(const parameters& p)
- {
- using namespace boost::python;
- dict d;
- parameters::const_iterator pos=p.begin();
- while(pos!=p.end())
- {
- d[pos->first] = pos->second;
- ++pos;
- }
- return boost::python::make_tuple(d);
- }
-
- static void setstate(parameters& p, boost::python::tuple state)
- {
- using namespace boost::python;
- if (len(state) != 1)
- {
- PyErr_SetObject(PyExc_ValueError,
- ("expected 1-item tuple in call to __setstate__; got %s"
- % state).ptr()
- );
- throw_error_already_set();
- }
-
- dict d = extract<dict>(state[0]);
- boost::python::list keys = d.keys();
- for (int i=0; i<len(keys); ++i)
- {
- std::string key = extract<std::string>(keys[i]);
- object obj = d[key];
- extract<std::string> ex0(obj);
- extract<mapnik::value_integer> ex1(obj);
- extract<double> ex2(obj);
- extract<mapnik::value_unicode_string> ex3(obj);
-
- // TODO - this is never hit - we need proper python string -> std::string to get invoked here
- if (ex0.check())
- {
- p[key] = ex0();
- }
- else if (ex1.check())
- {
- p[key] = ex1();
- }
- else if (ex2.check())
- {
- p[key] = ex2();
- }
- else if (ex3.check())
- {
- std::string buffer;
- mapnik::to_utf8(ex3(),buffer);
- p[key] = buffer;
- }
- else
- {
- MAPNIK_LOG_DEBUG(bindings) << "parameters_pickle_suite: Could not unpickle key=" << key;
- }
- }
- }
-};
-
-
-mapnik::value_holder get_params_by_key1(mapnik::parameters const& p, std::string const& key)
-{
- parameters::const_iterator pos = p.find(key);
- if (pos != p.end())
- {
- // will be auto-converted to proper python type by `mapnik_params_to_python`
- return pos->second;
- }
- return mapnik::value_null();
-}
-
-mapnik::value_holder get_params_by_key2(mapnik::parameters const& p, std::string const& key)
-{
- parameters::const_iterator pos = p.find(key);
- if (pos == p.end())
- {
- PyErr_SetString(PyExc_KeyError, key.c_str());
- boost::python::throw_error_already_set();
- }
- // will be auto-converted to proper python type by `mapnik_params_to_python`
- return pos->second;
-}
-
-mapnik::parameter get_params_by_index(mapnik::parameters const& p, int index)
-{
- if (index < 0 || static_cast<unsigned>(index) > p.size())
- {
- PyErr_SetString(PyExc_IndexError, "Index is out of range");
- throw boost::python::error_already_set();
- }
-
- parameters::const_iterator itr = p.begin();
- std::advance(itr, index);
- if (itr != p.end())
- {
- return *itr;
- }
- PyErr_SetString(PyExc_IndexError, "Index is out of range");
- throw boost::python::error_already_set();
-}
-
-void add_parameter(mapnik::parameters & p, mapnik::parameter const& param)
-{
- p[param.first] = param.second;
-}
-
-mapnik::value_holder get_param(mapnik::parameter const& p, int index)
-{
- if (index == 0)
- {
- return p.first;
- }
- else if (index == 1)
- {
- return p.second;
- }
- else
- {
- PyErr_SetString(PyExc_IndexError, "Index is out of range");
- throw boost::python::error_already_set();
- }
-}
-
-std::shared_ptr<mapnik::parameter> create_parameter(mapnik::value_unicode_string const& key, mapnik::value_holder const& value)
-{
- std::string key_utf8;
- mapnik::to_utf8(key, key_utf8);
- return std::make_shared<mapnik::parameter>(key_utf8,value);
-}
-
-// needed for Python_Unicode to std::string (utf8) conversion
-
-std::shared_ptr<mapnik::parameter> create_parameter_from_string(mapnik::value_unicode_string const& key, mapnik::value_unicode_string const& ustr)
-{
- std::string key_utf8;
- std::string ustr_utf8;
- mapnik::to_utf8(key, key_utf8);
- mapnik::to_utf8(ustr,ustr_utf8);
- return std::make_shared<mapnik::parameter>(key_utf8, ustr_utf8);
-}
-
-void export_parameters()
-{
- using namespace boost::python;
- implicitly_convertible<std::string,mapnik::value_holder>();
- implicitly_convertible<mapnik::value_null,mapnik::value_holder>();
- implicitly_convertible<mapnik::value_integer,mapnik::value_holder>();
- implicitly_convertible<mapnik::value_double,mapnik::value_holder>();
-
- class_<parameter,std::shared_ptr<parameter> >("Parameter",no_init)
- .def("__init__", make_constructor(create_parameter),
- "Create a mapnik.Parameter from a pair of values, the first being a string\n"
- "and the second being either a string, and integer, or a float")
- .def("__init__", make_constructor(create_parameter_from_string),
- "Create a mapnik.Parameter from a pair of values, the first being a string\n"
- "and the second being either a string, and integer, or a float")
-
- .def_pickle(parameter_pickle_suite())
- .def("__getitem__",get_param)
- ;
-
- class_<parameters>("Parameters",init<>())
- .def_pickle(parameters_pickle_suite())
- .def("get",get_params_by_key1)
- .def("__getitem__",get_params_by_key2)
- .def("__getitem__",get_params_by_index)
- .def("__len__",¶meters::size)
- .def("append",add_parameter)
- .def("iteritems",iterator<parameters>())
- ;
-}
diff --git a/bindings/python/mapnik_proj_transform.cpp b/bindings/python/mapnik_proj_transform.cpp
deleted file mode 100644
index fa6f396..0000000
--- a/bindings/python/mapnik_proj_transform.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2009 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/noncopyable.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/proj_transform.hpp>
-#include <mapnik/projection.hpp>
-#include <mapnik/coord.hpp>
-#include <mapnik/box2d.hpp>
-
-// stl
-#include <stdexcept>
-
-
-using mapnik::proj_transform;
-using mapnik::projection;
-
-struct proj_transform_pickle_suite : boost::python::pickle_suite
-{
- static boost::python::tuple
- getinitargs(const proj_transform& p)
- {
- using namespace boost::python;
- return boost::python::make_tuple(p.source(),p.dest());
- }
-};
-
-namespace {
-
-mapnik::coord2d forward_transform_c(mapnik::proj_transform& t, mapnik::coord2d const& c)
-{
- double x = c.x;
- double y = c.y;
- double z = 0.0;
- if (!t.forward(x,y,z)) {
- std::ostringstream s;
- s << "Failed to forward project "
- << "from " << t.source().params() << " to: " << t.dest().params();
- throw std::runtime_error(s.str());
- }
- return mapnik::coord2d(x,y);
-}
-
-mapnik::coord2d backward_transform_c(mapnik::proj_transform& t, mapnik::coord2d const& c)
-{
- double x = c.x;
- double y = c.y;
- double z = 0.0;
- if (!t.backward(x,y,z)) {
- std::ostringstream s;
- s << "Failed to back project "
- << "from " << t.dest().params() << " to: " << t.source().params();
- throw std::runtime_error(s.str());
- }
- return mapnik::coord2d(x,y);
-}
-
-mapnik::box2d<double> forward_transform_env(mapnik::proj_transform& t, mapnik::box2d<double> const & box)
-{
- mapnik::box2d<double> new_box = box;
- if (!t.forward(new_box)) {
- std::ostringstream s;
- s << "Failed to forward project "
- << "from " << t.source().params() << " to: " << t.dest().params();
- throw std::runtime_error(s.str());
- }
- return new_box;
-}
-
-mapnik::box2d<double> backward_transform_env(mapnik::proj_transform& t, mapnik::box2d<double> const & box)
-{
- mapnik::box2d<double> new_box = box;
- if (!t.backward(new_box)){
- std::ostringstream s;
- s << "Failed to back project "
- << "from " << t.dest().params() << " to: " << t.source().params();
- throw std::runtime_error(s.str());
- }
- return new_box;
-}
-
-mapnik::box2d<double> forward_transform_env_p(mapnik::proj_transform& t, mapnik::box2d<double> const & box, unsigned int points)
-{
- mapnik::box2d<double> new_box = box;
- if (!t.forward(new_box,points)) {
- std::ostringstream s;
- s << "Failed to forward project "
- << "from " << t.source().params() << " to: " << t.dest().params();
- throw std::runtime_error(s.str());
- }
- return new_box;
-}
-
-mapnik::box2d<double> backward_transform_env_p(mapnik::proj_transform& t, mapnik::box2d<double> const & box, unsigned int points)
-{
- mapnik::box2d<double> new_box = box;
- if (!t.backward(new_box,points)){
- std::ostringstream s;
- s << "Failed to back project "
- << "from " << t.dest().params() << " to: " << t.source().params();
- throw std::runtime_error(s.str());
- }
- return new_box;
-}
-
-}
-
-void export_proj_transform ()
-{
- using namespace boost::python;
-
- class_<proj_transform, boost::noncopyable>("ProjTransform", init< projection const&, projection const& >())
- .def_pickle(proj_transform_pickle_suite())
- .def("forward", forward_transform_c)
- .def("backward",backward_transform_c)
- .def("forward", forward_transform_env)
- .def("backward",backward_transform_env)
- .def("forward", forward_transform_env_p)
- .def("backward",backward_transform_env_p)
- ;
-
-}
diff --git a/bindings/python/mapnik_projection.cpp b/bindings/python/mapnik_projection.cpp
deleted file mode 100644
index 38cd53b..0000000
--- a/bindings/python/mapnik_projection.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/coord.hpp>
-#include <mapnik/box2d.hpp>
-#include <mapnik/projection.hpp>
-
-using mapnik::projection;
-
-struct projection_pickle_suite : boost::python::pickle_suite
-{
- static boost::python::tuple
- getinitargs(const projection& p)
- {
- using namespace boost::python;
- return boost::python::make_tuple(p.params());
- }
-};
-
-namespace {
-mapnik::coord2d forward_pt(mapnik::coord2d const& pt,
- mapnik::projection const& prj)
-{
- double x = pt.x;
- double y = pt.y;
- prj.forward(x,y);
- return mapnik::coord2d(x,y);
-}
-
-mapnik::coord2d inverse_pt(mapnik::coord2d const& pt,
- mapnik::projection const& prj)
-{
- double x = pt.x;
- double y = pt.y;
- prj.inverse(x,y);
- return mapnik::coord2d(x,y);
-}
-
-mapnik::box2d<double> forward_env(mapnik::box2d<double> const & box,
- mapnik::projection const& prj)
-{
- double minx = box.minx();
- double miny = box.miny();
- double maxx = box.maxx();
- double maxy = box.maxy();
- prj.forward(minx,miny);
- prj.forward(maxx,maxy);
- return mapnik::box2d<double>(minx,miny,maxx,maxy);
-}
-
-mapnik::box2d<double> inverse_env(mapnik::box2d<double> const & box,
- mapnik::projection const& prj)
-{
- double minx = box.minx();
- double miny = box.miny();
- double maxx = box.maxx();
- double maxy = box.maxy();
- prj.inverse(minx,miny);
- prj.inverse(maxx,maxy);
- return mapnik::box2d<double>(minx,miny,maxx,maxy);
-}
-
-}
-
-void export_projection ()
-{
- using namespace boost::python;
-
- class_<projection>("Projection", "Represents a map projection.",init<std::string const&>(
- (arg("proj4_string")),
- "Constructs a new projection from its PROJ.4 string representation.\n"
- "\n"
- "The constructor will throw a RuntimeError in case the projection\n"
- "cannot be initialized.\n"
- )
- )
- .def_pickle(projection_pickle_suite())
- .def ("params", make_function(&projection::params,
- return_value_policy<copy_const_reference>()),
- "Returns the PROJ.4 string for this projection.\n")
- .def ("expanded",&projection::expanded,
- "normalize PROJ.4 definition by expanding +init= syntax\n")
- .add_property ("geographic", &projection::is_geographic,
- "This property is True if the projection is a geographic projection\n"
- "(i.e. it uses lon/lat coordinates)\n")
- ;
-
- def("forward_",&forward_pt);
- def("inverse_",&inverse_pt);
- def("forward_",&forward_env);
- def("inverse_",&inverse_env);
-
-}
diff --git a/bindings/python/mapnik_python.cpp b/bindings/python/mapnik_python.cpp
deleted file mode 100644
index 6907511..0000000
--- a/bindings/python/mapnik_python.cpp
+++ /dev/null
@@ -1,948 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include "python_to_value.hpp"
-#include <boost/python/args.hpp> // for keywords, arg, etc
-#include <boost/python/converter/from_python.hpp>
-#include <boost/python/def.hpp> // for def
-#include <boost/python/detail/defaults_gen.hpp>
-#include <boost/python/detail/none.hpp> // for none
-#include <boost/python/dict.hpp> // for dict
-#include <boost/python/exception_translator.hpp>
-#include <boost/python/list.hpp> // for list
-#include <boost/python/module.hpp> // for BOOST_PYTHON_MODULE
-#include <boost/python/object_core.hpp> // for get_managed_object
-#include <boost/python/register_ptr_to_python.hpp>
-#include <boost/python/to_python_converter.hpp>
-#pragma GCC diagnostic pop
-
-// stl
-#include <stdexcept>
-#include <fstream>
-
-void export_color();
-void export_coord();
-void export_layer();
-void export_parameters();
-void export_envelope();
-void export_query();
-void export_geometry();
-void export_palette();
-void export_image();
-void export_image_view();
-void export_gamma_method();
-void export_scaling_method();
-#if defined(GRID_RENDERER)
-void export_grid();
-void export_grid_view();
-#endif
-void export_map();
-void export_python();
-void export_expression();
-void export_rule();
-void export_style();
-void export_feature();
-void export_featureset();
-void export_fontset();
-void export_datasource();
-void export_datasource_cache();
-void export_symbolizer();
-void export_markers_symbolizer();
-void export_point_symbolizer();
-void export_line_symbolizer();
-void export_line_pattern_symbolizer();
-void export_polygon_symbolizer();
-void export_building_symbolizer();
-void export_polygon_pattern_symbolizer();
-void export_raster_symbolizer();
-void export_text_placement();
-void export_shield_symbolizer();
-void export_debug_symbolizer();
-void export_group_symbolizer();
-void export_font_engine();
-void export_projection();
-void export_proj_transform();
-void export_view_transform();
-void export_raster_colorizer();
-void export_label_collision_detector();
-void export_logger();
-
-#include <mapnik/version.hpp>
-#include <mapnik/map.hpp>
-#include <mapnik/datasource.hpp>
-#include <mapnik/layer.hpp>
-#include <mapnik/agg_renderer.hpp>
-#include <mapnik/graphics.hpp>
-#include <mapnik/rule.hpp>
-#include <mapnik/image_util.hpp>
-#include <mapnik/load_map.hpp>
-#include <mapnik/value_error.hpp>
-#include <mapnik/save_map.hpp>
-#include <mapnik/scale_denominator.hpp>
-#if defined(GRID_RENDERER)
-#include "python_grid_utils.hpp"
-#endif
-#include "mapnik_value_converter.hpp"
-#include "mapnik_enumeration_wrapper_converter.hpp"
-#include "mapnik_threads.hpp"
-#include "python_optional.hpp"
-#include <mapnik/marker_cache.hpp>
-#if defined(SHAPE_MEMORY_MAPPED_FILE)
-#include <mapnik/mapped_memory_cache.hpp>
-#endif
-
-#if defined(SVG_RENDERER)
-#include <mapnik/svg/output/svg_renderer.hpp>
-#endif
-
-namespace mapnik {
- class font_set;
- class layer;
- class color;
- class label_collision_detector4;
-}
-void clear_cache()
-{
- mapnik::marker_cache::instance().clear();
-#if defined(SHAPE_MEMORY_MAPPED_FILE)
- mapnik::mapped_memory_cache::instance().clear();
-#endif
-}
-
-#if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
-#include <mapnik/cairo/cairo_renderer.hpp>
-#include <boost/python/type_id.hpp>
-#include <boost/python/converter/registry.hpp>
-#include <pycairo.h>
-#include <cairo.h>
-static Pycairo_CAPI_t *Pycairo_CAPI;
-static void *extract_surface(PyObject* op)
-{
- if (PyObject_TypeCheck(op, const_cast<PyTypeObject*>(Pycairo_CAPI->Surface_Type)))
- {
- return op;
- }
- else
- {
- return 0;
- }
-}
-
-static void *extract_context(PyObject* op)
-{
- if (PyObject_TypeCheck(op, const_cast<PyTypeObject*>(Pycairo_CAPI->Context_Type)))
- {
- return op;
- }
- else
- {
- return 0;
- }
-}
-
-void register_cairo()
-{
-#if PY_MAJOR_VERSION >= 3
- Pycairo_CAPI = (Pycairo_CAPI_t*) PyCapsule_Import(const_cast<char *>("cairo.CAPI"), 0);
-#else
- Pycairo_CAPI = (Pycairo_CAPI_t*) PyCObject_Import(const_cast<char *>("cairo"), const_cast<char *>("CAPI"));
-#endif
- if (Pycairo_CAPI == nullptr) return;
-
- boost::python::converter::registry::insert(&extract_surface, boost::python::type_id<PycairoSurface>());
- boost::python::converter::registry::insert(&extract_context, boost::python::type_id<PycairoContext>());
-}
-#endif
-
-using mapnik::python_thread;
-using mapnik::python_unblock_auto_block;
-#ifdef MAPNIK_DEBUG
-bool python_thread::thread_support = true;
-#endif
-boost::thread_specific_ptr<PyThreadState> python_thread::state;
-
-void render(mapnik::Map const& map,
- mapnik::image_32& image,
- double scale_factor = 1.0,
- unsigned offset_x = 0u,
- unsigned offset_y = 0u)
-{
- python_unblock_auto_block b;
- mapnik::agg_renderer<mapnik::image_32> ren(map,image,scale_factor,offset_x, offset_y);
- ren.apply();
-}
-
-void render_with_vars(mapnik::Map const& map,
- mapnik::image_32& image,
- boost::python::dict const& d)
-{
- mapnik::attributes vars = mapnik::dict2attr(d);
- mapnik::request req(map.width(),map.height(),map.get_current_extent());
- req.set_buffer_size(map.buffer_size());
- python_unblock_auto_block b;
- mapnik::agg_renderer<mapnik::image_32> ren(map,req,vars,image,1,0,0);
- ren.apply();
-}
-
-void render_with_detector(
- mapnik::Map const& map,
- mapnik::image_32 &image,
- std::shared_ptr<mapnik::label_collision_detector4> detector,
- double scale_factor = 1.0,
- unsigned offset_x = 0u,
- unsigned offset_y = 0u)
-{
- python_unblock_auto_block b;
- mapnik::agg_renderer<mapnik::image_32> ren(map,image,detector,scale_factor,offset_x,offset_y);
- ren.apply();
-}
-
-void render_layer2(mapnik::Map const& map,
- mapnik::image_32& image,
- unsigned layer_idx,
- double scale_factor,
- unsigned offset_x,
- unsigned offset_y)
-{
- std::vector<mapnik::layer> const& layers = map.layers();
- std::size_t layer_num = layers.size();
- if (layer_idx >= layer_num) {
- std::ostringstream s;
- s << "Zero-based layer index '" << layer_idx << "' not valid, only '"
- << layer_num << "' layers are in map\n";
- throw std::runtime_error(s.str());
- }
-
- python_unblock_auto_block b;
- mapnik::layer const& layer = layers[layer_idx];
- mapnik::agg_renderer<mapnik::image_32> ren(map,image,scale_factor,offset_x,offset_y);
- std::set<std::string> names;
- ren.apply(layer,names);
-}
-
-#if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
-
-void render3(mapnik::Map const& map,
- PycairoSurface* py_surface,
- double scale_factor = 1.0,
- unsigned offset_x = 0,
- unsigned offset_y = 0)
-{
- python_unblock_auto_block b;
- mapnik::cairo_surface_ptr surface(cairo_surface_reference(py_surface->surface), mapnik::cairo_surface_closer());
- mapnik::cairo_renderer<mapnik::cairo_ptr> ren(map,mapnik::create_context(surface),scale_factor,offset_x,offset_y);
- ren.apply();
-}
-
-void render4(mapnik::Map const& map, PycairoSurface* py_surface)
-{
- python_unblock_auto_block b;
- mapnik::cairo_surface_ptr surface(cairo_surface_reference(py_surface->surface), mapnik::cairo_surface_closer());
- mapnik::cairo_renderer<mapnik::cairo_ptr> ren(map,mapnik::create_context(surface));
- ren.apply();
-}
-
-void render5(mapnik::Map const& map,
- PycairoContext* py_context,
- double scale_factor = 1.0,
- unsigned offset_x = 0,
- unsigned offset_y = 0)
-{
- python_unblock_auto_block b;
- mapnik::cairo_ptr context(cairo_reference(py_context->ctx), mapnik::cairo_closer());
- mapnik::cairo_renderer<mapnik::cairo_ptr> ren(map,context,scale_factor,offset_x, offset_y);
- ren.apply();
-}
-
-void render6(mapnik::Map const& map, PycairoContext* py_context)
-{
- python_unblock_auto_block b;
- mapnik::cairo_ptr context(cairo_reference(py_context->ctx), mapnik::cairo_closer());
- mapnik::cairo_renderer<mapnik::cairo_ptr> ren(map,context);
- ren.apply();
-}
-void render_with_detector2(
- mapnik::Map const& map,
- PycairoContext* py_context,
- std::shared_ptr<mapnik::label_collision_detector4> detector)
-{
- python_unblock_auto_block b;
- mapnik::cairo_ptr context(cairo_reference(py_context->ctx), mapnik::cairo_closer());
- mapnik::cairo_renderer<mapnik::cairo_ptr> ren(map,context,detector);
- ren.apply();
-}
-
-void render_with_detector3(
- mapnik::Map const& map,
- PycairoContext* py_context,
- std::shared_ptr<mapnik::label_collision_detector4> detector,
- double scale_factor = 1.0,
- unsigned offset_x = 0u,
- unsigned offset_y = 0u)
-{
- python_unblock_auto_block b;
- mapnik::cairo_ptr context(cairo_reference(py_context->ctx), mapnik::cairo_closer());
- mapnik::cairo_renderer<mapnik::cairo_ptr> ren(map,context,detector,scale_factor,offset_x,offset_y);
- ren.apply();
-}
-
-void render_with_detector4(
- mapnik::Map const& map,
- PycairoSurface* py_surface,
- std::shared_ptr<mapnik::label_collision_detector4> detector)
-{
- python_unblock_auto_block b;
- mapnik::cairo_surface_ptr surface(cairo_surface_reference(py_surface->surface), mapnik::cairo_surface_closer());
- mapnik::cairo_renderer<mapnik::cairo_ptr> ren(map, mapnik::create_context(surface), detector);
- ren.apply();
-}
-
-void render_with_detector5(
- mapnik::Map const& map,
- PycairoSurface* py_surface,
- std::shared_ptr<mapnik::label_collision_detector4> detector,
- double scale_factor = 1.0,
- unsigned offset_x = 0u,
- unsigned offset_y = 0u)
-{
- python_unblock_auto_block b;
- mapnik::cairo_surface_ptr surface(cairo_surface_reference(py_surface->surface), mapnik::cairo_surface_closer());
- mapnik::cairo_renderer<mapnik::cairo_ptr> ren(map, mapnik::create_context(surface), detector, scale_factor, offset_x, offset_y);
- ren.apply();
-}
-
-#endif
-
-
-void render_tile_to_file(mapnik::Map const& map,
- unsigned offset_x, unsigned offset_y,
- unsigned width, unsigned height,
- std::string const& file,
- std::string const& format)
-{
- mapnik::image_32 image(width,height);
- render(map,image,1.0,offset_x, offset_y);
- mapnik::save_to_file(image.data(),file,format);
-}
-
-void render_to_file1(mapnik::Map const& map,
- std::string const& filename,
- std::string const& format)
-{
- if (format == "svg-ng")
- {
-#if defined(SVG_RENDERER)
- std::ofstream file (filename.c_str(), std::ios::out|std::ios::trunc|std::ios::binary);
- if (!file)
- {
- throw mapnik::ImageWriterException("could not open file for writing: " + filename);
- }
- using iter_type = std::ostream_iterator<char>;
- iter_type output_stream_iterator(file);
- mapnik::svg_renderer<iter_type> ren(map,output_stream_iterator);
- ren.apply();
-#else
- throw mapnik::ImageWriterException("SVG backend not available, cannot write to format: " + format);
-#endif
- }
- else if (format == "pdf" || format == "svg" || format =="ps" || format == "ARGB32" || format == "RGB24")
- {
-#if defined(HAVE_CAIRO)
- mapnik::save_to_cairo_file(map,filename,format,1.0);
-#else
- throw mapnik::ImageWriterException("Cairo backend not available, cannot write to format: " + format);
-#endif
- }
- else
- {
- mapnik::image_32 image(map.width(),map.height());
- render(map,image,1.0,0,0);
- mapnik::save_to_file(image,filename,format);
- }
-}
-
-void render_to_file2(mapnik::Map const& map,std::string const& filename)
-{
- std::string format = mapnik::guess_type(filename);
- if (format == "pdf" || format == "svg" || format =="ps")
- {
-#if defined(HAVE_CAIRO)
- mapnik::save_to_cairo_file(map,filename,format,1.0);
-#else
- throw mapnik::ImageWriterException("Cairo backend not available, cannot write to format: " + format);
-#endif
- }
- else
- {
- mapnik::image_32 image(map.width(),map.height());
- render(map,image,1.0,0,0);
- mapnik::save_to_file(image,filename);
- }
-}
-
-void render_to_file3(mapnik::Map const& map,
- std::string const& filename,
- std::string const& format,
- double scale_factor = 1.0
- )
-{
- if (format == "svg-ng")
- {
-#if defined(SVG_RENDERER)
- std::ofstream file (filename.c_str(), std::ios::out|std::ios::trunc|std::ios::binary);
- if (!file)
- {
- throw mapnik::ImageWriterException("could not open file for writing: " + filename);
- }
- using iter_type = std::ostream_iterator<char>;
- iter_type output_stream_iterator(file);
- mapnik::svg_renderer<iter_type> ren(map,output_stream_iterator,scale_factor);
- ren.apply();
-#else
- throw mapnik::ImageWriterException("SVG backend not available, cannot write to format: " + format);
-#endif
- }
- else if (format == "pdf" || format == "svg" || format =="ps" || format == "ARGB32" || format == "RGB24")
- {
-#if defined(HAVE_CAIRO)
- mapnik::save_to_cairo_file(map,filename,format,scale_factor);
-#else
- throw mapnik::ImageWriterException("Cairo backend not available, cannot write to format: " + format);
-#endif
- }
- else
- {
- mapnik::image_32 image(map.width(),map.height());
- render(map,image,scale_factor,0,0);
- mapnik::save_to_file(image,filename,format);
- }
-}
-
-double scale_denominator(mapnik::Map const& map, bool geographic)
-{
- return mapnik::scale_denominator(map.scale(), geographic);
-}
-
-// http://docs.python.org/c-api/exceptions.html#standard-exceptions
-void value_error_translator(mapnik::value_error const & ex)
-{
- PyErr_SetString(PyExc_ValueError, ex.what());
-}
-
-void runtime_error_translator(std::runtime_error const & ex)
-{
- PyErr_SetString(PyExc_RuntimeError, ex.what());
-}
-
-void out_of_range_error_translator(std::out_of_range const & ex)
-{
- PyErr_SetString(PyExc_IndexError, ex.what());
-}
-
-void standard_error_translator(std::exception const & ex)
-{
- PyErr_SetString(PyExc_RuntimeError, ex.what());
-}
-
-unsigned mapnik_version()
-{
- return MAPNIK_VERSION;
-}
-
-std::string mapnik_version_string()
-{
- return MAPNIK_VERSION_STRING;
-}
-
-bool has_proj4()
-{
-#if defined(MAPNIK_USE_PROJ4)
- return true;
-#else
- return false;
-#endif
-}
-
-bool has_svg_renderer()
-{
-#if defined(SVG_RENDERER)
- return true;
-#else
- return false;
-#endif
-}
-
-bool has_grid_renderer()
-{
-#if defined(GRID_RENDERER)
- return true;
-#else
- return false;
-#endif
-}
-
-bool has_jpeg()
-{
-#if defined(HAVE_JPEG)
- return true;
-#else
- return false;
-#endif
-}
-
-bool has_png()
-{
-#if defined(HAVE_PNG)
- return true;
-#else
- return false;
-#endif
-}
-
-bool has_tiff()
-{
-#if defined(HAVE_TIFF)
- return true;
-#else
- return false;
-#endif
-}
-
-bool has_webp()
-{
-#if defined(HAVE_WEBP)
- return true;
-#else
- return false;
-#endif
-}
-
-// indicator for cairo rendering support inside libmapnik
-bool has_cairo()
-{
-#if defined(HAVE_CAIRO)
- return true;
-#else
- return false;
-#endif
-}
-
-// indicator for pycairo support in the python bindings
-bool has_pycairo()
-{
-#if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
-#if PY_MAJOR_VERSION >= 3
- Pycairo_CAPI = (Pycairo_CAPI_t*) PyCapsule_Import(const_cast<char *>("cairo.CAPI"), 0);
-#else
- Pycairo_CAPI = (Pycairo_CAPI_t*) PyCObject_Import(const_cast<char *>("cairo"), const_cast<char *>("CAPI"));
-#endif
- if (Pycairo_CAPI == nullptr){
- /*
- Case where pycairo support has been compiled into
- mapnik but at runtime the cairo python module
- is unable to be imported and therefore Pycairo surfaces
- and contexts cannot be passed to mapnik.render()
- */
- return false;
- }
- return true;
-#else
- return false;
-#endif
-}
-
-
-BOOST_PYTHON_FUNCTION_OVERLOADS(load_map_overloads, load_map, 2, 4)
-BOOST_PYTHON_FUNCTION_OVERLOADS(load_map_string_overloads, load_map_string, 2, 4)
-BOOST_PYTHON_FUNCTION_OVERLOADS(save_map_overloads, save_map, 2, 3)
-BOOST_PYTHON_FUNCTION_OVERLOADS(save_map_to_string_overloads, save_map_to_string, 1, 2)
-BOOST_PYTHON_FUNCTION_OVERLOADS(render_overloads, render, 2, 5)
-BOOST_PYTHON_FUNCTION_OVERLOADS(render_with_detector_overloads, render_with_detector, 3, 6)
-
-BOOST_PYTHON_MODULE(_mapnik)
-{
-
- using namespace boost::python;
-
- using mapnik::load_map;
- using mapnik::load_map_string;
- using mapnik::save_map;
- using mapnik::save_map_to_string;
-
- register_exception_translator<std::exception>(&standard_error_translator);
- register_exception_translator<std::out_of_range>(&out_of_range_error_translator);
- register_exception_translator<mapnik::value_error>(&value_error_translator);
- register_exception_translator<std::runtime_error>(&runtime_error_translator);
-#if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
- register_cairo();
-#endif
- export_query();
- export_geometry();
- export_feature();
- export_featureset();
- export_fontset();
- export_datasource();
- export_parameters();
- export_color();
- export_envelope();
- export_palette();
- export_image();
- export_image_view();
- export_gamma_method();
- export_scaling_method();
-#if defined(GRID_RENDERER)
- export_grid();
- export_grid_view();
-#endif
- export_expression();
- export_rule();
- export_style();
- export_layer();
- export_datasource_cache();
- export_symbolizer();
- export_markers_symbolizer();
- export_point_symbolizer();
- export_line_symbolizer();
- export_line_pattern_symbolizer();
- export_polygon_symbolizer();
- export_building_symbolizer();
- export_polygon_pattern_symbolizer();
- export_raster_symbolizer();
- export_text_placement();
- export_shield_symbolizer();
- export_debug_symbolizer();
- export_group_symbolizer();
- export_font_engine();
- export_projection();
- export_proj_transform();
- export_view_transform();
- export_coord();
- export_map();
- export_raster_colorizer();
- export_label_collision_detector();
- export_logger();
-
- def("clear_cache", &clear_cache,
- "\n"
- "Clear all global caches of markers and mapped memory regions.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import clear_cache\n"
- ">>> clear_cache()\n"
- );
-
- def("render_to_file",&render_to_file1,
- "\n"
- "Render Map to file using explicit image type.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Map, render_to_file, load_map\n"
- ">>> m = Map(256,256)\n"
- ">>> load_map(m,'mapfile.xml')\n"
- ">>> render_to_file(m,'image32bit.png','png')\n"
- "\n"
- "8 bit (paletted) PNG can be requested with 'png256':\n"
- ">>> render_to_file(m,'8bit_image.png','png256')\n"
- "\n"
- "JPEG quality can be controlled by adding a suffix to\n"
- "'jpeg' between 0 and 100 (default is 85):\n"
- ">>> render_to_file(m,'top_quality.jpeg','jpeg100')\n"
- ">>> render_to_file(m,'medium_quality.jpeg','jpeg50')\n"
- );
-
- def("render_to_file",&render_to_file2,
- "\n"
- "Render Map to file (type taken from file extension)\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Map, render_to_file, load_map\n"
- ">>> m = Map(256,256)\n"
- ">>> render_to_file(m,'image.jpeg')\n"
- "\n"
- );
-
- def("render_to_file",&render_to_file3,
- "\n"
- "Render Map to file using explicit image type and scale factor.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Map, render_to_file, load_map\n"
- ">>> m = Map(256,256)\n"
- ">>> scale_factor = 4\n"
- ">>> render_to_file(m,'image.jpeg',scale_factor)\n"
- "\n"
- );
-
- def("render_tile_to_file",&render_tile_to_file,
- "\n"
- "TODO\n"
- "\n"
- );
-
- def("render_with_vars",&render_with_vars);
-
- def("render", &render, render_overloads(
- "\n"
- "Render Map to an AGG image_32 using offsets\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Map, Image, render, load_map\n"
- ">>> m = Map(256,256)\n"
- ">>> load_map(m,'mapfile.xml')\n"
- ">>> im = Image(m.width,m.height)\n"
- ">>> scale_factor=2.0\n"
- ">>> offset = [100,50]\n"
- ">>> render(m,im)\n"
- ">>> render(m,im,scale_factor)\n"
- ">>> render(m,im,scale_factor,offset[0],offset[1])\n"
- "\n"
- ));
-
- def("render_with_detector", &render_with_detector, render_with_detector_overloads(
- "\n"
- "Render Map to an AGG image_32 using a pre-constructed detector.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Map, Image, LabelCollisionDetector, render_with_detector, load_map\n"
- ">>> m = Map(256,256)\n"
- ">>> load_map(m,'mapfile.xml')\n"
- ">>> im = Image(m.width,m.height)\n"
- ">>> detector = LabelCollisionDetector(m)\n"
- ">>> render_with_detector(m, im, detector)\n"
- ));
-
- def("render_layer", &render_layer2,
- (arg("map"),
- arg("image"),
- arg("layer"),
- arg("scale_factor")=1.0,
- arg("offset_x")=0,
- arg("offset_y")=0
- )
- );
-
-#if defined(GRID_RENDERER)
- def("render_layer", &mapnik::render_layer_for_grid,
- (arg("map"),
- arg("grid"),
- arg("layer"),
- arg("fields")=boost::python::list(),
- arg("scale_factor")=1.0,
- arg("offset_x")=0,
- arg("offset_y")=0
- )
- );
-#endif
-
-#if defined(HAVE_CAIRO) && defined(HAVE_PYCAIRO)
- def("render",&render3,
- "\n"
- "Render Map to Cairo Surface using offsets\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Map, render, load_map\n"
- ">>> from cairo import SVGSurface\n"
- ">>> m = Map(256,256)\n"
- ">>> load_map(m,'mapfile.xml')\n"
- ">>> surface = SVGSurface('image.svg', m.width, m.height)\n"
- ">>> render(m,surface,1,1)\n"
- "\n"
- );
-
- def("render",&render4,
- "\n"
- "Render Map to Cairo Surface\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Map, render, load_map\n"
- ">>> from cairo import SVGSurface\n"
- ">>> m = Map(256,256)\n"
- ">>> load_map(m,'mapfile.xml')\n"
- ">>> surface = SVGSurface('image.svg', m.width, m.height)\n"
- ">>> render(m,surface)\n"
- "\n"
- );
-
- def("render",&render5,
- "\n"
- "Render Map to Cairo Context using offsets\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Map, render, load_map\n"
- ">>> from cairo import SVGSurface, Context\n"
- ">>> surface = SVGSurface('image.svg', m.width, m.height)\n"
- ">>> ctx = Context(surface)\n"
- ">>> load_map(m,'mapfile.xml')\n"
- ">>> render(m,context,1,1)\n"
- "\n"
- );
-
- def("render",&render6,
- "\n"
- "Render Map to Cairo Context\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Map, render, load_map\n"
- ">>> from cairo import SVGSurface, Context\n"
- ">>> surface = SVGSurface('image.svg', m.width, m.height)\n"
- ">>> ctx = Context(surface)\n"
- ">>> load_map(m,'mapfile.xml')\n"
- ">>> render(m,context)\n"
- "\n"
- );
-
- def("render_with_detector", &render_with_detector2,
- "\n"
- "Render Map to Cairo Context using a pre-constructed detector.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Map, LabelCollisionDetector, render_with_detector, load_map\n"
- ">>> from cairo import SVGSurface, Context\n"
- ">>> surface = SVGSurface('image.svg', m.width, m.height)\n"
- ">>> ctx = Context(surface)\n"
- ">>> m = Map(256,256)\n"
- ">>> load_map(m,'mapfile.xml')\n"
- ">>> detector = LabelCollisionDetector(m)\n"
- ">>> render_with_detector(m, ctx, detector)\n"
- );
-
- def("render_with_detector", &render_with_detector3,
- "\n"
- "Render Map to Cairo Context using a pre-constructed detector, scale and offsets.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Map, LabelCollisionDetector, render_with_detector, load_map\n"
- ">>> from cairo import SVGSurface, Context\n"
- ">>> surface = SVGSurface('image.svg', m.width, m.height)\n"
- ">>> ctx = Context(surface)\n"
- ">>> m = Map(256,256)\n"
- ">>> load_map(m,'mapfile.xml')\n"
- ">>> detector = LabelCollisionDetector(m)\n"
- ">>> render_with_detector(m, ctx, detector, 1, 1, 1)\n"
- );
-
- def("render_with_detector", &render_with_detector4,
- "\n"
- "Render Map to Cairo Surface using a pre-constructed detector.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Map, LabelCollisionDetector, render_with_detector, load_map\n"
- ">>> from cairo import SVGSurface, Context\n"
- ">>> surface = SVGSurface('image.svg', m.width, m.height)\n"
- ">>> m = Map(256,256)\n"
- ">>> load_map(m,'mapfile.xml')\n"
- ">>> detector = LabelCollisionDetector(m)\n"
- ">>> render_with_detector(m, surface, detector)\n"
- );
-
- def("render_with_detector", &render_with_detector5,
- "\n"
- "Render Map to Cairo Surface using a pre-constructed detector, scale and offsets.\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Map, LabelCollisionDetector, render_with_detector, load_map\n"
- ">>> from cairo import SVGSurface, Context\n"
- ">>> surface = SVGSurface('image.svg', m.width, m.height)\n"
- ">>> m = Map(256,256)\n"
- ">>> load_map(m,'mapfile.xml')\n"
- ">>> detector = LabelCollisionDetector(m)\n"
- ">>> render_with_detector(m, surface, detector, 1, 1, 1)\n"
- );
-
-#endif
-
- def("scale_denominator", &scale_denominator,
- (arg("map"),arg("is_geographic")),
- "\n"
- "Return the Map Scale Denominator.\n"
- "Also available as Map.scale_denominator()\n"
- "\n"
- "Usage:\n"
- "\n"
- ">>> from mapnik import Map, Projection, scale_denominator, load_map\n"
- ">>> m = Map(256,256)\n"
- ">>> load_map(m,'mapfile.xml')\n"
- ">>> scale_denominator(m,Projection(m.srs).geographic)\n"
- "\n"
- );
-
- def("load_map", &load_map, load_map_overloads());
-
- def("load_map_from_string", &load_map_string, load_map_string_overloads());
-
- def("save_map", &save_map, save_map_overloads());
-/*
- "\n"
- "Save Map object to XML file\n"
- "\n"
- "Usage:\n"
- ">>> from mapnik import Map, load_map, save_map\n"
- ">>> m = Map(256,256)\n"
- ">>> load_map(m,'mapfile_wgs84.xml')\n"
- ">>> m.srs\n"
- "'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'\n"
- ">>> m.srs = '+init=espg:3395'\n"
- ">>> save_map(m,'mapfile_mercator.xml')\n"
- "\n"
- );
-*/
-
- def("save_map_to_string", &save_map_to_string, save_map_to_string_overloads());
- def("mapnik_version", &mapnik_version,"Get the Mapnik version number");
- def("mapnik_version_string", &mapnik_version_string,"Get the Mapnik version string");
- def("has_proj4", &has_proj4, "Get proj4 status");
- def("has_jpeg", &has_jpeg, "Get jpeg read/write support status");
- def("has_png", &has_png, "Get png read/write support status");
- def("has_tiff", &has_tiff, "Get tiff read/write support status");
- def("has_webp", &has_webp, "Get webp read/write support status");
- def("has_svg_renderer", &has_svg_renderer, "Get svg_renderer status");
- def("has_grid_renderer", &has_grid_renderer, "Get grid_renderer status");
- def("has_cairo", &has_cairo, "Get cairo library status");
- def("has_pycairo", &has_pycairo, "Get pycairo module status");
-
- python_optional<mapnik::font_set>();
- python_optional<mapnik::color>();
- python_optional<mapnik::box2d<double> >();
- python_optional<mapnik::composite_mode_e>();
- python_optional<mapnik::datasource::geometry_t>();
- python_optional<std::string>();
- python_optional<unsigned>();
- python_optional<double>();
- python_optional<float>();
- python_optional<bool>();
- python_optional<int>();
- python_optional<mapnik::text_transform_e>();
- register_ptr_to_python<mapnik::expression_ptr>();
- register_ptr_to_python<mapnik::path_expression_ptr>();
- to_python_converter<mapnik::value_holder,mapnik_param_to_python>();
- to_python_converter<mapnik::value,mapnik_value_to_python>();
- to_python_converter<mapnik::enumeration_wrapper,mapnik_enumeration_wrapper_to_python>();
-}
diff --git a/bindings/python/mapnik_query.cpp b/bindings/python/mapnik_query.cpp
deleted file mode 100644
index 893d836..0000000
--- a/bindings/python/mapnik_query.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include "python_to_value.hpp"
-#include <boost/python.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/query.hpp>
-#include <mapnik/box2d.hpp>
-
-#include <string>
-#include <set>
-
-using mapnik::query;
-using mapnik::box2d;
-
-namespace python = boost::python;
-
-struct resolution_to_tuple
-{
- static PyObject* convert(query::resolution_type const& x)
- {
- python::object tuple(python::make_tuple(std::get<0>(x), std::get<1>(x)));
- return python::incref(tuple.ptr());
- }
-
- static PyTypeObject const* get_pytype()
- {
- return &PyTuple_Type;
- }
-};
-
-struct names_to_list
-{
- static PyObject* convert(std::set<std::string> const& names)
- {
- boost::python::list l;
- for ( std::string const& name : names )
- {
- l.append(name);
- }
- return python::incref(l.ptr());
- }
-
- static PyTypeObject const* get_pytype()
- {
- return &PyList_Type;
- }
-};
-
-namespace {
-
- void set_variables(mapnik::query & q, boost::python::dict const& d)
- {
- mapnik::attributes vars = mapnik::dict2attr(d);
- q.set_variables(vars);
- }
-}
-
-void export_query()
-{
- using namespace boost::python;
-
- to_python_converter<query::resolution_type, resolution_to_tuple> ();
- to_python_converter<std::set<std::string>, names_to_list> ();
-
- class_<query>("Query", "a spatial query data object",
- init<box2d<double>,query::resolution_type const&,double>() )
- .def(init<box2d<double> >())
- .add_property("resolution",make_function(&query::resolution,
- return_value_policy<copy_const_reference>()))
- .add_property("bbox", make_function(&query::get_bbox,
- return_value_policy<copy_const_reference>()) )
- .add_property("property_names", make_function(&query::property_names,
- return_value_policy<copy_const_reference>()) )
- .def("add_property_name", &query::add_property_name)
- .def("set_variables",&set_variables);
-}
diff --git a/bindings/python/mapnik_raster_colorizer.cpp b/bindings/python/mapnik_raster_colorizer.cpp
deleted file mode 100644
index 725ea16..0000000
--- a/bindings/python/mapnik_raster_colorizer.cpp
+++ /dev/null
@@ -1,230 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2010 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/raster_colorizer.hpp>
-#include <mapnik/symbolizer.hpp>
-
-using mapnik::raster_colorizer;
-using mapnik::raster_colorizer_ptr;
-using mapnik::symbolizer_base;
-using mapnik::colorizer_stop;
-using mapnik::colorizer_stops;
-using mapnik::colorizer_mode_enum;
-using mapnik::color;
-using mapnik::COLORIZER_INHERIT;
-using mapnik::COLORIZER_LINEAR;
-using mapnik::COLORIZER_DISCRETE;
-using mapnik::COLORIZER_EXACT;
-
-
-namespace {
-void add_stop(raster_colorizer_ptr & rc, colorizer_stop & stop)
-{
- rc->add_stop(stop);
-}
-void add_stop2(raster_colorizer_ptr & rc, float v) {
- colorizer_stop stop(v, rc->get_default_mode(), rc->get_default_color());
- rc->add_stop(stop);
-}
-void add_stop3(raster_colorizer_ptr &rc, float v, color c) {
- colorizer_stop stop(v, rc->get_default_mode(), c);
- rc->add_stop(stop);
-}
-void add_stop4(raster_colorizer_ptr &rc, float v, colorizer_mode_enum m) {
- colorizer_stop stop(v, m, rc->get_default_color());
- rc->add_stop(stop);
-}
-void add_stop5(raster_colorizer_ptr &rc, float v, colorizer_mode_enum m, color c) {
- colorizer_stop stop(v, m, c);
- rc->add_stop(stop);
-}
-mapnik::color get_color(raster_colorizer_ptr &rc, float value) {
- unsigned rgba = rc->get_color(value);
- unsigned r = (rgba & 0xff);
- unsigned g = (rgba >> 8 ) & 0xff;
- unsigned b = (rgba >> 16) & 0xff;
- unsigned a = (rgba >> 24) & 0xff;
- return mapnik::color(r,g,b,a);
-}
-
-colorizer_stops const& get_stops(raster_colorizer_ptr & rc)
-{
- return rc->get_stops();
-}
-}
-
-void export_raster_colorizer()
-{
- using namespace boost::python;
-
- implicitly_convertible<raster_colorizer_ptr, mapnik::symbolizer_base::value_type>();
-
- class_<raster_colorizer,raster_colorizer_ptr>("RasterColorizer",
- "A Raster Colorizer object.",
- init<colorizer_mode_enum, color>(args("default_mode","default_color"))
- )
- .def(init<>())
- .add_property("default_color",
- make_function(&raster_colorizer::get_default_color, return_value_policy<reference_existing_object>()),
- &raster_colorizer::set_default_color,
- "The default color for stops added without a color (mapnik.Color).\n")
- .add_property("default_mode",
- &raster_colorizer::get_default_mode_enum,
- &raster_colorizer::set_default_mode_enum,
- "The default mode (mapnik.ColorizerMode).\n"
- "\n"
- "If a stop is added without a mode, then it will inherit this default mode\n")
- .add_property("stops",
- make_function(get_stops,return_value_policy<reference_existing_object>()),
- "The list of stops this RasterColorizer contains\n")
- .add_property("epsilon",
- &raster_colorizer::get_epsilon,
- &raster_colorizer::set_epsilon,
- "Comparison epsilon value for exact mode\n"
- "\n"
- "When comparing values in exact mode, values need only be within epsilon to match.\n")
-
-
- .def("add_stop", add_stop,
- (arg("ColorizerStop")),
- "Add a colorizer stop to the raster colorizer.\n"
- "\n"
- "Usage:\n"
- ">>> colorizer = mapnik.RasterColorizer()\n"
- ">>> color = mapnik.Color(\"#0044cc\")\n"
- ">>> stop = mapnik.ColorizerStop(3, mapnik.COLORIZER_INHERIT, color)\n"
- ">>> colorizer.add_stop(stop)\n"
- )
- .def("add_stop", add_stop2,
- (arg("value")),
- "Add a colorizer stop to the raster colorizer, using the default mode and color.\n"
- "\n"
- "Usage:\n"
- ">>> default_color = mapnik.Color(\"#0044cc\")\n"
- ">>> colorizer = mapnik.RasterColorizer(mapnik.COLORIZER_LINEAR, default_color)\n"
- ">>> colorizer.add_stop(100)\n"
- )
- .def("add_stop", add_stop3,
- (arg("value")),
- "Add a colorizer stop to the raster colorizer, using the default mode.\n"
- "\n"
- "Usage:\n"
- ">>> default_color = mapnik.Color(\"#0044cc\")\n"
- ">>> colorizer = mapnik.RasterColorizer(mapnik.COLORIZER_LINEAR, default_color)\n"
- ">>> colorizer.add_stop(100, mapnik.Color(\"#123456\"))\n"
- )
- .def("add_stop", add_stop4,
- (arg("value")),
- "Add a colorizer stop to the raster colorizer, using the default color.\n"
- "\n"
- "Usage:\n"
- ">>> default_color = mapnik.Color(\"#0044cc\")\n"
- ">>> colorizer = mapnik.RasterColorizer(mapnik.COLORIZER_LINEAR, default_color)\n"
- ">>> colorizer.add_stop(100, mapnik.COLORIZER_EXACT)\n"
- )
- .def("add_stop", add_stop5,
- (arg("value")),
- "Add a colorizer stop to the raster colorizer.\n"
- "\n"
- "Usage:\n"
- ">>> default_color = mapnik.Color(\"#0044cc\")\n"
- ">>> colorizer = mapnik.RasterColorizer(mapnik.COLORIZER_LINEAR, default_color)\n"
- ">>> colorizer.add_stop(100, mapnik.COLORIZER_DISCRETE, mapnik.Color(\"#112233\"))\n"
- )
- .def("get_color", get_color,
- "Get the color assigned to a certain value in raster data.\n"
- "\n"
- "Usage:\n"
- ">>> colorizer = mapnik.RasterColorizer()\n"
- ">>> color = mapnik.Color(\"#0044cc\")\n"
- ">>> colorizer.add_stop(0, mapnik.COLORIZER_DISCRETE, mapnik.Color(\"#000000\"))\n"
- ">>> colorizer.add_stop(100, mapnik.COLORIZER_DISCRETE, mapnik.Color(\"#0E0A06\"))\n"
- ">>> colorizer.get_color(50)\n"
- "Color('#070503')\n"
- )
- ;
-
-
-
- class_<colorizer_stops>("ColorizerStops",
- "A RasterColorizer's collection of ordered color stops.\n"
- "This class is not meant to be instantiated from python. However, "
- "it can be accessed at a RasterColorizer's \"stops\" attribute for "
- "introspection purposes",
- no_init)
- .def(vector_indexing_suite<colorizer_stops>())
- ;
-
- enum_<colorizer_mode_enum>("ColorizerMode")
- .value("COLORIZER_INHERIT", COLORIZER_INHERIT)
- .value("COLORIZER_LINEAR", COLORIZER_LINEAR)
- .value("COLORIZER_DISCRETE", COLORIZER_DISCRETE)
- .value("COLORIZER_EXACT", COLORIZER_EXACT)
- .export_values()
- ;
-
-
- class_<colorizer_stop>("ColorizerStop",init<float, colorizer_mode_enum, color const&>(
- "A Colorizer Stop object.\n"
- "Create with a value, ColorizerMode, and Color\n"
- "\n"
- "Usage:"
- ">>> color = mapnik.Color(\"#fff000\")\n"
- ">>> stop= mapnik.ColorizerStop(42.42, mapnik.COLORIZER_LINEAR, color)\n"
- ))
- .add_property("color",
- make_function(&colorizer_stop::get_color, return_value_policy<reference_existing_object>()),
- &colorizer_stop::set_color,
- "The stop color (mapnik.Color).\n")
- .add_property("value",
- &colorizer_stop::get_value,
- &colorizer_stop::set_value,
- "The stop value.\n")
- .add_property("label",
- make_function(&colorizer_stop::get_label, return_value_policy<copy_const_reference>()),
- &colorizer_stop::set_label,
- "The stop label.\n")
- .add_property("mode",
- &colorizer_stop::get_mode_enum,
- &colorizer_stop::set_mode_enum,
- "The stop mode (mapnik.ColorizerMode).\n"
- "\n"
- "If this is COLORIZER_INHERIT then it will inherit the default mode\n"
- " from the RasterColorizer it is added to.\n")
- .def(self == self)
- .def("__str__",&colorizer_stop::to_string)
- ;
-}
diff --git a/bindings/python/mapnik_rule.cpp b/bindings/python/mapnik_rule.cpp
deleted file mode 100644
index 53fa4ad..0000000
--- a/bindings/python/mapnik_rule.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/python/implicit.hpp>
-#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/rule.hpp>
-#include <mapnik/expression.hpp>
-#include <mapnik/expression_string.hpp>
-
-using mapnik::rule;
-using mapnik::expr_node;
-using mapnik::expression_ptr;
-using mapnik::point_symbolizer;
-using mapnik::line_symbolizer;
-using mapnik::line_pattern_symbolizer;
-using mapnik::polygon_symbolizer;
-using mapnik::polygon_pattern_symbolizer;
-using mapnik::raster_symbolizer;
-using mapnik::shield_symbolizer;
-using mapnik::text_symbolizer;
-using mapnik::building_symbolizer;
-using mapnik::markers_symbolizer;
-using mapnik::group_symbolizer;
-using mapnik::symbolizer;
-using mapnik::to_expression_string;
-
-void export_rule()
-{
- using namespace boost::python;
- implicitly_convertible<point_symbolizer,symbolizer>();
- implicitly_convertible<line_symbolizer,symbolizer>();
- implicitly_convertible<line_pattern_symbolizer,symbolizer>();
- implicitly_convertible<polygon_symbolizer,symbolizer>();
- implicitly_convertible<building_symbolizer,symbolizer>();
- implicitly_convertible<polygon_pattern_symbolizer,symbolizer>();
- implicitly_convertible<raster_symbolizer,symbolizer>();
- implicitly_convertible<shield_symbolizer,symbolizer>();
- implicitly_convertible<text_symbolizer,symbolizer>();
- implicitly_convertible<markers_symbolizer,symbolizer>();
- implicitly_convertible<group_symbolizer,symbolizer>();
-
- class_<rule::symbolizers>("Symbolizers",init<>("TODO"))
- .def(vector_indexing_suite<rule::symbolizers>())
- ;
-
- class_<rule>("Rule",init<>("default constructor"))
- .def(init<std::string const&,
- boost::python::optional<double,double> >())
- .add_property("name",make_function
- (&rule::get_name,
- return_value_policy<copy_const_reference>()),
- &rule::set_name)
- .add_property("filter",make_function
- (&rule::get_filter,return_value_policy<copy_const_reference>()),
- &rule::set_filter)
- .add_property("min_scale",&rule::get_min_scale,&rule::set_min_scale)
- .add_property("max_scale",&rule::get_max_scale,&rule::set_max_scale)
- .def("set_else",&rule::set_else)
- .def("has_else",&rule::has_else_filter)
- .def("set_also",&rule::set_also)
- .def("has_also",&rule::has_also_filter)
- .def("active",&rule::active)
- .add_property("symbols",make_function
- (&rule::get_symbolizers,return_value_policy<reference_existing_object>()))
- .add_property("copy_symbols",make_function
- (&rule::get_symbolizers,return_value_policy<copy_const_reference>()))
- ;
-}
diff --git a/bindings/python/mapnik_scaling_method.cpp b/bindings/python/mapnik_scaling_method.cpp
deleted file mode 100644
index 495d380..0000000
--- a/bindings/python/mapnik_scaling_method.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2012 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-
-#include <mapnik/image_scaling.hpp>
-
-// boost
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#pragma GCC diagnostic pop
-
-void export_scaling_method()
-{
- using namespace boost::python;
-
- enum_<mapnik::scaling_method_e>("scaling_method")
- .value("NEAR", mapnik::SCALING_NEAR)
- .value("BILINEAR", mapnik::SCALING_BILINEAR)
- .value("BICUBIC", mapnik::SCALING_BICUBIC)
- .value("SPLINE16", mapnik::SCALING_SPLINE16)
- .value("SPLINE36", mapnik::SCALING_SPLINE36)
- .value("HANNING", mapnik::SCALING_HANNING)
- .value("HAMMING", mapnik::SCALING_HAMMING)
- .value("HERMITE", mapnik::SCALING_HERMITE)
- .value("KAISER", mapnik::SCALING_KAISER)
- .value("QUADRIC", mapnik::SCALING_QUADRIC)
- .value("CATROM", mapnik::SCALING_CATROM)
- .value("GAUSSIAN", mapnik::SCALING_GAUSSIAN)
- .value("BESSEL", mapnik::SCALING_BESSEL)
- .value("MITCHELL", mapnik::SCALING_MITCHELL)
- .value("SINC", mapnik::SCALING_SINC)
- .value("LANCZOS", mapnik::SCALING_LANCZOS)
- .value("BLACKMAN", mapnik::SCALING_BLACKMAN)
- ;
-}
diff --git a/bindings/python/mapnik_style.cpp b/bindings/python/mapnik_style.cpp
deleted file mode 100644
index 0658f9b..0000000
--- a/bindings/python/mapnik_style.cpp
+++ /dev/null
@@ -1,118 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/value_error.hpp>
-#include <mapnik/rule.hpp>
-#include "mapnik_enumeration.hpp"
-#include <mapnik/feature_type_style.hpp>
-#include <mapnik/image_filter_types.hpp> // generate_image_filters
-
-using mapnik::feature_type_style;
-using mapnik::rules;
-using mapnik::rule;
-
-std::string get_image_filters(feature_type_style & style)
-{
- std::string filters_str;
- std::back_insert_iterator<std::string> sink(filters_str);
- generate_image_filters(sink, style.image_filters());
- return filters_str;
-}
-
-void set_image_filters(feature_type_style & style, std::string const& filters)
-{
- std::vector<mapnik::filter::filter_type> new_filters;
- bool result = parse_image_filters(filters, new_filters);
- if (!result)
- {
- throw mapnik::value_error("failed to parse image-filters: '" + filters + "'");
- }
-#ifdef _WINDOWS
- style.image_filters() = new_filters;
- // FIXME : https://svn.boost.org/trac/boost/ticket/2839
-#else
- style.image_filters() = std::move(new_filters);
-#endif
-}
-
-void export_style()
-{
- using namespace boost::python;
-
- mapnik::enumeration_<mapnik::filter_mode_e>("filter_mode")
- .value("ALL",mapnik::FILTER_ALL)
- .value("FIRST",mapnik::FILTER_FIRST)
- ;
-
- class_<rules>("Rules",init<>("default ctor"))
- .def(vector_indexing_suite<rules>())
- ;
- class_<feature_type_style>("Style",init<>("default style constructor"))
-
- .add_property("rules",make_function
- (&feature_type_style::get_rules,
- return_value_policy<reference_existing_object>()),
- "List of rules belonging to a style as rule objects.\n"
- "\n"
- "Usage:\n"
- ">>> for r in m.find_style('style 1').rules:\n"
- ">>> print r\n"
- "<mapnik._mapnik.Rule object at 0x100549910>\n"
- "<mapnik._mapnik.Rule object at 0x100549980>\n"
- )
- .add_property("filter_mode",
- &feature_type_style::get_filter_mode,
- &feature_type_style::set_filter_mode,
- "Set/get the filter mode of the style")
- .add_property("opacity",
- &feature_type_style::get_opacity,
- &feature_type_style::set_opacity,
- "Set/get the opacity of the style")
- .add_property("comp_op",
- &feature_type_style::comp_op,
- &feature_type_style::set_comp_op,
- "Set/get the comp-op (composite operation) of the style")
- .add_property("image_filters_inflate",
- &feature_type_style::image_filters_inflate,
- &feature_type_style::image_filters_inflate,
- "Set/get the image_filters_inflate property of the style")
- .add_property("image_filters",
- get_image_filters,
- set_image_filters,
- "Set/get the comp-op (composite operation) of the style")
- ;
-
-}
diff --git a/bindings/python/mapnik_svg.hpp b/bindings/python/mapnik_svg.hpp
deleted file mode 100644
index 418ee05..0000000
--- a/bindings/python/mapnik_svg.hpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2010 Robert Coup
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-#ifndef MAPNIK_PYTHON_BINDING_SVG_INCLUDED
-#define MAPNIK_PYTHON_BINDING_SVG_INCLUDED
-
-// mapnik
-#include <mapnik/parse_transform.hpp>
-#include <mapnik/symbolizer.hpp>
-#include <mapnik/value_error.hpp>
-
-namespace mapnik {
-using namespace boost::python;
-
-template <class T>
-std::string get_svg_transform(T& symbolizer)
-{
- return symbolizer.get_image_transform_string();
-}
-
-template <class T>
-void set_svg_transform(T& symbolizer, std::string const& transform_wkt)
-{
- transform_list_ptr trans_expr = mapnik::parse_transform(transform_wkt);
- if (!trans_expr)
- {
- std::stringstream ss;
- ss << "Could not parse transform from '"
- << transform_wkt
- << "', expected SVG transform attribute";
- throw mapnik::value_error(ss.str());
- }
- symbolizer.set_image_transform(trans_expr);
-}
-
-} // end of namespace mapnik
-
-#endif // MAPNIK_PYTHON_BINDING_SVG_INCLUDED
diff --git a/bindings/python/mapnik_svg_generator_grammar.cpp b/bindings/python/mapnik_svg_generator_grammar.cpp
deleted file mode 100644
index 051eb0a..0000000
--- a/bindings/python/mapnik_svg_generator_grammar.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2014 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/geometry.hpp>
-#include <mapnik/svg/geometry_svg_generator_impl.hpp>
-#include <string>
-
-using sink_type = std::back_insert_iterator<std::string>;
-template struct mapnik::svg::svg_path_generator<sink_type, mapnik::geometry_type>;
diff --git a/bindings/python/mapnik_symbolizer.cpp b/bindings/python/mapnik_symbolizer.cpp
deleted file mode 100644
index 2175b59..0000000
--- a/bindings/python/mapnik_symbolizer.cpp
+++ /dev/null
@@ -1,423 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2013 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/python/suite/indexing/map_indexing_suite.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/symbolizer.hpp>
-#include <mapnik/symbolizer_hash.hpp>
-#include <mapnik/symbolizer_utils.hpp>
-#include <mapnik/symbolizer_keys.hpp>
-#include <mapnik/image_util.hpp>
-#include <mapnik/parse_path.hpp>
-#include <mapnik/path_expression.hpp>
-#include "mapnik_enumeration.hpp"
-#include "mapnik_svg.hpp"
-#include <mapnik/graphics.hpp>
-#include <mapnik/expression_node.hpp>
-#include <mapnik/value_error.hpp>
-#include <mapnik/marker_cache.hpp> // for known_svg_prefix_
-#include <mapnik/group/group_layout.hpp>
-#include <mapnik/group/group_rule.hpp>
-#include <mapnik/group/group_symbolizer_properties.hpp>
-#include <mapnik/util/variant.hpp>
-
-// stl
-#include <sstream>
-
-using mapnik::symbolizer;
-using mapnik::point_symbolizer;
-using mapnik::line_symbolizer;
-using mapnik::line_pattern_symbolizer;
-using mapnik::polygon_symbolizer;
-using mapnik::polygon_pattern_symbolizer;
-using mapnik::raster_symbolizer;
-using mapnik::shield_symbolizer;
-using mapnik::text_symbolizer;
-using mapnik::building_symbolizer;
-using mapnik::markers_symbolizer;
-using mapnik::debug_symbolizer;
-using mapnik::group_symbolizer;
-using mapnik::symbolizer_base;
-using mapnik::color;
-using mapnik::path_processor_type;
-using mapnik::path_expression_ptr;
-using mapnik::guess_type;
-using mapnik::expression_ptr;
-using mapnik::parse_path;
-
-
-namespace {
-using namespace boost::python;
-void __setitem__(mapnik::symbolizer_base & sym, std::string const& name, mapnik::symbolizer_base::value_type const& val)
-{
- put(sym, mapnik::get_key(name), val);
-}
-
-std::shared_ptr<mapnik::symbolizer_base::value_type> numeric_wrapper(const object& arg)
-{
- std::shared_ptr<mapnik::symbolizer_base::value_type> result;
- if (PyBool_Check(arg.ptr()))
- {
- mapnik::value_bool val = extract<mapnik::value_bool>(arg);
- result.reset(new mapnik::symbolizer_base::value_type(val));
- }
- else if (PyFloat_Check(arg.ptr()))
- {
- mapnik::value_double val = extract<mapnik::value_double>(arg);
- result.reset(new mapnik::symbolizer_base::value_type(val));
- }
- else
- {
- mapnik::value_integer val = extract<mapnik::value_integer>(arg);
- result.reset(new mapnik::symbolizer_base::value_type(val));
- }
- return result;
-}
-
-struct extract_python_object : public mapnik::util::static_visitor<boost::python::object>
-{
- using result_type = boost::python::object;
-
- template <typename T>
- auto operator() (T const& val) const -> result_type
- {
- return result_type(val); // wrap into python object
- }
-};
-
-boost::python::object __getitem__(mapnik::symbolizer_base const& sym, std::string const& name)
-{
- using const_iterator = symbolizer_base::cont_type::const_iterator;
- mapnik::keys key = mapnik::get_key(name);
- const_iterator itr = sym.properties.find(key);
- if (itr != sym.properties.end())
- {
- return mapnik::util::apply_visitor(extract_python_object(), itr->second);
- }
- //mapnik::property_meta_type const& meta = mapnik::get_meta(key);
- //return mapnik::util::apply_visitor(extract_python_object(), std::get<1>(meta));
- return boost::python::object();
-}
-
-/*
-std::string __str__(mapnik::symbolizer const& sym)
-{
- return mapnik::util::apply_visitor(mapnik::symbolizer_to_json(), sym);
-}
-*/
-
-std::string get_symbolizer_type(symbolizer const& sym)
-{
- return mapnik::symbolizer_name(sym); // FIXME - do we need this ?
-}
-
-std::size_t hash_impl(symbolizer const& sym)
-{
- return mapnik::util::apply_visitor(mapnik::symbolizer_hash_visitor(), sym);
-}
-
-template <typename T>
-std::size_t hash_impl_2(T const& sym)
-{
- return mapnik::symbolizer_hash::value<T>(sym);
-}
-
-struct extract_underlying_type_visitor : mapnik::util::static_visitor<boost::python::object>
-{
- template <typename T>
- boost::python::object operator() (T const& sym) const
- {
- return boost::python::object(sym);
- }
-};
-
-boost::python::object extract_underlying_type(symbolizer const& sym)
-{
- return mapnik::util::apply_visitor(extract_underlying_type_visitor(), sym);
-}
-
-}
-
-void export_symbolizer()
-{
- using namespace boost::python;
-
- //implicitly_convertible<mapnik::value_bool, mapnik::symbolizer_base::value_type>();
- implicitly_convertible<mapnik::value_integer, mapnik::symbolizer_base::value_type>();
- implicitly_convertible<mapnik::value_double, mapnik::symbolizer_base::value_type>();
- implicitly_convertible<std::string, mapnik::symbolizer_base::value_type>();
- implicitly_convertible<mapnik::color, mapnik::symbolizer_base::value_type>();
- implicitly_convertible<mapnik::expression_ptr, mapnik::symbolizer_base::value_type>();
- implicitly_convertible<mapnik::enumeration_wrapper, mapnik::symbolizer_base::value_type>();
- implicitly_convertible<std::shared_ptr<mapnik::group_symbolizer_properties>, mapnik::symbolizer_base::value_type>();
-
- enum_<mapnik::keys>("keys")
- .value("gamma", mapnik::keys::gamma)
- .value("gamma_method",mapnik::keys::gamma_method)
- ;
-
- class_<symbolizer>("Symbolizer",no_init)
- .def("type",get_symbolizer_type)
- .def("__hash__",hash_impl)
- .def("extract", extract_underlying_type)
- ;
-
- class_<symbolizer_base::value_type>("NumericWrapper")
- .def("__init__", make_constructor(numeric_wrapper))
- ;
-
- class_<symbolizer_base>("SymbolizerBase",no_init)
- .def("__setitem__",&__setitem__)
- .def("__setattr__",&__setitem__)
- .def("__getitem__",&__getitem__)
- .def("__getattr__",&__getitem__)
- //.def("__str__", &__str__)
- .def(self == self) // __eq__
- ;
-}
-
-
-void export_shield_symbolizer()
-{
- using namespace boost::python;
- class_< shield_symbolizer, bases<text_symbolizer> >("ShieldSymbolizer",
- init<>("Default ctor"))
- .def("__hash__",hash_impl_2<shield_symbolizer>)
- ;
-
-}
-
-void export_polygon_symbolizer()
-{
- using namespace boost::python;
-
- class_<polygon_symbolizer, bases<symbolizer_base> >("PolygonSymbolizer",
- init<>("Default ctor"))
- .def("__hash__",hash_impl_2<polygon_symbolizer>)
- ;
-
-}
-
-void export_polygon_pattern_symbolizer()
-{
- using namespace boost::python;
-
- mapnik::enumeration_<mapnik::pattern_alignment_e>("pattern_alignment")
- .value("LOCAL",mapnik::LOCAL_ALIGNMENT)
- .value("GLOBAL",mapnik::GLOBAL_ALIGNMENT)
- ;
-
- class_<polygon_pattern_symbolizer>("PolygonPatternSymbolizer",
- init<>("Default ctor"))
- .def("__hash__",hash_impl_2<polygon_pattern_symbolizer>)
- ;
-}
-
-void export_raster_symbolizer()
-{
- using namespace boost::python;
-
- class_<raster_symbolizer, bases<symbolizer_base> >("RasterSymbolizer",
- init<>("Default ctor"))
- ;
-}
-
-void export_point_symbolizer()
-{
- using namespace boost::python;
-
- mapnik::enumeration_<mapnik::point_placement_e>("point_placement")
- .value("CENTROID",mapnik::CENTROID_POINT_PLACEMENT)
- .value("INTERIOR",mapnik::INTERIOR_POINT_PLACEMENT)
- ;
-
- class_<point_symbolizer, bases<symbolizer_base> >("PointSymbolizer",
- init<>("Default Point Symbolizer - 4x4 black square"))
- .def("__hash__",hash_impl_2<point_symbolizer>)
- ;
-}
-
-void export_markers_symbolizer()
-{
- using namespace boost::python;
-
- mapnik::enumeration_<mapnik::marker_placement_e>("marker_placement")
- .value("POINT_PLACEMENT",mapnik::MARKER_POINT_PLACEMENT)
- .value("INTERIOR_PLACEMENT",mapnik::MARKER_INTERIOR_PLACEMENT)
- .value("LINE_PLACEMENT",mapnik::MARKER_LINE_PLACEMENT)
- ;
-
- mapnik::enumeration_<mapnik::marker_multi_policy_e>("marker_multi_policy")
- .value("EACH",mapnik::MARKER_EACH_MULTI)
- .value("WHOLE",mapnik::MARKER_WHOLE_MULTI)
- .value("LARGEST",mapnik::MARKER_LARGEST_MULTI)
- ;
-
- class_<markers_symbolizer, bases<symbolizer_base> >("MarkersSymbolizer",
- init<>("Default Markers Symbolizer - circle"))
- .def("__hash__",hash_impl_2<markers_symbolizer>)
- ;
-}
-
-
-void export_line_symbolizer()
-{
- using namespace boost::python;
-
- mapnik::enumeration_<mapnik::line_rasterizer_e>("line_rasterizer")
- .value("FULL",mapnik::RASTERIZER_FULL)
- .value("FAST",mapnik::RASTERIZER_FAST)
- ;
-
- mapnik::enumeration_<mapnik::line_cap_e>("stroke_linecap",
- "The possible values for a line cap used when drawing\n"
- "with a stroke.\n")
- .value("BUTT_CAP",mapnik::BUTT_CAP)
- .value("SQUARE_CAP",mapnik::SQUARE_CAP)
- .value("ROUND_CAP",mapnik::ROUND_CAP)
- ;
-
- mapnik::enumeration_<mapnik::line_join_e>("stroke_linejoin",
- "The possible values for the line joining mode\n"
- "when drawing with a stroke.\n")
- .value("MITER_JOIN",mapnik::MITER_JOIN)
- .value("MITER_REVERT_JOIN",mapnik::MITER_REVERT_JOIN)
- .value("ROUND_JOIN",mapnik::ROUND_JOIN)
- .value("BEVEL_JOIN",mapnik::BEVEL_JOIN)
- ;
-
-
- class_<line_symbolizer, bases<symbolizer_base> >("LineSymbolizer",
- init<>("Default LineSymbolizer - 1px solid black"))
- .def("__hash__",hash_impl_2<line_symbolizer>)
- ;
-}
-
-void export_line_pattern_symbolizer()
-{
- using namespace boost::python;
-
- class_<line_pattern_symbolizer, bases<symbolizer_base> >("LinePatternSymbolizer",
- init<> ("Default LinePatternSymbolizer"))
- .def("__hash__",hash_impl_2<line_pattern_symbolizer>)
- ;
-}
-
-void export_debug_symbolizer()
-{
- using namespace boost::python;
-
- mapnik::enumeration_<mapnik::debug_symbolizer_mode_e>("debug_symbolizer_mode")
- .value("COLLISION",mapnik::DEBUG_SYM_MODE_COLLISION)
- .value("VERTEX",mapnik::DEBUG_SYM_MODE_VERTEX)
- ;
-
- class_<debug_symbolizer, bases<symbolizer_base> >("DebugSymbolizer",
- init<>("Default debug Symbolizer"))
- .def("__hash__",hash_impl_2<debug_symbolizer>)
- ;
-}
-
-void export_building_symbolizer()
-{
- using namespace boost::python;
-
- class_<building_symbolizer, bases<symbolizer_base> >("BuildingSymbolizer",
- init<>("Default BuildingSymbolizer"))
- .def("__hash__",hash_impl_2<building_symbolizer>)
- ;
-
-}
-
-namespace {
-
-void group_symbolizer_properties_set_layout_simple(mapnik::group_symbolizer_properties &p,
- mapnik::simple_row_layout &s)
-{
- p.set_layout(s);
-}
-
-void group_symbolizer_properties_set_layout_pair(mapnik::group_symbolizer_properties &p,
- mapnik::pair_layout &s)
-{
- p.set_layout(s);
-}
-
-std::shared_ptr<mapnik::group_rule> group_rule_construct1(mapnik::expression_ptr p)
-{
- return std::make_shared<mapnik::group_rule>(p, mapnik::expression_ptr());
-}
-
-} // anonymous namespace
-
-void export_group_symbolizer()
-{
- using namespace boost::python;
- using mapnik::group_rule;
- using mapnik::simple_row_layout;
- using mapnik::pair_layout;
- using mapnik::group_symbolizer_properties;
-
- class_<group_rule, std::shared_ptr<group_rule> >("GroupRule",
- init<expression_ptr, expression_ptr>())
- .def("__init__", boost::python::make_constructor(group_rule_construct1))
- .def("append", &group_rule::append)
- .def("set_filter", &group_rule::set_filter)
- .def("set_repeat_key", &group_rule::set_repeat_key)
- ;
-
- class_<simple_row_layout>("SimpleRowLayout")
- .def("item_margin", &simple_row_layout::get_item_margin)
- .def("set_item_margin", &simple_row_layout::set_item_margin)
- ;
-
- class_<pair_layout>("PairLayout")
- .def("item_margin", &simple_row_layout::get_item_margin)
- .def("set_item_margin", &simple_row_layout::set_item_margin)
- .def("max_difference", &pair_layout::get_max_difference)
- .def("set_max_difference", &pair_layout::set_max_difference)
- ;
-
- class_<group_symbolizer_properties, std::shared_ptr<group_symbolizer_properties> >("GroupSymbolizerProperties")
- .def("add_rule", &group_symbolizer_properties::add_rule)
- .def("set_layout", &group_symbolizer_properties_set_layout_simple)
- .def("set_layout", &group_symbolizer_properties_set_layout_pair)
- ;
-
- class_<group_symbolizer, bases<symbolizer_base> >("GroupSymbolizer",
- init<>("Default GroupSymbolizer"))
- .def("__hash__",hash_impl_2<group_symbolizer>)
- ;
-
-}
diff --git a/bindings/python/mapnik_text_placement.cpp b/bindings/python/mapnik_text_placement.cpp
deleted file mode 100644
index 8ab723e..0000000
--- a/bindings/python/mapnik_text_placement.cpp
+++ /dev/null
@@ -1,587 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2012 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#include "boost_std_shared_shim.hpp"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#include <boost/python/stl_iterator.hpp>
-#include <boost/noncopyable.hpp>
-#pragma GCC diagnostic pop
-
-#include <mapnik/text/text_properties.hpp>
-#include <mapnik/text/placements/simple.hpp>
-#include <mapnik/text/placements/list.hpp>
-#include <mapnik/text/formatting/text.hpp>
-#include <mapnik/text/formatting/list.hpp>
-#include <mapnik/text/formatting/format.hpp>
-#include <mapnik/text/formatting/layout.hpp>
-#include <mapnik/text/text_layout.hpp>
-#include <mapnik/symbolizer.hpp>
-
-#include "mapnik_enumeration.hpp"
-#include "mapnik_threads.hpp"
-
-using namespace mapnik;
-
-/* Notes:
- Overriding functions in inherited classes:
- boost.python documentation doesn't really tell you how to do it.
- But this helps:
- http://www.gamedev.net/topic/446225-inheritance-in-boostpython/
-
- register_ptr_to_python is required for wrapped classes, but not for unwrapped.
-
- Functions don't have to be members of the class, but can also be
- normal functions taking a ref to the class as first parameter.
-*/
-
-namespace {
-
-using namespace boost::python;
-
-// This class works around a feature in boost python.
-// See http://osdir.com/ml/python.c++/2003-11/msg00158.html
-
-template <typename T,
- typename X1 = boost::python::detail::not_specified,
- typename X2 = boost::python::detail::not_specified,
- typename X3 = boost::python::detail::not_specified>
-class class_with_converter : public boost::python::class_<T, X1, X2, X3>
-{
-public:
- using self = class_with_converter<T,X1,X2,X3>;
- // Construct with the class name, with or without docstring, and default __init__() function
- class_with_converter(char const* name, char const* doc = 0) : boost::python::class_<T, X1, X2, X3>(name, doc) { }
-
- // Construct with class name, no docstring, and an uncallable __init__ function
- class_with_converter(char const* name, boost::python::no_init_t y) : boost::python::class_<T, X1, X2, X3>(name, y) { }
-
- // Construct with class name, docstring, and an uncallable __init__ function
- class_with_converter(char const* name, char const* doc, boost::python::no_init_t y) : boost::python::class_<T, X1, X2, X3>(name, doc, y) { }
-
- // Construct with class name and init<> function
- template <class DerivedT> class_with_converter(char const* name, boost::python::init_base<DerivedT> const& i)
- : boost::python::class_<T, X1, X2, X3>(name, i) { }
-
- // Construct with class name, docstring and init<> function
- template <class DerivedT>
- inline class_with_converter(char const* name, char const* doc, boost::python::init_base<DerivedT> const& i)
- : boost::python::class_<T, X1, X2, X3>(name, doc, i) { }
-
- template <class D>
- self& def_readwrite_convert(char const* name, D const& d, char const* /*doc*/=0)
- {
- this->add_property(name,
- boost::python::make_getter(d, boost::python::return_value_policy<boost::python::return_by_value>()),
- boost::python::make_setter(d, boost::python::default_call_policies()));
- return *this;
- }
-};
-
-/*
-boost::python::tuple get_displacement(text_layout_properties const& t)
-{
- return boost::python::make_tuple(0.0,0.0);// FIXME t.displacement.x, t.displacement.y);
-}
-
-void set_displacement(text_layout_properties &t, boost::python::tuple arg)
-{
- if (len(arg) != 2)
- {
- PyErr_SetObject(PyExc_ValueError,
- ("expected 2-item tuple in call to set_displacement; got %s"
- % arg).ptr()
- );
- throw_error_already_set();
- }
-
- //double x = extract<double>(arg[0]);
- //double y = extract<double>(arg[1]);
- //t.displacement.set(x, y); FIXME
-}
-
-
-struct NodeWrap
- : formatting::node, wrapper<formatting::node>
-{
- NodeWrap()
- : formatting::node(), wrapper<formatting::node>() {}
-
- void apply(evaluated_format_properties_ptr p, feature_impl const& feature, attributes const& vars, text_layout &output) const
- {
- python_block_auto_unblock b;
- this->get_override("apply")(ptr(&p), ptr(&feature), ptr(&vars), ptr(&output));
- }
-
- virtual void add_expressions(expression_set &output) const
- {
- override o = this->get_override("add_expressions");
- if (o)
- {
- python_block_auto_unblock b;
- o(ptr(&output));
- } else
- {
- formatting::node::add_expressions(output);
- }
- }
-
- void default_add_expressions(expression_set &output) const
- {
- formatting::node::add_expressions(output);
- }
-};
-*/
-/*
-struct TextNodeWrap
- : formatting::text_node, wrapper<formatting::text_node>
-{
- TextNodeWrap(expression_ptr expr)
- : formatting::text_node(expr), wrapper<formatting::text_node>() {}
-
- TextNodeWrap(std::string expr_text)
- : formatting::text_node(expr_text), wrapper<formatting::text_node>() {}
-
- virtual void apply(evaluated_format_properties_ptr p, feature_impl const& feature, attributes const& vars, text_layout &output) const
- {
- if(override o = this->get_override("apply"))
- {
- python_block_auto_unblock b;
- o(ptr(&p), ptr(&feature), ptr(&vars), ptr(&output));
- }
- else
- {
- formatting::text_node::apply(p, feature, vars, output);
- }
- }
-
- void default_apply(evaluated_format_properties_ptr p, feature_impl const& feature, attributes const& vars, text_layout &output) const
- {
- formatting::text_node::apply(p, feature, vars, output);
- }
-};
-*/
-/*
-struct FormatNodeWrap
- : formatting::format_node, wrapper<formatting::format_node>
-{
- virtual void apply(evaluated_format_properties_ptr p, feature_impl const& feature, attributes const& vars, text_layout &output) const
- {
- if(override o = this->get_override("apply"))
- {
- python_block_auto_unblock b;
- o(ptr(&p), ptr(&feature), ptr(&vars), ptr(&output));
- }
- else
- {
- formatting::format_node::apply(p, feature, vars ,output);
- }
- }
-
- void default_apply(evaluated_format_properties_ptr p, feature_impl const& feature, attributes const& vars, text_layout &output) const
- {
- formatting::format_node::apply(p, feature, vars, output);
- }
-};
-
-struct ExprFormatWrap: formatting::expression_format, wrapper<formatting::expression_format>
-{
- virtual void apply(evaluated_format_properties_ptr p, feature_impl const& feature, attributes const& vars, text_layout &output) const
- {
- if(override o = this->get_override("apply"))
- {
- python_block_auto_unblock b;
- o(ptr(&p), ptr(&feature), ptr(&vars), ptr(&output));
- }
- else
- {
- formatting::expression_format::apply(p, feature, vars, output);
- }
- }
-
- void default_apply(evaluated_format_properties_ptr p, feature_impl const& feature, attributes const& vars, text_layout &output) const
- {
- formatting::expression_format::apply(p, feature, vars, output);
- }
-};
-
-struct LayoutNodeWrap: formatting::layout_node, wrapper<formatting::layout_node>
-{
- virtual void apply(evaluated_format_properties_ptr p, feature_impl const& feature, attributes const& vars, text_layout &output) const
- {
- if(override o = this->get_override("apply"))
- {
- python_block_auto_unblock b;
- o(ptr(&p), ptr(&feature), ptr(&vars), ptr(&output));
- }
- else
- {
- formatting::layout_node::apply(p, feature, vars, output);
- }
- }
-
- void default_apply(evaluated_format_properties_ptr p, feature_impl const& feature, attributes const& vars, text_layout &output) const
- {
- formatting::layout_node::apply(p, feature, vars, output);
- }
-};
-
-struct ListNodeWrap: formatting::list_node, wrapper<formatting::list_node>
-{
- //Default constructor
- ListNodeWrap() : formatting::list_node(), wrapper<formatting::list_node>()
- {
- }
-
- //Special constructor: Takes a python sequence as its argument
- ListNodeWrap(object l) : formatting::list_node(), wrapper<formatting::list_node>()
- {
- stl_input_iterator<formatting::node_ptr> begin(l), end;
- while (begin != end)
- {
- children_.push_back(*begin);
- ++begin;
- }
- }
-
- // TODO: Add constructor taking variable number of arguments.
- http://wiki.python.org/moin/boost.python/HowTo#A.22Raw.22_function
-
- virtual void apply(evaluated_format_properties_ptr p, feature_impl const& feature, attributes const& vars, text_layout &output) const
- {
- if(override o = this->get_override("apply"))
- {
- python_block_auto_unblock b;
- o(ptr(&p), ptr(&feature), ptr(&vars), ptr(&output));
- }
- else
- {
- formatting::list_node::apply(p, feature, vars, output);
- }
- }
-
- void default_apply(evaluated_format_properties_ptr p, feature_impl const& feature, attributes const& vars, text_layout &output) const
- {
- formatting::list_node::apply(p, feature, vars, output);
- }
-
- inline void IndexError(){
- PyErr_SetString(PyExc_IndexError, "Index out of range");
- throw_error_already_set();
- }
-
- unsigned get_length()
- {
- return children_.size();
- }
-
- formatting::node_ptr get_item(int i)
- {
- if (i < 0) i+= children_.size();
- if (i < static_cast<int>(children_.size())) return children_[i];
- IndexError();
- return formatting::node_ptr(); //Avoid compiler warning
- }
-
- void set_item(int i, formatting::node_ptr ptr)
- {
- if (i < 0) i+= children_.size();
- if (i < static_cast<int>(children_.size())) children_[i] = ptr;
- IndexError();
- }
-
- void append(formatting::node_ptr ptr)
- {
- children_.push_back(ptr);
- }
-};
-*/
-/*
-struct TextPlacementsWrap: text_placements, wrapper<text_placements>
-{
- text_placement_info_ptr get_placement_info(double scale_factor_) const
- {
- python_block_auto_unblock b;
- //return this->get_override("get_placement_info")();
- return text_placement_info_ptr();
- }
-};
-
-struct TextPlacementInfoWrap: text_placement_info, wrapper<text_placement_info>
-{
- TextPlacementInfoWrap(text_placements const* parent,
- double scale_factor_)
- : text_placement_info(parent, scale_factor_)
- {
-
- }
-
- bool next()
- {
- python_block_auto_unblock b;
- return this->get_override("next")();
- }
-};
-
-void insert_expression(expression_set *set, expression_ptr p)
-{
- set->insert(p);
-}
-
-
-evaluated_format_properties_ptr get_format(text_symbolizer const& sym)
-{
- return sym.get_placement_options()->defaults.format;
-}
-
-void set_format(text_symbolizer const& sym, evaluated_format_properties_ptr format)
-{
- sym.get_placement_options()->defaults.format = format;
-}
-
-text_symbolizer_properties & get_properties(text_symbolizer const& sym)
-{
- return sym.get_placement_options()->defaults;
-}
-
-void set_properties(text_symbolizer const& sym, text_symbolizer_properties & defaults)
-{
- sym.get_placement_options()->defaults = defaults;
-}
-*/
-}
-
-void export_text_placement()
-{
- /*
- using namespace boost::python;
-
- enumeration_<label_placement_e>("label_placement")
- .value("LINE_PLACEMENT",LINE_PLACEMENT)
- .value("POINT_PLACEMENT",POINT_PLACEMENT)
- .value("VERTEX_PLACEMENT",VERTEX_PLACEMENT)
- .value("INTERIOR_PLACEMENT",INTERIOR_PLACEMENT)
- ;
- enumeration_<vertical_alignment_e>("vertical_alignment")
- .value("TOP",V_TOP)
- .value("MIDDLE",V_MIDDLE)
- .value("BOTTOM",V_BOTTOM)
- .value("AUTO",V_AUTO)
- ;
-
- enumeration_<horizontal_alignment_e>("horizontal_alignment")
- .value("LEFT",H_LEFT)
- .value("MIDDLE",H_MIDDLE)
- .value("RIGHT",H_RIGHT)
- .value("AUTO",H_AUTO)
- ;
-
- enumeration_<justify_alignment_e>("justify_alignment")
- .value("LEFT",J_LEFT)
- .value("MIDDLE",J_MIDDLE)
- .value("RIGHT",J_RIGHT)
- .value("AUTO", J_AUTO)
- ;
-
- enumeration_<text_transform_e>("text_transform")
- .value("NONE",NONE)
- .value("UPPERCASE",UPPERCASE)
- .value("LOWERCASE",LOWERCASE)
- .value("CAPITALIZE",CAPITALIZE)
- ;
-
- enumeration_<halo_rasterizer_e>("halo_rasterizer")
- .value("FULL",HALO_RASTERIZER_FULL)
- .value("FAST",HALO_RASTERIZER_FAST)
- ;
- */
- class_<text_symbolizer>("TextSymbolizer",
- init<>())
- ;
- /*
-
- class_with_converter<text_symbolizer_properties>
- ("TextSymbolizerProperties")
- .def_readwrite_convert("label_placement", &text_symbolizer_properties::label_placement)
- .def_readwrite_convert("upright", &text_symbolizer_properties::upright)
- .def_readwrite("label_spacing", &text_symbolizer_properties::label_spacing)
- .def_readwrite("label_position_tolerance", &text_symbolizer_properties::label_position_tolerance)
- .def_readwrite("avoid_edges", &text_symbolizer_properties::avoid_edges)
- .def_readwrite("margin", &text_symbolizer_properties::margin)
- .def_readwrite("repeat_distance", &text_symbolizer_properties::repeat_distance)
- .def_readwrite("minimum_distance", &text_symbolizer_properties::minimum_distance)
- .def_readwrite("minimum_padding", &text_symbolizer_properties::minimum_padding)
- .def_readwrite("minimum_path_length", &text_symbolizer_properties::minimum_path_length)
- .def_readwrite("maximum_angle_char_delta", &text_symbolizer_properties::max_char_angle_delta)
- .def_readwrite("allow_overlap", &text_symbolizer_properties::allow_overlap)
- .def_readwrite("largest_bbox_only", &text_symbolizer_properties::largest_bbox_only)
- .def_readwrite("layout_defaults", &text_symbolizer_properties::layout_defaults)
- //.def_readwrite("format", &text_symbolizer_properties::format)
- .add_property ("format_tree",
- &text_symbolizer_properties::format_tree,
- &text_symbolizer_properties::set_format_tree);
- //from_xml, to_xml operate on mapnik's internal XML tree and don't make sense in python.
- // add_expressions isn't useful in python either. The result is only needed by
- // attribute_collector (which isn't exposed in python) and
- // it just calls add_expressions of the associated formatting tree.
- // set_old_style expression is just a compatibility wrapper and doesn't need to be exposed in python.
- ;
-
- class_with_converter<text_layout_properties>
- ("TextLayoutProperties")
- .def_readwrite_convert("horizontal_alignment", &text_layout_properties::halign)
- .def_readwrite_convert("justify_alignment", &text_layout_properties::jalign)
- .def_readwrite_convert("vertical_alignment", &text_layout_properties::valign)
- .def_readwrite("text_ratio", &text_layout_properties::text_ratio)
- .def_readwrite("wrap_width", &text_layout_properties::wrap_width)
- .def_readwrite("wrap_before", &text_layout_properties::wrap_before)
- .def_readwrite("orientation", &text_layout_properties::orientation)
- .def_readwrite("rotate_displacement", &text_layout_properties::rotate_displacement)
- .add_property("displacement", &get_displacement, &set_displacement);
-
- class_with_converter<detail::evaluated_format_properties>
- ("CharProperties")
- .def_readwrite_convert("text_transform", &detail::evaluated_format_properties::text_transform)
- .def_readwrite_convert("fontset", &detail::evaluated_format_properties::fontset)
- .def(init<detail::evaluated_format_properties const&>()) //Copy constructor
- .def_readwrite("face_name", &detail::evaluated_format_properties::face_name)
- .def_readwrite("text_size", &detail::evaluated_format_properties::text_size)
- .def_readwrite("character_spacing", &detail::evaluated_format_properties::character_spacing)
- .def_readwrite("line_spacing", &detail::evaluated_format_properties::line_spacing)
- .def_readwrite("text_opacity", &detail::evaluated_format_properties::text_opacity)
- .def_readwrite("fill", &detail::evaluated_format_properties::fill)
- .def_readwrite("halo_fill", &detail::evaluated_format_properties::halo_fill)
- .def_readwrite("halo_radius", &evaluated_format_properties::halo_radius)
- //from_xml, to_xml operate on mapnik's internal XML tree and don't make sense in python.
- ;
- class_<TextPlacementsWrap,
- std::shared_ptr<TextPlacementsWrap>,
- boost::noncopyable>
- ("TextPlacements")
- .def_readwrite("defaults", &text_placements::defaults)
- //.def("get_placement_info", pure_virtual(&text_placements::get_placement_info))
- // TODO: add_expressions()
- ;
- register_ptr_to_python<std::shared_ptr<text_placements> >();
-
- class_<TextPlacementInfoWrap,
- std::shared_ptr<TextPlacementInfoWrap>,
- boost::noncopyable>
- ("TextPlacementInfo",
- init<text_placements const*, double>())
- .def("next", pure_virtual(&text_placement_info::next))
- .def_readwrite("properties", &text_placement_info::properties)
- .def_readwrite("scale_factor", &text_placement_info::scale_factor)
- ;
- register_ptr_to_python<std::shared_ptr<text_placement_info> >();
-
-
- class_<expression_set,std::shared_ptr<expression_set>,
- boost::noncopyable>("ExpressionSet")
- .def("insert", &insert_expression);
- ;
-
- class_<formatting::node,std::shared_ptr<formatting::node>,
- boost::noncopyable>("FormattingNode")
- .def("apply", pure_virtual(&formatting::node::apply))
- .def("add_expressions", pure_virtual(&formatting::node::add_expressions))
- .def("to_xml", pure_virtual(&formatting::node::to_xml))
- ;
-
- register_ptr_to_python<std::shared_ptr<formatting::node> >();
-
- class_<formatting::text_node,
- std::shared_ptr<formatting::text_node>,
- bases<formatting::node>,boost::noncopyable>("FormattingText", init<expression_ptr>())
- .def(init<std::string>())
- .def("apply", &formatting::text_node::apply)//, &TextNodeWrap::default_apply)
- .add_property("text",&formatting::text_node::get_text, &formatting::text_node::set_text)
- ;
-
- register_ptr_to_python<std::shared_ptr<formatting::text_node> >();
-
- class_with_converter<FormatNodeWrap,
- std::shared_ptr<FormatNodeWrap>,
- bases<formatting::node>,
- boost::noncopyable>
- ("FormattingFormat")
- .def_readwrite_convert("text_size", &formatting::format_node::text_size)
- .def_readwrite_convert("face_name", &formatting::format_node::face_name)
- .def_readwrite_convert("character_spacing", &formatting::format_node::character_spacing)
- .def_readwrite_convert("line_spacing", &formatting::format_node::line_spacing)
- .def_readwrite_convert("text_opacity", &formatting::format_node::text_opacity)
- .def_readwrite_convert("text_transform", &formatting::format_node::text_transform)
- .def_readwrite_convert("fill", &formatting::format_node::fill)
- .def_readwrite_convert("halo_fill", &formatting::format_node::halo_fill)
- .def_readwrite_convert("halo_radius", &formatting::format_node::halo_radius)
- .def("apply", &formatting::format_node::apply, &FormatNodeWrap::default_apply)
- .add_property("child",
- &formatting::format_node::get_child,
- &formatting::format_node::set_child)
- ;
- register_ptr_to_python<std::shared_ptr<formatting::format_node> >();
-
- class_<ListNodeWrap,
- std::shared_ptr<ListNodeWrap>,
- bases<formatting::node>,
- boost::noncopyable>
- ("FormattingList", init<>())
- .def(init<list>())
- .def("append", &formatting::list_node::push_back)
- .def("apply", &formatting::list_node::apply, &ListNodeWrap::default_apply)
- .def("__len__", &ListNodeWrap::get_length)
- .def("__getitem__", &ListNodeWrap::get_item)
- .def("__setitem__", &ListNodeWrap::set_item)
- .def("append", &ListNodeWrap::append)
- ;
-
- register_ptr_to_python<std::shared_ptr<formatting::list_node> >();
-
- class_<ExprFormatWrap,
- std::shared_ptr<ExprFormatWrap>,
- bases<formatting::node>,
- boost::noncopyable>
- ("FormattingExpressionFormat")
- .def_readwrite("text_size", &formatting::expression_format::text_size)
- .def_readwrite("face_name", &formatting::expression_format::face_name)
- .def_readwrite("character_spacing", &formatting::expression_format::character_spacing)
- .def_readwrite("line_spacing", &formatting::expression_format::line_spacing)
- .def_readwrite("text_opacity", &formatting::expression_format::text_opacity)
- .def_readwrite("fill", &formatting::expression_format::fill)
- .def_readwrite("halo_fill", &formatting::expression_format::halo_fill)
- .def_readwrite("halo_radius", &formatting::expression_format::halo_radius)
- .def("apply", &formatting::expression_format::apply, &ExprFormatWrap::default_apply)
- .add_property("child",
- &formatting::expression_format::get_child,
- &formatting::expression_format::set_child)
- ;
- register_ptr_to_python<std::shared_ptr<formatting::expression_format> >();
-*/
- //TODO: registry
-}
diff --git a/bindings/python/mapnik_threads.hpp b/bindings/python/mapnik_threads.hpp
deleted file mode 100644
index 930ff37..0000000
--- a/bindings/python/mapnik_threads.hpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2012 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-#ifndef MAPNIK_THREADS_HPP
-#define MAPNIK_THREADS_HPP
-
-#include <boost/thread/tss.hpp> // for thread_specific_ptr
-#include <Python.h>
-
-namespace mapnik {
-class python_thread
-{
- /* Docs:
- http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock
- */
-public:
- static void unblock()
- {
-#ifdef MAPNIK_DEBUG
- if (state.get())
- {
- std::cerr << "ERROR: Python threads are already unblocked. "
- "Unblocking again will loose the current state and "
- "might crash later. Aborting!\n";
- abort(); //This is a serious error and can't be handled in any other sane way
- }
-#endif
- PyThreadState *_save = 0; //Name defined by python
- Py_UNBLOCK_THREADS;
- state.reset(_save);
-#ifdef MAPNIK_DEBUG
- if (!_save) {
- thread_support = false;
- }
-#endif
- }
-
- static void block()
- {
-#ifdef MAPNIK_DEBUG
- if (thread_support && !state.get())
- {
- std::cerr << "ERROR: Trying to restore python thread state, "
- "but no state is saved. Can't continue and also "
- "can't raise an exception because the python "
- "interpreter might be non-function. Aborting!\n";
- abort();
- }
-#endif
- PyThreadState *_save = state.release(); //Name defined by python
- Py_BLOCK_THREADS;
- }
-
-private:
- static boost::thread_specific_ptr<PyThreadState> state;
-#ifdef MAPNIK_DEBUG
- static bool thread_support;
-#endif
-};
-
-class python_block_auto_unblock
-{
-public:
- python_block_auto_unblock()
- {
- python_thread::block();
- }
-
- ~python_block_auto_unblock()
- {
- python_thread::unblock();
- }
-};
-
-class python_unblock_auto_block
-{
-public:
- python_unblock_auto_block()
- {
- python_thread::unblock();
- }
-
- ~python_unblock_auto_block()
- {
- python_thread::block();
- }
-};
-
-} //namespace
-
-#endif // MAPNIK_THREADS_HPP
diff --git a/bindings/python/mapnik_value_converter.hpp b/bindings/python/mapnik_value_converter.hpp
deleted file mode 100644
index 42b9ba4..0000000
--- a/bindings/python/mapnik_value_converter.hpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2011 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-#ifndef MAPNIK_PYTHON_BINDING_VALUE_CONVERTER_INCLUDED
-#define MAPNIK_PYTHON_BINDING_VALUE_CONVERTER_INCLUDED
-
-// mapnik
-#include <mapnik/value.hpp>
-#include <mapnik/util/variant.hpp>
-// boost
-#include <boost/python.hpp>
-#include <boost/implicit_cast.hpp>
-
-namespace boost { namespace python {
-
- struct value_converter : public mapnik::util::static_visitor<PyObject*>
- {
- PyObject * operator() (mapnik::value_integer val) const
- {
- return ::PyLong_FromLongLong(val);
- }
-
- PyObject * operator() (mapnik::value_double val) const
- {
- return ::PyFloat_FromDouble(val);
- }
-
- PyObject * operator() (mapnik::value_bool val) const
- {
- return ::PyBool_FromLong(val);
- }
-
- PyObject * operator() (std::string const& s) const
- {
- return ::PyUnicode_DecodeUTF8(s.c_str(),implicit_cast<ssize_t>(s.length()),0);
- }
-
- PyObject * operator() (mapnik::value_unicode_string const& s) const
- {
- std::string buffer;
- mapnik::to_utf8(s,buffer);
- return ::PyUnicode_DecodeUTF8(buffer.c_str(),implicit_cast<ssize_t>(buffer.length()),0);
- }
-
- PyObject * operator() (mapnik::value_null const& /*s*/) const
- {
- Py_RETURN_NONE;
- }
- };
-
-
- struct mapnik_value_to_python
- {
- static PyObject* convert(mapnik::value const& v)
- {
- return mapnik::util::apply_visitor(value_converter(),v);
- }
-
- };
-
- struct mapnik_param_to_python
- {
- static PyObject* convert(mapnik::value_holder const& v)
- {
- return mapnik::util::apply_visitor(value_converter(),v);
- }
- };
-
-
-}}
-
-#endif // MAPNIK_PYTHON_BINDING_VALUE_CONVERTER_INCLUDED
diff --git a/bindings/python/mapnik_view_transform.cpp b/bindings/python/mapnik_view_transform.cpp
deleted file mode 100644
index d2194b1..0000000
--- a/bindings/python/mapnik_view_transform.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2009 Artem Pavlenko, Jean-Francois Doyon
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <mapnik/config.hpp>
-
-// boost
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/view_transform.hpp>
-
-using mapnik::view_transform;
-
-struct view_transform_pickle_suite : boost::python::pickle_suite
-{
- static boost::python::tuple
- getinitargs(const view_transform& c)
- {
- using namespace boost::python;
- return boost::python::make_tuple(c.width(),c.height(),c.extent());
- }
-};
-
-namespace {
-
-mapnik::coord2d forward_point(mapnik::view_transform const& t, mapnik::coord2d const& in)
-{
- mapnik::coord2d out(in);
- t.forward(out);
- return out;
-}
-
-mapnik::coord2d backward_point(mapnik::view_transform const& t, mapnik::coord2d const& in)
-{
- mapnik::coord2d out(in);
- t.backward(out);
- return out;
-}
-
-mapnik::box2d<double> forward_envelope(mapnik::view_transform const& t, mapnik::box2d<double> const& in)
-{
- return t.forward(in);
-}
-
-mapnik::box2d<double> backward_envelope(mapnik::view_transform const& t, mapnik::box2d<double> const& in)
-{
- return t.backward(in);
-}
-}
-
-void export_view_transform()
-{
- using namespace boost::python;
- using mapnik::box2d;
- using mapnik::coord2d;
-
- class_<view_transform>("ViewTransform",init<int,int,box2d<double> const& > (
- "Create a ViewTransform with a width and height as integers and extent"))
- .def_pickle(view_transform_pickle_suite())
- .def("forward", forward_point)
- .def("backward",backward_point)
- .def("forward", forward_envelope)
- .def("backward",backward_envelope)
- .def("scale_x",&view_transform::scale_x)
- .def("scale_y",&view_transform::scale_y)
- ;
-}
diff --git a/bindings/python/python_grid_utils.cpp b/bindings/python/python_grid_utils.cpp
deleted file mode 100644
index cbb9ad1..0000000
--- a/bindings/python/python_grid_utils.cpp
+++ /dev/null
@@ -1,405 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2011 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#if defined(GRID_RENDERER)
-
-#include <mapnik/config.hpp>
-
-// boost
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-
-#include <boost/python.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/map.hpp>
-#include <mapnik/layer.hpp>
-#include <mapnik/debug.hpp>
-#include <mapnik/grid/grid_renderer.hpp>
-#include <mapnik/grid/grid.hpp>
-#include <mapnik/grid/grid_util.hpp>
-#include <mapnik/grid/grid_view.hpp>
-#include <mapnik/value_error.hpp>
-#include <mapnik/feature.hpp>
-#include <mapnik/feature_kv_iterator.hpp>
-#include "python_grid_utils.hpp"
-
-// stl
-#include <stdexcept>
-
-namespace mapnik {
-
-
-template <typename T>
-void grid2utf(T const& grid_type,
- boost::python::list& l,
- std::vector<typename T::lookup_type>& key_order)
-{
- using keys_type = std::map< typename T::lookup_type, typename T::value_type>;
- using keys_iterator = typename keys_type::iterator;
-
- typename T::data_type const& data = grid_type.data();
- typename T::feature_key_type const& feature_keys = grid_type.get_feature_keys();
- typename T::feature_key_type::const_iterator feature_pos;
-
- keys_type keys;
- // start counting at utf8 codepoint 32, aka space character
- std::uint16_t codepoint = 32;
-
- unsigned array_size = data.width();
- for (unsigned y = 0; y < data.height(); ++y)
- {
- std::uint16_t idx = 0;
- const std::unique_ptr<Py_UNICODE[]> line(new Py_UNICODE[array_size]);
- typename T::value_type const* row = data.getRow(y);
- for (unsigned x = 0; x < data.width(); ++x)
- {
- typename T::value_type feature_id = row[x];
- feature_pos = feature_keys.find(feature_id);
- if (feature_pos != feature_keys.end())
- {
- mapnik::grid::lookup_type val = feature_pos->second;
- keys_iterator key_pos = keys.find(val);
- if (key_pos == keys.end())
- {
- // Create a new entry for this key. Skip the codepoints that
- // can't be encoded directly in JSON.
- if (codepoint == 34) ++codepoint; // Skip "
- else if (codepoint == 92) ++codepoint; // Skip backslash
- if (feature_id == mapnik::grid::base_mask)
- {
- keys[""] = codepoint;
- key_order.push_back("");
- }
- else
- {
- keys[val] = codepoint;
- key_order.push_back(val);
- }
- line[idx++] = static_cast<Py_UNICODE>(codepoint);
- ++codepoint;
- }
- else
- {
- line[idx++] = static_cast<Py_UNICODE>(key_pos->second);
- }
- }
- // else, shouldn't get here...
- }
- l.append(boost::python::object(
- boost::python::handle<>(
- PyUnicode_FromUnicode(line.get(), array_size))));
- }
-}
-
-
-template <typename T>
-void grid2utf(T const& grid_type,
- boost::python::list& l,
- std::vector<typename T::lookup_type>& key_order,
- unsigned int resolution)
-{
- using keys_type = std::map< typename T::lookup_type, typename T::value_type>;
- using keys_iterator = typename keys_type::iterator;
-
- typename T::feature_key_type const& feature_keys = grid_type.get_feature_keys();
- typename T::feature_key_type::const_iterator feature_pos;
-
- keys_type keys;
- // start counting at utf8 codepoint 32, aka space character
- std::uint16_t codepoint = 32;
-
- unsigned array_size = std::ceil(grid_type.width()/static_cast<float>(resolution));
- for (unsigned y = 0; y < grid_type.height(); y=y+resolution)
- {
- std::uint16_t idx = 0;
- const std::unique_ptr<Py_UNICODE[]> line(new Py_UNICODE[array_size]);
- mapnik::grid::value_type const* row = grid_type.getRow(y);
- for (unsigned x = 0; x < grid_type.width(); x=x+resolution)
- {
- typename T::value_type feature_id = row[x];
- feature_pos = feature_keys.find(feature_id);
- if (feature_pos != feature_keys.end())
- {
- mapnik::grid::lookup_type val = feature_pos->second;
- keys_iterator key_pos = keys.find(val);
- if (key_pos == keys.end())
- {
- // Create a new entry for this key. Skip the codepoints that
- // can't be encoded directly in JSON.
- if (codepoint == 34) ++codepoint; // Skip "
- else if (codepoint == 92) ++codepoint; // Skip backslash
- if (feature_id == mapnik::grid::base_mask)
- {
- keys[""] = codepoint;
- key_order.push_back("");
- }
- else
- {
- keys[val] = codepoint;
- key_order.push_back(val);
- }
- line[idx++] = static_cast<Py_UNICODE>(codepoint);
- ++codepoint;
- }
- else
- {
- line[idx++] = static_cast<Py_UNICODE>(key_pos->second);
- }
- }
- // else, shouldn't get here...
- }
- l.append(boost::python::object(
- boost::python::handle<>(
- PyUnicode_FromUnicode(line.get(), array_size))));
- }
-}
-
-
-template <typename T>
-void grid2utf2(T const& grid_type,
- boost::python::list& l,
- std::vector<typename T::lookup_type>& key_order,
- unsigned int resolution)
-{
- using keys_type = std::map< typename T::lookup_type, typename T::value_type>;
- using keys_iterator = typename keys_type::iterator;
-
- typename T::data_type const& data = grid_type.data();
- typename T::feature_key_type const& feature_keys = grid_type.get_feature_keys();
- typename T::feature_key_type::const_iterator feature_pos;
-
- keys_type keys;
- // start counting at utf8 codepoint 32, aka space character
- uint16_t codepoint = 32;
-
- mapnik::grid::data_type target(data.width()/resolution,data.height()/resolution);
- mapnik::scale_grid(target,grid_type.data(),0.0,0.0);
-
- unsigned array_size = target.width();
- for (unsigned y = 0; y < target.height(); ++y)
- {
- uint16_t idx = 0;
- const std::unique_ptr<Py_UNICODE[]> line(new Py_UNICODE[array_size]);
- mapnik::grid::value_type * row = target.getRow(y);
- unsigned x;
- for (x = 0; x < target.width(); ++x)
- {
- feature_pos = feature_keys.find(row[x]);
- if (feature_pos != feature_keys.end())
- {
- mapnik::grid::lookup_type val = feature_pos->second;
- keys_iterator key_pos = keys.find(val);
- if (key_pos == keys.end())
- {
- // Create a new entry for this key. Skip the codepoints that
- // can't be encoded directly in JSON.
- if (codepoint == 34) ++codepoint; // Skip "
- else if (codepoint == 92) ++codepoint; // Skip backslash
- keys[val] = codepoint;
- key_order.push_back(val);
- line[idx++] = static_cast<Py_UNICODE>(codepoint);
- ++codepoint;
- }
- else
- {
- line[idx++] = static_cast<Py_UNICODE>(key_pos->second);
- }
- }
- // else, shouldn't get here...
- }
- l.append(boost::python::object(
- boost::python::handle<>(
- PyUnicode_FromUnicode(line.get(), array_size))));
- }
-}
-
-
-template <typename T>
-void write_features(T const& grid_type,
- boost::python::dict& feature_data,
- std::vector<typename T::lookup_type> const& key_order)
-{
- typename T::feature_type const& g_features = grid_type.get_grid_features();
- if (g_features.size() <= 0)
- {
- return;
- }
-
- std::set<std::string> const& attributes = grid_type.property_names();
- typename T::feature_type::const_iterator feat_end = g_features.end();
- for ( std::string const& key_item :key_order )
- {
- if (key_item.empty())
- {
- continue;
- }
-
- typename T::feature_type::const_iterator feat_itr = g_features.find(key_item);
- if (feat_itr == feat_end)
- {
- continue;
- }
-
- bool found = false;
- boost::python::dict feat;
- mapnik::feature_ptr feature = feat_itr->second;
- for ( std::string const& attr : attributes )
- {
- if (attr == "__id__")
- {
- feat[attr.c_str()] = feature->id();
- }
- else if (feature->has_key(attr))
- {
- found = true;
- feat[attr.c_str()] = feature->get(attr);
- }
- }
-
- if (found)
- {
- feature_data[feat_itr->first] = feat;
- }
- }
-}
-
-template <typename T>
-void grid_encode_utf(T const& grid_type,
- boost::python::dict & json,
- bool add_features,
- unsigned int resolution)
-{
- // convert buffer to utf and gather key order
- boost::python::list l;
- std::vector<typename T::lookup_type> key_order;
-
- if (resolution != 1) {
- // resample on the fly - faster, less accurate
- mapnik::grid2utf<T>(grid_type,l,key_order,resolution);
-
- // resample first - slower, more accurate
- //mapnik::grid2utf2<T>(grid_type,l,key_order,resolution);
- }
- else
- {
- mapnik::grid2utf<T>(grid_type,l,key_order);
- }
-
- // convert key order to proper python list
- boost::python::list keys_a;
- for ( typename T::lookup_type const& key_id : key_order )
- {
- keys_a.append(key_id);
- }
-
- // gather feature data
- boost::python::dict feature_data;
- if (add_features) {
- mapnik::write_features<T>(grid_type,feature_data,key_order);
- }
-
- json["grid"] = l;
- json["keys"] = keys_a;
- json["data"] = feature_data;
-
-}
-
-template <typename T>
-boost::python::dict grid_encode( T const& grid, std::string const& format, bool add_features, unsigned int resolution)
-{
- if (format == "utf") {
- boost::python::dict json;
- grid_encode_utf<T>(grid,json,add_features,resolution);
- return json;
- }
- else
- {
- std::stringstream s;
- s << "'utf' is currently the only supported encoding format.";
- throw mapnik::value_error(s.str());
- }
-}
-
-template boost::python::dict grid_encode( mapnik::grid const& grid, std::string const& format, bool add_features, unsigned int resolution);
-template boost::python::dict grid_encode( mapnik::grid_view const& grid, std::string const& format, bool add_features, unsigned int resolution);
-
-void render_layer_for_grid(mapnik::Map const& map,
- mapnik::grid & grid,
- unsigned layer_idx,
- boost::python::list const& fields,
- double scale_factor,
- unsigned offset_x,
- unsigned offset_y)
-{
- std::vector<mapnik::layer> const& layers = map.layers();
- std::size_t layer_num = layers.size();
- if (layer_idx >= layer_num) {
- std::ostringstream s;
- s << "Zero-based layer index '" << layer_idx << "' not valid, only '"
- << layer_num << "' layers are in map\n";
- throw std::runtime_error(s.str());
- }
-
- // convert python list to std::set
- boost::python::ssize_t num_fields = boost::python::len(fields);
- for(boost::python::ssize_t i=0; i<num_fields; i++) {
- boost::python::extract<std::string> name(fields[i]);
- if (name.check())
- {
- grid.add_property_name(name());
- }
- else
- {
- std::stringstream s;
- s << "list of field names must be strings";
- throw mapnik::value_error(s.str());
- }
- }
-
- // copy property names
- std::set<std::string> attributes = grid.property_names();
- // todo - make this a static constant
- std::string known_id_key = "__id__";
- if (attributes.find(known_id_key) != attributes.end())
- {
- attributes.erase(known_id_key);
- }
-
- std::string join_field = grid.get_key();
- if (known_id_key != join_field &&
- attributes.find(join_field) == attributes.end())
- {
- attributes.insert(join_field);
- }
-
- mapnik::grid_renderer<mapnik::grid> ren(map,grid,scale_factor,offset_x,offset_y);
- mapnik::layer const& layer = layers[layer_idx];
- ren.apply(layer,attributes);
-}
-
-}
-
-#endif
diff --git a/bindings/python/python_grid_utils.hpp b/bindings/python/python_grid_utils.hpp
deleted file mode 100644
index f608944..0000000
--- a/bindings/python/python_grid_utils.hpp
+++ /dev/null
@@ -1,79 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2011 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-#ifndef MAPNIK_PYTHON_BINDING_GRID_UTILS_INCLUDED
-#define MAPNIK_PYTHON_BINDING_GRID_UTILS_INCLUDED
-
-// boost
-#include <boost/python.hpp>
-
-// mapnik
-#include <mapnik/map.hpp>
-#include <mapnik/grid/grid.hpp>
-
-namespace mapnik {
-
-
-template <typename T>
-void grid2utf(T const& grid_type,
- boost::python::list& l,
- std::vector<typename T::lookup_type>& key_order);
-
-
-template <typename T>
-void grid2utf(T const& grid_type,
- boost::python::list& l,
- std::vector<typename T::lookup_type>& key_order,
- unsigned int resolution);
-
-
-template <typename T>
-void grid2utf2(T const& grid_type,
- boost::python::list& l,
- std::vector<typename T::lookup_type>& key_order,
- unsigned int resolution);
-
-
-template <typename T>
-void write_features(T const& grid_type,
- boost::python::dict& feature_data,
- std::vector<typename T::lookup_type> const& key_order);
-
-template <typename T>
-void grid_encode_utf(T const& grid_type,
- boost::python::dict & json,
- bool add_features,
- unsigned int resolution);
-
-template <typename T>
-boost::python::dict grid_encode( T const& grid, std::string const& format, bool add_features, unsigned int resolution);
-
-void render_layer_for_grid(const mapnik::Map& map,
- mapnik::grid& grid,
- unsigned layer_idx, // TODO - layer by name or index
- boost::python::list const& fields,
- double scale_factor,
- unsigned offset_x,
- unsigned offset_y);
-
-}
-
-#endif // MAPNIK_PYTHON_BINDING_GRID_UTILS_INCLUDED
diff --git a/bindings/python/python_optional.hpp b/bindings/python/python_optional.hpp
deleted file mode 100644
index 3270679..0000000
--- a/bindings/python/python_optional.hpp
+++ /dev/null
@@ -1,198 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2007 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#include <boost/optional/optional.hpp>
-#include <boost/python.hpp>
-
-#include <mapnik/noncopyable.hpp>
-
-// boost::optional<T> to/from converter from John Wiegley
-
-template <typename T, typename TfromPy>
-struct object_from_python
-{
- object_from_python() {
- boost::python::converter::registry::push_back
- (&TfromPy::convertible, &TfromPy::construct,
- boost::python::type_id<T>());
- }
-};
-
-template <typename T, typename TtoPy, typename TfromPy>
-struct register_python_conversion
-{
- register_python_conversion() {
- boost::python::to_python_converter<T, TtoPy>();
- object_from_python<T, TfromPy>();
- }
-};
-
-template <typename T>
-struct python_optional : public mapnik::noncopyable
-{
- struct optional_to_python
- {
- static PyObject * convert(const boost::optional<T>& value)
- {
- return (value ? boost::python::to_python_value<T>()(*value) :
- boost::python::detail::none());
- }
- };
-
- struct optional_from_python
- {
- static void * convertible(PyObject * source)
- {
- using namespace boost::python::converter;
-
- if (source == Py_None)
- return source;
-
- const registration& converters(registered<T>::converters);
-
- if (implicit_rvalue_convertible_from_python(source,
- converters)) {
- rvalue_from_python_stage1_data data =
- rvalue_from_python_stage1(source, converters);
- return rvalue_from_python_stage2(source, data, converters);
- }
- return 0;
- }
-
- static void construct(PyObject * source,
- boost::python::converter::rvalue_from_python_stage1_data * data)
- {
- using namespace boost::python::converter;
-
- void * const storage = ((rvalue_from_python_storage<T> *)
- data)->storage.bytes;
-
- if (data->convertible == source) // == None
- new (storage) boost::optional<T>(); // A Boost uninitialized value
- else
- new (storage) boost::optional<T>(*static_cast<T *>(data->convertible));
-
- data->convertible = storage;
- }
- };
-
- explicit python_optional()
- {
- register_python_conversion<boost::optional<T>,
- optional_to_python, optional_from_python>();
- }
-};
-
-// to/from boost::optional<bool>
-template <>
-struct python_optional<float> : public mapnik::noncopyable
-{
- struct optional_to_python
- {
- static PyObject * convert(const boost::optional<float>& value)
- {
- return (value ? PyFloat_FromDouble(*value) :
- boost::python::detail::none());
- }
- };
-
- struct optional_from_python
- {
- static void * convertible(PyObject * source)
- {
- using namespace boost::python::converter;
-
- if (source == Py_None || PyFloat_Check(source))
- return source;
- return 0;
- }
-
- static void construct(PyObject * source,
- boost::python::converter::rvalue_from_python_stage1_data * data)
- {
- using namespace boost::python::converter;
- void * const storage = ((rvalue_from_python_storage<boost::optional<bool> > *)
- data)->storage.bytes;
- if (source == Py_None) // == None
- new (storage) boost::optional<float>(); // A Boost uninitialized value
- else
- new (storage) boost::optional<float>(PyFloat_AsDouble(source));
- data->convertible = storage;
- }
- };
-
- explicit python_optional()
- {
- register_python_conversion<boost::optional<float>,
- optional_to_python, optional_from_python>();
- }
-};
-
-// to/from boost::optional<float>
-template <>
-struct python_optional<bool> : public mapnik::noncopyable
-{
- struct optional_to_python
- {
- static PyObject * convert(const boost::optional<bool>& value)
- {
- if (value)
- {
- if (*value) Py_RETURN_TRUE;
- else Py_RETURN_FALSE;
- }
- else return boost::python::detail::none();
- }
- };
- struct optional_from_python
- {
- static void * convertible(PyObject * source)
- {
- using namespace boost::python::converter;
-
- if (source == Py_None || PyBool_Check(source))
- return source;
- return 0;
- }
-
- static void construct(PyObject * source,
- boost::python::converter::rvalue_from_python_stage1_data * data)
- {
- using namespace boost::python::converter;
- void * const storage = ((rvalue_from_python_storage<boost::optional<bool> > *)
- data)->storage.bytes;
- if (source == Py_None) // == None
- new (storage) boost::optional<bool>(); // A Boost uninitialized value
- else
- {
- new (storage) boost::optional<bool>(source == Py_True ? true : false);
- }
- data->convertible = storage;
- }
- };
-
- explicit python_optional()
- {
- register_python_conversion<boost::optional<bool>,
- optional_to_python, optional_from_python>();
- }
-};
diff --git a/bindings/python/python_to_value.hpp b/bindings/python/python_to_value.hpp
deleted file mode 100644
index da4830e..0000000
--- a/bindings/python/python_to_value.hpp
+++ /dev/null
@@ -1,96 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2014 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-#ifndef MAPNIK_PYTHON_BINDING_PYTHON_TO_VALUE
-#define MAPNIK_PYTHON_BINDING_PYTHON_TO_VALUE
-
-// boost
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-#include <boost/python.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/value.hpp>
-#include <mapnik/unicode.hpp>
-#include <mapnik/attribute.hpp>
-
-
-namespace mapnik {
-
- static mapnik::attributes dict2attr(boost::python::dict const& d)
- {
- using namespace boost::python;
- mapnik::attributes vars;
- mapnik::transcoder tr_("utf8");
- boost::python::list keys=d.keys();
- for (int i=0; i < len(keys); ++i)
- {
- std::string key = extract<std::string>(keys[i]);
- object obj = d[key];
- if (PyUnicode_Check(obj.ptr()))
- {
- PyObject* temp = PyUnicode_AsUTF8String(obj.ptr());
- if (temp)
- {
- #if PY_VERSION_HEX >= 0x03000000
- char* c_str = PyBytes_AsString(temp);
- #else
- char* c_str = PyString_AsString(temp);
- #endif
- vars[key] = tr_.transcode(c_str);
- Py_DecRef(temp);
- }
- continue;
- }
-
- extract<std::string> ex0(obj);
- if (ex0.check())
- {
- vars[key] = tr_.transcode(ex0().c_str());
- continue;
- }
- extract<mapnik::value_integer> ex2(obj);
- if (ex2.check())
- {
- vars[key] = ex2();
- continue;
- }
- extract<double> ex3(obj);
- if (ex3.check())
- {
- vars[key] = ex3();
- continue;
- }
- extract<mapnik::value_bool> ex1(obj);
- if (ex1.check())
- {
- vars[key] = ex1();
- continue;
- }
- }
- return vars;
- }
-}
-
-#endif // MAPNIK_PYTHON_BINDING_PYTHON_TO_VALUE
diff --git a/bootstrap.sh b/bootstrap.sh
new file mode 100755
index 0000000..5baccd0
--- /dev/null
+++ b/bootstrap.sh
@@ -0,0 +1,137 @@
+#!/usr/bin/env bash
+
+#set -eu
+
+: '
+
+todo
+
+- docs for base setup: sudo apt-get -y install zlib1g-dev make git
+- shrink icu data
+'
+
+function setup_mason() {
+ if [[ ! -d ./.mason ]]; then
+ git clone --depth 1 https://github.com/mapbox/mason.git ./.mason
+ else
+ echo "Updating to latest mason"
+ (cd ./.mason && git pull)
+ fi
+ export MASON_DIR=$(pwd)/.mason
+ export PATH=$(pwd)/.mason:$PATH
+ export CXX=${CXX:-clang++}
+ export CC=${CC:-clang}
+}
+
+function install() {
+ MASON_PLATFORM_ID=$(mason env MASON_PLATFORM_ID)
+ if [[ ! -d ./mason_packages/${MASON_PLATFORM_ID}/${1}/${2} ]]; then
+ mason install $1 $2
+ mason link $1 $2
+ fi
+}
+
+function install_mason_deps() {
+ install gdal 1.11.2 &
+ install boost 1.57.0 &
+ install boost_libsystem 1.57.0 &
+ install boost_libthread 1.57.0 &
+ install boost_libfilesystem 1.57.0 &
+ install boost_libprogram_options 1.57.0 &
+ install boost_libregex 1.57.0 &
+ install boost_libpython 1.57.0 &
+ install freetype 2.5.5 &
+ install harfbuzz 0.9.40 &
+ install jpeg_turbo 1.4.0 &
+ install libxml2 2.9.2 &
+ install libpng 1.6.16 &
+ install webp 0.4.2 &
+ install icu 54.1 &
+ install proj 4.8.0 &
+ install libtiff 4.0.4beta &
+ install libpq 9.4.0 &
+ install sqlite 3.8.8.1 &
+ install expat 2.1.0 &
+ install pixman 0.32.6 &
+ install cairo 1.12.18 &
+ wait
+}
+
+MASON_LINKED_ABS=$(pwd)/mason_packages/.link
+MASON_LINKED_REL=./mason_packages/.link
+export C_INCLUDE_PATH="${MASON_LINKED_ABS}/include"
+export CPLUS_INCLUDE_PATH="${MASON_LINKED_ABS}/include"
+export LIBRARY_PATH="${MASON_LINKED_ABS}/lib"
+
+function make_config() {
+ if [[ $(uname -s) == 'Darwin' ]]; then
+ local PATH_REPLACE="/Users/travis/build/mapbox/mason/mason_packages:./mason_packages"
+ else
+ local PATH_REPLACE="/home/travis/build/mapbox/mason/mason_packages:./mason_packages"
+ fi
+
+ echo "
+CXX = '$CXX'
+CC = '$CC'
+CUSTOM_CXXFLAGS = '-fvisibility=hidden -fvisibility-inlines-hidden -DU_CHARSET_IS_UTF8=1'
+RUNTIME_LINK = 'static'
+INPUT_PLUGINS = 'all'
+PATH = '${MASON_LINKED_REL}/bin'
+PKG_CONFIG_PATH = '${MASON_LINKED_REL}/lib/pkgconfig'
+PATH_REMOVE = '/usr:/usr/local'
+PATH_REPLACE = '${PATH_REPLACE}'
+BOOST_INCLUDES = '${MASON_LINKED_REL}/include'
+BOOST_LIBS = '${MASON_LINKED_REL}/lib'
+ICU_INCLUDES = '${MASON_LINKED_REL}/include'
+ICU_LIBS = '${MASON_LINKED_REL}/lib'
+HB_INCLUDES = '${MASON_LINKED_REL}/include'
+HB_LIBS = '${MASON_LINKED_REL}/lib'
+PNG_INCLUDES = '${MASON_LINKED_REL}/include/libpng16'
+PNG_LIBS = '${MASON_LINKED_REL}/lib'
+JPEG_INCLUDES = '${MASON_LINKED_REL}/include'
+JPEG_LIBS = '${MASON_LINKED_REL}/lib'
+TIFF_INCLUDES = '${MASON_LINKED_REL}/include'
+TIFF_LIBS = '${MASON_LINKED_REL}/lib'
+WEBP_INCLUDES = '${MASON_LINKED_REL}/include'
+WEBP_LIBS = '${MASON_LINKED_REL}/lib'
+PROJ_INCLUDES = '${MASON_LINKED_REL}/include'
+PROJ_LIBS = '${MASON_LINKED_REL}/lib'
+PG_INCLUDES = '${MASON_LINKED_REL}/include'
+PG_LIBS = '${MASON_LINKED_REL}/lib'
+FREETYPE_INCLUDES = '${MASON_LINKED_REL}/include/freetype2'
+FREETYPE_LIBS = '${MASON_LINKED_REL}/lib'
+XML2_INCLUDES = '${MASON_LINKED_REL}/include/libxml2'
+XML2_LIBS = '${MASON_LINKED_REL}/lib'
+SVG_RENDERER = True
+CAIRO_INCLUDES = '${MASON_LINKED_REL}/include'
+CAIRO_LIBS = '${MASON_LINKED_REL}/lib'
+SQLITE_INCLUDES = '${MASON_LINKED_REL}/include'
+SQLITE_LIBS = '${MASON_LINKED_REL}/lib'
+BENCHMARK = True
+CPP_TESTS = True
+PGSQL2SQLITE = True
+XMLPARSER = 'ptree'
+SVG2PNG = True
+SAMPLE_INPUT_PLUGINS = True
+" > ./config.py
+}
+
+# NOTE: the `mapnik-settings.env` is used by test/run (which is run by `make test`)
+function setup_runtime_settings() {
+ echo "export PROJ_LIB=${MASON_LINKED_ABS}/share/proj" > mapnik-settings.env
+ echo "export ICU_DATA=${MASON_LINKED_ABS}/share/icu/54.1" >> mapnik-settings.env
+ echo "export GDAL_DATA=${MASON_LINKED_ABS}/share/gdal" >> mapnik-settings.env
+ source mapnik-settings.env
+}
+
+function main() {
+ setup_mason
+ install_mason_deps
+ make_config
+ setup_runtime_settings
+ echo "Ready, now run:"
+ echo ""
+ echo " ./configure && make"
+}
+
+main
diff --git a/demo/c++/rundemo.cpp b/demo/c++/rundemo.cpp
index 9492d36..39614bf 100644
--- a/demo/c++/rundemo.cpp
+++ b/demo/c++/rundemo.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,6 @@
#include <mapnik/layer.hpp>
#include <mapnik/rule.hpp>
#include <mapnik/feature_type_style.hpp>
-#include <mapnik/graphics.hpp>
#include <mapnik/symbolizer.hpp>
#include <mapnik/text/placements/dummy.hpp>
#include <mapnik/text/text_properties.hpp>
@@ -37,9 +36,11 @@
#include <mapnik/image_util.hpp>
#include <mapnik/unicode.hpp>
#include <mapnik/save_map.hpp>
+#include <mapnik/cairo_io.hpp>
#if defined(HAVE_CAIRO)
#include <mapnik/cairo/cairo_renderer.hpp>
+#include <mapnik/cairo/cairo_image_util.hpp>
#endif
#include <iostream>
@@ -54,7 +55,7 @@ int main ( int, char** )
try {
std::cout << " running demo ... \n";
datasource_cache::instance().register_datasources("plugins/input/");
- freetype_engine::register_font("fonts/dejavu-fonts-ttf-2.33/ttf/DejaVuSans.ttf");
+ freetype_engine::register_font("fonts/dejavu-fonts-ttf-2.34/ttf/DejaVuSans.ttf");
Map m(800,600);
m.set_background(parse_color("white"));
@@ -304,8 +305,8 @@ int main ( int, char** )
m.zoom_to_box(box2d<double>(-8024477.28459,5445190.38849,-7381388.20071,5662941.44855));
- image_32 buf(m.width(),m.height());
- agg_renderer<image_32> ren(m,buf);
+ image_rgba8 buf(m.width(),m.height());
+ agg_renderer<image_rgba8> ren(m,buf);
ren.apply();
std::string msg("These maps have been rendered using AGG in the current directory:\n");
#ifdef HAVE_JPEG
@@ -352,8 +353,9 @@ int main ( int, char** )
cairo_surface_write_to_png(&*image_surface, "cairo-demo.png");
// but we can also benefit from quantization by converting
// to a mapnik image object and then saving that
- image_32 im(image_surface);
- save_to_file(im, "cairo-demo256.png","png8");
+ mapnik::image_rgba8 im_data(cairo_image_surface_get_width(&*image_surface), cairo_image_surface_get_height(&*image_surface));
+ cairo_image_to_rgba8(im_data, image_surface);
+ save_to_file(im_data, "cairo-demo256.png","png8");
cairo_surface_finish(&*image_surface);
std::cout << "Three maps have been rendered using Cairo in the current directory:\n"
diff --git a/demo/python/rundemo.py b/demo/python/rundemo.py
index 9bd258d..65ebe6a 100755
--- a/demo/python/rundemo.py
+++ b/demo/python/rundemo.py
@@ -23,13 +23,7 @@
import sys
from os import path
-try:
- import mapnik
-except:
- print '\n\nThe mapnik library and python bindings must have been compiled and \
-installed successfully before running this script.\n\n'
- sys.exit(1)
-
+import mapnik
# Instanciate a map, giving it a width and height. Remember: the word "map" is
# reserved in Python! :)
diff --git a/demo/viewer/about_dialog.cpp b/demo/viewer/about_dialog.cpp
index 270db19..468a298 100644
--- a/demo/viewer/about_dialog.cpp
+++ b/demo/viewer/about_dialog.cpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/demo/viewer/about_dialog.hpp b/demo/viewer/about_dialog.hpp
index 8411a4d..b555a6d 100644
--- a/demo/viewer/about_dialog.hpp
+++ b/demo/viewer/about_dialog.hpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/demo/viewer/info_dialog.cpp b/demo/viewer/info_dialog.cpp
index 734293d..37c243d 100644
--- a/demo/viewer/info_dialog.cpp
+++ b/demo/viewer/info_dialog.cpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/demo/viewer/info_dialog.hpp b/demo/viewer/info_dialog.hpp
index 754c1a9..8ac7620 100644
--- a/demo/viewer/info_dialog.hpp
+++ b/demo/viewer/info_dialog.hpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/demo/viewer/layer_info_dialog.cpp b/demo/viewer/layer_info_dialog.cpp
index c9dfeb8..6d176e8 100644
--- a/demo/viewer/layer_info_dialog.cpp
+++ b/demo/viewer/layer_info_dialog.cpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/demo/viewer/layer_info_dialog.hpp b/demo/viewer/layer_info_dialog.hpp
index 9b9d2ab..9cea6e8 100644
--- a/demo/viewer/layer_info_dialog.hpp
+++ b/demo/viewer/layer_info_dialog.hpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/demo/viewer/layerdelegate.cpp b/demo/viewer/layerdelegate.cpp
index 73f6f17..93b5059 100644
--- a/demo/viewer/layerdelegate.cpp
+++ b/demo/viewer/layerdelegate.cpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -52,4 +52,3 @@ QSize LayerDelegate::sizeHint(const QStyleOptionViewItem & /* option */,
{
return QSize(120,24);
}
-
diff --git a/demo/viewer/layerdelegate.hpp b/demo/viewer/layerdelegate.hpp
index 616b6f5..53fd8b3 100644
--- a/demo/viewer/layerdelegate.hpp
+++ b/demo/viewer/layerdelegate.hpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/demo/viewer/layerlistmodel.cpp b/demo/viewer/layerlistmodel.cpp
index 4b1a89a..fccfdfd 100644
--- a/demo/viewer/layerlistmodel.cpp
+++ b/demo/viewer/layerlistmodel.cpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/demo/viewer/layerlistmodel.hpp b/demo/viewer/layerlistmodel.hpp
index f25a81f..cc2b73f 100644
--- a/demo/viewer/layerlistmodel.hpp
+++ b/demo/viewer/layerlistmodel.hpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/demo/viewer/layerwidget.cpp b/demo/viewer/layerwidget.cpp
index 876d6b1..93dea25 100644
--- a/demo/viewer/layerwidget.cpp
+++ b/demo/viewer/layerwidget.cpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/demo/viewer/layerwidget.hpp b/demo/viewer/layerwidget.hpp
index a3b163c..d19a16a 100644
--- a/demo/viewer/layerwidget.hpp
+++ b/demo/viewer/layerwidget.hpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/demo/viewer/main.cpp b/demo/viewer/main.cpp
index 3274c50..da915d3 100644
--- a/demo/viewer/main.cpp
+++ b/demo/viewer/main.cpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/demo/viewer/mainwindow.cpp b/demo/viewer/mainwindow.cpp
index 6df6fd8..442b990 100644
--- a/demo/viewer/mainwindow.cpp
+++ b/demo/viewer/mainwindow.cpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/demo/viewer/mainwindow.hpp b/demo/viewer/mainwindow.hpp
index b9859ed..d0943dc 100644
--- a/demo/viewer/mainwindow.hpp
+++ b/demo/viewer/mainwindow.hpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/demo/viewer/mapwidget.cpp b/demo/viewer/mapwidget.cpp
index bfcf594..0f6c540 100644
--- a/demo/viewer/mapwidget.cpp
+++ b/demo/viewer/mapwidget.cpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -22,7 +22,6 @@
#include <boost/bind.hpp>
#include <mapnik/agg_renderer.hpp>
-#include <mapnik/graphics.hpp>
#include <mapnik/layer.hpp>
#include <mapnik/projection.hpp>
#include <mapnik/scale_denominator.hpp>
@@ -32,6 +31,7 @@
#include <mapnik/feature_kv_iterator.hpp>
#include <mapnik/image_util.hpp>
#include <mapnik/util/timer.hpp>
+#include <mapnik/cairo/cairo_image_util.hpp>
#ifdef HAVE_CAIRO
// cairo
@@ -41,7 +41,7 @@
#include "mapwidget.hpp"
#include "info_dialog.hpp"
-using mapnik::image_32;
+using mapnik::image_rgba8;
using mapnik::Map;
using mapnik::layer;
using mapnik::box2d;
@@ -177,47 +177,51 @@ void MapWidget::mousePressEvent(QMouseEvent* e)
if (fs)
{
- feature_ptr feat = fs->next();
- if (feat)
- {
-
- feature_kv_iterator itr(*feat,true);
- feature_kv_iterator end(*feat);
-
- for ( ;itr!=end; ++itr)
- {
- info.push_back(QPair<QString,QString>(QString(std::get<0>(*itr).c_str()),
- std::get<1>(*itr).to_string().c_str()));
- }
-
- using path_type = mapnik::transform_path_adapter<mapnik::view_transform,mapnik::geometry_type>;
-
- for (unsigned i=0; i<feat->num_geometries();++i)
- {
- mapnik::geometry_type & geom = feat->get_geometry(i);
- path_type path(t,geom,prj_trans);
- if (geom.size() > 0)
- {
- QPainterPath qpath;
- double x,y;
- path.vertex(&x,&y);
- qpath.moveTo(x,y);
- for (unsigned j = 1; j < geom.size(); ++j)
+ feature_ptr feat = fs->next();
+ if (feat)
+ {
+
+// FIXME
+#if 0
+ feature_kv_iterator itr(*feat,true);
+ feature_kv_iterator end(*feat);
+
+ for ( ;itr!=end; ++itr)
+ {
+ info.push_back(QPair<QString,QString>(QString(std::get<0>(*itr).c_str()),
+ std::get<1>(*itr).to_string().c_str()));
+ }
+
+ using path_type = mapnik::transform_path_adapter<mapnik::view_transform,mapnik::vertex_adapter>;
+
+ for (unsigned i=0; i<feat->num_geometries();++i)
+ {
+ mapnik::geometry_type const& geom = feat->get_geometry(i);
+ mapnik::vertex_adapter va(geom);
+ path_type path(t,va,prj_trans);
+ if (va.size() > 0)
{
- path.vertex(&x,&y);
- qpath.lineTo(x,y);
+ QPainterPath qpath;
+ double x,y;
+ va.vertex(&x,&y);
+ qpath.moveTo(x,y);
+ for (unsigned j = 1; j < geom.size(); ++j)
+ {
+ va.vertex(&x,&y);
+ qpath.lineTo(x,y);
+ }
+ QPainter painter(&pix_);
+ QPen pen(QColor(255,0,0,96));
+ pen.setWidth(3);
+ pen.setCapStyle(Qt::RoundCap);
+ pen.setJoinStyle(Qt::RoundJoin);
+ painter.setPen(pen);
+ painter.drawPath(qpath);
+ update();
}
- QPainter painter(&pix_);
- QPen pen(QColor(255,0,0,96));
- pen.setWidth(3);
- pen.setCapStyle(Qt::RoundCap);
- pen.setJoinStyle(Qt::RoundJoin);
- painter.setPen(pen);
- painter.drawPath(qpath);
- update();
- }
- }
- }
+ }
+#endif
+ }
}
if (info.size() > 0)
@@ -478,7 +482,7 @@ void MapWidget::zoomToLevel(int level)
void MapWidget::export_to_file(unsigned ,unsigned ,std::string const&,std::string const&)
{
- //image_32 image(width,height);
+ //image_rgba8 image(width,height);
//agg_renderer renderer(map,image);
//renderer.apply();
//image.saveToFile(filename,type);
@@ -495,14 +499,14 @@ void render_agg(mapnik::Map const& map, double scaling_factor, QPixmap & pix)
unsigned width=map.width();
unsigned height=map.height();
- image_32 buf(width,height);
- mapnik::agg_renderer<image_32> ren(map,buf,scaling_factor);
+ image_rgba8 buf(width,height);
+ mapnik::agg_renderer<image_rgba8> ren(map,buf,scaling_factor);
try
{
mapnik::auto_cpu_timer t(std::clog, "rendering took: ");
ren.apply();
- QImage image((uchar*)buf.raw_data(),width,height,QImage::Format_ARGB32);
+ QImage image((uchar*)buf.data(),width,height,QImage::Format_ARGB32);
pix = QPixmap::fromImage(image.rgbSwapped());
}
//catch (mapnik::config_error & ex)
@@ -528,7 +532,7 @@ void render_grid(mapnik::Map const& map, double scaling_factor, QPixmap & pix)
void render_cairo(mapnik::Map const& map, double scaling_factor, QPixmap & pix)
{
-
+// FIXME
#ifdef HAVE_CAIRO
mapnik::cairo_surface_ptr image_surface(cairo_image_surface_create(CAIRO_FORMAT_ARGB32,map.width(),map.height()),
mapnik::cairo_surface_closer());
@@ -539,8 +543,9 @@ void render_cairo(mapnik::Map const& map, double scaling_factor, QPixmap & pix)
mapnik::cairo_renderer<mapnik::cairo_ptr> renderer(map, cairo, scaling_factor);
renderer.apply();
}
- image_32 buf(image_surface);
- QImage image((uchar*)buf.raw_data(),buf.width(),buf.height(),QImage::Format_ARGB32);
+ mapnik::image_rgba8 data(map.width(), map.height());
+ mapnik::cairo_image_to_rgba8(data, image_surface);
+ QImage image((uchar*)data.bytes(),data.width(),data.height(),QImage::Format_ARGB32);
pix = QPixmap::fromImage(image.rgbSwapped());
#endif
}
diff --git a/demo/viewer/mapwidget.hpp b/demo/viewer/mapwidget.hpp
index e3cff1a..2373d58 100644
--- a/demo/viewer/mapwidget.hpp
+++ b/demo/viewer/mapwidget.hpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/demo/viewer/styles_model.cpp b/demo/viewer/styles_model.cpp
index 56ef842..5b40e2a 100644
--- a/demo/viewer/styles_model.cpp
+++ b/demo/viewer/styles_model.cpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -22,7 +22,7 @@
#include <mapnik/config.hpp>
#include <mapnik/util/variant.hpp>
#include <mapnik/expression_string.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/rule.hpp>
#include <mapnik/feature_type_style.hpp>
#include <mapnik/symbolizer.hpp>
@@ -35,7 +35,7 @@
#include <QPainter>
#include <QPixmap>
-class node : private mapnik::noncopyable
+class node : private mapnik::util::noncopyable
{
struct node_base
{
@@ -122,7 +122,7 @@ private:
};
-struct symbolizer_info : public mapnik::util::static_visitor<QString>
+struct symbolizer_info
{
QString operator() (mapnik::point_symbolizer const& sym) const
{
@@ -185,7 +185,7 @@ struct symbolizer_info : public mapnik::util::static_visitor<QString>
}
};
-struct symbolizer_icon : public mapnik::util::static_visitor<QIcon>
+struct symbolizer_icon
{
QIcon operator() (mapnik::polygon_symbolizer const& sym) const
{
@@ -201,10 +201,10 @@ struct symbolizer_icon : public mapnik::util::static_visitor<QIcon>
{
// FIXME!
/*
- std::shared_ptr<mapnik::image_data_32> symbol = sym.get_image();
+ std::shared_ptr<mapnik::image_rgba8> symbol = sym.get_image();
if (symbol)
{
- QImage image(symbol->getBytes(),
+ QImage image(symbol->bytes(),
symbol->width(),symbol->height(),QImage::Format_ARGB32);
QPixmap pix = QPixmap::fromImage(image.rgbSwapped());
return QIcon(pix);
diff --git a/demo/viewer/styles_model.hpp b/demo/viewer/styles_model.hpp
index 17af661..407ec59 100644
--- a/demo/viewer/styles_model.hpp
+++ b/demo/viewer/styles_model.hpp
@@ -1,6 +1,6 @@
/* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* Mapnik is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/deps/agg/include/agg_color_gray.h b/deps/agg/include/agg_color_gray.h
index 8e782ef..f2cd0ff 100644
--- a/deps/agg/include/agg_color_gray.h
+++ b/deps/agg/include/agg_color_gray.h
@@ -2,8 +2,8 @@
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
-// Permission to copy, use, modify, sell and distribute this software
-// is granted provided this copyright notice appears in all copies.
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
@@ -13,12 +13,12 @@
// http://www.antigrain.com
//----------------------------------------------------------------------------
//
-// Adaptation for high precision colors has been sponsored by
+// Adaptation for high precision colors has been sponsored by
// Liberty Technology Systems, Inc., visit http://lib-sys.com
//
// Liberty Technology Systems, Inc. is the provider of
// PostScript and PDF technology for software developers.
-//
+//
//----------------------------------------------------------------------------
//
// color types gray8, gray16
@@ -34,378 +34,1005 @@
namespace agg
{
- //===================================================================gray8
- struct gray8
+//===================================================================gray8
+template<class Colorspace>
+struct gray8T
+{
+ typedef int8u value_type;
+ typedef int32u calc_type;
+ typedef int32 long_type;
+ enum base_scale_e
{
- typedef int8u value_type;
- typedef int32u calc_type;
- typedef int32 long_type;
- enum base_scale_e
- {
- base_shift = 8,
- base_scale = 1 << base_shift,
- base_mask = base_scale - 1
- };
- typedef gray8 self_type;
-
- value_type v;
- value_type a;
-
- //--------------------------------------------------------------------
- gray8() {}
-
- //--------------------------------------------------------------------
- gray8(unsigned v_, unsigned a_=base_mask) :
- v(int8u(v_)), a(int8u(a_)) {}
-
- //--------------------------------------------------------------------
- gray8(const self_type& c, unsigned a_) :
- v(c.v), a(value_type(a_)) {}
-
- //--------------------------------------------------------------------
- gray8(const rgba& c) :
- v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))),
- a((value_type)uround(c.a * double(base_mask))) {}
-
- //--------------------------------------------------------------------
- gray8(const rgba& c, double a_) :
- v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))),
- a((value_type)uround(a_ * double(base_mask))) {}
-
- //--------------------------------------------------------------------
- gray8(const rgba8& c) :
- v((c.r*77 + c.g*150 + c.b*29) >> 8),
- a(c.a) {}
-
- //--------------------------------------------------------------------
- gray8(const rgba8& c, unsigned a_) :
- v((c.r*77 + c.g*150 + c.b*29) >> 8),
- a(a_) {}
-
- //--------------------------------------------------------------------
- void clear()
- {
- v = a = 0;
- }
+ base_shift = 8,
+ base_scale = 1 << base_shift,
+ base_mask = base_scale - 1,
+ base_MSB = 1 << (base_shift - 1)
+ };
+ typedef gray8T self_type;
- //--------------------------------------------------------------------
- const self_type& transparent()
- {
- a = 0;
- return *this;
- }
+ value_type v;
+ value_type a;
+
+ static value_type luminance(const rgba& c)
+ {
+ // Calculate grayscale value as per ITU-R BT.709.
+ return value_type(uround((0.2126 * c.r + 0.7152 * c.g + 0.0722 * c.b) * base_mask));
+ }
+
+ static value_type luminance(const rgba8& c)
+ {
+ // Calculate grayscale value as per ITU-R BT.709.
+ return value_type((55u * c.r + 184u * c.g + 18u * c.b) >> 8);
+ }
+
+ static void convert(gray8T<linear>& dst, const gray8T<sRGB>& src)
+ {
+ dst.v = sRGB_conv<value_type>::rgb_from_sRGB(src.v);
+ dst.a = src.a;
+ }
+
+ static void convert(gray8T<sRGB>& dst, const gray8T<linear>& src)
+ {
+ dst.v = sRGB_conv<value_type>::rgb_to_sRGB(src.v);
+ dst.a = src.a;
+ }
+
+ static void convert(gray8T<linear>& dst, const rgba8& src)
+ {
+ dst.v = luminance(src);
+ dst.a = src.a;
+ }
+
+ static void convert(gray8T<linear>& dst, const srgba8& src)
+ {
+ // The RGB weights are only valid for linear values.
+ convert(dst, rgba8(src));
+ }
+
+ static void convert(gray8T<sRGB>& dst, const rgba8& src)
+ {
+ dst.v = sRGB_conv<value_type>::rgb_to_sRGB(luminance(src));
+ dst.a = src.a;
+ }
+
+ static void convert(gray8T<sRGB>& dst, const srgba8& src)
+ {
+ // The RGB weights are only valid for linear values.
+ convert(dst, rgba8(src));
+ }
+
+ //--------------------------------------------------------------------
+ gray8T() {}
+
+ //--------------------------------------------------------------------
+ gray8T(unsigned v_, unsigned a_=base_mask) :
+ v(int8u(v_)), a(int8u(a_)) {}
+
+ //--------------------------------------------------------------------
+ gray8T(const self_type& c, unsigned a_) :
+ v(c.v), a(value_type(a_)) {}
+
+ //--------------------------------------------------------------------
+ gray8T(const rgba& c) :
+ v(luminance(c)),
+ a(value_type(uround(c.a * base_mask))) {}
+
+ //--------------------------------------------------------------------
+ template<class T>
+ gray8T(const gray8T<T>& c)
+ {
+ convert(*this, c);
+ }
+
+ //--------------------------------------------------------------------
+ template<class T>
+ gray8T(const rgba8T<T>& c)
+ {
+ convert(*this, c);
+ }
+
+ //--------------------------------------------------------------------
+ template<class T>
+ T convert_from_sRGB() const
+ {
+ typename T::value_type y = sRGB_conv<typename T::value_type>::rgb_from_sRGB(v);
+ return T(y, y, y, sRGB_conv<typename T::value_type>::alpha_from_sRGB(a));
+ }
+
+ template<class T>
+ T convert_to_sRGB() const
+ {
+ typename T::value_type y = sRGB_conv<typename T::value_type>::rgb_to_sRGB(v);
+ return T(y, y, y, sRGB_conv<typename T::value_type>::alpha_to_sRGB(a));
+ }
+
+ //--------------------------------------------------------------------
+ rgba8 make_rgba8(const linear&) const
+ {
+ return rgba8(v, v, v, a);
+ }
+
+ rgba8 make_rgba8(const sRGB&) const
+ {
+ return convert_from_sRGB<srgba8>();
+ }
+
+ operator rgba8() const
+ {
+ return make_rgba8(Colorspace());
+ }
+
+ //--------------------------------------------------------------------
+ srgba8 make_srgba8(const linear&) const
+ {
+ return convert_to_sRGB<rgba8>();
+ }
+
+ srgba8 make_srgba8(const sRGB&) const
+ {
+ return srgba8(v, v, v, a);
+ }
+
+ operator srgba8() const
+ {
+ return make_rgba8(Colorspace());
+ }
+
+ //--------------------------------------------------------------------
+ rgba16 make_rgba16(const linear&) const
+ {
+ rgba16::value_type rgb = (v << 8) | v;
+ return rgba16(rgb, rgb, rgb, (a << 8) | a);
+ }
+
+ rgba16 make_rgba16(const sRGB&) const
+ {
+ return convert_from_sRGB<rgba16>();
+ }
+
+ operator rgba16() const
+ {
+ return make_rgba16(Colorspace());
+ }
+
+ //--------------------------------------------------------------------
+ rgba32 make_rgba32(const linear&) const
+ {
+ rgba32::value_type v32 = v / 255.0;
+ return rgba32(v32, v32, v32, a / 255.0);
+ }
+
+ rgba32 make_rgba32(const sRGB&) const
+ {
+ return convert_from_sRGB<rgba32>();
+ }
+
+ operator rgba32() const
+ {
+ return make_rgba32(Colorspace());
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE double to_double(value_type a)
+ {
+ return double(a) / base_mask;
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type from_double(double a)
+ {
+ return value_type(uround(a * base_mask));
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type empty_value()
+ {
+ return 0;
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type full_value()
+ {
+ return base_mask;
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE bool is_transparent() const
+ {
+ return a == 0;
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE bool is_opaque() const
+ {
+ return a == base_mask;
+ }
- //--------------------------------------------------------------------
- void opacity(double a_)
+ //--------------------------------------------------------------------
+ // Fixed-point multiply, exact over int8u.
+ static AGG_INLINE value_type multiply(value_type a, value_type b)
+ {
+ calc_type t = a * b + base_MSB;
+ return value_type(((t >> base_shift) + t) >> base_shift);
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type demultiply(value_type a, value_type b)
+ {
+ if (a * b == 0)
{
- if(a_ < 0.0) a_ = 0.0;
- if(a_ > 1.0) a_ = 1.0;
- a = (value_type)uround(a_ * double(base_mask));
+ return 0;
}
-
- //--------------------------------------------------------------------
- double opacity() const
+ else if (a >= b)
{
- return double(a) / double(base_mask);
+ return base_mask;
}
+ else return value_type((a * base_mask + (b >> 1)) / b);
+ }
+ //--------------------------------------------------------------------
+ template<typename T>
+ static AGG_INLINE T downscale(T a)
+ {
+ return a >> base_shift;
+ }
- //--------------------------------------------------------------------
- const self_type& premultiply()
- {
- if(a == base_mask) return *this;
- if(a == 0)
- {
- v = 0;
- return *this;
- }
- v = value_type((calc_type(v) * a) >> base_shift);
- return *this;
- }
+ //--------------------------------------------------------------------
+ template<typename T>
+ static AGG_INLINE T downshift(T a, unsigned n)
+ {
+ return a >> n;
+ }
+
+ //--------------------------------------------------------------------
+ // Fixed-point multiply, exact over int8u.
+ // Specifically for multiplying a color component by a cover.
+ static AGG_INLINE value_type mult_cover(value_type a, value_type b)
+ {
+ return multiply(a, b);
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE cover_type scale_cover(cover_type a, value_type b)
+ {
+ return multiply(b, a);
+ }
+
+ //--------------------------------------------------------------------
+ // Interpolate p to q by a, assuming q is premultiplied by a.
+ static AGG_INLINE value_type prelerp(value_type p, value_type q, value_type a)
+ {
+ return p + q - multiply(p, a);
+ }
+
+ //--------------------------------------------------------------------
+ // Interpolate p to q by a.
+ static AGG_INLINE value_type lerp(value_type p, value_type q, value_type a)
+ {
+ int t = (q - p) * a + base_MSB - (p > q);
+ return value_type(p + (((t >> base_shift) + t) >> base_shift));
+ }
+
+ //--------------------------------------------------------------------
+ self_type& clear()
+ {
+ v = a = 0;
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ self_type& transparent()
+ {
+ a = 0;
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ self_type& opacity(double a_)
+ {
+ if (a_ < 0) a = 0;
+ else if (a_ > 1) a = 1;
+ else a = (value_type)uround(a_ * double(base_mask));
+ return *this;
+ }
- //--------------------------------------------------------------------
- const self_type& premultiply(unsigned a_)
+ //--------------------------------------------------------------------
+ double opacity() const
+ {
+ return double(a) / double(base_mask);
+ }
+
+ //--------------------------------------------------------------------
+ self_type& premultiply()
+ {
+ if (a < base_mask)
{
- if(a == base_mask && a_ >= base_mask) return *this;
- if(a == 0 || a_ == 0)
- {
- v = a = 0;
- return *this;
- }
- calc_type v_ = (calc_type(v) * a_) / a;
- v = value_type((v_ > a_) ? a_ : v_);
- a = value_type(a_);
- return *this;
+ if (a == 0) v = 0;
+ else v = multiply(v, a);
}
+ return *this;
+ }
- //--------------------------------------------------------------------
- const self_type& demultiply()
+ //--------------------------------------------------------------------
+ self_type& demultiply()
+ {
+ if (a < base_mask)
{
- if(a == base_mask) return *this;
- if(a == 0)
+ if (a == 0)
{
v = 0;
- return *this;
}
- calc_type v_ = (calc_type(v) * base_mask) / a;
- v = value_type((v_ > base_mask) ? (value_type)base_mask : v_);
- return *this;
+ else
+ {
+ calc_type v_ = (calc_type(v) * base_mask) / a;
+ v = value_type((v_ > base_mask) ? (value_type)base_mask : v_);
+ }
}
+ return *this;
+ }
- //--------------------------------------------------------------------
- self_type gradient(self_type c, double k) const
- {
- self_type ret;
- calc_type ik = uround(k * base_scale);
- ret.v = value_type(calc_type(v) + (((calc_type(c.v) - v) * ik) >> base_shift));
- ret.a = value_type(calc_type(a) + (((calc_type(c.a) - a) * ik) >> base_shift));
- return ret;
- }
+ //--------------------------------------------------------------------
+ self_type gradient(self_type c, double k) const
+ {
+ self_type ret;
+ calc_type ik = uround(k * base_scale);
+ ret.v = lerp(v, c.v, ik);
+ ret.a = lerp(a, c.a, ik);
+ return ret;
+ }
- //--------------------------------------------------------------------
- AGG_INLINE void add(const self_type& c, unsigned cover)
+ //--------------------------------------------------------------------
+ AGG_INLINE void add(const self_type& c, unsigned cover)
+ {
+ calc_type cv, ca;
+ if (cover == cover_mask)
{
- calc_type cv, ca;
- if(cover == cover_mask)
+ if (c.a == base_mask)
{
- if(c.a == base_mask)
- {
- *this = c;
- }
- else
- {
- cv = v + c.v; v = (cv > calc_type(base_mask)) ? calc_type(base_mask) : cv;
- ca = a + c.a; a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca;
- }
+ *this = c;
+ return;
}
else
{
- cv = v + ((c.v * cover + cover_mask/2) >> cover_shift);
- ca = a + ((c.a * cover + cover_mask/2) >> cover_shift);
- v = (cv > calc_type(base_mask)) ? calc_type(base_mask) : cv;
- a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca;
+ cv = v + c.v;
+ ca = a + c.a;
}
}
+ else
+ {
+ cv = v + mult_cover(c.v, cover);
+ ca = a + mult_cover(c.a, cover);
+ }
+ v = (value_type)((cv > calc_type(base_mask)) ? calc_type(base_mask) : cv);
+ a = (value_type)((ca > calc_type(base_mask)) ? calc_type(base_mask) : ca);
+ }
+
+ //--------------------------------------------------------------------
+ static self_type no_color() { return self_type(0,0); }
+};
+
+typedef gray8T<linear> gray8;
+typedef gray8T<sRGB> sgray8;
+
- //--------------------------------------------------------------------
- static self_type no_color() { return self_type(0,0); }
+//==================================================================gray16
+struct gray16
+{
+ typedef int16u value_type;
+ typedef int32u calc_type;
+ typedef int64 long_type;
+ enum base_scale_e
+ {
+ base_shift = 16,
+ base_scale = 1 << base_shift,
+ base_mask = base_scale - 1,
+ base_MSB = 1 << (base_shift - 1)
};
+ typedef gray16 self_type;
+ value_type v;
+ value_type a;
- //-------------------------------------------------------------gray8_pre
- inline gray8 gray8_pre(unsigned v, unsigned a = gray8::base_mask)
+ static value_type luminance(const rgba& c)
{
- return gray8(v,a).premultiply();
+ // Calculate grayscale value as per ITU-R BT.709.
+ return value_type(uround((0.2126 * c.r + 0.7152 * c.g + 0.0722 * c.b) * base_mask));
}
- inline gray8 gray8_pre(const gray8& c, unsigned a)
+
+ static value_type luminance(const rgba16& c)
{
- return gray8(c,a).premultiply();
+ // Calculate grayscale value as per ITU-R BT.709.
+ return value_type((13933u * c.r + 46872u * c.g + 4732u * c.b) >> 16);
}
- inline gray8 gray8_pre(const rgba& c)
+
+ static value_type luminance(const rgba8& c)
{
- return gray8(c).premultiply();
+ return luminance(rgba16(c));
}
- inline gray8 gray8_pre(const rgba& c, double a)
+
+ static value_type luminance(const srgba8& c)
{
- return gray8(c,a).premultiply();
+ return luminance(rgba16(c));
}
- inline gray8 gray8_pre(const rgba8& c)
+
+ static value_type luminance(const rgba32& c)
{
- return gray8(c).premultiply();
+ return luminance(rgba(c));
}
- inline gray8 gray8_pre(const rgba8& c, unsigned a)
+
+ //--------------------------------------------------------------------
+ gray16() {}
+
+ //--------------------------------------------------------------------
+ gray16(unsigned v_, unsigned a_ = base_mask) :
+ v(int16u(v_)), a(int16u(a_)) {}
+
+ //--------------------------------------------------------------------
+ gray16(const self_type& c, unsigned a_) :
+ v(c.v), a(value_type(a_)) {}
+
+ //--------------------------------------------------------------------
+ gray16(const rgba& c) :
+ v(luminance(c)),
+ a((value_type)uround(c.a * double(base_mask))) {}
+
+ //--------------------------------------------------------------------
+ gray16(const rgba8& c) :
+ v(luminance(c)),
+ a((value_type(c.a) << 8) | c.a) {}
+
+ //--------------------------------------------------------------------
+ gray16(const srgba8& c) :
+ v(luminance(c)),
+ a((value_type(c.a) << 8) | c.a) {}
+
+ //--------------------------------------------------------------------
+ gray16(const rgba16& c) :
+ v(luminance(c)),
+ a(c.a) {}
+
+ //--------------------------------------------------------------------
+ gray16(const gray8& c) :
+ v((value_type(c.v) << 8) | c.v),
+ a((value_type(c.a) << 8) | c.a) {}
+
+ //--------------------------------------------------------------------
+ gray16(const sgray8& c) :
+ v(sRGB_conv<value_type>::rgb_from_sRGB(c.v)),
+ a(sRGB_conv<value_type>::alpha_from_sRGB(c.a)) {}
+
+ //--------------------------------------------------------------------
+ operator rgba8() const
{
- return gray8(c,a).premultiply();
+ return rgba8(v >> 8, v >> 8, v >> 8, a >> 8);
}
+ //--------------------------------------------------------------------
+ operator srgba8() const
+ {
+ value_type y = sRGB_conv<value_type>::rgb_to_sRGB(v);
+ return srgba8(y, y, y, sRGB_conv<value_type>::alpha_to_sRGB(a));
+ }
+ //--------------------------------------------------------------------
+ operator rgba16() const
+ {
+ return rgba16(v, v, v, a);
+ }
+ //--------------------------------------------------------------------
+ operator gray8() const
+ {
+ return gray8(v >> 8, a >> 8);
+ }
- //==================================================================gray16
- struct gray16
+ //--------------------------------------------------------------------
+ operator sgray8() const
{
- typedef int16u value_type;
- typedef int32u calc_type;
- typedef int64 long_type;
- enum base_scale_e
- {
- base_shift = 16,
- base_scale = 1 << base_shift,
- base_mask = base_scale - 1
- };
- typedef gray16 self_type;
-
- value_type v;
- value_type a;
-
- //--------------------------------------------------------------------
- gray16() {}
-
- //--------------------------------------------------------------------
- gray16(unsigned v_, unsigned a_=base_mask) :
- v(int16u(v_)), a(int16u(a_)) {}
-
- //--------------------------------------------------------------------
- gray16(const self_type& c, unsigned a_) :
- v(c.v), a(value_type(a_)) {}
-
- //--------------------------------------------------------------------
- gray16(const rgba& c) :
- v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))),
- a((value_type)uround(c.a * double(base_mask))) {}
-
- //--------------------------------------------------------------------
- gray16(const rgba& c, double a_) :
- v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))),
- a((value_type)uround(a_ * double(base_mask))) {}
-
- //--------------------------------------------------------------------
- gray16(const rgba8& c) :
- v(c.r*77 + c.g*150 + c.b*29),
- a((value_type(c.a) << 8) | c.a) {}
-
- //--------------------------------------------------------------------
- gray16(const rgba8& c, unsigned a_) :
- v(c.r*77 + c.g*150 + c.b*29),
- a((value_type(a_) << 8) | c.a) {}
-
- //--------------------------------------------------------------------
- void clear()
- {
- v = a = 0;
- }
+ return sgray8(
+ sRGB_conv<value_type>::rgb_to_sRGB(v),
+ sRGB_conv<value_type>::alpha_to_sRGB(a));
+ }
- //--------------------------------------------------------------------
- const self_type& transparent()
- {
- a = 0;
- return *this;
- }
+ //--------------------------------------------------------------------
+ static AGG_INLINE double to_double(value_type a)
+ {
+ return double(a) / base_mask;
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type from_double(double a)
+ {
+ return value_type(uround(a * base_mask));
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type empty_value()
+ {
+ return 0;
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type full_value()
+ {
+ return base_mask;
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE bool is_transparent() const
+ {
+ return a == 0;
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE bool is_opaque() const
+ {
+ return a == base_mask;
+ }
+
+ //--------------------------------------------------------------------
+ // Fixed-point multiply, exact over int16u.
+ static AGG_INLINE value_type multiply(value_type a, value_type b)
+ {
+ calc_type t = a * b + base_MSB;
+ return value_type(((t >> base_shift) + t) >> base_shift);
+ }
- //--------------------------------------------------------------------
- void opacity(double a_)
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type demultiply(value_type a, value_type b)
+ {
+ if (a * b == 0)
{
- if(a_ < 0.0) a_ = 0.0;
- if(a_ > 1.0) a_ = 1.0;
- a = (value_type)uround(a_ * double(base_mask));
+ return 0;
}
-
- //--------------------------------------------------------------------
- double opacity() const
+ else if (a >= b)
{
- return double(a) / double(base_mask);
+ return base_mask;
}
+ else return value_type((a * base_mask + (b >> 1)) / b);
+ }
+ //--------------------------------------------------------------------
+ template<typename T>
+ static AGG_INLINE T downscale(T a)
+ {
+ return a >> base_shift;
+ }
- //--------------------------------------------------------------------
- const self_type& premultiply()
- {
- if(a == base_mask) return *this;
- if(a == 0)
- {
- v = 0;
- return *this;
- }
- v = value_type((calc_type(v) * a) >> base_shift);
- return *this;
- }
+ //--------------------------------------------------------------------
+ template<typename T>
+ static AGG_INLINE T downshift(T a, unsigned n)
+ {
+ return a >> n;
+ }
+
+ //--------------------------------------------------------------------
+ // Fixed-point multiply, almost exact over int16u.
+ // Specifically for multiplying a color component by a cover.
+ static AGG_INLINE value_type mult_cover(value_type a, cover_type b)
+ {
+ return multiply(a, b << 8 | b);
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE cover_type scale_cover(cover_type a, value_type b)
+ {
+ return mult_cover(b, a) >> 8;
+ }
+
+ //--------------------------------------------------------------------
+ // Interpolate p to q by a, assuming q is premultiplied by a.
+ static AGG_INLINE value_type prelerp(value_type p, value_type q, value_type a)
+ {
+ return p + q - multiply(p, a);
+ }
- //--------------------------------------------------------------------
- const self_type& premultiply(unsigned a_)
+ //--------------------------------------------------------------------
+ // Interpolate p to q by a.
+ static AGG_INLINE value_type lerp(value_type p, value_type q, value_type a)
+ {
+ int t = (q - p) * a + base_MSB - (p > q);
+ return value_type(p + (((t >> base_shift) + t) >> base_shift));
+ }
+
+ //--------------------------------------------------------------------
+ self_type& clear()
+ {
+ v = a = 0;
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ self_type& transparent()
+ {
+ a = 0;
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ self_type& opacity(double a_)
+ {
+ if (a_ < 0) a_ = 0;
+ else if(a_ > 1) a_ = 1;
+ else a = (value_type)uround(a_ * double(base_mask));
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ double opacity() const
+ {
+ return double(a) / double(base_mask);
+ }
+
+
+ //--------------------------------------------------------------------
+ self_type& premultiply()
+ {
+ if (a < base_mask)
{
- if(a == base_mask && a_ >= base_mask) return *this;
- if(a == 0 || a_ == 0)
- {
- v = a = 0;
- return *this;
- }
- calc_type v_ = (calc_type(v) * a_) / a;
- v = value_type((v_ > a_) ? a_ : v_);
- a = value_type(a_);
- return *this;
+ if(a == 0) v = 0;
+ else v = multiply(v, a);
}
+ return *this;
+ }
- //--------------------------------------------------------------------
- const self_type& demultiply()
+ //--------------------------------------------------------------------
+ self_type& demultiply()
+ {
+ if (a < base_mask)
{
- if(a == base_mask) return *this;
- if(a == 0)
+ if (a == 0)
{
v = 0;
- return *this;
}
- calc_type v_ = (calc_type(v) * base_mask) / a;
- v = value_type((v_ > base_mask) ? base_mask : v_);
- return *this;
+ else
+ {
+ calc_type v_ = (calc_type(v) * base_mask) / a;
+ v = value_type((v_ > base_mask) ? base_mask : v_);
+ }
}
+ return *this;
+ }
- //--------------------------------------------------------------------
- self_type gradient(self_type c, double k) const
- {
- self_type ret;
- calc_type ik = uround(k * base_scale);
- ret.v = value_type(calc_type(v) + (((calc_type(c.v) - v) * ik) >> base_shift));
- ret.a = value_type(calc_type(a) + (((calc_type(c.a) - a) * ik) >> base_shift));
- return ret;
- }
+ //--------------------------------------------------------------------
+ self_type gradient(self_type c, double k) const
+ {
+ self_type ret;
+ calc_type ik = uround(k * base_scale);
+ ret.v = lerp(v, c.v, ik);
+ ret.a = lerp(a, c.a, ik);
+ return ret;
+ }
- //--------------------------------------------------------------------
- AGG_INLINE void add(const self_type& c, unsigned cover)
+ //--------------------------------------------------------------------
+ AGG_INLINE void add(const self_type& c, unsigned cover)
+ {
+ calc_type cv, ca;
+ if (cover == cover_mask)
{
- calc_type cv, ca;
- if(cover == cover_mask)
+ if (c.a == base_mask)
{
- if(c.a == base_mask)
- {
- *this = c;
- }
- else
- {
- cv = v + c.v; v = (cv > calc_type(base_mask)) ? calc_type(base_mask) : cv;
- ca = a + c.a; a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca;
- }
+ *this = c;
+ return;
}
else
{
- cv = v + ((c.v * cover + cover_mask/2) >> cover_shift);
- ca = a + ((c.a * cover + cover_mask/2) >> cover_shift);
- v = (cv > calc_type(base_mask)) ? calc_type(base_mask) : cv;
- a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca;
+ cv = v + c.v;
+ ca = a + c.a;
}
}
+ else
+ {
+ cv = v + mult_cover(c.v, cover);
+ ca = a + mult_cover(c.a, cover);
+ }
+ v = (value_type)((cv > calc_type(base_mask)) ? calc_type(base_mask) : cv);
+ a = (value_type)((ca > calc_type(base_mask)) ? calc_type(base_mask) : ca);
+ }
+
+ //--------------------------------------------------------------------
+ static self_type no_color() { return self_type(0,0); }
+};
+
- //--------------------------------------------------------------------
- static self_type no_color() { return self_type(0,0); }
+//===================================================================gray32
+struct gray32
+{
+ typedef float value_type;
+ typedef double calc_type;
+ typedef double long_type;
+ typedef gray32 self_type;
+
+ value_type v;
+ value_type a;
+
+ enum base_scale_e
+ {
+ base_shift = 8,
+ base_scale = 1 << base_shift,
+ base_mask = base_scale - 1,
};
+ // Calculate grayscale value as per ITU-R BT.709.
+ static value_type luminance(double r, double g, double b)
+ {
+ return value_type(0.2126 * r + 0.7152 * g + 0.0722 * b);
+ }
+
+ static value_type luminance(const rgba& c)
+ {
+ return luminance(c.r, c.g, c.b);
+ }
+
+ static value_type luminance(const rgba32& c)
+ {
+ return luminance(c.r, c.g, c.b);
+ }
+
+ static value_type luminance(const rgba8& c)
+ {
+ return luminance(c.r / 255.0, c.g / 255.0, c.g / 255.0);
+ }
+
+ static value_type luminance(const rgba16& c)
+ {
+ return luminance(c.r / 65535.0, c.g / 65535.0, c.g / 65535.0);
+ }
+
+ //--------------------------------------------------------------------
+ gray32() {}
+
+ //--------------------------------------------------------------------
+ gray32(value_type v_, value_type a_ = 1) :
+ v(v_), a(a_) {}
+
+ //--------------------------------------------------------------------
+ gray32(const self_type& c, value_type a_) :
+ v(c.v), a(a_) {}
+
+ //--------------------------------------------------------------------
+ gray32(const rgba& c) :
+ v(luminance(c)),
+ a(value_type(c.a)) {}
+
+ //--------------------------------------------------------------------
+ gray32(const rgba8& c) :
+ v(luminance(c)),
+ a(value_type(c.a / 255.0)) {}
+
+ //--------------------------------------------------------------------
+ gray32(const srgba8& c) :
+ v(luminance(rgba32(c))),
+ a(value_type(c.a / 255.0)) {}
+
+ //--------------------------------------------------------------------
+ gray32(const rgba16& c) :
+ v(luminance(c)),
+ a(value_type(c.a / 65535.0)) {}
+
+ //--------------------------------------------------------------------
+ gray32(const rgba32& c) :
+ v(luminance(c)),
+ a(value_type(c.a)) {}
+
+ //--------------------------------------------------------------------
+ gray32(const gray8& c) :
+ v(value_type(c.v / 255.0)),
+ a(value_type(c.a / 255.0)) {}
+
+ //--------------------------------------------------------------------
+ gray32(const sgray8& c) :
+ v(sRGB_conv<value_type>::rgb_from_sRGB(c.v)),
+ a(sRGB_conv<value_type>::alpha_from_sRGB(c.a)) {}
+
+ //--------------------------------------------------------------------
+ gray32(const gray16& c) :
+ v(value_type(c.v / 65535.0)),
+ a(value_type(c.a / 65535.0)) {}
+
+ //--------------------------------------------------------------------
+ operator rgba() const
+ {
+ return rgba(v, v, v, a);
+ }
+
+ //--------------------------------------------------------------------
+ operator gray8() const
+ {
+ return gray8(uround(v * 255.0), uround(a * 255.0));
+ }
+
+ //--------------------------------------------------------------------
+ operator sgray8() const
+ {
+ // Return (non-premultiplied) sRGB values.
+ return sgray8(
+ sRGB_conv<value_type>::rgb_to_sRGB(v),
+ sRGB_conv<value_type>::alpha_to_sRGB(a));
+ }
+
+ //--------------------------------------------------------------------
+ operator gray16() const
+ {
+ return gray16(uround(v * 65535.0), uround(a * 65535.0));
+ }
+
+ //--------------------------------------------------------------------
+ operator rgba8() const
+ {
+ rgba8::value_type y = uround(v * 255.0);
+ return rgba8(y, y, y, uround(a * 255.0));
+ }
+
+ //--------------------------------------------------------------------
+ operator srgba8() const
+ {
+ srgba8::value_type y = sRGB_conv<value_type>::rgb_to_sRGB(v);
+ return srgba8(y, y, y, sRGB_conv<value_type>::alpha_to_sRGB(a));
+ }
+
+ //--------------------------------------------------------------------
+ operator rgba16() const
+ {
+ rgba16::value_type y = uround(v * 65535.0);
+ return rgba16(y, y, y, uround(a * 65535.0));
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE double to_double(value_type a)
+ {
+ return a;
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type from_double(double a)
+ {
+ return value_type(a);
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type empty_value()
+ {
+ return 0;
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type full_value()
+ {
+ return 1;
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE bool is_transparent() const
+ {
+ return a <= 0;
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE bool is_opaque() const
+ {
+ return a >= 1;
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type invert(value_type x)
+ {
+ return 1 - x;
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type multiply(value_type a, value_type b)
+ {
+ return value_type(a * b);
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type demultiply(value_type a, value_type b)
+ {
+ return (b == 0) ? 0 : value_type(a / b);
+ }
+
+ //--------------------------------------------------------------------
+ template<typename T>
+ static AGG_INLINE T downscale(T a)
+ {
+ return a;
+ }
- //------------------------------------------------------------gray16_pre
- inline gray16 gray16_pre(unsigned v, unsigned a = gray16::base_mask)
+ //--------------------------------------------------------------------
+ template<typename T>
+ static AGG_INLINE T downshift(T a, unsigned n)
{
- return gray16(v,a).premultiply();
+ return n > 0 ? a / (1 << n) : a;
}
- inline gray16 gray16_pre(const gray16& c, unsigned a)
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type mult_cover(value_type a, cover_type b)
+ {
+ return value_type(a * b / cover_mask);
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE cover_type scale_cover(cover_type a, value_type b)
+ {
+ return cover_type(uround(a * b));
+ }
+
+ //--------------------------------------------------------------------
+ // Interpolate p to q by a, assuming q is premultiplied by a.
+ static AGG_INLINE value_type prelerp(value_type p, value_type q, value_type a)
{
- return gray16(c,a).premultiply();
+ return (1 - a) * p + q; // more accurate than "p + q - p * a"
}
- inline gray16 gray16_pre(const rgba& c)
+
+ //--------------------------------------------------------------------
+ // Interpolate p to q by a.
+ static AGG_INLINE value_type lerp(value_type p, value_type q, value_type a)
{
- return gray16(c).premultiply();
+ // The form "p + a * (q - p)" avoids a multiplication, but may produce an
+ // inaccurate result. For example, "p + (q - p)" may not be exactly equal
+ // to q. Therefore, stick to the basic expression, which at least produces
+ // the correct result at either extreme.
+ return (1 - a) * p + a * q;
}
- inline gray16 gray16_pre(const rgba& c, double a)
+
+ //--------------------------------------------------------------------
+ self_type& clear()
{
- return gray16(c,a).premultiply();
+ v = a = 0;
+ return *this;
}
- inline gray16 gray16_pre(const rgba8& c)
+
+ //--------------------------------------------------------------------
+ self_type& transparent()
{
- return gray16(c).premultiply();
+ a = 0;
+ return *this;
}
- inline gray16 gray16_pre(const rgba8& c, unsigned a)
+
+ //--------------------------------------------------------------------
+ self_type& opacity(double a_)
{
- return gray16(c,a).premultiply();
+ if (a_ < 0) a = 0;
+ else if (a_ > 1) a = 1;
+ else a = value_type(a_);
+ return *this;
}
+ //--------------------------------------------------------------------
+ double opacity() const
+ {
+ return a;
+ }
+
+
+ //--------------------------------------------------------------------
+ self_type& premultiply()
+ {
+ if (a < 0) v = 0;
+ else if(a < 1) v *= a;
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ self_type& demultiply()
+ {
+ if (a < 0) v = 0;
+ else if (a < 1) v /= a;
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ self_type gradient(self_type c, double k) const
+ {
+ return self_type(
+ value_type(v + (c.v - v) * k),
+ value_type(a + (c.a - a) * k));
+ }
+ //--------------------------------------------------------------------
+ static self_type no_color() { return self_type(0,0); }
+};
}
diff --git a/deps/agg/include/agg_color_rgba.h b/deps/agg/include/agg_color_rgba.h
index 1995374..b4e3f76 100644
--- a/deps/agg/include/agg_color_rgba.h
+++ b/deps/agg/include/agg_color_rgba.h
@@ -2,19 +2,19 @@
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
-// Permission to copy, use, modify, sell and distribute this software
-// is granted provided this copyright notice appears in all copies.
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
//----------------------------------------------------------------------------
//
-// Adaptation for high precision colors has been sponsored by
+// Adaptation for high precision colors has been sponsored by
// Liberty Technology Systems, Inc., visit http://lib-sys.com
//
// Liberty Technology Systems, Inc. is the provider of
// PostScript and PDF technology for software developers.
-//
+//
//----------------------------------------------------------------------------
// Contact: mcseem at antigrain.com
// mcseemagg at yahoo.com
@@ -26,716 +26,1337 @@
#include <cmath>
#include "agg_basics.h"
+#include "agg_gamma_lut.h"
namespace agg
{
- // Supported byte orders for RGB and RGBA pixel formats
- //=======================================================================
- struct order_rgb { enum rgb_e { R=0, G=1, B=2, rgb_tag }; }; //----order_rgb
- struct order_bgr { enum bgr_e { B=0, G=1, R=2, rgb_tag }; }; //----order_bgr
- struct order_rgba { enum rgba_e { R=0, G=1, B=2, A=3, rgba_tag }; }; //----order_rgba
- struct order_argb { enum argb_e { A=0, R=1, G=2, B=3, rgba_tag }; }; //----order_argb
- struct order_abgr { enum abgr_e { A=0, B=1, G=2, R=3, rgba_tag }; }; //----order_abgr
- struct order_bgra { enum bgra_e { B=0, G=1, R=2, A=3, rgba_tag }; }; //----order_bgra
+// Supported byte orders for RGB and RGBA pixel formats
+//=======================================================================
+struct order_rgb { enum rgb_e { R=0, G=1, B=2, rgb_tag, hasAlpha=false }; }; //----order_rgb
+struct order_bgr { enum bgr_e { B=0, G=1, R=2, rgb_tag, hasAlpha=false }; }; //----order_bgr
+struct order_rgba { enum rgba_e { R=0, G=1, B=2, A=3, rgba_tag, hasAlpha=true }; }; //----order_rgba
+struct order_argb { enum argb_e { A=0, R=1, G=2, B=3, rgba_tag, hasAlpha=true }; }; //----order_argb
+struct order_abgr { enum abgr_e { A=0, B=1, G=2, R=3, rgba_tag, hasAlpha=true }; }; //----order_abgr
+struct order_bgra { enum bgra_e { B=0, G=1, R=2, A=3, rgba_tag, hasAlpha=true }; }; //----order_bgra
+
+// Colorspace tag types.
+struct linear {};
+struct sRGB {};
+
+//====================================================================rgba
+struct rgba
+{
+ typedef double value_type;
- //====================================================================rgba
- struct rgba
- {
- typedef double value_type;
+ double r;
+ double g;
+ double b;
+ double a;
- double r;
- double g;
- double b;
- double a;
+ //--------------------------------------------------------------------
+ rgba() {}
- //--------------------------------------------------------------------
- rgba() {}
+ //--------------------------------------------------------------------
+ rgba(double r_, double g_, double b_, double a_=1.0) :
+ r(r_), g(g_), b(b_), a(a_) {}
- //--------------------------------------------------------------------
- rgba(double r_, double g_, double b_, double a_=1.0) :
- r(r_), g(g_), b(b_), a(a_) {}
+ //--------------------------------------------------------------------
+ rgba(const rgba& c, double a_) : r(c.r), g(c.g), b(c.b), a(a_) {}
- //--------------------------------------------------------------------
- rgba(const rgba& c, double a_) : r(c.r), g(c.g), b(c.b), a(a_) {}
+ //--------------------------------------------------------------------
+ rgba& clear()
+ {
+ r = g = b = a = 0;
+ return *this;
+ }
- //--------------------------------------------------------------------
- void clear()
- {
- r = g = b = a = 0;
- }
+ //--------------------------------------------------------------------
+ rgba& transparent()
+ {
+ a = 0;
+ return *this;
+ }
- //--------------------------------------------------------------------
- const rgba& transparent()
- {
- a = 0.0;
- return *this;
- }
+ //--------------------------------------------------------------------
+ rgba& opacity(double a_)
+ {
+ if (a_ < 0) a = 0;
+ else if (a_ > 1) a = 1;
+ else a = a_;
+ return *this;
+ }
- //--------------------------------------------------------------------
- const rgba& opacity(double a_)
- {
- if(a_ < 0.0) a_ = 0.0;
- if(a_ > 1.0) a_ = 1.0;
- a = a_;
- return *this;
- }
+ //--------------------------------------------------------------------
+ double opacity() const
+ {
+ return a;
+ }
- //--------------------------------------------------------------------
- double opacity() const
- {
- return a;
- }
+ //--------------------------------------------------------------------
+ rgba& premultiply()
+ {
+ r *= a;
+ g *= a;
+ b *= a;
+ return *this;
+ }
- //--------------------------------------------------------------------
- const rgba& premultiply()
+ //--------------------------------------------------------------------
+ rgba& premultiply(double a_)
+ {
+ if (a <= 0 || a_ <= 0)
{
- r *= a;
- g *= a;
- b *= a;
- return *this;
+ r = g = b = a = 0;
}
-
- //--------------------------------------------------------------------
- const rgba& premultiply(double a_)
+ else
{
- if(a <= 0.0 || a_ <= 0.0)
- {
- r = g = b = a = 0.0;
- return *this;
- }
a_ /= a;
r *= a_;
g *= a_;
b *= a_;
a = a_;
- return *this;
}
+ return *this;
+ }
- //--------------------------------------------------------------------
- const rgba& demultiply()
+ //--------------------------------------------------------------------
+ rgba& demultiply()
+ {
+ if (a == 0)
+ {
+ r = g = b = 0;
+ }
+ else
{
- if(a == 0)
- {
- r = g = b = 0;
- return *this;
- }
double a_ = 1.0 / a;
r *= a_;
g *= a_;
b *= a_;
- return *this;
}
+ return *this;
+ }
- //--------------------------------------------------------------------
- rgba gradient(rgba c, double k) const
- {
- rgba ret;
- ret.r = r + (c.r - r) * k;
- ret.g = g + (c.g - g) * k;
- ret.b = b + (c.b - b) * k;
- ret.a = a + (c.a - a) * k;
- return ret;
- }
+ //--------------------------------------------------------------------
+ rgba gradient(rgba c, double k) const
+ {
+ rgba ret;
+ ret.r = r + (c.r - r) * k;
+ ret.g = g + (c.g - g) * k;
+ ret.b = b + (c.b - b) * k;
+ ret.a = a + (c.a - a) * k;
+ return ret;
+ }
- //--------------------------------------------------------------------
- static rgba no_color() { return rgba(0,0,0,0); }
+ rgba& operator+=(const rgba& c)
+ {
+ r += c.r;
+ g += c.g;
+ b += c.b;
+ a += c.a;
+ return *this;
+ }
- //--------------------------------------------------------------------
- static rgba from_wavelength(double wl, double gamma = 1.0);
+ rgba& operator*=(double k)
+ {
+ r *= k;
+ g *= k;
+ b *= k;
+ a *= k;
+ return *this;
+ }
- //--------------------------------------------------------------------
- explicit rgba(double wavelen, double gamma=1.0)
- {
- *this = from_wavelength(wavelen, gamma);
- }
+ //--------------------------------------------------------------------
+ static rgba no_color() { return rgba(0,0,0,0); }
+
+ //--------------------------------------------------------------------
+ static rgba from_wavelength(double wl, double gamma = 1.0);
+ //--------------------------------------------------------------------
+ explicit rgba(double wavelen, double gamma=1.0)
+ {
+ *this = from_wavelength(wavelen, gamma);
+ }
+
+};
+
+inline rgba operator+(const rgba& a, const rgba& b)
+{
+ return rgba(a) += b;
+}
+
+inline rgba operator*(const rgba& a, double b)
+{
+ return rgba(a) *= b;
+}
+
+//------------------------------------------------------------------------
+inline rgba rgba::from_wavelength(double wl, double gamma)
+{
+ rgba t(0.0, 0.0, 0.0);
+
+ if (wl >= 380.0 && wl <= 440.0)
+ {
+ t.r = -1.0 * (wl - 440.0) / (440.0 - 380.0);
+ t.b = 1.0;
+ }
+ else if (wl >= 440.0 && wl <= 490.0)
+ {
+ t.g = (wl - 440.0) / (490.0 - 440.0);
+ t.b = 1.0;
+ }
+ else if (wl >= 490.0 && wl <= 510.0)
+ {
+ t.g = 1.0;
+ t.b = -1.0 * (wl - 510.0) / (510.0 - 490.0);
+ }
+ else if (wl >= 510.0 && wl <= 580.0)
+ {
+ t.r = (wl - 510.0) / (580.0 - 510.0);
+ t.g = 1.0;
+ }
+ else if (wl >= 580.0 && wl <= 645.0)
+ {
+ t.r = 1.0;
+ t.g = -1.0 * (wl - 645.0) / (645.0 - 580.0);
+ }
+ else if (wl >= 645.0 && wl <= 780.0)
+ {
+ t.r = 1.0;
+ }
+
+ double s = 1.0;
+ if (wl > 700.0) s = 0.3 + 0.7 * (780.0 - wl) / (780.0 - 700.0);
+ else if (wl < 420.0) s = 0.3 + 0.7 * (wl - 380.0) / (420.0 - 380.0);
+
+ t.r = pow(t.r * s, gamma);
+ t.g = pow(t.g * s, gamma);
+ t.b = pow(t.b * s, gamma);
+ return t;
+}
+
+inline rgba rgba_pre(double r, double g, double b, double a)
+{
+ return rgba(r, g, b, a).premultiply();
+}
+
+
+//===================================================================rgba8
+template<class Colorspace>
+struct rgba8T
+{
+ typedef int8u value_type;
+ typedef int32u calc_type;
+ typedef int32 long_type;
+ enum base_scale_e
+ {
+ base_shift = 8,
+ base_scale = 1 << base_shift,
+ base_mask = base_scale - 1,
+ base_MSB = 1 << (base_shift - 1)
};
+ typedef rgba8T self_type;
+
- //----------------------------------------------------------------rgba_pre
- inline rgba rgba_pre(double r, double g, double b, double a=1.0)
+ value_type r;
+ value_type g;
+ value_type b;
+ value_type a;
+
+ static void convert(rgba8T<linear>& dst, const rgba8T<sRGB>& src)
{
- return rgba(r, g, b, a).premultiply();
+ dst.r = sRGB_conv<value_type>::rgb_from_sRGB(src.r);
+ dst.g = sRGB_conv<value_type>::rgb_from_sRGB(src.g);
+ dst.b = sRGB_conv<value_type>::rgb_from_sRGB(src.b);
+ dst.a = src.a;
}
- inline rgba rgba_pre(const rgba& c)
+
+ static void convert(rgba8T<sRGB>& dst, const rgba8T<linear>& src)
{
- return rgba(c).premultiply();
+ dst.r = sRGB_conv<value_type>::rgb_to_sRGB(src.r);
+ dst.g = sRGB_conv<value_type>::rgb_to_sRGB(src.g);
+ dst.b = sRGB_conv<value_type>::rgb_to_sRGB(src.b);
+ dst.a = src.a;
}
- inline rgba rgba_pre(const rgba& c, double a)
+
+ static void convert(rgba8T<linear>& dst, const rgba& src)
{
- return rgba(c, a).premultiply();
+ dst.r = value_type(uround(src.r * base_mask));
+ dst.g = value_type(uround(src.g * base_mask));
+ dst.b = value_type(uround(src.b * base_mask));
+ dst.a = value_type(uround(src.a * base_mask));
}
- //------------------------------------------------------------------------
- inline rgba rgba::from_wavelength(double wl, double gamma)
+ static void convert(rgba8T<sRGB>& dst, const rgba& src)
{
- rgba t(0.0, 0.0, 0.0);
+ // Use the "float" table.
+ dst.r = sRGB_conv<float>::rgb_to_sRGB(float(src.r));
+ dst.g = sRGB_conv<float>::rgb_to_sRGB(float(src.g));
+ dst.b = sRGB_conv<float>::rgb_to_sRGB(float(src.b));
+ dst.a = sRGB_conv<float>::alpha_to_sRGB(float(src.a));
+ }
- if(wl >= 380.0 && wl <= 440.0)
- {
- t.r = -1.0 * (wl - 440.0) / (440.0 - 380.0);
- t.b = 1.0;
- }
- else
- if(wl >= 440.0 && wl <= 490.0)
- {
- t.g = (wl - 440.0) / (490.0 - 440.0);
- t.b = 1.0;
- }
- else
- if(wl >= 490.0 && wl <= 510.0)
- {
- t.g = 1.0;
- t.b = -1.0 * (wl - 510.0) / (510.0 - 490.0);
- }
- else
- if(wl >= 510.0 && wl <= 580.0)
- {
- t.r = (wl - 510.0) / (580.0 - 510.0);
- t.g = 1.0;
- }
- else
- if(wl >= 580.0 && wl <= 645.0)
- {
- t.r = 1.0;
- t.g = -1.0 * (wl - 645.0) / (645.0 - 580.0);
- }
- else
- if(wl >= 645.0 && wl <= 780.0)
- {
- t.r = 1.0;
- }
+ static void convert(rgba& dst, const rgba8T<linear>& src)
+ {
+ dst.r = src.r / 255.0;
+ dst.g = src.g / 255.0;
+ dst.b = src.b / 255.0;
+ dst.a = src.a / 255.0;
+ }
+
+ static void convert(rgba& dst, const rgba8T<sRGB>& src)
+ {
+ // Use the "float" table.
+ dst.r = sRGB_conv<float>::rgb_from_sRGB(src.r);
+ dst.g = sRGB_conv<float>::rgb_from_sRGB(src.g);
+ dst.b = sRGB_conv<float>::rgb_from_sRGB(src.b);
+ dst.a = sRGB_conv<float>::alpha_from_sRGB(src.a);
+ }
+
+ //--------------------------------------------------------------------
+ rgba8T() {}
- double s = 1.0;
- if(wl > 700.0) s = 0.3 + 0.7 * (780.0 - wl) / (780.0 - 700.0);
- else if(wl < 420.0) s = 0.3 + 0.7 * (wl - 380.0) / (420.0 - 380.0);
+ //--------------------------------------------------------------------
+ rgba8T(unsigned r_, unsigned g_, unsigned b_, unsigned a_ = base_mask) :
+ r(value_type(r_)),
+ g(value_type(g_)),
+ b(value_type(b_)),
+ a(value_type(a_)) {}
- t.r = pow(t.r * s, gamma);
- t.g = pow(t.g * s, gamma);
- t.b = pow(t.b * s, gamma);
- return t;
+ //--------------------------------------------------------------------
+ rgba8T(const rgba& c)
+ {
+ convert(*this, c);
}
+ //--------------------------------------------------------------------
+ rgba8T(const self_type& c, unsigned a_) :
+ r(c.r), g(c.g), b(c.b), a(value_type(a_)) {}
+ //--------------------------------------------------------------------
+ template<class T>
+ rgba8T(const rgba8T<T>& c)
+ {
+ convert(*this, c);
+ }
-
- //===================================================================rgba8
- struct rgba8
+ //--------------------------------------------------------------------
+ operator rgba() const
{
- typedef int8u value_type;
- typedef int32u calc_type;
- typedef int32 long_type;
- enum base_scale_e
- {
- base_shift = 8,
- base_scale = 1 << base_shift,
- base_mask = base_scale - 1
- };
- typedef rgba8 self_type;
-
-
- value_type r;
- value_type g;
- value_type b;
- value_type a;
-
- //--------------------------------------------------------------------
- rgba8() {}
-
- //--------------------------------------------------------------------
- rgba8(unsigned r_, unsigned g_, unsigned b_, unsigned a_=base_mask) :
- r(value_type(r_)),
- g(value_type(g_)),
- b(value_type(b_)),
- a(value_type(a_)) {}
-
- //--------------------------------------------------------------------
- rgba8(const rgba& c, double a_) :
- r((value_type)uround(c.r * double(base_mask))),
- g((value_type)uround(c.g * double(base_mask))),
- b((value_type)uround(c.b * double(base_mask))),
- a((value_type)uround(a_ * double(base_mask))) {}
-
- //--------------------------------------------------------------------
- rgba8(const self_type& c, unsigned a_) :
- r(c.r), g(c.g), b(c.b), a(value_type(a_)) {}
-
- //--------------------------------------------------------------------
- rgba8(const rgba& c) :
- r((value_type)uround(c.r * double(base_mask))),
- g((value_type)uround(c.g * double(base_mask))),
- b((value_type)uround(c.b * double(base_mask))),
- a((value_type)uround(c.a * double(base_mask))) {}
-
- //--------------------------------------------------------------------
- void clear()
+ rgba c;
+ convert(c, *this);
+ return c;
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE double to_double(value_type a)
+ {
+ return double(a) / base_mask;
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type from_double(double a)
+ {
+ return value_type(uround(a * base_mask));
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type empty_value()
+ {
+ return 0;
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type full_value()
+ {
+ return base_mask;
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE bool is_transparent() const
+ {
+ return a == 0;
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE bool is_opaque() const
+ {
+ return a == base_mask;
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type invert(value_type x)
+ {
+ return base_mask - x;
+ }
+
+ //--------------------------------------------------------------------
+ // Fixed-point multiply, exact over int8u.
+ static AGG_INLINE value_type multiply(value_type a, value_type b)
+ {
+ calc_type t = a * b + base_MSB;
+ return value_type(((t >> base_shift) + t) >> base_shift);
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type demultiply(value_type a, value_type b)
+ {
+ if (a * b == 0)
{
- r = g = b = a = 0;
+ return 0;
}
-
- //--------------------------------------------------------------------
- const self_type& transparent()
+ else if (a >= b)
{
- a = 0;
- return *this;
+ return base_mask;
}
+ else return value_type((a * base_mask + (b >> 1)) / b);
+ }
- //--------------------------------------------------------------------
- const self_type& opacity(double a_)
- {
- if(a_ < 0.0) a_ = 0.0;
- if(a_ > 1.0) a_ = 1.0;
- a = (value_type)uround(a_ * double(base_mask));
- return *this;
- }
+ //--------------------------------------------------------------------
+ template<typename T>
+ static AGG_INLINE T downscale(T a)
+ {
+ return a >> base_shift;
+ }
- //--------------------------------------------------------------------
- double opacity() const
- {
- return double(a) / double(base_mask);
- }
+ //--------------------------------------------------------------------
+ template<typename T>
+ static AGG_INLINE T downshift(T a, unsigned n)
+ {
+ return a >> n;
+ }
- //--------------------------------------------------------------------
- AGG_INLINE const self_type& premultiply()
+ //--------------------------------------------------------------------
+ // Fixed-point multiply, exact over int8u.
+ // Specifically for multiplying a color component by a cover.
+ static AGG_INLINE value_type mult_cover(value_type a, cover_type b)
+ {
+ return multiply(a, b);
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE cover_type scale_cover(cover_type a, value_type b)
+ {
+ return multiply(b, a);
+ }
+
+ //--------------------------------------------------------------------
+ // Interpolate p to q by a, assuming q is premultiplied by a.
+ static AGG_INLINE value_type prelerp(value_type p, value_type q, value_type a)
+ {
+ return p + q - multiply(p, a);
+ }
+
+ //--------------------------------------------------------------------
+ // Interpolate p to q by a.
+ static AGG_INLINE value_type lerp(value_type p, value_type q, value_type a)
+ {
+ int t = (q - p) * a + base_MSB - (p > q);
+ return value_type(p + (((t >> base_shift) + t) >> base_shift));
+ }
+
+ //--------------------------------------------------------------------
+ self_type& clear()
+ {
+ r = g = b = a = 0;
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ self_type& transparent()
+ {
+ a = 0;
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ self_type& opacity(double a_)
+ {
+ if (a_ < 0) a = 0;
+ else if (a_ > 1) a = 1;
+ else a = (value_type)uround(a_ * double(base_mask));
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ double opacity() const
+ {
+ return double(a) / double(base_mask);
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE self_type& premultiply()
+ {
+ if (a != base_mask)
{
- if(a == base_mask) return *this;
- if(a == 0)
- {
- r = g = b = 0;
- return *this;
- }
- r = value_type((calc_type(r) * a) >> base_shift);
- g = value_type((calc_type(g) * a) >> base_shift);
- b = value_type((calc_type(b) * a) >> base_shift);
- return *this;
+ r = multiply(r, a);
+ g = multiply(g, a);
+ b = multiply(b, a);
}
+ return *this;
+ }
- //--------------------------------------------------------------------
- AGG_INLINE const self_type& premultiply(unsigned a_)
+ //--------------------------------------------------------------------
+ AGG_INLINE self_type& premultiply(unsigned a_)
+ {
+ if (a != base_mask || a_ < base_mask)
{
- if(a == base_mask && a_ >= base_mask) return *this;
- if(a == 0 || a_ == 0)
+ if (a == 0 || a_ == 0)
{
r = g = b = a = 0;
- return *this;
}
- calc_type r_ = (calc_type(r) * a_) / a;
- calc_type g_ = (calc_type(g) * a_) / a;
- calc_type b_ = (calc_type(b) * a_) / a;
- r = value_type((r_ > a_) ? a_ : r_);
- g = value_type((g_ > a_) ? a_ : g_);
- b = value_type((b_ > a_) ? a_ : b_);
- a = value_type(a_);
- return *this;
+ else
+ {
+ calc_type r_ = (calc_type(r) * a_) / a;
+ calc_type g_ = (calc_type(g) * a_) / a;
+ calc_type b_ = (calc_type(b) * a_) / a;
+ r = value_type((r_ > a_) ? a_ : r_);
+ g = value_type((g_ > a_) ? a_ : g_);
+ b = value_type((b_ > a_) ? a_ : b_);
+ a = value_type(a_);
+ }
}
+ return *this;
+ }
- //--------------------------------------------------------------------
- AGG_INLINE const self_type& demultiply()
+ //--------------------------------------------------------------------
+ AGG_INLINE self_type& demultiply()
+ {
+ if (a < base_mask)
{
- if(a == base_mask) return *this;
- if(a == 0)
+ if (a == 0)
{
r = g = b = 0;
- return *this;
}
- calc_type r_ = (calc_type(r) * base_mask) / a;
- calc_type g_ = (calc_type(g) * base_mask) / a;
- calc_type b_ = (calc_type(b) * base_mask) / a;
- r = value_type((r_ > calc_type(base_mask)) ? calc_type(base_mask) : r_);
- g = value_type((g_ > calc_type(base_mask)) ? calc_type(base_mask) : g_);
- b = value_type((b_ > calc_type(base_mask)) ? calc_type(base_mask) : b_);
- return *this;
+ else
+ {
+ calc_type r_ = (calc_type(r) * base_mask) / a;
+ calc_type g_ = (calc_type(g) * base_mask) / a;
+ calc_type b_ = (calc_type(b) * base_mask) / a;
+ r = value_type((r_ > calc_type(base_mask)) ? calc_type(base_mask) : r_);
+ g = value_type((g_ > calc_type(base_mask)) ? calc_type(base_mask) : g_);
+ b = value_type((b_ > calc_type(base_mask)) ? calc_type(base_mask) : b_);
+ }
}
+ return *this;
+ }
- //--------------------------------------------------------------------
- AGG_INLINE self_type gradient(const self_type& c, double k) const
- {
- self_type ret;
- calc_type ik = uround(k * base_scale);
- ret.r = value_type(calc_type(r) + (((calc_type(c.r) - r) * ik) >> base_shift));
- ret.g = value_type(calc_type(g) + (((calc_type(c.g) - g) * ik) >> base_shift));
- ret.b = value_type(calc_type(b) + (((calc_type(c.b) - b) * ik) >> base_shift));
- ret.a = value_type(calc_type(a) + (((calc_type(c.a) - a) * ik) >> base_shift));
- return ret;
- }
+ //--------------------------------------------------------------------
+ AGG_INLINE self_type gradient(const self_type& c, double k) const
+ {
+ self_type ret;
+ calc_type ik = uround(k * base_mask);
+ ret.r = lerp(r, c.r, ik);
+ ret.g = lerp(g, c.g, ik);
+ ret.b = lerp(b, c.b, ik);
+ ret.a = lerp(a, c.a, ik);
+ return ret;
+ }
- //--------------------------------------------------------------------
- AGG_INLINE void add(const self_type& c, unsigned cover)
+ //--------------------------------------------------------------------
+ AGG_INLINE void add(const self_type& c, unsigned cover)
+ {
+ calc_type cr, cg, cb, ca;
+ if (cover == cover_mask)
{
- calc_type cr, cg, cb, ca;
- if(cover == cover_mask)
+ if (c.a == base_mask)
{
- if(c.a == base_mask)
- {
- *this = c;
- }
- else
- {
- cr = r + c.r; r = (cr > calc_type(base_mask)) ? calc_type(base_mask) : cr;
- cg = g + c.g; g = (cg > calc_type(base_mask)) ? calc_type(base_mask) : cg;
- cb = b + c.b; b = (cb > calc_type(base_mask)) ? calc_type(base_mask) : cb;
- ca = a + c.a; a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca;
- }
+ *this = c;
+ return;
}
else
{
- cr = r + ((c.r * cover + cover_mask/2) >> cover_shift);
- cg = g + ((c.g * cover + cover_mask/2) >> cover_shift);
- cb = b + ((c.b * cover + cover_mask/2) >> cover_shift);
- ca = a + ((c.a * cover + cover_mask/2) >> cover_shift);
- r = (cr > calc_type(base_mask)) ? calc_type(base_mask) : cr;
- g = (cg > calc_type(base_mask)) ? calc_type(base_mask) : cg;
- b = (cb > calc_type(base_mask)) ? calc_type(base_mask) : cb;
- a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca;
+ cr = r + c.r;
+ cg = g + c.g;
+ cb = b + c.b;
+ ca = a + c.a;
}
}
-
- //--------------------------------------------------------------------
- template<class GammaLUT>
- AGG_INLINE void apply_gamma_dir(const GammaLUT& gamma)
+ else
{
- r = gamma.dir(r);
- g = gamma.dir(g);
- b = gamma.dir(b);
+ cr = r + mult_cover(c.r, cover);
+ cg = g + mult_cover(c.g, cover);
+ cb = b + mult_cover(c.b, cover);
+ ca = a + mult_cover(c.a, cover);
}
+ r = (value_type)((cr > calc_type(base_mask)) ? calc_type(base_mask) : cr);
+ g = (value_type)((cg > calc_type(base_mask)) ? calc_type(base_mask) : cg);
+ b = (value_type)((cb > calc_type(base_mask)) ? calc_type(base_mask) : cb);
+ a = (value_type)((ca > calc_type(base_mask)) ? calc_type(base_mask) : ca);
+ }
- //--------------------------------------------------------------------
- template<class GammaLUT>
- AGG_INLINE void apply_gamma_inv(const GammaLUT& gamma)
- {
- r = gamma.inv(r);
- g = gamma.inv(g);
- b = gamma.inv(b);
- }
+ //--------------------------------------------------------------------
+ template<class GammaLUT>
+ AGG_INLINE void apply_gamma_dir(const GammaLUT& gamma)
+ {
+ r = gamma.dir(r);
+ g = gamma.dir(g);
+ b = gamma.dir(b);
+ }
- //--------------------------------------------------------------------
- static self_type no_color() { return self_type(0,0,0,0); }
+ //--------------------------------------------------------------------
+ template<class GammaLUT>
+ AGG_INLINE void apply_gamma_inv(const GammaLUT& gamma)
+ {
+ r = gamma.inv(r);
+ g = gamma.inv(g);
+ b = gamma.inv(b);
+ }
- //--------------------------------------------------------------------
- static self_type from_wavelength(double wl, double gamma = 1.0)
- {
- return self_type(rgba::from_wavelength(wl, gamma));
- }
+ //--------------------------------------------------------------------
+ static self_type no_color() { return self_type(0,0,0,0); }
+
+ //--------------------------------------------------------------------
+ static self_type from_wavelength(double wl, double gamma = 1.0)
+ {
+ return self_type(rgba::from_wavelength(wl, gamma));
+ }
+};
+
+typedef rgba8T<linear> rgba8;
+typedef rgba8T<sRGB> srgba8;
+
+//-------------------------------------------------------------rgba8_pre
+inline rgba8 rgba8_pre(unsigned r, unsigned g, unsigned b,
+ unsigned a = rgba8::base_mask)
+{
+ return rgba8(r,g,b,a).premultiply();
+}
+inline rgba8 rgba8_pre(const rgba8& c)
+{
+ return rgba8(c).premultiply();
+}
+inline rgba8 rgba8_pre(const rgba8& c, unsigned a)
+{
+ return rgba8(c,a).premultiply();
+}
+inline rgba8 rgba8_pre(const rgba& c)
+{
+ return rgba8(c).premultiply();
+}
+inline rgba8 rgba8_pre(const rgba& c, double a)
+{
+ return rgba8(c,a).premultiply();
+}
+
+
+
+
+//-------------------------------------------------------------rgb8_packed
+inline rgba8 rgb8_packed(unsigned v)
+{
+ return rgba8((v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF);
+}
+
+//-------------------------------------------------------------bgr8_packed
+inline rgba8 bgr8_packed(unsigned v)
+{
+ return rgba8(v & 0xFF, (v >> 8) & 0xFF, (v >> 16) & 0xFF);
+}
+
+//------------------------------------------------------------argb8_packed
+inline rgba8 argb8_packed(unsigned v)
+{
+ return rgba8((v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF, v >> 24);
+}
+
+//---------------------------------------------------------rgba8_gamma_dir
+template<class GammaLUT>
+rgba8 rgba8_gamma_dir(rgba8 c, const GammaLUT& gamma)
+{
+ return rgba8(gamma.dir(c.r), gamma.dir(c.g), gamma.dir(c.b), c.a);
+}
+
+//---------------------------------------------------------rgba8_gamma_inv
+template<class GammaLUT>
+rgba8 rgba8_gamma_inv(rgba8 c, const GammaLUT& gamma)
+{
+ return rgba8(gamma.inv(c.r), gamma.inv(c.g), gamma.inv(c.b), c.a);
+}
+
+
+
+//==================================================================rgba16
+struct rgba16
+{
+ typedef int16u value_type;
+ typedef int32u calc_type;
+ typedef int64 long_type;
+ enum base_scale_e
+ {
+ base_shift = 16,
+ base_scale = 1 << base_shift,
+ base_mask = base_scale - 1,
+ base_MSB = 1 << (base_shift - 1)
};
+ typedef rgba16 self_type;
+
+ value_type r;
+ value_type g;
+ value_type b;
+ value_type a;
+
+ //--------------------------------------------------------------------
+ rgba16() {}
+
+ //--------------------------------------------------------------------
+ rgba16(unsigned r_, unsigned g_, unsigned b_, unsigned a_=base_mask) :
+ r(value_type(r_)),
+ g(value_type(g_)),
+ b(value_type(b_)),
+ a(value_type(a_)) {}
+
+ //--------------------------------------------------------------------
+ rgba16(const self_type& c, unsigned a_) :
+ r(c.r), g(c.g), b(c.b), a(value_type(a_)) {}
+
+ //--------------------------------------------------------------------
+ rgba16(const rgba& c) :
+ r((value_type)uround(c.r * double(base_mask))),
+ g((value_type)uround(c.g * double(base_mask))),
+ b((value_type)uround(c.b * double(base_mask))),
+ a((value_type)uround(c.a * double(base_mask))) {}
+
+ //--------------------------------------------------------------------
+ rgba16(const rgba8& c) :
+ r(value_type((value_type(c.r) << 8) | c.r)),
+ g(value_type((value_type(c.g) << 8) | c.g)),
+ b(value_type((value_type(c.b) << 8) | c.b)),
+ a(value_type((value_type(c.a) << 8) | c.a)) {}
+
+ //--------------------------------------------------------------------
+ rgba16(const srgba8& c) :
+ r(sRGB_conv<value_type>::rgb_from_sRGB(c.r)),
+ g(sRGB_conv<value_type>::rgb_from_sRGB(c.g)),
+ b(sRGB_conv<value_type>::rgb_from_sRGB(c.b)),
+ a(sRGB_conv<value_type>::alpha_from_sRGB(c.a)) {}
+
+ //--------------------------------------------------------------------
+ operator rgba() const
+ {
+ return rgba(
+ r / 65535.0,
+ g / 65535.0,
+ b / 65535.0,
+ a / 65535.0);
+ }
+ //--------------------------------------------------------------------
+ operator rgba8() const
+ {
+ return rgba8(r >> 8, g >> 8, b >> 8, a >> 8);
+ }
- //-------------------------------------------------------------rgba8_pre
- inline rgba8 rgba8_pre(unsigned r, unsigned g, unsigned b,
- unsigned a = rgba8::base_mask)
+ //--------------------------------------------------------------------
+ operator srgba8() const
{
- return rgba8(r,g,b,a).premultiply();
+ // Return (non-premultiplied) sRGB values.
+ return srgba8(
+ sRGB_conv<value_type>::rgb_to_sRGB(r),
+ sRGB_conv<value_type>::rgb_to_sRGB(g),
+ sRGB_conv<value_type>::rgb_to_sRGB(b),
+ sRGB_conv<value_type>::alpha_to_sRGB(a));
}
- inline rgba8 rgba8_pre(const rgba8& c)
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE double to_double(value_type a)
{
- return rgba8(c).premultiply();
+ return double(a) / base_mask;
}
- inline rgba8 rgba8_pre(const rgba8& c, unsigned a)
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type from_double(double a)
{
- return rgba8(c,a).premultiply();
+ return value_type(uround(a * base_mask));
}
- inline rgba8 rgba8_pre(const rgba& c)
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type empty_value()
{
- return rgba8(c).premultiply();
+ return 0;
}
- inline rgba8 rgba8_pre(const rgba& c, double a)
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type full_value()
{
- return rgba8(c,a).premultiply();
+ return base_mask;
}
+ //--------------------------------------------------------------------
+ AGG_INLINE bool is_transparent() const
+ {
+ return a == 0;
+ }
- //-------------------------------------------------------------rgb8_packed
- inline rgba8 rgb8_packed(unsigned v)
+ //--------------------------------------------------------------------
+ AGG_INLINE bool is_opaque() const
{
- return rgba8((v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF);
+ return a == base_mask;
}
- //-------------------------------------------------------------bgr8_packed
- inline rgba8 bgr8_packed(unsigned v)
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type invert(value_type x)
{
- return rgba8(v & 0xFF, (v >> 8) & 0xFF, (v >> 16) & 0xFF);
+ return base_mask - x;
}
- //------------------------------------------------------------argb8_packed
- inline rgba8 argb8_packed(unsigned v)
+ //--------------------------------------------------------------------
+ // Fixed-point multiply, exact over int16u.
+ static AGG_INLINE value_type multiply(value_type a, value_type b)
{
- return rgba8((v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF, v >> 24);
+ calc_type t = a * b + base_MSB;
+ return value_type(((t >> base_shift) + t) >> base_shift);
}
- //---------------------------------------------------------rgba8_gamma_dir
- template<class GammaLUT>
- rgba8 rgba8_gamma_dir(rgba8 c, const GammaLUT& gamma)
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type demultiply(value_type a, value_type b)
{
- return rgba8(gamma.dir(c.r), gamma.dir(c.g), gamma.dir(c.b), c.a);
+ if (a * b == 0)
+ {
+ return 0;
+ }
+ else if (a >= b)
+ {
+ return base_mask;
+ }
+ else return value_type((a * base_mask + (b >> 1)) / b);
}
- //---------------------------------------------------------rgba8_gamma_inv
- template<class GammaLUT>
- rgba8 rgba8_gamma_inv(rgba8 c, const GammaLUT& gamma)
+ //--------------------------------------------------------------------
+ template<typename T>
+ static AGG_INLINE T downscale(T a)
{
- return rgba8(gamma.inv(c.r), gamma.inv(c.g), gamma.inv(c.b), c.a);
+ return a >> base_shift;
}
+ //--------------------------------------------------------------------
+ template<typename T>
+ static AGG_INLINE T downshift(T a, unsigned n)
+ {
+ return a >> n;
+ }
+ //--------------------------------------------------------------------
+ // Fixed-point multiply, almost exact over int16u.
+ // Specifically for multiplying a color component by a cover.
+ static AGG_INLINE value_type mult_cover(value_type a, cover_type b)
+ {
+ return multiply(a, (b << 8) | b);
+ }
+ //--------------------------------------------------------------------
+ static AGG_INLINE cover_type scale_cover(cover_type a, value_type b)
+ {
+ return multiply((a << 8) | a, b) >> 8;
+ }
+ //--------------------------------------------------------------------
+ // Interpolate p to q by a, assuming q is premultiplied by a.
+ static AGG_INLINE value_type prelerp(value_type p, value_type q, value_type a)
+ {
+ return p + q - multiply(p, a);
+ }
- //==================================================================rgba16
- struct rgba16
+ //--------------------------------------------------------------------
+ // Interpolate p to q by a.
+ static AGG_INLINE value_type lerp(value_type p, value_type q, value_type a)
{
- typedef int16u value_type;
- typedef int32u calc_type;
- typedef int64 long_type;
- enum base_scale_e
- {
- base_shift = 16,
- base_scale = 1 << base_shift,
- base_mask = base_scale - 1
- };
- typedef rgba16 self_type;
-
- value_type r;
- value_type g;
- value_type b;
- value_type a;
-
- //--------------------------------------------------------------------
- rgba16() {}
-
- //--------------------------------------------------------------------
- rgba16(unsigned r_, unsigned g_, unsigned b_, unsigned a_=base_mask) :
- r(value_type(r_)),
- g(value_type(g_)),
- b(value_type(b_)),
- a(value_type(a_)) {}
-
- //--------------------------------------------------------------------
- rgba16(const self_type& c, unsigned a_) :
- r(c.r), g(c.g), b(c.b), a(value_type(a_)) {}
-
- //--------------------------------------------------------------------
- rgba16(const rgba& c) :
- r((value_type)uround(c.r * double(base_mask))),
- g((value_type)uround(c.g * double(base_mask))),
- b((value_type)uround(c.b * double(base_mask))),
- a((value_type)uround(c.a * double(base_mask))) {}
-
- //--------------------------------------------------------------------
- rgba16(const rgba& c, double a_) :
- r((value_type)uround(c.r * double(base_mask))),
- g((value_type)uround(c.g * double(base_mask))),
- b((value_type)uround(c.b * double(base_mask))),
- a((value_type)uround(a_ * double(base_mask))) {}
-
- //--------------------------------------------------------------------
- rgba16(const rgba8& c) :
- r(value_type((value_type(c.r) << 8) | c.r)),
- g(value_type((value_type(c.g) << 8) | c.g)),
- b(value_type((value_type(c.b) << 8) | c.b)),
- a(value_type((value_type(c.a) << 8) | c.a)) {}
-
- //--------------------------------------------------------------------
- rgba16(const rgba8& c, unsigned a_) :
- r(value_type((value_type(c.r) << 8) | c.r)),
- g(value_type((value_type(c.g) << 8) | c.g)),
- b(value_type((value_type(c.b) << 8) | c.b)),
- a(value_type(( a_ << 8) | c.a)) {}
-
- //--------------------------------------------------------------------
- void clear()
- {
- r = g = b = a = 0;
- }
-
- //--------------------------------------------------------------------
- const self_type& transparent()
- {
- a = 0;
- return *this;
- }
+ int t = (q - p) * a + base_MSB - (p > q);
+ return value_type(p + (((t >> base_shift) + t) >> base_shift));
+ }
- //--------------------------------------------------------------------
- AGG_INLINE const self_type& opacity(double a_)
- {
- if(a_ < 0.0) a_ = 0.0;
- if(a_ > 1.0) a_ = 1.0;
- a = (value_type)uround(a_ * double(base_mask));
- return *this;
- }
+ //--------------------------------------------------------------------
+ self_type& clear()
+ {
+ r = g = b = a = 0;
+ return *this;
+ }
- //--------------------------------------------------------------------
- double opacity() const
- {
- return double(a) / double(base_mask);
- }
+ //--------------------------------------------------------------------
+ self_type& transparent()
+ {
+ a = 0;
+ return *this;
+ }
- //--------------------------------------------------------------------
- AGG_INLINE const self_type& premultiply()
+ //--------------------------------------------------------------------
+ AGG_INLINE self_type& opacity(double a_)
+ {
+ if (a_ < 0) a = 0;
+ if (a_ > 1) a = 1;
+ a = value_type(uround(a_ * double(base_mask)));
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ double opacity() const
+ {
+ return double(a) / double(base_mask);
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE self_type& premultiply()
+ {
+ if (a != base_mask)
{
- if(a == base_mask) return *this;
- if(a == 0)
- {
- r = g = b = 0;
- return *this;
- }
- r = value_type((calc_type(r) * a) >> base_shift);
- g = value_type((calc_type(g) * a) >> base_shift);
- b = value_type((calc_type(b) * a) >> base_shift);
- return *this;
+ r = multiply(r, a);
+ g = multiply(g, a);
+ b = multiply(b, a);
}
+ return *this;
+ }
- //--------------------------------------------------------------------
- AGG_INLINE const self_type& premultiply(unsigned a_)
+ //--------------------------------------------------------------------
+ AGG_INLINE self_type& premultiply(unsigned a_)
+ {
+ if (a < base_mask || a_ < base_mask)
{
- if(a == base_mask && a_ >= base_mask) return *this;
- if(a == 0 || a_ == 0)
+ if (a == 0 || a_ == 0)
{
r = g = b = a = 0;
- return *this;
}
- calc_type r_ = (calc_type(r) * a_) / a;
- calc_type g_ = (calc_type(g) * a_) / a;
- calc_type b_ = (calc_type(b) * a_) / a;
- r = value_type((r_ > a_) ? a_ : r_);
- g = value_type((g_ > a_) ? a_ : g_);
- b = value_type((b_ > a_) ? a_ : b_);
- a = value_type(a_);
- return *this;
+ else
+ {
+ calc_type r_ = (calc_type(r) * a_) / a;
+ calc_type g_ = (calc_type(g) * a_) / a;
+ calc_type b_ = (calc_type(b) * a_) / a;
+ r = value_type((r_ > a_) ? a_ : r_);
+ g = value_type((g_ > a_) ? a_ : g_);
+ b = value_type((b_ > a_) ? a_ : b_);
+ a = value_type(a_);
+ }
}
+ return *this;
+ }
- //--------------------------------------------------------------------
- AGG_INLINE const self_type& demultiply()
+ //--------------------------------------------------------------------
+ AGG_INLINE self_type& demultiply()
+ {
+ if (a < base_mask)
{
- if(a == base_mask) return *this;
- if(a == 0)
+ if (a == 0)
{
r = g = b = 0;
- return *this;
}
- calc_type r_ = (calc_type(r) * base_mask) / a;
- calc_type g_ = (calc_type(g) * base_mask) / a;
- calc_type b_ = (calc_type(b) * base_mask) / a;
- r = value_type((r_ > calc_type(base_mask)) ? calc_type(base_mask) : r_);
- g = value_type((g_ > calc_type(base_mask)) ? calc_type(base_mask) : g_);
- b = value_type((b_ > calc_type(base_mask)) ? calc_type(base_mask) : b_);
- return *this;
+ else
+ {
+ calc_type r_ = (calc_type(r) * base_mask) / a;
+ calc_type g_ = (calc_type(g) * base_mask) / a;
+ calc_type b_ = (calc_type(b) * base_mask) / a;
+ r = value_type((r_ > calc_type(base_mask)) ? calc_type(base_mask) : r_);
+ g = value_type((g_ > calc_type(base_mask)) ? calc_type(base_mask) : g_);
+ b = value_type((b_ > calc_type(base_mask)) ? calc_type(base_mask) : b_);
+ }
}
+ return *this;
+ }
- //--------------------------------------------------------------------
- AGG_INLINE self_type gradient(const self_type& c, double k) const
- {
- self_type ret;
- calc_type ik = uround(k * base_scale);
- ret.r = value_type(calc_type(r) + (((calc_type(c.r) - r) * ik) >> base_shift));
- ret.g = value_type(calc_type(g) + (((calc_type(c.g) - g) * ik) >> base_shift));
- ret.b = value_type(calc_type(b) + (((calc_type(c.b) - b) * ik) >> base_shift));
- ret.a = value_type(calc_type(a) + (((calc_type(c.a) - a) * ik) >> base_shift));
- return ret;
- }
+ //--------------------------------------------------------------------
+ AGG_INLINE self_type gradient(const self_type& c, double k) const
+ {
+ self_type ret;
+ calc_type ik = uround(k * base_mask);
+ ret.r = lerp(r, c.r, ik);
+ ret.g = lerp(g, c.g, ik);
+ ret.b = lerp(b, c.b, ik);
+ ret.a = lerp(a, c.a, ik);
+ return ret;
+ }
- //--------------------------------------------------------------------
- AGG_INLINE void add(const self_type& c, unsigned cover)
+ //--------------------------------------------------------------------
+ AGG_INLINE void add(const self_type& c, unsigned cover)
+ {
+ calc_type cr, cg, cb, ca;
+ if (cover == cover_mask)
{
- calc_type cr, cg, cb, ca;
- if(cover == cover_mask)
+ if (c.a == base_mask)
{
- if(c.a == base_mask)
- {
- *this = c;
- }
- else
- {
- cr = r + c.r; r = (cr > calc_type(base_mask)) ? calc_type(base_mask) : cr;
- cg = g + c.g; g = (cg > calc_type(base_mask)) ? calc_type(base_mask) : cg;
- cb = b + c.b; b = (cb > calc_type(base_mask)) ? calc_type(base_mask) : cb;
- ca = a + c.a; a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca;
- }
+ *this = c;
+ return;
}
else
{
- cr = r + ((c.r * cover + cover_mask) >> cover_shift);
- cg = g + ((c.g * cover + cover_mask) >> cover_shift);
- cb = b + ((c.b * cover + cover_mask) >> cover_shift);
- ca = a + ((c.a * cover + cover_mask) >> cover_shift);
- r = (cr > calc_type(base_mask)) ? calc_type(base_mask) : cr;
- g = (cg > calc_type(base_mask)) ? calc_type(base_mask) : cg;
- b = (cb > calc_type(base_mask)) ? calc_type(base_mask) : cb;
- a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca;
+ cr = r + c.r;
+ cg = g + c.g;
+ cb = b + c.b;
+ ca = a + c.a;
}
}
-
- //--------------------------------------------------------------------
- template<class GammaLUT>
- AGG_INLINE void apply_gamma_dir(const GammaLUT& gamma)
+ else
{
- r = gamma.dir(r);
- g = gamma.dir(g);
- b = gamma.dir(b);
+ cr = r + mult_cover(c.r, cover);
+ cg = g + mult_cover(c.g, cover);
+ cb = b + mult_cover(c.b, cover);
+ ca = a + mult_cover(c.a, cover);
}
+ r = (value_type)((cr > calc_type(base_mask)) ? calc_type(base_mask) : cr);
+ g = (value_type)((cg > calc_type(base_mask)) ? calc_type(base_mask) : cg);
+ b = (value_type)((cb > calc_type(base_mask)) ? calc_type(base_mask) : cb);
+ a = (value_type)((ca > calc_type(base_mask)) ? calc_type(base_mask) : ca);
+ }
- //--------------------------------------------------------------------
- template<class GammaLUT>
- AGG_INLINE void apply_gamma_inv(const GammaLUT& gamma)
- {
- r = gamma.inv(r);
- g = gamma.inv(g);
- b = gamma.inv(b);
- }
+ //--------------------------------------------------------------------
+ template<class GammaLUT>
+ AGG_INLINE void apply_gamma_dir(const GammaLUT& gamma)
+ {
+ r = gamma.dir(r);
+ g = gamma.dir(g);
+ b = gamma.dir(b);
+ }
+
+ //--------------------------------------------------------------------
+ template<class GammaLUT>
+ AGG_INLINE void apply_gamma_inv(const GammaLUT& gamma)
+ {
+ r = gamma.inv(r);
+ g = gamma.inv(g);
+ b = gamma.inv(b);
+ }
- //--------------------------------------------------------------------
- static self_type no_color() { return self_type(0,0,0,0); }
+ //--------------------------------------------------------------------
+ static self_type no_color() { return self_type(0,0,0,0); }
- //--------------------------------------------------------------------
- static self_type from_wavelength(double wl, double gamma = 1.0)
- {
- return self_type(rgba::from_wavelength(wl, gamma));
- }
- };
+ //--------------------------------------------------------------------
+ static self_type from_wavelength(double wl, double gamma = 1.0)
+ {
+ return self_type(rgba::from_wavelength(wl, gamma));
+ }
+};
+
+
+//------------------------------------------------------rgba16_gamma_dir
+template<class GammaLUT>
+rgba16 rgba16_gamma_dir(rgba16 c, const GammaLUT& gamma)
+{
+ return rgba16(gamma.dir(c.r), gamma.dir(c.g), gamma.dir(c.b), c.a);
+}
+
+//------------------------------------------------------rgba16_gamma_inv
+template<class GammaLUT>
+rgba16 rgba16_gamma_inv(rgba16 c, const GammaLUT& gamma)
+{
+ return rgba16(gamma.inv(c.r), gamma.inv(c.g), gamma.inv(c.b), c.a);
+}
+
+//====================================================================rgba32
+struct rgba32
+{
+ typedef float value_type;
+ typedef double calc_type;
+ typedef double long_type;
+ typedef rgba32 self_type;
+
+ value_type r;
+ value_type g;
+ value_type b;
+ value_type a;
+
+ //--------------------------------------------------------------------
+ rgba32() {}
+
+ //--------------------------------------------------------------------
+ rgba32(value_type r_, value_type g_, value_type b_, value_type a_= 1) :
+ r(r_), g(g_), b(b_), a(a_) {}
+
+ //--------------------------------------------------------------------
+ rgba32(const self_type& c, float a_) :
+ r(c.r), g(c.g), b(c.b), a(a_) {}
+
+ //--------------------------------------------------------------------
+ rgba32(const rgba& c) :
+ r(value_type(c.r)), g(value_type(c.g)), b(value_type(c.b)), a(value_type(c.a)) {}
+
+ //--------------------------------------------------------------------
+ rgba32(const rgba8& c) :
+ r(value_type(c.r / 255.0)),
+ g(value_type(c.g / 255.0)),
+ b(value_type(c.b / 255.0)),
+ a(value_type(c.a / 255.0)) {}
+
+ //--------------------------------------------------------------------
+ rgba32(const srgba8& c) :
+ r(sRGB_conv<value_type>::rgb_from_sRGB(c.r)),
+ g(sRGB_conv<value_type>::rgb_from_sRGB(c.g)),
+ b(sRGB_conv<value_type>::rgb_from_sRGB(c.b)),
+ a(sRGB_conv<value_type>::alpha_from_sRGB(c.a)) {}
+
+ //--------------------------------------------------------------------
+ rgba32(const rgba16& c) :
+ r(value_type(c.r / 65535.0)),
+ g(value_type(c.g / 65535.0)),
+ b(value_type(c.b / 65535.0)),
+ a(value_type(c.a / 65535.0)) {}
+
+ //--------------------------------------------------------------------
+ operator rgba() const
+ {
+ return rgba(r, g, b, a);
+ }
+
+ //--------------------------------------------------------------------
+ operator rgba8() const
+ {
+ return rgba8(
+ uround(r * 255.0),
+ uround(g * 255.0),
+ uround(b * 255.0),
+ uround(a * 255.0));
+ }
+
+ //--------------------------------------------------------------------
+ operator srgba8() const
+ {
+ return srgba8(
+ sRGB_conv<value_type>::rgb_to_sRGB(r),
+ sRGB_conv<value_type>::rgb_to_sRGB(g),
+ sRGB_conv<value_type>::rgb_to_sRGB(b),
+ sRGB_conv<value_type>::alpha_to_sRGB(a));
+ }
+
+ //--------------------------------------------------------------------
+ operator rgba16() const
+ {
+ return rgba8(
+ uround(r * 65535.0),
+ uround(g * 65535.0),
+ uround(b * 65535.0),
+ uround(a * 65535.0));
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE double to_double(value_type a)
+ {
+ return a;
+ }
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type from_double(double a)
+ {
+ return value_type(a);
+ }
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type empty_value()
+ {
+ return 0;
+ }
- //--------------------------------------------------------------rgba16_pre
- inline rgba16 rgba16_pre(unsigned r, unsigned g, unsigned b,
- unsigned a = rgba16::base_mask)
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type full_value()
{
- return rgba16(r,g,b,a).premultiply();
+ return 1;
}
- inline rgba16 rgba16_pre(const rgba16& c, unsigned a)
+
+ //--------------------------------------------------------------------
+ AGG_INLINE bool is_transparent() const
{
- return rgba16(c,a).premultiply();
+ return a <= 0;
}
- inline rgba16 rgba16_pre(const rgba& c)
+
+ //--------------------------------------------------------------------
+ AGG_INLINE bool is_opaque() const
{
- return rgba16(c).premultiply();
+ return a >= 1;
}
- inline rgba16 rgba16_pre(const rgba& c, double a)
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type invert(value_type x)
{
- return rgba16(c,a).premultiply();
+ return 1 - x;
}
- inline rgba16 rgba16_pre(const rgba8& c)
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type multiply(value_type a, value_type b)
{
- return rgba16(c).premultiply();
+ return value_type(a * b);
}
- inline rgba16 rgba16_pre(const rgba8& c, unsigned a)
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type demultiply(value_type a, value_type b)
{
- return rgba16(c,a).premultiply();
+ return (b == 0) ? 0 : value_type(a / b);
}
+ //--------------------------------------------------------------------
+ template<typename T>
+ static AGG_INLINE T downscale(T a)
+ {
+ return a;
+ }
- //------------------------------------------------------rgba16_gamma_dir
+ //--------------------------------------------------------------------
+ template<typename T>
+ static AGG_INLINE T downshift(T a, unsigned n)
+ {
+ return n > 0 ? a / (1 << n) : a;
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE value_type mult_cover(value_type a, cover_type b)
+ {
+ return value_type(a * b / cover_mask);
+ }
+
+ //--------------------------------------------------------------------
+ static AGG_INLINE cover_type scale_cover(cover_type a, value_type b)
+ {
+ return cover_type(uround(a * b));
+ }
+
+ //--------------------------------------------------------------------
+ // Interpolate p to q by a, assuming q is premultiplied by a.
+ static AGG_INLINE value_type prelerp(value_type p, value_type q, value_type a)
+ {
+ return (1 - a) * p + q; // more accurate than "p + q - p * a"
+ }
+
+ //--------------------------------------------------------------------
+ // Interpolate p to q by a.
+ static AGG_INLINE value_type lerp(value_type p, value_type q, value_type a)
+ {
+ // The form "p + a * (q - p)" avoids a multiplication, but may produce an
+ // inaccurate result. For example, "p + (q - p)" may not be exactly equal
+ // to q. Therefore, stick to the basic expression, which at least produces
+ // the correct result at either extreme.
+ return (1 - a) * p + a * q;
+ }
+
+ //--------------------------------------------------------------------
+ self_type& clear()
+ {
+ r = g = b = a = 0;
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ self_type& transparent()
+ {
+ a = 0;
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE self_type& opacity(double a_)
+ {
+ if (a_ < 0) a = 0;
+ else if (a_ > 1) a = 1;
+ else a = value_type(a_);
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ double opacity() const
+ {
+ return a;
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE self_type& premultiply()
+ {
+ if (a < 1)
+ {
+ if (a <= 0)
+ {
+ r = g = b = 0;
+ }
+ else
+ {
+ r *= a;
+ g *= a;
+ b *= a;
+ }
+ }
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE self_type& demultiply()
+ {
+ if (a < 1)
+ {
+ if (a <= 0)
+ {
+ r = g = b = 0;
+ }
+ else
+ {
+ r /= a;
+ g /= a;
+ b /= a;
+ }
+ }
+ return *this;
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE self_type gradient(const self_type& c, double k) const
+ {
+ self_type ret;
+ ret.r = value_type(r + (c.r - r) * k);
+ ret.g = value_type(g + (c.g - g) * k);
+ ret.b = value_type(b + (c.b - b) * k);
+ ret.a = value_type(a + (c.a - a) * k);
+ return ret;
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE void add(const self_type& c, unsigned cover)
+ {
+ if (cover == cover_mask)
+ {
+ if (c.is_opaque())
+ {
+ *this = c;
+ return;
+ }
+ else
+ {
+ r += c.r;
+ g += c.g;
+ b += c.b;
+ a += c.a;
+ }
+ }
+ else
+ {
+ r += mult_cover(c.r, cover);
+ g += mult_cover(c.g, cover);
+ b += mult_cover(c.b, cover);
+ a += mult_cover(c.a, cover);
+ }
+ if (a > 1) a = 1;
+ if (r > a) r = a;
+ if (g > a) g = a;
+ if (b > a) b = a;
+ }
+
+ //--------------------------------------------------------------------
template<class GammaLUT>
- rgba16 rgba16_gamma_dir(rgba16 c, const GammaLUT& gamma)
+ AGG_INLINE void apply_gamma_dir(const GammaLUT& gamma)
{
- return rgba16(gamma.dir(c.r), gamma.dir(c.g), gamma.dir(c.b), c.a);
+ r = gamma.dir(r);
+ g = gamma.dir(g);
+ b = gamma.dir(b);
}
- //------------------------------------------------------rgba16_gamma_inv
+ //--------------------------------------------------------------------
template<class GammaLUT>
- rgba16 rgba16_gamma_inv(rgba16 c, const GammaLUT& gamma)
+ AGG_INLINE void apply_gamma_inv(const GammaLUT& gamma)
{
- return rgba16(gamma.inv(c.r), gamma.inv(c.g), gamma.inv(c.b), c.a);
+ r = gamma.inv(r);
+ g = gamma.inv(g);
+ b = gamma.inv(b);
}
+ //--------------------------------------------------------------------
+ static self_type no_color() { return self_type(0,0,0,0); }
+ //--------------------------------------------------------------------
+ static self_type from_wavelength(double wl, double gamma = 1)
+ {
+ return self_type(rgba::from_wavelength(wl, gamma));
+ }
+};
}
diff --git a/deps/agg/include/agg_conv_clipper.h b/deps/agg/include/agg_conv_clipper.h
deleted file mode 100755
index 2bd4c3d..0000000
--- a/deps/agg/include/agg_conv_clipper.h
+++ /dev/null
@@ -1,295 +0,0 @@
-/*******************************************************************************
-* *
-* Author : Angus Johnson *
-* Version : 1.1 *
-* Date : 4 April 2011 *
-* Website : http://www.angusj.com *
-* Copyright : Angus Johnson 2010-2011 *
-* *
-* License: *
-* Use, modification & distribution is subject to Boost Software License Ver 1. *
-* http://www.boost.org/LICENSE_1_0.txt *
-* *
-*******************************************************************************/
-
-#ifndef AGG_CONV_CLIPPER_INCLUDED
-#define AGG_CONV_CLIPPER_INCLUDED
-
-#include <cmath>
-#include "agg_basics.h"
-#include "agg_array.h"
-#include "clipper.hpp"
-
-namespace agg
-{
- enum clipper_op_e { clipper_or,
- clipper_and, clipper_xor, clipper_a_minus_b, clipper_b_minus_a };
- enum clipper_PolyFillType {clipper_even_odd, clipper_non_zero, clipper_positive, clipper_negative};
-
- template<class VSA, class VSB> class conv_clipper
- {
- enum status { status_move_to, status_line_to, status_stop };
- typedef VSA source_a_type;
- typedef VSB source_b_type;
- typedef conv_clipper<source_a_type, source_b_type> self_type;
-
- private:
- source_a_type* m_src_a;
- source_b_type* m_src_b;
- status m_status;
- int m_vertex;
- int m_contour;
- int m_scaling_factor;
- clipper_op_e m_operation;
- pod_bvector<ClipperLib::IntPoint, 8> m_vertex_accumulator;
- ClipperLib::Paths m_poly_a;
- ClipperLib::Paths m_poly_b;
- ClipperLib::Paths m_result;
- ClipperLib::Clipper m_clipper;
- clipper_PolyFillType m_subjFillType;
- clipper_PolyFillType m_clipFillType;
-
- int Round(double val)
- {
- if ((val < 0)) return (int)(val - 0.5); else return (int)(val + 0.5);
- }
-
- public:
- conv_clipper(source_a_type &a, source_b_type &b,
- clipper_op_e op = clipper_or,
- clipper_PolyFillType subjFillType = clipper_even_odd,
- clipper_PolyFillType clipFillType = clipper_even_odd,
- int scaling_factor = 2) :
- m_src_a(&a),
- m_src_b(&b),
- m_status(status_move_to),
- m_vertex(-1),
- m_contour(-1),
- m_operation(op),
- m_subjFillType(subjFillType),
- m_clipFillType(clipFillType)
- {
- m_scaling_factor = std::max(std::min(scaling_factor, 6),0);
- m_scaling_factor = Round(std::pow((double)10, m_scaling_factor));
- }
-
- ~conv_clipper()
- {
- }
-
- void attach1(VSA &source, clipper_PolyFillType subjFillType = clipper_even_odd)
- { m_src_a = &source; m_subjFillType = subjFillType; }
- void attach2(VSB &source, clipper_PolyFillType clipFillType = clipper_even_odd)
- { m_src_b = &source; m_clipFillType = clipFillType; }
-
- void operation(clipper_op_e v) { m_operation = v; }
-
- void rewind(unsigned path_id);
- unsigned vertex(double* x, double* y);
-
- bool next_contour();
- bool next_vertex(double* x, double* y);
- void start_extracting();
- void add_vertex_(double &x, double &y);
- void end_contour(ClipperLib::Paths &p);
-
- template<class VS> void add(VS &src, ClipperLib::Paths &p){
- unsigned cmd;
- double x; double y; double start_x; double start_y;
- bool starting_first_line;
-
- start_x = 0.0;
- start_y = 0.0;
- starting_first_line = true;
- p.resize(0);
-
- cmd = src->vertex( &x , &y );
- while(!is_stop(cmd))
- {
- if(is_vertex(cmd))
- {
- if(is_move_to(cmd))
- {
- if(!starting_first_line ) end_contour(p);
- start_x = x;
- start_y = y;
- }
- add_vertex_( x, y );
- starting_first_line = false;
- }
- else if(is_end_poly(cmd))
- {
- if(!starting_first_line && is_closed(cmd))
- add_vertex_( start_x, start_y );
- }
- cmd = src->vertex( &x, &y );
- }
- end_contour(p);
- }
- };
-
- //------------------------------------------------------------------------
-
- template<class VSA, class VSB>
- void conv_clipper<VSA, VSB>::start_extracting()
- {
- m_status = status_move_to;
- m_contour = -1;
- m_vertex = -1;
- }
- //------------------------------------------------------------------------------
-
- template<class VSA, class VSB>
- void conv_clipper<VSA, VSB>::rewind(unsigned path_id)
- {
- m_src_a->rewind( path_id );
- m_src_b->rewind( path_id );
-
- add( m_src_a , m_poly_a );
- add( m_src_b , m_poly_b );
- m_result.resize(0);
-
- ClipperLib::PolyFillType pftSubj, pftClip;
- switch (m_subjFillType)
- {
- case clipper_even_odd: pftSubj = ClipperLib::pftEvenOdd; break;
- case clipper_non_zero: pftSubj = ClipperLib::pftNonZero; break;
- case clipper_positive: pftSubj = ClipperLib::pftPositive; break;
- default: pftSubj = ClipperLib::pftNegative;
- }
- switch (m_clipFillType)
- {
- case clipper_even_odd: pftClip = ClipperLib::pftEvenOdd; break;
- case clipper_non_zero: pftClip = ClipperLib::pftNonZero; break;
- case clipper_positive: pftClip = ClipperLib::pftPositive; break;
- default: pftClip = ClipperLib::pftNegative;
- }
-
- m_clipper.Clear();
- switch( m_operation ) {
- case clipper_or:
- {
- m_clipper.AddPaths( m_poly_a , ClipperLib::ptSubject, true );
- m_clipper.AddPaths( m_poly_b , ClipperLib::ptClip, true );
- m_clipper.Execute( ClipperLib::ctUnion , m_result , pftSubj, pftClip);
- break;
- }
- case clipper_and:
- {
- m_clipper.AddPaths( m_poly_a , ClipperLib::ptSubject, true );
- m_clipper.AddPaths( m_poly_b , ClipperLib::ptClip, true );
- m_clipper.Execute( ClipperLib::ctIntersection , m_result, pftSubj, pftClip );
- break;
- }
- case clipper_xor:
- {
- m_clipper.AddPaths( m_poly_a , ClipperLib::ptSubject, true );
- m_clipper.AddPaths( m_poly_b , ClipperLib::ptClip, true );
- m_clipper.Execute( ClipperLib::ctXor , m_result, pftSubj, pftClip );
- break;
- }
- case clipper_a_minus_b:
- {
- m_clipper.AddPaths( m_poly_a , ClipperLib::ptSubject, true );
- m_clipper.AddPaths( m_poly_b , ClipperLib::ptClip, true );
- m_clipper.Execute( ClipperLib::ctDifference , m_result, pftSubj, pftClip );
- break;
- }
- case clipper_b_minus_a:
- {
- m_clipper.AddPaths( m_poly_b , ClipperLib::ptSubject, true );
- m_clipper.AddPaths( m_poly_a , ClipperLib::ptClip, true );
- m_clipper.Execute( ClipperLib::ctDifference , m_result, pftSubj, pftClip );
- break;
- }
- }
- start_extracting();
- }
- //------------------------------------------------------------------------------
-
- template<class VSA, class VSB>
- void conv_clipper<VSA, VSB>::end_contour( ClipperLib::Paths &p)
- {
- unsigned i, len;
-
- if( m_vertex_accumulator.size() < 3 ) return;
- len = p.size();
- p.resize(len+1);
- p[len].resize(m_vertex_accumulator.size());
- for( i = 0 ; i < m_vertex_accumulator.size() ; i++ )
- p[len][i] = m_vertex_accumulator[i];
- m_vertex_accumulator.remove_all();
- }
- //------------------------------------------------------------------------------
-
- template<class VSA, class VSB>
- void conv_clipper<VSA, VSB>::add_vertex_(double &x, double &y)
- {
- ClipperLib::IntPoint v;
-
- v.X = Round(x * m_scaling_factor);
- v.Y = Round(y * m_scaling_factor);
- m_vertex_accumulator.add( v );
- }
- //------------------------------------------------------------------------------
-
- template<class VSA, class VSB>
- bool conv_clipper<VSA, VSB>::next_contour()
- {
- m_contour++;
- if(m_contour >= (int)m_result.size()) return false;
- m_vertex =-1;
- return true;
-}
-//------------------------------------------------------------------------------
-
- template<class VSA, class VSB>
- bool conv_clipper<VSA, VSB>::next_vertex(double *x, double *y)
- {
- m_vertex++;
- if(m_vertex >= (int)m_result[m_contour].size()) return false;
- *x = (double)m_result[ m_contour ][ m_vertex ].X / m_scaling_factor;
- *y = (double)m_result[ m_contour ][ m_vertex ].Y / m_scaling_factor;
- return true;
- }
- //------------------------------------------------------------------------------
-
- template<class VSA, class VSB>
- unsigned conv_clipper<VSA, VSB>::vertex(double *x, double *y)
-{
- if( m_status == status_move_to )
- {
- if( next_contour() )
- {
- if( next_vertex( x, y ) )
- {
- m_status =status_line_to;
- return path_cmd_move_to;
- }
- else
- {
- m_status = status_stop;
- return path_cmd_end_poly | path_flags_close;
- }
- }
- else
- return path_cmd_stop;
- }
- else
- {
- if( next_vertex( x, y ) )
- {
- return path_cmd_line_to;
- }
- else
- {
- m_status = status_move_to;
- return path_cmd_end_poly | path_flags_close;
- }
- }
-}
-//------------------------------------------------------------------------------
-
-
-} //namespace agg
-#endif //AGG_CONV_CLIPPER_INCLUDED
diff --git a/deps/agg/include/agg_conv_offset.h b/deps/agg/include/agg_conv_offset.h
new file mode 100644
index 0000000..efecfaa
--- /dev/null
+++ b/deps/agg/include/agg_conv_offset.h
@@ -0,0 +1,236 @@
+/*******************************************************************************
+ * *
+ * Author : Angus Johnson *
+ * Version : 1.1 *
+ * Date : 4 April 2011 *
+ * Website : http://www.angusj.com *
+ * Copyright : Angus Johnson 2010-2011 *
+ * *
+ * License: *
+ * Use, modification & distribution is subject to Boost Software License Ver 1. *
+ * http://www.boost.org/LICENSE_1_0.txt *
+ * *
+ *******************************************************************************/
+
+// based on adapted agg_conv_clipper.h
+
+#ifndef AGG_CONV_OFFSET_INCLUDED
+#define AGG_CONV_OFFSET_INCLUDED
+
+#include <cmath>
+#include "agg_basics.h"
+#include "agg_array.h"
+#include "clipper.hpp"
+
+namespace agg
+{
+
+template<class VSA> class conv_offset
+{
+ enum status { status_move_to, status_line_to, status_stop };
+ typedef VSA source_a_type;
+ typedef conv_offset<source_a_type> self_type;
+
+private:
+ source_a_type* m_src_a;
+ double m_offset;
+ status m_status;
+ int m_vertex;
+ int m_contour;
+ int m_scaling_factor;
+ pod_bvector<ClipperLib::IntPoint, 8> m_vertex_accumulator;
+ ClipperLib::Paths m_poly_a;
+ ClipperLib::Paths m_result;
+ ClipperLib::ClipperOffset m_clipper_offset;
+
+ int Round(double val)
+ {
+ if ((val < 0)) return (int)(val - 0.5); else return (int)(val + 0.5);
+ }
+
+public:
+ conv_offset(source_a_type &a, double offset = 0.0,
+ int scaling_factor = 0)
+ : m_src_a(&a),
+ m_offset(offset),
+ m_status(status_move_to),
+ m_vertex(-1),
+ m_contour(-1)
+ {
+ m_scaling_factor = std::max(std::min(scaling_factor, 6),0);
+ m_scaling_factor = Round(std::pow((double)10, m_scaling_factor));
+ }
+
+ ~conv_offset()
+ {
+ }
+
+ void set_offset(double offset) { m_offset = offset;}
+ unsigned type() const
+ {
+ return static_cast<unsigned>(m_src_a->type());
+ }
+
+ double get_offset() const
+ {
+ return m_offset;
+ }
+
+ void rewind(unsigned path_id);
+ unsigned vertex(double* x, double* y);
+
+ bool next_contour();
+ bool next_vertex(double* x, double* y);
+ void start_extracting();
+ void add_vertex_(double &x, double &y);
+ void end_contour(ClipperLib::Paths &p);
+
+ template<class VS> void add(VS &src, ClipperLib::Paths &p)
+ {
+ unsigned cmd;
+ double x; double y; double start_x; double start_y;
+ bool starting_first_line;
+
+ start_x = 0.0;
+ start_y = 0.0;
+ starting_first_line = true;
+ p.resize(0);
+
+ cmd = src->vertex( &x , &y );
+ while(!is_stop(cmd))
+ {
+ if(is_vertex(cmd))
+ {
+ if(is_move_to(cmd))
+ {
+ if(!starting_first_line ) end_contour(p);
+ start_x = x;
+ start_y = y;
+ }
+ add_vertex_( x, y );
+ starting_first_line = false;
+ }
+ else if(is_end_poly(cmd))
+ {
+ if(!starting_first_line && is_closed(cmd))
+ add_vertex_( start_x, start_y );
+ }
+ cmd = src->vertex( &x, &y );
+ }
+ end_contour(p);
+ }
+};
+
+//------------------------------------------------------------------------
+
+template<class VSA>
+void conv_offset<VSA>::start_extracting()
+{
+ m_status = status_move_to;
+ m_contour = -1;
+ m_vertex = -1;
+}
+//------------------------------------------------------------------------------
+
+template<class VSA>
+void conv_offset<VSA>::rewind(unsigned path_id)
+{
+ m_src_a->rewind( path_id );
+ //m_src_b->rewind( path_id );
+
+ add( m_src_a , m_poly_a );
+ //add( m_src_b , m_poly_b );
+ m_result.resize(0);
+ m_clipper_offset.Clear();
+ m_clipper_offset.AddPaths(m_poly_a,ClipperLib::jtMiter, ClipperLib::etOpenButt);//ClosedLine);//Polygon);
+ m_clipper_offset.Execute(m_result, m_offset * m_scaling_factor);
+ start_extracting();
+}
+//------------------------------------------------------------------------------
+
+template<class VSA>
+void conv_offset<VSA>::end_contour( ClipperLib::Paths &p)
+{
+ unsigned i, len;
+
+ if( m_vertex_accumulator.size() < 3 ) return;
+ len = p.size();
+ p.resize(len+1);
+ p[len].resize(m_vertex_accumulator.size());
+ for( i = 0 ; i < m_vertex_accumulator.size() ; i++ )
+ p[len][i] = m_vertex_accumulator[i];
+ m_vertex_accumulator.remove_all();
+}
+//------------------------------------------------------------------------------
+
+template<class VSA>
+void conv_offset<VSA>::add_vertex_(double &x, double &y)
+{
+ ClipperLib::IntPoint v;
+
+ v.X = Round(x * m_scaling_factor);
+ v.Y = Round(y * m_scaling_factor);
+ m_vertex_accumulator.add( v );
+}
+//------------------------------------------------------------------------------
+
+template<class VSA>
+bool conv_offset<VSA>::next_contour()
+{
+ m_contour++;
+ if(m_contour >= (int)m_result.size()) return false;
+ m_vertex =-1;
+ return true;
+}
+//------------------------------------------------------------------------------
+
+template<class VSA>
+bool conv_offset<VSA>::next_vertex(double *x, double *y)
+{
+ m_vertex++;
+ if(m_vertex >= (int)m_result[m_contour].size()) return false;
+ *x = (double)m_result[ m_contour ][ m_vertex ].X / m_scaling_factor;
+ *y = (double)m_result[ m_contour ][ m_vertex ].Y / m_scaling_factor;
+ return true;
+}
+//------------------------------------------------------------------------------
+
+template<class VSA>
+unsigned conv_offset<VSA>::vertex(double *x, double *y)
+{
+ if( m_status == status_move_to )
+ {
+ if( next_contour() )
+ {
+ if( next_vertex( x, y ) )
+ {
+ m_status =status_line_to;
+ return path_cmd_move_to;
+ }
+ else
+ {
+ m_status = status_stop;
+ return path_cmd_end_poly | path_flags_close;
+ }
+ }
+ else
+ return path_cmd_stop;
+ }
+ else
+ {
+ if( next_vertex( x, y ) )
+ {
+ return path_cmd_line_to;
+ }
+ else
+ {
+ m_status = status_move_to;
+ return path_cmd_end_poly | path_flags_close;
+ }
+ }
+}
+//------------------------------------------------------------------------------
+
+
+} //namespace agg
+#endif //AGG_CONV_OFFSET_INCLUDED
diff --git a/deps/agg/include/agg_ellipse.h b/deps/agg/include/agg_ellipse.h
index b046b1c..671fd57 100644
--- a/deps/agg/include/agg_ellipse.h
+++ b/deps/agg/include/agg_ellipse.h
@@ -48,6 +48,7 @@ namespace agg
void approximation_scale(double scale);
void rewind(unsigned path_id);
unsigned vertex(double* x, double* y);
+ unsigned num_steps() { return m_num; }
private:
void calc_num_steps();
diff --git a/deps/agg/include/agg_gamma_functions.h b/deps/agg/include/agg_gamma_functions.h
index 619ef95..0ad1115 100644
--- a/deps/agg/include/agg_gamma_functions.h
+++ b/deps/agg/include/agg_gamma_functions.h
@@ -120,6 +120,15 @@ namespace agg
double m_mul;
};
+ inline double sRGB_to_linear(double x)
+ {
+ return (x <= 0.04045) ? (x / 12.92) : pow((x + 0.055) / (1.055), 2.4);
+ }
+
+ inline double linear_to_sRGB(double x)
+ {
+ return (x <= 0.0031308) ? (x * 12.92) : (1.055 * pow(x, 1 / 2.4) - 0.055);
+ }
}
#endif
diff --git a/deps/agg/include/agg_gamma_lut.h b/deps/agg/include/agg_gamma_lut.h
index b366ae3..6f3ccb9 100644
--- a/deps/agg/include/agg_gamma_lut.h
+++ b/deps/agg/include/agg_gamma_lut.h
@@ -2,8 +2,8 @@
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
-// Permission to copy, use, modify, sell and distribute this software
-// is granted provided this copyright notice appears in all copies.
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
@@ -18,12 +18,13 @@
#include <cmath>
#include "agg_basics.h"
+#include "agg_gamma_functions.h"
namespace agg
{
- template<class LoResT=int8u,
- class HiResT=int8u,
- unsigned GammaShift=8,
+ template<class LoResT=int8u,
+ class HiResT=int8u,
+ unsigned GammaShift=8,
unsigned HiResShift=8> class gamma_lut
{
public:
@@ -49,8 +50,8 @@ namespace agg
pod_allocator<HiResT>::deallocate(m_dir_gamma, gamma_size);
}
- gamma_lut() :
- m_gamma(1.0),
+ gamma_lut() :
+ m_gamma(1.0),
m_dir_gamma(pod_allocator<HiResT>::allocate(gamma_size)),
m_inv_gamma(pod_allocator<LoResT>::allocate(hi_res_size))
{
@@ -67,14 +68,14 @@ namespace agg
}
gamma_lut(double g) :
- m_gamma(1.0),
+ m_gamma(1.0),
m_dir_gamma(pod_allocator<HiResT>::allocate(gamma_size)),
m_inv_gamma(pod_allocator<LoResT>::allocate(hi_res_size))
{
gamma(g);
}
- void gamma(double g)
+ void gamma(double g)
{
m_gamma = g;
@@ -98,13 +99,13 @@ namespace agg
return m_gamma;
}
- HiResT dir(LoResT v) const
- {
- return m_dir_gamma[unsigned(v)];
+ HiResT dir(LoResT v) const
+ {
+ return m_dir_gamma[unsigned(v)];
}
- LoResT inv(HiResT v) const
- {
+ LoResT inv(HiResT v) const
+ {
return m_inv_gamma[unsigned(v)];
}
@@ -116,6 +117,189 @@ namespace agg
HiResT* m_dir_gamma;
LoResT* m_inv_gamma;
};
+
+ //
+ // sRGB support classes
+ //
+
+ // Optimized sRGB lookup table. The direct conversion (sRGB to linear)
+ // is a straightforward lookup. The inverse conversion (linear to sRGB)
+ // is implemented using binary search.
+ template<class LinearType>
+ class sRGB_lut_base
+ {
+ public:
+ LinearType dir(int8u v) const
+ {
+ return m_dir_table[v];
+ }
+
+ int8u inv(LinearType v) const
+ {
+ // Unrolled binary search.
+ int8u x = 0;
+ if (v > m_inv_table[128]) x = 128;
+ if (v > m_inv_table[x + 64]) x += 64;
+ if (v > m_inv_table[x + 32]) x += 32;
+ if (v > m_inv_table[x + 16]) x += 16;
+ if (v > m_inv_table[x + 8]) x += 8;
+ if (v > m_inv_table[x + 4]) x += 4;
+ if (v > m_inv_table[x + 2]) x += 2;
+ if (v > m_inv_table[x + 1]) x += 1;
+ return x;
+ }
+
+ protected:
+ LinearType m_dir_table[256];
+ LinearType m_inv_table[256];
+
+ // Only derived classes may instantiate.
+ sRGB_lut_base()
+ {
+ }
+ };
+
+ // sRGB_lut - implements sRGB conversion for the various types.
+ // Base template is undefined, specializations are provided below.
+ template<class LinearType>
+ class sRGB_lut;
+
+ template<>
+ class sRGB_lut<float> : public sRGB_lut_base<float>
+ {
+ public:
+ sRGB_lut()
+ {
+ // Generate lookup tables.
+ m_dir_table[0] = 0;
+ m_inv_table[0] = 0;
+ for (unsigned i = 1; i <= 255; ++i)
+ {
+ // Floating-point RGB is in range [0,1].
+ m_dir_table[i] = float(sRGB_to_linear(i / 255.0));
+ m_inv_table[i] = float(sRGB_to_linear((i - 0.5) / 255.0));
+ }
+ }
+ };
+
+ template<>
+ class sRGB_lut<int16u> : public sRGB_lut_base<int16u>
+ {
+ public:
+ sRGB_lut()
+ {
+ // Generate lookup tables.
+ m_dir_table[0] = 0;
+ m_inv_table[0] = 0;
+ for (unsigned i = 1; i <= 255; ++i)
+ {
+ // 16-bit RGB is in range [0,65535].
+ m_dir_table[i] = uround(65535.0 * sRGB_to_linear(i / 255.0));
+ m_inv_table[i] = uround(65535.0 * sRGB_to_linear((i - 0.5) / 255.0));
+ }
+ }
+ };
+
+ template<>
+ class sRGB_lut<int8u> : public sRGB_lut_base<int8u>
+ {
+ public:
+ sRGB_lut()
+ {
+ // Generate lookup tables.
+ m_dir_table[0] = 0;
+ m_inv_table[0] = 0;
+ for (unsigned i = 1; i <= 255; ++i)
+ {
+ // 8-bit RGB is handled with simple bidirectional lookup tables.
+ m_dir_table[i] = uround(255.0 * sRGB_to_linear(i / 255.0));
+ m_inv_table[i] = uround(255.0 * linear_to_sRGB(i / 255.0));
+ }
+ }
+
+ int8u inv(int8u v) const
+ {
+ // In this case, the inverse transform is a simple lookup.
+ return m_inv_table[v];
+ }
+ };
+
+ // Common base class for sRGB_conv objects. Defines an internal
+ // sRGB_lut object so that users don't have to.
+ template<class T>
+ class sRGB_conv_base
+ {
+ public:
+ static T rgb_from_sRGB(int8u x)
+ {
+ return lut.dir(x);
+ }
+
+ static int8u rgb_to_sRGB(T x)
+ {
+ return lut.inv(x);
+ }
+
+ private:
+ static sRGB_lut<T> lut;
+ };
+
+ // Definition of sRGB_conv_base::lut. Due to the fact that this a template,
+ // we don't need to place the definition in a cpp file. Hurrah.
+ template<class T>
+ sRGB_lut<T> sRGB_conv_base<T>::lut;
+
+ // Wrapper for sRGB-linear conversion.
+ // Base template is undefined, specializations are provided below.
+ template<class T>
+ class sRGB_conv;
+
+ template<>
+ class sRGB_conv<float> : public sRGB_conv_base<float>
+ {
+ public:
+ static float alpha_from_sRGB(int8u x)
+ {
+ return float(x / 255.0);
+ }
+
+ static int8u alpha_to_sRGB(float x)
+ {
+ if (x <= 0) return 0;
+ else if (x >= 1) return 255;
+ else return int8u(0.5 + x * 255);
+ }
+ };
+
+ template<>
+ class sRGB_conv<int16u> : public sRGB_conv_base<int16u>
+ {
+ public:
+ static int16u alpha_from_sRGB(int8u x)
+ {
+ return (x << 8) | x;
+ }
+
+ static int8u alpha_to_sRGB(int16u x)
+ {
+ return x >> 8;
+ }
+ };
+
+ template<>
+ class sRGB_conv<int8u> : public sRGB_conv_base<int8u>
+ {
+ public:
+ static int8u alpha_from_sRGB(int8u x)
+ {
+ return x;
+ }
+
+ static int8u alpha_to_sRGB(int8u x)
+ {
+ return x;
+ }
+ };
}
#endif
diff --git a/deps/agg/include/agg_pixfmt_base.h b/deps/agg/include/agg_pixfmt_base.h
new file mode 100644
index 0000000..57ae19c
--- /dev/null
+++ b/deps/agg/include/agg_pixfmt_base.h
@@ -0,0 +1,97 @@
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.4
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem at antigrain.com
+// mcseemagg at yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+
+#ifndef AGG_PIXFMT_BASE_INCLUDED
+#define AGG_PIXFMT_BASE_INCLUDED
+
+#include "agg_basics.h"
+#include "agg_color_gray.h"
+#include "agg_color_rgba.h"
+
+namespace agg
+{
+ struct pixfmt_gray_tag
+ {
+ };
+
+ struct pixfmt_rgb_tag
+ {
+ };
+
+ struct pixfmt_rgba_tag
+ {
+ };
+
+ //--------------------------------------------------------------blender_base
+ template<class ColorT, class Order = void>
+ struct blender_base
+ {
+ typedef ColorT color_type;
+ typedef Order order_type;
+ typedef typename color_type::value_type value_type;
+
+ static rgba get(value_type r, value_type g, value_type b, value_type a, cover_type cover = cover_full)
+ {
+ if (cover > cover_none)
+ {
+ rgba c(
+ color_type::to_double(r),
+ color_type::to_double(g),
+ color_type::to_double(b),
+ color_type::to_double(a));
+
+ if (cover < cover_full)
+ {
+ double x = double(cover) / cover_full;
+ c.r *= x;
+ c.g *= x;
+ c.b *= x;
+ c.a *= x;
+ }
+
+ return c;
+ }
+ else return rgba::no_color();
+ }
+
+ static rgba get(const value_type* p, cover_type cover = cover_full)
+ {
+ return get(
+ p[order_type::R],
+ p[order_type::G],
+ p[order_type::B],
+ p[order_type::A],
+ cover);
+ }
+
+ static void set(value_type* p, value_type r, value_type g, value_type b, value_type a)
+ {
+ p[order_type::R] = r;
+ p[order_type::G] = g;
+ p[order_type::B] = b;
+ p[order_type::A] = a;
+ }
+
+ static void set(value_type* p, const rgba& c)
+ {
+ p[order_type::R] = color_type::from_double(c.r);
+ p[order_type::G] = color_type::from_double(c.g);
+ p[order_type::B] = color_type::from_double(c.b);
+ p[order_type::A] = color_type::from_double(c.a);
+ }
+ };
+}
+
+#endif
diff --git a/deps/agg/include/agg_pixfmt_gray.h b/deps/agg/include/agg_pixfmt_gray.h
index 3632e28..a303bd3 100644
--- a/deps/agg/include/agg_pixfmt_gray.h
+++ b/deps/agg/include/agg_pixfmt_gray.h
@@ -2,8 +2,8 @@
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
-// Permission to copy, use, modify, sell and distribute this software
-// is granted provided this copyright notice appears in all copies.
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
@@ -13,37 +13,46 @@
// http://www.antigrain.com
//----------------------------------------------------------------------------
//
-// Adaptation for high precision colors has been sponsored by
+// Adaptation for high precision colors has been sponsored by
// Liberty Technology Systems, Inc., visit http://lib-sys.com
//
// Liberty Technology Systems, Inc. is the provider of
// PostScript and PDF technology for software developers.
-//
+//
//----------------------------------------------------------------------------
#ifndef AGG_PIXFMT_GRAY_INCLUDED
#define AGG_PIXFMT_GRAY_INCLUDED
#include <cstring>
-#include "agg_basics.h"
-#include "agg_color_gray.h"
+#include "agg_pixfmt_base.h"
#include "agg_rendering_buffer.h"
namespace agg
{
-
+
//============================================================blender_gray
template<class ColorT> struct blender_gray
{
typedef ColorT color_type;
typedef typename color_type::value_type value_type;
typedef typename color_type::calc_type calc_type;
- enum base_scale_e { base_shift = color_type::base_shift };
+ typedef typename color_type::long_type long_type;
- static AGG_INLINE void blend_pix(value_type* p, unsigned cv,
- unsigned alpha, unsigned cover=0)
+ // Blend pixels using the non-premultiplied form of Alvy-Ray Smith's
+ // compositing function. Since the render buffer is opaque we skip the
+ // initial premultiply and final demultiply.
+
+ static AGG_INLINE void blend_pix(value_type* p,
+ value_type cv, value_type alpha, cover_type cover)
{
- *p = (value_type)((((cv - calc_type(*p)) * alpha) + (calc_type(*p) << base_shift)) >> base_shift);
+ blend_pix(p, cv, color_type::mult_cover(alpha, cover));
+ }
+
+ static AGG_INLINE void blend_pix(value_type* p,
+ value_type cv, value_type alpha)
+ {
+ *p = color_type::lerp(*p, cv, alpha);
}
};
@@ -54,23 +63,24 @@ namespace agg
typedef ColorT color_type;
typedef typename color_type::value_type value_type;
typedef typename color_type::calc_type calc_type;
- enum base_scale_e { base_shift = color_type::base_shift };
+ typedef typename color_type::long_type long_type;
+
+ // Blend pixels using the premultiplied form of Alvy-Ray Smith's
+ // compositing function.
- static AGG_INLINE void blend_pix(value_type* p, unsigned cv,
- unsigned alpha, unsigned cover)
+ static AGG_INLINE void blend_pix(value_type* p,
+ value_type cv, value_type alpha, cover_type cover)
{
- alpha = color_type::base_mask - alpha;
- cover = (cover + 1) << (base_shift - 8);
- *p = (value_type)((*p * alpha + cv * cover) >> base_shift);
+ blend_pix(p, color_type::mult_cover(cv, cover), color_type::mult_cover(alpha, cover));
}
- static AGG_INLINE void blend_pix(value_type* p, unsigned cv,
- unsigned alpha)
+ static AGG_INLINE void blend_pix(value_type* p,
+ value_type cv, value_type alpha)
{
- *p = (value_type)(((*p * (color_type::base_mask - alpha)) >> base_shift) + cv);
+ *p = color_type::prelerp(*p, cv, alpha);
}
};
-
+
//=====================================================apply_gamma_dir_gray
@@ -112,10 +122,11 @@ namespace agg
//=================================================pixfmt_alpha_blend_gray
- template<class Blender, class RenBuf, unsigned Step=1, unsigned Offset=0>
+ template<class Blender, class RenBuf, unsigned Step = 1, unsigned Offset = 0>
class pixfmt_alpha_blend_gray
{
public:
+ typedef pixfmt_gray_tag pixfmt_category;
typedef RenBuf rbuf_type;
typedef typename rbuf_type::row_data row_data;
typedef Blender blender_type;
@@ -123,54 +134,117 @@ namespace agg
typedef int order_type; // A fake one
typedef typename color_type::value_type value_type;
typedef typename color_type::calc_type calc_type;
- enum base_scale_e
- {
- base_shift = color_type::base_shift,
- base_scale = color_type::base_scale,
- base_mask = color_type::base_mask,
- pix_width = sizeof(value_type),
- pix_step = Step,
- pix_offset = Offset
+ enum
+ {
+ num_components = 1,
+ pix_width = sizeof(value_type) * Step,
+ pix_step = Step,
+ pix_offset = Offset,
+ };
+ struct pixel_type
+ {
+ value_type c[num_components];
+
+ void set(value_type v)
+ {
+ c[0] = v;
+ }
+
+ void set(const color_type& color)
+ {
+ set(color.v);
+ }
+
+ void get(value_type& v) const
+ {
+ v = c[0];
+ }
+
+ color_type get() const
+ {
+ return color_type(c[0]);
+ }
+
+ pixel_type* next()
+ {
+ return (pixel_type*)(c + pix_step);
+ }
+
+ const pixel_type* next() const
+ {
+ return (const pixel_type*)(c + pix_step);
+ }
+
+ pixel_type* advance(int n)
+ {
+ return (pixel_type*)(c + n * pix_step);
+ }
+
+ const pixel_type* advance(int n) const
+ {
+ return (const pixel_type*)(c + n * pix_step);
+ }
};
private:
//--------------------------------------------------------------------
- static AGG_INLINE void copy_or_blend_pix(value_type* p,
- const color_type& c,
- unsigned cover)
+ AGG_INLINE void blend_pix(pixel_type* p,
+ value_type v, value_type a,
+ unsigned cover)
{
- if (c.a)
+ blender_type::blend_pix(p->c, v, a, cover);
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE void blend_pix(pixel_type* p, value_type v, value_type a)
+ {
+ blender_type::blend_pix(p->c, v, a);
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE void blend_pix(pixel_type* p, const color_type& c, unsigned cover)
+ {
+ blender_type::blend_pix(p->c, c.v, c.a, cover);
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE void blend_pix(pixel_type* p, const color_type& c)
+ {
+ blender_type::blend_pix(p->c, c.v, c.a);
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE void copy_or_blend_pix(pixel_type* p, const color_type& c, unsigned cover)
+ {
+ if (!c.is_transparent())
{
- calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
- if(alpha == base_mask)
+ if (c.is_opaque() && cover == cover_mask)
{
- *p = c.v;
+ p->set(c);
}
else
{
- Blender::blend_pix(p, c.v, alpha, cover);
+ blend_pix(p, c, cover);
}
}
}
-
- static AGG_INLINE void copy_or_blend_pix(value_type* p,
- const color_type& c)
+ //--------------------------------------------------------------------
+ AGG_INLINE void copy_or_blend_pix(pixel_type* p, const color_type& c)
{
- if (c.a)
+ if (!c.is_transparent())
{
- if(c.a == base_mask)
+ if (c.is_opaque())
{
- *p = c.v;
+ p->set(c);
}
else
{
- Blender::blend_pix(p, c.v, c.a);
+ blend_pix(p, c);
}
}
}
-
public:
//--------------------------------------------------------------------
explicit pixfmt_alpha_blend_gray(rbuf_type& rb) :
@@ -183,10 +257,10 @@ namespace agg
bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2)
{
rect_i r(x1, y1, x2, y2);
- if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1)))
+ if (r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1)))
{
int stride = pixf.stride();
- m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1),
+ m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1),
(r.x2 - r.x1) + 1,
(r.y2 - r.y1) + 1,
stride);
@@ -201,61 +275,98 @@ namespace agg
AGG_INLINE int stride() const { return m_rbuf->stride(); }
//--------------------------------------------------------------------
- int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); }
+ int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); }
const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); }
row_data row(int y) const { return m_rbuf->row(y); }
- const int8u* pix_ptr(int x, int y) const
+ //--------------------------------------------------------------------
+ AGG_INLINE int8u* pix_ptr(int x, int y)
+ {
+ return m_rbuf->row_ptr(y) + sizeof(value_type) * (x * pix_step + pix_offset);
+ }
+
+ AGG_INLINE const int8u* pix_ptr(int x, int y) const
+ {
+ return m_rbuf->row_ptr(y) + sizeof(value_type) * (x * pix_step + pix_offset);
+ }
+
+ // Return pointer to pixel value, forcing row to be allocated.
+ AGG_INLINE pixel_type* pix_value_ptr(int x, int y, unsigned len)
{
- return m_rbuf->row_ptr(y) + x * Step + Offset;
+ return (pixel_type*)(m_rbuf->row_ptr(x, y, len) + sizeof(value_type) * (x * pix_step + pix_offset));
}
- int8u* pix_ptr(int x, int y)
+ // Return pointer to pixel value, or null if row not allocated.
+ AGG_INLINE const pixel_type* pix_value_ptr(int x, int y) const
{
- return m_rbuf->row_ptr(y) + x * Step + Offset;
+ int8u* p = m_rbuf->row_ptr(y);
+ return p ? (pixel_type*)(p + sizeof(value_type) * (x * pix_step + pix_offset)) : 0;
+ }
+
+ // Get pixel pointer from raw buffer pointer.
+ AGG_INLINE static pixel_type* pix_value_ptr(void* p)
+ {
+ return (pixel_type*)((value_type*)p + pix_offset);
+ }
+
+ // Get pixel pointer from raw buffer pointer.
+ AGG_INLINE static const pixel_type* pix_value_ptr(const void* p)
+ {
+ return (const pixel_type*)((const value_type*)p + pix_offset);
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE static void write_plain_color(void* p, color_type c)
+ {
+ // Grayscale formats are implicitly premultiplied.
+ c.premultiply();
+ pix_value_ptr(p)->set(c);
+ }
+
+ //--------------------------------------------------------------------
+ AGG_INLINE static color_type read_plain_color(const void* p)
+ {
+ return pix_value_ptr(p)->get();
}
//--------------------------------------------------------------------
AGG_INLINE static void make_pix(int8u* p, const color_type& c)
{
- *(value_type*)p = c.v;
+ ((pixel_type*)p)->set(c);
}
//--------------------------------------------------------------------
AGG_INLINE color_type pixel(int x, int y) const
{
- value_type* p = (value_type*)m_rbuf->row_ptr(y) + x * Step + Offset;
- return color_type(*p);
+ if (const pixel_type* p = pix_value_ptr(x, y))
+ {
+ return p->get();
+ }
+ return color_type::no_color();
}
//--------------------------------------------------------------------
AGG_INLINE void copy_pixel(int x, int y, const color_type& c)
{
- *((value_type*)m_rbuf->row_ptr(x, y, 1) + x * Step + Offset) = c.v;
+ pix_value_ptr(x, y, 1)->set(c);
}
//--------------------------------------------------------------------
AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover)
{
- copy_or_blend_pix((value_type*)
- m_rbuf->row_ptr(x, y, 1) + x * Step + Offset,
- c,
- cover);
+ copy_or_blend_pix(pix_value_ptr(x, y, 1), c, cover);
}
-
//--------------------------------------------------------------------
- AGG_INLINE void copy_hline(int x, int y,
- unsigned len,
+ AGG_INLINE void copy_hline(int x, int y,
+ unsigned len,
const color_type& c)
{
- value_type* p = (value_type*)
- m_rbuf->row_ptr(x, y, len) + x * Step + Offset;
-
+ pixel_type* p = pix_value_ptr(x, y, len);
do
{
- *p = c.v;
- p += Step;
+ p->set(c);
+ p = p->next();
}
while(--len);
}
@@ -263,49 +374,44 @@ namespace agg
//--------------------------------------------------------------------
AGG_INLINE void copy_vline(int x, int y,
- unsigned len,
+ unsigned len,
const color_type& c)
{
do
{
- value_type* p = (value_type*)
- m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
-
- *p = c.v;
+ pix_value_ptr(x, y++, 1)->set(c);
}
- while(--len);
+ while (--len);
}
//--------------------------------------------------------------------
void blend_hline(int x, int y,
- unsigned len,
+ unsigned len,
const color_type& c,
int8u cover)
{
- if (c.a)
+ if (!c.is_transparent())
{
- value_type* p = (value_type*)
- m_rbuf->row_ptr(x, y, len) + x * Step + Offset;
+ pixel_type* p = pix_value_ptr(x, y, len);
- calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
- if(alpha == base_mask)
+ if (c.is_opaque() && cover == cover_mask)
{
do
{
- *p = c.v;
- p += Step;
+ p->set(c);
+ p = p->next();
}
- while(--len);
+ while (--len);
}
else
{
do
{
- Blender::blend_pix(p, c.v, alpha, cover);
- p += Step;
+ blend_pix(p, c, cover);
+ p = p->next();
}
- while(--len);
+ while (--len);
}
}
}
@@ -313,35 +419,27 @@ namespace agg
//--------------------------------------------------------------------
void blend_vline(int x, int y,
- unsigned len,
+ unsigned len,
const color_type& c,
int8u cover)
{
- if (c.a)
+ if (!c.is_transparent())
{
- value_type* p;
- calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
- if(alpha == base_mask)
+ if (c.is_opaque() && cover == cover_mask)
{
do
{
- p = (value_type*)
- m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
-
- *p = c.v;
+ pix_value_ptr(x, y++, 1)->set(c);
}
- while(--len);
+ while (--len);
}
else
{
do
{
- p = (value_type*)
- m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
-
- Blender::blend_pix(p, c.v, alpha, cover);
+ blend_pix(pix_value_ptr(x, y++, 1), c, cover);
}
- while(--len);
+ while (--len);
}
}
}
@@ -349,200 +447,162 @@ namespace agg
//--------------------------------------------------------------------
void blend_solid_hspan(int x, int y,
- unsigned len,
+ unsigned len,
const color_type& c,
const int8u* covers)
{
- if (c.a)
+ if (!c.is_transparent())
{
- value_type* p = (value_type*)
- m_rbuf->row_ptr(x, y, len) + x * Step + Offset;
+ pixel_type* p = pix_value_ptr(x, y, len);
- do
+ do
{
- calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8;
- if(alpha == base_mask)
+ if (c.is_opaque() && *covers == cover_mask)
{
- *p = c.v;
+ p->set(c);
}
else
{
- Blender::blend_pix(p, c.v, alpha, *covers);
+ blend_pix(p, c, *covers);
}
- p += Step;
+ p = p->next();
++covers;
}
- while(--len);
+ while (--len);
}
}
//--------------------------------------------------------------------
void blend_solid_vspan(int x, int y,
- unsigned len,
+ unsigned len,
const color_type& c,
const int8u* covers)
{
- if (c.a)
+ if (!c.is_transparent())
{
- do
+ do
{
- calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8;
+ pixel_type* p = pix_value_ptr(x, y++, 1);
- value_type* p = (value_type*)
- m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
-
- if(alpha == base_mask)
+ if (c.is_opaque() && *covers == cover_mask)
{
- *p = c.v;
+ p->set(c);
}
else
{
- Blender::blend_pix(p, c.v, alpha, *covers);
+ blend_pix(p, c, *covers);
}
++covers;
}
- while(--len);
+ while (--len);
}
}
//--------------------------------------------------------------------
void copy_color_hspan(int x, int y,
- unsigned len,
+ unsigned len,
const color_type* colors)
{
- value_type* p = (value_type*)
- m_rbuf->row_ptr(x, y, len) + x * Step + Offset;
+ pixel_type* p = pix_value_ptr(x, y, len);
- do
+ do
{
- *p = colors->v;
- p += Step;
- ++colors;
+ p->set(*colors++);
+ p = p->next();
}
- while(--len);
+ while (--len);
}
//--------------------------------------------------------------------
void copy_color_vspan(int x, int y,
- unsigned len,
+ unsigned len,
const color_type* colors)
{
- do
+ do
{
- value_type* p = (value_type*)
- m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
- *p = colors->v;
- ++colors;
+ pix_value_ptr(x, y++, 1)->set(*colors++);
}
- while(--len);
+ while (--len);
}
//--------------------------------------------------------------------
void blend_color_hspan(int x, int y,
- unsigned len,
+ unsigned len,
const color_type* colors,
const int8u* covers,
int8u cover)
{
- value_type* p = (value_type*)
- m_rbuf->row_ptr(x, y, len) + x * Step + Offset;
+ pixel_type* p = pix_value_ptr(x, y, len);
- if(covers)
+ if (covers)
{
- do
+ do
{
copy_or_blend_pix(p, *colors++, *covers++);
- p += Step;
+ p = p->next();
}
- while(--len);
+ while (--len);
}
else
{
- if(cover == 255)
+ if (cover == cover_mask)
{
- do
+ do
{
- if(colors->a == base_mask)
- {
- *p = colors->v;
- }
- else
- {
- copy_or_blend_pix(p, *colors);
- }
- p += Step;
- ++colors;
+ copy_or_blend_pix(p, *colors++);
+ p = p->next();
}
- while(--len);
+ while (--len);
}
else
{
- do
+ do
{
copy_or_blend_pix(p, *colors++, cover);
- p += Step;
+ p = p->next();
}
- while(--len);
+ while (--len);
}
}
}
-
//--------------------------------------------------------------------
void blend_color_vspan(int x, int y,
- unsigned len,
+ unsigned len,
const color_type* colors,
const int8u* covers,
int8u cover)
{
- value_type* p;
- if(covers)
+ if (covers)
{
- do
+ do
{
- p = (value_type*)
- m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
-
- copy_or_blend_pix(p, *colors++, *covers++);
+ copy_or_blend_pix(pix_value_ptr(x, y++, 1), *colors++, *covers++);
}
- while(--len);
+ while (--len);
}
else
{
- if(cover == 255)
+ if (cover == cover_mask)
{
- do
+ do
{
- p = (value_type*)
- m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
-
- if(colors->a == base_mask)
- {
- *p = colors->v;
- }
- else
- {
- copy_or_blend_pix(p, *colors);
- }
- ++colors;
+ copy_or_blend_pix(pix_value_ptr(x, y++, 1), *colors++);
}
- while(--len);
+ while (--len);
}
else
{
- do
+ do
{
- p = (value_type*)
- m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset;
-
- copy_or_blend_pix(p, *colors++, cover);
+ copy_or_blend_pix(pix_value_ptr(x, y++, 1), *colors++, cover);
}
- while(--len);
+ while (--len);
}
}
}
@@ -551,22 +611,19 @@ namespace agg
template<class Function> void for_each_pixel(Function f)
{
unsigned y;
- for(y = 0; y < height(); ++y)
+ for (y = 0; y < height(); ++y)
{
row_data r = m_rbuf->row(y);
- if(r.ptr)
+ if (r.ptr)
{
unsigned len = r.x2 - r.x1 + 1;
-
- value_type* p = (value_type*)
- m_rbuf->row_ptr(r.x1, y, len) + r.x1 * Step + Offset;
-
+ pixel_type* p = pix_value_ptr(r.x1, y, len);
do
{
- f(p);
- p += Step;
+ f(p->c);
+ p = p->next();
}
- while(--len);
+ while (--len);
}
}
}
@@ -585,69 +642,70 @@ namespace agg
//--------------------------------------------------------------------
template<class RenBuf2>
- void copy_from(const RenBuf2& from,
+ void copy_from(const RenBuf2& from,
int xdst, int ydst,
int xsrc, int ysrc,
unsigned len)
{
- const int8u* p = from.row_ptr(ysrc);
- if(p)
+ if (const int8u* p = from.row_ptr(ysrc))
{
- memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width,
- p + xsrc * pix_width,
+ memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width,
+ p + xsrc * pix_width,
len * pix_width);
}
}
//--------------------------------------------------------------------
+ // Blend from single color, using grayscale surface as alpha channel.
template<class SrcPixelFormatRenderer>
- void blend_from_color(const SrcPixelFormatRenderer& from,
+ void blend_from_color(const SrcPixelFormatRenderer& from,
const color_type& color,
int xdst, int ydst,
int xsrc, int ysrc,
unsigned len,
int8u cover)
{
- typedef typename SrcPixelFormatRenderer::value_type src_value_type;
- const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc);
- if(psrc)
+ typedef typename SrcPixelFormatRenderer::pixel_type src_pixel_type;
+ typedef typename SrcPixelFormatRenderer::color_type src_color_type;
+
+ if (const src_pixel_type* psrc = from.pix_value_ptr(xsrc, ysrc))
{
- value_type* pdst =
- (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst;
- do
+ pixel_type* pdst = pix_value_ptr(xdst, ydst, len);
+
+ do
{
- copy_or_blend_pix(pdst,
- color,
- (*psrc * cover + base_mask) >> base_shift);
- ++psrc;
- ++pdst;
+ copy_or_blend_pix(pdst, color, src_color_type::scale_cover(cover, psrc->c[0]));
+ psrc = psrc->next();
+ pdst = pdst->next();
}
- while(--len);
+ while (--len);
}
}
//--------------------------------------------------------------------
+ // Blend from color table, using grayscale surface as indexes into table.
+ // Obviously, this only works for integer value types.
template<class SrcPixelFormatRenderer>
- void blend_from_lut(const SrcPixelFormatRenderer& from,
+ void blend_from_lut(const SrcPixelFormatRenderer& from,
const color_type* color_lut,
int xdst, int ydst,
int xsrc, int ysrc,
unsigned len,
int8u cover)
{
- typedef typename SrcPixelFormatRenderer::value_type src_value_type;
- const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc);
- if(psrc)
+ typedef typename SrcPixelFormatRenderer::pixel_type src_pixel_type;
+
+ if (const src_pixel_type* psrc = from.pix_value_ptr(xsrc, ysrc))
{
- value_type* pdst =
- (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst;
- do
+ pixel_type* pdst = pix_value_ptr(xdst, ydst, len);
+
+ do
{
- copy_or_blend_pix(pdst, color_lut[*psrc], cover);
- ++psrc;
- ++pdst;
+ copy_or_blend_pix(pdst, color_lut[psrc->c[0]], cover);
+ psrc = psrc->next();
+ pdst = pdst->next();
}
- while(--len);
+ while (--len);
}
}
@@ -655,16 +713,25 @@ namespace agg
rbuf_type* m_rbuf;
};
- typedef blender_gray<gray8> blender_gray8;
- typedef blender_gray_pre<gray8> blender_gray8_pre;
- typedef blender_gray<gray16> blender_gray16;
+ typedef blender_gray<gray8> blender_gray8;
+ typedef blender_gray<sgray8> blender_sgray8;
+ typedef blender_gray<gray16> blender_gray16;
+ typedef blender_gray<gray32> blender_gray32;
+
+ typedef blender_gray_pre<gray8> blender_gray8_pre;
+ typedef blender_gray_pre<sgray8> blender_sgray8_pre;
typedef blender_gray_pre<gray16> blender_gray16_pre;
+ typedef blender_gray_pre<gray32> blender_gray32_pre;
+
+ typedef pixfmt_alpha_blend_gray<blender_gray8, rendering_buffer> pixfmt_gray8;
+ typedef pixfmt_alpha_blend_gray<blender_sgray8, rendering_buffer> pixfmt_sgray8;
+ typedef pixfmt_alpha_blend_gray<blender_gray16, rendering_buffer> pixfmt_gray16;
+ typedef pixfmt_alpha_blend_gray<blender_gray32, rendering_buffer> pixfmt_gray32;
- typedef pixfmt_alpha_blend_gray<blender_gray8, rendering_buffer> pixfmt_gray8; //----pixfmt_gray8
- typedef pixfmt_alpha_blend_gray<blender_gray8_pre, rendering_buffer> pixfmt_gray8_pre; //----pixfmt_gray8_pre
- typedef pixfmt_alpha_blend_gray<blender_gray16, rendering_buffer> pixfmt_gray16; //----pixfmt_gray16
- typedef pixfmt_alpha_blend_gray<blender_gray16_pre, rendering_buffer> pixfmt_gray16_pre; //----pixfmt_gray16_pre
+ typedef pixfmt_alpha_blend_gray<blender_gray8_pre, rendering_buffer> pixfmt_gray8_pre;
+ typedef pixfmt_alpha_blend_gray<blender_sgray8_pre, rendering_buffer> pixfmt_sgray8_pre;
+ typedef pixfmt_alpha_blend_gray<blender_gray16_pre, rendering_buffer> pixfmt_gray16_pre;
+ typedef pixfmt_alpha_blend_gray<blender_gray32_pre, rendering_buffer> pixfmt_gray32_pre;
}
#endif
-
diff --git a/deps/boost/geometry/extensions/index/rtree/helpers.hpp b/deps/boost/geometry/extensions/index/rtree/helpers.hpp
deleted file mode 100644
index 45a71f3..0000000
--- a/deps/boost/geometry/extensions/index/rtree/helpers.hpp
+++ /dev/null
@@ -1,68 +0,0 @@
-// Boost.Geometry (aka GGL, Generic Geometry Library)
-
-// Boost.SpatialIndex - geometry helper functions
-//
-// Copyright 2008 Federico J. Fernandez.
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_GGL_INDEX_RTREE_HELPERS_HPP
-#define BOOST_GEOMETRY_GGL_INDEX_RTREE_HELPERS_HPP
-
-#include <boost/geometry/algorithms/area.hpp>
-#include <boost/geometry/algorithms/disjoint.hpp>
-#include <boost/geometry/core/point_type.hpp>
-
-namespace boost { namespace geometry { namespace index {
-
-/**
- * \brief Given two boxes, returns the minimal box that contains them
- */
-// TODO: use geometry::expand
-template <typename Box>
-inline Box enlarge_box(Box const& b1, Box const& b2)
-{
- // TODO: mloskot - Refactor to readable form. Fix VC++8.0 min/max warnings:
- // warning C4002: too many actual parameters for macro 'min
-
- typedef typename geometry::point_type<Box>::type point_type;
-
- point_type pmin(
- geometry::get<min_corner, 0>(b1) < geometry::get<min_corner, 0>(b2)
- ? geometry::get<min_corner, 0>(b1) : geometry::get<min_corner, 0>(b2),
- geometry::get<min_corner, 1>(b1) < geometry::get<min_corner, 1>(b2)
- ? geometry::get<min_corner, 1>(b1) : geometry::get<min_corner, 1>(b2));
-
- point_type pmax(
- geometry::get<max_corner, 0>(b1) > geometry::get<max_corner, 0>(b2)
- ? geometry::get<max_corner, 0>(b1) : geometry::get<max_corner, 0>(b2),
- geometry::get<max_corner, 1>(b1) > geometry::get<max_corner, 1>(b2)
- ? geometry::get<max_corner, 1>(b1) : geometry::get<max_corner, 1>(b2));
-
- return Box(pmin, pmax);
-}
-
-/**
- * \brief Compute the area of the union of b1 and b2
- */
-template <typename Box>
-inline typename default_area_result<Box>::type compute_union_area(Box const& b1, Box const& b2)
-{
- Box enlarged_box = enlarge_box(b1, b2);
- return geometry::area(enlarged_box);
-}
-
-/**
- * \brief Checks if boxes intersects
- */
-// TODO: move to geometry::intersects
-template <typename Box>
-inline bool is_overlapping(Box const& b1, Box const& b2)
-{
- return ! geometry::disjoint(b1, b2);
-}
-
-}}} // namespace boost::geometry::index
-
-#endif // BOOST_GEOMETRY_GGL_INDEX_RTREE_HELPERS_HPP
diff --git a/deps/boost/geometry/extensions/index/rtree/rtree.hpp b/deps/boost/geometry/extensions/index/rtree/rtree.hpp
deleted file mode 100644
index 2cf5796..0000000
--- a/deps/boost/geometry/extensions/index/rtree/rtree.hpp
+++ /dev/null
@@ -1,773 +0,0 @@
-// Boost.Geometry (aka GGL, Generic Geometry Library)
-
-// Boost.SpatialIndex - rtree implementation
-//
-// Copyright 2008 Federico J. Fernandez.
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RTREE_HPP
-#define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RTREE_HPP
-
-#include <cstddef>
-#include <iostream> // TODO: Remove if print() is removed
-#include <stdexcept>
-#include <utility>
-#include <vector>
-
-#include <boost/concept_check.hpp>
-#include <memory>
-
-#include <boost/geometry/algorithms/area.hpp>
-
-#include <boost/geometry/extensions/index/rtree/rtree_node.hpp>
-#include <boost/geometry/extensions/index/rtree/rtree_leaf.hpp>
-
-namespace boost { namespace geometry { namespace index
-{
-
-template <typename Box, typename Value >
-class rtree
-{
-public:
-
- typedef std::shared_ptr<rtree_node<Box, Value> > node_pointer;
- typedef std::shared_ptr<rtree_leaf<Box, Value> > leaf_pointer;
-
- /**
- * \brief Creates a rtree with 'maximum' elements per node and 'minimum'.
- */
- rtree(unsigned int const& maximum, unsigned int const& minimum)
- : m_count(0)
- , m_min_elems_per_node(minimum)
- , m_max_elems_per_node(maximum)
- , m_root(new rtree_node<Box, Value>(node_pointer(), 1))
- {
- }
-
- /**
- * \brief Creates a rtree with maximum elements per node
- * and minimum (box is ignored).
- */
- rtree(Box const& box, unsigned int const& maximum, unsigned int const& minimum)
- : m_count(0)
- , m_min_elems_per_node(minimum)
- , m_max_elems_per_node(maximum)
- , m_root(new rtree_node<Box, Value>(node_pointer(), 1))
- {
- boost::ignore_unused_variable_warning(box);
- }
-
- /**
- * \brief destructor (virtual because we have virtual functions)
- */
- virtual ~rtree() {}
-
-
- /**
- * \brief Remove elements inside the 'box'
- */
- inline void remove(Box const& box)
- {
- try
- {
- node_pointer leaf(choose_exact_leaf(box));
- typename rtree_leaf<Box, Value>::leaf_map q_leaves;
-
- leaf->remove(box);
-
- if (leaf->elements() < m_min_elems_per_node && elements() > m_min_elems_per_node)
- {
- q_leaves = leaf->get_leaves();
-
- // we remove the leaf_node in the parent node because now it's empty
- leaf->get_parent()->remove(leaf->get_parent()->get_box(leaf));
- }
-
- typename rtree_node<Box, Value>::node_map q_nodes;
- condense_tree(leaf, q_nodes);
-
- std::vector<std::pair<Box, Value> > s;
- for (typename rtree_node<Box, Value>::node_map::const_iterator it = q_nodes.begin();
- it != q_nodes.end(); ++it)
- {
- typename rtree_leaf<Box, Value>::leaf_map leaves = it->second->get_leaves();
-
- // reinserting leaves from nodes
- for (typename rtree_leaf<Box, Value>::leaf_map::const_iterator itl = leaves.begin();
- itl != leaves.end(); ++itl)
- {
- s.push_back(*itl);
- }
- }
-
- for (typename std::vector<std::pair<Box, Value> >::const_iterator it = s.begin(); it != s.end(); ++it)
- {
- m_count--;
- insert(it->first, it->second);
- }
-
- // if the root has only one child and the child is not a leaf,
- // make it the root
- if (m_root->elements() == 1)
- {
- if (!m_root->first_element()->is_leaf())
- {
- m_root = m_root->first_element();
- }
- }
- // reinserting leaves
- for (typename rtree_leaf<Box, Value>::leaf_map::const_iterator it = q_leaves.begin();
- it != q_leaves.end(); ++it)
- {
- m_count--;
- insert(it->first, it->second);
- }
-
- m_count--;
- }
- catch(std::logic_error & e)
- {
- // TODO: mloskot - replace with Boost.Geometry exception
-
- // not found
- std::cerr << e.what() << std::endl;
- return;
- }
- }
-
- /**
- * \brief Remove element inside the box with value
- */
- void remove(Box const& box, Value const& value)
- {
- try
- {
- node_pointer leaf;
-
- // find possible leaves
- typedef typename std::vector<node_pointer > node_type;
- node_type nodes;
- m_root->find_leaves(box, nodes);
-
- // refine the result
- for (typename node_type::const_iterator it = nodes.begin(); it != nodes.end(); ++it)
- {
- leaf = *it;
- try
- {
- leaf->remove(value);
- break;
- } catch (...)
- {
- leaf = node_pointer();
- }
- }
-
- if (!leaf)
- return;
-
- typename rtree_leaf < Box, Value >::leaf_map q_leaves;
-
- if (leaf->elements() < m_min_elems_per_node && elements() > m_min_elems_per_node)
- {
- q_leaves = leaf->get_leaves();
-
- // we remove the leaf_node in the parent node because now it's empty
- leaf->get_parent()->remove(leaf->get_parent()->get_box(leaf));
- }
-
- typename rtree_node<Box, Value>::node_map q_nodes;
- condense_tree(leaf, q_nodes);
-
- std::vector<std::pair<Box, Value> > s;
- for (typename rtree_node<Box, Value>::node_map::const_iterator it = q_nodes.begin();
- it != q_nodes.end(); ++it)
- {
- typename rtree_leaf<Box, Value>::leaf_map leaves = it->second->get_leaves();
-
- // reinserting leaves from nodes
- for (typename rtree_leaf<Box, Value>::leaf_map::const_iterator itl = leaves.begin();
- itl != leaves.end(); ++itl)
- {
- s.push_back(*itl);
- }
- }
-
- for (typename std::vector<std::pair<Box, Value> >::const_iterator it = s.begin(); it != s.end(); ++it)
- {
- m_count--;
- insert(it->first, it->second);
- }
-
- // if the root has only one child and the child is not a leaf,
- // make it the root
- if (m_root->elements() == 1)
- {
- if (!m_root->first_element()->is_leaf())
- {
- m_root = m_root->first_element();
- }
- }
-
- // reinserting leaves
- for (typename rtree_leaf<Box, Value>::leaf_map::const_iterator it = q_leaves.begin();
- it != q_leaves.end(); ++it)
- {
- m_count--;
- insert(it->first, it->second);
- }
-
- m_count--;
-
- }
- catch(std::logic_error & e)
- {
- // TODO: mloskot - ggl exception
-
- // not found
- std::cerr << e.what() << std::endl;
- return;
- }
- }
-
- /**
- * \brief Returns the number of elements.
- */
- inline unsigned int elements() const
- {
- return m_count;
- }
-
-
- /**
- * \brief Inserts an element with 'box' as key with value.
- */
- inline void insert(Box const& box, Value const& value)
- {
- m_count++;
-
- node_pointer leaf(choose_corresponding_leaf(box));
-
- // check if the selected leaf is full to do the split if necessary
- if (leaf->elements() >= m_max_elems_per_node)
- {
- leaf->insert(box, value);
-
- // split!
- node_pointer n1(new rtree_leaf<Box, Value>(leaf->get_parent()));
- node_pointer n2(new rtree_leaf<Box, Value>(leaf->get_parent()));
-
- split_node(leaf, n1, n2);
- adjust_tree(leaf, n1, n2);
- }
- else
- {
- leaf->insert(box, value);
- adjust_tree(leaf);
- }
- }
-
-
- /**
- * \brief Returns all the values inside 'box'
- */
- inline std::deque<Value> find(Box const& box) const
- {
- std::deque<Value> result;
- m_root->find(box, result, false);
- return result;
- }
-
- /**
- * \brief Print Rtree (mainly for debug)
- */
- inline void print()
- {
- std::cerr << "===================================" << std::endl;
- std::cerr << " Min/Max: " << m_min_elems_per_node << " / " << m_max_elems_per_node << std::endl;
- std::cerr << "Leaves: " << m_root->get_leaves().size() << std::endl;
- m_root->print();
- std::cerr << "===================================" << std::endl;
- }
-
-private:
-
- /// number of elements
- unsigned int m_count;
-
- /// minimum number of elements per node
- unsigned int m_min_elems_per_node;
-
- /// maximum number of elements per node
- unsigned int m_max_elems_per_node;
-
- /// tree root
- node_pointer m_root;
-
- /**
- * \brief Reorganize the tree after a removal. It tries to
- * join nodes with less elements than m.
- */
- void condense_tree(node_pointer const& leaf,
- typename rtree_node<Box, Value>::node_map& q_nodes)
- {
- if (leaf.get() == m_root.get())
- {
- // if it's the root we are done
- return;
- }
-
- node_pointer parent = leaf->get_parent();
- parent->adjust_box(leaf);
-
- if (parent->elements() < m_min_elems_per_node)
- {
- if (parent.get() == m_root.get())
- {
- // if the parent is underfull and it's the root we just exit
- return;
- }
-
- // get the nodes that we should reinsert
- typename rtree_node<Box, Value>::node_map this_nodes = parent->get_nodes();
- for(typename rtree_node<Box, Value>::node_map::const_iterator it = this_nodes.begin();
- it != this_nodes.end(); ++it)
- {
- q_nodes.push_back(*it);
- }
-
- // we remove the node in the parent node because now it should be
- // re inserted
- parent->get_parent()->remove(parent->get_parent()->get_box(parent));
- }
-
- condense_tree(parent, q_nodes);
- }
-
- /**
- * \brief After an insertion splits nodes with more than 'maximum' elements.
- */
- inline void adjust_tree(node_pointer& node)
- {
- if (node.get() == m_root.get())
- {
- // we finished the adjust
- return;
- }
-
- // as there are no splits just adjust the box of the parent and go on
- node_pointer parent = node->get_parent();
- parent->adjust_box(node);
- adjust_tree(parent);
- }
-
- /**
- * \brief After an insertion splits nodes with more than maximum elements
- * (recursive step with subtrees 'n1' and 'n2' to be joined).
- */
- void adjust_tree(node_pointer& leaf, node_pointer& n1, node_pointer& n2)
- {
- // check if we are in the root and do the split
- if (leaf.get() == m_root.get())
- {
- node_pointer new_root(new rtree_node<Box,Value>(node_pointer (), leaf->get_level() + 1));
- new_root->add_node(n1->compute_box(), n1);
- new_root->add_node(n2->compute_box(), n2);
-
- n1->set_parent(new_root);
- n2->set_parent(new_root);
-
- n1->update_parent(n1);
- n2->update_parent(n2);
-
- m_root = new_root;
- return;
- }
-
- node_pointer parent = leaf->get_parent();
-
- parent->replace_node(leaf, n1);
- parent->add_node(n2->compute_box(), n2);
-
- // if parent is full, split and readjust
- if (parent->elements() > m_max_elems_per_node)
- {
- node_pointer p1(new rtree_node<Box, Value>(parent->get_parent(), parent->get_level()));
- node_pointer p2(new rtree_node<Box, Value>(parent->get_parent(), parent->get_level()));
-
- split_node(parent, p1, p2);
- adjust_tree(parent, p1, p2);
- }
- else
- {
- adjust_tree(parent);
- }
- }
-
- /**
- * \brief Splits 'n' in 'n1' and 'n2'
- */
- void split_node(node_pointer const& n, node_pointer& n1, node_pointer& n2) const
- {
- unsigned int seed1 = 0;
- unsigned int seed2 = 0;
- std::vector<Box> boxes = n->get_boxes();
-
- n1->set_parent(n->get_parent());
- n2->set_parent(n->get_parent());
-
- linear_pick_seeds(n, seed1, seed2);
-
- if (n->is_leaf())
- {
- n1->add_value(boxes[seed1], n->get_value(seed1));
- n2->add_value(boxes[seed2], n->get_value(seed2));
- }
- else
- {
- n1->add_node(boxes[seed1], n->get_node(seed1));
- n2->add_node(boxes[seed2], n->get_node(seed2));
- }
-
- unsigned int index = 0;
-
- if (n->is_leaf())
- {
- // TODO: mloskot - add assert(node.size() >= 2); or similar
-
- typename rtree_leaf<Box, Value>::leaf_map nodes = n->get_leaves();
- unsigned int remaining = nodes.size() - 2;
-
- for (typename rtree_leaf<Box, Value>::leaf_map::const_iterator it = nodes.begin();
- it != nodes.end(); ++it, index++)
- {
- if (index != seed1 && index != seed2)
- {
- if (n1->elements() + remaining == m_min_elems_per_node)
- {
- n1->add_value(it->first, it->second);
- continue;
- }
- if (n2->elements() + remaining == m_min_elems_per_node)
- {
- n2->add_value(it->first, it->second);
- continue;
- }
-
- remaining--;
-
- /// current boxes of each group
- Box b1, b2;
-
- /// enlarged boxes of each group
- Box eb1, eb2;
- b1 = n1->compute_box();
- b2 = n2->compute_box();
-
- /// areas
- typedef typename coordinate_type<Box>::type coordinate_type;
- coordinate_type b1_area, b2_area;
- coordinate_type eb1_area, eb2_area;
- b1_area = geometry::area(b1);
- b2_area = geometry::area(b2);
- eb1_area = compute_union_area(b1, it->first);
- eb2_area = compute_union_area(b2, it->first);
-
- if (eb1_area - b1_area > eb2_area - b2_area)
- {
- n2->add_value(it->first, it->second);
- }
- if (eb1_area - b1_area < eb2_area - b2_area)
- {
- n1->add_value(it->first, it->second);
- }
- if (eb1_area - b1_area == eb2_area - b2_area)
- {
- if (b1_area < b2_area)
- {
- n1->add_value(it->first, it->second);
- }
- if (b1_area > b2_area)
- {
- n2->add_value(it->first, it->second);
- }
- if (b1_area == b2_area)
- {
- if (n1->elements() > n2->elements())
- {
- n2->add_value(it->first, it->second);
- }
- else
- {
- n1->add_value(it->first, it->second);
- }
- }
- }
- }
- }
- }
- else
- {
- // TODO: mloskot - add assert(node.size() >= 2); or similar
-
- typename rtree_node<Box, Value>::node_map nodes = n->get_nodes();
- unsigned int remaining = nodes.size() - 2;
- for(typename rtree_node<Box, Value>::node_map::const_iterator it = nodes.begin();
- it != nodes.end(); ++it, index++)
- {
-
- if (index != seed1 && index != seed2)
- {
-
- if (n1->elements() + remaining == m_min_elems_per_node)
- {
- n1->add_node(it->first, it->second);
- continue;
- }
- if (n2->elements() + remaining == m_min_elems_per_node)
- {
- n2->add_node(it->first, it->second);
- continue;
- }
-
- remaining--;
-
- /// current boxes of each group
- Box b1, b2;
-
- /// enlarged boxes of each group
- Box eb1, eb2;
- b1 = n1->compute_box();
- b2 = n2->compute_box();
-
- /// areas
- typedef typename coordinate_type<Box>::type coordinate_type;
- coordinate_type b1_area, b2_area;
- coordinate_type eb1_area, eb2_area;
- b1_area = geometry::area(b1);
- b2_area = geometry::area(b2);
-
- eb1_area = compute_union_area(b1, it->first);
- eb2_area = compute_union_area(b2, it->first);
-
- if (eb1_area - b1_area > eb2_area - b2_area)
- {
- n2->add_node(it->first, it->second);
- }
- if (eb1_area - b1_area < eb2_area - b2_area)
- {
- n1->add_node(it->first, it->second);
- }
- if (eb1_area - b1_area == eb2_area - b2_area)
- {
- if (b1_area < b2_area)
- {
- n1->add_node(it->first, it->second);
- }
- if (b1_area > b2_area)
- {
- n2->add_node(it->first, it->second);
- }
- if (b1_area == b2_area)
- {
- if (n1->elements() > n2->elements())
- {
- n2->add_node(it->first, it->second);
- }
- else
- {
- n1->add_node(it->first, it->second);
- }
- }
- }
-
- }
- }
- }
- }
-
- /**
- * \brief Choose initial values for the split algorithm (linear version)
- */
- void linear_pick_seeds(node_pointer const& n, unsigned int &seed1, unsigned int &seed2) const
- {
- // get boxes from the node
- std::vector<Box>boxes = n->get_boxes();
- if (boxes.size() == 0)
- {
- // TODO: mloskot - throw ggl exception
- throw std::logic_error("Empty Node trying to Pick Seeds");
- }
-
- // only two dim for now
- // unsigned int dimensions =
- // geometry::point_traits<Point>::coordinate_count;
-
- // find the first two elements
- typedef typename coordinate_type<Box>::type coordinate_type;
- coordinate_type separation_x, separation_y;
- unsigned int first_x, second_x;
- unsigned int first_y, second_y;
- find_normalized_separations<0u>(boxes, separation_x, first_x, second_x);
- find_normalized_separations<1u>(boxes, separation_y, first_y, second_y);
-
- if (separation_x > separation_y)
- {
- seed1 = first_x;
- seed2 = second_x;
- }
- else
- {
- seed1 = first_y;
- seed2 = second_y;
- }
- }
-
- /**
- * \brief Find distances between possible initial values for the
- * pick_seeds algorithm.
- */
- template <std::size_t D, typename T>
- void find_normalized_separations(std::vector<Box> const& boxes, T& separation,
- unsigned int& first, unsigned int& second) const
- {
- if (boxes.size() < 2)
- {
- throw std::logic_error("At least two boxes needed to split");
- }
-
- // find the lowest high
- typename std::vector<Box>::const_iterator it = boxes.begin();
- typedef typename coordinate_type<Box>::type coordinate_type;
- coordinate_type lowest_high = geometry::get<max_corner, D>(*it);
- unsigned int lowest_high_index = 0;
- unsigned int index = 1;
- ++it;
- for(; it != boxes.end(); ++it)
- {
- if (geometry::get<max_corner, D>(*it) < lowest_high)
- {
- lowest_high = geometry::get<max_corner, D>(*it);
- lowest_high_index = index;
- }
- index++;
- }
-
- // find the highest low
- coordinate_type highest_low = 0;
- unsigned int highest_low_index = 0;
- if (lowest_high_index == 0)
- {
- highest_low = geometry::get<min_corner, D>(boxes[1]);
- highest_low_index = 1;
- }
- else
- {
- highest_low = geometry::get<min_corner, D>(boxes[0]);
- highest_low_index = 0;
- }
-
- index = 0;
- for (it = boxes.begin();
- it != boxes.end(); ++it, index++)
- {
- if (geometry::get<min_corner, D>(*it) >= highest_low && index != lowest_high_index)
- {
- highest_low = geometry::get<min_corner, D>(*it);
- highest_low_index = index;
- }
- }
-
- // find the lowest low
- it = boxes.begin();
- coordinate_type lowest_low = geometry::get<min_corner, D>(*it);
- ++it;
- for(; it != boxes.end(); ++it)
- {
- if (geometry::get<min_corner, D>(*it) < lowest_low)
- {
- lowest_low = geometry::get<min_corner, D>(*it);
- }
- }
-
- // find the highest high
- it = boxes.begin();
- coordinate_type highest_high = geometry::get<max_corner, D>(*it);
- ++it;
- for(; it != boxes.end(); ++it)
- {
- if (geometry::get<max_corner, D>(*it) > highest_high)
- {
- highest_high = geometry::get<max_corner, D>(*it);
- }
- }
-
- coordinate_type const width = highest_high - lowest_low;
-
- separation = (highest_low - lowest_high) / width;
- first = highest_low_index;
- second = lowest_high_index;
- }
-
- /**
- * \brief Choose one of the possible leaves to make an insertion
- */
- inline node_pointer choose_corresponding_leaf(Box const& e)
- {
- node_pointer node = m_root;
-
- // if the tree is empty add an initial leaf
- if (m_root->elements() == 0)
- {
- leaf_pointer new_leaf(new rtree_leaf<Box, Value>(m_root));
- m_root->add_leaf_node(Box (), new_leaf);
-
- return new_leaf;
- }
-
- while (!node->is_leaf())
- {
- /// traverse node's map to see which node we should select
- node = node->choose_node(e);
- }
- return node;
- }
-
- /**
- * \brief Choose the exact leaf where an insertion should be done
- */
- node_pointer choose_exact_leaf(Box const&e) const
- {
- // find possible leaves
- typedef typename std::vector<node_pointer> node_type;
- node_type nodes;
- m_root->find_leaves(e, nodes);
-
- // refine the result
- for (typename node_type::const_iterator it = nodes.begin(); it != nodes.end(); ++it)
- {
- typedef std::vector<std::pair<Box, Value> > leaves_type;
- leaves_type leaves = (*it)->get_leaves();
-
- for (typename leaves_type::const_iterator itl = leaves.begin();
- itl != leaves.end(); ++itl)
- {
-
- if (itl->first.max_corner() == e.max_corner()
- && itl->first.min_corner() == e.min_corner())
- {
- return *it;
- }
- }
- }
-
- // TODO: mloskot - ggl exception
- throw std::logic_error("Leaf not found");
- }
-};
-
-}}} // namespace boost::geometry::index
-
-#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RTREE_HPP
diff --git a/deps/boost/geometry/extensions/index/rtree/rtree_leaf.hpp b/deps/boost/geometry/extensions/index/rtree/rtree_leaf.hpp
deleted file mode 100644
index 733e181..0000000
--- a/deps/boost/geometry/extensions/index/rtree/rtree_leaf.hpp
+++ /dev/null
@@ -1,252 +0,0 @@
-// Boost.Geometry (aka GGL, Generic Geometry Library)
-
-// Boost.SpatialIndex - rtree leaf implementation
-//
-// Copyright 2008 Federico J. Fernandez.
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RTREE_LEAF_HPP
-#define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RTREE_LEAF_HPP
-
-#include <deque>
-#include <iostream> // TODO: Remove if print() is removed
-#include <stdexcept>
-#include <utility>
-#include <vector>
-
-#include <memory>
-
-#include <boost/geometry/algorithms/area.hpp>
-#include <boost/geometry/algorithms/assign.hpp>
-#include <boost/geometry/algorithms/expand.hpp>
-
-#include <boost/geometry/extensions/index/rtree/rtree_node.hpp>
-
-namespace boost { namespace geometry { namespace index
-{
-
-template <typename Box, typename Value >
-class rtree_leaf : public rtree_node<Box, Value>
-{
-public:
-
- /// container type for the leaves
- typedef std::shared_ptr<rtree_node<Box, Value> > node_pointer;
- typedef std::vector<std::pair<Box, Value> > leaf_map;
-
- /**
- * \brief Creates an empty leaf
- */
- inline rtree_leaf()
- {
- }
-
- /**
- * \brief Creates a new leaf, with 'parent' as parent
- */
- inline rtree_leaf(node_pointer const& parent)
- : rtree_node<Box, Value> (parent, 0)
- {
- }
-
- /**
- * \brief Search for elements in 'box' in the Rtree. Add them to 'result'.
- * If exact_match is true only return the elements having as
- * key the 'box'. Otherwise return everything inside 'box'.
- */
- virtual void find(Box const& box, std::deque<Value>& result, bool const exact_match)
- {
- for (typename leaf_map::const_iterator it = m_nodes.begin();
- it != m_nodes.end(); ++it)
- {
- if (exact_match)
- {
- if (geometry::equals(it->first, box))
- {
- result.push_back(it->second);
- }
- }
- else
- {
- if (is_overlapping(it->first, box))
- {
- result.push_back(it->second);
- }
- }
- }
- }
-
- /**
- * \brief Compute bounding box for this leaf
- */
- virtual Box compute_box() const
- {
- if (m_nodes.empty())
- {
- return Box ();
- }
-
- Box r;
- geometry::assign_inverse(r);
- for(typename leaf_map::const_iterator it = m_nodes.begin(); it != m_nodes.end(); ++it)
- {
- geometry::expand(r, it->first);
- }
- return r;
- }
-
- /**
- * \brief True if we are a leaf
- */
- virtual bool is_leaf() const
- {
- return true;
- }
-
- /**
- * \brief Number of elements in the tree
- */
- virtual unsigned int elements() const
- {
- return m_nodes.size();
- }
-
- /**
- * \brief Insert a new element, with key 'box' and value 'v'
- */
- virtual void insert(Box const& box, Value const& v)
- {
- m_nodes.push_back(std::make_pair(box, v));
- }
-
- /**
- * \brief Proyect leaves of this node.
- */
- virtual std::vector< std::pair<Box, Value> > get_leaves() const
- {
- return m_nodes;
- }
-
- /**
- * \brief Add a new child (node) to this node
- */
- virtual void add_node(Box const&, node_pointer const&)
- {
- // TODO: mloskot - define & use GGL exception
- throw std::logic_error("Can't add node to leaf node.");
- }
-
- /**
- * \brief Add a new leaf to this node
- */
- virtual void add_value(Box const& box, Value const& v)
- {
- m_nodes.push_back(std::make_pair(box, v));
- }
-
-
- /**
- * \brief Proyect value in position 'index' in the nodes container
- */
- virtual Value get_value(unsigned int index) const
- {
- return m_nodes[index].second;
- }
-
- /**
- * \brief Box projector for leaf
- */
- virtual Box get_box(unsigned int index) const
- {
- return m_nodes[index].first;
- }
-
- /**
- * \brief Remove value with key 'box' in this leaf
- */
- virtual void remove(Box const& box)
- {
-
- for (typename leaf_map::iterator it = m_nodes.begin();
- it != m_nodes.end(); ++it)
- {
- if (geometry::equals(it->first, box))
- {
- m_nodes.erase(it);
- return;
- }
- }
-
- // TODO: mloskot - use GGL exception
- throw std::logic_error("Node not found.");
- }
-
- /**
- * \brief Remove value in this leaf
- */
- virtual void remove(Value const& v)
- {
- for (typename leaf_map::iterator it = m_nodes.begin();
- it != m_nodes.end(); ++it)
- {
- if (it->second == v)
- {
- m_nodes.erase(it);
- return;
- }
- }
-
- // TODO: mloskot - use GGL exception
- throw std::logic_error("Node not found.");
- }
-
- /**
- * \brief Proyect boxes from this node
- */
- virtual std::vector<Box> get_boxes() const
- {
- std::vector<Box> result;
- for (typename leaf_map::const_iterator it = m_nodes.begin();
- it != m_nodes.end(); ++it)
- {
- result.push_back(it->first);
- }
-
- return result;
- }
-
- /**
- * \brief Print leaf (mainly for debug)
- */
- virtual void print() const
- {
- std::cerr << "\t" << " --> Leaf --------" << std::endl;
- std::cerr << "\t" << " Size: " << m_nodes.size() << std::endl;
- for (typename leaf_map::const_iterator it = m_nodes.begin();
- it != m_nodes.end(); ++it)
- {
- std::cerr << "\t" << " | ";
- std::cerr << "( " << geometry::get<min_corner, 0>
- (it->first) << " , " << geometry::get<min_corner, 1>
- (it->first) << " ) x ";
- std::cerr << "( " << geometry::get<max_corner, 0>
- (it->first) << " , " << geometry::get<max_corner, 1>
- (it->first) << " )";
- std::cerr << " -> ";
- std::cerr << it->second;
- std::cerr << " | " << std::endl;;
- }
- std::cerr << "\t" << " --< Leaf --------" << std::endl;
- }
-
-private:
-
- /// leaves of this node
- leaf_map m_nodes;
-};
-
-}}} // namespace boost::geometry::index
-
-#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RTREE_LEAF_HPP
diff --git a/deps/boost/geometry/extensions/index/rtree/rtree_node.hpp b/deps/boost/geometry/extensions/index/rtree/rtree_node.hpp
deleted file mode 100644
index ec9efad..0000000
--- a/deps/boost/geometry/extensions/index/rtree/rtree_node.hpp
+++ /dev/null
@@ -1,493 +0,0 @@
-// Boost.Geometry (aka GGL, Generic Geometry Library)
-
-// Boost.SpatialIndex - rtree node implementation
-//
-// Copyright 2008 Federico J. Fernandez.
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RTREE_NODE_HPP
-#define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RTREE_NODE_HPP
-
-#include <deque>
-#include <iostream> // TODO: Remove if print() is removed
-#include <stdexcept>
-#include <utility>
-#include <vector>
-
-#include <memory>
-
-#include <boost/geometry/algorithms/area.hpp>
-#include <boost/geometry/algorithms/assign.hpp>
-#include <boost/geometry/algorithms/equals.hpp>
-#include <boost/geometry/algorithms/expand.hpp>
-
-#include <boost/geometry/extensions/index/rtree/helpers.hpp>
-
-namespace boost { namespace geometry { namespace index
-{
-
-/// forward declaration
-template <typename Box, typename Value>
-class rtree_leaf;
-
-template <typename Box, typename Value>
-class rtree_node
-{
-public:
-
- typedef std::shared_ptr<rtree_node<Box, Value> > node_pointer;
- typedef std::shared_ptr<rtree_leaf<Box, Value> > leaf_pointer;
-
- /// type for the node map
- typedef std::vector<std::pair<Box, node_pointer > > node_map;
-
- /**
- * \brief Creates a default node (needed for the containers)
- */
- rtree_node()
- {
- }
-
- /**
- * \brief Creates a node with 'parent' as parent and 'level' as its level
- */
- rtree_node(node_pointer const& parent, unsigned int const& level)
- : m_parent(parent), m_level(level)
- {
- }
-
- /**
- * \brief destructor (virtual because we have virtual functions)
- */
- virtual ~rtree_node()
- {
- }
-
- /**
- * \brief Level projector
- */
- virtual unsigned int get_level() const
- {
- return m_level;
- }
-
- /**
- * \brief Number of elements in the subtree
- */
- virtual unsigned int elements() const
- {
- return m_nodes.size();
- }
-
- /**
- * \brief Project first element, to replace root in case of condensing
- */
- inline node_pointer first_element() const
- {
- if (0 == m_nodes.size())
- {
- // TODO: mloskot - define & use GGL exception
- throw std::logic_error("first_element in empty node");
- }
- return m_nodes.begin()->second;
- }
-
- /**
- * \brief True if it is a leaf node
- */
- virtual bool is_leaf() const
- {
- return false;
- }
-
- /**
- * \brief Proyector for the 'i' node
- */
- node_pointer get_node(unsigned int index)
- {
- return m_nodes[index].second;
- }
-
- /**
- * \brief Search for elements in 'box' in the Rtree. Add them to 'result'.
- * If exact_match is true only return the elements having as
- * key the box 'box'. Otherwise return everything inside 'box'.
- */
- virtual void find(Box const& box, std::deque<Value>& result, bool const exact_match)
- {
- for (typename node_map::const_iterator it = m_nodes.begin();
- it != m_nodes.end(); ++it)
- {
- if (is_overlapping(it->first, box))
- {
- it->second->find(box, result, exact_match);
- }
- }
- }
-
- /**
- * \brief Return in 'result' all the leaves inside 'box'
- */
- void find_leaves(Box const& box, typename std::vector<node_pointer>& result) const
- {
- for (typename node_map::const_iterator it = m_nodes.begin();
- it != m_nodes.end(); ++it)
- {
- if (is_overlapping(it->first, box))
- {
- if (it->second->is_leaf())
- {
- result.push_back(it->second);
- }
- else
- {
- it->second->find_leaves(box, result);
- }
- }
- }
- }
-
- /**
- * \brief Compute bounding box for this node
- */
- virtual Box compute_box() const
- {
- if (m_nodes.empty())
- {
- return Box();
- }
-
- Box result;
- geometry::assign_inverse(result);
- for(typename node_map::const_iterator it = m_nodes.begin(); it != m_nodes.end(); ++it)
- {
- geometry::expand(result, it->first);
- }
-
- return result;
- }
-
- /**
- * \brief Insert a value (not allowed for a node, only on leaves)
- */
- virtual void insert(Box const&, Value const&)
- {
- // TODO: mloskot - define & use GGL exception
- throw std::logic_error("Insert in node!");
- }
-
- /**
- * \brief Get the envelopes of a node
- */
- virtual std::vector<Box> get_boxes() const
- {
- std::vector<Box> result;
- for(typename node_map::const_iterator it = m_nodes.begin(); it != m_nodes.end(); ++it)
- {
- result.push_back(it->first);
- }
- return result;
- }
-
- /**
- * \brief Recompute the bounding box
- */
- void adjust_box(node_pointer const& node)
- {
- unsigned int index = 0;
- for (typename node_map::iterator it = m_nodes.begin();
- it != m_nodes.end(); ++it, index++)
- {
- if (it->second.get() == node.get())
- {
- m_nodes[index] = std::make_pair(node->compute_box(), node);
- return;
- }
- }
- }
-
- /**
- * \brief Remove elements inside the 'box'
- */
- virtual void remove(Box const& box)
- {
- for (typename node_map::iterator it = m_nodes.begin();
- it != m_nodes.end(); ++it)
- {
- if (geometry::equals(it->first, box))
- {
- m_nodes.erase(it);
- return;
- }
- }
- }
-
- /**
- * \brief Remove value in this leaf
- */
- virtual void remove(Value const&)
- {
- // TODO: mloskot - define & use GGL exception
- throw std::logic_error("Can't remove a non-leaf node by value.");
- }
-
- /**
- * \brief Replace the node in the m_nodes vector and recompute the box
- */
- void replace_node(node_pointer const& leaf, node_pointer& new_leaf)
- {
- unsigned int index = 0;
- for(typename node_map::iterator it = m_nodes.begin(); it != m_nodes.end(); ++it, index++)
- {
- if (it->second.get() == leaf.get())
- {
- m_nodes[index] = std::make_pair(new_leaf->compute_box(), new_leaf);
- new_leaf->update_parent(new_leaf);
- return;
- }
- }
-
- // TODO: mloskot - define & use GGL exception
- throw std::logic_error("Node not found.");
- }
-
- /**
- * \brief Add a child to this node
- */
- virtual void add_node(Box const& box, node_pointer const& node)
- {
- m_nodes.push_back(std::make_pair(box, node));
- node->update_parent(node);
- }
-
- /**
- * \brief add a value (not allowed in nodes, only on leaves)
- */
- virtual void add_value(Box const&, Value const&)
- {
- // TODO: mloskot - define & use GGL exception
- throw std::logic_error("Can't add value to non-leaf node.");
- }
-
- /**
- * \brief Add a child leaf to this node
- */
- inline void add_leaf_node(Box const& box, leaf_pointer const& leaf)
- {
- m_nodes.push_back(std::make_pair(box, leaf));
- }
-
- /**
- * \brief Choose a node suitable for adding 'box'
- */
- node_pointer choose_node(Box const& box)
- {
- if (m_nodes.size() == 0)
- {
- // TODO: mloskot - define & use GGL exception
- throw std::logic_error("Empty node trying to choose the least enlargement node.");
- }
-
- typedef typename coordinate_type<Box>::type coordinate_type;
-
- bool first = true;
- coordinate_type min_area = 0;
- coordinate_type min_diff_area = 0;
- node_pointer chosen_node;
-
- // check for the least enlargement
- for (typename node_map::const_iterator it = m_nodes.begin(); it != m_nodes.end(); ++it)
- {
- coordinate_type const
- diff_area = coordinate_type(compute_union_area(box, it->first))
- - geometry::area(it->first);
-
- if (first)
- {
- // it's the first time, we keep the first
- min_diff_area = diff_area;
- min_area = geometry::area(it->first);
- chosen_node = it->second;
-
- first = false;
- }
- else
- {
- if (diff_area < min_diff_area)
- {
- min_diff_area = diff_area;
- min_area = geometry::area(it->first);
- chosen_node = it->second;
- }
- else
- {
- if (diff_area == min_diff_area)
- {
- if (geometry::area(it->first) < min_area)
- {
- min_diff_area = diff_area;
- min_area = geometry::area(it->first);
- chosen_node = it->second;
- }
- }
- }
- }
- }
-
- return chosen_node;
- }
-
- /**
- * \brief Empty the node
- */
- virtual void empty_nodes()
- {
- m_nodes.clear();
- }
-
- /**
- * \brief Projector for parent
- */
- inline node_pointer get_parent() const
- {
- return m_parent;
- }
-
- /**
- * \brief Update the parent of all the childs
- */
- void update_parent(node_pointer const& node)
- {
- for (typename node_map::iterator it = m_nodes.begin(); it != m_nodes.end(); ++it)
- {
- it->second->set_parent(node);
- }
- }
-
- /**
- * \brief Set parent
- */
- void set_parent(node_pointer const& node)
- {
- m_parent = node;
- }
-
- /**
- * \brief Value projector for leaf_node (not allowed for non-leaf nodes)
- */
- virtual Value get_value(unsigned int) const
- {
- // TODO: mloskot - define & use GGL exception
- throw std::logic_error("No values in a non-leaf node.");
- }
-
- /**
- * \brief Box projector for node 'index'
- */
- virtual Box get_box(unsigned int index) const
- {
- return m_nodes[index].first;
- }
-
- /**
- * \brief Box projector for node pointed by 'leaf'
- */
- virtual Box get_box(node_pointer const& leaf) const
- {
- for (typename node_map::const_iterator it = m_nodes.begin();
- it != m_nodes.end(); ++it)
- {
- if (it->second.get() == leaf.get())
- {
- return it->first;
- }
- }
-
- // TODO: mloskot - define & use GGL exception
- throw std::logic_error("Node not found");
- }
-
- /**
- * \brief Children projector
- */
- node_map get_nodes() const
- {
- return m_nodes;
- }
-
- /**
- * \brief Get leaves for a node
- */
- virtual std::vector<std::pair<Box, Value> > get_leaves() const
- {
- typedef std::vector<std::pair<Box, Value> > leaf_type;
- leaf_type leaf;
-
- for (typename node_map::const_iterator it = m_nodes.begin();
- it != m_nodes.end(); ++it)
- {
- leaf_type this_leaves = it->second->get_leaves();
-
- for (typename leaf_type::iterator it_leaf = this_leaves.begin();
- it_leaf != this_leaves.end(); ++it_leaf)
- {
- leaf.push_back(*it_leaf);
- }
- }
-
- return leaf;
- }
-
- /**
- * \brief Print Rtree subtree (mainly for debug)
- */
- virtual void print() const
- {
- std::cerr << " --> Node --------" << std::endl;
- std::cerr << " Address: " << this << std::endl;
- std::cerr << " Level: " << m_level << std::endl;
- std::cerr << " Size: " << m_nodes.size() << std::endl;
- std::cerr << " | ";
- for(typename node_map::const_iterator it = m_nodes.begin(); it != m_nodes.end(); ++it)
- {
- if (this != it->second->get_parent().get())
- {
- std::cerr << "ERROR - " << this << " is not " << it->second->get_parent().get() << " ";
- }
-
- std::cerr << "( " << geometry::get<min_corner, 0>(it->first) << " , "
- << geometry::get<min_corner, 1>(it->first) << " ) x ";
- std::cerr << "( " << geometry::get<max_corner, 0>(it->first) << " , "
- << geometry::get<max_corner, 1>(it->first) << " )";
- std::cerr << " | ";
- }
- std::cerr << std::endl;
- std::cerr << " --< Node --------" << std::endl;
-
- // print child nodes
- std::cerr << " Children: " << std::endl;
- for (typename node_map::const_iterator it = m_nodes.begin();
- it != m_nodes.end(); ++it)
- {
- it->second->print();
- }
- }
-
-private:
-
- /// parent node
- node_pointer m_parent;
-
- /// level of this node
- // TODO: mloskot - Why not std::size_t or node_map::size_type, same with member functions?
- unsigned int m_level;
-
- /// child nodes
- node_map m_nodes;
-};
-
-}}} // namespace boost::geometry::index
-
-#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RTREE_NODE_HPP
diff --git a/deps/clipper/include/clipper.hpp b/deps/clipper/include/clipper.hpp
index 5495b66..3b03988 100755
--- a/deps/clipper/include/clipper.hpp
+++ b/deps/clipper/include/clipper.hpp
@@ -1,10 +1,10 @@
/*******************************************************************************
* *
* Author : Angus Johnson *
-* Version : 6.0.0 *
-* Date : 30 October 2013 *
+* Version : 6.2.9 *
+* Date : 16 February 2015 *
* Website : http://www.angusj.com *
-* Copyright : Angus Johnson 2010-2013 *
+* Copyright : Angus Johnson 2010-2015 *
* *
* License: *
* Use, modification & distribution is subject to Boost Software License Ver 1. *
@@ -35,7 +35,9 @@
#define clipper_hpp
#include <mapnik/config.hpp>
-#define CLIPPER_VERSION "6.0.0"
+#include <mapnik/geometry.hpp>
+
+#define CLIPPER_VERSION "6.2.6"
//use_int32: When enabled 32bit ints are used instead of 64bit ints. This
//improve performance but coordinate values are limited to the range +/- 46340
@@ -45,20 +47,20 @@
//#define use_xyz
//use_lines: Enables line clipping. Adds a very minor cost to performance.
-//#define use_lines
+#define use_lines
-//When enabled, code developed with earlier versions of Clipper
-//(ie prior to ver 6) should compile without changes.
-//In a future update, this compatability code will be removed.
-#define use_deprecated
+//use_deprecated: Enables temporary support for the obsolete functions
+//#define use_deprecated
#include <vector>
+#include <list>
#include <set>
#include <stdexcept>
#include <cstring>
#include <cstdlib>
#include <ostream>
#include <functional>
+#include <queue>
namespace ClipperLib {
@@ -71,36 +73,45 @@ enum PolyType { ptSubject, ptClip };
enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative };
#ifdef use_int32
-typedef int cInt;
-typedef unsigned int cUInt;
+ typedef int cInt;
+ static cInt const loRange = 0x7FFF;
+ static cInt const hiRange = 0x7FFF;
#else
-typedef signed long long cInt;
-typedef unsigned long long cUInt;
-#endif
+ typedef std::int64_t cInt;
+ static cInt const loRange = 0x3FFFFFFF;
+ static cInt const hiRange = 0x3FFFFFFFFFFFFFFFLL;
+ typedef std::int64_t long64; //used by Int128 class
+ typedef std::uint64_t ulong64;
+#endif
+/*
struct IntPoint {
- cInt X;
- cInt Y;
+ cInt x;
+ cInt y;
#ifdef use_xyz
- cInt Z;
+ cInt z;
IntPoint(cInt x = 0, cInt y = 0, cInt z = 0): X(x), Y(y), Z(z) {};
#else
- IntPoint(cInt x = 0, cInt y = 0): X(x), Y(y) {};
+ IntPoint(cInt x_ = 0, cInt y_ = 0): x(x_), y(y_) {};
#endif
friend inline bool operator== (const IntPoint& a, const IntPoint& b)
{
- return a.X == b.X && a.Y == b.Y;
+ return a.x == b.x && a.y == b.y;
}
friend inline bool operator!= (const IntPoint& a, const IntPoint& b)
{
- return a.X != b.X || a.Y != b.Y;
+ return a.x != b.x || a.y != b.y;
}
-};
+};*/
+
+typedef mapnik::geometry::point<cInt> IntPoint;
+
//------------------------------------------------------------------------------
-typedef std::vector< IntPoint > Path;
-typedef std::vector< Path > Paths;
+//typedef std::vector< IntPoint > Path;
+typedef mapnik::geometry::line_string<cInt> Path;
+typedef mapnik::geometry::multi_line_string<cInt> Paths;
inline Path& operator <<(Path& poly, const IntPoint& p) {poly.push_back(p); return poly;}
inline Paths& operator <<(Paths& polys, const Path& p) {polys.push_back(p); return polys;}
@@ -109,32 +120,31 @@ std::ostream& operator <<(std::ostream &s, const IntPoint &p);
std::ostream& operator <<(std::ostream &s, const Path &p);
std::ostream& operator <<(std::ostream &s, const Paths &p);
-#ifdef use_deprecated
-typedef signed long long long64; //backward compatibility only
-typedef Path Polygon;
-typedef Paths Polygons;
-#endif
-
struct DoublePoint
{
- double X;
- double Y;
- DoublePoint(double x = 0, double y = 0) : X(x), Y(y) {}
- DoublePoint(IntPoint ip) : X((double)ip.X), Y((double)ip.Y) {}
+ double x;
+ double y;
+ DoublePoint(double x_ = 0, double y_ = 0) : x(x_), y(y_) {}
+ DoublePoint(IntPoint ip) : x((double)ip.x), y((double)ip.y) {}
};
//------------------------------------------------------------------------------
#ifdef use_xyz
-typedef void (*TZFillCallback)(IntPoint& z1, IntPoint& z2, IntPoint& pt);
+typedef void (*ZFillCallback)(IntPoint& e1bot, IntPoint& e1top, IntPoint& e2bot, IntPoint& e2top, IntPoint& pt);
#endif
+enum InitOptions {ioReverseSolution = 1, ioStrictlySimple = 2, ioPreserveCollinear = 4};
+enum JoinType {jtSquare, jtRound, jtMiter};
+enum EndType {etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound};
+
class PolyNode;
typedef std::vector< PolyNode* > PolyNodes;
-class PolyNode
+class MAPNIK_DECL PolyNode
{
public:
PolyNode();
+ virtual ~PolyNode(){};
Path Contour;
PolyNodes Childs;
PolyNode* Parent;
@@ -143,14 +153,17 @@ public:
bool IsOpen() const;
int ChildCount() const;
private:
+ unsigned Index; //node index in Parent.Childs
bool m_IsOpen;
+ JoinType m_jointype;
+ EndType m_endtype;
PolyNode* GetNextSiblingUp() const;
- unsigned Index; //node index in Parent.Childs
void AddChild(PolyNode& child);
- friend class Clipper; //to access Index
+ friend class MAPNIK_DECL Clipper; //to access Index
+ friend class MAPNIK_DECL ClipperOffset;
};
-class PolyTree: public PolyNode
+class MAPNIK_DECL PolyTree: public PolyNode
{
public:
~PolyTree(){Clear();};
@@ -159,42 +172,29 @@ public:
int Total() const;
private:
PolyNodes AllNodes;
- friend class Clipper; //to access AllNodes
+ friend class MAPNIK_DECL Clipper; //to access AllNodes
};
-enum InitOptions {ioReverseSolution = 1, ioStrictlySimple = 2, ioPreserveCollinear = 4};
-enum JoinType {jtSquare, jtRound, jtMiter};
-enum EndType {etClosed, etButt, etSquare, etRound};
-
-bool Orientation(const Path &poly);
-double Area(const Path &poly);
-
-#ifdef use_deprecated
- void OffsetPolygons(const Polygons &in_polys, Polygons &out_polys,
- double delta, JoinType jointype = jtSquare, double limit = 0, bool autoFix = true);
- void PolyTreeToPolygons(const PolyTree& polytree, Paths& paths);
- void ReversePolygon(Path& p);
- void ReversePolygons(Paths& p);
-#endif
-
-void OffsetPaths(const Paths &in_polys, Paths &out_polys,
- double delta, JoinType jointype, EndType endtype, double limit = 0);
+MAPNIK_DECL bool Orientation(const Path &poly);
+MAPNIK_DECL double Area(const Path &poly);
+MAPNIK_DECL int PointInPolygon(const IntPoint &pt, const Path &path);
-void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType = pftEvenOdd);
-void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType = pftEvenOdd);
-void SimplifyPolygons(Paths &polys, PolyFillType fillType = pftEvenOdd);
+MAPNIK_DECL void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType = pftEvenOdd);
+MAPNIK_DECL void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType = pftEvenOdd);
+MAPNIK_DECL void SimplifyPolygons(Paths &polys, PolyFillType fillType = pftEvenOdd);
-void CleanPolygon(const Path& in_poly, Path& out_poly, double distance = 1.415);
-void CleanPolygon(Path& poly, double distance = 1.415);
-void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance = 1.415);
-void CleanPolygons(Paths& polys, double distance = 1.415);
+MAPNIK_DECL void CleanPolygon(const Path& in_poly, Path& out_poly, double distance = 1.415);
+MAPNIK_DECL void CleanPolygon(Path& poly, double distance = 1.415);
+MAPNIK_DECL void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance = 1.415);
+MAPNIK_DECL void CleanPolygons(Paths& polys, double distance = 1.415);
-void MinkowkiSum(const Path& poly, const Path& path, Paths& solution, bool isClosed);
-void MinkowkiDiff(const Path& poly, const Path& path, Paths& solution, bool isClosed);
+void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed);
+void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed);
+void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution);
void PolyTreeToPaths(const PolyTree& polytree, Paths& paths);
void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths);
-void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths);
+MAPNIK_DECL void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths);
void ReversePath(Path& p);
void ReversePaths(Paths& p);
@@ -207,8 +207,7 @@ enum EdgeSide { esLeft = 1, esRight = 2};
//forward declarations (for stuff used internally) ...
struct TEdge;
struct IntersectNode;
-struct LocalMinima;
-struct Scanbeam;
+struct LocalMinimum;
struct OutPt;
struct OutRec;
struct Join;
@@ -216,6 +215,7 @@ struct Join;
typedef std::vector < OutRec* > PolyOutList;
typedef std::vector < TEdge* > EdgeList;
typedef std::vector < Join* > JoinList;
+typedef std::vector < IntersectNode* > IntersectList;
//------------------------------------------------------------------------------
@@ -229,12 +229,6 @@ public:
virtual ~ClipperBase();
bool AddPath(const Path &pg, PolyType PolyTyp, bool Closed);
bool AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed);
-
-#ifdef use_deprecated
- bool AddPolygon(const Path &pg, PolyType PolyTyp);
- bool AddPolygons(const Paths &ppg, PolyType PolyTyp);
-#endif
-
virtual void Clear();
IntRect GetBounds();
bool PreserveCollinear() {return m_PreserveCollinear;};
@@ -244,12 +238,14 @@ protected:
TEdge* AddBoundsToLML(TEdge *e, bool IsClosed);
void PopLocalMinima();
virtual void Reset();
- void InsertLocalMinima(LocalMinima *newLm);
- void DoMinimaLML(TEdge* E1, TEdge* E2, bool IsClosed);
+ TEdge* ProcessBound(TEdge* E, bool IsClockwise);
TEdge* DescendToMin(TEdge *&E);
void AscendToMax(TEdge *&E, bool Appending, bool IsClosed);
- LocalMinima *m_CurrentLM;
- LocalMinima *m_MinimaList;
+
+ typedef std::vector<LocalMinimum> MinimaList;
+ MinimaList::iterator m_CurrentLM;
+ MinimaList m_MinimaList;
+
bool m_UseFullRange;
EdgeList m_edges;
bool m_PreserveCollinear;
@@ -263,34 +259,42 @@ public:
Clipper(int initOptions = 0);
~Clipper();
bool Execute(ClipType clipType,
- Paths &solution,
- PolyFillType subjFillType = pftEvenOdd,
- PolyFillType clipFillType = pftEvenOdd);
+ Paths &solution,
+ PolyFillType fillType = pftEvenOdd);
bool Execute(ClipType clipType,
- PolyTree &polytree,
- PolyFillType subjFillType = pftEvenOdd,
- PolyFillType clipFillType = pftEvenOdd);
- void Clear();
- bool ReverseSolution() {return m_ReverseOutput;};
+ Paths &solution,
+ PolyFillType subjFillType,
+ PolyFillType clipFillType);
+ bool Execute(ClipType clipType,
+ PolyTree &polytree,
+ PolyFillType fillType = pftEvenOdd);
+ bool Execute(ClipType clipType,
+ PolyTree &polytree,
+ PolyFillType subjFillType,
+ PolyFillType clipFillType);
+ bool ReverseSolution() { return m_ReverseOutput; };
void ReverseSolution(bool value) {m_ReverseOutput = value;};
bool StrictlySimple() {return m_StrictSimple;};
void StrictlySimple(bool value) {m_StrictSimple = value;};
//set the callback function for z value filling on intersections (otherwise Z is 0)
#ifdef use_xyz
- void ZFillFunction(TZFillCallback zFillFunc);
+ void ZFillFunction(ZFillCallback zFillFunc);
#endif
protected:
void Reset();
virtual bool ExecuteInternal();
private:
- PolyOutList m_PolyOuts;
- JoinList m_Joins;
- JoinList m_GhostJoins;
- ClipType m_ClipType;
- std::set< cInt, std::greater<cInt> > m_Scanbeam;
+ PolyOutList m_PolyOuts;
+ JoinList m_Joins;
+ JoinList m_GhostJoins;
+ IntersectList m_IntersectList;
+ ClipType m_ClipType;
+ typedef std::priority_queue<cInt> ScanbeamList;
+ ScanbeamList m_Scanbeam;
+ typedef std::list<cInt> MaximaList;
+ MaximaList m_Maxima;
TEdge *m_ActiveEdges;
TEdge *m_SortedEdges;
- IntersectNode *m_IntersectNodes;
bool m_ExecuteLocked;
PolyFillType m_ClipFillType;
PolyFillType m_SubjFillType;
@@ -298,7 +302,7 @@ private:
bool m_UsingPolyTree;
bool m_StrictSimple;
#ifdef use_xyz
- TZFillCallback m_ZFill; //custom callback
+ ZFillCallback m_ZFill; //custom callback
#endif
void SetWindingCount(TEdge& edge);
bool IsEvenOddFillType(const TEdge& edge) const;
@@ -317,22 +321,20 @@ private:
bool IsTopHorz(const cInt XPos);
void SwapPositionsInAEL(TEdge *edge1, TEdge *edge2);
void DoMaxima(TEdge *e);
- void PrepareHorzJoins(TEdge* horzEdge, bool isTopOfScanbeam);
- void ProcessHorizontals(bool IsTopOfScanbeam);
- void ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam);
+ void ProcessHorizontals();
+ void ProcessHorizontal(TEdge *horzEdge);
void AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &pt);
OutPt* AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &pt);
OutRec* GetOutRec(int idx);
void AppendPolygon(TEdge *e1, TEdge *e2);
- void IntersectEdges(TEdge *e1, TEdge *e2,
- const IntPoint &pt, bool protect = false);
+ void IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &pt);
OutRec* CreateOutRec();
OutPt* AddOutPt(TEdge *e, const IntPoint &pt);
+ OutPt* GetLastOutPt(TEdge *e);
void DisposeAllOutRecs();
void DisposeOutRec(PolyOutList::size_type index);
- bool ProcessIntersections(const cInt botY, const cInt topY);
- void InsertIntersectNode(TEdge *e1, TEdge *e2, const IntPoint &pt);
- void BuildIntersectList(const cInt botY, const cInt topY);
+ bool ProcessIntersections(const cInt topY);
+ void BuildIntersectList(const cInt topY);
void ProcessIntersectList();
void ProcessEdgesAtTopOfScanbeam(const cInt topY);
void BuildResult(Paths& polys);
@@ -341,23 +343,56 @@ private:
void DisposeIntersectNodes();
bool FixupIntersectionOrder();
void FixupOutPolygon(OutRec &outrec);
+ void FixupOutPolyline(OutRec &outrec);
bool IsHole(TEdge *e);
+ bool FindOwnerFromSplitRecs(OutRec &outRec, OutRec *&currOrfl);
void FixHoleLinkage(OutRec &outrec);
void AddJoin(OutPt *op1, OutPt *op2, const IntPoint offPt);
void ClearJoins();
void ClearGhostJoins();
void AddGhostJoin(OutPt *op, const IntPoint offPt);
- bool JoinPoints(const Join *j, OutPt *&p1, OutPt *&p2);
+ bool JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2);
void JoinCommonEdges();
void DoSimplePolygons();
void FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec);
void FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec);
#ifdef use_xyz
- void SetZ(IntPoint& pt, TEdge& e);
+ void SetZ(IntPoint& pt, TEdge& e1, TEdge& e2);
#endif
};
//------------------------------------------------------------------------------
+class MAPNIK_DECL ClipperOffset
+{
+public:
+ ClipperOffset(double miterLimit = 2.0, double roundPrecision = 0.25);
+ ~ClipperOffset();
+ void AddPath(const Path& path, JoinType joinType, EndType endType);
+ void AddPaths(const Paths& paths, JoinType joinType, EndType endType);
+ void Execute(Paths& solution, double delta);
+ void Execute(PolyTree& solution, double delta);
+ void Clear();
+ double MiterLimit;
+ double ArcTolerance;
+private:
+ Paths m_destPolys;
+ Path m_srcPoly;
+ Path m_destPoly;
+ std::vector<DoublePoint> m_normals;
+ double m_delta, m_sinA, m_sin, m_cos;
+ double m_miterLim, m_StepsPerRad;
+ IntPoint m_lowest;
+ PolyNode m_polyNodes;
+
+ void FixOrientations();
+ void DoOffset(double delta);
+ void OffsetPoint(int j, int& k, JoinType jointype);
+ void DoSquare(int j, int k);
+ void DoMiter(int j, int k, double r);
+ void DoRound(int j, int k);
+};
+//------------------------------------------------------------------------------
+
class clipperException : public std::exception
{
public:
diff --git a/deps/clipper/src/clipper.cpp b/deps/clipper/src/clipper.cpp
index f1d0fcd..b9727c6 100755
--- a/deps/clipper/src/clipper.cpp
+++ b/deps/clipper/src/clipper.cpp
@@ -1,10 +1,10 @@
/*******************************************************************************
* *
* Author : Angus Johnson *
-* Version : 6.0.0 *
-* Date : 30 October 2013 *
+* Version : 6.2.9 *
+* Date : 16 February 2015 *
* Website : http://www.angusj.com *
-* Copyright : Angus Johnson 2010-2013 *
+* Copyright : Angus Johnson 2010-2015 *
* *
* License: *
* Use, modification & distribution is subject to Boost Software License Ver 1. *
@@ -50,16 +50,10 @@
namespace ClipperLib {
-#ifdef use_int32
- static cInt const loRange = 46340;
- static cInt const hiRange = 46340;
-#else
- static cInt const loRange = 0x3FFFFFFF;
- static cInt const hiRange = 0x3FFFFFFFFFFFFFFFLL;
- typedef unsigned long long ulong64;
-#endif
-
static double const pi = 3.141592653589793238;
+static double const two_pi = pi *2;
+static double const def_arc_tolerance = 0.25;
+
enum Direction { dRightToLeft, dLeftToRight };
static int const Unassigned = -1; //edge not currently 'owning' a solution
@@ -94,14 +88,12 @@ struct IntersectNode {
TEdge *Edge1;
TEdge *Edge2;
IntPoint Pt;
- IntersectNode *Next;
};
-struct LocalMinima {
- cInt Y;
+struct LocalMinimum {
+ cInt y;
TEdge *LeftBound;
TEdge *RightBound;
- LocalMinima *Next;
};
struct OutPt;
@@ -129,6 +121,14 @@ struct Join {
IntPoint OffPt;
};
+struct LocMinSorter
+{
+ inline bool operator()(const LocalMinimum& locMin1, const LocalMinimum& locMin2)
+ {
+ return locMin2.y < locMin1.y;
+ }
+};
+
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
@@ -168,27 +168,30 @@ PolyNode* PolyTree::GetFirst() const
int PolyTree::Total() const
{
- return AllNodes.size();
+ int result = (int)AllNodes.size();
+ //with negative offsets, ignore the hidden outer polygon ...
+ if (result > 0 && Childs[0] != AllNodes[0]) result--;
+ return result;
}
//------------------------------------------------------------------------------
// PolyNode methods ...
//------------------------------------------------------------------------------
-PolyNode::PolyNode(): Childs(), Parent(0), m_IsOpen(false), Index(0)
+PolyNode::PolyNode(): Childs(), Parent(0), Index(0), m_IsOpen(false)
{
}
//------------------------------------------------------------------------------
int PolyNode::ChildCount() const
{
- return Childs.size();
+ return (int)Childs.size();
}
//------------------------------------------------------------------------------
void PolyNode::AddChild(PolyNode& child)
{
- unsigned cnt = Childs.size();
+ unsigned cnt = (unsigned)Childs.size();
Childs.push_back(&child);
child.Parent = this;
child.Index = cnt;
@@ -238,8 +241,8 @@ bool PolyNode::IsOpen() const
//------------------------------------------------------------------------------
// Int128 class (enables safe math on signed 64bit integers)
-// eg Int128 val1((cInt)9223372036854775807); //ie 2^63 -1
-// Int128 val2((cInt)9223372036854775807);
+// eg Int128 val1((long64)9223372036854775807); //ie 2^63 -1
+// Int128 val2((long64)9223372036854775807);
// Int128 val3 = val1 * val2;
// val3.AsString => "85070591730234615847396907784232501249" (8.5e+37)
//------------------------------------------------------------------------------
@@ -247,22 +250,21 @@ bool PolyNode::IsOpen() const
class Int128
{
public:
+ ulong64 lo;
+ long64 hi;
- cUInt lo;
- cInt hi;
-
- Int128(cInt _lo = 0)
+ Int128(long64 _lo = 0)
{
- lo = (cUInt)_lo;
+ lo = (ulong64)_lo;
if (_lo < 0) hi = -1; else hi = 0;
}
Int128(const Int128 &val): lo(val.lo), hi(val.hi){}
- Int128(const cInt& _hi, const ulong64& _lo): lo(_lo), hi(_hi){}
+ Int128(const long64& _hi, const ulong64& _lo): lo(_lo), hi(_hi){}
- Int128& operator = (const cInt &val)
+ Int128& operator = (const long64 &val)
{
lo = (ulong64)val;
if (val < 0) hi = -1; else hi = 0;
@@ -328,74 +330,12 @@ class Int128
Int128 operator-() const //unary negation
{
if (lo == 0)
- return Int128(-hi,0);
- else
- return Int128(~hi,~lo +1);
- }
-
- Int128 operator/ (const Int128 &rhs) const
- {
- if (rhs.lo == 0 && rhs.hi == 0)
- throw "Int128 operator/: divide by zero";
-
- bool negate = (rhs.hi < 0) != (hi < 0);
- Int128 dividend = *this;
- Int128 divisor = rhs;
- if (dividend.hi < 0) dividend = -dividend;
- if (divisor.hi < 0) divisor = -divisor;
-
- if (divisor < dividend)
- {
- Int128 result = Int128(0);
- Int128 cntr = Int128(1);
- while (divisor.hi >= 0 && !(divisor > dividend))
- {
- divisor.hi <<= 1;
- if ((cInt)divisor.lo < 0) divisor.hi++;
- divisor.lo <<= 1;
-
- cntr.hi <<= 1;
- if ((cInt)cntr.lo < 0) cntr.hi++;
- cntr.lo <<= 1;
- }
- divisor.lo >>= 1;
- if ((divisor.hi & 1) == 1)
- divisor.lo |= 0x8000000000000000LL;
- divisor.hi = (ulong64)divisor.hi >> 1;
-
- cntr.lo >>= 1;
- if ((cntr.hi & 1) == 1)
- cntr.lo |= 0x8000000000000000LL;
- cntr.hi >>= 1;
-
- while (cntr.hi != 0 || cntr.lo != 0)
- {
- if (!(dividend < divisor))
- {
- dividend -= divisor;
- result.hi |= cntr.hi;
- result.lo |= cntr.lo;
- }
- divisor.lo >>= 1;
- if ((divisor.hi & 1) == 1)
- divisor.lo |= 0x8000000000000000LL;
- divisor.hi >>= 1;
-
- cntr.lo >>= 1;
- if ((cntr.hi & 1) == 1)
- cntr.lo |= 0x8000000000000000LL;
- cntr.hi >>= 1;
- }
- if (negate) result = -result;
- return result;
- }
- else if (rhs.hi == this->hi && rhs.lo == this->lo)
- return Int128(1);
+ return Int128(-hi, 0);
else
- return Int128(0);
+ return Int128(~hi, ~lo + 1);
}
- double AsDouble() const
+ operator double() const
{
const double shift64 = 18446744073709551616.0; //2^64
if (hi < 0)
@@ -410,7 +350,7 @@ class Int128
};
//------------------------------------------------------------------------------
-Int128 Int128Mul (cInt lhs, cInt rhs)
+Int128 Int128Mul (long64 lhs, long64 rhs)
{
bool negate = (lhs < 0) != (rhs < 0);
@@ -428,9 +368,9 @@ Int128 Int128Mul (cInt lhs, cInt rhs)
ulong64 c = int1Hi * int2Lo + int1Lo * int2Hi;
Int128 tmp;
- tmp.hi = cInt(a + (c >> 32));
- tmp.lo = cInt(c << 32);
- tmp.lo += cInt(b);
+ tmp.hi = long64(a + (c >> 32));
+ tmp.lo = long64(c << 32);
+ tmp.lo += long64(b);
if (tmp.lo < b) tmp.hi++;
if (negate) tmp = -tmp;
return tmp;
@@ -449,14 +389,16 @@ bool Orientation(const Path &poly)
double Area(const Path &poly)
{
- int highI = (int)poly.size() -1;
- if (highI < 2) return 0;
+ int size = (int)poly.size();
+ if (size < 3) return 0;
- double a;
- a = ((double)poly[highI].X + poly[0].X) * ((double)poly[0].Y - poly[highI].Y);
- for (int i = 1; i <= highI; ++i)
- a += ((double)poly[i - 1].X + poly[i].X) * ((double)poly[i].Y - poly[i - 1].Y);
- return a / 2;
+ double a = 0;
+ for (int i = 0, j = size -1; i < size; ++i)
+ {
+ a += ((double)poly[j].x + poly[i].x) * ((double)poly[j].y - poly[i].y);
+ j = i;
+ }
+ return -a * 0.5;
}
//------------------------------------------------------------------------------
@@ -466,10 +408,10 @@ double Area(const OutRec &outRec)
if (!op) return 0;
double a = 0;
do {
- a = a + (double)(op->Pt.X + op->Prev->Pt.X) * (double)(op->Prev->Pt.Y - op->Pt.Y);
+ a += (double)(op->Prev->Pt.x + op->Pt.x) * (double)(op->Prev->Pt.y - op->Pt.y);
op = op->Next;
} while (op != outRec.Pts);
- return a / 2;
+ return a * 0.5;
}
//------------------------------------------------------------------------------
@@ -486,81 +428,117 @@ bool PointIsVertex(const IntPoint &Pt, OutPt *pp)
}
//------------------------------------------------------------------------------
-bool PointOnLineSegment(const IntPoint Pt,
- const IntPoint linePt1, const IntPoint linePt2, bool UseFullInt64Range)
+//See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos
+//http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf
+int PointInPolygon(const IntPoint &pt, const Path &path)
{
-#ifndef use_int32
- if (UseFullInt64Range)
- return ((Pt.X == linePt1.X) && (Pt.Y == linePt1.Y)) ||
- ((Pt.X == linePt2.X) && (Pt.Y == linePt2.Y)) ||
- (((Pt.X > linePt1.X) == (Pt.X < linePt2.X)) &&
- ((Pt.Y > linePt1.Y) == (Pt.Y < linePt2.Y)) &&
- ((Int128Mul((Pt.X - linePt1.X), (linePt2.Y - linePt1.Y)) ==
- Int128Mul((linePt2.X - linePt1.X), (Pt.Y - linePt1.Y)))));
- else
-#endif
- return ((Pt.X == linePt1.X) && (Pt.Y == linePt1.Y)) ||
- ((Pt.X == linePt2.X) && (Pt.Y == linePt2.Y)) ||
- (((Pt.X > linePt1.X) == (Pt.X < linePt2.X)) &&
- ((Pt.Y > linePt1.Y) == (Pt.Y < linePt2.Y)) &&
- ((Pt.X - linePt1.X) * (linePt2.Y - linePt1.Y) ==
- (linePt2.X - linePt1.X) * (Pt.Y - linePt1.Y)));
+ //returns 0 if false, +1 if true, -1 if pt ON polygon boundary
+ int result = 0;
+ size_t cnt = path.size();
+ if (cnt < 3) return 0;
+ IntPoint ip = path[0];
+ for(size_t i = 1; i <= cnt; ++i)
+ {
+ IntPoint ipNext = (i == cnt ? path[0] : path[i]);
+ if (ipNext.y == pt.y)
+ {
+ if ((ipNext.x == pt.x) || (ip.y == pt.y &&
+ ((ipNext.x > pt.x) == (ip.x < pt.x)))) return -1;
+ }
+ if ((ip.y < pt.y) != (ipNext.y < pt.y))
+ {
+ if (ip.x >= pt.x)
+ {
+ if (ipNext.x > pt.x) result = 1 - result;
+ else
+ {
+ double d = (double)(ip.x - pt.x) * (ipNext.y - pt.y) -
+ (double)(ipNext.x - pt.x) * (ip.y - pt.y);
+ if (!d) return -1;
+ if ((d > 0) == (ipNext.y > ip.y)) result = 1 - result;
+ }
+ } else
+ {
+ if (ipNext.x > pt.x)
+ {
+ double d = (double)(ip.x - pt.x) * (ipNext.y - pt.y) -
+ (double)(ipNext.x - pt.x) * (ip.y - pt.y);
+ if (!d) return -1;
+ if ((d > 0) == (ipNext.y > ip.y)) result = 1 - result;
+ }
+ }
+ }
+ ip = ipNext;
+ }
+ return result;
}
//------------------------------------------------------------------------------
-bool PointOnPolygon(const IntPoint Pt, OutPt *pp, bool UseFullInt64Range)
+int PointInPolygon (const IntPoint &pt, OutPt *op)
{
- OutPt *pp2 = pp;
- while (true)
+ //returns 0 if false, +1 if true, -1 if pt ON polygon boundary
+ int result = 0;
+ OutPt* startOp = op;
+ for(;;)
{
- if (PointOnLineSegment(Pt, pp2->Pt, pp2->Next->Pt, UseFullInt64Range))
- return true;
- pp2 = pp2->Next;
- if (pp2 == pp) break;
+ if (op->Next->Pt.y == pt.y)
+ {
+ if ((op->Next->Pt.x == pt.x) || (op->Pt.y == pt.y &&
+ ((op->Next->Pt.x > pt.x) == (op->Pt.x < pt.x)))) return -1;
+ }
+ if ((op->Pt.y < pt.y) != (op->Next->Pt.y < pt.y))
+ {
+ if (op->Pt.x >= pt.x)
+ {
+ if (op->Next->Pt.x > pt.x) result = 1 - result;
+ else
+ {
+ double d = (double)(op->Pt.x - pt.x) * (op->Next->Pt.y - pt.y) -
+ (double)(op->Next->Pt.x - pt.x) * (op->Pt.y - pt.y);
+ if (!d) return -1;
+ if ((d > 0) == (op->Next->Pt.y > op->Pt.y)) result = 1 - result;
+ }
+ } else
+ {
+ if (op->Next->Pt.x > pt.x)
+ {
+ double d = (double)(op->Pt.x - pt.x) * (op->Next->Pt.y - pt.y) -
+ (double)(op->Next->Pt.x - pt.x) * (op->Pt.y - pt.y);
+ if (!d) return -1;
+ if ((d > 0) == (op->Next->Pt.y > op->Pt.y)) result = 1 - result;
+ }
+ }
+ }
+ op = op->Next;
+ if (startOp == op) break;
}
- return false;
+ return result;
}
//------------------------------------------------------------------------------
-bool PointInPolygon(const IntPoint &Pt, OutPt *pp, bool UseFullInt64Range)
+bool Poly2ContainsPoly1(OutPt *OutPt1, OutPt *OutPt2)
{
- OutPt *pp2 = pp;
- bool result = false;
-#ifndef use_int32
- if (UseFullInt64Range) {
- do
- {
- if (((pp2->Pt.Y > Pt.Y) != (pp2->Prev->Pt.Y > Pt.Y)) &&
- (Int128(Pt.X - pp2->Pt.X) <
- Int128Mul(pp2->Prev->Pt.X - pp2->Pt.X, Pt.Y - pp2->Pt.Y) /
- Int128(pp2->Prev->Pt.Y - pp2->Pt.Y))) result = !result;
- pp2 = pp2->Next;
- }
- while (pp2 != pp);
- return result;
- }
-#endif
+ OutPt* op = OutPt1;
do
{
- //http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
- if (((pp2->Pt.Y > Pt.Y) != (pp2->Prev->Pt.Y > Pt.Y)) &&
- ((Pt.X - pp2->Pt.X) < (pp2->Prev->Pt.X - pp2->Pt.X) * (Pt.Y - pp2->Pt.Y) /
- (pp2->Prev->Pt.Y - pp2->Pt.Y))) result = !result;
- pp2 = pp2->Next;
+ //nb: PointInPolygon returns 0 if false, +1 if true, -1 if pt on polygon
+ int res = PointInPolygon(op->Pt, OutPt2);
+ if (res >= 0) return res > 0;
+ op = op->Next;
}
- while (pp2 != pp);
- return result;
+ while (op != OutPt1);
+ return true;
}
-//------------------------------------------------------------------------------
+//----------------------------------------------------------------------
bool SlopesEqual(const TEdge &e1, const TEdge &e2, bool UseFullInt64Range)
{
#ifndef use_int32
if (UseFullInt64Range)
- return Int128Mul(e1.Delta.Y, e2.Delta.X) == Int128Mul(e1.Delta.X, e2.Delta.Y);
+ return Int128Mul(e1.Delta.y, e2.Delta.x) == Int128Mul(e1.Delta.x, e2.Delta.y);
else
#endif
- return e1.Delta.Y * e2.Delta.X == e1.Delta.X * e2.Delta.Y;
+ return e1.Delta.y * e2.Delta.x == e1.Delta.x * e2.Delta.y;
}
//------------------------------------------------------------------------------
@@ -569,10 +547,10 @@ bool SlopesEqual(const IntPoint pt1, const IntPoint pt2,
{
#ifndef use_int32
if (UseFullInt64Range)
- return Int128Mul(pt1.Y-pt2.Y, pt2.X-pt3.X) == Int128Mul(pt1.X-pt2.X, pt2.Y-pt3.Y);
+ return Int128Mul(pt1.y-pt2.y, pt2.x-pt3.x) == Int128Mul(pt1.x-pt2.x, pt2.y-pt3.y);
else
#endif
- return (pt1.Y-pt2.Y)*(pt2.X-pt3.X) == (pt1.X-pt2.X)*(pt2.Y-pt3.Y);
+ return (pt1.y-pt2.y)*(pt2.x-pt3.x) == (pt1.x-pt2.x)*(pt2.y-pt3.y);
}
//------------------------------------------------------------------------------
@@ -581,33 +559,33 @@ bool SlopesEqual(const IntPoint pt1, const IntPoint pt2,
{
#ifndef use_int32
if (UseFullInt64Range)
- return Int128Mul(pt1.Y-pt2.Y, pt3.X-pt4.X) == Int128Mul(pt1.X-pt2.X, pt3.Y-pt4.Y);
+ return Int128Mul(pt1.y-pt2.y, pt3.x-pt4.x) == Int128Mul(pt1.x-pt2.x, pt3.y-pt4.y);
else
#endif
- return (pt1.Y-pt2.Y)*(pt3.X-pt4.X) == (pt1.X-pt2.X)*(pt3.Y-pt4.Y);
+ return (pt1.y-pt2.y)*(pt3.x-pt4.x) == (pt1.x-pt2.x)*(pt3.y-pt4.y);
}
//------------------------------------------------------------------------------
inline bool IsHorizontal(TEdge &e)
{
- return e.Delta.Y == 0;
+ return e.Delta.y == 0;
}
//------------------------------------------------------------------------------
inline double GetDx(const IntPoint pt1, const IntPoint pt2)
{
- return (pt1.Y == pt2.Y) ?
- HORIZONTAL : (double)(pt2.X - pt1.X) / (pt2.Y - pt1.Y);
+ return (pt1.y == pt2.y) ?
+ HORIZONTAL : (double)(pt2.x - pt1.x) / (pt2.y - pt1.y);
}
//---------------------------------------------------------------------------
inline void SetDx(TEdge &e)
{
- e.Delta.X = (e.Top.X - e.Bot.X);
- e.Delta.Y = (e.Top.Y - e.Bot.Y);
+ e.Delta.x = (e.Top.x - e.Bot.x);
+ e.Delta.y = (e.Top.y - e.Bot.y);
- if (e.Delta.Y == 0) e.Dx = HORIZONTAL;
- else e.Dx = (double)(e.Delta.X) / e.Delta.Y;
+ if (e.Delta.y == 0) e.Dx = HORIZONTAL;
+ else e.Dx = (double)(e.Delta.x) / e.Delta.y;
}
//---------------------------------------------------------------------------
@@ -629,77 +607,78 @@ inline void SwapPolyIndexes(TEdge &Edge1, TEdge &Edge2)
inline cInt TopX(TEdge &edge, const cInt currentY)
{
- return ( currentY == edge.Top.Y ) ?
- edge.Top.X : edge.Bot.X + Round(edge.Dx *(currentY - edge.Bot.Y));
+ return ( currentY == edge.Top.y ) ?
+ edge.Top.x : edge.Bot.x + Round(edge.Dx *(currentY - edge.Bot.y));
}
//------------------------------------------------------------------------------
-bool IntersectPoint(TEdge &Edge1, TEdge &Edge2,
- IntPoint &ip, bool UseFullInt64Range)
+void IntersectPoint(TEdge &Edge1, TEdge &Edge2, IntPoint &ip)
{
#ifdef use_xyz
ip.Z = 0;
#endif
+
double b1, b2;
- //nb: with very large coordinate values, it's possible for SlopesEqual() to
- //return false but for the edge.Dx value be equal due to double precision rounding.
- if (SlopesEqual(Edge1, Edge2, UseFullInt64Range) || Edge1.Dx == Edge2.Dx)
+ if (Edge1.Dx == Edge2.Dx)
{
- if (Edge2.Bot.Y > Edge1.Bot.Y) ip.Y = Edge2.Bot.Y;
- else ip.Y = Edge1.Bot.Y;
- return false;
+ ip.y = Edge1.Curr.y;
+ ip.x = TopX(Edge1, ip.y);
+ return;
}
- else if (Edge1.Delta.X == 0)
+ else if (Edge1.Delta.x == 0)
{
- ip.X = Edge1.Bot.X;
+ ip.x = Edge1.Bot.x;
if (IsHorizontal(Edge2))
- ip.Y = Edge2.Bot.Y;
+ ip.y = Edge2.Bot.y;
else
{
- b2 = Edge2.Bot.Y - (Edge2.Bot.X / Edge2.Dx);
- ip.Y = Round(ip.X / Edge2.Dx + b2);
+ b2 = Edge2.Bot.y - (Edge2.Bot.x / Edge2.Dx);
+ ip.y = Round(ip.x / Edge2.Dx + b2);
}
}
- else if (Edge2.Delta.X == 0)
+ else if (Edge2.Delta.x == 0)
{
- ip.X = Edge2.Bot.X;
+ ip.x = Edge2.Bot.x;
if (IsHorizontal(Edge1))
- ip.Y = Edge1.Bot.Y;
+ ip.y = Edge1.Bot.y;
else
{
- b1 = Edge1.Bot.Y - (Edge1.Bot.X / Edge1.Dx);
- ip.Y = Round(ip.X / Edge1.Dx + b1);
+ b1 = Edge1.Bot.y - (Edge1.Bot.x / Edge1.Dx);
+ ip.y = Round(ip.x / Edge1.Dx + b1);
}
}
else
{
- b1 = Edge1.Bot.X - Edge1.Bot.Y * Edge1.Dx;
- b2 = Edge2.Bot.X - Edge2.Bot.Y * Edge2.Dx;
+ b1 = Edge1.Bot.x - Edge1.Bot.y * Edge1.Dx;
+ b2 = Edge2.Bot.x - Edge2.Bot.y * Edge2.Dx;
double q = (b2-b1) / (Edge1.Dx - Edge2.Dx);
- ip.Y = Round(q);
+ ip.y = Round(q);
if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx))
- ip.X = Round(Edge1.Dx * q + b1);
+ ip.x = Round(Edge1.Dx * q + b1);
else
- ip.X = Round(Edge2.Dx * q + b2);
+ ip.x = Round(Edge2.Dx * q + b2);
}
- if (ip.Y < Edge1.Top.Y || ip.Y < Edge2.Top.Y)
+ if (ip.y < Edge1.Top.y || ip.y < Edge2.Top.y)
{
- if (Edge1.Top.Y > Edge2.Top.Y)
- {
- ip.Y = Edge1.Top.Y;
- ip.X = TopX(Edge2, Edge1.Top.Y);
- return ip.X < Edge1.Top.X;
- }
+ if (Edge1.Top.y > Edge2.Top.y)
+ ip.y = Edge1.Top.y;
else
- {
- ip.Y = Edge2.Top.Y;
- ip.X = TopX(Edge1, Edge2.Top.Y);
- return ip.X > Edge2.Top.X;
- }
+ ip.y = Edge2.Top.y;
+ if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx))
+ ip.x = TopX(Edge1, ip.y);
+ else
+ ip.x = TopX(Edge2, ip.y);
}
- else
- return true;
+ //finally, don't allow 'ip' to be BELOW curr.y (ie bottom of scanbeam) ...
+ if (ip.y > Edge1.Curr.y)
+ {
+ ip.y = Edge1.Curr.y;
+ //use the more vertical edge to derive X ...
+ if (std::fabs(Edge1.Dx) > std::fabs(Edge2.Dx))
+ ip.x = TopX(Edge2, ip.y); else
+ ip.x = TopX(Edge1, ip.y);
+ }
}
//------------------------------------------------------------------------------
@@ -742,7 +721,7 @@ inline void InitEdge(TEdge* e, TEdge* eNext, TEdge* ePrev, const IntPoint& Pt)
void InitEdge2(TEdge& e, PolyType Pt)
{
- if (e.Curr.Y >= e.Next->Curr.Y)
+ if (e.Curr.y >= e.Next->Curr.y)
{
e.Bot = e.Curr;
e.Top = e.Next->Curr;
@@ -767,141 +746,14 @@ TEdge* RemoveEdge(TEdge* e)
}
//------------------------------------------------------------------------------
-TEdge* GetLastHorz(TEdge* Edge)
-{
- TEdge* result = Edge;
- while (result->OutIdx != Skip && result->Next != Edge && IsHorizontal(*result->Next))
- result = result->Next;
- return result;
-}
-//------------------------------------------------------------------------------
-
-bool SharedVertWithPrevAtTop(TEdge* Edge)
-{
- TEdge* E = Edge;
- bool result = true;
- while (E->Prev != Edge)
- {
- if (E->Top == E->Prev->Top)
- {
- if (E->Bot == E->Prev->Bot)
- {E = E->Prev; continue;}
- else result = true;
- }
- else result = false;
- break;
- }
- while (E != Edge)
- {
- result = !result;
- E = E->Next;
- }
- return result;
-}
-//------------------------------------------------------------------------------
-
-bool SharedVertWithNextIsBot(TEdge* Edge)
-{
- bool result = true;
- TEdge* E = Edge;
- while (E->Prev != Edge)
- {
- bool A = (E->Next->Bot == E->Bot);
- bool B = (E->Prev->Bot == E->Bot);
- if (A != B)
- {
- result = A;
- break;
- }
- A = (E->Next->Top == E->Top);
- B = (E->Prev->Top == E->Top);
- if (A != B)
- {
- result = B;
- break;
- }
- E = E->Prev;
- }
- while (E != Edge)
- {
- result = !result;
- E = E->Next;
- }
- return result;
-}
-//------------------------------------------------------------------------------
-
-bool MoreBelow(TEdge* Edge)
-{
- //Edge is Skip heading down.
- TEdge* E = Edge;
- if (IsHorizontal(*E))
- {
- while (IsHorizontal(*E->Next)) E = E->Next;
- return E->Next->Bot.Y > E->Bot.Y;
- } else if (IsHorizontal(*E->Next))
- {
- while (IsHorizontal(*E->Next)) E = E->Next;
- return E->Next->Bot.Y > E->Bot.Y;
- }
- else return (E->Bot == E->Next->Top);
-}
-//------------------------------------------------------------------------------
-
-bool JustBeforeLocMin(TEdge* Edge)
-{
- //Edge is Skip and was heading down.
- TEdge*E = Edge;
- if (IsHorizontal(*E))
- {
- while (IsHorizontal(*E->Next)) E = E->Next;
- return E->Next->Top.Y < E->Bot.Y;
- }
- else return SharedVertWithNextIsBot(E);
-}
-//------------------------------------------------------------------------------
-
-bool MoreAbove(TEdge* Edge)
-{
- if (IsHorizontal(*Edge))
- {
- Edge = GetLastHorz(Edge);
- return (Edge->Next->Top.Y < Edge->Top.Y);
- } else if (IsHorizontal(*Edge->Next))
- {
- Edge = GetLastHorz(Edge->Next);
- return (Edge->Next->Top.Y < Edge->Top.Y);
- }
- else
- return (Edge->Next->Top.Y < Edge->Top.Y);
-}
-//------------------------------------------------------------------------------
-
-bool AllHorizontal(TEdge* Edge)
-{
- if (!IsHorizontal(*Edge)) return false;
- TEdge* E = Edge->Next;
- while (E != Edge)
- {
- if (!IsHorizontal(*E)) return false;
- else E = E->Next;
- }
- return true;
-}
-//------------------------------------------------------------------------------
-
inline void ReverseHorizontal(TEdge &e)
{
//swap horizontal edges' Top and Bottom x's so they follow the natural
//progression of the bounds - ie so their xbots will align with the
//adjoining lower edge. [Helpful in the ProcessHorizontal() method.]
- cInt tmp = e.Top.X;
- e.Top.X = e.Bot.X;
- e.Bot.X = tmp;
+ std::swap(e.Top.x, e.Bot.x);
#ifdef use_xyz
- tmp = e.Top.Z;
- e.Top.Z = e.Bot.Z;
- e.Bot.Z = tmp;
+ std::swap(e.Top.Z, e.Bot.Z);
#endif
}
//------------------------------------------------------------------------------
@@ -918,20 +770,20 @@ bool GetOverlapSegment(IntPoint pt1a, IntPoint pt1b, IntPoint pt2a,
IntPoint pt2b, IntPoint &pt1, IntPoint &pt2)
{
//precondition: segments are Collinear.
- if (Abs(pt1a.X - pt1b.X) > Abs(pt1a.Y - pt1b.Y))
+ if (Abs(pt1a.x - pt1b.x) > Abs(pt1a.y - pt1b.y))
{
- if (pt1a.X > pt1b.X) SwapPoints(pt1a, pt1b);
- if (pt2a.X > pt2b.X) SwapPoints(pt2a, pt2b);
- if (pt1a.X > pt2a.X) pt1 = pt1a; else pt1 = pt2a;
- if (pt1b.X < pt2b.X) pt2 = pt1b; else pt2 = pt2b;
- return pt1.X < pt2.X;
+ if (pt1a.x > pt1b.x) SwapPoints(pt1a, pt1b);
+ if (pt2a.x > pt2b.x) SwapPoints(pt2a, pt2b);
+ if (pt1a.x > pt2a.x) pt1 = pt1a; else pt1 = pt2a;
+ if (pt1b.x < pt2b.x) pt2 = pt1b; else pt2 = pt2b;
+ return pt1.x < pt2.x;
} else
{
- if (pt1a.Y < pt1b.Y) SwapPoints(pt1a, pt1b);
- if (pt2a.Y < pt2b.Y) SwapPoints(pt2a, pt2b);
- if (pt1a.Y < pt2a.Y) pt1 = pt1a; else pt1 = pt2a;
- if (pt1b.Y > pt2b.Y) pt2 = pt1b; else pt2 = pt2b;
- return pt1.Y > pt2.Y;
+ if (pt1a.y < pt1b.y) SwapPoints(pt1a, pt1b);
+ if (pt2a.y < pt2b.y) SwapPoints(pt2a, pt2b);
+ if (pt1a.y < pt2a.y) pt1 = pt1a; else pt1 = pt2a;
+ if (pt1b.y > pt2b.y) pt2 = pt1b; else pt2 = pt2b;
+ return pt1.y > pt2.y;
}
}
//------------------------------------------------------------------------------
@@ -961,14 +813,14 @@ OutPt* GetBottomPt(OutPt *pp)
OutPt* p = pp->Next;
while (p != pp)
{
- if (p->Pt.Y > pp->Pt.Y)
+ if (p->Pt.y > pp->Pt.y)
{
pp = p;
dups = 0;
}
- else if (p->Pt.Y == pp->Pt.Y && p->Pt.X <= pp->Pt.X)
+ else if (p->Pt.y == pp->Pt.y && p->Pt.x <= pp->Pt.x)
{
- if (p->Pt.X < pp->Pt.X)
+ if (p->Pt.x < pp->Pt.x)
{
dups = 0;
pp = p;
@@ -993,82 +845,32 @@ OutPt* GetBottomPt(OutPt *pp)
}
//------------------------------------------------------------------------------
-bool FindSegment(OutPt* &pp, bool UseFullInt64Range,
- IntPoint &pt1, IntPoint &pt2)
-{
- //OutPt1 & OutPt2 => the overlap segment (if the function returns true)
- if (!pp) return false;
- OutPt* pp2 = pp;
- IntPoint pt1a = pt1, pt2a = pt2;
- do
- {
- if (SlopesEqual(pt1a, pt2a, pp->Pt, pp->Prev->Pt, UseFullInt64Range) &&
- SlopesEqual(pt1a, pt2a, pp->Pt, UseFullInt64Range) &&
- GetOverlapSegment(pt1a, pt2a, pp->Pt, pp->Prev->Pt, pt1, pt2))
- return true;
- pp = pp->Next;
- }
- while (pp != pp2);
- return false;
-}
-//------------------------------------------------------------------------------
-
bool Pt2IsBetweenPt1AndPt3(const IntPoint pt1,
const IntPoint pt2, const IntPoint pt3)
{
if ((pt1 == pt3) || (pt1 == pt2) || (pt3 == pt2))
return false;
- else if (pt1.X != pt3.X)
- return (pt2.X > pt1.X) == (pt2.X < pt3.X);
+ else if (pt1.x != pt3.x)
+ return (pt2.x > pt1.x) == (pt2.x < pt3.x);
else
- return (pt2.Y > pt1.Y) == (pt2.Y < pt3.Y);
-}
-//------------------------------------------------------------------------------
-
-OutPt* InsertPolyPtBetween(OutPt* p1, OutPt* p2, const IntPoint Pt)
-{
- if (p1 == p2) throw "JoinError";
- OutPt* result = new OutPt;
- result->Pt = Pt;
- if (p2 == p1->Next)
- {
- p1->Next = result;
- p2->Prev = result;
- result->Next = p2;
- result->Prev = p1;
- } else
- {
- p2->Next = result;
- p1->Prev = result;
- result->Next = p1;
- result->Prev = p2;
- }
- return result;
+ return (pt2.y > pt1.y) == (pt2.y < pt3.y);
}
//------------------------------------------------------------------------------
-bool HorzSegmentsOverlap(const IntPoint& pt1a, const IntPoint& pt1b,
- const IntPoint& pt2a, const IntPoint& pt2b)
+bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b)
{
- //precondition: both segments are horizontal
- if ((pt1a.X > pt2a.X) == (pt1a.X < pt2b.X)) return true;
- else if ((pt1b.X > pt2a.X) == (pt1b.X < pt2b.X)) return true;
- else if ((pt2a.X > pt1a.X) == (pt2a.X < pt1b.X)) return true;
- else if ((pt2b.X > pt1a.X) == (pt2b.X < pt1b.X)) return true;
- else if ((pt1a.X == pt2a.X) && (pt1b.X == pt2b.X)) return true;
- else if ((pt1a.X == pt2b.X) && (pt1b.X == pt2a.X)) return true;
- else return false;
+ if (seg1a > seg1b) std::swap(seg1a, seg1b);
+ if (seg2a > seg2b) std::swap(seg2a, seg2b);
+ return (seg1a < seg2b) && (seg2a < seg1b);
}
-
//------------------------------------------------------------------------------
// ClipperBase class methods ...
//------------------------------------------------------------------------------
ClipperBase::ClipperBase() //constructor
{
- m_MinimaList = 0;
- m_CurrentLM = 0;
+ m_CurrentLM = m_MinimaList.begin(); //begin() == end() here
m_UseFullRange = false;
}
//------------------------------------------------------------------------------
@@ -1083,10 +885,10 @@ void RangeTest(const IntPoint& Pt, bool& useFullRange)
{
if (useFullRange)
{
- if (Pt.X > hiRange || Pt.Y > hiRange || -Pt.X > hiRange || -Pt.Y > hiRange)
+ if (Pt.x > hiRange || Pt.y > hiRange || -Pt.x > hiRange || -Pt.y > hiRange)
throw "Coordinate outside allowed range";
}
- else if (Pt.X > loRange|| Pt.Y > loRange || -Pt.X > loRange || -Pt.Y > loRange)
+ else if (Pt.x > loRange|| Pt.y > loRange || -Pt.x > loRange || -Pt.y > loRange)
{
useFullRange = true;
RangeTest(Pt, useFullRange);
@@ -1094,6 +896,140 @@ void RangeTest(const IntPoint& Pt, bool& useFullRange)
}
//------------------------------------------------------------------------------
+TEdge* FindNextLocMin(TEdge* E)
+{
+ for (;;)
+ {
+ while (E->Bot != E->Prev->Bot || E->Curr == E->Top) E = E->Next;
+ if (!IsHorizontal(*E) && !IsHorizontal(*E->Prev)) break;
+ while (IsHorizontal(*E->Prev)) E = E->Prev;
+ TEdge* E2 = E;
+ while (IsHorizontal(*E)) E = E->Next;
+ if (E->Top.y == E->Prev->Bot.y) continue; //ie just an intermediate horz.
+ if (E2->Prev->Bot.x < E->Bot.x) E = E2;
+ break;
+ }
+ return E;
+}
+//------------------------------------------------------------------------------
+
+TEdge* ClipperBase::ProcessBound(TEdge* E, bool NextIsForward)
+{
+ TEdge *Result = E;
+ TEdge *Horz = 0;
+
+ if (E->OutIdx == Skip)
+ {
+ //if edges still remain in the current bound beyond the skip edge then
+ //create another LocMin and call ProcessBound once more
+ if (NextIsForward)
+ {
+ while (E->Top.y == E->Next->Bot.y) E = E->Next;
+ //don't include top horizontals when parsing a bound a second time,
+ //they will be contained in the opposite bound ...
+ while (E != Result && IsHorizontal(*E)) E = E->Prev;
+ }
+ else
+ {
+ while (E->Top.y == E->Prev->Bot.y) E = E->Prev;
+ while (E != Result && IsHorizontal(*E)) E = E->Next;
+ }
+
+ if (E == Result)
+ {
+ if (NextIsForward) Result = E->Next;
+ else Result = E->Prev;
+ }
+ else
+ {
+ //there are more edges in the bound beyond result starting with E
+ if (NextIsForward)
+ E = Result->Next;
+ else
+ E = Result->Prev;
+ MinimaList::value_type locMin;
+ locMin.y = E->Bot.y;
+ locMin.LeftBound = 0;
+ locMin.RightBound = E;
+ E->WindDelta = 0;
+ Result = ProcessBound(E, NextIsForward);
+ m_MinimaList.push_back(locMin);
+ }
+ return Result;
+ }
+
+ TEdge *EStart;
+
+ if (IsHorizontal(*E))
+ {
+ //We need to be careful with open paths because this may not be a
+ //true local minima (ie E may be following a skip edge).
+ //Also, consecutive horz. edges may start heading left before going right.
+ if (NextIsForward)
+ EStart = E->Prev;
+ else
+ EStart = E->Next;
+ if (IsHorizontal(*EStart)) //ie an adjoining horizontal skip edge
+ {
+ if (EStart->Bot.x != E->Bot.x && EStart->Top.x != E->Bot.x)
+ ReverseHorizontal(*E);
+ }
+ else if (EStart->Bot.x != E->Bot.x)
+ ReverseHorizontal(*E);
+ }
+
+ EStart = E;
+ if (NextIsForward)
+ {
+ while (Result->Top.y == Result->Next->Bot.y && Result->Next->OutIdx != Skip)
+ Result = Result->Next;
+ if (IsHorizontal(*Result) && Result->Next->OutIdx != Skip)
+ {
+ //nb: at the top of a bound, horizontals are added to the bound
+ //only when the preceding edge attaches to the horizontal's left vertex
+ //unless a Skip edge is encountered when that becomes the top divide
+ Horz = Result;
+ while (IsHorizontal(*Horz->Prev)) Horz = Horz->Prev;
+ if (Horz->Prev->Top.x > Result->Next->Top.x) Result = Horz->Prev;
+ }
+ while (E != Result)
+ {
+ E->NextInLML = E->Next;
+ if (IsHorizontal(*E) && E != EStart &&
+ E->Bot.x != E->Prev->Top.x) ReverseHorizontal(*E);
+ E = E->Next;
+ }
+ if (IsHorizontal(*E) && E != EStart && E->Bot.x != E->Prev->Top.x)
+ ReverseHorizontal(*E);
+ Result = Result->Next; //move to the edge just beyond current bound
+ } else
+ {
+ while (Result->Top.y == Result->Prev->Bot.y && Result->Prev->OutIdx != Skip)
+ Result = Result->Prev;
+ if (IsHorizontal(*Result) && Result->Prev->OutIdx != Skip)
+ {
+ Horz = Result;
+ while (IsHorizontal(*Horz->Next)) Horz = Horz->Next;
+ if (Horz->Next->Top.x == Result->Prev->Top.x ||
+ Horz->Next->Top.x > Result->Prev->Top.x) Result = Horz->Next;
+ }
+
+ while (E != Result)
+ {
+ E->NextInLML = E->Prev;
+ if (IsHorizontal(*E) && E != EStart && E->Bot.x != E->Next->Top.x)
+ ReverseHorizontal(*E);
+ E = E->Prev;
+ }
+ if (IsHorizontal(*E) && E != EStart && E->Bot.x != E->Next->Top.x)
+ ReverseHorizontal(*E);
+ Result = Result->Prev; //move to the edge just beyond current bound
+ }
+
+ return Result;
+}
+//------------------------------------------------------------------------------
+
bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed)
{
#ifdef use_lines
@@ -1105,15 +1041,15 @@ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed)
#endif
int highI = (int)pg.size() -1;
- bool ClosedOrSemiClosed = (highI > 0) && (Closed || (pg[0] == pg[highI]));
- while (highI > 0 && (pg[highI] == pg[0])) --highI;
+ if (Closed) while (highI > 0 && (pg[highI] == pg[0])) --highI;
while (highI > 0 && (pg[highI] == pg[highI -1])) --highI;
if ((Closed && highI < 2) || (!Closed && highI < 1)) return false;
//create a new edge array ...
TEdge *edges = new TEdge [highI +1];
- //1. Basic initialization of Edges ...
+ bool IsFlat = true;
+ //1. Basic (first) edge initialization ...
try
{
edges[1].Curr = pg[1];
@@ -1130,18 +1066,18 @@ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed)
catch(...)
{
delete [] edges;
- return false; //almost certainly a vertex has exceeded range
+ throw; //range test fails
}
-
TEdge *eStart = &edges[0];
- if (!ClosedOrSemiClosed) eStart->Prev->OutIdx = Skip;
- //2. Remove duplicate vertices, and collinear edges (when closed) ...
+ //2. Remove duplicate vertices, and (when closed) collinear edges ...
TEdge *E = eStart, *eLoopStop = eStart;
for (;;)
{
- if ((E->Curr == E->Next->Curr))
+ //nb: allows matching start and end points when not Closed ...
+ if (E->Curr == E->Next->Curr && (Closed || E->Next != eStart))
{
+ if (E == E->Next) break;
if (E == eStart) eStart = E->Next;
E = RemoveEdge(E);
eLoopStop = E;
@@ -1149,27 +1085,23 @@ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed)
}
if (E->Prev == E->Next)
break; //only two vertices
- else if ((ClosedOrSemiClosed ||
- (E->Prev->OutIdx != Skip && E->OutIdx != Skip &&
- E->Next->OutIdx != Skip)) &&
- SlopesEqual(E->Prev->Curr, E->Curr, E->Next->Curr, m_UseFullRange))
+ else if (Closed &&
+ SlopesEqual(E->Prev->Curr, E->Curr, E->Next->Curr, m_UseFullRange) &&
+ (!m_PreserveCollinear ||
+ !Pt2IsBetweenPt1AndPt3(E->Prev->Curr, E->Curr, E->Next->Curr)))
{
- //All collinear edges are allowed for open paths but in closed paths
- //inner vertices of adjacent collinear edges are removed. However if the
- //PreserveCollinear property has been enabled, only overlapping collinear
- //edges (ie spikes) are removed from closed paths.
- if (Closed && (!m_PreserveCollinear ||
- !Pt2IsBetweenPt1AndPt3(E->Prev->Curr, E->Curr, E->Next->Curr)))
- {
- if (E == eStart) eStart = E->Next;
- E = RemoveEdge(E);
- E = E->Prev;
- eLoopStop = E;
- continue;
- }
+ //Collinear edges are allowed for open paths but in closed paths
+ //the default is to merge adjacent collinear edges into a single edge.
+ //However, if the PreserveCollinear property is enabled, only overlapping
+ //collinear edges (ie spikes) will be removed from closed paths.
+ if (E == eStart) eStart = E->Next;
+ E = RemoveEdge(E);
+ E = E->Prev;
+ eLoopStop = E;
+ continue;
}
E = E->Next;
- if (E == eLoopStop) break;
+ if ((E == eLoopStop) || (!Closed && E->Next == eStart)) break;
}
if ((!Closed && (E == E->Next)) || (Closed && (E->Prev == E->Next)))
@@ -1177,285 +1109,116 @@ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed)
delete [] edges;
return false;
}
- m_edges.push_back(edges);
if (!Closed)
+ {
m_HasOpenPaths = true;
+ eStart->Prev->OutIdx = Skip;
+ }
- //3. Do final Init and also find the 'highest' Edge. (nb: since I'm much
- //more familiar with positive downwards Y axes, 'highest' here will be
- //the Edge with the *smallest* Top.Y.)
- TEdge *eHighest = eStart;
+ //3. Do second stage of edge initialization ...
E = eStart;
do
{
InitEdge2(*E, PolyTyp);
- if (E->Top.Y < eHighest->Top.Y) eHighest = E;
E = E->Next;
+ if (IsFlat && E->Curr.y != eStart->Curr.y) IsFlat = false;
}
while (E != eStart);
- //4. build the local minima list ...
- if (AllHorizontal(E))
- {
- if (ClosedOrSemiClosed)
- E->Prev->OutIdx = Skip;
- AscendToMax(E, false, false);
- return true;
- }
+ //4. Finally, add edge bounds to LocalMinima list ...
- //if eHighest is also the Skip then it's a natural break, otherwise
- //make sure eHighest is positioned so we're either at a top horizontal or
- //just starting to head down one edge of the polygon
- E = eStart->Prev; //EStart.Prev == Skip edge
- if (E->Prev == E->Next)
- eHighest = E->Next;
- else if (!ClosedOrSemiClosed && E->Top.Y == eHighest->Top.Y)
- {
- if ((IsHorizontal(*E) || IsHorizontal(*E->Next)) &&
- E->Next->Bot.Y == eHighest->Top.Y)
- eHighest = E->Next;
- else if (SharedVertWithPrevAtTop(E)) eHighest = E;
- else if (E->Top == E->Prev->Top) eHighest = E->Prev;
- else eHighest = E->Next;
- } else
+ //Totally flat paths must be handled differently when adding them
+ //to LocalMinima list to avoid endless loops etc ...
+ if (IsFlat)
{
- E = eHighest;
- while (IsHorizontal(*eHighest) ||
- (eHighest->Top == eHighest->Next->Top) ||
- (eHighest->Top == eHighest->Next->Bot)) //next is high horizontal
+ if (Closed)
{
- eHighest = eHighest->Next;
- if (eHighest == E)
- {
- while (IsHorizontal(*eHighest) || !SharedVertWithPrevAtTop(eHighest))
- eHighest = eHighest->Next;
- break; //avoids potential endless loop
- }
+ delete [] edges;
+ return false;
+ }
+ E->Prev->OutIdx = Skip;
+ MinimaList::value_type locMin;
+ locMin.y = E->Bot.y;
+ locMin.LeftBound = 0;
+ locMin.RightBound = E;
+ locMin.RightBound->Side = esRight;
+ locMin.RightBound->WindDelta = 0;
+ for (;;)
+ {
+ if (E->Bot.x != E->Prev->Top.x) ReverseHorizontal(*E);
+ if (E->Next->OutIdx == Skip) break;
+ E->NextInLML = E->Next;
+ E = E->Next;
}
+ m_MinimaList.push_back(locMin);
+ m_edges.push_back(edges);
+ return true;
}
- E = eHighest;
- do
- E = AddBoundsToLML(E, Closed);
- while (E != eHighest);
- return true;
-}
-//------------------------------------------------------------------------------
-
-bool ClipperBase::AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed)
-{
- bool result = false;
- for (Paths::size_type i = 0; i < ppg.size(); ++i)
- if (AddPath(ppg[i], PolyTyp, Closed)) result = true;
- return result;
-}
-//------------------------------------------------------------------------------
-
-void ClipperBase::InsertLocalMinima(LocalMinima *newLm)
-{
- if( ! m_MinimaList )
- {
- m_MinimaList = newLm;
- }
- else if( newLm->Y >= m_MinimaList->Y )
- {
- newLm->Next = m_MinimaList;
- m_MinimaList = newLm;
- } else
- {
- LocalMinima* tmpLm = m_MinimaList;
- while( tmpLm->Next && ( newLm->Y < tmpLm->Next->Y ) )
- tmpLm = tmpLm->Next;
- newLm->Next = tmpLm->Next;
- tmpLm->Next = newLm;
- }
-}
-//------------------------------------------------------------------------------
-
-void ClipperBase::DoMinimaLML(TEdge* E1, TEdge* E2, bool IsClosed)
-{
- if (!E1)
- {
- if (!E2) return;
- LocalMinima* NewLm = new LocalMinima;
- NewLm->Next = 0;
- NewLm->Y = E2->Bot.Y;
- NewLm->LeftBound = 0;
- E2->WindDelta = 0;
- NewLm->RightBound = E2;
- InsertLocalMinima(NewLm);
- } else
- {
- //E and E.Prev are now at a local minima ...
- LocalMinima* NewLm = new LocalMinima;
- NewLm->Y = E1->Bot.Y;
- NewLm->Next = 0;
- if (IsHorizontal(*E2)) //Horz. edges never start a Left bound
- {
- if (E2->Bot.X != E1->Bot.X) ReverseHorizontal(*E2);
- NewLm->LeftBound = E1;
- NewLm->RightBound = E2;
- } else if (E2->Dx < E1->Dx)
- {
- NewLm->LeftBound = E1;
- NewLm->RightBound = E2;
- } else
- {
- NewLm->LeftBound = E2;
- NewLm->RightBound = E1;
- }
- NewLm->LeftBound->Side = esLeft;
- NewLm->RightBound->Side = esRight;
- //set the winding state of the first edge in each bound
- //(it'll be copied to subsequent edges in the bound) ...
- if (!IsClosed) NewLm->LeftBound->WindDelta = 0;
- else if (NewLm->LeftBound->Next == NewLm->RightBound) NewLm->LeftBound->WindDelta = -1;
- else NewLm->LeftBound->WindDelta = 1;
- NewLm->RightBound->WindDelta = -NewLm->LeftBound->WindDelta;
- InsertLocalMinima(NewLm);
- }
-}
-//----------------------------------------------------------------------
-TEdge* ClipperBase::DescendToMin(TEdge *&E)
-{
- //PRECONDITION: STARTING EDGE IS A VALID DESCENDING EDGE.
- //Starting at the top of one bound we progress to the bottom where there's
- //A local minima. We go to the top of the Next bound. These two bounds
- //form the left and right (or right and left) bounds of the local minima.
- TEdge* EHorz;
- E->NextInLML = 0;
- if (IsHorizontal(*E))
- {
- EHorz = E;
- while (IsHorizontal(*EHorz->Next)) EHorz = EHorz->Next;
- if (EHorz->Bot != EHorz->Next->Top)
- ReverseHorizontal(*E);
- }
- for (;;)
- {
- E = E->Next;
- if (E->OutIdx == Skip) break;
- else if (IsHorizontal(*E))
- {
- //nb: proceed through horizontals when approaching from their right,
- // but break on horizontal minima if approaching from their left.
- // This ensures 'local minima' are always on the left of horizontals.
-
- //look ahead is required in case of multiple consec. horizontals
- EHorz = GetLastHorz(E);
- if(EHorz == E->Prev || //horizontal line
- (EHorz->Next->Top.Y < E->Top.Y && //bottom horizontal
- EHorz->Next->Bot.X > E->Prev->Bot.X)) //approaching from the left
- break;
- if (E->Top.X != E->Prev->Bot.X) ReverseHorizontal(*E);
- if (EHorz->OutIdx == Skip) EHorz = EHorz->Prev;
- while (E != EHorz)
- {
- E->NextInLML = E->Prev;
- E = E->Next;
- if (E->Top.X != E->Prev->Bot.X) ReverseHorizontal(*E);
- }
- }
- else if (E->Bot.Y == E->Prev->Bot.Y) break;
- E->NextInLML = E->Prev;
- }
- return E->Prev;
-}
-//----------------------------------------------------------------------
+ m_edges.push_back(edges);
+ bool leftBoundIsForward;
+ TEdge* EMin = 0;
-void ClipperBase::AscendToMax(TEdge *&E, bool Appending, bool IsClosed)
-{
- if (E->OutIdx == Skip)
- {
- E = E->Next;
- if (!MoreAbove(E->Prev)) return;
- }
+ //workaround to avoid an endless loop in the while loop below when
+ //open paths have matching start and end points ...
+ if (E->Prev->Bot == E->Prev->Top) E = E->Next;
- if (IsHorizontal(*E) && Appending && (E->Bot != E->Prev->Bot))
- ReverseHorizontal(*E);
- //now process the ascending bound ....
- TEdge *EStart = E;
for (;;)
{
- if (E->Next->OutIdx == Skip ||
- ((E->Next->Top.Y == E->Top.Y) && !IsHorizontal(*E->Next))) break;
- E->NextInLML = E->Next;
- E = E->Next;
- if (IsHorizontal(*E) && (E->Bot.X != E->Prev->Top.X))
- ReverseHorizontal(*E);
- }
-
- if (!Appending)
- {
- if (EStart->OutIdx == Skip) EStart = EStart->Next;
- if (EStart != E->Next)
- DoMinimaLML(0, EStart, IsClosed);
- }
- E = E->Next;
-}
-//----------------------------------------------------------------------
-
-TEdge* ClipperBase::AddBoundsToLML(TEdge* E, bool IsClosed)
-{
- //Starting at the top of one bound we progress to the bottom where there's
- //A local minima. We then go to the top of the Next bound. These two bounds
- //form the left and right (or right and left) bounds of the local minima.
+ E = FindNextLocMin(E);
+ if (E == EMin) break;
+ else if (!EMin) EMin = E;
- TEdge* B;
- bool AppendMaxima;
- //do minima ...
- if (E->OutIdx == Skip)
- {
- if (MoreBelow(E))
+ //E and E.Prev now share a local minima (left aligned if horizontal).
+ //Compare their slopes to find which starts which bound ...
+ MinimaList::value_type locMin;
+ locMin.y = E->Bot.y;
+ if (E->Dx < E->Prev->Dx)
{
- E = E->Next;
- B = DescendToMin(E);
+ locMin.LeftBound = E->Prev;
+ locMin.RightBound = E;
+ leftBoundIsForward = false; //Q.nextInLML = Q.prev
} else
- B = 0;
- } else
- B = DescendToMin(E);
-
- if (E->OutIdx == Skip) //nb: may be BEFORE, AT or just THRU LM
- {
- //do minima before Skip...
- DoMinimaLML(0, B, IsClosed); //store what we've got so far (if anything)
- AppendMaxima = false;
- //finish off any minima ...
- if ((E->Bot != E->Prev->Bot) && MoreBelow(E))
{
- E = E->Next;
- B = DescendToMin(E);
- DoMinimaLML(B, E, IsClosed);
- AppendMaxima = true;
+ locMin.LeftBound = E;
+ locMin.RightBound = E->Prev;
+ leftBoundIsForward = true; //Q.nextInLML = Q.next
}
- else if (JustBeforeLocMin(E))
- E = E->Next;
- } else
- {
- DoMinimaLML(B, E, IsClosed);
- AppendMaxima = true;
+ locMin.LeftBound->Side = esLeft;
+ locMin.RightBound->Side = esRight;
+
+ if (!Closed) locMin.LeftBound->WindDelta = 0;
+ else if (locMin.LeftBound->Next == locMin.RightBound)
+ locMin.LeftBound->WindDelta = -1;
+ else locMin.LeftBound->WindDelta = 1;
+ locMin.RightBound->WindDelta = -locMin.LeftBound->WindDelta;
+
+ E = ProcessBound(locMin.LeftBound, leftBoundIsForward);
+ if (E->OutIdx == Skip) E = ProcessBound(E, leftBoundIsForward);
+
+ TEdge* E2 = ProcessBound(locMin.RightBound, !leftBoundIsForward);
+ if (E2->OutIdx == Skip) E2 = ProcessBound(E2, !leftBoundIsForward);
+
+ if (locMin.LeftBound->OutIdx == Skip)
+ locMin.LeftBound = 0;
+ else if (locMin.RightBound->OutIdx == Skip)
+ locMin.RightBound = 0;
+ m_MinimaList.push_back(locMin);
+ if (!leftBoundIsForward) E = E2;
}
+ return true;
+}
+//------------------------------------------------------------------------------
- //now do maxima ...
- AscendToMax(E, AppendMaxima, IsClosed);
-
- if (E->OutIdx == Skip && (E->Top != E->Prev->Top))
- {
- //may be BEFORE, AT or just AFTER maxima
- //finish off any maxima ...
- if (MoreAbove(E))
- {
- E = E->Next;
- AscendToMax(E, false, IsClosed);
- }
- else if ((E->Top == E->Next->Top) ||
- (IsHorizontal(*E->Next) && (E->Top == E->Next->Bot)))
- E = E->Next; //ie just before Maxima
- }
- return E;
+bool ClipperBase::AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed)
+{
+ bool result = false;
+ for (Paths::size_type i = 0; i < ppg.size(); ++i)
+ if (AddPath(ppg[i], PolyTyp, Closed)) result = true;
+ return result;
}
-//----------------------------------------------------------------------
+//------------------------------------------------------------------------------
void ClipperBase::Clear()
{
@@ -1475,87 +1238,80 @@ void ClipperBase::Clear()
void ClipperBase::Reset()
{
- m_CurrentLM = m_MinimaList;
- if( !m_CurrentLM ) return; //ie nothing to process
+ m_CurrentLM = m_MinimaList.begin();
+ if (m_CurrentLM == m_MinimaList.end()) return; //ie nothing to process
+ std::sort(m_MinimaList.begin(), m_MinimaList.end(), LocMinSorter());
//reset all edges ...
- LocalMinima* lm = m_MinimaList;
- while( lm )
+ for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm)
{
TEdge* e = lm->LeftBound;
if (e)
{
e->Curr = e->Bot;
e->Side = esLeft;
- if (e->OutIdx != Skip)
- e->OutIdx = Unassigned;
+ e->OutIdx = Unassigned;
}
+
e = lm->RightBound;
- e->Curr = e->Bot;
- e->Side = esRight;
- if (e->OutIdx != Skip)
+ if (e)
+ {
+ e->Curr = e->Bot;
+ e->Side = esRight;
e->OutIdx = Unassigned;
-
- lm = lm->Next;
+ }
}
}
//------------------------------------------------------------------------------
void ClipperBase::DisposeLocalMinimaList()
{
- while( m_MinimaList )
- {
- LocalMinima* tmpLm = m_MinimaList->Next;
- delete m_MinimaList;
- m_MinimaList = tmpLm;
- }
- m_CurrentLM = 0;
+ m_MinimaList.clear();
+ m_CurrentLM = m_MinimaList.begin();
}
//------------------------------------------------------------------------------
void ClipperBase::PopLocalMinima()
{
- if( ! m_CurrentLM ) return;
- m_CurrentLM = m_CurrentLM->Next;
+ if (m_CurrentLM == m_MinimaList.end()) return;
+ ++m_CurrentLM;
}
//------------------------------------------------------------------------------
IntRect ClipperBase::GetBounds()
{
IntRect result;
- LocalMinima* lm = m_MinimaList;
- if (!lm)
+ MinimaList::iterator lm = m_MinimaList.begin();
+ if (lm == m_MinimaList.end())
{
result.left = result.top = result.right = result.bottom = 0;
return result;
}
- result.left = lm->LeftBound->Bot.X;
- result.top = lm->LeftBound->Bot.Y;
- result.right = lm->LeftBound->Bot.X;
- result.bottom = lm->LeftBound->Bot.Y;
- while (lm)
- {
- if (lm->LeftBound->Bot.Y > result.bottom)
- result.bottom = lm->LeftBound->Bot.Y;
+ result.left = lm->LeftBound->Bot.x;
+ result.top = lm->LeftBound->Bot.y;
+ result.right = lm->LeftBound->Bot.x;
+ result.bottom = lm->LeftBound->Bot.y;
+ while (lm != m_MinimaList.end())
+ {
+ result.bottom = std::max(result.bottom, lm->LeftBound->Bot.y);
TEdge* e = lm->LeftBound;
for (;;) {
TEdge* bottomE = e;
while (e->NextInLML)
{
- if (e->Bot.X < result.left) result.left = e->Bot.X;
- if (e->Bot.X > result.right) result.right = e->Bot.X;
+ if (e->Bot.x < result.left) result.left = e->Bot.x;
+ if (e->Bot.x > result.right) result.right = e->Bot.x;
e = e->NextInLML;
}
- if (e->Bot.X < result.left) result.left = e->Bot.X;
- if (e->Bot.X > result.right) result.right = e->Bot.X;
- if (e->Top.X < result.left) result.left = e->Top.X;
- if (e->Top.X > result.right) result.right = e->Top.X;
- if (e->Top.Y < result.top) result.top = e->Top.Y;
-
+ result.left = std::min(result.left, e->Bot.x);
+ result.right = std::max(result.right, e->Bot.x);
+ result.left = std::min(result.left, e->Top.x);
+ result.right = std::max(result.right, e->Top.x);
+ result.top = std::min(result.top, e->Top.y);
if (bottomE == lm->LeftBound) e = lm->RightBound;
else break;
}
- lm = lm->Next;
+ ++lm;
}
return result;
}
@@ -1568,7 +1324,6 @@ Clipper::Clipper(int initOptions) : ClipperBase() //constructor
{
m_ActiveEdges = 0;
m_SortedEdges = 0;
- m_IntersectNodes = 0;
m_ExecuteLocked = false;
m_UseFullRange = false;
m_ReverseOutput = ((initOptions & ioReverseSolution) != 0);
@@ -1584,39 +1339,38 @@ Clipper::Clipper(int initOptions) : ClipperBase() //constructor
Clipper::~Clipper() //destructor
{
Clear();
- m_Scanbeam.clear();
}
//------------------------------------------------------------------------------
#ifdef use_xyz
-void Clipper::ZFillFunction(TZFillCallback zFillFunc)
+void Clipper::ZFillFunction(ZFillCallback zFillFunc)
{
m_ZFill = zFillFunc;
}
//------------------------------------------------------------------------------
#endif
-void Clipper::Clear()
-{
- if (m_edges.empty()) return; //avoids problems with ClipperBase destructor
- DisposeAllOutRecs();
- ClipperBase::Clear();
-}
-//------------------------------------------------------------------------------
-
void Clipper::Reset()
{
ClipperBase::Reset();
- m_Scanbeam.clear();
+ m_Scanbeam = ScanbeamList();
+ m_Maxima = MaximaList();
m_ActiveEdges = 0;
m_SortedEdges = 0;
- DisposeAllOutRecs();
- LocalMinima* lm = m_MinimaList;
- while (lm)
- {
- InsertScanbeam(lm->Y);
- lm = lm->Next;
- }
+ for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm)
+ InsertScanbeam(lm->y);
+}
+//------------------------------------------------------------------------------
+
+bool Clipper::Execute(ClipType clipType, Paths &solution, PolyFillType fillType)
+{
+ return Execute(clipType, solution, fillType, fillType);
+}
+//------------------------------------------------------------------------------
+
+bool Clipper::Execute(ClipType clipType, PolyTree &polytree, PolyFillType fillType)
+{
+ return Execute(clipType, polytree, fillType, fillType);
}
//------------------------------------------------------------------------------
@@ -1625,7 +1379,7 @@ bool Clipper::Execute(ClipType clipType, Paths &solution,
{
if( m_ExecuteLocked ) return false;
if (m_HasOpenPaths)
- throw clipperException("Error: PolyTree struct is need for open path clipping.");
+ throw clipperException("Error: PolyTree struct is needed for open path clipping.");
m_ExecuteLocked = true;
solution.resize(0);
m_SubjFillType = subjFillType;
@@ -1634,6 +1388,7 @@ bool Clipper::Execute(ClipType clipType, Paths &solution,
m_UsingPolyTree = false;
bool succeeded = ExecuteInternal();
if (succeeded) BuildResult(solution);
+ DisposeAllOutRecs();
m_ExecuteLocked = false;
return succeeded;
}
@@ -1650,6 +1405,7 @@ bool Clipper::Execute(ClipType clipType, PolyTree& polytree,
m_UsingPolyTree = true;
bool succeeded = ExecuteInternal();
if (succeeded) BuildResult2(polytree);
+ DisposeAllOutRecs();
m_ExecuteLocked = false;
return succeeded;
}
@@ -1675,19 +1431,19 @@ bool Clipper::ExecuteInternal()
bool succeeded = true;
try {
Reset();
- if (!m_CurrentLM) return false;
+ if (m_CurrentLM == m_MinimaList.end()) return true;
cInt botY = PopScanbeam();
do {
InsertLocalMinimaIntoAEL(botY);
- ClearGhostJoins();
- ProcessHorizontals(false);
- if (m_Scanbeam.empty()) break;
+ ProcessHorizontals();
+ ClearGhostJoins();
+ if (m_Scanbeam.empty()) break;
cInt topY = PopScanbeam();
- succeeded = ProcessIntersections(botY, topY);
+ succeeded = ProcessIntersections(topY);
if (!succeeded) break;
ProcessEdgesAtTopOfScanbeam(topY);
botY = topY;
- } while (!m_Scanbeam.empty() || m_CurrentLM);
+ } while (!m_Scanbeam.empty() || m_CurrentLM != m_MinimaList.end());
}
catch(...)
{
@@ -1711,7 +1467,10 @@ bool Clipper::ExecuteInternal()
for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
{
OutRec *outRec = m_PolyOuts[i];
- if (outRec->Pts && !outRec->IsOpen)
+ if (!outRec->Pts) continue;
+ if (outRec->IsOpen)
+ FixupOutPolyline(*outRec);
+ else
FixupOutPolygon(*outRec);
}
@@ -1726,15 +1485,16 @@ bool Clipper::ExecuteInternal()
void Clipper::InsertScanbeam(const cInt Y)
{
- m_Scanbeam.insert(Y);
+ m_Scanbeam.push(Y);
}
//------------------------------------------------------------------------------
cInt Clipper::PopScanbeam()
{
- cInt Y = *m_Scanbeam.begin();
- m_Scanbeam.erase(m_Scanbeam.begin());
- return Y;
+ const cInt Y = m_Scanbeam.top();
+ m_Scanbeam.pop();
+ while (!m_Scanbeam.empty() && Y == m_Scanbeam.top()) { m_Scanbeam.pop(); } // Pop duplicates.
+ return Y;
}
//------------------------------------------------------------------------------
@@ -1994,7 +1754,7 @@ OutPt* Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt)
}
if (prevE && prevE->OutIdx >= 0 &&
- (TopX(*prevE, Pt.Y) == TopX(*e, Pt.Y)) &&
+ (TopX(*prevE, Pt.y) == TopX(*e, Pt.y)) &&
SlopesEqual(*e, *prevE, m_UseFullRange) &&
(e->WindDelta != 0) && (prevE->WindDelta != 0))
{
@@ -2008,6 +1768,7 @@ OutPt* Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt)
void Clipper::AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt)
{
AddOutPt( e1, Pt );
+ if (e2->WindDelta == 0) AddOutPt(e2, Pt);
if( e1->OutIdx == e2->OutIdx )
{
e1->OutIdx = Unassigned;
@@ -2091,7 +1852,7 @@ void Clipper::AddGhostJoin(OutPt *op, const IntPoint OffPt)
void Clipper::InsertLocalMinimaIntoAEL(const cInt botY)
{
- while( m_CurrentLM && ( m_CurrentLM->Y == botY ) )
+ while (m_CurrentLM != m_MinimaList.end() && (m_CurrentLM->y == botY))
{
TEdge* lb = m_CurrentLM->LeftBound;
TEdge* rb = m_CurrentLM->RightBound;
@@ -2105,6 +1866,14 @@ void Clipper::InsertLocalMinimaIntoAEL(const cInt botY)
if (IsContributing(*rb))
Op1 = AddOutPt(rb, rb->Bot);
}
+ else if (!rb)
+ {
+ InsertEdgeIntoAEL(lb, 0);
+ SetWindingCount(*lb);
+ if (IsContributing(*lb))
+ Op1 = AddOutPt(lb, lb->Bot);
+ InsertScanbeam(lb->Top.y);
+ }
else
{
InsertEdgeIntoAEL(lb, 0);
@@ -2114,15 +1883,16 @@ void Clipper::InsertLocalMinimaIntoAEL(const cInt botY)
rb->WindCnt2 = lb->WindCnt2;
if (IsContributing(*lb))
Op1 = AddLocalMinPoly(lb, rb, lb->Bot);
- InsertScanbeam(lb->Top.Y);
+ InsertScanbeam(lb->Top.y);
}
- if(IsHorizontal(*rb))
- AddEdgeToSEL(rb);
- else
- InsertScanbeam( rb->Top.Y );
+ if (rb)
+ {
+ if(IsHorizontal(*rb)) AddEdgeToSEL(rb);
+ else InsertScanbeam( rb->Top.y );
+ }
- if (!lb) continue;
+ if (!lb || !rb) continue;
//if any output polygons share an edge, they'll need joining later ...
if (Op1 && IsHorizontal(*rb) &&
@@ -2133,13 +1903,13 @@ void Clipper::InsertLocalMinimaIntoAEL(const cInt botY)
Join* jr = m_GhostJoins[i];
//if the horizontal Rb and a 'ghost' horizontal overlap, then convert
//the 'ghost' join to a real join ready for later ...
- if (HorzSegmentsOverlap(jr->OutPt1->Pt, jr->OffPt, rb->Bot, rb->Top))
+ if (HorzSegmentsOverlap(jr->OutPt1->Pt.x, jr->OffPt.x, rb->Bot.x, rb->Top.x))
AddJoin(jr->OutPt1, Op1, jr->OffPt);
}
}
if (lb->OutIdx >= 0 && lb->PrevInAEL &&
- lb->PrevInAEL->Curr.X == lb->Bot.X &&
+ lb->PrevInAEL->Curr.x == lb->Bot.x &&
lb->PrevInAEL->OutIdx >= 0 &&
SlopesEqual(*lb->PrevInAEL, *lb, m_UseFullRange) &&
(lb->WindDelta != 0) && (lb->PrevInAEL->WindDelta != 0))
@@ -2203,45 +1973,34 @@ void Clipper::DeleteFromSEL(TEdge *e)
//------------------------------------------------------------------------------
#ifdef use_xyz
-
-void Clipper::SetZ(IntPoint& pt, TEdge& e)
+void Clipper::SetZ(IntPoint& pt, TEdge& e1, TEdge& e2)
{
- pt.Z = 0;
- if (m_ZFill)
- {
- //put the 'preferred' point as first parameter ...
- if (e.OutIdx < 0)
- (*m_ZFill)(e.Bot, e.Top, pt); //outside a path so presume entering
- else
- (*m_ZFill)(e.Top, e.Bot, pt); //inside a path so presume exiting
- }
+ if (pt.Z != 0 || !m_ZFill) return;
+ else if (pt == e1.Bot) pt.Z = e1.Bot.Z;
+ else if (pt == e1.Top) pt.Z = e1.Top.Z;
+ else if (pt == e2.Bot) pt.Z = e2.Bot.Z;
+ else if (pt == e2.Top) pt.Z = e2.Top.Z;
+ else (*m_ZFill)(e1.Bot, e1.Top, e2.Bot, e2.Top, pt);
}
//------------------------------------------------------------------------------
#endif
-void Clipper::IntersectEdges(TEdge *e1, TEdge *e2,
- const IntPoint &Pt, bool protect)
+void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &Pt)
{
- //e1 will be to the Left of e2 BELOW the intersection. Therefore e1 is before
- //e2 in AEL except when e1 is being inserted at the intersection point ...
- bool e1stops = !protect && !e1->NextInLML &&
- e1->Top.X == Pt.X && e1->Top.Y == Pt.Y;
- bool e2stops = !protect && !e2->NextInLML &&
- e2->Top.X == Pt.X && e2->Top.Y == Pt.Y;
bool e1Contributing = ( e1->OutIdx >= 0 );
bool e2Contributing = ( e2->OutIdx >= 0 );
+#ifdef use_xyz
+ SetZ(Pt, *e1, *e2);
+#endif
+
#ifdef use_lines
//if either edge is on an OPEN path ...
if (e1->WindDelta == 0 || e2->WindDelta == 0)
{
//ignore subject-subject open path intersections UNLESS they
//are both open paths, AND they are both 'contributing maximas' ...
- if (e1->WindDelta == 0 && e2->WindDelta == 0)
- {
- if ((e1stops || e2stops) && e1Contributing && e2Contributing)
- AddLocalMaxPoly(e1, e2, Pt);
- }
+ if (e1->WindDelta == 0 && e2->WindDelta == 0) return;
//if intersecting a subj line with a subj poly ...
else if (e1->PolyTyp == e2->PolyTyp &&
@@ -2267,26 +2026,19 @@ void Clipper::IntersectEdges(TEdge *e1, TEdge *e2,
else if (e1->PolyTyp != e2->PolyTyp)
{
//toggle subj open path OutIdx on/off when Abs(clip.WndCnt) == 1 ...
- if ((e1->WindDelta == 0) && std::abs(e2->WindCnt) == 1 &&
+ if ((e1->WindDelta == 0) && abs(e2->WindCnt) == 1 &&
(m_ClipType != ctUnion || e2->WindCnt2 == 0))
{
AddOutPt(e1, Pt);
if (e1Contributing) e1->OutIdx = Unassigned;
}
- else if ((e2->WindDelta == 0) && (std::abs(e1->WindCnt) == 1) &&
+ else if ((e2->WindDelta == 0) && (abs(e1->WindCnt) == 1) &&
(m_ClipType != ctUnion || e1->WindCnt2 == 0))
{
AddOutPt(e2, Pt);
if (e2Contributing) e2->OutIdx = Unassigned;
}
}
-
- if (e1stops)
- if (e1->OutIdx < 0) DeleteFromAEL(e1);
- else throw clipperException("Error intersecting polylines");
- if (e2stops)
- if (e2->OutIdx < 0) DeleteFromAEL(e2);
- else throw clipperException("Error intersecting polylines");
return;
}
#endif
@@ -2351,10 +2103,11 @@ void Clipper::IntersectEdges(TEdge *e1, TEdge *e2,
if ( e1Contributing && e2Contributing )
{
- if ( e1stops || e2stops ||
- (e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) ||
+ if ((e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) ||
(e1->PolyTyp != e2->PolyTyp && m_ClipType != ctXor) )
- AddLocalMaxPoly(e1, e2, Pt);
+ {
+ AddLocalMaxPoly(e1, e2, Pt);
+ }
else
{
AddOutPt(e1, Pt);
@@ -2381,8 +2134,7 @@ void Clipper::IntersectEdges(TEdge *e1, TEdge *e2,
SwapPolyIndexes(*e1, *e2);
}
}
- else if ( (e1Wc == 0 || e1Wc == 1) &&
- (e2Wc == 0 || e2Wc == 1) && !e1stops && !e2stops )
+ else if ( (e1Wc == 0 || e1Wc == 1) && (e2Wc == 0 || e2Wc == 1))
{
//neither edge is currently contributing ...
@@ -2401,7 +2153,9 @@ void Clipper::IntersectEdges(TEdge *e1, TEdge *e2,
}
if (e1->PolyTyp != e2->PolyTyp)
- AddLocalMinPoly(e1, e2, Pt);
+ {
+ AddLocalMinPoly(e1, e2, Pt);
+ }
else if (e1Wc == 1 && e2Wc == 1)
switch( m_ClipType ) {
case ctIntersection:
@@ -2423,17 +2177,6 @@ void Clipper::IntersectEdges(TEdge *e1, TEdge *e2,
else
SwapSides( *e1, *e2 );
}
-
- if( (e1stops != e2stops) &&
- ( (e1stops && (e1->OutIdx >= 0)) || (e2stops && (e2->OutIdx >= 0)) ) )
- {
- SwapSides( *e1, *e2 );
- SwapPolyIndexes( *e1, *e2 );
- }
-
- //finally, delete any non-contributing maxima edges ...
- if( e1stops ) DeleteFromAEL( e1 );
- if( e2stops ) DeleteFromAEL( e2 );
}
//------------------------------------------------------------------------------
@@ -2464,10 +2207,10 @@ OutRec* GetLowermostRec(OutRec *outRec1, OutRec *outRec2)
outRec2->BottomPt = GetBottomPt(outRec2->Pts);
OutPt *OutPt1 = outRec1->BottomPt;
OutPt *OutPt2 = outRec2->BottomPt;
- if (OutPt1->Pt.Y > OutPt2->Pt.Y) return outRec1;
- else if (OutPt1->Pt.Y < OutPt2->Pt.Y) return outRec2;
- else if (OutPt1->Pt.X < OutPt2->Pt.X) return outRec1;
- else if (OutPt1->Pt.X > OutPt2->Pt.X) return outRec2;
+ if (OutPt1->Pt.y > OutPt2->Pt.y) return outRec1;
+ else if (OutPt1->Pt.y < OutPt2->Pt.y) return outRec2;
+ else if (OutPt1->Pt.x < OutPt2->Pt.x) return outRec1;
+ else if (OutPt1->Pt.x > OutPt2->Pt.x) return outRec2;
else if (OutPt1->Next == OutPt1) return outRec2;
else if (OutPt2->Next == OutPt2) return outRec1;
else if (FirstIsBottomPt(OutPt1, OutPt2)) return outRec1;
@@ -2611,7 +2354,6 @@ OutRec* Clipper::CreateOutRec()
OutPt* Clipper::AddOutPt(TEdge *e, const IntPoint &pt)
{
- bool ToFront = (e->Side == esLeft);
if( e->OutIdx < 0 )
{
OutRec *outRec = CreateOutRec();
@@ -2624,12 +2366,7 @@ OutPt* Clipper::AddOutPt(TEdge *e, const IntPoint &pt)
newOp->Prev = newOp;
if (!outRec->IsOpen)
SetHoleState(e, outRec);
-#ifdef use_xyz
- if (pt == e->Bot) newOp->Pt = e->Bot;
- else if (pt == e->Top) newOp->Pt = e->Top;
- else SetZ(newOp->Pt, *e);
-#endif
- e->OutIdx = outRec->Idx; //nb: do this after SetZ !
+ e->OutIdx = outRec->Idx;
return newOp;
} else
{
@@ -2637,7 +2374,8 @@ OutPt* Clipper::AddOutPt(TEdge *e, const IntPoint &pt)
//OutRec.Pts is the 'Left-most' point & OutRec.Pts.Prev is the 'Right-most'
OutPt* op = outRec->Pts;
- if (ToFront && (pt == op->Pt)) return op;
+ bool ToFront = (e->Side == esLeft);
+ if (ToFront && (pt == op->Pt)) return op;
else if (!ToFront && (pt == op->Prev->Pt)) return op->Prev;
OutPt* newOp = new OutPt;
@@ -2648,23 +2386,28 @@ OutPt* Clipper::AddOutPt(TEdge *e, const IntPoint &pt)
newOp->Prev->Next = newOp;
op->Prev = newOp;
if (ToFront) outRec->Pts = newOp;
-#ifdef use_xyz
- if (pt == e->Bot) newOp->Pt = e->Bot;
- else if (pt == e->Top) newOp->Pt = e->Top;
- else SetZ(newOp->Pt, *e);
-#endif
return newOp;
}
}
//------------------------------------------------------------------------------
-void Clipper::ProcessHorizontals(bool IsTopOfScanbeam)
+OutPt* Clipper::GetLastOutPt(TEdge *e)
+{
+ OutRec *outRec = m_PolyOuts[e->OutIdx];
+ if (e->Side == esLeft)
+ return outRec->Pts;
+ else
+ return outRec->Pts->Prev;
+}
+//------------------------------------------------------------------------------
+
+void Clipper::ProcessHorizontals()
{
TEdge* horzEdge = m_SortedEdges;
while(horzEdge)
{
DeleteFromSEL(horzEdge);
- ProcessHorizontal(horzEdge, IsTopOfScanbeam);
+ ProcessHorizontal(horzEdge);
horzEdge = m_SortedEdges;
}
}
@@ -2678,13 +2421,13 @@ inline bool IsMinima(TEdge *e)
inline bool IsMaxima(TEdge *e, const cInt Y)
{
- return e && e->Top.Y == Y && !e->NextInLML;
+ return e && e->Top.y == Y && !e->NextInLML;
}
//------------------------------------------------------------------------------
inline bool IsIntermediate(TEdge *e, const cInt Y)
{
- return e->Top.Y == Y && e->NextInLML;
+ return e->Top.y == Y && e->NextInLML;
}
//------------------------------------------------------------------------------
@@ -2805,68 +2548,35 @@ TEdge* GetNextInAEL(TEdge *e, Direction dir)
void GetHorzDirection(TEdge& HorzEdge, Direction& Dir, cInt& Left, cInt& Right)
{
- if (HorzEdge.Bot.X < HorzEdge.Top.X)
+ if (HorzEdge.Bot.x < HorzEdge.Top.x)
{
- Left = HorzEdge.Bot.X;
- Right = HorzEdge.Top.X;
+ Left = HorzEdge.Bot.x;
+ Right = HorzEdge.Top.x;
Dir = dLeftToRight;
} else
{
- Left = HorzEdge.Top.X;
- Right = HorzEdge.Bot.X;
+ Left = HorzEdge.Top.x;
+ Right = HorzEdge.Bot.x;
Dir = dRightToLeft;
}
}
//------------------------------------------------------------------------
-void Clipper::PrepareHorzJoins(TEdge* horzEdge, bool isTopOfScanbeam)
-{
- //get the last Op for this horizontal edge
- //the point may be anywhere along the horizontal ...
- OutPt* outPt = m_PolyOuts[horzEdge->OutIdx]->Pts;
- if (horzEdge->Side != esLeft) outPt = outPt->Prev;
-
- //First, match up overlapping horizontal edges (eg when one polygon's
- //intermediate horz edge overlaps an intermediate horz edge of another, or
- //when one polygon sits on top of another) ...
- for (JoinList::size_type i = 0; i < m_GhostJoins.size(); ++i)
- {
- Join* j = m_GhostJoins[i];
- if (HorzSegmentsOverlap(j->OutPt1->Pt, j->OffPt, horzEdge->Bot, horzEdge->Top))
- AddJoin(j->OutPt1, outPt, j->OffPt);
- }
- //Also, since horizontal edges at the top of one SB are often removed from
- //the AEL before we process the horizontal edges at the bottom of the next,
- //we need to create 'ghost' Join records of 'contrubuting' horizontals that
- //we can compare with horizontals at the bottom of the next SB.
- if (isTopOfScanbeam)
- {
- if (outPt->Pt == horzEdge->Top)
- {
- AddGhostJoin(outPt, horzEdge->Bot);
- }
- else
- {
- AddGhostJoin(outPt, horzEdge->Top);
- }
- }
-}
-//------------------------------------------------------------------------------
-
/*******************************************************************************
* Notes: Horizontal edges (HEs) at scanline intersections (ie at the Top or *
* Bottom of a scanbeam) are processed as if layered. The order in which HEs *
-* are processed doesn't matter. HEs intersect with other HE Bot.Xs only [#] *
-* (or they could intersect with Top.Xs only, ie EITHER Bot.Xs OR Top.Xs), *
+* are processed doesn't matter. HEs intersect with other HE Bot.xs only [#] *
+* (or they could intersect with Top.xs only, ie EITHER Bot.xs OR Top.xs), *
* and with other non-horizontal edges [*]. Once these intersections are *
* processed, intermediate HEs then 'promote' the Edge above (NextInLML) into *
* the AEL. These 'promoted' edges may in turn intersect [%] with other HEs. *
*******************************************************************************/
-void Clipper::ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam)
+void Clipper::ProcessHorizontal(TEdge *horzEdge)
{
Direction dir;
cInt horzLeft, horzRight;
+ bool IsOpen = (horzEdge->OutIdx >= 0 && m_PolyOuts[horzEdge->OutIdx]->IsOpen);
GetHorzDirection(*horzEdge, dir, horzLeft, horzRight);
@@ -2876,85 +2586,162 @@ void Clipper::ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam)
if (!eLastHorz->NextInLML)
eMaxPair = GetMaximaPair(eLastHorz);
- for (;;)
+ MaximaList::const_iterator maxIt;
+ MaximaList::const_reverse_iterator maxRit;
+ if (m_Maxima.size() > 0)
+ {
+ //get the first maxima in range (X) ...
+ if (dir == dLeftToRight)
+ {
+ maxIt = m_Maxima.begin();
+ while (maxIt != m_Maxima.end() && *maxIt <= horzEdge->Bot.x) maxIt++;
+ if (maxIt != m_Maxima.end() && *maxIt >= eLastHorz->Top.x)
+ maxIt = m_Maxima.end();
+ }
+ else
+ {
+ maxRit = m_Maxima.rbegin();
+ while (maxRit != m_Maxima.rend() && *maxRit > horzEdge->Bot.x) maxRit++;
+ if (maxRit != m_Maxima.rend() && *maxRit <= eLastHorz->Top.x)
+ maxRit = m_Maxima.rend();
+ }
+ }
+
+ OutPt* op1 = 0;
+
+ for (;;) //loop through consec. horizontal edges
{
+
bool IsLastHorz = (horzEdge == eLastHorz);
TEdge* e = GetNextInAEL(horzEdge, dir);
while(e)
{
- //Break if we've got to the end of an intermediate horizontal edge ...
- //nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal.
- if (e->Curr.X == horzEdge->Top.X && horzEdge->NextInLML &&
- e->Dx < horzEdge->NextInLML->Dx) break;
-
- TEdge* eNext = GetNextInAEL(e, dir); //saves eNext for later
- if ((dir == dLeftToRight && e->Curr.X <= horzRight) ||
- (dir == dRightToLeft && e->Curr.X >= horzLeft))
- {
- //so far we're still in range of the horizontal Edge but make sure
+ //this code block inserts extra coords into horizontal edges (in output
+ //polygons) whereever maxima touch these horizontal edges. This helps
+ //'simplifying' polygons (ie if the Simplify property is set).
+ if (m_Maxima.size() > 0)
+ {
+ if (dir == dLeftToRight)
+ {
+ while (maxIt != m_Maxima.end() && *maxIt < e->Curr.x)
+ {
+ if (horzEdge->OutIdx >= 0 && !IsOpen)
+ AddOutPt(horzEdge, IntPoint(*maxIt, horzEdge->Bot.y));
+ maxIt++;
+ }
+ }
+ else
+ {
+ while (maxRit != m_Maxima.rend() && *maxRit > e->Curr.x)
+ {
+ if (horzEdge->OutIdx >= 0 && !IsOpen)
+ AddOutPt(horzEdge, IntPoint(*maxRit, horzEdge->Bot.y));
+ maxRit++;
+ }
+ }
+ };
+
+ if ((dir == dLeftToRight && e->Curr.x > horzRight) ||
+ (dir == dRightToLeft && e->Curr.x < horzLeft)) break;
+
+ //Also break if we've got to the end of an intermediate horizontal edge ...
+ //nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal.
+ if (e->Curr.x == horzEdge->Top.x && horzEdge->NextInLML &&
+ e->Dx < horzEdge->NextInLML->Dx) break;
+
+ if (horzEdge->OutIdx >= 0 && !IsOpen) //note: may be done multiple times
+ {
+ op1 = AddOutPt(horzEdge, e->Curr);
+ TEdge* eNextHorz = m_SortedEdges;
+ while (eNextHorz)
+ {
+ if (eNextHorz->OutIdx >= 0 &&
+ HorzSegmentsOverlap(horzEdge->Bot.x,
+ horzEdge->Top.x, eNextHorz->Bot.x, eNextHorz->Top.x))
+ {
+ OutPt* op2 = GetLastOutPt(eNextHorz);
+ AddJoin(op2, op1, eNextHorz->Top);
+ }
+ eNextHorz = eNextHorz->NextInSEL;
+ }
+ AddGhostJoin(op1, horzEdge->Bot);
+ }
+
+ //OK, so far we're still in range of the horizontal Edge but make sure
//we're at the last of consec. horizontals when matching with eMaxPair
if(e == eMaxPair && IsLastHorz)
{
- if (horzEdge->OutIdx >= 0 && horzEdge->WindDelta != 0)
- PrepareHorzJoins(horzEdge, isTopOfScanbeam);
- if (dir == dLeftToRight)
- IntersectEdges(horzEdge, e, e->Top);
- else
- IntersectEdges(e, horzEdge, e->Top);
- if (eMaxPair->OutIdx >= 0) throw clipperException("ProcessHorizontal error");
+ if (horzEdge->OutIdx >= 0)
+ AddLocalMaxPoly(horzEdge, eMaxPair, horzEdge->Top);
+ DeleteFromAEL(horzEdge);
+ DeleteFromAEL(eMaxPair);
return;
}
- else if(dir == dLeftToRight)
+
+ if(dir == dLeftToRight)
{
- IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y);
- IntersectEdges(horzEdge, e, Pt, true);
+ IntPoint Pt = IntPoint(e->Curr.x, horzEdge->Curr.y);
+ IntersectEdges(horzEdge, e, Pt);
}
else
{
- IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y);
- IntersectEdges( e, horzEdge, Pt, true);
+ IntPoint Pt = IntPoint(e->Curr.x, horzEdge->Curr.y);
+ IntersectEdges( e, horzEdge, Pt);
}
+ TEdge* eNext = GetNextInAEL(e, dir);
SwapPositionsInAEL( horzEdge, e );
- }
- else if( (dir == dLeftToRight && e->Curr.X >= horzRight) ||
- (dir == dRightToLeft && e->Curr.X <= horzLeft) ) break;
- e = eNext;
- } //end while
+ e = eNext;
+ } //end while(e)
- if (horzEdge->OutIdx >= 0 && horzEdge->WindDelta != 0)
- PrepareHorzJoins(horzEdge, isTopOfScanbeam);
+ //Break out of loop if HorzEdge.NextInLML is not also horizontal ...
+ if (!horzEdge->NextInLML || !IsHorizontal(*horzEdge->NextInLML)) break;
+
+ UpdateEdgeIntoAEL(horzEdge);
+ if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Bot);
+ GetHorzDirection(*horzEdge, dir, horzLeft, horzRight);
- if (horzEdge->NextInLML && IsHorizontal(*horzEdge->NextInLML))
- {
- UpdateEdgeIntoAEL(horzEdge);
- if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Bot);
- GetHorzDirection(*horzEdge, dir, horzLeft, horzRight);
- } else
- break;
} //end for (;;)
- if(horzEdge->NextInLML)
+ if (horzEdge->OutIdx >= 0 && !op1)
+ {
+ op1 = GetLastOutPt(horzEdge);
+ TEdge* eNextHorz = m_SortedEdges;
+ while (eNextHorz)
+ {
+ if (eNextHorz->OutIdx >= 0 &&
+ HorzSegmentsOverlap(horzEdge->Bot.x,
+ horzEdge->Top.x, eNextHorz->Bot.x, eNextHorz->Top.x))
+ {
+ OutPt* op2 = GetLastOutPt(eNextHorz);
+ AddJoin(op2, op1, eNextHorz->Top);
+ }
+ eNextHorz = eNextHorz->NextInSEL;
+ }
+ AddGhostJoin(op1, horzEdge->Top);
+ }
+
+ if (horzEdge->NextInLML)
{
if(horzEdge->OutIdx >= 0)
{
- OutPt* op1 = AddOutPt( horzEdge, horzEdge->Top);
+ op1 = AddOutPt( horzEdge, horzEdge->Top);
UpdateEdgeIntoAEL(horzEdge);
if (horzEdge->WindDelta == 0) return;
//nb: HorzEdge is no longer horizontal here
TEdge* ePrev = horzEdge->PrevInAEL;
TEdge* eNext = horzEdge->NextInAEL;
- if (ePrev && ePrev->Curr.X == horzEdge->Bot.X &&
- ePrev->Curr.Y == horzEdge->Bot.Y && ePrev->WindDelta != 0 &&
- (ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y &&
+ if (ePrev && ePrev->Curr.x == horzEdge->Bot.x &&
+ ePrev->Curr.y == horzEdge->Bot.y && ePrev->WindDelta != 0 &&
+ (ePrev->OutIdx >= 0 && ePrev->Curr.y > ePrev->Top.y &&
SlopesEqual(*horzEdge, *ePrev, m_UseFullRange)))
{
OutPt* op2 = AddOutPt(ePrev, horzEdge->Bot);
AddJoin(op1, op2, horzEdge->Top);
}
- else if (eNext && eNext->Curr.X == horzEdge->Bot.X &&
- eNext->Curr.Y == horzEdge->Bot.Y && eNext->WindDelta != 0 &&
- eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y &&
+ else if (eNext && eNext->Curr.x == horzEdge->Bot.x &&
+ eNext->Curr.y == horzEdge->Bot.y && eNext->WindDelta != 0 &&
+ eNext->OutIdx >= 0 && eNext->Curr.y > eNext->Top.y &&
SlopesEqual(*horzEdge, *eNext, m_UseFullRange))
{
OutPt* op2 = AddOutPt(eNext, horzEdge->Bot);
@@ -2964,22 +2751,7 @@ void Clipper::ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam)
else
UpdateEdgeIntoAEL(horzEdge);
}
- else if (eMaxPair)
- {
- if (eMaxPair->OutIdx >= 0)
- {
- if (dir == dLeftToRight)
- IntersectEdges(horzEdge, eMaxPair, horzEdge->Top);
- else
- IntersectEdges(eMaxPair, horzEdge, horzEdge->Top);
- if (eMaxPair->OutIdx >= 0)
- throw clipperException("ProcessHorizontal error");
- } else
- {
- DeleteFromAEL(horzEdge);
- DeleteFromAEL(eMaxPair);
- }
- } else
+ else
{
if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Top);
DeleteFromAEL(horzEdge);
@@ -3006,17 +2778,18 @@ void Clipper::UpdateEdgeIntoAEL(TEdge *&e)
e->Curr = e->Bot;
e->PrevInAEL = AelPrev;
e->NextInAEL = AelNext;
- if (!IsHorizontal(*e)) InsertScanbeam(e->Top.Y);
+ if (!IsHorizontal(*e)) InsertScanbeam(e->Top.y);
}
//------------------------------------------------------------------------------
-bool Clipper::ProcessIntersections(const cInt botY, const cInt topY)
+bool Clipper::ProcessIntersections(const cInt topY)
{
if( !m_ActiveEdges ) return true;
try {
- BuildIntersectList(botY, topY);
- if (!m_IntersectNodes) return true;
- if (!m_IntersectNodes->Next || FixupIntersectionOrder()) ProcessIntersectList();
+ BuildIntersectList(topY);
+ size_t IlSize = m_IntersectList.size();
+ if (IlSize == 0) return true;
+ if (IlSize == 1 || FixupIntersectionOrder()) ProcessIntersectList();
else return false;
}
catch(...)
@@ -3032,16 +2805,13 @@ bool Clipper::ProcessIntersections(const cInt botY, const cInt topY)
void Clipper::DisposeIntersectNodes()
{
- while ( m_IntersectNodes )
- {
- IntersectNode* iNode = m_IntersectNodes->Next;
- delete m_IntersectNodes;
- m_IntersectNodes = iNode;
- }
+ for (size_t i = 0; i < m_IntersectList.size(); ++i )
+ delete m_IntersectList[i];
+ m_IntersectList.clear();
}
//------------------------------------------------------------------------------
-void Clipper::BuildIntersectList(const cInt botY, const cInt topY)
+void Clipper::BuildIntersectList(const cInt topY)
{
if ( !m_ActiveEdges ) return;
@@ -3052,7 +2822,7 @@ void Clipper::BuildIntersectList(const cInt botY, const cInt topY)
{
e->PrevInSEL = e->PrevInAEL;
e->NextInSEL = e->NextInAEL;
- e->Curr.X = TopX( *e, topY );
+ e->Curr.x = TopX( *e, topY );
e = e->NextInAEL;
}
@@ -3066,18 +2836,15 @@ void Clipper::BuildIntersectList(const cInt botY, const cInt topY)
{
TEdge *eNext = e->NextInSEL;
IntPoint Pt;
- if(e->Curr.X > eNext->Curr.X)
+ if(e->Curr.x > eNext->Curr.x)
{
- if (!IntersectPoint(*e, *eNext, Pt, m_UseFullRange) && e->Curr.X > eNext->Curr.X +1)
- throw clipperException("Intersection error");
- if (Pt.Y > botY)
- {
- Pt.Y = botY;
- if (std::fabs(e->Dx) > std::fabs(eNext->Dx))
- Pt.X = TopX(*eNext, botY); else
- Pt.X = TopX(*e, botY);
- }
- InsertIntersectNode( e, eNext, Pt );
+ IntersectPoint(*e, *eNext, Pt);
+ IntersectNode * newNode = new IntersectNode;
+ newNode->Edge1 = e;
+ newNode->Edge2 = eNext;
+ newNode->Pt = Pt;
+ m_IntersectList.push_back(newNode);
+
SwapPositionsInSEL(e, eNext);
isModified = true;
}
@@ -3092,43 +2859,55 @@ void Clipper::BuildIntersectList(const cInt botY, const cInt topY)
}
//------------------------------------------------------------------------------
-void Clipper::InsertIntersectNode(TEdge *e1, TEdge *e2, const IntPoint &Pt)
+
+void Clipper::ProcessIntersectList()
{
- IntersectNode* newNode = new IntersectNode;
- newNode->Edge1 = e1;
- newNode->Edge2 = e2;
- newNode->Pt = Pt;
- newNode->Next = 0;
- if( !m_IntersectNodes ) m_IntersectNodes = newNode;
- else if(newNode->Pt.Y > m_IntersectNodes->Pt.Y )
- {
- newNode->Next = m_IntersectNodes;
- m_IntersectNodes = newNode;
- }
- else
+ for (size_t i = 0; i < m_IntersectList.size(); ++i)
{
- IntersectNode* iNode = m_IntersectNodes;
- while(iNode->Next && newNode->Pt.Y <= iNode->Next->Pt.Y)
- iNode = iNode->Next;
- newNode->Next = iNode->Next;
- iNode->Next = newNode;
+ IntersectNode* iNode = m_IntersectList[i];
+ {
+ IntersectEdges( iNode->Edge1, iNode->Edge2, iNode->Pt);
+ SwapPositionsInAEL( iNode->Edge1 , iNode->Edge2 );
+ }
+ delete iNode;
}
+ m_IntersectList.clear();
}
//------------------------------------------------------------------------------
-void Clipper::ProcessIntersectList()
+bool IntersectListSort(IntersectNode* node1, IntersectNode* node2)
+{
+ return node2->Pt.y < node1->Pt.y;
+}
+//------------------------------------------------------------------------------
+
+inline bool EdgesAdjacent(const IntersectNode &inode)
+{
+ return (inode.Edge1->NextInSEL == inode.Edge2) ||
+ (inode.Edge1->PrevInSEL == inode.Edge2);
+}
+//------------------------------------------------------------------------------
+
+bool Clipper::FixupIntersectionOrder()
{
- while( m_IntersectNodes )
+ //pre-condition: intersections are sorted Bottom-most first.
+ //Now it's crucial that intersections are made only between adjacent edges,
+ //so to ensure this the order of intersections may need adjusting ...
+ CopyAELToSEL();
+ std::sort(m_IntersectList.begin(), m_IntersectList.end(), IntersectListSort);
+ size_t cnt = m_IntersectList.size();
+ for (size_t i = 0; i < cnt; ++i)
{
- IntersectNode* iNode = m_IntersectNodes->Next;
+ if (!EdgesAdjacent(*m_IntersectList[i]))
{
- IntersectEdges( m_IntersectNodes->Edge1 ,
- m_IntersectNodes->Edge2 , m_IntersectNodes->Pt, true);
- SwapPositionsInAEL( m_IntersectNodes->Edge1 , m_IntersectNodes->Edge2 );
+ size_t j = i + 1;
+ while (j < cnt && !EdgesAdjacent(*m_IntersectList[j])) j++;
+ if (j == cnt) return false;
+ std::swap(m_IntersectList[i], m_IntersectList[j]);
}
- delete m_IntersectNodes;
- m_IntersectNodes = iNode;
+ SwapPositionsInSEL(m_IntersectList[i]->Edge1, m_IntersectList[i]->Edge2);
}
+ return true;
}
//------------------------------------------------------------------------------
@@ -3146,7 +2925,7 @@ void Clipper::DoMaxima(TEdge *e)
TEdge* eNext = e->NextInAEL;
while(eNext && eNext != eMaxPair)
{
- IntersectEdges(e, eNext, e->Top, true);
+ IntersectEdges(e, eNext, e->Top);
SwapPositionsInAEL(e, eNext);
eNext = e->NextInAEL;
}
@@ -3158,7 +2937,9 @@ void Clipper::DoMaxima(TEdge *e)
}
else if( e->OutIdx >= 0 && eMaxPair->OutIdx >= 0 )
{
- IntersectEdges( e, eMaxPair, e->Top);
+ if (e->OutIdx >= 0) AddLocalMaxPoly(e, eMaxPair, e->Top);
+ DeleteFromAEL(e);
+ DeleteFromAEL(eMaxPair);
}
#ifdef use_lines
else if (e->WindDelta == 0)
@@ -3199,6 +2980,7 @@ void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY)
if(IsMaximaEdge)
{
+ if (m_StrictSimple) m_Maxima.push_back(e->Top.x);
TEdge* ePrev = e->PrevInAEL;
DoMaxima(e);
if( !ePrev ) e = m_ActiveEdges;
@@ -3206,7 +2988,7 @@ void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY)
}
else
{
- //2. promote horizontal edges, otherwise update Curr.X and Curr.Y ...
+ //2. promote horizontal edges, otherwise update Curr.x and Curr.y ...
if (IsIntermediate(e, topY) && IsHorizontal(*e->NextInLML))
{
UpdateEdgeIntoAEL(e);
@@ -3216,19 +2998,25 @@ void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY)
}
else
{
- e->Curr.X = TopX( *e, topY );
- e->Curr.Y = topY;
+ e->Curr.x = TopX( *e, topY );
+ e->Curr.y = topY;
}
+ //When StrictlySimple and 'e' is being touched by another edge, then
+ //make sure both edges have a vertex here ...
if (m_StrictSimple)
{
TEdge* ePrev = e->PrevInAEL;
if ((e->OutIdx >= 0) && (e->WindDelta != 0) && ePrev && (ePrev->OutIdx >= 0) &&
- (ePrev->Curr.X == e->Curr.X) && (ePrev->WindDelta != 0))
+ (ePrev->Curr.x == e->Curr.x) && (ePrev->WindDelta != 0))
{
- OutPt* op = AddOutPt(ePrev, e->Curr);
- OutPt* op2 = AddOutPt(e, e->Curr);
- AddJoin(op, op2, e->Curr); //StrictlySimple (type-3) join
+ IntPoint pt = e->Curr;
+#ifdef use_xyz
+ SetZ(pt, *ePrev, *e);
+#endif
+ OutPt* op = AddOutPt(ePrev, pt);
+ OutPt* op2 = AddOutPt(e, pt);
+ AddJoin(op, op2, pt); //StrictlySimple (type-3) join
}
}
@@ -3237,7 +3025,9 @@ void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY)
}
//3. Process horizontals at the Top of the scanbeam ...
- ProcessHorizontals(true);
+ m_Maxima.sort();
+ ProcessHorizontals();
+ m_Maxima.clear();
//4. Promote intermediate vertices ...
e = m_ActiveEdges;
@@ -3253,18 +3043,18 @@ void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY)
//if output polygons share an edge, they'll need joining later ...
TEdge* ePrev = e->PrevInAEL;
TEdge* eNext = e->NextInAEL;
- if (ePrev && ePrev->Curr.X == e->Bot.X &&
- ePrev->Curr.Y == e->Bot.Y && op &&
- ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y &&
+ if (ePrev && ePrev->Curr.x == e->Bot.x &&
+ ePrev->Curr.y == e->Bot.y && op &&
+ ePrev->OutIdx >= 0 && ePrev->Curr.y > ePrev->Top.y &&
SlopesEqual(*e, *ePrev, m_UseFullRange) &&
(e->WindDelta != 0) && (ePrev->WindDelta != 0))
{
OutPt* op2 = AddOutPt(ePrev, e->Bot);
AddJoin(op, op2, e->Top);
}
- else if (eNext && eNext->Curr.X == e->Bot.X &&
- eNext->Curr.Y == e->Bot.Y && op &&
- eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y &&
+ else if (eNext && eNext->Curr.x == e->Bot.x &&
+ eNext->Curr.y == e->Bot.y && op &&
+ eNext->OutIdx >= 0 && eNext->Curr.y > eNext->Top.y &&
SlopesEqual(*e, *eNext, m_UseFullRange) &&
(e->WindDelta != 0) && (eNext->WindDelta != 0))
{
@@ -3277,50 +3067,77 @@ void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY)
}
//------------------------------------------------------------------------------
-void Clipper::FixupOutPolygon(OutRec &outrec)
+void Clipper::FixupOutPolyline(OutRec &outrec)
{
- //FixupOutPolygon() - removes duplicate points and simplifies consecutive
- //parallel edges by removing the middle vertex.
- OutPt *lastOK = 0;
- outrec.BottomPt = 0;
OutPt *pp = outrec.Pts;
-
- for (;;)
+ OutPt *lastPP = pp->Prev;
+ while (pp != lastPP)
{
- if (pp->Prev == pp || pp->Prev == pp->Next )
+ pp = pp->Next;
+ if (pp->Pt == pp->Prev->Pt)
{
- DisposeOutPts(pp);
- outrec.Pts = 0;
- return;
+ if (pp == lastPP) lastPP = pp->Prev;
+ OutPt *tmpPP = pp->Prev;
+ tmpPP->Next = pp->Next;
+ pp->Next->Prev = tmpPP;
+ delete pp;
+ pp = tmpPP;
}
+ }
- //test for duplicate points and collinear edges ...
- if ((pp->Pt == pp->Next->Pt) || (pp->Pt == pp->Prev->Pt) ||
- (SlopesEqual(pp->Prev->Pt, pp->Pt, pp->Next->Pt, m_UseFullRange) &&
- (!m_PreserveCollinear ||
- !Pt2IsBetweenPt1AndPt3(pp->Prev->Pt, pp->Pt, pp->Next->Pt))))
- {
- lastOK = 0;
- OutPt *tmp = pp;
- pp->Prev->Next = pp->Next;
- pp->Next->Prev = pp->Prev;
- pp = pp->Prev;
- delete tmp;
- }
- else if (pp == lastOK) break;
- else
- {
- if (!lastOK) lastOK = pp;
- pp = pp->Next;
- }
+ if (pp == pp->Prev)
+ {
+ DisposeOutPts(pp);
+ outrec.Pts = 0;
+ return;
}
- outrec.Pts = pp;
}
//------------------------------------------------------------------------------
-int PointCount(OutPt *Pts)
+void Clipper::FixupOutPolygon(OutRec &outrec)
{
- if (!Pts) return 0;
+ //FixupOutPolygon() - removes duplicate points and simplifies consecutive
+ //parallel edges by removing the middle vertex.
+ OutPt *lastOK = 0;
+ outrec.BottomPt = 0;
+ OutPt *pp = outrec.Pts;
+ bool preserveCol = m_PreserveCollinear || m_StrictSimple;
+
+ for (;;)
+ {
+ if (pp->Prev == pp || pp->Prev == pp->Next)
+ {
+ DisposeOutPts(pp);
+ outrec.Pts = 0;
+ return;
+ }
+
+ //test for duplicate points and collinear edges ...
+ if ((pp->Pt == pp->Next->Pt) || (pp->Pt == pp->Prev->Pt) ||
+ (SlopesEqual(pp->Prev->Pt, pp->Pt, pp->Next->Pt, m_UseFullRange) &&
+ (!preserveCol || !Pt2IsBetweenPt1AndPt3(pp->Prev->Pt, pp->Pt, pp->Next->Pt))))
+ {
+ lastOK = 0;
+ OutPt *tmp = pp;
+ pp->Prev->Next = pp->Next;
+ pp->Next->Prev = pp->Prev;
+ pp = pp->Prev;
+ delete tmp;
+ }
+ else if (pp == lastOK) break;
+ else
+ {
+ if (!lastOK) lastOK = pp;
+ pp = pp->Next;
+ }
+ }
+ outrec.Pts = pp;
+}
+//------------------------------------------------------------------------------
+
+int PointCount(OutPt *Pts)
+{
+ if (!Pts) return 0;
int result = 0;
OutPt* p = Pts;
do
@@ -3344,7 +3161,7 @@ void Clipper::BuildResult(Paths &polys)
int cnt = PointCount(p);
if (cnt < 2) continue;
pg.reserve(cnt);
- for (int i = 0; i < cnt; ++i)
+ for (int j = 0; j < cnt; ++j)
{
pg.push_back(p->Pt);
p = p->Prev;
@@ -3391,7 +3208,7 @@ void Clipper::BuildResult2(PolyTree& polytree)
outRec->PolyNd->m_IsOpen = true;
polytree.AddChild(*outRec->PolyNd);
}
- else if (outRec->FirstLeft)
+ else if (outRec->FirstLeft && outRec->FirstLeft->PolyNd)
outRec->FirstLeft->PolyNd->AddChild(*outRec->PolyNd);
else
polytree.AddChild(*outRec->PolyNd);
@@ -3412,47 +3229,15 @@ void SwapIntersectNodes(IntersectNode &int1, IntersectNode &int2)
}
//------------------------------------------------------------------------------
-inline bool EdgesAdjacent(const IntersectNode &inode)
-{
- return (inode.Edge1->NextInSEL == inode.Edge2) ||
- (inode.Edge1->PrevInSEL == inode.Edge2);
-}
-//------------------------------------------------------------------------------
-
-bool Clipper::FixupIntersectionOrder()
-{
- //pre-condition: intersections are sorted Bottom-most (then Left-most) first.
- //Now it's crucial that intersections are made only between adjacent edges,
- //so to ensure this the order of intersections may need adjusting ...
- IntersectNode *inode = m_IntersectNodes;
- CopyAELToSEL();
- while (inode)
- {
- if (!EdgesAdjacent(*inode))
- {
- IntersectNode *nextNode = inode->Next;
- while (nextNode && !EdgesAdjacent(*nextNode))
- nextNode = nextNode->Next;
- if (!nextNode)
- return false;
- SwapIntersectNodes(*inode, *nextNode);
- }
- SwapPositionsInSEL(inode->Edge1, inode->Edge2);
- inode = inode->Next;
- }
- return true;
-}
-//------------------------------------------------------------------------------
-
inline bool E2InsertsBeforeE1(TEdge &e1, TEdge &e2)
{
- if (e2.Curr.X == e1.Curr.X)
+ if (e2.Curr.x == e1.Curr.x)
{
- if (e2.Top.Y > e1.Top.Y)
- return e2.Top.X < TopX(e1, e2.Top.Y);
- else return e1.Top.X > TopX(e2, e1.Top.Y);
+ if (e2.Top.y > e1.Top.y)
+ return e2.Top.x < TopX(e1, e2.Top.y);
+ else return e1.Top.x > TopX(e2, e1.Top.y);
}
- else return e2.Curr.X < e1.Curr.X;
+ else return e2.Curr.x < e1.Curr.x;
}
//------------------------------------------------------------------------------
@@ -3540,8 +3325,8 @@ OutPt* DupOutPt(OutPt* outPt, bool InsertAfter)
bool JoinHorz(OutPt* op1, OutPt* op1b, OutPt* op2, OutPt* op2b,
const IntPoint Pt, bool DiscardLeft)
{
- Direction Dir1 = (op1->Pt.X > op1b->Pt.X ? dRightToLeft : dLeftToRight);
- Direction Dir2 = (op2->Pt.X > op2b->Pt.X ? dRightToLeft : dLeftToRight);
+ Direction Dir1 = (op1->Pt.x > op1b->Pt.x ? dRightToLeft : dLeftToRight);
+ Direction Dir2 = (op2->Pt.x > op2b->Pt.x ? dRightToLeft : dLeftToRight);
if (Dir1 == Dir2) return false;
//When DiscardLeft, we want Op1b to be on the Left of Op1, otherwise we
@@ -3551,10 +3336,10 @@ bool JoinHorz(OutPt* op1, OutPt* op1b, OutPt* op2, OutPt* op2b,
//otherwise make sure we're AT or LEFT of Pt. (Likewise with Op2b.)
if (Dir1 == dLeftToRight)
{
- while (op1->Next->Pt.X <= Pt.X &&
- op1->Next->Pt.X >= op1->Pt.X && op1->Next->Pt.Y == Pt.Y)
+ while (op1->Next->Pt.x <= Pt.x &&
+ op1->Next->Pt.x >= op1->Pt.x && op1->Next->Pt.y == Pt.y)
op1 = op1->Next;
- if (DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next;
+ if (DiscardLeft && (op1->Pt.x != Pt.x)) op1 = op1->Next;
op1b = DupOutPt(op1, !DiscardLeft);
if (op1b->Pt != Pt)
{
@@ -3565,10 +3350,10 @@ bool JoinHorz(OutPt* op1, OutPt* op1b, OutPt* op2, OutPt* op2b,
}
else
{
- while (op1->Next->Pt.X >= Pt.X &&
- op1->Next->Pt.X <= op1->Pt.X && op1->Next->Pt.Y == Pt.Y)
+ while (op1->Next->Pt.x >= Pt.x &&
+ op1->Next->Pt.x <= op1->Pt.x && op1->Next->Pt.y == Pt.y)
op1 = op1->Next;
- if (!DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next;
+ if (!DiscardLeft && (op1->Pt.x != Pt.x)) op1 = op1->Next;
op1b = DupOutPt(op1, DiscardLeft);
if (op1b->Pt != Pt)
{
@@ -3580,10 +3365,10 @@ bool JoinHorz(OutPt* op1, OutPt* op1b, OutPt* op2, OutPt* op2b,
if (Dir2 == dLeftToRight)
{
- while (op2->Next->Pt.X <= Pt.X &&
- op2->Next->Pt.X >= op2->Pt.X && op2->Next->Pt.Y == Pt.Y)
+ while (op2->Next->Pt.x <= Pt.x &&
+ op2->Next->Pt.x >= op2->Pt.x && op2->Next->Pt.y == Pt.y)
op2 = op2->Next;
- if (DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next;
+ if (DiscardLeft && (op2->Pt.x != Pt.x)) op2 = op2->Next;
op2b = DupOutPt(op2, !DiscardLeft);
if (op2b->Pt != Pt)
{
@@ -3593,10 +3378,10 @@ bool JoinHorz(OutPt* op1, OutPt* op1b, OutPt* op2, OutPt* op2b,
};
} else
{
- while (op2->Next->Pt.X >= Pt.X &&
- op2->Next->Pt.X <= op2->Pt.X && op2->Next->Pt.Y == Pt.Y)
+ while (op2->Next->Pt.x >= Pt.x &&
+ op2->Next->Pt.x <= op2->Pt.x && op2->Next->Pt.y == Pt.y)
op2 = op2->Next;
- if (!DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next;
+ if (!DiscardLeft && (op2->Pt.x != Pt.x)) op2 = op2->Next;
op2b = DupOutPt(op2, DiscardLeft);
if (op2b->Pt != Pt)
{
@@ -3624,34 +3409,33 @@ bool JoinHorz(OutPt* op1, OutPt* op1b, OutPt* op2, OutPt* op2b,
}
//------------------------------------------------------------------------------
-bool Clipper::JoinPoints(const Join *j, OutPt *&p1, OutPt *&p2)
+bool Clipper::JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2)
{
- OutRec* outRec1 = GetOutRec(j->OutPt1->Idx);
- OutRec* outRec2 = GetOutRec(j->OutPt2->Idx);
OutPt *op1 = j->OutPt1, *op1b;
OutPt *op2 = j->OutPt2, *op2b;
//There are 3 kinds of joins for output polygons ...
- //1. Horizontal joins where Join.OutPt1 & Join.OutPt2 are a vertices anywhere
+ //1. Horizontal joins where Join.OutPt1 & Join.OutPt2 are vertices anywhere
//along (horizontal) collinear edges (& Join.OffPt is on the same horizontal).
//2. Non-horizontal joins where Join.OutPt1 & Join.OutPt2 are at the same
//location at the Bottom of the overlapping segment (& Join.OffPt is above).
//3. StrictSimple joins where edges touch but are not collinear and where
//Join.OutPt1, Join.OutPt2 & Join.OffPt all share the same point.
- bool isHorizontal = (j->OutPt1->Pt.Y == j->OffPt.Y);
+ bool isHorizontal = (j->OutPt1->Pt.y == j->OffPt.y);
if (isHorizontal && (j->OffPt == j->OutPt1->Pt) &&
(j->OffPt == j->OutPt2->Pt))
{
//Strictly Simple join ...
+ if (outRec1 != outRec2) return false;
op1b = j->OutPt1->Next;
while (op1b != op1 && (op1b->Pt == j->OffPt))
op1b = op1b->Next;
- bool reverse1 = (op1b->Pt.Y > j->OffPt.Y);
+ bool reverse1 = (op1b->Pt.y > j->OffPt.y);
op2b = j->OutPt2->Next;
while (op2b != op2 && (op2b->Pt == j->OffPt))
op2b = op2b->Next;
- bool reverse2 = (op2b->Pt.Y > j->OffPt.Y);
+ bool reverse2 = (op2b->Pt.y > j->OffPt.y);
if (reverse1 == reverse2) return false;
if (reverse1)
{
@@ -3661,8 +3445,8 @@ bool Clipper::JoinPoints(const Join *j, OutPt *&p1, OutPt *&p2)
op2->Next = op1;
op1b->Next = op2b;
op2b->Prev = op1b;
- p1 = op1;
- p2 = op1b;
+ j->OutPt1 = op1;
+ j->OutPt2 = op1b;
return true;
} else
{
@@ -3672,8 +3456,8 @@ bool Clipper::JoinPoints(const Join *j, OutPt *&p1, OutPt *&p2)
op2->Prev = op1;
op1b->Prev = op2b;
op2b->Next = op1b;
- p1 = op1;
- p2 = op1b;
+ j->OutPt1 = op1;
+ j->OutPt2 = op1b;
return true;
}
}
@@ -3683,22 +3467,22 @@ bool Clipper::JoinPoints(const Join *j, OutPt *&p1, OutPt *&p2)
//them we're not yet sure where the overlapping is. OutPt1.Pt & OutPt2.Pt
//may be anywhere along the horizontal edge.
op1b = op1;
- while (op1->Prev->Pt.Y == op1->Pt.Y && op1->Prev != op1b && op1->Prev != op2)
+ while (op1->Prev->Pt.y == op1->Pt.y && op1->Prev != op1b && op1->Prev != op2)
op1 = op1->Prev;
- while (op1b->Next->Pt.Y == op1b->Pt.Y && op1b->Next != op1 && op1b->Next != op2)
+ while (op1b->Next->Pt.y == op1b->Pt.y && op1b->Next != op1 && op1b->Next != op2)
op1b = op1b->Next;
if (op1b->Next == op1 || op1b->Next == op2) return false; //a flat 'polygon'
op2b = op2;
- while (op2->Prev->Pt.Y == op2->Pt.Y && op2->Prev != op2b && op2->Prev != op1b)
+ while (op2->Prev->Pt.y == op2->Pt.y && op2->Prev != op2b && op2->Prev != op1b)
op2 = op2->Prev;
- while (op2b->Next->Pt.Y == op2b->Pt.Y && op2b->Next != op2 && op2b->Next != op1)
+ while (op2b->Next->Pt.y == op2b->Pt.y && op2b->Next != op2 && op2b->Next != op1)
op2b = op2b->Next;
if (op2b->Next == op2 || op2b->Next == op1) return false; //a flat 'polygon'
cInt Left, Right;
//Op1 --> Op1b & Op2 --> Op2b are the extremites of the horizontal edges
- if (!GetOverlap(op1->Pt.X, op1b->Pt.X, op2->Pt.X, op2b->Pt.X, Left, Right))
+ if (!GetOverlap(op1->Pt.x, op1b->Pt.x, op2->Pt.x, op2b->Pt.x, Left, Right))
return false;
//DiscardLeftSide: when overlapping edges are joined, a spike will created
@@ -3706,51 +3490,51 @@ bool Clipper::JoinPoints(const Join *j, OutPt *&p1, OutPt *&p2)
//on the discard Side as either may still be needed for other joins ...
IntPoint Pt;
bool DiscardLeftSide;
- if (op1->Pt.X >= Left && op1->Pt.X <= Right)
+ if (op1->Pt.x >= Left && op1->Pt.x <= Right)
{
- Pt = op1->Pt; DiscardLeftSide = (op1->Pt.X > op1b->Pt.X);
+ Pt = op1->Pt; DiscardLeftSide = (op1->Pt.x > op1b->Pt.x);
}
- else if (op2->Pt.X >= Left&& op2->Pt.X <= Right)
+ else if (op2->Pt.x >= Left&& op2->Pt.x <= Right)
{
- Pt = op2->Pt; DiscardLeftSide = (op2->Pt.X > op2b->Pt.X);
+ Pt = op2->Pt; DiscardLeftSide = (op2->Pt.x > op2b->Pt.x);
}
- else if (op1b->Pt.X >= Left && op1b->Pt.X <= Right)
+ else if (op1b->Pt.x >= Left && op1b->Pt.x <= Right)
{
- Pt = op1b->Pt; DiscardLeftSide = op1b->Pt.X > op1->Pt.X;
+ Pt = op1b->Pt; DiscardLeftSide = op1b->Pt.x > op1->Pt.x;
}
else
{
- Pt = op2b->Pt; DiscardLeftSide = (op2b->Pt.X > op2->Pt.X);
+ Pt = op2b->Pt; DiscardLeftSide = (op2b->Pt.x > op2->Pt.x);
}
- p1 = op1; p2 = op2;
+ j->OutPt1 = op1; j->OutPt2 = op2;
return JoinHorz(op1, op1b, op2, op2b, Pt, DiscardLeftSide);
} else
{
//nb: For non-horizontal joins ...
- // 1. Jr.OutPt1.Pt.Y == Jr.OutPt2.Pt.Y
- // 2. Jr.OutPt1.Pt > Jr.OffPt.Y
+ // 1. Jr.OutPt1.Pt.y == Jr.OutPt2.Pt.y
+ // 2. Jr.OutPt1.Pt > Jr.OffPt.y
//make sure the polygons are correctly oriented ...
op1b = op1->Next;
while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Next;
- bool Reverse1 = ((op1b->Pt.Y > op1->Pt.Y) ||
+ bool Reverse1 = ((op1b->Pt.y > op1->Pt.y) ||
!SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange));
if (Reverse1)
{
op1b = op1->Prev;
while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Prev;
- if ((op1b->Pt.Y > op1->Pt.Y) ||
+ if ((op1b->Pt.y > op1->Pt.y) ||
!SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange)) return false;
};
op2b = op2->Next;
while ((op2b->Pt == op2->Pt) && (op2b != op2))op2b = op2b->Next;
- bool Reverse2 = ((op2b->Pt.Y > op2->Pt.Y) ||
+ bool Reverse2 = ((op2b->Pt.y > op2->Pt.y) ||
!SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange));
if (Reverse2)
{
op2b = op2->Prev;
while ((op2b->Pt == op2->Pt) && (op2b != op2)) op2b = op2b->Prev;
- if ((op2b->Pt.Y > op2->Pt.Y) ||
+ if ((op2b->Pt.y > op2->Pt.y) ||
!SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange)) return false;
}
@@ -3765,8 +3549,8 @@ bool Clipper::JoinPoints(const Join *j, OutPt *&p1, OutPt *&p2)
op2->Next = op1;
op1b->Next = op2b;
op2b->Prev = op1b;
- p1 = op1;
- p2 = op1b;
+ j->OutPt1 = op1;
+ j->OutPt2 = op1b;
return true;
} else
{
@@ -3776,39 +3560,33 @@ bool Clipper::JoinPoints(const Join *j, OutPt *&p1, OutPt *&p2)
op2->Prev = op1;
op1b->Prev = op2b;
op2b->Next = op1b;
- p1 = op1;
- p2 = op1b;
+ j->OutPt1 = op1;
+ j->OutPt2 = op1b;
return true;
}
}
}
//----------------------------------------------------------------------
-bool Poly2ContainsPoly1(OutPt* OutPt1, OutPt* OutPt2, bool UseFullInt64Range)
+static OutRec* ParseFirstLeft(OutRec* FirstLeft)
{
- OutPt* Pt = OutPt1;
- //Because the polygons may be touching, we need to find a vertex that
- //isn't touching the other polygon ...
- if (PointOnPolygon(Pt->Pt, OutPt2, UseFullInt64Range))
- {
- Pt = Pt->Next;
- while (Pt != OutPt1 && PointOnPolygon(Pt->Pt, OutPt2, UseFullInt64Range))
- Pt = Pt->Next;
- if (Pt == OutPt1) return true;
- }
- return PointInPolygon(Pt->Pt, OutPt2, UseFullInt64Range);
+ while (FirstLeft && !FirstLeft->Pts)
+ FirstLeft = FirstLeft->FirstLeft;
+ return FirstLeft;
}
-//----------------------------------------------------------------------
+//------------------------------------------------------------------------------
void Clipper::FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec)
{
-
+ //tests if NewOutRec contains the polygon before reassigning FirstLeft
for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
{
OutRec* outRec = m_PolyOuts[i];
- if (outRec->Pts && outRec->FirstLeft == OldOutRec)
+ if (!outRec->Pts || !outRec->FirstLeft) continue;
+ OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft);
+ if (firstLeft == OldOutRec)
{
- if (Poly2ContainsPoly1(outRec->Pts, NewOutRec->Pts, m_UseFullRange))
+ if (Poly2ContainsPoly1(outRec->Pts, NewOutRec->Pts))
outRec->FirstLeft = NewOutRec;
}
}
@@ -3817,6 +3595,7 @@ void Clipper::FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec)
void Clipper::FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec)
{
+ //reassigns FirstLeft WITHOUT testing if NewOutRec contains the polygon
for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
{
OutRec* outRec = m_PolyOuts[i];
@@ -3829,12 +3608,13 @@ void Clipper::JoinCommonEdges()
{
for (JoinList::size_type i = 0; i < m_Joins.size(); i++)
{
- Join* j = m_Joins[i];
+ Join* join = m_Joins[i];
- OutRec *outRec1 = GetOutRec(j->OutPt1->Idx);
- OutRec *outRec2 = GetOutRec(j->OutPt2->Idx);
+ OutRec *outRec1 = GetOutRec(join->OutPt1->Idx);
+ OutRec *outRec2 = GetOutRec(join->OutPt2->Idx);
if (!outRec1->Pts || !outRec2->Pts) continue;
+ if (outRec1->IsOpen || outRec2->IsOpen) continue;
//get the polygon fragment with the correct hole state (FirstLeft)
//before calling JoinPoints() ...
@@ -3844,22 +3624,33 @@ void Clipper::JoinCommonEdges()
else if (Param1RightOfParam2(outRec2, outRec1)) holeStateRec = outRec1;
else holeStateRec = GetLowermostRec(outRec1, outRec2);
- OutPt *p1, *p2;
- if (!JoinPoints(j, p1, p2)) continue;
+ if (!JoinPoints(join, outRec1, outRec2)) continue;
if (outRec1 == outRec2)
{
//instead of joining two polygons, we've just created a new one by
//splitting one polygon into two.
- outRec1->Pts = p1;
+ outRec1->Pts = join->OutPt1;
outRec1->BottomPt = 0;
outRec2 = CreateOutRec();
- outRec2->Pts = p2;
+ outRec2->Pts = join->OutPt2;
//update all OutRec2.Pts Idx's ...
UpdateOutPtIdxs(*outRec2);
- if (Poly2ContainsPoly1(outRec2->Pts, outRec1->Pts, m_UseFullRange))
+ //We now need to check every OutRec.FirstLeft pointer. If it points
+ //to OutRec1 it may need to point to OutRec2 instead ...
+ if (m_UsingPolyTree)
+ for (PolyOutList::size_type j = 0; j < m_PolyOuts.size() - 1; j++)
+ {
+ OutRec* oRec = m_PolyOuts[j];
+ if (!oRec->Pts || ParseFirstLeft(oRec->FirstLeft) != outRec1 ||
+ oRec->IsHole == outRec1->IsHole) continue;
+ if (Poly2ContainsPoly1(oRec->Pts, join->OutPt2))
+ oRec->FirstLeft = outRec2;
+ }
+
+ if (Poly2ContainsPoly1(outRec2->Pts, outRec1->Pts))
{
//outRec2 is contained by outRec1 ...
outRec2->IsHole = !outRec1->IsHole;
@@ -3871,7 +3662,7 @@ void Clipper::JoinCommonEdges()
if ((outRec2->IsHole ^ m_ReverseOutput) == (Area(*outRec2) > 0))
ReversePolyPtLinks(outRec2->Pts);
- } else if (Poly2ContainsPoly1(outRec1->Pts, outRec2->Pts, m_UseFullRange))
+ } else if (Poly2ContainsPoly1(outRec1->Pts, outRec2->Pts))
{
//outRec1 is contained by outRec2 ...
outRec2->IsHole = outRec1->IsHole;
@@ -3913,433 +3704,544 @@ void Clipper::JoinCommonEdges()
}
}
}
+
+//------------------------------------------------------------------------------
+// ClipperOffset support functions ...
//------------------------------------------------------------------------------
-void Clipper::DoSimplePolygons()
+DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2)
{
- PolyOutList::size_type i = 0;
- while (i < m_PolyOuts.size())
- {
- OutRec* outrec = m_PolyOuts[i++];
- OutPt* op = outrec->Pts;
- if (!op) continue;
- do //for each Pt in Polygon until duplicate found do ...
- {
- OutPt* op2 = op->Next;
- while (op2 != outrec->Pts)
- {
- if ((op->Pt == op2->Pt) && op2->Next != op && op2->Prev != op)
- {
- //split the polygon into two ...
- OutPt* op3 = op->Prev;
- OutPt* op4 = op2->Prev;
- op->Prev = op4;
- op4->Next = op;
- op2->Prev = op3;
- op3->Next = op2;
+ if(pt2.x == pt1.x && pt2.y == pt1.y)
+ return DoublePoint(0, 0);
- outrec->Pts = op;
- OutRec* outrec2 = CreateOutRec();
- outrec2->Pts = op2;
- UpdateOutPtIdxs(*outrec2);
- if (Poly2ContainsPoly1(outrec2->Pts, outrec->Pts, m_UseFullRange))
- {
- //OutRec2 is contained by OutRec1 ...
- outrec2->IsHole = !outrec->IsHole;
- outrec2->FirstLeft = outrec;
- }
- else
- if (Poly2ContainsPoly1(outrec->Pts, outrec2->Pts, m_UseFullRange))
- {
- //OutRec1 is contained by OutRec2 ...
- outrec2->IsHole = outrec->IsHole;
- outrec->IsHole = !outrec2->IsHole;
- outrec2->FirstLeft = outrec->FirstLeft;
- outrec->FirstLeft = outrec2;
- } else
- {
- //the 2 polygons are separate ...
- outrec2->IsHole = outrec->IsHole;
- outrec2->FirstLeft = outrec->FirstLeft;
- }
- op2 = op; //ie get ready for the Next iteration
- }
- op2 = op2->Next;
- }
- op = op->Next;
- }
- while (op != outrec->Pts);
- }
+ double Dx = (double)(pt2.x - pt1.x);
+ double dy = (double)(pt2.y - pt1.y);
+ double f = 1 *1.0/ std::sqrt( Dx*Dx + dy*dy );
+ Dx *= f;
+ dy *= f;
+ return DoublePoint(dy, -Dx);
}
+
+//------------------------------------------------------------------------------
+// ClipperOffset class
//------------------------------------------------------------------------------
-void ReversePath(Path& p)
+ClipperOffset::ClipperOffset(double miterLimit, double arcTolerance)
{
- std::reverse(p.begin(), p.end());
+ this->MiterLimit = miterLimit;
+ this->ArcTolerance = arcTolerance;
+ m_lowest.x = -1;
}
//------------------------------------------------------------------------------
-void ReversePaths(Paths& p)
+ClipperOffset::~ClipperOffset()
{
- for (Paths::size_type i = 0; i < p.size(); ++i)
- ReversePath(p[i]);
+ Clear();
}
-
//------------------------------------------------------------------------------
-// OffsetPolygon functions ...
+
+void ClipperOffset::Clear()
+{
+ for (int i = 0; i < m_polyNodes.ChildCount(); ++i)
+ delete m_polyNodes.Childs[i];
+ m_polyNodes.Childs.clear();
+ m_lowest.x = -1;
+}
//------------------------------------------------------------------------------
-DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2)
+void ClipperOffset::AddPath(const Path& path, JoinType joinType, EndType endType)
{
- if(pt2.X == pt1.X && pt2.Y == pt1.Y)
- return DoublePoint(0, 0);
+ int highI = (int)path.size() - 1;
+ if (highI < 0) return;
+ PolyNode* newNode = new PolyNode();
+ newNode->m_jointype = joinType;
+ newNode->m_endtype = endType;
- double Dx = (double)(pt2.X - pt1.X);
- double dy = (double)(pt2.Y - pt1.Y);
- double f = 1 *1.0/ std::sqrt( Dx*Dx + dy*dy );
- Dx *= f;
- dy *= f;
- return DoublePoint(dy, -Dx);
-}
+ //strip duplicate points from path and also get index to the lowest point ...
+ if (endType == etClosedLine || endType == etClosedPolygon)
+ while (highI > 0 && path[0] == path[highI]) highI--;
+ newNode->Contour.reserve(highI + 1);
+ newNode->Contour.push_back(path[0]);
+ int j = 0, k = 0;
+ for (int i = 1; i <= highI; i++)
+ if (newNode->Contour[j] != path[i])
+ {
+ j++;
+ newNode->Contour.push_back(path[i]);
+ if (path[i].y > newNode->Contour[k].y ||
+ (path[i].y == newNode->Contour[k].y &&
+ path[i].x < newNode->Contour[k].x)) k = j;
+ }
+ if (endType == etClosedPolygon && j < 2)
+ {
+ delete newNode;
+ return;
+ }
+ m_polyNodes.AddChild(*newNode);
+ //if this path's lowest pt is lower than all the others then update m_lowest
+ if (endType != etClosedPolygon) return;
+ if (m_lowest.x < 0)
+ m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k);
+ else
+ {
+ IntPoint ip = m_polyNodes.Childs[(int)m_lowest.x]->Contour[(int)m_lowest.y];
+ if (newNode->Contour[k].y > ip.y ||
+ (newNode->Contour[k].y == ip.y &&
+ newNode->Contour[k].x < ip.x))
+ m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k);
+ }
+}
//------------------------------------------------------------------------------
+
+void ClipperOffset::AddPaths(const Paths& paths, JoinType joinType, EndType endType)
+{
+ for (Paths::size_type i = 0; i < paths.size(); ++i)
+ AddPath(paths[i], joinType, endType);
+}
//------------------------------------------------------------------------------
-class OffsetBuilder
+void ClipperOffset::FixOrientations()
{
-private:
- const Paths& m_p;
- Path* m_curr_poly;
- std::vector<DoublePoint> normals;
- double m_delta, m_sinA, m_sin, m_cos;
- double m_miterLim, m_Steps360;
- size_t m_i, m_j, m_k;
- static const int buffLength = 128;
-
-public:
+ //fixup orientations of all closed paths if the orientation of the
+ //closed path with the lowermost vertex is wrong ...
+ if (m_lowest.x >= 0 &&
+ !Orientation(m_polyNodes.Childs[(int)m_lowest.x]->Contour))
+ {
+ for (int i = 0; i < m_polyNodes.ChildCount(); ++i)
+ {
+ PolyNode& node = *m_polyNodes.Childs[i];
+ if (node.m_endtype == etClosedPolygon ||
+ (node.m_endtype == etClosedLine && Orientation(node.Contour)))
+ ReversePath(node.Contour);
+ }
+ } else
+ {
+ for (int i = 0; i < m_polyNodes.ChildCount(); ++i)
+ {
+ PolyNode& node = *m_polyNodes.Childs[i];
+ if (node.m_endtype == etClosedLine && !Orientation(node.Contour))
+ ReversePath(node.Contour);
+ }
+ }
+}
+//------------------------------------------------------------------------------
-OffsetBuilder(const Paths& in_polys, Paths& out_polys,
- double Delta, JoinType jointype, EndType endtype, double limit): m_p(in_polys)
+void ClipperOffset::Execute(Paths& solution, double delta)
{
- //precondition: &out_polys != &in_polys
+ solution.clear();
+ FixOrientations();
+ DoOffset(delta);
+
+ //now clean up 'corners' ...
+ Clipper clpr;
+ clpr.AddPaths(m_destPolys, ptSubject, true);
+ if (delta > 0)
+ {
+ clpr.Execute(ctUnion, solution, pftPositive, pftPositive);
+ }
+ else
+ {
+ IntRect r = clpr.GetBounds();
+ Path outer(4);
+ outer[0] = IntPoint(r.left - 10, r.bottom + 10);
+ outer[1] = IntPoint(r.right + 10, r.bottom + 10);
+ outer[2] = IntPoint(r.right + 10, r.top - 10);
+ outer[3] = IntPoint(r.left - 10, r.top - 10);
+
+ clpr.AddPath(outer, ptSubject, true);
+ clpr.ReverseSolution(true);
+ clpr.Execute(ctUnion, solution, pftNegative, pftNegative);
+ if (solution.size() > 0) solution.erase(solution.begin());
+ }
+}
+//------------------------------------------------------------------------------
- if (NEAR_ZERO(Delta)) {out_polys = in_polys; return;}
- //we can't shrink a polyline so ...
- if (endtype != etClosed && Delta < 0) Delta = -Delta;
- m_delta = Delta;
+void ClipperOffset::Execute(PolyTree& solution, double delta)
+{
+ solution.Clear();
+ FixOrientations();
+ DoOffset(delta);
- if (jointype == jtMiter)
+ //now clean up 'corners' ...
+ Clipper clpr;
+ clpr.AddPaths(m_destPolys, ptSubject, true);
+ if (delta > 0)
{
- //m_miterLim: see offset_triginometry.svg in the documentation folder ...
- if (limit > 2) m_miterLim = 2/(limit*limit);
- else m_miterLim = 0.5;
- if (endtype == etRound) limit = 0.25;
+ clpr.Execute(ctUnion, solution, pftPositive, pftPositive);
}
-
- if (jointype == jtRound || endtype == etRound)
+ else
{
- if (limit <= 0) limit = 0.25;
- else if (limit > std::fabs(Delta)*0.25) limit = std::fabs(Delta)*0.25;
- //m_Steps360: see offset_triginometry2.svg in the documentation folder ...
- m_Steps360 = pi / std::acos(1 - limit / std::fabs(Delta));
- m_sin = std::sin(2 * pi / m_Steps360);
- m_cos = std::cos(2 * pi / m_Steps360);
- m_Steps360 /= pi * 2;
- if (Delta < 0) m_sin = -m_sin;
+ IntRect r = clpr.GetBounds();
+ Path outer(4);
+ outer[0] = IntPoint(r.left - 10, r.bottom + 10);
+ outer[1] = IntPoint(r.right + 10, r.bottom + 10);
+ outer[2] = IntPoint(r.right + 10, r.top - 10);
+ outer[3] = IntPoint(r.left - 10, r.top - 10);
+
+ clpr.AddPath(outer, ptSubject, true);
+ clpr.ReverseSolution(true);
+ clpr.Execute(ctUnion, solution, pftNegative, pftNegative);
+ //remove the outer PolyNode rectangle ...
+ if (solution.ChildCount() == 1 && solution.Childs[0]->ChildCount() > 0)
+ {
+ PolyNode* outerNode = solution.Childs[0];
+ solution.Childs.reserve(outerNode->ChildCount());
+ solution.Childs[0] = outerNode->Childs[0];
+ solution.Childs[0]->Parent = outerNode->Parent;
+ for (int i = 1; i < outerNode->ChildCount(); ++i)
+ solution.AddChild(*outerNode->Childs[i]);
+ }
+ else
+ solution.Clear();
}
+}
+//------------------------------------------------------------------------------
- out_polys.clear();
- out_polys.resize(m_p.size());
- for (m_i = 0; m_i < m_p.size(); m_i++)
+void ClipperOffset::DoOffset(double delta)
+{
+ m_destPolys.clear();
+ m_delta = delta;
+
+ //if Zero offset, just copy any CLOSED polygons to m_p and return ...
+ if (NEAR_ZERO(delta))
{
- size_t len = m_p[m_i].size();
+ m_destPolys.reserve(m_polyNodes.ChildCount());
+ for (int i = 0; i < m_polyNodes.ChildCount(); i++)
+ {
+ PolyNode& node = *m_polyNodes.Childs[i];
+ if (node.m_endtype == etClosedPolygon)
+ m_destPolys.push_back(node.Contour);
+ }
+ return;
+ }
- if (len == 0 || (len < 3 && Delta <= 0)) continue;
-
- if (len == 1)
+ //see offset_triginometry3.svg in the documentation folder ...
+ if (MiterLimit > 2) m_miterLim = 2/(MiterLimit * MiterLimit);
+ else m_miterLim = 0.5;
+
+ double y;
+ if (ArcTolerance <= 0.0) y = def_arc_tolerance;
+ else if (ArcTolerance > std::fabs(delta) * def_arc_tolerance)
+ y = std::fabs(delta) * def_arc_tolerance;
+ else y = ArcTolerance;
+ //see offset_triginometry2.svg in the documentation folder ...
+ double steps = pi / std::acos(1 - y / std::fabs(delta));
+ if (steps > std::fabs(delta) * pi)
+ steps = std::fabs(delta) * pi; //ie excessive precision check
+ m_sin = std::sin(two_pi / steps);
+ m_cos = std::cos(two_pi / steps);
+ m_StepsPerRad = steps / two_pi;
+ if (delta < 0.0) m_sin = -m_sin;
+
+ m_destPolys.reserve(m_polyNodes.ChildCount() * 2);
+ for (int i = 0; i < m_polyNodes.ChildCount(); i++)
+ {
+ PolyNode& node = *m_polyNodes.Childs[i];
+ m_srcPoly = node.Contour;
+
+ int len = (int)m_srcPoly.size();
+ if (len == 0 || (delta <= 0 && (len < 3 || node.m_endtype != etClosedPolygon)))
+ continue;
+
+ m_destPoly.clear();
+ if (len == 1)
+ {
+ if (node.m_jointype == jtRound)
{
- if (jointype == jtRound)
+ double X = 1.0, Y = 0.0;
+ for (cInt j = 1; j <= steps; j++)
{
- double X = 1.0, Y = 0.0;
- for (cInt j = 1; j <= Round(m_Steps360 * 2 * pi); j++)
- {
- AddPoint(IntPoint(
- Round(m_p[m_i][0].X + X * Delta),
- Round(m_p[m_i][0].Y + Y * Delta)));
- double X2 = X;
- X = X * m_cos - m_sin * Y;
- Y = X2 * m_sin + Y * m_cos;
- }
- } else
+ m_destPoly.push_back(IntPoint(
+ Round(m_srcPoly[0].x + X * delta),
+ Round(m_srcPoly[0].y + Y * delta)));
+ double X2 = X;
+ X = X * m_cos - m_sin * Y;
+ Y = X2 * m_sin + Y * m_cos;
+ }
+ }
+ else
+ {
+ double X = -1.0, Y = -1.0;
+ for (int j = 0; j < 4; ++j)
{
- double X = -1.0, Y = -1.0;
- for (int j = 0; j < 4; ++j)
- {
- AddPoint(IntPoint( Round(m_p[m_i][0].X + X * Delta),
- Round(m_p[m_i][0].Y + Y * Delta)));
- if (X < 0) X = 1;
- else if (Y < 0) Y = 1;
- else X = -1;
- }
+ m_destPoly.push_back(IntPoint(
+ Round(m_srcPoly[0].x + X * delta),
+ Round(m_srcPoly[0].y + Y * delta)));
+ if (X < 0) X = 1;
+ else if (Y < 0) Y = 1;
+ else X = -1;
}
- continue;
}
+ m_destPolys.push_back(m_destPoly);
+ continue;
+ }
+ //build m_normals ...
+ m_normals.clear();
+ m_normals.reserve(len);
+ for (int j = 0; j < len - 1; ++j)
+ m_normals.push_back(GetUnitNormal(m_srcPoly[j], m_srcPoly[j + 1]));
+ if (node.m_endtype == etClosedLine || node.m_endtype == etClosedPolygon)
+ m_normals.push_back(GetUnitNormal(m_srcPoly[len - 1], m_srcPoly[0]));
+ else
+ m_normals.push_back(DoublePoint(m_normals[len - 2]));
- //build normals ...
- normals.clear();
- normals.resize(len);
- for (m_j = 0; m_j < len -1; ++m_j)
- normals[m_j] = GetUnitNormal(m_p[m_i][m_j], m_p[m_i][m_j +1]);
- if (endtype == etClosed)
- normals[len-1] = GetUnitNormal(m_p[m_i][len-1], m_p[m_i][0]);
- else //is open polyline
- normals[len-1] = normals[len-2];
-
- m_curr_poly = &out_polys[m_i];
- m_curr_poly->reserve(len);
+ if (node.m_endtype == etClosedPolygon)
+ {
+ int k = len - 1;
+ for (int j = 0; j < len; ++j)
+ OffsetPoint(j, k, node.m_jointype);
+ m_destPolys.push_back(m_destPoly);
+ }
+ else if (node.m_endtype == etClosedLine)
+ {
+ int k = len - 1;
+ for (int j = 0; j < len; ++j)
+ OffsetPoint(j, k, node.m_jointype);
+ m_destPolys.push_back(m_destPoly);
+ m_destPoly.clear();
+ //re-build m_normals ...
+ DoublePoint n = m_normals[len -1];
+ for (int j = len - 1; j > 0; j--)
+ m_normals[j] = DoublePoint(-m_normals[j - 1].x, -m_normals[j - 1].y);
+ m_normals[0] = DoublePoint(-n.x, -n.y);
+ k = 0;
+ for (int j = len - 1; j >= 0; j--)
+ OffsetPoint(j, k, node.m_jointype);
+ m_destPolys.push_back(m_destPoly);
+ }
+ else
+ {
+ int k = 0;
+ for (int j = 1; j < len - 1; ++j)
+ OffsetPoint(j, k, node.m_jointype);
- if (endtype == etClosed)
+ IntPoint pt1;
+ if (node.m_endtype == etOpenButt)
{
- m_k = len -1;
- for (m_j = 0; m_j < len; ++m_j)
- OffsetPoint(jointype);
+ int j = len - 1;
+ pt1 = IntPoint((cInt)Round(m_srcPoly[j].x + m_normals[j].x *
+ delta), (cInt)Round(m_srcPoly[j].y + m_normals[j].y * delta));
+ m_destPoly.push_back(pt1);
+ pt1 = IntPoint((cInt)Round(m_srcPoly[j].x - m_normals[j].x *
+ delta), (cInt)Round(m_srcPoly[j].y - m_normals[j].y * delta));
+ m_destPoly.push_back(pt1);
}
- else //is open polyline
+ else
{
- //offset the polyline going forward ...
- m_k = 0;
- for (m_j = 1; m_j < len -1; ++m_j)
- OffsetPoint(jointype);
-
- //handle the end (butt, round or square) ...
- IntPoint pt1;
- if (endtype == etButt)
- {
- m_j = len - 1;
- pt1 = IntPoint(Round(m_p[m_i][m_j].X + normals[m_j].X * m_delta),
- Round(m_p[m_i][m_j].Y + normals[m_j].Y * m_delta));
- AddPoint(pt1);
- pt1 = IntPoint(Round(m_p[m_i][m_j].X - normals[m_j].X * m_delta),
- Round(m_p[m_i][m_j].Y - normals[m_j].Y * m_delta));
- AddPoint(pt1);
- }
+ int j = len - 1;
+ k = len - 2;
+ m_sinA = 0;
+ m_normals[j] = DoublePoint(-m_normals[j].x, -m_normals[j].y);
+ if (node.m_endtype == etOpenSquare)
+ DoSquare(j, k);
else
- {
- m_j = len - 1;
- m_k = len - 2;
- m_sinA = 0;
- normals[m_j].X = -normals[m_j].X;
- normals[m_j].Y = -normals[m_j].Y;
- if (endtype == etSquare)
- DoSquare();
- else
- DoRound();
- }
+ DoRound(j, k);
+ }
- //re-build Normals ...
- for (int j = len - 1; j > 0; --j)
- {
- normals[j].X = -normals[j - 1].X;
- normals[j].Y = -normals[j - 1].Y;
- }
- normals[0].X = -normals[1].X;
- normals[0].Y = -normals[1].Y;
+ //re-build m_normals ...
+ for (int j = len - 1; j > 0; j--)
+ m_normals[j] = DoublePoint(-m_normals[j - 1].x, -m_normals[j - 1].y);
+ m_normals[0] = DoublePoint(-m_normals[1].x, -m_normals[1].y);
- //offset the polyline going backward ...
- m_k = len -1;
- for (m_j = m_k - 1; m_j > 0; --m_j)
- OffsetPoint(jointype);
+ k = len - 1;
+ for (int j = k - 1; j > 0; --j) OffsetPoint(j, k, node.m_jointype);
- //finally handle the start (butt, round or square) ...
- if (endtype == etButt)
- {
- pt1 = IntPoint(Round(m_p[m_i][0].X - normals[0].X * m_delta),
- Round(m_p[m_i][0].Y - normals[0].Y * m_delta));
- AddPoint(pt1);
- pt1 = IntPoint(Round(m_p[m_i][0].X + normals[0].X * m_delta),
- Round(m_p[m_i][0].Y + normals[0].Y * m_delta));
- AddPoint(pt1);
- } else
- {
- m_sinA = 0;
- m_k = 1;
- if (endtype == etSquare)
- DoSquare();
- else
- DoRound();
- }
+ if (node.m_endtype == etOpenButt)
+ {
+ pt1 = IntPoint((cInt)Round(m_srcPoly[0].x - m_normals[0].x * delta),
+ (cInt)Round(m_srcPoly[0].y - m_normals[0].y * delta));
+ m_destPoly.push_back(pt1);
+ pt1 = IntPoint((cInt)Round(m_srcPoly[0].x + m_normals[0].x * delta),
+ (cInt)Round(m_srcPoly[0].y + m_normals[0].y * delta));
+ m_destPoly.push_back(pt1);
}
- }
-
- //and clean up untidy corners using Clipper ...
- Clipper clpr;
- clpr.AddPaths(out_polys, ptSubject, true);
- if (Delta > 0)
- {
- if (!clpr.Execute(ctUnion, out_polys, pftPositive, pftPositive))
- out_polys.clear();
- }
- else
- {
- IntRect r = clpr.GetBounds();
- Path outer(4);
- outer[0] = IntPoint(r.left - 10, r.bottom + 10);
- outer[1] = IntPoint(r.right + 10, r.bottom + 10);
- outer[2] = IntPoint(r.right + 10, r.top - 10);
- outer[3] = IntPoint(r.left - 10, r.top - 10);
-
- clpr.AddPath(outer, ptSubject, true);
- clpr.ReverseSolution(true);
- if (clpr.Execute(ctUnion, out_polys, pftNegative, pftNegative))
- out_polys.erase(out_polys.begin());
+ else
+ {
+ k = 1;
+ m_sinA = 0;
+ if (node.m_endtype == etOpenSquare)
+ DoSquare(0, 1);
else
- out_polys.clear();
+ DoRound(0, 1);
+ }
+ m_destPolys.push_back(m_destPoly);
}
+ }
}
//------------------------------------------------------------------------------
-private:
-
-void OffsetPoint(JoinType jointype)
+void ClipperOffset::OffsetPoint(int j, int& k, JoinType jointype)
{
- m_sinA = (normals[m_k].X * normals[m_j].Y - normals[m_j].X * normals[m_k].Y);
- if (std::fabs(m_sinA) < 0.00005) return; //ie collinear
- else if (m_sinA > 1.0) m_sinA = 1.0;
+ //cross product ...
+ m_sinA = (m_normals[k].x * m_normals[j].y - m_normals[j].x * m_normals[k].y);
+ if (std::fabs(m_sinA * m_delta) < 1.0)
+ {
+ //dot product ...
+ double cosA = (m_normals[k].x * m_normals[j].x + m_normals[j].y * m_normals[k].y );
+ if (cosA > 0) // angle => 0 degrees
+ {
+ m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].x + m_normals[k].x * m_delta),
+ Round(m_srcPoly[j].y + m_normals[k].y * m_delta)));
+ return;
+ }
+ //else angle => 180 degrees
+ }
+ else if (m_sinA > 1.0) m_sinA = 1.0;
else if (m_sinA < -1.0) m_sinA = -1.0;
if (m_sinA * m_delta < 0)
{
- AddPoint(IntPoint(Round(m_p[m_i][m_j].X + normals[m_k].X * m_delta),
- Round(m_p[m_i][m_j].Y + normals[m_k].Y * m_delta)));
- AddPoint(m_p[m_i][m_j]);
- AddPoint(IntPoint(Round(m_p[m_i][m_j].X + normals[m_j].X * m_delta),
- Round(m_p[m_i][m_j].Y + normals[m_j].Y * m_delta)));
+ m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].x + m_normals[k].x * m_delta),
+ Round(m_srcPoly[j].y + m_normals[k].y * m_delta)));
+ m_destPoly.push_back(m_srcPoly[j]);
+ m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].x + m_normals[j].x * m_delta),
+ Round(m_srcPoly[j].y + m_normals[j].y * m_delta)));
}
else
switch (jointype)
- {
- case jtMiter:
+ {
+ case jtMiter:
{
- double r = 1 + (normals[m_j].X*normals[m_k].X +
- normals[m_j].Y*normals[m_k].Y);
- if (r >= m_miterLim) DoMiter(r); else DoSquare();
+ double r = 1 + (m_normals[j].x * m_normals[k].x +
+ m_normals[j].y * m_normals[k].y);
+ if (r >= m_miterLim) DoMiter(j, k, r); else DoSquare(j, k);
break;
}
- case jtSquare: DoSquare(); break;
- case jtRound: DoRound(); break;
- }
- m_k = m_j;
-}
-//------------------------------------------------------------------------------
-
-void AddPoint(const IntPoint& Pt)
-{
- if (m_curr_poly->size() == m_curr_poly->capacity())
- m_curr_poly->reserve(m_curr_poly->capacity() + buffLength);
- m_curr_poly->push_back(Pt);
+ case jtSquare: DoSquare(j, k); break;
+ case jtRound: DoRound(j, k); break;
+ }
+ k = j;
}
//------------------------------------------------------------------------------
-void DoSquare()
+void ClipperOffset::DoSquare(int j, int k)
{
- double Dx = std::tan(std::atan2(m_sinA,
- normals[m_k].X * normals[m_j].X + normals[m_k].Y * normals[m_j].Y)/4);
- AddPoint(IntPoint(
- Round(m_p[m_i][m_j].X + m_delta * (normals[m_k].X - normals[m_k].Y *Dx)),
- Round(m_p[m_i][m_j].Y + m_delta * (normals[m_k].Y + normals[m_k].X *Dx))));
- AddPoint(IntPoint(
- Round(m_p[m_i][m_j].X + m_delta * (normals[m_j].X + normals[m_j].Y *Dx)),
- Round(m_p[m_i][m_j].Y + m_delta * (normals[m_j].Y - normals[m_j].X *Dx))));
+ double dx = std::tan(std::atan2(m_sinA,
+ m_normals[k].x * m_normals[j].x + m_normals[k].y * m_normals[j].y) / 4);
+ m_destPoly.push_back(IntPoint(
+ Round(m_srcPoly[j].x + m_delta * (m_normals[k].x - m_normals[k].y * dx)),
+ Round(m_srcPoly[j].y + m_delta * (m_normals[k].y + m_normals[k].x * dx))));
+ m_destPoly.push_back(IntPoint(
+ Round(m_srcPoly[j].x + m_delta * (m_normals[j].x + m_normals[j].y * dx)),
+ Round(m_srcPoly[j].y + m_delta * (m_normals[j].y - m_normals[j].x * dx))));
}
//------------------------------------------------------------------------------
-void DoMiter(double r)
+void ClipperOffset::DoMiter(int j, int k, double r)
{
- double q = m_delta / r;
- AddPoint(IntPoint(Round(m_p[m_i][m_j].X + (normals[m_k].X + normals[m_j].X) * q),
- Round(m_p[m_i][m_j].Y + (normals[m_k].Y + normals[m_j].Y) * q)));
+ double q = m_delta / r;
+ m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].x + (m_normals[k].x + m_normals[j].x) * q),
+ Round(m_srcPoly[j].y + (m_normals[k].y + m_normals[j].y) * q)));
}
//------------------------------------------------------------------------------
-void DoRound()
+void ClipperOffset::DoRound(int j, int k)
{
- double a = std::atan2(m_sinA,
- normals[m_k].X * normals[m_j].X + normals[m_k].Y * normals[m_j].Y);
- int steps = (int)Round(m_Steps360 * std::fabs(a));
+ double a = std::atan2(m_sinA,
+ m_normals[k].x * m_normals[j].x + m_normals[k].y * m_normals[j].y);
+ int steps = std::max((int)Round(m_StepsPerRad * std::fabs(a)), 1);
- double X = normals[m_k].X, Y = normals[m_k].Y, X2;
+ double X = m_normals[k].x, Y = m_normals[k].y, X2;
for (int i = 0; i < steps; ++i)
{
- AddPoint(IntPoint(
- Round(m_p[m_i][m_j].X + X * m_delta),
- Round(m_p[m_i][m_j].Y + Y * m_delta)));
+ m_destPoly.push_back(IntPoint(
+ Round(m_srcPoly[j].x + X * m_delta),
+ Round(m_srcPoly[j].y + Y * m_delta)));
X2 = X;
X = X * m_cos - m_sin * Y;
Y = X2 * m_sin + Y * m_cos;
}
- AddPoint(IntPoint(
- Round(m_p[m_i][m_j].X + normals[m_j].X * m_delta),
- Round(m_p[m_i][m_j].Y + normals[m_j].Y * m_delta)));
+ m_destPoly.push_back(IntPoint(
+ Round(m_srcPoly[j].x + m_normals[j].x * m_delta),
+ Round(m_srcPoly[j].y + m_normals[j].y * m_delta)));
}
-//--------------------------------------------------------------------------
-
-}; //end PolyOffsetBuilder
//------------------------------------------------------------------------------
+// Miscellaneous public functions
//------------------------------------------------------------------------------
-void StripDupsAndGetBotPt(Path& in_path, Path& out_path, bool closed, IntPoint* botPt)
+void Clipper::DoSimplePolygons()
{
- botPt = 0;
- size_t len = in_path.size();
- if (closed)
- while (len > 0 && (in_path[0] == in_path[len -1])) len--;
- if (len == 0) return;
- out_path.resize(len);
- int j = 0;
- out_path[0] = in_path[0];
- botPt = &out_path[0];
- for (size_t i = 1; i < len; ++i)
- if (in_path[i] != out_path[j])
+ PolyOutList::size_type i = 0;
+ while (i < m_PolyOuts.size())
+ {
+ OutRec* outrec = m_PolyOuts[i++];
+ OutPt* op = outrec->Pts;
+ if (!op || outrec->IsOpen) continue;
+ do //for each Pt in Polygon until duplicate found do ...
{
- j++;
- out_path[j] = in_path[i];
- if (out_path[j].Y > botPt->Y)
- botPt = &out_path[j];
- else if ((out_path[j].Y == botPt->Y) && out_path[j].X < botPt->X)
- botPt = &out_path[j];
+ OutPt* op2 = op->Next;
+ while (op2 != outrec->Pts)
+ {
+ if ((op->Pt == op2->Pt) && op2->Next != op && op2->Prev != op)
+ {
+ //split the polygon into two ...
+ OutPt* op3 = op->Prev;
+ OutPt* op4 = op2->Prev;
+ op->Prev = op4;
+ op4->Next = op;
+ op2->Prev = op3;
+ op3->Next = op2;
+
+ outrec->Pts = op;
+ OutRec* outrec2 = CreateOutRec();
+ outrec2->Pts = op2;
+ UpdateOutPtIdxs(*outrec2);
+ if (Poly2ContainsPoly1(outrec2->Pts, outrec->Pts))
+ {
+ //OutRec2 is contained by OutRec1 ...
+ outrec2->IsHole = !outrec->IsHole;
+ outrec2->FirstLeft = outrec;
+ if (m_UsingPolyTree) FixupFirstLefts2(outrec2, outrec);
+ }
+ else
+ if (Poly2ContainsPoly1(outrec->Pts, outrec2->Pts))
+ {
+ //OutRec1 is contained by OutRec2 ...
+ outrec2->IsHole = outrec->IsHole;
+ outrec->IsHole = !outrec2->IsHole;
+ outrec2->FirstLeft = outrec->FirstLeft;
+ outrec->FirstLeft = outrec2;
+ if (m_UsingPolyTree) FixupFirstLefts2(outrec, outrec2);
+ }
+ else
+ {
+ //the 2 polygons are separate ...
+ outrec2->IsHole = outrec->IsHole;
+ outrec2->FirstLeft = outrec->FirstLeft;
+ if (m_UsingPolyTree) FixupFirstLefts1(outrec, outrec2);
+ }
+ op2 = op; //ie get ready for the Next iteration
+ }
+ op2 = op2->Next;
+ }
+ op = op->Next;
}
- j++;
- if (j < 2 || (closed && (j == 2))) j = 0;
- out_path.resize(j);
+ while (op != outrec->Pts);
+ }
}
//------------------------------------------------------------------------------
-void OffsetPaths(const Paths &in_polys, Paths &out_polys,
- double delta, JoinType jointype, EndType endtype, double limit)
+void ReversePath(Path& p)
{
- //just in case in_polys == &out_polys ...
- Paths inPolys = Paths(in_polys);
- out_polys.clear();
- out_polys.resize(inPolys.size());
-
- IntPoint *botPt = 0, *pt = 0;
- int botIdx = -1;
- for (size_t i = 0; i < in_polys.size(); ++i)
- {
- StripDupsAndGetBotPt(inPolys[i], out_polys[i], endtype == etClosed, pt);
- if (botPt)
- if (!botPt || pt->Y > botPt->Y || (pt->Y == botPt->Y && pt->X < botPt->X))
- {
- botPt = pt;
- botIdx = i;
- }
+ std::reverse(p.begin(), p.end());
+}
+//------------------------------------------------------------------------------
- }
- if (endtype == etClosed && botIdx >= 0 && !Orientation(inPolys[botIdx]))
- ReversePaths(inPolys);
+void ReversePaths(Paths& p)
+{
+ for (Paths::size_type i = 0; i < p.size(); ++i)
+ ReversePath(p[i]);
+}
+//------------------------------------------------------------------------------
- OffsetBuilder(inPolys, out_polys, delta, jointype, endtype, limit);
+void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType)
+{
+ Clipper c;
+ c.StrictlySimple(true);
+ c.AddPath(in_poly, ptSubject, true);
+ c.Execute(ctUnion, out_polys, fillType, fillType);
}
//------------------------------------------------------------------------------
@@ -4360,73 +4262,131 @@ void SimplifyPolygons(Paths &polys, PolyFillType fillType)
inline double DistanceSqrd(const IntPoint& pt1, const IntPoint& pt2)
{
- double Dx = ((double)pt1.X - pt2.X);
- double dy = ((double)pt1.Y - pt2.Y);
+ double Dx = ((double)pt1.x - pt2.x);
+ double dy = ((double)pt1.y - pt2.y);
return (Dx*Dx + dy*dy);
}
//------------------------------------------------------------------------------
-DoublePoint ClosestPointOnLine(const IntPoint& Pt, const IntPoint& linePt1, const IntPoint& linePt2)
+double DistanceFromLineSqrd(
+ const IntPoint& pt, const IntPoint& ln1, const IntPoint& ln2)
{
- double Dx = ((double)linePt2.X - linePt1.X);
- double dy = ((double)linePt2.Y - linePt1.Y);
- if (Dx == 0 && dy == 0)
- return DoublePoint((double)linePt1.X, (double)linePt1.Y);
- double q = ((Pt.X-linePt1.X)*Dx + (Pt.Y-linePt1.Y)*dy) / (Dx*Dx + dy*dy);
- return DoublePoint(
- (1-q)*linePt1.X + q*linePt2.X,
- (1-q)*linePt1.Y + q*linePt2.Y);
+ //The equation of a line in general form (Ax + By + C = 0)
+ //given 2 points (x�,y�) & (x�,y�) is ...
+ //(y� - y�)x + (x� - x�)y + (y� - y�)x� - (x� - x�)y� = 0
+ //A = (y� - y�); B = (x� - x�); C = (y� - y�)x� - (x� - x�)y�
+ //perpendicular distance of point (x�,y�) = (Ax� + By� + C)/Sqrt(A� + B�)
+ //see http://en.wikipedia.org/wiki/Perpendicular_distance
+ double A = double(ln1.y - ln2.y);
+ double B = double(ln2.x - ln1.x);
+ double C = A * ln1.x + B * ln1.y;
+ C = A * pt.x + B * pt.y - C;
+ return (C * C) / (A * A + B * B);
}
-//------------------------------------------------------------------------------
+//---------------------------------------------------------------------------
bool SlopesNearCollinear(const IntPoint& pt1,
const IntPoint& pt2, const IntPoint& pt3, double distSqrd)
{
- if (DistanceSqrd(pt1, pt2) > DistanceSqrd(pt1, pt3)) return false;
- DoublePoint cpol = ClosestPointOnLine(pt2, pt1, pt3);
- double Dx = pt2.X - cpol.X;
- double dy = pt2.Y - cpol.Y;
- return (Dx*Dx + dy*dy) < distSqrd;
+ //this function is more accurate when the point that's geometrically
+ //between the other 2 points is the one that's tested for distance.
+ //ie makes it more likely to pick up 'spikes' ...
+ if (Abs(pt1.x - pt2.x) > Abs(pt1.y - pt2.y))
+ {
+ if ((pt1.x > pt2.x) == (pt1.x < pt3.x))
+ return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd;
+ else if ((pt2.x > pt1.x) == (pt2.x < pt3.x))
+ return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd;
+ else
+ return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd;
+ }
+ else
+ {
+ if ((pt1.y > pt2.y) == (pt1.y < pt3.y))
+ return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd;
+ else if ((pt2.y > pt1.y) == (pt2.y < pt3.y))
+ return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd;
+ else
+ return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd;
+ }
}
//------------------------------------------------------------------------------
bool PointsAreClose(IntPoint pt1, IntPoint pt2, double distSqrd)
{
- double Dx = (double)pt1.X - pt2.X;
- double dy = (double)pt1.Y - pt2.Y;
+ double Dx = (double)pt1.x - pt2.x;
+ double dy = (double)pt1.y - pt2.y;
return ((Dx * Dx) + (dy * dy) <= distSqrd);
}
//------------------------------------------------------------------------------
+OutPt* ExcludeOp(OutPt* op)
+{
+ OutPt* result = op->Prev;
+ result->Next = op->Next;
+ op->Next->Prev = result;
+ result->Idx = 0;
+ return result;
+}
+//------------------------------------------------------------------------------
+
void CleanPolygon(const Path& in_poly, Path& out_poly, double distance)
{
//distance = proximity in units/pixels below which vertices
//will be stripped. Default ~= sqrt(2).
- int highI = in_poly.size() -1;
- double distSqrd = distance * distance;
- while (highI > 0 && PointsAreClose(in_poly[highI], in_poly[0], distSqrd)) highI--;
- if (highI < 2) { out_poly.clear(); return; }
- if (&in_poly != &out_poly)
- out_poly.resize(highI + 1);
+ size_t size = in_poly.size();
+
+ if (size == 0)
+ {
+ out_poly.clear();
+ return;
+ }
- IntPoint Pt = in_poly[highI];
- int i = 0, k = 0;
- for (;;)
+ OutPt* outPts = new OutPt[size];
+ for (size_t i = 0; i < size; ++i)
{
- while (i < highI && PointsAreClose(Pt, in_poly[i+1], distSqrd)) i+=2;
- int i2 = i;
- while (i < highI && (PointsAreClose(in_poly[i], in_poly[i+1], distSqrd) ||
- SlopesNearCollinear(Pt, in_poly[i], in_poly[i+1], distSqrd))) i++;
- if (i >= highI) break;
- else if (i != i2) continue;
- Pt = in_poly[i++];
- out_poly[k++] = Pt;
+ outPts[i].Pt = in_poly[i];
+ outPts[i].Next = &outPts[(i + 1) % size];
+ outPts[i].Next->Prev = &outPts[i];
+ outPts[i].Idx = 0;
}
- if (i <= highI) out_poly[k++] = in_poly[i];
- if (k > 2 && SlopesNearCollinear(out_poly[k -2], out_poly[k -1], out_poly[0], distSqrd)) k--;
- if (k < 3) out_poly.clear();
- else if (k <= highI) out_poly.resize(k);
+
+ double distSqrd = distance * distance;
+ OutPt* op = &outPts[0];
+ while (op->Idx == 0 && op->Next != op->Prev)
+ {
+ if (PointsAreClose(op->Pt, op->Prev->Pt, distSqrd))
+ {
+ op = ExcludeOp(op);
+ size--;
+ }
+ else if (PointsAreClose(op->Prev->Pt, op->Next->Pt, distSqrd))
+ {
+ ExcludeOp(op->Next);
+ op = ExcludeOp(op);
+ size -= 2;
+ }
+ else if (SlopesNearCollinear(op->Prev->Pt, op->Pt, op->Next->Pt, distSqrd))
+ {
+ op = ExcludeOp(op);
+ size--;
+ }
+ else
+ {
+ op->Idx = 1;
+ op = op->Next;
+ }
+ }
+
+ if (size < 3) size = 0;
+ out_poly.resize(size);
+ for (size_t i = 0; i < size; ++i)
+ {
+ out_poly[i] = op->Pt;
+ op = op->Next;
+ }
+ delete [] outPts;
}
//------------------------------------------------------------------------------
@@ -4449,7 +4409,7 @@ void CleanPolygons(Paths& polys, double distance)
}
//------------------------------------------------------------------------------
-void Minkowki(const Path& poly, const Path& path,
+void Minkowski(const Path& poly, const Path& path,
Paths& solution, bool isSum, bool isClosed)
{
int delta = (isClosed ? 1 : 0);
@@ -4463,7 +4423,7 @@ void Minkowki(const Path& poly, const Path& path,
Path p;
p.reserve(polyCnt);
for (size_t j = 0; j < poly.size(); ++j)
- p.push_back(IntPoint(path[i].X + poly[j].X, path[i].Y + poly[j].Y));
+ p.push_back(IntPoint(path[i].x + poly[j].x, path[i].y + poly[j].y));
pp.push_back(p);
}
else
@@ -4472,14 +4432,14 @@ void Minkowki(const Path& poly, const Path& path,
Path p;
p.reserve(polyCnt);
for (size_t j = 0; j < poly.size(); ++j)
- p.push_back(IntPoint(path[i].X - poly[j].X, path[i].Y - poly[j].Y));
+ p.push_back(IntPoint(path[i].x - poly[j].x, path[i].y - poly[j].y));
pp.push_back(p);
}
- Paths quads;
- quads.reserve((pathCnt + delta) * (polyCnt + 1));
- for (size_t i = 0; i <= pathCnt - 2 + delta; ++i)
- for (size_t j = 0; j <= polyCnt - 1; ++j)
+ solution.clear();
+ solution.reserve((pathCnt + delta) * (polyCnt + 1));
+ for (size_t i = 0; i < pathCnt - 1 + delta; ++i)
+ for (size_t j = 0; j < polyCnt; ++j)
{
Path quad;
quad.reserve(4);
@@ -4488,30 +4448,60 @@ void Minkowki(const Path& poly, const Path& path,
quad.push_back(pp[(i + 1) % pathCnt][(j + 1) % polyCnt]);
quad.push_back(pp[i % pathCnt][(j + 1) % polyCnt]);
if (!Orientation(quad)) ReversePath(quad);
- quads.push_back(quad);
+ solution.push_back(quad);
}
+}
+//------------------------------------------------------------------------------
+void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed)
+{
+ Minkowski(pattern, path, solution, true, pathIsClosed);
Clipper c;
- c.AddPaths(quads, ptSubject, true);
+ c.AddPaths(solution, ptSubject, true);
c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
}
//------------------------------------------------------------------------------
-void MinkowkiSum(const Path& poly, const Path& path, Paths& solution, bool isClosed)
+void TranslatePath(const Path& input, Path& output, const IntPoint delta)
{
- Minkowki(poly, path, solution, true, isClosed);
+ //precondition: input != output
+ output.resize(input.size());
+ for (size_t i = 0; i < input.size(); ++i)
+ output[i] = IntPoint(input[i].x + delta.x, input[i].y + delta.y);
}
//------------------------------------------------------------------------------
-void MinkowkiDiff(const Path& poly, const Path& path, Paths& solution, bool isClosed)
+void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed)
{
- Minkowki(poly, path, solution, false, isClosed);
+ Clipper c;
+ for (size_t i = 0; i < paths.size(); ++i)
+ {
+ Paths tmp;
+ Minkowski(pattern, paths[i], tmp, true, pathIsClosed);
+ c.AddPaths(tmp, ptSubject, true);
+ if (pathIsClosed)
+ {
+ Path tmp2;
+ TranslatePath(paths[i], tmp2, pattern[0]);
+ c.AddPath(tmp2, ptClip, true);
+ }
+ }
+ c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
+}
+//------------------------------------------------------------------------------
+
+void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution)
+{
+ Minkowski(poly1, poly2, solution, false, true);
+ Clipper c;
+ c.AddPaths(solution, ptSubject, true);
+ c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
}
//------------------------------------------------------------------------------
enum NodeType {ntAny, ntOpen, ntClosed};
-void AddPolyNodeToPolygons(const PolyNode& polynode, NodeType nodetype, Paths& paths)
+void AddPolyNodeToPaths(const PolyNode& polynode, NodeType nodetype, Paths& paths)
{
bool match = true;
if (nodetype == ntClosed) match = !polynode.IsOpen();
@@ -4520,7 +4510,7 @@ void AddPolyNodeToPolygons(const PolyNode& polynode, NodeType nodetype, Paths& p
if (!polynode.Contour.empty() && match)
paths.push_back(polynode.Contour);
for (int i = 0; i < polynode.ChildCount(); ++i)
- AddPolyNodeToPolygons(*polynode.Childs[i], nodetype, paths);
+ AddPolyNodeToPaths(*polynode.Childs[i], nodetype, paths);
}
//------------------------------------------------------------------------------
@@ -4528,7 +4518,7 @@ void PolyTreeToPaths(const PolyTree& polytree, Paths& paths)
{
paths.resize(0);
paths.reserve(polytree.Total());
- AddPolyNodeToPolygons(polytree, ntAny, paths);
+ AddPolyNodeToPaths(polytree, ntAny, paths);
}
//------------------------------------------------------------------------------
@@ -4536,7 +4526,7 @@ void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths)
{
paths.resize(0);
paths.reserve(polytree.Total());
- AddPolyNodeToPolygons(polytree, ntClosed, paths);
+ AddPolyNodeToPaths(polytree, ntClosed, paths);
}
//------------------------------------------------------------------------------
@@ -4553,7 +4543,7 @@ void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths)
std::ostream& operator <<(std::ostream &s, const IntPoint &p)
{
- s << "(" << p.X << "," << p.Y << ")";
+ s << "(" << p.x << "," << p.y << ")";
return s;
}
//------------------------------------------------------------------------------
@@ -4563,8 +4553,8 @@ std::ostream& operator <<(std::ostream &s, const Path &p)
if (p.empty()) return s;
Path::size_type last = p.size() -1;
for (Path::size_type i = 0; i < last; i++)
- s << "(" << p[i].X << "," << p[i].Y << "), ";
- s << "(" << p[last].X << "," << p[last].Y << ")\n";
+ s << "(" << p[i].x << "," << p[i].y << "), ";
+ s << "(" << p[last].x << "," << p[last].y << ")\n";
return s;
}
//------------------------------------------------------------------------------
@@ -4578,47 +4568,4 @@ std::ostream& operator <<(std::ostream &s, const Paths &p)
}
//------------------------------------------------------------------------------
-#ifdef use_deprecated
-bool ClipperBase::AddPolygon(const Path &pg, PolyType PolyTyp)
-{
- return AddPath(pg, PolyTyp, true);
-}
-//------------------------------------------------------------------------------
-
-bool ClipperBase::AddPolygons(const Paths &ppg, PolyType PolyTyp)
-{
- bool result = false;
- for (Paths::size_type i = 0; i < ppg.size(); ++i)
- if (AddPath(ppg[i], PolyTyp, true)) result = true;
- return result;
-}
-//------------------------------------------------------------------------------
-
-void OffsetPolygons(const Polygons &in_polys, Polygons &out_polys,
- double delta, JoinType jointype, double limit, bool autoFix)
-{
- OffsetPaths(in_polys, out_polys, delta, jointype, etClosed, limit);
-}
-//------------------------------------------------------------------------------
-
-void PolyTreeToPolygons(const PolyTree& polytree, Paths& paths)
-{
- PolyTreeToPaths(polytree, paths);
-}
-//------------------------------------------------------------------------------
-
-void ReversePolygon(Path& p)
-{
- std::reverse(p.begin(), p.end());
-}
-//------------------------------------------------------------------------------
-
-void ReversePolygons(Paths& p)
-{
- for (Paths::size_type i = 0; i < p.size(); ++i)
- ReversePolygon(p[i]);
-}
-#endif
-
-
} //ClipperLib namespace
diff --git a/deps/mapnik/sparsehash/internal/densehashtable.h b/deps/mapnik/sparsehash/internal/densehashtable.h
index d4495ed..c0a2fed 100644
--- a/deps/mapnik/sparsehash/internal/densehashtable.h
+++ b/deps/mapnik/sparsehash/internal/densehashtable.h
@@ -1175,7 +1175,7 @@ class dense_hashtable {
pointer realloc_or_die(pointer /*ptr*/, size_type /*n*/) {
fprintf(stderr, "realloc_or_die is only supported for "
"libc_allocator_with_realloc\n");
- exit(1);
+ //exit(1);
return NULL;
}
};
@@ -1197,7 +1197,7 @@ class dense_hashtable {
if (retval == NULL) {
fprintf(stderr, "sparsehash: FATAL ERROR: failed to reallocate "
"%lu elements for ptr %p", static_cast<unsigned long>(n), ptr);
- exit(1);
+ //exit(1);
}
return retval;
}
diff --git a/docs/contributing.markdown b/docs/contributing.markdown
index 7130880..e7f3279 100644
--- a/docs/contributing.markdown
+++ b/docs/contributing.markdown
@@ -1,5 +1,41 @@
# Contributing
+## Testing
+
+Developers adding new features or fixing bugs should always write tests alongside.
+
+Mapnik has both C++ unit tests in `./test/unit` and visual tests in `./test/visual`.
+
+Test data for the unit and visual tests is pulled in from standalone repos via git submodules.
+
+After building Mapnik (see INSTALL.md), the submodules can be loaded and the tests can be run like:
+
+ make test
+
+Developers with commit access can update test data like:
+
+ cd test/data
+ git remote set-url origin git at github.com:mapnik/test-data
+ git commit -a -m "update test data"
+ git push origin HEAD:master
+
+And the visual test data can up updated like:
+
+ cd test/data-visual
+ git remote set-url origin git at github.com:mapnik/test-data-visual
+ git add styles/* images/*
+ git commit -a -m "add more visual tests"
+ git push origin HEAD:master
+
+After updating the test data you can then do:
+
+ # then go back to mapnik core
+ cd ../../
+ # the submodule should be marked dirty
+ git status
+ # now commit the changes to the submodule
+ git commit test/data test/data-visual -m "update visual tests and data"
+
## Community
Mapnik is a creative community focused on making beautiful maps with beautiful software.
@@ -85,6 +121,21 @@ Mapnik is written in C++, and we try to follow general coding guidelines.
If you see bits of code around that do not follow these please don't hesitate to flag the issue or correct it yourself.
+#### Prefix cmath functions with std::
+
+The avoids ambiguity and potential bugs of using old C library math directly.
+
+So always do `std::abs()` instead of `abs()`. Here is a script to fix your code in one fell swoop:
+
+
+```sh
+DIR=./bindings
+for i in {abs,fabs,tan,sin,cos,floor,ceil,atan2,acos,asin}; do
+ find $DIR -type f -name '*.cpp' -or -name '*.h' -or -name '*.hpp' | xargs perl -i -p -e "s/ $i\(/ std::$i\(/g;"
+ find $DIR -type f -name '*.cpp' -or -name '*.h' -or -name '*.hpp' | xargs perl -i -p -e "s/\($i\(/\(std::$i\(/g;"
+done
+```
+
#### Avoid boost::lexical_cast
It's slow both to compile and at runtime.
@@ -118,6 +169,9 @@ which triggers locks
void my_function(std::string const& val); // if std::string or user type, pass by const&
+#### Use unique_ptr instead of new/delete
+
+#### Use std::copy instead of memcpy
#### When to use shared_ptr and unique_ptr
diff --git a/include/mapnik/agg_helpers.hpp b/include/mapnik/agg_helpers.hpp
index c3bc759..8e2b1b2 100644
--- a/include/mapnik/agg_helpers.hpp
+++ b/include/mapnik/agg_helpers.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/agg_pattern_source.hpp b/include/mapnik/agg_pattern_source.hpp
index 14a1c33..1c56739 100644
--- a/include/mapnik/agg_pattern_source.hpp
+++ b/include/mapnik/agg_pattern_source.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,8 +24,8 @@
#define MAPNIK_AGG_PATTERN_SOURCE_HPP
// mapnik
-#include <mapnik/image_data.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/image.hpp>
+#include <mapnik/util/noncopyable.hpp>
// agg
#include "agg_color_rgba.h"
@@ -33,10 +33,10 @@
namespace mapnik
{
-class pattern_source : private mapnik::noncopyable
+class pattern_source : private util::noncopyable
{
public:
- pattern_source(image_data_32 const& pattern, double opacity = 1.0)
+ pattern_source(image_rgba8 const& pattern, double opacity = 1.0)
: pattern_(pattern),
opacity_(opacity) {}
@@ -57,7 +57,7 @@ public:
static_cast<unsigned>(((c >> 24) & 0xff) * opacity_));
}
private:
- image_data_32 const& pattern_;
+ image_rgba8 const& pattern_;
double opacity_;
};
}
diff --git a/include/mapnik/agg_rasterizer.hpp b/include/mapnik/agg_rasterizer.hpp
index 5e82f03..0232f88 100644
--- a/include/mapnik/agg_rasterizer.hpp
+++ b/include/mapnik/agg_rasterizer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,14 +24,14 @@
#define MAPNIK_AGG_RASTERIZER_HPP
// mapnik
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// agg
#include "agg_rasterizer_scanline_aa.h"
namespace mapnik {
-struct rasterizer : agg::rasterizer_scanline_aa<agg::rasterizer_sl_clip_int_sat>, mapnik::noncopyable {};
+struct rasterizer : agg::rasterizer_scanline_aa<agg::rasterizer_sl_clip_int_sat>, util::noncopyable {};
}
diff --git a/include/mapnik/agg_render_marker.hpp b/include/mapnik/agg_render_marker.hpp
new file mode 100644
index 0000000..bbe70a4
--- /dev/null
+++ b/include/mapnik/agg_render_marker.hpp
@@ -0,0 +1,147 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#include <mapnik/color.hpp>
+#include <mapnik/feature.hpp>
+#include <mapnik/geom_util.hpp>
+#include <mapnik/svg/svg_path_attributes.hpp>
+#include <mapnik/svg/svg_converter.hpp>
+#include <mapnik/vertex_converters.hpp>
+#include <mapnik/box2d.hpp>
+
+// agg
+#include "agg_color_rgba.h"
+#include "agg_renderer_base.h"
+#include "agg_renderer_scanline.h"
+#include "agg_rendering_buffer.h"
+#include "agg_scanline_u.h"
+#include "agg_image_filters.h"
+#include "agg_trans_affine.h"
+#include "agg_span_allocator.h"
+#include "agg_image_accessors.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_span_image_filter_rgba.h"
+#include "agg_span_interpolator_linear.h"
+
+namespace mapnik {
+
+template <typename SvgRenderer, typename RasterizerType, typename RendererBaseType>
+void render_vector_marker(SvgRenderer & svg_renderer, RasterizerType & ras, RendererBaseType & renb,
+ box2d<double> const& bbox, agg::trans_affine const& tr,
+ double opacity, bool snap_to_pixels)
+{
+ agg::scanline_u8 sl;
+ if (snap_to_pixels)
+ {
+ // https://github.com/mapnik/mapnik/issues/1316
+ agg::trans_affine snap_tr = tr;
+ snap_tr.tx = std::floor(snap_tr.tx + .5);
+ snap_tr.ty = std::floor(snap_tr.ty + .5);
+ svg_renderer.render(ras, sl, renb, snap_tr, opacity, bbox);
+ }
+ else
+ {
+ svg_renderer.render(ras, sl, renb, tr, opacity, bbox);
+ }
+}
+
+template <typename RendererType, typename RasterizerType>
+void render_raster_marker(RendererType renb, RasterizerType & ras, image_rgba8 const& src,
+ agg::trans_affine const& tr, double opacity,
+ float scale_factor, bool snap_to_pixels)
+{
+ using color_type = agg::rgba8;
+ using pixfmt_pre = agg::pixfmt_rgba32_pre;
+ agg::scanline_u8 sl;
+ double width = src.width();
+ double height = src.height();
+ if (std::fabs(1.0 - scale_factor) < 0.001
+ && (std::fabs(1.0 - tr.sx) < agg::affine_epsilon)
+ && (std::fabs(0.0 - tr.shy) < agg::affine_epsilon)
+ && (std::fabs(0.0 - tr.shx) < agg::affine_epsilon)
+ && (std::fabs(1.0 - tr.sy) < agg::affine_epsilon))
+ {
+ agg::rendering_buffer src_buffer((unsigned char *)src.bytes(),src.width(),src.height(),src.row_size());
+ pixfmt_pre pixf_mask(src_buffer);
+ if (snap_to_pixels)
+ {
+ renb.blend_from(pixf_mask,
+ 0,
+ std::floor(tr.tx + .5),
+ std::floor(tr.ty + .5),
+ unsigned(255*opacity));
+ }
+ else
+ {
+ renb.blend_from(pixf_mask,
+ 0,
+ tr.tx,
+ tr.ty,
+ unsigned(255*opacity));
+ }
+ }
+ else
+ {
+ using img_accessor_type = agg::image_accessor_clone<pixfmt_pre>;
+ using interpolator_type = agg::span_interpolator_linear<>;
+ //using span_gen_type = agg::span_image_filter_rgba_2x2<img_accessor_type,interpolator_type>;
+ using span_gen_type = agg::span_image_resample_rgba_affine<img_accessor_type>;
+ using renderer_type = agg::renderer_scanline_aa_alpha<RendererType,
+ agg::span_allocator<color_type>,
+ span_gen_type>;
+
+ double p[8];
+ p[0] = 0; p[1] = 0;
+ p[2] = width; p[3] = 0;
+ p[4] = width; p[5] = height;
+ p[6] = 0; p[7] = height;
+ tr.transform(&p[0], &p[1]);
+ tr.transform(&p[2], &p[3]);
+ tr.transform(&p[4], &p[5]);
+ tr.transform(&p[6], &p[7]);
+ agg::span_allocator<color_type> sa;
+ agg::image_filter_lut filter;
+ filter.calculate(agg::image_filter_bilinear(), true);
+ agg::rendering_buffer marker_buf((unsigned char *)src.bytes(),
+ src.width(),
+ src.height(),
+ src.row_size());
+ pixfmt_pre pixf(marker_buf);
+ img_accessor_type ia(pixf);
+ agg::trans_affine final_tr(p, 0, 0, width, height);
+ if (snap_to_pixels)
+ {
+ final_tr.tx = std::floor(final_tr.tx+.5);
+ final_tr.ty = std::floor(final_tr.ty+.5);
+ }
+ interpolator_type interpolator(final_tr);
+ span_gen_type sg(ia, interpolator, filter);
+ renderer_type rp(renb, sa, sg, unsigned(opacity*255));
+ ras.move_to_d(p[0],p[1]);
+ ras.line_to_d(p[2],p[3]);
+ ras.line_to_d(p[4],p[5]);
+ ras.line_to_d(p[6],p[7]);
+ agg::render_scanlines(ras, sl, rp);
+ }
+}
+
+}
diff --git a/include/mapnik/agg_renderer.hpp b/include/mapnik/agg_renderer.hpp
index 627ee61..4f3996b 100644
--- a/include/mapnik/agg_renderer.hpp
+++ b/include/mapnik/agg_renderer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,17 +26,15 @@
// mapnik
#include <mapnik/config.hpp> // for MAPNIK_DECL
#include <mapnik/feature_style_processor.hpp>
-#include <mapnik/noncopyable.hpp> // for noncopyable
+#include <mapnik/util/noncopyable.hpp> // for noncopyable
#include <mapnik/rule.hpp> // for rule, symbolizers
#include <mapnik/box2d.hpp> // for box2d
-#include <mapnik/color.hpp> // for color
#include <mapnik/view_transform.hpp> // for view_transform
#include <mapnik/image_compositing.hpp> // for composite_mode_e
#include <mapnik/pixel_position.hpp>
#include <mapnik/request.hpp>
#include <mapnik/symbolizer_enumerations.hpp>
#include <mapnik/renderer_common.hpp>
-#include <mapnik/image_data.hpp>
// stl
#include <memory>
@@ -50,17 +48,19 @@ namespace mapnik {
class feature_type_style;
class label_collision_detector4;
class layer;
- class marker;
+ class color;
+ struct marker;
class proj_transform;
struct rasterizer;
- class image_32;
+ struct rgba8_t;
+ template<typename T> class image;
}
namespace mapnik {
template <typename T0, typename T1=label_collision_detector4>
class MAPNIK_DECL agg_renderer : public feature_style_processor<agg_renderer<T0> >,
- private mapnik::noncopyable
+ private util::noncopyable
{
public:
@@ -122,6 +122,9 @@ public:
void process(debug_symbolizer const& sym,
feature_impl & feature,
proj_transform const& prj_trans);
+ void process(dot_symbolizer const& sym,
+ mapnik::feature_impl & feature,
+ proj_transform const& prj_trans);
inline bool process(rule::symbolizers const&,
mapnik::feature_impl&,
@@ -168,7 +171,7 @@ private:
void setup(Map const& m);
};
-extern template class MAPNIK_DECL agg_renderer<image_32>;
+extern template class MAPNIK_DECL agg_renderer<image<rgba8_t>>;
} // namespace mapnik
diff --git a/include/mapnik/attribute.hpp b/include/mapnik/attribute.hpp
index 9716b38..65b87b9 100644
--- a/include/mapnik/attribute.hpp
+++ b/include/mapnik/attribute.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,7 +26,7 @@
// mapnik
#include <mapnik/value_types.hpp>
#include <mapnik/value.hpp>
-
+#include <mapnik/util/geometry_to_ds_type.hpp>
// stl
#include <string>
#include <unordered_map>
@@ -53,16 +53,7 @@ struct geometry_type_attribute
template <typename V, typename F>
V value(F const& f) const
{
- mapnik::value_integer type = 0;
- for (auto const& geom : f.paths())
- {
- if (type != 0 && geom.type() != type)
- {
- return value_integer(4); // Collection
- }
- type = geom.type();
- }
- return type;
+ return static_cast<mapnik::value_integer>(util::to_ds_type(f.get_geometry()));
}
};
diff --git a/include/mapnik/attribute_collector.hpp b/include/mapnik/attribute_collector.hpp
index 7ed8024..9f2e815 100644
--- a/include/mapnik/attribute_collector.hpp
+++ b/include/mapnik/attribute_collector.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,7 @@
// mapnik
#include <mapnik/transform_processor.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/attribute.hpp>
#include <mapnik/symbolizer.hpp>
#include <mapnik/expression.hpp> // for expression_ptr, etc
@@ -52,7 +52,7 @@
namespace mapnik {
template <typename Container>
-struct expression_attributes : util::static_visitor<void>
+struct expression_attributes
{
explicit expression_attributes(Container& names)
: names_(names) {}
@@ -92,7 +92,7 @@ private:
Container& names_;
};
-class group_attribute_collector : public mapnik::noncopyable
+class group_attribute_collector : public util::noncopyable
{
private:
std::set<std::string>& names_;
@@ -107,7 +107,7 @@ public:
};
template <typename Container>
-struct extract_attribute_names : util::static_visitor<void>
+struct extract_attribute_names
{
explicit extract_attribute_names(Container& names)
: names_(names),
@@ -159,7 +159,7 @@ private:
expression_attributes<std::set<std::string> > f_attr_;
};
-struct symbolizer_attributes : public util::static_visitor<>
+struct symbolizer_attributes
{
symbolizer_attributes(std::set<std::string>& names,
double & filter_factor)
@@ -209,7 +209,7 @@ private:
};
-class attribute_collector : public mapnik::noncopyable
+class attribute_collector : public util::noncopyable
{
private:
std::set<std::string> & names_;
diff --git a/include/mapnik/attribute_descriptor.hpp b/include/mapnik/attribute_descriptor.hpp
index 70368ea..1656cbb 100644
--- a/include/mapnik/attribute_descriptor.hpp
+++ b/include/mapnik/attribute_descriptor.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -46,16 +46,16 @@ public:
int precision=-1)
: name_(name),
type_(type),
- primary_key_(primary_key),
size_(size),
- precision_(precision) {}
+ precision_(precision),
+ primary_key_(primary_key) {}
attribute_descriptor(attribute_descriptor const& other)
: name_(other.name_),
type_(other.type_),
- primary_key_(other.primary_key_),
size_(other.size_),
- precision_(other.precision_) {}
+ precision_(other.precision_),
+ primary_key_(other.primary_key_) {}
attribute_descriptor& operator=(attribute_descriptor const& other)
{
@@ -67,9 +67,9 @@ public:
{
name_=other.name_;
type_=other.type_;
- primary_key_=other.primary_key_;
size_=other.size_;
precision_=other.precision_;
+ primary_key_=other.primary_key_;
return *this;
}
}
@@ -102,9 +102,9 @@ public:
private:
std::string name_;
unsigned int type_;
- bool primary_key_;
int size_;
int precision_;
+ bool primary_key_;
};
}
diff --git a/include/mapnik/boolean.hpp b/include/mapnik/boolean.hpp
index bbee2b5..171cbd7 100644
--- a/include/mapnik/boolean.hpp
+++ b/include/mapnik/boolean.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -28,10 +28,7 @@
// std
#include <iosfwd>
-#include <algorithm>
#include <string>
-//#include <istream>
-//#include <ostream>
namespace mapnik
{
diff --git a/include/mapnik/box2d.hpp b/include/mapnik/box2d.hpp
index b3bb22f..e6fc2a9 100644
--- a/include/mapnik/box2d.hpp
+++ b/include/mapnik/box2d.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/cairo/cairo_context.hpp b/include/mapnik/cairo/cairo_context.hpp
index 93b8128..f4ca72a 100644
--- a/include/mapnik/cairo/cairo_context.hpp
+++ b/include/mapnik/cairo/cairo_context.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,13 +27,14 @@
// mapnik
#include <mapnik/debug.hpp>
#include <mapnik/color.hpp>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
+#include <mapnik/image_any.hpp>
#include <mapnik/image_compositing.hpp>
#include <mapnik/font_engine_freetype.hpp>
#include <mapnik/gradient.hpp>
#include <mapnik/text/glyph_positions.hpp>
#include <mapnik/vertex.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/symbolizer_base.hpp>
#include <mapnik/symbolizer_enumerations.hpp>
@@ -75,7 +76,7 @@ void check_object_status_and_throw_exception(T const& object)
check_status_and_throw_exception(object.get_status());
}
-class cairo_face : private mapnik::noncopyable
+class cairo_face : private util::noncopyable
{
public:
cairo_face(std::shared_ptr<font_library> const& library, face_ptr const& face);
@@ -106,7 +107,7 @@ private:
using cairo_face_ptr = std::shared_ptr<cairo_face>;
-class cairo_face_manager : private mapnik::noncopyable
+class cairo_face_manager : private util::noncopyable
{
public:
cairo_face_manager(std::shared_ptr<font_library> library);
@@ -118,13 +119,13 @@ private:
cairo_face_cache cache_;
};
-class cairo_pattern : private mapnik::noncopyable
+class cairo_pattern : private util::noncopyable
{
public:
- explicit cairo_pattern(image_data_32 const& data, double opacity = 1.0)
+ explicit cairo_pattern(image_rgba8 const& data, double opacity = 1.0)
{
int pixels = data.width() * data.height();
- const unsigned int *in_ptr = data.getData();
+ const unsigned int *in_ptr = data.data();
const unsigned int *in_end = in_ptr + pixels;
unsigned int *out_ptr;
@@ -192,7 +193,7 @@ private:
};
-class cairo_gradient : private mapnik::noncopyable
+class cairo_gradient : private util::noncopyable
{
public:
cairo_gradient(mapnik::gradient const& grad, double opacity=1.0)
@@ -276,10 +277,9 @@ inline cairo_ptr create_context(cairo_surface_ptr const& surface)
return cairo_ptr(cairo_create(&*surface),cairo_closer());
}
-class cairo_context : private mapnik::noncopyable
+class cairo_context : private util::noncopyable
{
public:
-
cairo_context(cairo_ptr const& cairo);
inline ErrorStatus get_status() const
@@ -308,8 +308,8 @@ public:
void paint();
void set_pattern(cairo_pattern const& pattern);
void set_gradient(cairo_gradient const& pattern, box2d<double> const& bbox);
- void add_image(double x, double y, image_data_32 & data, double opacity = 1.0);
- void add_image(agg::trans_affine const& tr, image_data_32 & data, double opacity = 1.0);
+ void add_image(double x, double y, image_rgba8 const& data, double opacity = 1.0);
+ void add_image(agg::trans_affine const& tr, image_rgba8 const& data, double opacity = 1.0);
void set_font_face(cairo_face_manager & manager, face_ptr face);
void set_font_matrix(cairo_matrix_t const& matrix);
void set_matrix(cairo_matrix_t const& matrix);
@@ -321,7 +321,6 @@ public:
void glyph_path(unsigned long index, pixel_position const& pos);
void add_text(glyph_positions const& pos,
cairo_face_manager & manager,
- face_manager_freetype & font_manager,
composite_mode_e comp_op = src_over,
composite_mode_e halo_comp_op = src_over,
double scale_factor = 1.0);
diff --git a/include/mapnik/cairo/cairo_image_util.hpp b/include/mapnik/cairo/cairo_image_util.hpp
new file mode 100644
index 0000000..c0d2341
--- /dev/null
+++ b/include/mapnik/cairo/cairo_image_util.hpp
@@ -0,0 +1,84 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+
+#ifndef MAPNIK_CAIRO_IMAGE_UTIL_HPP
+#define MAPNIK_CAIRO_IMAGE_UTIL_HPP
+
+// mapnik
+#include <mapnik/image.hpp>
+#include <mapnik/cairo/cairo_context.hpp> // for cairo_surface_ptr
+
+// stl
+#include <stdexcept>
+
+namespace mapnik {
+
+static inline void cairo_image_to_rgba8(mapnik::image_rgba8 & data,
+ cairo_surface_ptr const& surface)
+{
+ if (cairo_image_surface_get_format(&*surface) != CAIRO_FORMAT_ARGB32)
+ {
+ throw std::runtime_error("Unable to convert this Cairo format to rgba8 image");
+ }
+
+ if (cairo_image_surface_get_width(&*surface) != data.width() ||
+ cairo_image_surface_get_height(&*surface) != data.height())
+ {
+ throw std::runtime_error("Mismatch in dimensions: size of image must match side of cairo surface");
+ }
+
+ int stride = cairo_image_surface_get_stride(&*surface) / 4;
+
+ const std::unique_ptr<unsigned int[]> out_row(new unsigned int[data.width()]);
+ const unsigned int *in_row = (const unsigned int *)cairo_image_surface_get_data(&*surface);
+
+ for (unsigned int row = 0; row < data.height(); row++, in_row += stride)
+ {
+ for (unsigned int column = 0; column < data.width(); column++)
+ {
+ unsigned int in = in_row[column];
+ unsigned int a = (in >> 24) & 0xff;
+ unsigned int r = (in >> 16) & 0xff;
+ unsigned int g = (in >> 8) & 0xff;
+ unsigned int b = (in >> 0) & 0xff;
+
+#define DE_ALPHA(x) do { \
+ if (a == 0) x = 0; \
+ else x = x * 255 / a; \
+ if (x > 255) x = 255; \
+ } while(0)
+
+ DE_ALPHA(r);
+ DE_ALPHA(g);
+ DE_ALPHA(b);
+
+ out_row[column] = color(r, g, b, a).rgba();
+ }
+ data.set_row(row, out_row.get(), data.width());
+ }
+}
+
+}
+
+
+#endif // MAPNIK_CAIRO_IMAGE_UTIL_HPP
diff --git a/include/mapnik/cairo/cairo_render_vector.hpp b/include/mapnik/cairo/cairo_render_vector.hpp
index 3016fad..b529a50 100644
--- a/include/mapnik/cairo/cairo_render_vector.hpp
+++ b/include/mapnik/cairo/cairo_render_vector.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -37,13 +37,13 @@ struct pixel_position;
template <typename T> class box2d;
namespace svg { struct path_attributes; }
-void render_vector_marker(cairo_context & context, pixel_position const& pos,
- svg::svg_path_adapter & svg_path, box2d<double> const& bbox,
+void render_vector_marker(cairo_context & context, svg::svg_path_adapter & svg_path,
agg::pod_bvector<svg::path_attributes> const & attributes,
- agg::trans_affine const& tr, double opacity, bool recenter);
+ box2d<double> const& bbox, agg::trans_affine const& tr,
+ double opacity);
}
#endif // MAPNIK_CAIRO_RENDER_VECTOR_HPP
-#endif
\ No newline at end of file
+#endif
diff --git a/include/mapnik/cairo/cairo_renderer.hpp b/include/mapnik/cairo/cairo_renderer.hpp
index fe9f819..0914d62 100644
--- a/include/mapnik/cairo/cairo_renderer.hpp
+++ b/include/mapnik/cairo/cairo_renderer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -28,7 +28,7 @@
// mapnik
#include <mapnik/config.hpp>
#include <mapnik/feature_style_processor.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/rule.hpp> // for all symbolizers
#include <mapnik/cairo/cairo_context.hpp>
#include <mapnik/renderer_common.hpp>
@@ -47,7 +47,7 @@ class feature_impl;
class feature_type_style;
class label_collision_detector4;
class layer;
-class marker;
+struct marker;
class proj_transform;
class request;
struct pixel_position;
@@ -67,7 +67,7 @@ struct cairo_save_restore
template <typename T>
class MAPNIK_DECL cairo_renderer : public feature_style_processor<cairo_renderer<T> >,
- private mapnik::noncopyable
+ private util::noncopyable
{
public:
using processor_impl_type = cairo_renderer<T>;
@@ -165,7 +165,7 @@ public:
{
return common_.vars_;
}
-
+
void render_marker(pixel_position const& pos,
marker const& marker,
agg::trans_affine const& mtx,
diff --git a/include/mapnik/cairo_io.hpp b/include/mapnik/cairo_io.hpp
new file mode 100644
index 0000000..c808b99
--- /dev/null
+++ b/include/mapnik/cairo_io.hpp
@@ -0,0 +1,49 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_CAIRO_IO_HPP
+#define MAPNIK_CAIRO_IO_HPP
+
+// mapnik
+#include <mapnik/config.hpp>
+#include <mapnik/map.hpp>
+
+// stl
+#include <string>
+
+namespace mapnik {
+
+#if defined(HAVE_CAIRO)
+MAPNIK_DECL void save_to_cairo_file(mapnik::Map const& map,
+ std::string const& filename,
+ double scale_factor=1.0,
+ double scale_denominator=0.0);
+MAPNIK_DECL void save_to_cairo_file(mapnik::Map const& map,
+ std::string const& filename,
+ std::string const& type,
+ double scale_factor=1.0,
+ double scale_denominator=0.0);
+#endif
+
+} // end ns
+
+#endif // MAPNIK_CAIRO_IO_HPP
diff --git a/include/mapnik/color.hpp b/include/mapnik/color.hpp
index 458add4..84f03d5 100644
--- a/include/mapnik/color.hpp
+++ b/include/mapnik/color.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -44,29 +44,39 @@ private:
std::uint8_t green_;
std::uint8_t blue_;
std::uint8_t alpha_;
-
+ bool premultiplied_;
public:
// default ctor
color()
: red_(0xff),
green_(0xff),
blue_(0xff),
- alpha_(0xff)
+ alpha_(0xff),
+ premultiplied_(false)
{}
- color(std::uint8_t red, std::uint8_t green, std::uint8_t blue, std::uint8_t alpha = 0xff)
+ color(std::uint8_t red, std::uint8_t green, std::uint8_t blue, std::uint8_t alpha = 0xff, bool premultiplied = false)
: red_(red),
green_(green),
blue_(blue),
- alpha_(alpha)
+ alpha_(alpha),
+ premultiplied_(premultiplied)
{}
+ color(std::uint32_t rgba, bool premultiplied = false)
+ : red_(rgba & 0xff),
+ green_((rgba >> 8) & 0xff),
+ blue_((rgba >> 16) & 0xff),
+ alpha_((rgba >> 24) & 0xff),
+ premultiplied_(premultiplied) {}
+
// copy ctor
color(const color& rhs)
: red_(rhs.red_),
green_(rhs.green_),
blue_(rhs.blue_),
- alpha_(rhs.alpha_)
+ alpha_(rhs.alpha_),
+ premultiplied_(rhs.premultiplied_)
{}
// move ctor
@@ -74,14 +84,15 @@ public:
: red_(std::move(rhs.red_)),
green_(std::move(rhs.green_)),
blue_(std::move(rhs.blue_)),
- alpha_(std::move(rhs.alpha_)) {}
+ alpha_(std::move(rhs.alpha_)),
+ premultiplied_(std::move(rhs.premultiplied_)) {}
- color( std::string const& str);
+ color( std::string const& str, bool premultiplied = false);
std::string to_string() const;
std::string to_hex_string() const;
- void premultiply();
- void demultiply();
+ bool premultiply();
+ bool demultiply();
color& operator=(color rhs)
{
@@ -135,14 +146,18 @@ public:
{
alpha_ = alpha;
}
+ inline bool get_premultiplied() const
+ {
+ return premultiplied_;
+ }
+ inline void set_premultiplied(bool status)
+ {
+ premultiplied_ = status;
+ }
inline unsigned rgba() const
{
-#ifdef MAPNIK_BIG_ENDIAN
- return static_cast<unsigned>((alpha_) | (blue_ << 8) | (green_ << 16) | (red_ << 24)) ;
-#else
return static_cast<unsigned>((alpha_ << 24) | (blue_ << 16) | (green_ << 8) | (red_)) ;
-#endif
}
private:
void swap(color & rhs)
diff --git a/include/mapnik/color_factory.hpp b/include/mapnik/color_factory.hpp
index 0333634..6bc360b 100644
--- a/include/mapnik/color_factory.hpp
+++ b/include/mapnik/color_factory.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/config.hpp b/include/mapnik/config.hpp
index 0e9d902..c96948b 100644
--- a/include/mapnik/config.hpp
+++ b/include/mapnik/config.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/config_error.hpp b/include/mapnik/config_error.hpp
index 6f590b8..2f6b3f6 100644
--- a/include/mapnik/config_error.hpp
+++ b/include/mapnik/config_error.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/coord.hpp b/include/mapnik/coord.hpp
index 79f2318..040c76b 100644
--- a/include/mapnik/coord.hpp
+++ b/include/mapnik/coord.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/coord_array.hpp b/include/mapnik/coord_array.hpp
deleted file mode 100644
index dc3c2ed..0000000
--- a/include/mapnik/coord_array.hpp
+++ /dev/null
@@ -1,113 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2011 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#ifndef MAPNIK_COORD_ARRAY_HPP
-#define MAPNIK_COORD_ARRAY_HPP
-
-//mapnik
-#include <mapnik/coord.hpp>
-
-// stl
-#include <algorithm>
-#include <cassert>
-
-namespace mapnik {
-
-template <typename T>
-class coord_array
-{
-public:
- using coord_type = T;
-
- coord_array(unsigned size=0)
- : pt_(static_cast<coord_type*>(size==0?0: ::operator new (sizeof(coord_type)*size))),
- size_(size) {}
-
- coord_array(coord_array const& rhs)
- : pt_(static_cast<coord_type*>(rhs.size_==0?0: ::operator new (sizeof(coord_type)*rhs.size_))),
- size_(rhs.size_)
- {
- std::copy(rhs.pt_, rhs.pt_ + rhs.size_ , pt_);
- }
-
- ~coord_array()
- {
- ::operator delete (pt_);
- }
-
- unsigned size() const
- {
- return size_;
- }
-
- void set(unsigned index,double x,double y)
- {
- assert(index<size_);
- pt_[index].x=x;
- pt_[index].y=y;
- }
-
- const coord_type& at(unsigned index) const
- {
- assert(index<size_);
- return pt_[index];
- }
-
- const coord_type& operator[] (unsigned index) const
- {
- assert (index<size_);
- return pt_[index];
- }
-
- coord_type& operator[] (unsigned index)
- {
- assert (index<size_);
- return pt_[index];
- }
-
- coord_type const* begin() const
- {
- return pt_;
- }
-
- coord_type const* end() const
- {
- return pt_ + size_;
- }
-
- coord_type * begin()
- {
- return pt_;
- }
- coord_type * end()
- {
- return pt_ + size_;
- }
-private:
- coord_array& operator=(const coord_array&);
- coord_type* pt_;
- const unsigned size_;
-};
-}
-
-
-#endif // MAPNIK_COORD_ARRAY_HPP
diff --git a/include/mapnik/css_color_grammar.hpp b/include/mapnik/css_color_grammar.hpp
index 8a68de1..7c7942d 100644
--- a/include/mapnik/css_color_grammar.hpp
+++ b/include/mapnik/css_color_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/css_color_grammar_impl.hpp b/include/mapnik/css_color_grammar_impl.hpp
index a1cad2a..4fe4627 100644
--- a/include/mapnik/css_color_grammar_impl.hpp
+++ b/include/mapnik/css_color_grammar_impl.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/datasource.hpp b/include/mapnik/datasource.hpp
index 1c13c7f..0cb9a59 100644
--- a/include/mapnik/datasource.hpp
+++ b/include/mapnik/datasource.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -30,16 +30,14 @@
#include <mapnik/query.hpp>
#include <mapnik/featureset.hpp>
#include <mapnik/feature_layer_desc.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/feature_style_processor_context.hpp>
-
-// boost
-#include <memory>
-#include <boost/optional.hpp>
+#include <mapnik/datasource_geometry_type.hpp>
// stl
#include <map>
#include <string>
+#include <memory>
namespace mapnik {
@@ -63,21 +61,14 @@ private:
std::string message_;
};
-class MAPNIK_DECL datasource : private mapnik::noncopyable
+class MAPNIK_DECL datasource : private util::noncopyable
{
public:
- enum datasource_t {
+ enum datasource_t : std::uint8_t {
Vector,
Raster
};
- enum geometry_t {
- Point = 1,
- LineString = 2,
- Polygon = 3,
- Collection = 4
- };
-
datasource (parameters const& params)
: params_(params) {}
@@ -103,22 +94,26 @@ public:
return params_ == rhs.params();
}
+ bool operator!=(datasource const& rhs) const
+ {
+ return !(*this == rhs);
+ }
+
/*!
* @brief Get the type of the datasource
* @return The type of the datasource (Vector or Raster)
*/
virtual datasource_t type() const = 0;
-
virtual processor_context_ptr get_context(feature_style_context_map&) const { return processor_context_ptr(); }
- virtual featureset_ptr features_with_context(query const& q,processor_context_ptr /*ctx*/) const
+ virtual featureset_ptr features_with_context(query const& q, processor_context_ptr /*ctx*/) const
{
// default implementation without context use features method
return features(q);
}
+ virtual boost::optional<datasource_geometry_t> get_geometry_type() const = 0;
virtual featureset_ptr features(query const& q) const = 0;
virtual featureset_ptr features_at_point(coord2d const& pt, double tol = 0) const = 0;
virtual box2d<double> envelope() const = 0;
- virtual boost::optional<geometry_t> get_geometry_type() const = 0;
virtual layer_descriptor get_descriptor() const = 0;
virtual ~datasource() {}
protected:
diff --git a/include/mapnik/datasource_cache.hpp b/include/mapnik/datasource_cache.hpp
index 2a8b752..a4ff89c 100644
--- a/include/mapnik/datasource_cache.hpp
+++ b/include/mapnik/datasource_cache.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,7 +26,7 @@
// mapnik
#include <mapnik/config.hpp>
#include <mapnik/utils.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// stl
#include <map>
@@ -42,7 +42,7 @@ class PluginInfo;
class MAPNIK_DECL datasource_cache
: public singleton<datasource_cache, CreateStatic>,
- private mapnik::noncopyable
+ private util::noncopyable
{
friend class CreateStatic<datasource_cache>;
public:
diff --git a/include/mapnik/datasource_geometry_type.hpp b/include/mapnik/datasource_geometry_type.hpp
new file mode 100644
index 0000000..00e4b2a
--- /dev/null
+++ b/include/mapnik/datasource_geometry_type.hpp
@@ -0,0 +1,41 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_DATASOURCE_GEOMETRY_TYPE_HPP
+#define MAPNIK_DATASOURCE_GEOMETRY_TYPE_HPP
+
+#include <cstdint>
+
+namespace mapnik {
+
+enum datasource_geometry_t : std::uint8_t {
+ Unknown = 0,
+ Point = 1,
+ LineString = 2,
+ Polygon = 3,
+ Collection = 4
+};
+
+}
+
+
+#endif // MAPNIK_DATASOURCE_GEOMETRY_TYPE_HPP
diff --git a/include/mapnik/debug.hpp b/include/mapnik/debug.hpp
index 3aa8510..a00bca6 100644
--- a/include/mapnik/debug.hpp
+++ b/include/mapnik/debug.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,9 +25,8 @@
// mapnik (should not depend on anything that need to use this)
#include <mapnik/config.hpp>
-#include <mapnik/unique_lock.hpp>
#include <mapnik/utils.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// std
#include <iostream>
@@ -48,7 +47,7 @@ namespace mapnik {
*/
class MAPNIK_DECL logger :
public singleton<logger,CreateStatic>,
- private mapnik::noncopyable
+ private util::noncopyable
{
public:
enum severity_type
@@ -70,7 +69,7 @@ namespace mapnik {
static void set_severity(severity_type const& severity_level)
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(severity_mutex_);
+ std::lock_guard<std::mutex> lock(severity_mutex_);
#endif
severity_level_ = severity_level;
@@ -94,7 +93,7 @@ namespace mapnik {
severity_type const& security_level)
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(severity_mutex_);
+ std::lock_guard<std::mutex> lock(severity_mutex_);
#endif
if (! object_name.empty())
{
@@ -105,7 +104,7 @@ namespace mapnik {
static void clear_object_severity()
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(severity_mutex_);
+ std::lock_guard<std::mutex> lock(severity_mutex_);
#endif
object_severity_level_.clear();
@@ -120,7 +119,7 @@ namespace mapnik {
static void set_format(std::string const& format)
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(format_mutex_);
+ std::lock_guard<std::mutex> lock(format_mutex_);
#endif
format_ = format;
}
@@ -166,7 +165,7 @@ namespace mapnik {
{
#ifdef MAPNIK_THREADSAFE
static std::mutex mutex;
- mapnik::scoped_lock lock(mutex);
+ std::lock_guard<std::mutex> lock(mutex);
#endif
std::clog << logger::str() << " " << s.str() << std::endl;
}
@@ -184,7 +183,7 @@ namespace mapnik {
class Ch = char,
class Tr = std::char_traits<Ch>,
class A = std::allocator<Ch> >
- class base_log : public mapnik::noncopyable
+ class base_log : public util::noncopyable
{
public:
using output_policy = OutputPolicy<Ch, Tr, A>;
@@ -254,7 +253,7 @@ namespace mapnik {
class Ch = char,
class Tr = std::char_traits<Ch>,
class A = std::allocator<Ch> >
- class base_log_always : public mapnik::noncopyable
+ class base_log_always : public util::noncopyable
{
public:
using output_policy = OutputPolicy<Ch, Tr, A>;
diff --git a/include/mapnik/ellipsoid.hpp b/include/mapnik/ellipsoid.hpp
index 018a017..e1be68c 100644
--- a/include/mapnik/ellipsoid.hpp
+++ b/include/mapnik/ellipsoid.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/enumeration.hpp b/include/mapnik/enumeration.hpp
index c0ca1c7..12f3dad 100644
--- a/include/mapnik/enumeration.hpp
+++ b/include/mapnik/enumeration.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,11 +25,13 @@
// mapnik
#include <mapnik/config.hpp>
+#include <mapnik/debug.hpp>
// stl
#include <bitset>
#include <iostream>
#include <cstdlib>
+#include <algorithm>
namespace mapnik {
@@ -176,11 +178,24 @@ public:
* */
void from_string(std::string const& str)
{
+ // TODO: Enum value strings with underscore are deprecated in Mapnik 3.x
+ // and support will be removed in Mapnik 4.x.
+ bool deprecated = false;
+ std::string str_copy(str);
+ if (str_copy.find('_') != std::string::npos)
+ {
+ std::replace(str_copy.begin(), str_copy.end(), '_', '-');
+ deprecated = true;
+ }
for (unsigned i = 0; i < THE_MAX; ++i)
{
- if (str == our_strings_[i])
+ if (str_copy == our_strings_[i])
{
value_ = static_cast<ENUM>(i);
+ if (deprecated)
+ {
+ MAPNIK_LOG_ERROR(enumerations) << "enumeration value (" << str << ") using \"_\" is deprecated and will be removed in Mapnik 4.x, use '" << str_copy << "' instead";
+ }
return;
}
}
diff --git a/include/mapnik/evaluate_global_attributes.hpp b/include/mapnik/evaluate_global_attributes.hpp
index 309c5c8..63f0348 100644
--- a/include/mapnik/evaluate_global_attributes.hpp
+++ b/include/mapnik/evaluate_global_attributes.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -30,7 +30,7 @@
#include <mapnik/attribute.hpp>
#include <mapnik/expression_node.hpp>
#include <mapnik/color_factory.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/function_call.hpp>
#include <mapnik/util/variant.hpp>
@@ -39,7 +39,7 @@ namespace mapnik {
namespace {
template <typename T, typename Attributes>
-struct evaluate_expression : util::static_visitor<T>
+struct evaluate_expression
{
using value_type = T;
@@ -133,7 +133,7 @@ struct evaluate_expression : util::static_visitor<T>
};
template <typename T>
-struct evaluate_expression<T, boost::none_t> : util::static_visitor<T>
+struct evaluate_expression<T, boost::none_t>
{
using value_type = T;
@@ -271,10 +271,10 @@ std::tuple<T,bool> pre_evaluate_expression (expression_ptr const& expr)
}
}
-struct evaluate_global_attributes : mapnik::noncopyable
+struct evaluate_global_attributes : util::noncopyable
{
template <typename Attributes>
- struct evaluator : util::static_visitor<>
+ struct evaluator
{
evaluator(symbolizer_base::cont_type::value_type & prop, Attributes const& attributes)
: prop_(prop),
@@ -296,7 +296,7 @@ struct evaluate_global_attributes : mapnik::noncopyable
};
template <typename Attributes>
- struct extract_symbolizer : util::static_visitor<>
+ struct extract_symbolizer
{
extract_symbolizer(Attributes const& attributes)
: attributes_(attributes) {}
diff --git a/include/mapnik/expression.hpp b/include/mapnik/expression.hpp
index 3ec4531..8894507 100644
--- a/include/mapnik/expression.hpp
+++ b/include/mapnik/expression.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/expression_evaluator.hpp b/include/mapnik/expression_evaluator.hpp
index e766a4e..1d37bde 100644
--- a/include/mapnik/expression_evaluator.hpp
+++ b/include/mapnik/expression_evaluator.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -35,12 +35,12 @@ namespace mapnik
{
template <typename T0, typename T1, typename T2>
-struct evaluate : util::static_visitor<T1>
+struct evaluate
{
using feature_type = T0;
using value_type = T1;
using variable_type = T2;
-
+ using result_type = T1; // we need this because automatic result_type deduction fails
explicit evaluate(feature_type const& f, variable_type const& v)
: feature_(f),
vars_(v) {}
diff --git a/include/mapnik/expression_grammar.hpp b/include/mapnik/expression_grammar.hpp
index 11a75bb..3dd5fc4 100644
--- a/include/mapnik/expression_grammar.hpp
+++ b/include/mapnik/expression_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -29,7 +29,7 @@
#include <mapnik/unicode.hpp>
#include <mapnik/expression_node.hpp>
#include <mapnik/function_call.hpp>
-
+//#include <mapnik/datasource.hpp>
// boost
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
@@ -109,12 +109,12 @@ struct regex_replace_impl
mapnik::transcoder const& tr_;
};
-struct geometry_types : qi::symbols<char,mapnik::value_integer>
+struct geometry_types : qi::symbols<char, mapnik::value_integer>
{
geometry_types()
{
add
- ("point",1)
+ ("point", 1)
("linestring", 2)
("polygon",3)
("collection",4)
diff --git a/include/mapnik/expression_grammar_impl.hpp b/include/mapnik/expression_grammar_impl.hpp
index 18347cd..a4d8353 100644
--- a/include/mapnik/expression_grammar_impl.hpp
+++ b/include/mapnik/expression_grammar_impl.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/expression_node.hpp b/include/mapnik/expression_node.hpp
index c46e852..ea161f0 100644
--- a/include/mapnik/expression_node.hpp
+++ b/include/mapnik/expression_node.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -38,21 +38,21 @@ namespace mapnik
using value_type = mapnik::value;
template <typename Tag> struct make_op;
-template <> struct make_op<tags::negate> { using type = std::negate<value_type>;};
-template <> struct make_op<tags::plus> { using type = std::plus<value_type>;};
-template <> struct make_op<tags::minus> { using type = std::minus<value_type>;};
-template <> struct make_op<tags::mult> { using type = std::multiplies<value_type>;};
-template <> struct make_op<tags::div> { using type = std::divides<value_type>;};
-template <> struct make_op<tags::mod> { using type = std::modulus<value_type>;};
-template <> struct make_op<tags::less> { using type = std::less<value_type>;};
-template <> struct make_op<tags::less_equal> { using type = std::less_equal<value_type>;};
-template <> struct make_op<tags::greater> { using type = std::greater<value_type>;};
-template <> struct make_op<tags::greater_equal> { using type = std::greater_equal<value_type>;};
-template <> struct make_op<tags::equal_to> { using type = std::equal_to<value_type>;};
-template <> struct make_op<tags::not_equal_to> { using type = std::not_equal_to<value_type>;};
-template <> struct make_op<tags::logical_not> { using type = std::logical_not<value_type>;};
-template <> struct make_op<tags::logical_and> { using type = std::logical_and<value_type>;};
-template <> struct make_op<tags::logical_or> { using type = std::logical_or<value_type>;};
+template <> struct make_op<mapnik::tags::negate> { using type = std::negate<value_type>;};
+template <> struct make_op<mapnik::tags::plus> { using type = std::plus<value_type>;};
+template <> struct make_op<mapnik::tags::minus> { using type = std::minus<value_type>;};
+template <> struct make_op<mapnik::tags::mult> { using type = std::multiplies<value_type>;};
+template <> struct make_op<mapnik::tags::div> { using type = std::divides<value_type>;};
+template <> struct make_op<mapnik::tags::mod> { using type = std::modulus<value_type>;};
+template <> struct make_op<mapnik::tags::less> { using type = std::less<value_type>;};
+template <> struct make_op<mapnik::tags::less_equal> { using type = std::less_equal<value_type>;};
+template <> struct make_op<mapnik::tags::greater> { using type = std::greater<value_type>;};
+template <> struct make_op<mapnik::tags::greater_equal> { using type = std::greater_equal<value_type>;};
+template <> struct make_op<mapnik::tags::equal_to> { using type = std::equal_to<value_type>;};
+template <> struct make_op<mapnik::tags::not_equal_to> { using type = std::not_equal_to<value_type>;};
+template <> struct make_op<mapnik::tags::logical_not> { using type = std::logical_not<value_type>;};
+template <> struct make_op<mapnik::tags::logical_and> { using type = std::logical_and<value_type>;};
+template <> struct make_op<mapnik::tags::logical_or> { using type = std::logical_or<value_type>;};
template <typename Tag>
struct unary_node
@@ -130,77 +130,77 @@ struct MAPNIK_DECL regex_replace_node
inline expr_node & operator- (expr_node& expr)
{
- return expr = unary_node<tags::negate>(expr);
+ return expr = unary_node<mapnik::tags::negate>(expr);
}
inline expr_node & operator += ( expr_node &left, expr_node const& right)
{
- return left = binary_node<tags::plus>(left,right);
+ return left = binary_node<mapnik::tags::plus>(left,right);
}
inline expr_node & operator -= ( expr_node &left, expr_node const& right)
{
- return left = binary_node<tags::minus>(left,right);
+ return left = binary_node<mapnik::tags::minus>(left,right);
}
inline expr_node & operator *= ( expr_node &left , expr_node const& right)
{
- return left = binary_node<tags::mult>(left,right);
+ return left = binary_node<mapnik::tags::mult>(left,right);
}
inline expr_node & operator /= ( expr_node &left , expr_node const& right)
{
- return left = binary_node<tags::div>(left,right);
+ return left = binary_node<mapnik::tags::div>(left,right);
}
inline expr_node & operator %= ( expr_node &left , expr_node const& right)
{
- return left = binary_node<tags::mod>(left,right);
+ return left = binary_node<mapnik::tags::mod>(left,right);
}
inline expr_node & operator < ( expr_node &left, expr_node const& right)
{
- return left = binary_node<tags::less>(left,right);
+ return left = binary_node<mapnik::tags::less>(left,right);
}
inline expr_node & operator <= ( expr_node &left, expr_node const& right)
{
- return left = binary_node<tags::less_equal>(left,right);
+ return left = binary_node<mapnik::tags::less_equal>(left,right);
}
inline expr_node & operator > ( expr_node &left, expr_node const& right)
{
- return left = binary_node<tags::greater>(left,right);
+ return left = binary_node<mapnik::tags::greater>(left,right);
}
inline expr_node & operator >= ( expr_node &left, expr_node const& right)
{
- return left = binary_node<tags::greater_equal>(left,right);
+ return left = binary_node<mapnik::tags::greater_equal>(left,right);
}
inline expr_node & operator == ( expr_node &left, expr_node const& right)
{
- return left = binary_node<tags::equal_to>(left,right);
+ return left = binary_node<mapnik::tags::equal_to>(left,right);
}
inline expr_node & operator != ( expr_node &left, expr_node const& right)
{
- return left = binary_node<tags::not_equal_to>(left,right);
+ return left = binary_node<mapnik::tags::not_equal_to>(left,right);
}
inline expr_node & operator ! (expr_node & expr)
{
- return expr = unary_node<tags::logical_not>(expr);
+ return expr = unary_node<mapnik::tags::logical_not>(expr);
}
inline expr_node & operator && ( expr_node &left, expr_node const& right)
{
- return left = binary_node<tags::logical_and>(left,right);
+ return left = binary_node<mapnik::tags::logical_and>(left,right);
}
inline expr_node & operator || ( expr_node &left, expr_node const& right)
{
- return left = binary_node<tags::logical_or>(left,right);
+ return left = binary_node<mapnik::tags::logical_or>(left,right);
}
}
diff --git a/include/mapnik/expression_node_types.hpp b/include/mapnik/expression_node_types.hpp
index 665b808..86d12b2 100644
--- a/include/mapnik/expression_node_types.hpp
+++ b/include/mapnik/expression_node_types.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -175,21 +175,21 @@ value_unicode_string,
attribute,
global_attribute,
geometry_type_attribute,
-util::recursive_wrapper<unary_node<tags::negate> >,
-util::recursive_wrapper<binary_node<tags::plus> >,
-util::recursive_wrapper<binary_node<tags::minus> >,
-util::recursive_wrapper<binary_node<tags::mult> >,
-util::recursive_wrapper<binary_node<tags::div> >,
-util::recursive_wrapper<binary_node<tags::mod> >,
-util::recursive_wrapper<binary_node<tags::less> >,
-util::recursive_wrapper<binary_node<tags::less_equal> >,
-util::recursive_wrapper<binary_node<tags::greater> >,
-util::recursive_wrapper<binary_node<tags::greater_equal> >,
-util::recursive_wrapper<binary_node<tags::equal_to> >,
-util::recursive_wrapper<binary_node<tags::not_equal_to> >,
-util::recursive_wrapper<unary_node<tags::logical_not> >,
-util::recursive_wrapper<binary_node<tags::logical_and> >,
-util::recursive_wrapper<binary_node<tags::logical_or> >,
+util::recursive_wrapper<unary_node<mapnik::tags::negate> >,
+util::recursive_wrapper<binary_node<mapnik::tags::plus> >,
+util::recursive_wrapper<binary_node<mapnik::tags::minus> >,
+util::recursive_wrapper<binary_node<mapnik::tags::mult> >,
+util::recursive_wrapper<binary_node<mapnik::tags::div> >,
+util::recursive_wrapper<binary_node<mapnik::tags::mod> >,
+util::recursive_wrapper<binary_node<mapnik::tags::less> >,
+util::recursive_wrapper<binary_node<mapnik::tags::less_equal> >,
+util::recursive_wrapper<binary_node<mapnik::tags::greater> >,
+util::recursive_wrapper<binary_node<mapnik::tags::greater_equal> >,
+util::recursive_wrapper<binary_node<mapnik::tags::equal_to> >,
+util::recursive_wrapper<binary_node<mapnik::tags::not_equal_to> >,
+util::recursive_wrapper<unary_node<mapnik::tags::logical_not> >,
+util::recursive_wrapper<binary_node<mapnik::tags::logical_and> >,
+util::recursive_wrapper<binary_node<mapnik::tags::logical_or> >,
util::recursive_wrapper<regex_match_node>,
util::recursive_wrapper<regex_replace_node>,
util::recursive_wrapper<unary_function_call>,
diff --git a/include/mapnik/expression_string.hpp b/include/mapnik/expression_string.hpp
index 42c61a7..afb6331 100644
--- a/include/mapnik/expression_string.hpp
+++ b/include/mapnik/expression_string.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/factory.hpp b/include/mapnik/factory.hpp
index cc5487e..87b4371 100644
--- a/include/mapnik/factory.hpp
+++ b/include/mapnik/factory.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/feature.hpp b/include/mapnik/feature.hpp
index 9a600b0..c4888f3 100644
--- a/include/mapnik/feature.hpp
+++ b/include/mapnik/feature.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -29,9 +29,10 @@
#include <mapnik/value.hpp>
#include <mapnik/box2d.hpp>
#include <mapnik/geometry.hpp>
-#include <mapnik/geometry_container.hpp>
+#include <mapnik/geometry_envelope.hpp>
+//
#include <mapnik/feature_kv_iterator.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// stl
#include <memory>
@@ -40,6 +41,7 @@
#include <ostream> // for basic_ostream, operator<<, etc
#include <sstream> // for basic_stringstream
#include <stdexcept> // for out_of_range
+#include <iostream>
namespace mapnik {
@@ -49,7 +51,7 @@ class feature_impl;
using raster_ptr = std::shared_ptr<raster>;
template <typename T>
-class context : private mapnik::noncopyable
+class context : private util::noncopyable
{
friend class feature_impl;
@@ -90,7 +92,7 @@ using context_ptr = std::shared_ptr<context_type>;
static const value default_feature_value;
-class MAPNIK_DECL feature_impl : private mapnik::noncopyable
+class MAPNIK_DECL feature_impl : private util::noncopyable
{
friend class feature_kv_iterator;
public:
@@ -103,9 +105,8 @@ public:
: id_(id),
ctx_(ctx),
data_(ctx_->mapping_.size()),
- geom_cont_(),
- raster_()
- {}
+ geom_(geometry::geometry_empty()),
+ raster_() {}
inline mapnik::value_integer id() const { return id_;}
@@ -194,55 +195,24 @@ public:
return ctx_;
}
- inline geometry_container const& paths() const
+ inline void set_geometry(geometry::geometry<double> && geom)
{
- return geom_cont_;
+ geom_ = std::move(geom);
}
- inline geometry_container & paths()
+ inline void set_geometry_copy(geometry::geometry<double> const& geom)
{
- return geom_cont_;
+ geom_ = geom;
}
- inline void add_geometry(geometry_type * geom)
+ inline geometry::geometry<double> const& get_geometry() const
{
- geom_cont_.push_back(geom);
- }
-
- inline std::size_t num_geometries() const
- {
- return geom_cont_.size();
- }
-
- inline geometry_type const& get_geometry(std::size_t index) const
- {
- return geom_cont_[index];
- }
-
- inline geometry_type& get_geometry(std::size_t index)
- {
- return geom_cont_[index];
+ return geom_;
}
inline box2d<double> envelope() const
{
- // TODO - cache this
- box2d<double> result;
- bool first = true;
- for (auto const& geom : geom_cont_)
- {
- if (first)
- {
- box2d<double> box = geom.envelope();
- result.init(box.minx(),box.miny(),box.maxx(),box.maxy());
- first = false;
- }
- else
- {
- result.expand_to_include(geom.envelope());
- }
- }
- return result;
+ return mapnik::geometry::envelope(geom_);
}
inline raster_ptr const& get_raster() const
@@ -292,7 +262,7 @@ private:
mapnik::value_integer id_;
context_ptr ctx_;
cont_type data_;
- geometry_container geom_cont_;
+ geometry::geometry<double> geom_;
raster_ptr raster_;
};
diff --git a/include/mapnik/feature_factory.hpp b/include/mapnik/feature_factory.hpp
index c2bf8d3..57ed6dc 100644
--- a/include/mapnik/feature_factory.hpp
+++ b/include/mapnik/feature_factory.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/feature_kv_iterator.hpp b/include/mapnik/feature_kv_iterator.hpp
index 060b6fc..5d9b93a 100644
--- a/include/mapnik/feature_kv_iterator.hpp
+++ b/include/mapnik/feature_kv_iterator.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/feature_layer_desc.hpp b/include/mapnik/feature_layer_desc.hpp
index c9d613c..7dd1293 100644
--- a/include/mapnik/feature_layer_desc.hpp
+++ b/include/mapnik/feature_layer_desc.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,6 +25,7 @@
// mapnik
#include <mapnik/attribute_descriptor.hpp>
+#include <mapnik/params.hpp>
// stl
#include <iosfwd>
@@ -39,12 +40,14 @@ public:
layer_descriptor(std::string const& name, std::string const& encoding)
: name_(name),
encoding_(encoding),
- desc_ar_() {}
+ desc_ar_(),
+ extra_params_() {}
layer_descriptor(layer_descriptor const& other)
: name_(other.name_),
encoding_(other.encoding_),
- desc_ar_(other.desc_ar_) {}
+ desc_ar_(other.desc_ar_),
+ extra_params_(other.extra_params_) {}
void set_name(std::string const& name)
{
@@ -81,10 +84,21 @@ public:
return desc_ar_;
}
+ parameters const& get_extra_parameters() const
+ {
+ return extra_params_;
+ }
+
+ parameters& get_extra_parameters()
+ {
+ return extra_params_;
+ }
+
private:
std::string name_;
std::string encoding_;
std::vector<attribute_descriptor> desc_ar_;
+ parameters extra_params_;
};
}
diff --git a/include/mapnik/feature_style_processor.hpp b/include/mapnik/feature_style_processor.hpp
index 29b4bed..cc36c01 100644
--- a/include/mapnik/feature_style_processor.hpp
+++ b/include/mapnik/feature_style_processor.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/feature_style_processor_context.hpp b/include/mapnik/feature_style_processor_context.hpp
index ff2970b..585c746 100644
--- a/include/mapnik/feature_style_processor_context.hpp
+++ b/include/mapnik/feature_style_processor_context.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/feature_style_processor_impl.hpp b/include/mapnik/feature_style_processor_impl.hpp
index ee37572..6e0094b 100644
--- a/include/mapnik/feature_style_processor_impl.hpp
+++ b/include/mapnik/feature_style_processor_impl.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/feature_type_style.hpp b/include/mapnik/feature_type_style.hpp
index 7835954..0f0d839 100644
--- a/include/mapnik/feature_type_style.hpp
+++ b/include/mapnik/feature_type_style.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/featureset.hpp b/include/mapnik/featureset.hpp
index 8697984..e23532a 100644
--- a/include/mapnik/featureset.hpp
+++ b/include/mapnik/featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,7 @@
// mapnik
#include <mapnik/config.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// boost
#include <memory>
@@ -35,7 +35,7 @@ namespace mapnik {
class feature_impl;
using feature_ptr = std::shared_ptr<feature_impl>;
-struct MAPNIK_DECL Featureset : private mapnik::noncopyable
+struct MAPNIK_DECL Featureset : private util::noncopyable
{
virtual feature_ptr next() = 0;
virtual ~Featureset() {}
diff --git a/include/mapnik/filter_featureset.hpp b/include/mapnik/filter_featureset.hpp
index 77ce4fe..b704625 100644
--- a/include/mapnik/filter_featureset.hpp
+++ b/include/mapnik/filter_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/font_engine_freetype.hpp b/include/mapnik/font_engine_freetype.hpp
index e141131..78dc055 100644
--- a/include/mapnik/font_engine_freetype.hpp
+++ b/include/mapnik/font_engine_freetype.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,7 +27,7 @@
#include <mapnik/config.hpp>
#include <mapnik/font_set.hpp>
#include <mapnik/text/font_library.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// stl
#include <memory>
@@ -100,7 +100,7 @@ private:
static font_memory_cache_type global_memory_fonts_;
};
-class MAPNIK_DECL face_manager : private mapnik::noncopyable
+class MAPNIK_DECL face_manager : private util::noncopyable
{
using face_ptr_cache_type = std::map<std::string, face_ptr>;
diff --git a/include/mapnik/font_set.hpp b/include/mapnik/font_set.hpp
index ff0ea84..8803c99 100644
--- a/include/mapnik/font_set.hpp
+++ b/include/mapnik/font_set.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/geom_util.hpp b/include/mapnik/geom_util.hpp
index 104bef2..e6ad12e 100644
--- a/include/mapnik/geom_util.hpp
+++ b/include/mapnik/geom_util.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,8 +27,7 @@
#include <mapnik/box2d.hpp>
#include <mapnik/coord.hpp>
#include <mapnik/vertex.hpp>
-#include <mapnik/geometry.hpp> // for geometry_type::types (TODO: avoid this interdependence)
-
+#include <mapnik/geometry_types.hpp>
// stl
#include <cmath>
#include <vector>
@@ -377,6 +376,7 @@ bool centroid(PathType & path, double & x, double & y)
}
// Compute centroid over a set of paths
+#if 0
template <typename Iter>
bool centroid_geoms(Iter start, Iter end, double & x, double & y)
{
@@ -392,9 +392,10 @@ bool centroid_geoms(Iter start, Iter end, double & x, double & y)
double ytmp = 0.0;
unsigned count = 0;
- while (start!=end)
+ while (start != end)
{
- typename Iter::value_type const& path = *start++;
+ typename Iter::value_type const& geom = *start++;
+ vertex_adapter path(geom);
path.rewind(0);
unsigned command = path.vertex(&x0, &y0);
if (command == SEG_END) continue;
@@ -444,6 +445,8 @@ bool centroid_geoms(Iter start, Iter end, double & x, double & y)
return true;
}
+#endif
+
template <typename PathType>
bool hit_test(PathType & path, double x, double y, double tol)
{
@@ -452,6 +455,8 @@ bool hit_test(PathType & path, double x, double y, double tol)
double y0 = 0;
double x1 = 0;
double y1 = 0;
+ double start_x = 0;
+ double start_y = 0;
path.rewind(0);
unsigned command = path.vertex(&x0, &y0);
if (command == SEG_END)
@@ -459,23 +464,26 @@ bool hit_test(PathType & path, double x, double y, double tol)
return false;
}
unsigned count = 0;
- mapnik::geometry_type::types geom_type = static_cast<mapnik::geometry_type::types>(path.type());
+ mapnik::geometry::geometry_types geom_type = static_cast<mapnik::geometry::geometry_types>(path.type());
while (SEG_END != (command = path.vertex(&x1, &y1)))
{
- if (command == SEG_CLOSE)
- {
- continue;
- }
++count;
if (command == SEG_MOVETO)
{
x0 = x1;
y0 = y1;
+ start_x = x0;
+ start_y = y0;
continue;
}
+ else if (command == SEG_CLOSE)
+ {
+ x1 = start_x;
+ y1 = start_y;
+ }
switch(geom_type)
{
- case mapnik::geometry_type::types::Polygon:
+ case mapnik::geometry::geometry_types::Polygon:
{
if ((((y1 <= y) && (y < y0)) ||
((y0 <= y) && (y < y1))) &&
@@ -483,7 +491,7 @@ bool hit_test(PathType & path, double x, double y, double tol)
inside=!inside;
break;
}
- case mapnik::geometry_type::types::LineString:
+ case mapnik::geometry::geometry_types::LineString:
{
double distance = point_to_segment_distance(x,y,x0,y0,x1,y1);
if (distance < tol)
@@ -512,10 +520,6 @@ bool interior_position(PathType & path, double & x, double & y)
if (!label::centroid(path, x,y))
return false;
- // if we are not a polygon, or the default is within the polygon we are done
- if (hit_test(path,x,y,0.001))
- return true;
-
// otherwise we find a horizontal line across the polygon and then return the
// center of the widest intersection between the polygon and the line.
diff --git a/include/mapnik/geometry.hpp b/include/mapnik/geometry.hpp
index 471e043..a4f5583 100644
--- a/include/mapnik/geometry.hpp
+++ b/include/mapnik/geometry.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2015 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,134 +23,124 @@
#ifndef MAPNIK_GEOMETRY_HPP
#define MAPNIK_GEOMETRY_HPP
-// mapnik
-#include <mapnik/vertex_vector.hpp>
-#include <mapnik/box2d.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/variant.hpp>
+#include <mapnik/coord.hpp>
+#include <vector>
+#include <type_traits>
+#include <cstddef>
-namespace mapnik {
+namespace mapnik { namespace geometry {
-template <typename T, template <typename> class Container=vertex_vector>
-class geometry : private mapnik::noncopyable
+template <typename T>
+struct point
{
-
-public:
- static const std::uint8_t geometry_bits = 7;
- enum types : std::uint8_t
- {
- Unknown = 0x00,
- Point = 0x01,
- LineString = 0x02,
- Polygon = 0x03,
- PolygonExterior = Polygon,
- PolygonInterior = Polygon | ( 1 << geometry_bits)
- };
- using coord_type = T;
- using container_type = Container<coord_type>;
- using value_type = typename container_type::value_type;
- using size_type = typename container_type::size_type;
-private:
- container_type cont_;
- types type_;
- mutable size_type itr_;
-public:
-
- geometry()
- : type_(Unknown),
- itr_(0)
+ using value_type = T;
+ point() {}
+ point(T x_, T y_)
+ : x(x_), y(y_)
{}
-
- explicit geometry(types type)
- : type_(type),
- itr_(0)
- {}
-
- types type() const
+ // temp - remove when geometry is templated on value_type
+ point(mapnik::coord<double, 2> const& c)
+ : x(c.x), y(c.y) {}
+
+ point(point const& other) = default;
+ point(point && other) noexcept = default;
+ point & operator=(point const& other) = default;
+ friend inline bool operator== (point<T> const& a, point<T> const& b)
{
- return static_cast<types>(type_ & types::Polygon);
+ return a.x == b.x && a.y == b.y;
}
-
- bool interior() const
+ friend inline bool operator!= (point<T> const& a, point <T> const& b)
{
- return static_cast<bool>(type_ >> geometry_bits);
+ return a.x != b.x || a.y != b.y;
}
+ value_type x;
+ value_type y;
+};
- void set_type(types type)
- {
- type_ = type;
- }
- container_type const& data() const
- {
- return cont_;
- }
+template <typename T>
+struct line_string : std::vector<point<T> >
+{
+ line_string() = default;
+ line_string (std::size_t size)
+ : std::vector<point<T> >(size) {}
+ line_string (line_string && other) = default ;
+ line_string& operator=(line_string &&) = default;
+ line_string (line_string const& ) = default;
+ line_string& operator=(line_string const&) = default;
+ inline std::size_t num_points() const { return std::vector<point<T>>::size(); }
+ inline void add_coord(T x, T y) { std::vector<point<T>>::template emplace_back(x,y);}
+};
- size_type size() const
- {
- return cont_.size();
- }
+template <typename T>
+struct linear_ring : line_string<T>
+{
+ linear_ring() = default;
+ linear_ring(std::size_t size)
+ : line_string<T>(size) {}
+ linear_ring (linear_ring && other) = default ;
+ linear_ring& operator=(linear_ring &&) = default;
+ linear_ring(line_string<T> && other)
+ : line_string<T>(other) {}
+ linear_ring (linear_ring const& ) = default;
+ linear_ring(line_string<T> const& other)
+ : line_string<T>(other) {}
+ linear_ring& operator=(linear_ring const&) = default;
+
+};
- box2d<double> envelope() const
- {
- box2d<double> result;
- double x = 0;
- double y = 0;
- rewind(0);
- size_type geom_size = size();
- for (size_type i = 0; i < geom_size; ++i)
- {
- unsigned cmd = vertex(&x,&y);
- if (cmd == SEG_CLOSE) continue;
- if (i == 0)
- {
- result.init(x,y,x,y);
- }
- else
- {
- result.expand_to_include(x,y);
- }
- }
- return result;
- }
+template <typename T>
+struct polygon
+{
+ linear_ring<T> exterior_ring;
+ std::vector<linear_ring<T>> interior_rings;
- void push_vertex(coord_type x, coord_type y, CommandType c)
+ inline void set_exterior_ring(linear_ring<T> && ring)
{
- cont_.push_back(x,y,c);
+ exterior_ring = std::move(ring);
}
- void line_to(coord_type x,coord_type y)
+ inline void add_hole(linear_ring<T> && ring)
{
- push_vertex(x,y,SEG_LINETO);
+ interior_rings.emplace_back(std::move(ring));
}
- void move_to(coord_type x,coord_type y)
- {
- push_vertex(x,y,SEG_MOVETO);
- }
+ inline bool empty() const { return exterior_ring.empty(); }
- void close_path()
+ inline std::size_t num_rings() const
{
- push_vertex(0,0,SEG_CLOSE);
+ return 1 + interior_rings.size();
}
+};
- unsigned vertex(double* x, double* y) const
- {
- return cont_.get_vertex(itr_++,x,y);
- }
+template <typename T>
+struct multi_point : line_string<T> {};
- unsigned vertex(std::size_t index, double* x, double* y) const
- {
- return cont_.get_vertex(index, x, y);
- }
+template <typename T>
+struct multi_line_string : std::vector<line_string<T>> {};
- void rewind(unsigned ) const
- {
- itr_=0;
- }
-};
+template <typename T>
+struct multi_polygon : std::vector<polygon<T>> {};
+
+template <typename T>
+struct geometry_collection;
+
+struct geometry_empty {};
+
+template <typename T>
+using geometry = mapnik::util::variant<geometry_empty,
+ point<T>,
+ line_string<T>,
+ polygon<T>,
+ multi_point<T>,
+ multi_line_string<T>,
+ multi_polygon<T>,
+ mapnik::util::recursive_wrapper<geometry_collection<T> > >;
-using geometry_type = geometry<double,vertex_vector>;
+template <typename T>
+struct geometry_collection : std::vector<geometry<T>> {};
-}
+}}
-#endif // MAPNIK_GEOMETRY_HPP
+#endif //MAPNIK_GEOMETRY_HPP
diff --git a/include/mapnik/geometry_adapters.hpp b/include/mapnik/geometry_adapters.hpp
new file mode 100644
index 0000000..93076a8
--- /dev/null
+++ b/include/mapnik/geometry_adapters.hpp
@@ -0,0 +1,221 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GEOMETRY_ADAPTERS_HPP
+#define MAPNIK_GEOMETRY_ADAPTERS_HPP
+
+#include <mapnik/config.hpp>
+
+// undef B0 to workaround https://svn.boost.org/trac/boost/ticket/10467
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-local-typedef"
+#undef B0
+#include <boost/geometry/geometries/register/linestring.hpp>
+#include <boost/geometry/geometries/register/point.hpp>
+#include <boost/geometry/geometries/register/ring.hpp>
+// NOTE: ideally we would not include all of boost/geometry here to save on compile time
+// however we need to pull in <boost/geometry/multi/multi.hpp> for things to work
+// and once we do that the compile time is == to just including boost/geometry.hpp
+#include <boost/geometry.hpp>
+#pragma GCC diagnostic pop
+
+#include <mapnik/geometry.hpp>
+#include <mapnik/coord.hpp>
+#include <mapnik/box2d.hpp>
+
+#include <cstdint>
+#include <vector>
+
+// register point
+BOOST_GEOMETRY_REGISTER_POINT_2D (mapnik::geometry::point<double>, double, boost::geometry::cs::cartesian, x, y)
+BOOST_GEOMETRY_REGISTER_POINT_2D (mapnik::geometry::point<std::int64_t>, std::int64_t, boost::geometry::cs::cartesian, x, y)
+// ring
+BOOST_GEOMETRY_REGISTER_RING_TEMPLATED(mapnik::geometry::linear_ring)
+// needed by box2d<double>
+BOOST_GEOMETRY_REGISTER_POINT_2D(mapnik::coord2d, double, boost::geometry::cs::cartesian, x, y)
+
+namespace boost {
+
+template <typename CoordinateType>
+struct range_iterator<mapnik::geometry::line_string<CoordinateType> >
+{
+ using type = typename mapnik::geometry::line_string<CoordinateType>::iterator;
+};
+
+template <typename CoordinateType>
+struct range_const_iterator<mapnik::geometry::line_string<CoordinateType> >
+{
+ using type = typename mapnik::geometry::line_string<CoordinateType>::const_iterator;
+};
+
+template <typename CoordinateType>
+inline typename mapnik::geometry::line_string<CoordinateType>::iterator
+range_begin(mapnik::geometry::line_string<CoordinateType> & line) {return line.begin();}
+
+template <typename CoordinateType>
+inline typename mapnik::geometry::line_string<CoordinateType>::iterator
+range_end(mapnik::geometry::line_string<CoordinateType> & line) {return line.end();}
+
+template <typename CoordinateType>
+inline typename mapnik::geometry::line_string<CoordinateType>::const_iterator
+range_begin(mapnik::geometry::line_string<CoordinateType> const& line) {return line.begin();}
+
+template <typename CoordinateType>
+inline typename mapnik::geometry::line_string<CoordinateType>::const_iterator
+range_end(mapnik::geometry::line_string<CoordinateType> const& line) {return line.end();}
+
+namespace geometry { namespace traits {
+
+// register mapnik::box2d<double>
+template<> struct tag<mapnik::box2d<double> > { using type = box_tag; };
+template<> struct point_type<mapnik::box2d<double> > { using type = mapnik::coord2d; };
+
+template <>
+struct indexed_access<mapnik::box2d<double>, min_corner, 0>
+{
+ using ct = coordinate_type<mapnik::coord2d>::type;
+ static inline ct get(mapnik::box2d<double> const& b) { return b.minx();}
+ static inline void set(mapnik::box2d<double> &b, ct const& value) { b.set_minx(value); }
+};
+
+template <>
+struct indexed_access<mapnik::box2d<double>, min_corner, 1>
+{
+ using ct = coordinate_type<mapnik::coord2d>::type;
+ static inline ct get(mapnik::box2d<double> const& b) { return b.miny();}
+ static inline void set(mapnik::box2d<double> &b, ct const& value) { b.set_miny(value); }
+};
+
+template <>
+struct indexed_access<mapnik::box2d<double>, max_corner, 0>
+{
+ using ct = coordinate_type<mapnik::coord2d>::type;
+ static inline ct get(mapnik::box2d<double> const& b) { return b.maxx();}
+ static inline void set(mapnik::box2d<double> &b, ct const& value) { b.set_maxx(value); }
+};
+
+template <>
+struct indexed_access<mapnik::box2d<double>, max_corner, 1>
+{
+ using ct = coordinate_type<mapnik::coord2d>::type;
+ static inline ct get(mapnik::box2d<double> const& b) { return b.maxy();}
+ static inline void set(mapnik::box2d<double> &b , ct const& value) { b.set_maxy(value); }
+};
+
+// mapnik::geometry::line_string
+template<typename CoordinateType>
+struct tag<mapnik::geometry::line_string<CoordinateType> >
+{
+ using type = linestring_tag;
+};
+
+// mapnik::geometry::polygon
+template<typename CoordinateType>
+struct tag<mapnik::geometry::polygon<CoordinateType> >
+{
+ using type = polygon_tag;
+};
+
+template <typename CoordinateType>
+struct point_order<mapnik::geometry::linear_ring<CoordinateType> >
+{
+ static const order_selector value = counterclockwise;
+};
+
+template<typename CoordinateType>
+struct tag<mapnik::geometry::multi_point<CoordinateType> >
+{
+ using type = multi_point_tag;
+};
+
+template<typename CoordinateType>
+struct tag<mapnik::geometry::multi_line_string<CoordinateType> >
+{
+ using type = multi_linestring_tag;
+};
+
+template<typename CoordinateType>
+struct tag<mapnik::geometry::multi_polygon<CoordinateType> >
+{
+ using type = multi_polygon_tag;
+};
+
+// ring
+template <typename CoordinateType>
+struct ring_const_type<mapnik::geometry::polygon<CoordinateType> >
+{
+ using type = typename mapnik::geometry::linear_ring<CoordinateType> const&;
+};
+
+template <typename CoordinateType>
+struct ring_mutable_type<mapnik::geometry::polygon<CoordinateType> >
+{
+ using type = typename mapnik::geometry::linear_ring<CoordinateType>&;
+};
+
+// interior
+template <typename CoordinateType>
+struct interior_const_type<mapnik::geometry::polygon<CoordinateType> >
+{
+ using type = typename std::vector<mapnik::geometry::linear_ring<CoordinateType> > const&;
+};
+
+template <typename CoordinateType>
+struct interior_mutable_type<mapnik::geometry::polygon<CoordinateType> >
+{
+ using type = typename std::vector<mapnik::geometry::linear_ring<CoordinateType> >&;
+};
+
+// exterior
+template <typename CoordinateType>
+struct exterior_ring<mapnik::geometry::polygon<CoordinateType> >
+{
+ static mapnik::geometry::linear_ring<CoordinateType> & get(mapnik::geometry::polygon<CoordinateType> & p)
+ {
+ return p.exterior_ring;
+ }
+
+ static mapnik::geometry::linear_ring<CoordinateType> const& get(mapnik::geometry::polygon<CoordinateType> const& p)
+ {
+ return p.exterior_ring;
+ }
+};
+
+template <typename CoordinateType>
+struct interior_rings<mapnik::geometry::polygon<CoordinateType> >
+{
+ using holes_type = std::vector<mapnik::geometry::linear_ring<CoordinateType> >;
+ static holes_type& get(mapnik::geometry::polygon<CoordinateType> & p)
+ {
+ return p.interior_rings;
+ }
+
+ static holes_type const& get(mapnik::geometry::polygon<CoordinateType> const& p)
+ {
+ return p.interior_rings;
+ }
+};
+
+}}}
+
+
+#endif //MAPNIK_GEOMETRY_ADAPTERS_HPP
diff --git a/include/mapnik/geometry_centroid.hpp b/include/mapnik/geometry_centroid.hpp
new file mode 100644
index 0000000..2e7dec1
--- /dev/null
+++ b/include/mapnik/geometry_centroid.hpp
@@ -0,0 +1,106 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GEOMETRY_CENTROID_HPP
+#define MAPNIK_GEOMETRY_CENTROID_HPP
+
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_adapters.hpp>
+#include <boost/geometry/algorithms/centroid.hpp>
+
+namespace mapnik { namespace geometry {
+
+namespace detail {
+
+template <typename T>
+struct geometry_centroid
+{
+ using result_type = bool;
+
+ geometry_centroid(point<T> & pt)
+ : pt_(pt) {}
+
+ template <typename T1>
+ result_type operator() (T1 const& geom) const
+ {
+ return util::apply_visitor(*this, geom);
+ }
+
+ result_type operator() (geometry_empty const&) const
+ {
+ return false;
+ }
+
+ result_type operator() (geometry_collection<T> const& collection) const
+ {
+ return false;
+ }
+
+ result_type operator() (point<T> const& geom) const
+ {
+ boost::geometry::centroid(geom, pt_);
+ return true;
+ }
+
+ result_type operator() (line_string<T> const& geom) const
+ {
+ boost::geometry::centroid(geom, pt_);
+ return true;
+ }
+
+ result_type operator() (polygon<T> const& geom) const
+ {
+ boost::geometry::centroid(geom, pt_);
+ return true;
+ }
+
+ result_type operator() (multi_point<T> const& geom) const
+ {
+ boost::geometry::centroid(geom, pt_);
+ return true;
+ }
+
+ result_type operator() (multi_line_string<T> const& geom) const
+ {
+ boost::geometry::centroid(geom, pt_);
+ return true;
+ }
+
+ result_type operator() (multi_polygon<T> const& geom) const
+ {
+ boost::geometry::centroid(geom, pt_);
+ return true;
+ }
+ point<T> & pt_;
+};
+
+}
+
+template <typename T1, typename T2>
+inline bool centroid(T1 const& geom, point<T2> & pt)
+{
+ return detail::geometry_centroid<T2>(pt)(geom);
+}
+
+}}
+
+#endif // MAPNIK_GEOMETRY_CENTROID_HPP
diff --git a/include/mapnik/geometry_container.hpp b/include/mapnik/geometry_container.hpp
deleted file mode 100644
index ae654d2..0000000
--- a/include/mapnik/geometry_container.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2011 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#ifndef MAPNIK_GEOMETRY_CONTAINER_HPP
-#define MAPNIK_GEOMETRY_CONTAINER_HPP
-
-// boost
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#include <boost/ptr_container/ptr_vector.hpp>
-#pragma GCC diagnostic pop
-
-namespace mapnik {
-
-using geometry_container = boost::ptr_vector<geometry_type>;
-
-}
-
-#endif // MAPNIK_GEOMETRY_CONTAINER_HPP
diff --git a/include/mapnik/geometry_correct.hpp b/include/mapnik/geometry_correct.hpp
new file mode 100644
index 0000000..8698c12
--- /dev/null
+++ b/include/mapnik/geometry_correct.hpp
@@ -0,0 +1,93 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GEOMETRY_CORRECT_HPP
+#define MAPNIK_GEOMETRY_CORRECT_HPP
+
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_adapters.hpp>
+#include <mapnik/util/variant.hpp>
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wunused-variable"
+#pragma GCC diagnostic ignored "-Wunused-local-typedef"
+#include <boost/geometry/algorithms/correct.hpp>
+#pragma GCC diagnostic pop
+
+#include <type_traits>
+
+namespace mapnik { namespace geometry {
+
+namespace detail {
+
+struct geometry_correct
+{
+ using result_type = void;
+
+ template <typename T>
+ result_type operator() (geometry<T> & geom) const
+ {
+ mapnik::util::apply_visitor(*this, geom);
+ }
+
+ template <typename T>
+ result_type operator() (geometry_collection<T> & collection) const
+ {
+ for (auto & geom : collection)
+ {
+ (*this)(geom);
+ }
+ }
+
+ template <typename T>
+ result_type operator() (polygon<T> & poly) const
+ {
+ boost::geometry::correct(poly);
+ }
+
+ template <typename T>
+ result_type operator() (multi_polygon<T> & multi_poly) const
+ {
+ boost::geometry::correct(multi_poly);
+ }
+
+ template <typename T>
+ result_type operator() (T & geom) const
+ {
+ //no-op
+ }
+
+};
+
+}
+
+template <typename GeomType>
+inline void correct(GeomType & geom)
+{
+ static_assert(!std::is_const<GeomType>::value,"mapnik::geometry::correct on const& is invalid");
+ detail::geometry_correct()(geom);
+}
+
+}}
+
+#endif // MAPNIK_GEOMETRY_CORRECT_HPP
diff --git a/include/mapnik/geometry_envelope.hpp b/include/mapnik/geometry_envelope.hpp
new file mode 100644
index 0000000..17b8fcb
--- /dev/null
+++ b/include/mapnik/geometry_envelope.hpp
@@ -0,0 +1,38 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GEOMETRY_ENVELOPE_HPP
+#define MAPNIK_GEOMETRY_ENVELOPE_HPP
+
+#include <mapnik/config.hpp>
+#include <mapnik/box2d.hpp>
+
+namespace mapnik {
+namespace geometry {
+
+template <typename T>
+MAPNIK_DECL mapnik::box2d<double> envelope(T const& geom);
+
+} // end ns geometry
+} // end ns mapnik
+
+#endif // MAPNIK_GEOMETRY_ENVELOPE_HPP
diff --git a/include/mapnik/geometry_envelope_impl.hpp b/include/mapnik/geometry_envelope_impl.hpp
new file mode 100644
index 0000000..dbed6aa
--- /dev/null
+++ b/include/mapnik/geometry_envelope_impl.hpp
@@ -0,0 +1,152 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#include <mapnik/geometry_envelope.hpp>
+#include <mapnik/geometry.hpp>
+#include <mapnik/box2d.hpp>
+
+namespace mapnik { namespace geometry {
+
+namespace detail {
+
+struct geometry_envelope
+{
+ using bbox_type = box2d<double>;
+ bbox_type & bbox;
+
+ geometry_envelope(bbox_type & bbox_)
+ : bbox(bbox_) {}
+
+ template <typename T>
+ void operator() (T const& geom) const
+ {
+ return mapnik::util::apply_visitor(*this, geom);
+ }
+
+ void operator() (mapnik::geometry::geometry_empty const&) const {}
+
+ template <typename T>
+ void operator() (mapnik::geometry::point<T> const& pt) const
+ {
+ if (!bbox.valid())
+ {
+ bbox.init(pt.x, pt.y, pt.x, pt.y);
+ }
+ bbox.expand_to_include(pt.x, pt.y);
+ }
+
+ template <typename T>
+ void operator() (mapnik::geometry::line_string<T> const& line) const
+ {
+ bool first = true;
+ for (auto const& pt : line)
+ {
+ if (first && !bbox.valid())
+ {
+ bbox.init(pt.x, pt.y, pt.x, pt.y);
+ first = false;
+ }
+ else
+ {
+ bbox.expand_to_include(pt.x, pt.y);
+ }
+ }
+ }
+
+ template <typename T>
+ void operator() (mapnik::geometry::polygon<T> const& poly) const
+ {
+ bool first = true;
+ for (auto const& pt : poly.exterior_ring)
+ {
+ if (first && !bbox.valid())
+ {
+ bbox.init(pt.x, pt.y, pt.x, pt.y);
+ first = false;
+ }
+ else
+ {
+ bbox.expand_to_include(pt.x, pt.y);
+ }
+ }
+ }
+
+ template <typename T>
+ void operator() (mapnik::geometry::multi_point<T> const& multi_point) const
+ {
+ bool first = true;
+ for (auto const& pt : multi_point)
+ {
+ if (first && !bbox.valid())
+ {
+ bbox.init(pt.x, pt.y, pt.x, pt.y);
+ first = false;
+ }
+ else
+ {
+ bbox.expand_to_include(pt.x, pt.y);
+ }
+ }
+ }
+
+ template <typename T>
+ void operator() (mapnik::geometry::multi_line_string<T> const& multi_line) const
+ {
+ for (auto const& line : multi_line)
+ {
+ (*this)(line);
+ }
+ }
+
+ template <typename T>
+ void operator() (mapnik::geometry::multi_polygon<T> const& multi_poly) const
+ {
+ for (auto const& poly : multi_poly)
+ {
+ (*this)(poly);
+ }
+ }
+
+ template <typename T>
+ void operator() (mapnik::geometry::geometry_collection<T> const& collection) const
+ {
+ for (auto const& geom : collection)
+ {
+ (*this)(geom);
+ }
+ }
+};
+
+} // end ns detail
+
+template <typename T>
+mapnik::box2d<double> envelope(T const& geom)
+{
+ box2d<double> bbox;
+ detail::geometry_envelope op(bbox);
+ op(geom);
+ return bbox;
+}
+
+} // end ns geometry
+} // end ns mapnik
+
diff --git a/include/mapnik/geometry_fusion_adapted.hpp b/include/mapnik/geometry_fusion_adapted.hpp
new file mode 100644
index 0000000..6889de6
--- /dev/null
+++ b/include/mapnik/geometry_fusion_adapted.hpp
@@ -0,0 +1,53 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+
+#ifndef MAPNIK_GEOMETRY_FUSION_ADAPTED_HPP
+#define MAPNIK_GEOMETRY_FUSION_ADAPTED_HPP
+
+#include <mapnik/geometry.hpp>
+#include <boost/fusion/include/adapt_struct.hpp>
+#include <vector>
+
+BOOST_FUSION_ADAPT_STRUCT(
+ mapnik::geometry::point<double>,
+ (double, x)
+ (double, y)
+)
+
+BOOST_FUSION_ADAPT_STRUCT(
+ mapnik::geometry::point<std::int64_t>,
+ (std::int64_t, x)
+ (std::int64_t, y)
+)
+
+BOOST_FUSION_ADAPT_STRUCT(
+ mapnik::geometry::polygon<double>,
+ (mapnik::geometry::linear_ring<double> const&, exterior_ring)
+ (std::vector<mapnik::geometry::linear_ring<double> > const& , interior_rings))
+
+BOOST_FUSION_ADAPT_STRUCT(
+ mapnik::geometry::polygon<std::int64_t>,
+ (mapnik::geometry::linear_ring<std::int64_t> const&, exterior_ring)
+ (std::vector<mapnik::geometry::linear_ring<std::int64_t> > const& , interior_rings))
+
+#endif // MAPNIK_GEOMETRY_FUSION_ADAPTED_HPP
diff --git a/include/mapnik/geometry_is_empty.hpp b/include/mapnik/geometry_is_empty.hpp
new file mode 100644
index 0000000..5d017aa
--- /dev/null
+++ b/include/mapnik/geometry_is_empty.hpp
@@ -0,0 +1,92 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GEOMETRY_IS_EMPTY_HPP
+#define MAPNIK_GEOMETRY_IS_EMPTY_HPP
+
+#include <mapnik/geometry.hpp>
+
+namespace mapnik { namespace geometry {
+
+namespace detail {
+
+struct geometry_is_empty
+{
+ bool operator() (mapnik::geometry::geometry<double> const& geom) const
+ {
+ return mapnik::util::apply_visitor(*this, geom);
+ }
+
+ bool operator() (mapnik::geometry::point<double> const&) const
+ {
+ return false;
+ }
+
+ bool operator() (mapnik::geometry::line_string<double> const& geom) const
+ {
+ return geom.empty();
+ }
+
+ bool operator() (mapnik::geometry::polygon<double> const& geom) const
+ {
+ return geom.empty();
+ }
+
+ bool operator() (mapnik::geometry::multi_point<double> const& geom) const
+ {
+ return geom.empty();
+ }
+
+ bool operator() (mapnik::geometry::multi_line_string<double> const& geom) const
+ {
+ return geom.empty();
+ }
+
+ bool operator() (mapnik::geometry::multi_polygon<double> const& geom) const
+ {
+ return geom.empty();
+ }
+
+ bool operator() (mapnik::geometry::geometry_collection<double> const& geom) const
+ {
+ return geom.empty();
+ }
+
+ template <typename T>
+ bool operator() (T const& geom) const
+ {
+ return true;
+ }
+
+};
+
+}
+
+template <typename GeomType>
+inline bool is_empty(GeomType const& geom)
+{
+ return detail::geometry_is_empty()(geom);
+}
+
+}}
+
+#endif // MAPNIK_GEOMETRY_IS_EMPTY_HPP
diff --git a/include/mapnik/geometry_is_simple.hpp b/include/mapnik/geometry_is_simple.hpp
new file mode 100644
index 0000000..30fff6d
--- /dev/null
+++ b/include/mapnik/geometry_is_simple.hpp
@@ -0,0 +1,108 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GEOMETRY_IS_SIMPLE_HPP
+#define MAPNIK_GEOMETRY_IS_SIMPLE_HPP
+
+#include <boost/version.hpp>
+
+// only Boost >= 1.56 contains the is_simple function
+#if BOOST_VERSION >= 105600
+
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_adapters.hpp>
+#include <boost/geometry/algorithms/is_simple.hpp>
+
+namespace mapnik { namespace geometry {
+
+namespace detail {
+
+struct geometry_is_simple
+{
+ using result_type = bool;
+
+ template <typename T>
+ result_type operator() (geometry<T> const& geom) const
+ {
+ return mapnik::util::apply_visitor(*this, geom);
+ }
+
+ result_type operator() (geometry_empty const& ) const
+ {
+ return false;
+ }
+
+ template <typename T>
+ result_type operator() (geometry_collection<T> const& collection) const
+ {
+ for (auto const& geom : collection)
+ {
+ if ( !(*this)(geom)) return false;
+ }
+ return true;
+ }
+
+ template <typename T>
+ result_type operator() (point<T> const& pt) const
+ {
+ return boost::geometry::is_simple(pt);
+ }
+ template <typename T>
+ result_type operator() (line_string<T> const& line) const
+ {
+ return boost::geometry::is_simple(line);
+ }
+ template <typename T>
+ result_type operator() (polygon<T> const& poly) const
+ {
+ return boost::geometry::is_simple(poly);
+ }
+ template <typename T>
+ result_type operator() (multi_point<T> const& multi_pt) const
+ {
+ return boost::geometry::is_simple(multi_pt);
+ }
+ template <typename T>
+ result_type operator() (multi_line_string<T> const& multi_line) const
+ {
+ return boost::geometry::is_simple(multi_line);
+ }
+ template <typename T>
+ result_type operator() (multi_polygon<T> const& multi_poly) const
+ {
+ return boost::geometry::is_simple(multi_poly);
+ }
+
+};
+
+}
+
+template <typename T>
+inline bool is_simple(T const& geom)
+{
+ return detail::geometry_is_simple() (geom);
+}
+
+}}
+
+#endif // BOOST_VERSION >= 1.56
+#endif // MAPNIK_GEOMETRY_IS_SIMPLE_HPP
diff --git a/include/mapnik/geometry_is_valid.hpp b/include/mapnik/geometry_is_valid.hpp
new file mode 100644
index 0000000..aa7f139
--- /dev/null
+++ b/include/mapnik/geometry_is_valid.hpp
@@ -0,0 +1,112 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GEOMETRY_IS_VALID_HPP
+#define MAPNIK_GEOMETRY_IS_VALID_HPP
+
+#include <boost/version.hpp>
+
+// only Boost >= 1.56 contains the is_valid function
+#if BOOST_VERSION >= 105600
+
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_adapters.hpp>
+#include <boost/geometry/algorithms/is_valid.hpp>
+
+namespace mapnik { namespace geometry {
+
+namespace detail {
+
+struct geometry_is_valid
+{
+ using result_type = bool;
+
+ template <typename T>
+ result_type operator() (geometry<T> const& geom) const
+ {
+ return mapnik::util::apply_visitor(*this, geom);
+ }
+
+ result_type operator() (geometry_empty const& ) const
+ {
+ return false;
+ }
+
+ template <typename T>
+ result_type operator() (geometry_collection<T> const& collection) const
+ {
+ for (auto const& geom : collection)
+ {
+ if ( !(*this)(geom)) return false;
+ }
+ return true;
+ }
+
+ template <typename T>
+ result_type operator() (point<T> const& pt) const
+ {
+ return boost::geometry::is_valid(pt);
+ }
+
+ template <typename T>
+ result_type operator() (line_string<T> const& line) const
+ {
+ return boost::geometry::is_valid(line);
+ }
+
+ template <typename T>
+ result_type operator() (polygon<T> const& poly) const
+ {
+ return boost::geometry::is_valid(poly);
+ }
+
+ template <typename T>
+ result_type operator() (multi_point<T> const& multi_pt) const
+ {
+ return boost::geometry::is_valid(multi_pt);
+ }
+
+ template <typename T>
+ result_type operator() (multi_line_string<T> const& multi_line) const
+ {
+ return boost::geometry::is_valid(multi_line);
+ }
+
+ template <typename T>
+ result_type operator() (multi_polygon<T> const& multi_poly) const
+ {
+ return boost::geometry::is_valid(multi_poly);
+ }
+};
+
+}
+
+template <typename T>
+inline bool is_valid(T const& geom)
+{
+ return detail::geometry_is_valid() (geom);
+}
+
+}}
+
+#endif // BOOST_VERSION >= 1.56
+#endif // MAPNIK_GEOMETRY_IS_VALID_HPP
diff --git a/include/mapnik/geometry_reprojection.hpp b/include/mapnik/geometry_reprojection.hpp
new file mode 100644
index 0000000..83a429a
--- /dev/null
+++ b/include/mapnik/geometry_reprojection.hpp
@@ -0,0 +1,64 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GEOMETRY_REPROJECTION_HPP
+#define MAPNIK_GEOMETRY_REPROJECTION_HPP
+
+// mapnik
+#include <mapnik/proj_transform.hpp>
+#include <mapnik/geometry.hpp>
+
+
+namespace mapnik {
+
+namespace geometry {
+
+// There is a difference between reprojecting a const vs reprojecting a non const in behavior. If you reproject a
+// const a new geometry (or perhaps empty geometry) will be returned no matter how many geometries fail to reproject.
+// This is done this way so that large geometry collections that only have a few failing points or polygon parts could
+// still be return with out the few failing projections.
+
+template <typename T>
+MAPNIK_DECL geometry<T> reproject_copy(geometry<T> const& geom, proj_transform const& proj_trans, unsigned int & n_err);
+
+template <typename T>
+MAPNIK_DECL T reproject_copy(T const& geom, proj_transform const& proj_trans, unsigned int & n_err);
+
+template <typename T>
+MAPNIK_DECL T reproject_copy(T const& geom, projection const& source, projection const& dest, unsigned int & n_err);
+
+
+// No error count is required for a non const reprojection and this will reproject in place.
+// because the reprojection is done on the same memory it is important to check if it succeeded,
+// otherwise you could be dealing with a corrupt geometry.
+
+template <typename T>
+MAPNIK_DECL bool reproject(T & geom, proj_transform const& proj_trans);
+
+template <typename T>
+MAPNIK_DECL bool reproject(T & geom, projection const& source, projection const& dest);
+
+} // end geometry ns
+
+} // end mapnik ns
+
+#endif // MAPNIK_GEOMETRY_REPROJECTION_HPP
diff --git a/include/mapnik/geometry_reprojection_impl.hpp b/include/mapnik/geometry_reprojection_impl.hpp
new file mode 100644
index 0000000..3ba4b75
--- /dev/null
+++ b/include/mapnik/geometry_reprojection_impl.hpp
@@ -0,0 +1,400 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/geometry_reprojection.hpp>
+#include <mapnik/geometry.hpp>
+
+namespace mapnik {
+
+namespace geometry {
+
+namespace detail {
+
+geometry_empty reproject_internal(geometry_empty const&, proj_transform const&, unsigned int &)
+{
+ return geometry_empty();
+}
+
+template <typename T>
+point<T> reproject_internal(point<T> const & p, proj_transform const& proj_trans, unsigned int & n_err)
+{
+ point<T> new_p(p);
+ if (!proj_trans.forward(new_p))
+ {
+ ++n_err;
+ }
+ return new_p;
+}
+
+template <typename T>
+line_string<T> reproject_internal(line_string<T> const & ls, proj_transform const& proj_trans, unsigned int & n_err)
+{
+ line_string<T> new_ls(ls);
+ unsigned int err = proj_trans.forward(new_ls);
+ if (err > 0)
+ {
+ n_err += err;
+ }
+ return new_ls;
+}
+
+template <typename T>
+polygon<T> reproject_internal(polygon<T> const & poly, proj_transform const& proj_trans, unsigned int & n_err)
+{
+ polygon<T> new_poly;
+ linear_ring<T> new_ext(poly.exterior_ring);
+ unsigned int err = proj_trans.forward(new_ext);
+ // If the exterior ring doesn't transform don't bother with the holes.
+ if (err > 0 || new_ext.empty())
+ {
+ n_err += err;
+ }
+ else
+ {
+ new_poly.set_exterior_ring(std::move(new_ext));
+ new_poly.interior_rings.reserve(poly.interior_rings.size());
+
+ for (auto const& lr : poly.interior_rings)
+ {
+ linear_ring<T> new_lr(lr);
+ err = proj_trans.forward(new_lr);
+ if (err > 0 || new_lr.empty())
+ {
+ n_err += err;
+ // If there is an error in interior ring drop
+ // it from polygon.
+ continue;
+ }
+ new_poly.add_hole(std::move(new_lr));
+ }
+ }
+ return new_poly;
+}
+
+template <typename T>
+multi_point<T> reproject_internal(multi_point<T> const & mp, proj_transform const& proj_trans, unsigned int & n_err)
+{
+ multi_point<T> new_mp;
+ if (proj_trans.is_known())
+ {
+ // If the projection is known we do them all at once because it is faster
+ // since we know that no point will fail reprojection
+ new_mp.assign(mp.begin(), mp.end());
+ proj_trans.forward(new_mp);
+ }
+ else
+ {
+ new_mp.reserve(mp.size());
+ for (auto const& p : mp)
+ {
+ point<T> new_p(p);
+ if (!proj_trans.forward(new_p))
+ {
+ ++n_err;
+ }
+ else
+ {
+ new_mp.emplace_back(std::move(new_p));
+ }
+ }
+ }
+ return new_mp;
+}
+
+template <typename T>
+multi_line_string<T> reproject_internal(multi_line_string<T> const & mls, proj_transform const& proj_trans, unsigned int & n_err)
+{
+ multi_line_string<T> new_mls;
+ new_mls.reserve(mls.size());
+ for (auto const& ls : mls)
+ {
+ line_string<T> new_ls = reproject_internal(ls, proj_trans, n_err);
+ if (!new_ls.empty())
+ {
+ new_mls.emplace_back(std::move(new_ls));
+ }
+ }
+ return new_mls;
+}
+
+template <typename T>
+multi_polygon<T> reproject_internal(multi_polygon<T> const & mpoly, proj_transform const& proj_trans, unsigned int & n_err)
+{
+ multi_polygon<T> new_mpoly;
+ new_mpoly.reserve(mpoly.size());
+ for (auto const& poly : mpoly)
+ {
+ polygon<T> new_poly = reproject_internal(poly, proj_trans, n_err);
+ if (!new_poly.exterior_ring.empty())
+ {
+ new_mpoly.emplace_back(std::move(new_poly));
+ }
+ }
+ return new_mpoly;
+}
+
+template <typename T>
+geometry_collection<T> reproject_internal(geometry_collection<T> const & c, proj_transform const& proj_trans, unsigned int & n_err)
+{
+ geometry_collection<T> new_c;
+ new_c.reserve(c.size());
+ for (auto const& g : c)
+ {
+
+ geometry<T> new_g(std::move(reproject_copy(g, proj_trans, n_err)));
+ if (!new_g.template is<geometry_empty>())
+ {
+ new_c.emplace_back(std::move(new_g));
+ }
+ }
+ return new_c;
+}
+
+template <typename T>
+struct geom_reproj_copy_visitor {
+
+ geom_reproj_copy_visitor(proj_transform const & proj_trans, unsigned int & n_err)
+ : proj_trans_(proj_trans),
+ n_err_(n_err) {}
+
+ geometry<T> operator() (geometry_empty const&)
+ {
+ return geometry_empty();
+ }
+
+ geometry<T> operator() (point<T> const& p)
+ {
+ geometry<T> geom; // default empty
+ unsigned int intial_err = n_err_;
+ point<T> new_p = reproject_internal(p, proj_trans_, n_err_);
+ if (n_err_ > intial_err) return geom;
+ geom = std::move(new_p);
+ return geom;
+ }
+
+ geometry<T> operator() (line_string<T> const& ls)
+ {
+ geometry<T> geom; // default empty
+ int intial_err = n_err_;
+ line_string<T> new_ls = reproject_internal(ls, proj_trans_, n_err_);
+ if (n_err_ > intial_err || new_ls.empty()) return geom;
+ geom = std::move(new_ls);
+ return geom;
+ }
+
+ geometry<T> operator() (polygon<T> const& poly)
+ {
+ geometry<T> geom; // default empty
+ polygon<T> new_poly = reproject_internal(poly, proj_trans_, n_err_);
+ if (new_poly.exterior_ring.empty()) return geom;
+ geom = std::move(new_poly);
+ return geom;
+ }
+
+ geometry<T> operator() (multi_point<T> const& mp)
+ {
+ geometry<T> geom; // default empty
+ multi_point<T> new_mp = reproject_internal(mp, proj_trans_, n_err_);
+ if (new_mp.empty()) return geom;
+ geom = std::move(new_mp);
+ return geom;
+ }
+
+ geometry<T> operator() (multi_line_string<T> const& mls)
+ {
+ geometry<T> geom; // default empty
+ multi_line_string<T> new_mls = reproject_internal(mls, proj_trans_, n_err_);
+ if (new_mls.empty()) return geom;
+ geom = std::move(new_mls);
+ return geom;
+ }
+
+ geometry<T> operator() (multi_polygon<T> const& mpoly)
+ {
+ geometry<T> geom; // default empty
+ multi_polygon<T> new_mpoly = reproject_internal(mpoly, proj_trans_, n_err_);
+ if (new_mpoly.empty()) return geom;
+ geom = std::move(new_mpoly);
+ return geom;
+ }
+
+ geometry<T> operator() (geometry_collection<T> const& c)
+ {
+ geometry<T> geom; // default empty
+ geometry_collection<T> new_c = reproject_internal(c, proj_trans_, n_err_);
+ if (new_c.empty()) return geom;
+ geom = std::move(new_c);
+ return geom;
+ }
+
+private:
+ proj_transform const& proj_trans_;
+ unsigned int & n_err_;
+
+};
+
+} // end detail ns
+
+template <typename T>
+geometry<T> reproject_copy(geometry<T> const& geom, proj_transform const& proj_trans, unsigned int & n_err)
+{
+ detail::geom_reproj_copy_visitor<T> visit(proj_trans, n_err);
+ return mapnik::util::apply_visitor(visit, geom);
+}
+
+template <typename T>
+T reproject_copy(T const& geom, proj_transform const& proj_trans, unsigned int & n_err)
+{
+ return detail::reproject_internal(geom, proj_trans, n_err);
+}
+
+template <typename T>
+T reproject_copy(T const& geom, projection const& source, projection const& dest, unsigned int & n_err)
+{
+ proj_transform proj_trans(source, dest);
+ return reproject_copy(geom, proj_trans, n_err);
+}
+
+namespace detail {
+
+struct geom_reproj_visitor {
+
+ geom_reproj_visitor(proj_transform const & proj_trans)
+ : proj_trans_(proj_trans) {}
+
+ template <typename T>
+ bool operator() (geometry<T> & geom)
+ {
+ return mapnik::util::apply_visitor((*this), geom);
+ }
+
+ bool operator() (geometry_empty &) { return true; }
+
+ template <typename T>
+ bool operator() (point<T> & p)
+ {
+ if (!proj_trans_.forward(p))
+ {
+ return false;
+ }
+ return true;
+ }
+
+ template <typename T>
+ bool operator() (line_string<T> & ls)
+ {
+ if (proj_trans_.forward(ls) > 0)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ template <typename T>
+ bool operator() (polygon<T> & poly)
+ {
+ if (proj_trans_.forward(poly.exterior_ring) > 0)
+ {
+ return false;
+ }
+
+ for (auto & lr : poly.interior_rings)
+ {
+ if (proj_trans_.forward(lr) > 0)
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ template <typename T>
+ bool operator() (multi_point<T> & mp)
+ {
+ return (*this) (static_cast<line_string<T> &>(mp));
+ }
+
+ template <typename T>
+ bool operator() (multi_line_string<T> & mls)
+ {
+ for (auto & ls : mls)
+ {
+ if (! (*this) (ls))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ template <typename T>
+ bool operator() (multi_polygon<T> & mpoly)
+ {
+ for (auto & poly : mpoly)
+ {
+ if(! (*this)(poly))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ template <typename T>
+ bool operator() (geometry_collection<T> & c)
+ {
+ for (auto & g : c)
+ {
+ if (! (*this)(g) )
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+private:
+ proj_transform const& proj_trans_;
+
+};
+
+} // end detail ns
+
+template <typename T>
+bool reproject(T & geom, proj_transform const& proj_trans)
+{
+ detail::geom_reproj_visitor visit(proj_trans);
+ return visit(geom);
+}
+
+template <typename T>
+bool reproject(T & geom, projection const& source, projection const& dest)
+{
+ proj_transform proj_trans(source, dest);
+ detail::geom_reproj_visitor visit(proj_trans);
+ return visit(geom);
+}
+
+} // end geometry ns
+
+} // end mapnik ns
diff --git a/include/mapnik/geometry_strategy.hpp b/include/mapnik/geometry_strategy.hpp
new file mode 100644
index 0000000..0a322dd
--- /dev/null
+++ b/include/mapnik/geometry_strategy.hpp
@@ -0,0 +1,250 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GEOMETRY_STRATEGY_HPP
+#define MAPNIK_GEOMETRY_STRATEGY_HPP
+
+#include <mapnik/geometry_adapters.hpp>
+#include <mapnik/util/rounding_cast.hpp>
+
+namespace mapnik {
+namespace geometry {
+
+namespace helper
+{
+ template <std::size_t... Ts>
+ struct index {};
+
+ template <std::size_t N, std::size_t... Ts>
+ struct gen_seq : gen_seq<N - 1, N - 1, Ts...> {};
+
+ template <std::size_t... Ts>
+ struct gen_seq<0, Ts...> : index<Ts...> {};
+}
+
+// Groups a set of strategies at runtime, the conversion from P1 to P2 will take place on the LAST strategy.
+template <typename... Strategies>
+struct strategy_group
+{
+ strategy_group(Strategies const& ... ops)
+ : ops_(ops ...) {}
+
+ template <typename P1, typename P2>
+ inline bool apply(P1 const& p1, P2 & p2) const
+ {
+ bool status = true;
+ p2 = execute_start<P1,P2>(p1, status, ops_);
+ return status;
+ }
+
+ template <typename P1, typename P2, typename... Args, std::size_t... Is>
+ inline P2 execute_start(P1 const & p1, bool & status, std::tuple<Args const&...> const& tup, helper::index<Is...>) const
+ {
+ return execute<P1,P2, Args...>(p1, status, std::get<Is>(tup)...);
+ }
+
+ template <typename P1, typename P2>
+ inline P2 execute_start(P1 const& p, bool & status, std::tuple<Strategies const& ...> const& tup) const
+ {
+ return execute_start<P1,P2, Strategies...>(p, status, tup, helper::gen_seq<sizeof...(Strategies)> {} );
+ }
+
+ template <typename P1, typename P2, typename T, typename ...Args>
+ inline P2 execute(P1 const& p, bool & status, T const& strat, Args const& ... args) const
+ {
+ return execute<P1,P2>(strat.template execute<P1,P1>(p, status), status, args...);
+ }
+
+ template <typename P1, typename P2, typename T>
+ inline P2 execute(P1 const& p, bool & status, T const& strat) const
+ {
+ return strat.template execute<P1,P2>(p, status);
+ }
+
+private:
+ std::tuple<Strategies const& ...> ops_;
+
+};
+
+
+// The difference between this strategy group and the previous is that the conversion from P1 to P2 happens
+// in the first strategy rather then the last strategy.
+template <typename... Strategies>
+struct strategy_group_first
+{
+ strategy_group_first(Strategies const& ... ops)
+ : ops_(ops ...) {}
+
+ template <typename P1, typename P2>
+ inline bool apply(P1 const& p1, P2 & p2) const
+ {
+ bool status = true;
+ p2 = execute_start<P1,P2>(p1, status, ops_);
+ return status;
+ }
+
+ template <typename P1, typename P2, typename... Args, std::size_t... Is>
+ inline P2 execute_start(P1 const & p1, bool & status, std::tuple<Args const&...> const& tup, helper::index<Is...>) const
+ {
+ return execute_first<P1,P2, Args...>(p1, status, std::get<Is>(tup)...);
+ }
+
+ template <typename P1, typename P2>
+ inline P2 execute_start(P1 const& p, bool & status, std::tuple<Strategies const& ...> const& tup) const
+ {
+ return execute_start<P1,P2, Strategies...>(p, status, tup, helper::gen_seq<sizeof...(Strategies)> {} );
+ }
+
+ template <typename P1, typename P2, typename T, typename ...Args>
+ inline P2 execute_first(P1 const& p, bool & status, T const& strat, Args const& ... args) const
+ {
+ return execute<P2>(strat.template execute<P1,P2>(p, status), status, args...);
+ }
+
+ template <typename P2, typename T, typename ...Args>
+ inline P2 execute(P2 const& p, bool & status, T const& strat, Args const& ... args) const
+ {
+ return execute<P2>(strat.template execute<P2,P2>(p, status), status, args...);
+ }
+
+ template <typename P2, typename T>
+ inline P2 execute(P2 const& p, bool & status, T const& strat) const
+ {
+ return strat.template execute<P2,P2>(p, status);
+ }
+
+ template <typename P2>
+ inline P2 execute(P2 const& p, bool & status) const
+ {
+ return p;
+ }
+
+private:
+ std::tuple<Strategies const& ...> ops_;
+
+};
+
+struct scale_strategy
+{
+ scale_strategy(double scale, double offset = 0)
+ : scale_(scale), offset_(offset) {}
+
+ template <typename P1, typename P2>
+ inline bool apply(P1 const & p1, P2 & p2) const
+ {
+
+ using p2_type = typename boost::geometry::coordinate_type<P2>::type;
+ double x = (boost::geometry::get<0>(p1) * scale_) + offset_;
+ double y = (boost::geometry::get<1>(p1) * scale_) + offset_;
+ try {
+ boost::geometry::set<0>(p2, boost::numeric_cast<p2_type>(x));
+ }
+ catch(boost::numeric::negative_overflow&)
+ {
+ boost::geometry::set<0>(p2, std::numeric_limits<p2_type>::min());
+ }
+ catch(boost::numeric::positive_overflow&)
+ {
+ boost::geometry::set<0>(p2, std::numeric_limits<p2_type>::max());
+ }
+ try {
+ boost::geometry::set<1>(p2, boost::numeric_cast<p2_type>(y));
+ }
+ catch(boost::numeric::negative_overflow&)
+ {
+ boost::geometry::set<1>(p2, std::numeric_limits<p2_type>::min());
+ }
+ catch(boost::numeric::positive_overflow&)
+ {
+ boost::geometry::set<1>(p2, std::numeric_limits<p2_type>::max());
+ }
+ return true;
+ }
+
+ template <typename P1, typename P2>
+ inline P2 execute(P1 const& p1, bool & status) const
+ {
+ P2 p2;
+ status = apply(p1, p2);
+ return p2;
+ }
+
+private:
+ double scale_;
+ double offset_;
+};
+
+struct scale_rounding_strategy
+{
+ scale_rounding_strategy(double scale, double offset = 0)
+ : scale_(scale), offset_(offset) {}
+
+ template <typename P1, typename P2>
+ inline bool apply(P1 const & p1, P2 & p2) const
+ {
+
+ using p2_type = typename boost::geometry::coordinate_type<P2>::type;
+ double x = (boost::geometry::get<0>(p1) * scale_) + offset_;
+ double y = (boost::geometry::get<1>(p1) * scale_) + offset_;
+ try {
+ boost::geometry::set<0>(p2, util::rounding_cast<p2_type>(x));
+ }
+ catch(boost::numeric::negative_overflow&)
+ {
+ boost::geometry::set<0>(p2, std::numeric_limits<p2_type>::min());
+ }
+ catch(boost::numeric::positive_overflow&)
+ {
+ boost::geometry::set<0>(p2, std::numeric_limits<p2_type>::max());
+ }
+ try {
+ boost::geometry::set<1>(p2, util::rounding_cast<p2_type>(y));
+ }
+ catch(boost::numeric::negative_overflow&)
+ {
+ boost::geometry::set<1>(p2, std::numeric_limits<p2_type>::min());
+ }
+ catch(boost::numeric::positive_overflow&)
+ {
+ boost::geometry::set<1>(p2, std::numeric_limits<p2_type>::max());
+ }
+ return true;
+ }
+
+ template <typename P1, typename P2>
+ inline P2 execute(P1 const& p1, bool & status) const
+ {
+ P2 p2;
+ status = apply(p1, p2);
+ return p2;
+ }
+
+private:
+ double scale_;
+ double offset_;
+};
+
+
+} // end geometry ns
+} // end mapnik ns
+
+#endif //MAPNIK_GEOMETRY_STRATEGY_HPP
diff --git a/include/mapnik/geometry_to_path.hpp b/include/mapnik/geometry_to_path.hpp
new file mode 100644
index 0000000..d443158
--- /dev/null
+++ b/include/mapnik/geometry_to_path.hpp
@@ -0,0 +1,166 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GEOMETRY_TO_PATH_HPP
+#define MAPNIK_GEOMETRY_TO_PATH_HPP
+
+#include <mapnik/geometry.hpp>
+#include <mapnik/path.hpp>
+
+namespace mapnik { namespace geometry { namespace detail {
+
+//template <typename Transformer>
+struct geometry_to_path
+{
+ geometry_to_path(path_type & p)
+ : p_(p) {}
+
+ template <typename T>
+ void operator() (geometry<T> const& geom) const
+ {
+ mapnik::util::apply_visitor(*this, geom);
+ }
+
+ void operator() (geometry_empty const&) const
+ {
+ // no-op
+ }
+ // point
+ template <typename T>
+ void operator() (point<T> const& pt) const
+ {
+ //point pt_new;
+ //Transformer::apply(pt, pt_new);
+ p_.move_to(pt.x, pt.y);
+ }
+
+ // line_string
+ template <typename T>
+ void operator() (line_string<T> const& line) const
+ {
+ bool first = true;
+ for (auto const& pt : line)
+ {
+ //point pt_new;
+ //Transformer::apply(pt, pt_new);
+ if (first) { p_.move_to(pt.x, pt.y); first=false;}
+ else p_.line_to(pt.x, pt.y);
+ }
+ }
+
+ // polygon
+ template <typename T>
+ void operator() (polygon<T> const& poly) const
+ {
+ // exterior
+ bool first = true;
+ for (auto const& pt : poly.exterior_ring)
+ {
+ if (first)
+ {
+ p_.move_to(pt.x, pt.y);
+ first=false;
+ }
+ else
+ {
+ p_.line_to(pt.x, pt.y);
+ }
+ }
+ if (!first)
+ {
+ p_.close_path();
+ }
+ // interior
+ for (auto const& ring : poly.interior_rings)
+ {
+ first = true;
+ for (auto const& pt : ring)
+ {
+ if (first) {
+ p_.move_to(pt.x, pt.y);
+ first=false;
+ }
+ else
+ {
+ p_.line_to(pt.x, pt.y);
+ }
+ }
+ if (!first)
+ {
+ p_.close_path();
+ }
+ }
+ }
+
+ // multi point
+ template <typename T>
+ void operator() (multi_point<T> const& multi_pt) const
+ {
+ for (auto const& pt : multi_pt)
+ {
+ (*this)(pt);
+ }
+ }
+ // multi_line_string
+ template <typename T>
+ void operator() (multi_line_string<T> const& multi_line) const
+ {
+ for (auto const& line : multi_line)
+ {
+ (*this)(line);
+ }
+ }
+
+ // multi_polygon
+ template <typename T>
+ void operator() (multi_polygon<T> const& multi_poly) const
+ {
+ for (auto const& poly : multi_poly)
+ {
+ (*this)(poly);
+ }
+ }
+
+ template <typename T>
+ void operator() (geometry_collection<T> const& collection) const
+ {
+ for (auto const& geom : collection)
+ {
+ (*this)(geom);
+ }
+ }
+
+ path_type & p_;
+
+};
+} // ns detail
+
+template <typename T>
+void to_path(T const& geom, path_type & p)
+{
+ detail::geometry_to_path func(p);
+ func(geom);
+}
+
+}}
+
+#endif // MAPNIK_GEOMETRY_TO_PATH_HPP
diff --git a/include/mapnik/geometry_transform.hpp b/include/mapnik/geometry_transform.hpp
new file mode 100644
index 0000000..5a0c263
--- /dev/null
+++ b/include/mapnik/geometry_transform.hpp
@@ -0,0 +1,220 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GEOMETRY_TRANSFORM_HPP
+#define MAPNIK_GEOMETRY_TRANSFORM_HPP
+
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_adapters.hpp>
+#include <boost/geometry/algorithms/transform.hpp>
+
+namespace mapnik { namespace geometry { namespace detail {
+
+template <typename V, typename T, typename Transformer>
+inline point<V> transform_geometry(point<T> const& geom, Transformer const& transformer)
+{
+ point<V> geom_transformed;
+ if (!boost::geometry::transform(geom, geom_transformed, transformer))
+ {
+ throw std::runtime_error("Can't transformm geometry");
+ }
+ return geom_transformed;
+}
+
+template <typename V, typename T, typename Transformer>
+inline multi_point<V> transform_geometry(multi_point<T> const& geom, Transformer const& transformer)
+{
+ multi_point<V> geom_transformed;
+ if (!boost::geometry::transform(geom, geom_transformed, transformer))
+ {
+ throw std::runtime_error("Can't transformm geometry");
+ }
+ return geom_transformed;
+}
+
+template <typename V, typename T, typename Transformer>
+inline line_string<V> transform_geometry(line_string<T> const& geom, Transformer const& transformer)
+{
+ line_string<V> geom_transformed;
+ if (!boost::geometry::transform(geom, geom_transformed, transformer))
+ {
+ throw std::runtime_error("Can't transformm geometry");
+ }
+ return geom_transformed;
+}
+
+template <typename V, typename T, typename Transformer>
+inline multi_line_string<V> transform_geometry(multi_line_string<T> const& geom, Transformer const& transformer)
+{
+ multi_line_string<V> geom_transformed;
+ if (!boost::geometry::transform(geom, geom_transformed, transformer))
+ {
+ throw std::runtime_error("Can't transformm geometry");
+ }
+ return geom_transformed;
+}
+
+template <typename V, typename T, typename Transformer>
+inline polygon<V> transform_geometry(polygon<T> const& geom, Transformer const& transformer)
+{
+ polygon<V> geom_transformed;
+ if (!boost::geometry::transform(geom, geom_transformed, transformer))
+ {
+ throw std::runtime_error("Can't transformm geometry");
+ }
+ return geom_transformed;
+}
+
+template <typename V, typename T, typename Transformer>
+inline multi_polygon<V> transform_geometry(multi_polygon<T> const& geom, Transformer const& transformer)
+{
+ multi_polygon<V> geom_transformed;
+ if (!boost::geometry::transform(geom, geom_transformed, transformer))
+ {
+ throw std::runtime_error("Can't transformm geometry");
+ }
+ return geom_transformed;
+}
+
+template <typename Transformer, typename V>
+struct geometry_transform
+{
+ geometry_transform(Transformer const& transformer)
+ : transformer_(transformer) {}
+
+ using result_type = geometry<V>;
+
+ geometry<V> operator() (geometry_empty const& empty) const
+ {
+ return empty;
+ }
+
+ template <typename T>
+ geometry<V> operator() (geometry_collection<T> const& collection) const
+ {
+ geometry_collection<V> collection_out;
+ for (auto const& geom : collection)
+ {
+ collection_out.push_back(std::move((*this)(geom)));
+ }
+ return collection_out;
+ }
+
+ template <typename T>
+ geometry<V> operator() (geometry<T> const& geom) const
+ {
+ return mapnik::util::apply_visitor(*this, geom);
+ }
+
+ template <typename T>
+ geometry<V> operator() (point<T> const& geom) const
+ {
+ return std::move(transform_geometry<V>(geom, transformer_));
+ }
+
+ template <typename T>
+ geometry<V> operator() (line_string<T> const& geom) const
+ {
+ return std::move(transform_geometry<V>(geom, transformer_));
+ }
+
+ template <typename T>
+ geometry<V> operator() (polygon<T> const& geom) const
+ {
+ return std::move(transform_geometry<V>(geom, transformer_));
+ }
+
+ template <typename T>
+ geometry<V> operator() (multi_point<T> const& geom) const
+ {
+ return std::move(transform_geometry<V>(geom, transformer_));
+ }
+
+ template <typename T>
+ geometry<V> operator() (multi_line_string<T> const& geom) const
+ {
+ return std::move(transform_geometry<V>(geom, transformer_));
+ }
+
+ template <typename T>
+ geometry<V> operator() (multi_polygon<T> const& geom) const
+ {
+ return std::move(transform_geometry<V>(geom, transformer_));
+ }
+
+ Transformer const& transformer_;
+};
+
+} // ns detail
+
+template <typename T0, typename T1, typename T2>
+geometry<T0> transform(geometry<T1> const& geom, T2 const& transformer)
+{
+ return detail::geometry_transform<T2, T0>(transformer)(geom);
+}
+
+template <typename T0, typename T1, typename T2>
+geometry<T0> transform(geometry_collection<T1> const& geom, T2 const& transformer)
+{
+ return detail::geometry_transform<T2, T0>(transformer)(geom);
+}
+
+template <typename T0, typename T1, typename T2>
+point<T0> transform(point<T1> const& geom, T2 const& transformer)
+{
+ return detail::transform_geometry<T0>(geom, transformer);
+}
+
+template <typename T0, typename T1, typename T2>
+multi_point<T0> transform(multi_point<T1> const& geom, T2 const& transformer)
+{
+ return detail::transform_geometry<T0>(geom, transformer);
+}
+
+template <typename T0, typename T1, typename T2>
+line_string<T0> transform(line_string<T1> const& geom, T2 const& transformer)
+{
+ return detail::transform_geometry<T0>(geom, transformer);
+}
+
+template <typename T0, typename T1, typename T2>
+multi_line_string<T0> transform(multi_line_string<T1> const& geom, T2 const& transformer)
+{
+ return detail::transform_geometry<T0>(geom, transformer);
+}
+
+template <typename T0, typename T1, typename T2>
+polygon<T0> transform(polygon<T1> const& geom, T2 const& transformer)
+{
+ return detail::transform_geometry<T0>(geom, transformer);
+}
+
+template <typename T0, typename T1, typename T2>
+multi_polygon<T0> transform(multi_polygon<T1> const& geom, T2 const& transformer)
+{
+ return detail::transform_geometry<T0>(geom, transformer);
+}
+
+
+}}
+
+#endif // MAPNIK_GEOMETRY_TRANSFORM_HPP
diff --git a/include/mapnik/geometry_type.hpp b/include/mapnik/geometry_type.hpp
new file mode 100644
index 0000000..b052446
--- /dev/null
+++ b/include/mapnik/geometry_type.hpp
@@ -0,0 +1,98 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GEOMETRY_TYPE_HPP
+#define MAPNIK_GEOMETRY_TYPE_HPP
+
+// mapnik
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_types.hpp>
+
+namespace mapnik { namespace geometry { namespace detail {
+
+struct geometry_type
+{
+ template <typename T>
+ mapnik::geometry::geometry_types operator () (T const& geom) const
+ {
+ return mapnik::util::apply_visitor(*this, geom);
+ }
+
+ mapnik::geometry::geometry_types operator() (geometry_empty const& ) const
+ {
+ return mapnik::geometry::geometry_types::Unknown;
+ }
+
+ template <typename T>
+ mapnik::geometry::geometry_types operator () (mapnik::geometry::point<T> const&) const
+ {
+ return mapnik::geometry::geometry_types::Point;
+ }
+
+ template <typename T>
+ mapnik::geometry::geometry_types operator () (mapnik::geometry::line_string<T> const&) const
+ {
+ return mapnik::geometry::geometry_types::LineString;
+ }
+
+ template <typename T>
+ mapnik::geometry::geometry_types operator () (mapnik::geometry::polygon<T> const&) const
+ {
+ return mapnik::geometry::geometry_types::Polygon;
+ }
+
+ template <typename T>
+ mapnik::geometry::geometry_types operator () (mapnik::geometry::multi_point<T> const&) const
+ {
+ return mapnik::geometry::geometry_types::MultiPoint;
+ }
+
+ template <typename T>
+ mapnik::geometry::geometry_types operator () (mapnik::geometry::multi_line_string<T> const&) const
+ {
+ return mapnik::geometry::geometry_types::MultiLineString;
+ }
+
+ template <typename T>
+ mapnik::geometry::geometry_types operator () (mapnik::geometry::multi_polygon<T> const&) const
+ {
+ return mapnik::geometry::geometry_types::MultiPolygon;
+ }
+
+ template <typename T>
+ mapnik::geometry::geometry_types operator () (mapnik::geometry::geometry_collection<T> const&) const
+ {
+ return mapnik::geometry::geometry_types::GeometryCollection;
+ }
+};
+} // detail
+
+template <typename T>
+static inline mapnik::geometry::geometry_types geometry_type(T const& geom)
+{
+ return detail::geometry_type()(geom);
+}
+
+}}
+
+
+#endif // MAPNIK_GEOMETRY_TYPE_HPP
diff --git a/include/mapnik/geometry_types.hpp b/include/mapnik/geometry_types.hpp
new file mode 100644
index 0000000..8c4d677
--- /dev/null
+++ b/include/mapnik/geometry_types.hpp
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GEOMETRY_TYPES_HPP
+#define MAPNIK_GEOMETRY_TYPES_HPP
+
+#include <cstdint>
+
+namespace mapnik { namespace geometry {
+
+// OGC compatible types
+enum geometry_types : std::uint8_t
+{
+ Unknown = 0,
+ Point = 1,
+ LineString = 2,
+ Polygon = 3,
+ MultiPoint = 4,
+ MultiLineString = 5,
+ MultiPolygon = 6,
+ GeometryCollection = 7,
+};
+
+}}
+
+#endif // MAPNIK_GEOMETRY_TYPES_HPP
diff --git a/include/mapnik/geometry_unique.hpp b/include/mapnik/geometry_unique.hpp
new file mode 100644
index 0000000..1678228
--- /dev/null
+++ b/include/mapnik/geometry_unique.hpp
@@ -0,0 +1,82 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GEOMETRY_UNIQUE_HPP
+#define MAPNIK_GEOMETRY_UNIQUE_HPP
+
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_adapters.hpp>
+#include <boost/geometry/algorithms/unique.hpp>
+
+#include <type_traits>
+
+namespace mapnik { namespace geometry {
+
+namespace detail {
+
+struct geometry_unique
+{
+ using result_type = void;
+
+ result_type operator() (geometry & geom) const
+ {
+ mapnik::util::apply_visitor(*this, geom);
+ }
+
+ result_type operator() (geometry_collection & collection) const
+ {
+ for (auto & geom : collection)
+ {
+ (*this)(geom);
+ }
+ }
+
+ result_type operator() (line_string & line) const
+ {
+ boost::geometry::unique(line);
+ }
+
+ result_type operator() (polygon & poly) const
+ {
+ boost::geometry::unique(poly);
+ }
+
+ template <typename T>
+ result_type operator() (T & geom) const
+ {
+ // no-op
+ }
+
+};
+
+}
+
+template <typename GeomType>
+inline void unique(GeomType & geom)
+{
+ static_assert(!std::is_const<GeomType>::value,"mapnik::geometry::unique on const& is invalid");
+ detail::geometry_unique()(geom);
+}
+
+}}
+
+#endif // MAPNIK_GEOMETRY_UNIQUE_HPP
diff --git a/include/mapnik/global.hpp b/include/mapnik/global.hpp
index d1dcf07..4526f05 100644
--- a/include/mapnik/global.hpp
+++ b/include/mapnik/global.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -48,8 +48,6 @@ namespace mapnik
(((std::uint64_t) ((std::uint8_t) (A)[1])) << 48) | \
(((std::uint64_t) ((std::uint8_t) (A)[0])) << 56))
-using byte = std::uint8_t;
-
#define float8net(V,M) do { double def_temp; \
((std::uint8_t*) &def_temp)[0]=(M)[7]; \
((std::uint8_t*) &def_temp)[1]=(M)[6]; \
diff --git a/include/mapnik/gradient.hpp b/include/mapnik/gradient.hpp
index 41493ca..a7e628a 100644
--- a/include/mapnik/gradient.hpp
+++ b/include/mapnik/gradient.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -61,8 +61,8 @@ DEFINE_ENUM( gradient_unit_e, gradient_unit_enum );
class MAPNIK_DECL gradient
{
- gradient_e gradient_type_;
- stop_array stops_;
+ // transform
+ agg::trans_affine transform_;
// control points for the gradient, x1/y1 is the start point, x2/y2 the stop point.
double x1_;
double y1_;
@@ -71,11 +71,11 @@ class MAPNIK_DECL gradient
// for radial gradients r specifies the radius of the stop circle centered on x2/y2
double r_;
+ stop_array stops_;
// units for the coordinates
gradient_unit_e units_;
+ gradient_e gradient_type_;
- // transform
- agg::trans_affine transform_;
public:
gradient();
gradient(gradient const& other);
diff --git a/include/mapnik/graphics.hpp b/include/mapnik/graphics.hpp
deleted file mode 100644
index b15d9f4..0000000
--- a/include/mapnik/graphics.hpp
+++ /dev/null
@@ -1,313 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2011 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#ifndef MAPNIK_GRAPHICS_HPP
-#define MAPNIK_GRAPHICS_HPP
-
-// mapnik
-#include <mapnik/config.hpp>
-#include <mapnik/color.hpp>
-#include <mapnik/image_data.hpp>
-#include <mapnik/box2d.hpp>
-#include <mapnik/image_view.hpp>
-#include <mapnik/global.hpp>
-
-// stl
-#include <algorithm>
-#include <string>
-#include <memory>
-
-// boost
-#include <boost/optional/optional.hpp>
-
-struct _cairo_surface;
-typedef struct _cairo_surface cairo_surface_t;
-
-namespace mapnik
-{
-
-using cairo_surface_ptr = std::shared_ptr<cairo_surface_t>;
-
-class MAPNIK_DECL image_32
-{
-private:
- unsigned width_;
- unsigned height_;
- boost::optional<color> background_;
- image_data_32 data_;
- bool painted_;
- bool premultiplied_;
-public:
- image_32(int width,int height);
- image_32(image_32 const& rhs);
-#ifdef HAVE_CAIRO
- explicit image_32(cairo_surface_ptr const& surface);
-#endif
- ~image_32();
-
- void painted(bool painted)
- {
- painted_ = painted;
- }
-
- bool painted() const
- {
- return painted_;
- }
-
- bool premultiplied() const
- {
- return premultiplied_;
- }
-
- inline void clear()
- {
- std::fill(data_.getData(), data_.getData() + data_.width() * data_.height(), 0);
- }
-
- boost::optional<color> const& get_background() const;
-
- void set_background(const color& c);
-
- void premultiply();
-
- void demultiply();
-
- void set_grayscale_to_alpha();
-
- void set_color_to_alpha(color const& c);
-
- void set_alpha(float opacity);
-
- inline const image_data_32& data() const
- {
- return data_;
- }
-
- inline image_data_32& data()
- {
- return data_;
- }
-
- inline const unsigned char* raw_data() const
- {
- return data_.getBytes();
- }
-
- inline unsigned char* raw_data()
- {
- return data_.getBytes();
- }
-
- inline image_view<image_data_32> get_view(unsigned x,unsigned y, unsigned w,unsigned h)
- {
- return image_view<image_data_32>(x,y,w,h,data_);
- }
-
-private:
-
- inline bool checkBounds(int x, int y) const
- {
- return (x >= 0 && x < static_cast<int>(width_) && y >= 0 && y < static_cast<int>(height_));
- }
-
-public:
- inline void setPixel(int x,int y,unsigned int rgba)
- {
- if (checkBounds(x,y))
- {
- data_(x,y)=rgba;
- }
- }
-
- void composite_pixel(unsigned op, int x,int y,unsigned c, unsigned cover, double opacity);
-
- inline unsigned width() const
- {
- return width_;
- }
-
- inline unsigned height() const
- {
- return height_;
- }
-
- inline void set_rectangle(int x0,int y0,image_data_32 const& data)
- {
- box2d<int> ext0(0,0,width_,height_);
- box2d<int> ext1(x0,y0,x0+data.width(),y0+data.height());
-
- if (ext0.intersects(ext1))
- {
- box2d<int> box = ext0.intersect(ext1);
- for (int y = box.miny(); y < box.maxy(); ++y)
- {
- unsigned int* row_to = data_.getRow(y);
- unsigned int const * row_from = data.getRow(y-y0);
-
- for (int x = box.minx(); x < box.maxx(); ++x)
- {
- if (row_from[x-x0] & 0xff000000)
- {
- row_to[x] = row_from[x-x0];
- }
- }
- }
- }
- }
-
- inline void set_rectangle_alpha(int x0,int y0,const image_data_32& data)
- {
- box2d<int> ext0(0,0,width_,height_);
- box2d<int> ext1(x0,y0,x0 + data.width(),y0 + data.height());
-
- if (ext0.intersects(ext1))
- {
- box2d<int> box = ext0.intersect(ext1);
- for (int y = box.miny(); y < box.maxy(); ++y)
- {
- unsigned int* row_to = data_.getRow(y);
- unsigned int const * row_from = data.getRow(y-y0);
- for (int x = box.minx(); x < box.maxx(); ++x)
- {
- unsigned rgba0 = row_to[x];
- unsigned rgba1 = row_from[x-x0];
- unsigned a1 = (rgba1 >> 24) & 0xff;
- if (a1 == 0) continue;
- if (a1 == 0xff)
- {
- row_to[x] = rgba1;
- continue;
- }
- unsigned r1 = rgba1 & 0xff;
- unsigned g1 = (rgba1 >> 8 ) & 0xff;
- unsigned b1 = (rgba1 >> 16) & 0xff;
-
- unsigned a0 = (rgba0 >> 24) & 0xff;
- unsigned r0 = (rgba0 & 0xff) * a0;
- unsigned g0 = ((rgba0 >> 8 ) & 0xff) * a0;
- unsigned b0 = ((rgba0 >> 16) & 0xff) * a0;
-
- a0 = ((a1 + a0) << 8) - a0*a1;
-
- r0 = ((((r1 << 8) - r0) * a1 + (r0 << 8)) / a0);
- g0 = ((((g1 << 8) - g0) * a1 + (g0 << 8)) / a0);
- b0 = ((((b1 << 8) - b0) * a1 + (b0 << 8)) / a0);
- a0 = a0 >> 8;
- row_to[x] = (a0 << 24)| (b0 << 16) | (g0 << 8) | (r0) ;
- }
- }
- }
- }
-
- inline void set_rectangle_alpha2(image_data_32 const& data, unsigned x0, unsigned y0, float opacity)
- {
- box2d<int> ext0(0,0,width_,height_);
- box2d<int> ext1(x0,y0,x0 + data.width(),y0 + data.height());
-
- if (ext0.intersects(ext1))
- {
- box2d<int> box = ext0.intersect(ext1);
- for (int y = box.miny(); y < box.maxy(); ++y)
- {
- unsigned int* row_to = data_.getRow(y);
- unsigned int const * row_from = data.getRow(y-y0);
- for (int x = box.minx(); x < box.maxx(); ++x)
- {
- unsigned rgba0 = row_to[x];
- unsigned rgba1 = row_from[x-x0];
- unsigned a1 = int( ((rgba1 >> 24) & 0xff) * opacity );
- if (a1 == 0) continue;
- if (a1 == 0xff)
- {
- row_to[x] = rgba1;
- continue;
- }
- unsigned r1 = rgba1 & 0xff;
- unsigned g1 = (rgba1 >> 8 ) & 0xff;
- unsigned b1 = (rgba1 >> 16) & 0xff;
-
- unsigned a0 = (rgba0 >> 24) & 0xff;
- unsigned r0 = rgba0 & 0xff ;
- unsigned g0 = (rgba0 >> 8 ) & 0xff;
- unsigned b0 = (rgba0 >> 16) & 0xff;
-
- unsigned atmp = a1 + a0 - ((a1 * a0 + 255) >> 8);
- if (atmp)
- {
- r0 = byte((r1 * a1 + (r0 * a0) - ((r0 * a0 * a1 + 255) >> 8)) / atmp);
- g0 = byte((g1 * a1 + (g0 * a0) - ((g0 * a0 * a1 + 255) >> 8)) / atmp);
- b0 = byte((b1 * a1 + (b0 * a0) - ((b0 * a0 * a1 + 255) >> 8)) / atmp);
- }
- a0 = byte(atmp);
-
- row_to[x] = (a0 << 24)| (b0 << 16) | (g0 << 8) | (r0) ;
- }
- }
- }
- }
-
- template <typename MergeMethod>
- inline void merge_rectangle(image_data_32 const& data, unsigned x0, unsigned y0, float opacity)
- {
- box2d<int> ext0(0,0,width_,height_);
- box2d<int> ext1(x0,y0,x0 + data.width(),y0 + data.height());
-
- if (ext0.intersects(ext1))
- {
- box2d<int> box = ext0.intersect(ext1);
- for (int y = box.miny(); y < box.maxy(); ++y)
- {
- unsigned int* row_to = data_.getRow(y);
- unsigned int const * row_from = data.getRow(y-y0);
- for (int x = box.minx(); x < box.maxx(); ++x)
- {
- unsigned rgba0 = row_to[x];
- unsigned rgba1 = row_from[x-x0];
- unsigned a1 = int( ((rgba1 >> 24) & 0xff) * opacity );
- if (a1 == 0) continue;
- unsigned r1 = rgba1 & 0xff;
- unsigned g1 = (rgba1 >> 8 ) & 0xff;
- unsigned b1 = (rgba1 >> 16) & 0xff;
-
- unsigned a0 = (rgba0 >> 24) & 0xff;
- unsigned r0 = rgba0 & 0xff ;
- unsigned g0 = (rgba0 >> 8 ) & 0xff;
- unsigned b0 = (rgba0 >> 16) & 0xff;
-
- unsigned a = (a1 * 255 + (255 - a1) * a0 + 127)/255;
-
- MergeMethod::mergeRGB(r0,g0,b0,r1,g1,b1);
-
- r0 = (r1*a1 + (((255 - a1) * a0 + 127)/255) * r0 + 127)/a;
- g0 = (g1*a1 + (((255 - a1) * a0 + 127)/255) * g0 + 127)/a;
- b0 = (b1*a1 + (((255 - a1) * a0 + 127)/255) * b0 + 127)/a;
-
- row_to[x] = (a << 24)| (b0 << 16) | (g0 << 8) | (r0) ;
- }
- }
- }
- }
-};
-}
-
-#endif // MAPNIK_GRAPHICS_HPP
diff --git a/include/mapnik/grid/grid.hpp b/include/mapnik/grid/grid.hpp
index 9267303..223d4a2 100644
--- a/include/mapnik/grid/grid.hpp
+++ b/include/mapnik/grid/grid.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,7 @@
// mapnik
#include <mapnik/config.hpp>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
#include <mapnik/box2d.hpp>
#include <mapnik/grid/grid_view.hpp>
#include <mapnik/global.hpp>
@@ -35,7 +35,6 @@
#include <mapnik/util/conversions.hpp>
// stl
-#include <cstdint>
#include <map>
#include <set>
#include <cmath>
@@ -49,8 +48,8 @@ template <typename T>
class MAPNIK_DECL hit_grid
{
public:
- using value_type = T;
- using data_type = mapnik::image_data<value_type>;
+ using value_type = typename T::type;
+ using data_type = mapnik::image<T>;
using lookup_type = std::string;
// mapping between pixel id and key
using feature_key_type = std::map<value_type, lookup_type>;
@@ -62,7 +61,6 @@ private:
unsigned height_;
std::string key_;
data_type data_;
- unsigned int resolution_;
std::string id_name_;
bool painted_;
std::set<std::string> names_;
@@ -72,7 +70,7 @@ private:
public:
- hit_grid(int width, int height, std::string const& key, unsigned int resolution);
+ hit_grid(int width, int height, std::string const& key);
hit_grid(hit_grid<T> const& rhs);
@@ -97,12 +95,12 @@ public:
void add_feature(mapnik::feature_impl const& feature);
- inline void add_property_name(std::string const& name)
+ inline void add_field(std::string const& name)
{
names_.insert(name);
}
- inline std::set<std::string> const& property_names() const
+ inline std::set<std::string> const& get_fields() const
{
return names_;
}
@@ -127,16 +125,6 @@ public:
key_ = key;
}
- inline unsigned int get_resolution() const
- {
- return resolution_;
- }
-
- inline void set_resolution(unsigned int res)
- {
- resolution_ = res;
- }
-
inline data_type const& data() const
{
return data_;
@@ -147,25 +135,25 @@ public:
return data_;
}
- inline T const * raw_data() const
+ inline value_type const * raw_data() const
{
- return data_.getData();
+ return data_.data();
}
- inline T* raw_data()
+ inline value_type* raw_data()
{
- return data_.getData();
+ return data_.data();
}
- inline value_type const * getRow(unsigned row) const
+ inline value_type const * get_row(unsigned row) const
{
- return data_.getRow(row);
+ return data_.get_row(row);
}
inline mapnik::grid_view get_view(unsigned x, unsigned y, unsigned w, unsigned h)
{
return mapnik::grid_view(x,y,w,h,
- data_,key_,id_name_,resolution_,names_,f_keys_,features_);
+ data_,key_,id_name_,names_,f_keys_,features_);
}
private:
@@ -195,7 +183,7 @@ public:
return height_;
}
- inline void set_rectangle(value_type id,image_data_32 const& data,int x0,int y0)
+ inline void set_rectangle(value_type id,image_rgba8 const& data,int x0,int y0)
{
box2d<int> ext0(0,0,width_,height_);
box2d<int> ext1(x0,y0,x0+data.width(),y0+data.height());
@@ -205,8 +193,8 @@ public:
box2d<int> box = ext0.intersect(ext1);
for (int y = box.miny(); y < box.maxy(); ++y)
{
- value_type* row_to = data_.getRow(y);
- unsigned int const * row_from = data.getRow(y-y0);
+ value_type* row_to = data_.get_row(y);
+ unsigned int const * row_from = data.get_row(y-y0);
for (int x = box.minx(); x < box.maxx(); ++x)
{
@@ -222,10 +210,9 @@ public:
}
}
}
-
};
-using grid = hit_grid<mapnik::value_integer>;
+using grid = hit_grid<mapnik::value_integer_pixel>;
}
#endif //MAPNIK_GRID_HPP
diff --git a/include/mapnik/grid/grid_marker_helpers.hpp b/include/mapnik/grid/grid_marker_helpers.hpp
deleted file mode 100644
index 595b704..0000000
--- a/include/mapnik/grid/grid_marker_helpers.hpp
+++ /dev/null
@@ -1,236 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2012 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#ifndef MAPNIK_GRID_MARKER_HELPERS_HPP
-#define MAPNIK_GRID_MARKER_HELPERS_HPP
-
-// mapnik
-#include <mapnik/symbolizer.hpp>
-#include <mapnik/markers_placement.hpp>
-#include <mapnik/geometry.hpp>
-#include <mapnik/geom_util.hpp>
-
-// agg
-#include "agg_renderer_scanline.h"
-#include "agg_scanline_bin.h"
-#include "agg_image_filters.h"
-#include "agg_trans_bilinear.h"
-#include "agg_span_allocator.h"
-#include "agg_image_accessors.h"
-#include "agg_span_image_filter_gray.h"
-
-
-namespace mapnik {
-
-template <typename RendererBase, typename RendererType, typename Detector, typename RendererContext>
-struct raster_markers_rasterizer_dispatch_grid : mapnik::noncopyable
-{
- using pixfmt_type = typename RendererBase::pixfmt_type;
- using color_type = typename RendererBase::pixfmt_type::color_type;
-
- using BufferType = typename std::tuple_element<0,RendererContext>::type;
- using RasterizerType = typename std::tuple_element<1,RendererContext>::type;
- using PixMapType = typename std::tuple_element<2,RendererContext>::type;
-
- raster_markers_rasterizer_dispatch_grid(image_data_32 const& src,
- agg::trans_affine const& marker_trans,
- markers_symbolizer const& sym,
- Detector & detector,
- double scale_factor,
- mapnik::feature_impl const& feature,
- attributes const& vars,
- RendererContext const& renderer_context)
- : buf_(std::get<0>(renderer_context)),
- pixf_(buf_),
- renb_(pixf_),
- ras_(std::get<1>(renderer_context)),
- src_(src),
- marker_trans_(marker_trans),
- sym_(sym),
- detector_(detector),
- scale_factor_(scale_factor),
- feature_(feature),
- vars_(vars),
- pixmap_(std::get<2>(renderer_context)),
- placed_(false) {}
-
- template <typename T>
- void add_path(T & path)
- {
- agg::scanline_bin sl_;
- marker_placement_enum placement_method = get<marker_placement_enum>(sym_, keys::markers_placement_type, feature_, vars_, MARKER_POINT_PLACEMENT);
- bool ignore_placement = get<bool>(sym_, keys::ignore_placement, feature_, vars_, false);
- bool allow_overlap = get<bool>(sym_, keys::allow_overlap, feature_, vars_, false);
- bool avoid_edges = get<bool>(sym_, keys::avoid_edges, feature_, vars_, false);
- box2d<double> bbox(0,0, src_.width(), src_.height());
- double spacing = get<double>(sym_, keys::spacing, feature_, vars_, 100.0);
- double max_error = get<double>(sym_, keys::max_error, feature_, vars_, 0.2);
- markers_placement_params params { bbox, marker_trans_, spacing * scale_factor_, max_error, allow_overlap, avoid_edges };
- markers_placement_finder<T, label_collision_detector4> placement_finder(
- placement_method, path, detector_, params);
- double x, y, angle = .0;
- while (placement_finder.get_point(x, y, angle, ignore_placement))
- {
- agg::trans_affine matrix = marker_trans_;
- matrix.rotate(angle);
- matrix.translate(x, y);
- render_raster_marker(matrix);
- if (!placed_)
- {
- pixmap_.add_feature(feature_);
- placed_ = true;
- }
- }
- }
-
- void render_raster_marker(agg::trans_affine const& marker_tr)
- {
- agg::scanline_bin sl_;
- double width = src_.width();
- double height = src_.height();
- double p[8];
- p[0] = 0; p[1] = 0;
- p[2] = width; p[3] = 0;
- p[4] = width; p[5] = height;
- p[6] = 0; p[7] = height;
- marker_tr.transform(&p[0], &p[1]);
- marker_tr.transform(&p[2], &p[3]);
- marker_tr.transform(&p[4], &p[5]);
- marker_tr.transform(&p[6], &p[7]);
- ras_.move_to_d(p[0],p[1]);
- ras_.line_to_d(p[2],p[3]);
- ras_.line_to_d(p[4],p[5]);
- ras_.line_to_d(p[6],p[7]);
- RendererType ren(renb_);
- ren.color(color_type(feature_.id()));
- agg::render_scanlines(ras_, sl_, ren);
- }
-
-private:
- BufferType & buf_;
- pixfmt_type pixf_;
- RendererBase renb_;
- RasterizerType & ras_;
- image_data_32 const& src_;
- agg::trans_affine const& marker_trans_;
- markers_symbolizer const& sym_;
- Detector & detector_;
- double scale_factor_;
- mapnik::feature_impl const& feature_;
- attributes const& vars_;
- PixMapType & pixmap_;
- bool placed_;
-};
-
-
-template <typename SvgRenderer, typename Detector, typename RendererContext>
-struct vector_markers_rasterizer_dispatch_grid : mapnik::noncopyable
-{
- using renderer_base = typename SvgRenderer::renderer_base ;
- using vertex_source_type = typename SvgRenderer::vertex_source_type ;
- using attribute_source_type = typename SvgRenderer::attribute_source_type;
- using pixfmt_type = typename renderer_base::pixfmt_type ;
-
- using BufferType = typename std::tuple_element<0,RendererContext>::type;
- using RasterizerType = typename std::tuple_element<1,RendererContext>::type;
- using PixMapType = typename std::tuple_element<2,RendererContext>::type;
-
- vector_markers_rasterizer_dispatch_grid(vertex_source_type & path,
- attribute_source_type const& attrs,
- box2d<double> const& bbox,
- agg::trans_affine const& marker_trans,
- markers_symbolizer const& sym,
- Detector & detector,
- double scale_factor,
- mapnik::feature_impl const& feature,
- attributes const& vars,
- bool /*snap_to_pixels*/,
- RendererContext const& renderer_context)
- : buf_(std::get<0>(renderer_context)),
- pixf_(buf_),
- renb_(pixf_),
- svg_renderer_(path, attrs),
- ras_(std::get<1>(renderer_context)),
- bbox_(bbox),
- marker_trans_(marker_trans),
- sym_(sym),
- detector_(detector),
- scale_factor_(scale_factor),
- feature_(feature),
- vars_(vars),
- pixmap_(std::get<2>(renderer_context)),
- placed_(false)
- {
- }
-
- template <typename T>
- void add_path(T & path)
- {
- agg::scanline_bin sl_;
- marker_placement_enum placement_method =
- get<marker_placement_enum>(sym_, keys::markers_placement_type, feature_, vars_, MARKER_POINT_PLACEMENT);
- bool ignore_placement = get<bool>(sym_, keys::ignore_placement, feature_, vars_, false);
- double opacity = get<double>(sym_,keys::opacity, feature_, vars_, 1.0);
- bool allow_overlap = get<bool>(sym_, keys::allow_overlap, feature_, vars_, false);
- bool avoid_edges = get<bool>(sym_, keys::avoid_edges, feature_, vars_, false);
- double spacing = get<double>(sym_, keys::spacing, feature_, vars_, 100.0);
- double max_error = get<double>(sym_, keys::max_error, feature_, vars_, 0.2);
- coord2d center = bbox_.center();
- agg::trans_affine_translation recenter(-center.x, -center.y);
- agg::trans_affine tr = recenter * marker_trans_;
- markers_placement_params params { bbox_, tr, spacing * scale_factor_, max_error, allow_overlap, avoid_edges };
- markers_placement_finder<T, Detector> placement_finder(
- placement_method, path, detector_, params);
- double x, y, angle = .0;
- while (placement_finder.get_point(x, y, angle, ignore_placement))
- {
- agg::trans_affine matrix = tr;
- matrix.rotate(angle);
- matrix.translate(x, y);
- svg_renderer_.render_id(ras_, sl_, renb_, feature_.id(), matrix, opacity, bbox_);
- if (!placed_)
- {
- pixmap_.add_feature(feature_);
- placed_ = true;
- }
- }
- }
-
-private:
- BufferType & buf_;
- pixfmt_type pixf_;
- renderer_base renb_;
- SvgRenderer svg_renderer_;
- RasterizerType & ras_;
- box2d<double> const& bbox_;
- agg::trans_affine const& marker_trans_;
- markers_symbolizer const& sym_;
- Detector & detector_;
- double scale_factor_;
- mapnik::feature_impl const& feature_;
- attributes const& vars_;
- PixMapType & pixmap_;
- bool placed_;
-};
-
-}
-#endif
diff --git a/include/mapnik/grid/grid_pixel.hpp b/include/mapnik/grid/grid_pixel.hpp
index 88bf28b..5ef1c78 100644
--- a/include/mapnik/grid/grid_pixel.hpp
+++ b/include/mapnik/grid/grid_pixel.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/grid/grid_pixfmt.hpp b/include/mapnik/grid/grid_pixfmt.hpp
index e3cfb3b..6f61b99 100644
--- a/include/mapnik/grid/grid_pixfmt.hpp
+++ b/include/mapnik/grid/grid_pixfmt.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/grid/grid_rasterizer.hpp b/include/mapnik/grid/grid_rasterizer.hpp
index 9cdbf27..cd73813 100644
--- a/include/mapnik/grid/grid_rasterizer.hpp
+++ b/include/mapnik/grid/grid_rasterizer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,12 +23,12 @@
#ifndef MAPNIK_GRID_RASTERIZER_HPP
#define MAPNIK_GRID_RASTERIZER_HPP
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include "agg_rasterizer_scanline_aa.h"
namespace mapnik {
-struct grid_rasterizer : agg::rasterizer_scanline_aa<>, mapnik::noncopyable {};
+struct grid_rasterizer : agg::rasterizer_scanline_aa<>, util::noncopyable {};
}
diff --git a/include/mapnik/grid/grid_render_marker.hpp b/include/mapnik/grid/grid_render_marker.hpp
new file mode 100644
index 0000000..79c5ec0
--- /dev/null
+++ b/include/mapnik/grid/grid_render_marker.hpp
@@ -0,0 +1,72 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2012 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_GRID_MARKER_HELPERS_HPP
+#define MAPNIK_GRID_MARKER_HELPERS_HPP
+
+// mapnik
+#include <mapnik/feature.hpp>
+
+// agg
+#include "agg_renderer_scanline.h"
+#include "agg_scanline_bin.h"
+#include "agg_image_filters.h"
+#include "agg_trans_bilinear.h"
+#include "agg_span_allocator.h"
+#include "agg_image_accessors.h"
+#include "agg_span_image_filter_gray.h"
+
+
+namespace mapnik {
+
+template <typename RendererType, typename RasterizerType>
+void render_raster_marker(RendererType ren,
+ RasterizerType & ras,
+ image_rgba8 const& src,
+ mapnik::feature_impl const& feature,
+ agg::trans_affine const& marker_tr,
+ double opacity)
+{
+ using color_type = typename RendererType::color_type;
+ agg::scanline_bin sl;
+ double width = src.width();
+ double height = src.height();
+ double p[8];
+ p[0] = 0; p[1] = 0;
+ p[2] = width; p[3] = 0;
+ p[4] = width; p[5] = height;
+ p[6] = 0; p[7] = height;
+ marker_tr.transform(&p[0], &p[1]);
+ marker_tr.transform(&p[2], &p[3]);
+ marker_tr.transform(&p[4], &p[5]);
+ marker_tr.transform(&p[6], &p[7]);
+ ras.move_to_d(p[0],p[1]);
+ ras.line_to_d(p[2],p[3]);
+ ras.line_to_d(p[4],p[5]);
+ ras.line_to_d(p[6],p[7]);
+ ren.color(color_type(feature.id()));
+ agg::render_scanlines(ras, sl, ren);
+}
+
+}
+
+#endif
diff --git a/include/mapnik/grid/grid_renderer.hpp b/include/mapnik/grid/grid_renderer.hpp
index a07ff76..2db7709 100644
--- a/include/mapnik/grid/grid_renderer.hpp
+++ b/include/mapnik/grid/grid_renderer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,7 +27,7 @@
#include <mapnik/config.hpp>
#include <mapnik/feature_style_processor.hpp>
#include <mapnik/grid/grid.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/rule.hpp> // for rule, symbolizers
#include <mapnik/box2d.hpp> // for box2d
#include <mapnik/color.hpp> // for color
@@ -49,7 +49,7 @@ namespace mapnik {
class feature_type_style;
class label_collision_detector4;
class layer;
- class marker;
+ struct marker;
class proj_transform;
struct grid_rasterizer;
class request;
@@ -59,7 +59,7 @@ namespace mapnik {
template <typename T>
class MAPNIK_DECL grid_renderer : public feature_style_processor<grid_renderer<T> >,
- private mapnik::noncopyable
+ private util::noncopyable
{
public:
diff --git a/include/mapnik/grid/grid_renderer_base.hpp b/include/mapnik/grid/grid_renderer_base.hpp
index a165f58..9524b16 100644
--- a/include/mapnik/grid/grid_renderer_base.hpp
+++ b/include/mapnik/grid/grid_renderer_base.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/grid/grid_rendering_buffer.hpp b/include/mapnik/grid/grid_rendering_buffer.hpp
index e418d4c..d5031c8 100644
--- a/include/mapnik/grid/grid_rendering_buffer.hpp
+++ b/include/mapnik/grid/grid_rendering_buffer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/grid/grid_util.hpp b/include/mapnik/grid/grid_util.hpp
index f681deb..28d9797 100644
--- a/include/mapnik/grid/grid_util.hpp
+++ b/include/mapnik/grid/grid_util.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -61,7 +61,7 @@ static inline void scale_grid(mapnik::grid::data_type & target,
//no scaling or subpixel offset
if (target_height == source_height && target_width == source_width && offs_x == 0 && offs_y == 0){
for (y=0;y<target_height;++y)
- target.setRow(y,source.getRow(y),target_width);
+ target.set_row(y,source.get_row(y),target_width);
return;
}
diff --git a/include/mapnik/grid/grid_view.hpp b/include/mapnik/grid/grid_view.hpp
index dff5e1e..f161eaa 100644
--- a/include/mapnik/grid/grid_view.hpp
+++ b/include/mapnik/grid/grid_view.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,7 +23,7 @@
#ifndef MAPNIK_GRID_VIEW_HPP
#define MAPNIK_GRID_VIEW_HPP
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
#include <mapnik/box2d.hpp>
#include <mapnik/global.hpp>
#include <mapnik/value.hpp>
@@ -55,7 +55,6 @@ public:
T const& data,
std::string const& key,
std::string const& id_name,
- unsigned resolution,
std::set<std::string> const& names,
feature_key_type const& f_keys,
feature_type const& features
@@ -66,7 +65,6 @@ public:
height_(height),
data_(data),
key_(key),
- resolution_(resolution),
id_name_(id_name),
names_(names),
f_keys_(f_keys),
@@ -88,7 +86,6 @@ public:
height_(rhs.height_),
data_(rhs.data_),
key_(rhs.key_),
- resolution_(rhs.resolution_),
id_name_(rhs.id_name_),
names_(rhs.names_),
f_keys_(rhs.f_keys_),
@@ -104,7 +101,6 @@ public:
height_ = rhs.height_;
data_ = rhs.data_;
key_ = rhs.key_;
- resolution_ = rhs.resolution_;
id_name_ = rhs.id_name_;
names_ = rhs.names_;
f_keys_ = rhs.f_keys_;
@@ -137,9 +133,9 @@ public:
return id_name_;
}
- inline value_type const * getRow(unsigned row) const
+ inline value_type const * get_row(unsigned row) const
{
- return data_.getRow(row + y_) + x_;
+ return data_.get_row(row + y_) + x_;
}
inline T& data()
@@ -154,10 +150,10 @@ public:
inline const unsigned char* raw_data() const
{
- return data_.getBytes();
+ return data_.bytes();
}
- inline std::set<std::string> const& property_names() const
+ inline std::set<std::string> const& get_fields() const
{
return names_;
}
@@ -177,11 +173,6 @@ public:
return key_;
}
- inline unsigned int get_resolution() const
- {
- return resolution_;
- }
-
private:
unsigned x_;
unsigned y_;
@@ -189,14 +180,13 @@ private:
unsigned height_;
T const& data_;
std::string const& key_;
- unsigned int resolution_;
std::string const& id_name_;
std::set<std::string> const& names_;
feature_key_type const& f_keys_;
feature_type const& features_;
};
-using grid_view = hit_grid_view<mapnik::image_data<mapnik::value_integer> >;
+using grid_view = hit_grid_view<mapnik::image<mapnik::value_integer_pixel> >;
}
diff --git a/include/mapnik/group/group_layout.hpp b/include/mapnik/group/group_layout.hpp
index 81ff4ab..2087b0b 100644
--- a/include/mapnik/group/group_layout.hpp
+++ b/include/mapnik/group/group_layout.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/group/group_layout_manager.hpp b/include/mapnik/group/group_layout_manager.hpp
index b44921b..89acf53 100644
--- a/include/mapnik/group/group_layout_manager.hpp
+++ b/include/mapnik/group/group_layout_manager.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/group/group_rule.hpp b/include/mapnik/group/group_rule.hpp
index 71dd7df..a0442ce 100644
--- a/include/mapnik/group/group_rule.hpp
+++ b/include/mapnik/group/group_rule.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/group/group_symbolizer_helper.hpp b/include/mapnik/group/group_symbolizer_helper.hpp
index 20b97c7..b32c9ec 100644
--- a/include/mapnik/group/group_symbolizer_helper.hpp
+++ b/include/mapnik/group/group_symbolizer_helper.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -80,22 +80,23 @@ public:
pixel_position_list const& get();
-private:
-
- /** Iterate over the given path, placing line-following labels or point labels with respect to label_spacing. */
+ // Iterate over the given path, placing line-following labels or point labels with respect to label_spacing.
template <typename T>
bool find_line_placements(T & path);
- /** Check if a point placement fits at given position */
+private:
+
+
+ // Check if a point placement fits at given position
bool check_point_placement(pixel_position const& pos);
- /** Checks for collision. */
+ // Checks for collision.
bool collision(box2d<double> const& box, value_unicode_string const& repeat_key = "") const;
double get_spacing(double path_length) const;
DetectorType & detector_;
- /** Boxes and repeat keys to take into account when finding placement.
- * Boxes are relative to starting point of current placement.
- */
+ // Boxes and repeat keys to take into account when finding placement.
+ // Boxes are relative to starting point of current placement.
+ //
std::list<box_element> box_elements_;
pixel_position_list results_;
diff --git a/include/mapnik/group/group_symbolizer_properties.hpp b/include/mapnik/group/group_symbolizer_properties.hpp
index bd6ef2f..fce1694 100644
--- a/include/mapnik/group/group_symbolizer_properties.hpp
+++ b/include/mapnik/group/group_symbolizer_properties.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/hextree.hpp b/include/mapnik/hextree.hpp
index 166398a..d98f9e2 100644
--- a/include/mapnik/hextree.hpp
+++ b/include/mapnik/hextree.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,7 +26,7 @@
// mapnik
#include <mapnik/global.hpp>
#include <mapnik/palette.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// stl
#include <algorithm>
@@ -52,7 +52,7 @@ struct RGBAPolicy
};
template <typename T, typename InsertPolicy = RGBAPolicy >
-class hextree : private mapnik::noncopyable
+class hextree : private util::noncopyable
{
struct node
{
@@ -98,7 +98,7 @@ class hextree : private mapnik::noncopyable
// penalty of using this node as color
double reduce_cost;
// number of !=0 positions in children_ array
- byte children_count;
+ std::uint8_t children_count;
};
// highest reduce_cost first
@@ -184,7 +184,7 @@ public:
}
// process alpha value based on trans_mode_
- byte preprocessAlpha(byte a) const
+ std::uint8_t preprocessAlpha(std::uint8_t a) const
{
switch(trans_mode_)
{
@@ -199,7 +199,7 @@ public:
void insert(T const& data)
{
- byte a = preprocessAlpha(data.a);
+ std::uint8_t a = preprocessAlpha(data.a);
unsigned level = 0;
node * cur_node = root_.get();
if (a < InsertPolicy::MIN_ALPHA)
@@ -238,7 +238,7 @@ public:
// return color index in returned earlier palette
int quantize(unsigned val) const
{
- byte a = preprocessAlpha(U2ALPHA(val));
+ std::uint8_t a = preprocessAlpha(U2ALPHA(val));
unsigned ind=0;
if (a < InsertPolicy::MIN_ALPHA || colors_ == 0)
{
@@ -393,15 +393,15 @@ private:
// clip extreme alfa values
void create_palette_rek(std::vector<rgba> & palette, node * itr) const
{
- if (itr->count >= 3)
+ if (itr->count != 0)
{
unsigned count = itr->count;
- byte a = byte(itr->alphas/float(count));
+ std::uint8_t a = std::uint8_t(itr->alphas/float(count));
if (a > InsertPolicy::MAX_ALPHA) a = 255;
if (a < InsertPolicy::MIN_ALPHA) a = 0;
- palette.push_back(rgba((byte)round(gamma(itr->reds / count, gamma_)),
- (byte)round(gamma(itr->greens / count, gamma_)),
- (byte)round(gamma(itr->blues / count, gamma_)), a));
+ palette.push_back(rgba((std::uint8_t)round(gamma(itr->reds / count, gamma_)),
+ (std::uint8_t)round(gamma(itr->greens / count, gamma_)),
+ (std::uint8_t)round(gamma(itr->blues / count, gamma_)), a));
}
for (unsigned idx=0; idx < 16; ++idx)
{
diff --git a/include/mapnik/hit_test_filter.hpp b/include/mapnik/hit_test_filter.hpp
index cb9c6f1..d81a949 100644
--- a/include/mapnik/hit_test_filter.hpp
+++ b/include/mapnik/hit_test_filter.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,11 +25,136 @@
// mapnik
#include <mapnik/feature.hpp>
+#include <mapnik/geometry.hpp>
#include <mapnik/geom_util.hpp>
-// boost
-
namespace mapnik {
+
+namespace detail {
+
+inline bool pip(double x0,
+ double y0,
+ double x1,
+ double y1,
+ double x,
+ double y)
+{
+ return ((((y1 <= y) && (y < y0)) || ((y0 <= y) && (y < y1))) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1));
+}
+
+struct hit_test_visitor
+{
+ hit_test_visitor(double x, double y, double tol)
+ : x_(x),
+ y_(y),
+ tol_(tol) {}
+
+ bool operator() (geometry::geometry_empty const& ) const
+ {
+ return false;
+ }
+
+ bool operator() (geometry::point<double> const& geom) const
+ {
+ return distance(geom.x, geom.y, x_, y_) <= tol_;
+ }
+ bool operator() (geometry::multi_point<double> const& geom) const
+ {
+ for (auto const& pt : geom)
+ {
+ if (distance(pt.x, pt.y, x_, y_) <= tol_) return true;
+ }
+ return false;
+ }
+ bool operator() (geometry::line_string<double> const& geom) const
+ {
+ std::size_t num_points = geom.num_points();
+ if (num_points > 1)
+ {
+ for (std::size_t i = 1; i < num_points; ++i)
+ {
+ auto const& pt0 = geom[i-1];
+ auto const& pt1 = geom[i];
+ double distance = point_to_segment_distance(x_,y_,pt0.x,pt0.y,pt1.x,pt1.y);
+ if (distance < tol_) return true;
+ }
+ }
+ return false;
+ }
+ bool operator() (geometry::multi_line_string<double> const& geom) const
+ {
+ for (auto const& line: geom)
+ {
+ if (operator()(line)) return true;
+ }
+ return false;
+ }
+ bool operator() (geometry::polygon<double> const& geom) const
+ {
+ auto const& exterior = geom.exterior_ring;
+ std::size_t num_points = exterior.num_points();
+ if (num_points < 4) return false;
+ bool inside = false;
+ for (std::size_t i = 1; i < num_points; ++i)
+ {
+ auto const& pt0 = exterior[i-1];
+ auto const& pt1 = exterior[i];
+ // todo - account for tolerance
+ if (pip(pt0.x,pt0.y,pt1.x,pt1.y,x_,y_))
+ {
+ inside = !inside;
+ }
+ }
+ if (!inside) return false;
+ for (auto const& ring : geom.interior_rings)
+ {
+ std::size_t num_interior_points = ring.size();
+ if (num_interior_points < 4)
+ {
+ continue;
+ }
+ for (std::size_t j = 1; j < num_interior_points; ++j)
+ {
+ auto const& pt0 = ring[j-1];
+ auto const& pt1 = ring[j];
+ if (pip(pt0.x,pt0.y,pt1.x,pt1.y,x_,y_))
+ {
+ // TODO - account for tolerance
+ inside=!inside;
+ }
+ }
+ }
+ return inside;
+ }
+ bool operator() (geometry::multi_polygon<double> const& geom) const
+ {
+ for (auto const& poly: geom)
+ {
+ if (operator()(poly)) return true;
+ }
+ return false;
+ }
+ bool operator() (geometry::geometry_collection<double> const& collection) const
+ {
+ for (auto const& geom: collection)
+ {
+ if (mapnik::util::apply_visitor((*this),geom)) return true;
+ }
+ return false;
+ }
+
+ double x_;
+ double y_;
+ double tol_;
+};
+
+}
+
+inline bool hit_test(mapnik::geometry::geometry<double> const& geom, double x, double y, double tol)
+{
+ return mapnik::util::apply_visitor(detail::hit_test_visitor(x,y,tol), geom);
+}
+
class hit_test_filter
{
public:
@@ -38,14 +163,9 @@ public:
y_(y),
tol_(tol) {}
- bool pass(feature_impl & feature)
+ bool pass(feature_impl const& feature)
{
- for (geometry_type & geom : feature.paths())
- {
- if (label::hit_test(geom, x_,y_,tol_))
- return true;
- }
- return false;
+ return hit_test(feature.get_geometry(),x_,y_,tol_);
}
private:
diff --git a/include/mapnik/image.hpp b/include/mapnik/image.hpp
new file mode 100644
index 0000000..7567bfc
--- /dev/null
+++ b/include/mapnik/image.hpp
@@ -0,0 +1,146 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_IMAGE_HPP
+#define MAPNIK_IMAGE_HPP
+
+// mapnik
+#include <mapnik/config.hpp>
+#include <mapnik/pixel_types.hpp>
+
+namespace mapnik {
+
+namespace detail {
+
+struct MAPNIK_DECL buffer
+{
+ explicit buffer(std::size_t size);
+ buffer(buffer && rhs) noexcept;
+ buffer(buffer const& rhs);
+ ~buffer();
+
+ buffer& operator=(buffer rhs);
+ inline bool operator!() const
+ {
+ return (data_ == nullptr)? true : false;
+ }
+
+ void swap(buffer & rhs);
+ unsigned char* data();
+ unsigned char const* data() const;
+ std::size_t size() const;
+private:
+ std::size_t size_;
+ unsigned char* data_;
+
+};
+
+template <std::size_t max_size>
+struct image_dimensions
+{
+ image_dimensions(int width, int height);
+ image_dimensions(image_dimensions const& other) = default;
+ image_dimensions(image_dimensions && other) = default;
+ image_dimensions& operator= (image_dimensions rhs);
+ std::size_t width() const;
+ std::size_t height() const;
+private:
+ std::size_t width_;
+ std::size_t height_;
+};
+
+} // end ns detail
+
+template <typename T>
+class image
+{
+public:
+ using pixel = T;
+ using pixel_type = typename T::type;
+ static constexpr image_dtype dtype = T::id;
+ static constexpr std::size_t pixel_size = sizeof(pixel_type);
+private:
+ detail::image_dimensions<65535> dimensions_;
+ detail::buffer buffer_;
+ pixel_type *pData_;
+ double offset_;
+ double scaling_;
+ bool premultiplied_alpha_;
+ bool painted_;
+public:
+ image();
+ image(int width,
+ int height,
+ bool initialize = true,
+ bool premultiplied = false,
+ bool painted = false);
+ image(image<T> const& rhs);
+ image(image<T> && rhs) noexcept;
+ image<T>& operator=(image<T> rhs);
+ bool operator==(image<T> const& rhs) const;
+ bool operator<(image<T> const& rhs) const;
+
+ void swap(image<T> & rhs);
+ pixel_type& operator() (std::size_t i, std::size_t j);
+ pixel_type const& operator() (std::size_t i, std::size_t j) const;
+ std::size_t width() const;
+ std::size_t height() const;
+ std::size_t size() const;
+ std::size_t row_size() const;
+ void set(pixel_type const& t);
+ pixel_type const* data() const;
+ pixel_type* data();
+ unsigned char const* bytes() const;
+ unsigned char* bytes();
+ pixel_type const* get_row(std::size_t row) const;
+ pixel_type const* get_row(std::size_t row, std::size_t x0) const;
+ pixel_type* get_row(std::size_t row);
+ pixel_type* get_row(std::size_t row, std::size_t x0);
+ void set_row(std::size_t row, pixel_type const* buf, std::size_t size);
+ void set_row(std::size_t row, std::size_t x0, std::size_t x1, pixel_type const* buf);
+ double get_offset() const;
+ void set_offset(double set);
+ double get_scaling() const;
+ void set_scaling(double set);
+ bool get_premultiplied() const;
+ void set_premultiplied(bool set);
+ void painted(bool painted);
+ bool painted() const;
+ image_dtype get_dtype() const;
+};
+
+using image_null = image<null_t>;
+using image_rgba8 = image<rgba8_t>;
+using image_gray8 = image<gray8_t>;
+using image_gray8s = image<gray8s_t>;
+using image_gray16 = image<gray16_t>;
+using image_gray16s = image<gray16s_t>;
+using image_gray32 = image<gray32_t>;
+using image_gray32s = image<gray32s_t>;
+using image_gray32f = image<gray32f_t>;
+using image_gray64 = image<gray64_t>;
+using image_gray64s = image<gray64s_t>;
+using image_gray64f = image<gray64f_t>;
+
+} // end ns mapnik
+
+#endif // MAPNIK_IMAGE_HPP
diff --git a/include/mapnik/image_any.hpp b/include/mapnik/image_any.hpp
new file mode 100644
index 0000000..2fdac7d
--- /dev/null
+++ b/include/mapnik/image_any.hpp
@@ -0,0 +1,85 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_IMAGE_ANY_HPP
+#define MAPNIK_IMAGE_ANY_HPP
+
+#include <mapnik/image.hpp>
+#include <mapnik/image_null.hpp>
+#include <mapnik/util/variant.hpp>
+
+namespace mapnik {
+
+using image_base = util::variant<image_null,
+ image_rgba8,
+ image_gray8,
+ image_gray8s,
+ image_gray16,
+ image_gray16s,
+ image_gray32,
+ image_gray32s,
+ image_gray32f,
+ image_gray64,
+ image_gray64s,
+ image_gray64f>;
+
+
+struct MAPNIK_DECL image_any : image_base
+{
+ image_any() = default;
+
+ image_any(int width,
+ int height,
+ image_dtype type = image_dtype_rgba8,
+ bool initialize = true,
+ bool premultiplied = false,
+ bool painted = false);
+
+ template <typename T>
+ image_any(T && data) noexcept
+ : image_base(std::move(data)) {}
+
+ unsigned char const* bytes() const;
+ unsigned char* bytes();
+ std::size_t width() const;
+ std::size_t height() const;
+ bool get_premultiplied() const;
+ bool painted() const;
+ std::size_t size() const;
+ std::size_t row_size() const;
+ double get_offset() const;
+ double get_scaling() const;
+ image_dtype get_dtype() const;
+ void set_offset(double val);
+ void set_scaling(double val);
+};
+
+MAPNIK_DECL image_any create_image_any(int width,
+ int height,
+ image_dtype type = image_dtype_rgba8,
+ bool initialize = true,
+ bool premultiplied = false,
+ bool painted = false);
+
+} // end mapnik ns
+
+#endif // MAPNIK_IMAGE_ANY_HPP
diff --git a/include/mapnik/image_compositing.hpp b/include/mapnik/image_compositing.hpp
index 892dbad..c3fce8b 100644
--- a/include/mapnik/image_compositing.hpp
+++ b/include/mapnik/image_compositing.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,7 @@
#define MAPNIK_IMAGE_COMPOSITING_HPP
#include <mapnik/config.hpp>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
// boost
#include <boost/optional.hpp>
@@ -82,21 +82,12 @@ enum composite_mode_e
MAPNIK_DECL boost::optional<composite_mode_e> comp_op_from_string(std::string const& name);
MAPNIK_DECL boost::optional<std::string> comp_op_to_string(composite_mode_e comp_op);
-template <typename T1, typename T2>
-MAPNIK_DECL void composite(T1 & dst, T2 & src,
+template <typename T>
+MAPNIK_DECL void composite(T & dst, T const& src,
composite_mode_e mode,
float opacity=1,
int dx=0,
- int dy=0,
- bool premultiply_src=false);
-
-extern template MAPNIK_DECL void composite<mapnik::image_data_32,mapnik::image_data_32>(mapnik::image_data_32 & dst,
- mapnik::image_data_32 & src,
- composite_mode_e mode,
- float opacity,
- int dx,
- int dy,
- bool premultiply_src);
+ int dy=0);
}
#endif // MAPNIK_IMAGE_COMPOSITING_HPP
diff --git a/include/mapnik/image_copy.hpp b/include/mapnik/image_copy.hpp
new file mode 100644
index 0000000..62e2ab2
--- /dev/null
+++ b/include/mapnik/image_copy.hpp
@@ -0,0 +1,72 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_IMAGE_COPY_HPP
+#define MAPNIK_IMAGE_COPY_HPP
+
+#include <mapnik/image_any.hpp>
+#include <mapnik/config.hpp>
+
+namespace mapnik
+{
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_any const&, double offset = 0.0, double scaling = 1.0);
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_rgba8 const&, double offset = 0.0, double scaling = 1.0);
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray8 const&, double offset = 0.0, double scaling = 1.0);
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray8s const&, double offset = 0.0, double scaling = 1.0);
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray16 const&, double offset = 0.0, double scaling = 1.0);
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray16s const&, double offset = 0.0, double scaling = 1.0);
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray32 const&, double offset = 0.0, double scaling = 1.0);
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray32s const&, double offset = 0.0, double scaling = 1.0);
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray32f const&, double offset = 0.0, double scaling = 1.0);
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray64 const&, double offset = 0.0, double scaling = 1.0);
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray64s const&, double offset = 0.0, double scaling = 1.0);
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray64f const&, double offset = 0.0, double scaling = 1.0);
+
+MAPNIK_DECL image_any image_copy(image_any const&, image_dtype type, double offset = 0.0, double scaling = 1.0);
+
+} // end mapnik ns
+
+#endif // MAPNIK_IMAGE_COPY_HPP
diff --git a/include/mapnik/image_data.hpp b/include/mapnik/image_data.hpp
deleted file mode 100644
index ee194c9..0000000
--- a/include/mapnik/image_data.hpp
+++ /dev/null
@@ -1,191 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2011 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#ifndef MAPNIK_IMAGE_DATA_HPP
-#define MAPNIK_IMAGE_DATA_HPP
-
-// mapnik
-#include <mapnik/global.hpp>
-
-// stl
-#include <algorithm>
-#include <cassert>
-#include <stdexcept>
-
-namespace mapnik
-{
-template <typename T>
-class image_data
-{
-public:
- using pixel_type = T;
-
- image_data(int width, int height)
- : width_(static_cast<unsigned>(width)),
- height_(static_cast<unsigned>(height)),
- owns_data_(true)
- {
- if (width < 0)
- {
- throw std::runtime_error("negative width not allowed for image_data");
- }
- if (height < 0)
- {
- throw std::runtime_error("negative height not allowed for image_data");
- }
- pData_ = (width!=0 && height!=0) ? static_cast<T*>(::operator new(sizeof(T) * width * height)):0;
- if (pData_) std::fill(pData_, pData_ + width_ * height_, 0);
- }
-
- image_data(int width, int height, T * data)
- : width_(static_cast<unsigned>(width)),
- height_(static_cast<unsigned>(height)),
- owns_data_(false),
- pData_(data)
- {
- if (width < 0)
- {
- throw std::runtime_error("negative width not allowed for image_data");
- }
- if (height < 0)
- {
- throw std::runtime_error("negative height not allowed for image_data");
- }
- }
-
- image_data(image_data<T> const& rhs)
- :width_(rhs.width_),
- height_(rhs.height_),
- owns_data_(true),
- pData_((rhs.width_!=0 && rhs.height_!=0)?
- static_cast<T*>(::operator new(sizeof(T) * rhs.width_ * rhs.height_)) : 0)
- {
- if (pData_) std::copy(rhs.pData_, rhs.pData_ + rhs.width_* rhs.height_, pData_);
- }
-
- image_data(image_data<T> && rhs) noexcept
- : width_(rhs.width_),
- height_(rhs.height_),
- pData_(rhs.pData_)
- {
- rhs.width_ = 0;
- rhs.height_ = 0;
- rhs.pData_ = nullptr;
- }
-
- image_data<T>& operator=(image_data<T> rhs)
- {
- swap(rhs);
- return *this;
- }
-
- void swap(image_data<T> & rhs)
- {
- std::swap(width_, rhs.width_);
- std::swap(height_, rhs.height_);
- std::swap(pData_, rhs.pData_);
- }
-
- inline T& operator() (unsigned i,unsigned j)
- {
- assert(i<width_ && j<height_);
- return pData_[j*width_+i];
- }
- inline const T& operator() (unsigned i,unsigned j) const
- {
- assert(i<width_ && j<height_);
- return pData_[j*width_+i];
- }
- inline unsigned width() const
- {
- return width_;
- }
- inline unsigned height() const
- {
- return height_;
- }
- inline void set(T const& t)
- {
- std::fill(pData_, pData_ + width_ * height_, t);
- }
-
- inline const T* getData() const
- {
- return pData_;
- }
-
- inline T* getData()
- {
- return pData_;
- }
-
- inline const unsigned char* getBytes() const
- {
- return reinterpret_cast<unsigned char*>(pData_);
- }
-
- inline unsigned char* getBytes()
- {
- return reinterpret_cast<unsigned char*>(pData_);
- }
-
- inline const T* getRow(unsigned row) const
- {
- return pData_+row*width_;
- }
-
- inline T* getRow(unsigned row)
- {
- return pData_+row*width_;
- }
-
- inline void setRow(unsigned row, T const* buf, unsigned size)
- {
- assert(row<height_);
- assert(size<=width_);
- std::copy(buf, buf + size, pData_ + row * width_);
- }
- inline void setRow(unsigned row, unsigned x0, unsigned x1, T const* buf)
- {
- std::copy(buf, buf + (x1 - x0), pData_ + row * width_);
- }
-
- inline ~image_data()
- {
- if (owns_data_)
- {
- ::operator delete(pData_),pData_=0;
- }
- }
-
-private:
- unsigned width_;
- unsigned height_;
- bool owns_data_;
- T *pData_;
-};
-
-using image_data_32 = image_data<unsigned>;
-using image_data_8 = image_data<byte> ;
-}
-
-#endif // MAPNIK_IMAGE_DATA_HPP
diff --git a/include/mapnik/image_filter.hpp b/include/mapnik/image_filter.hpp
index b4fe9ae..ed7cb56 100644
--- a/include/mapnik/image_filter.hpp
+++ b/include/mapnik/image_filter.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -139,7 +139,7 @@ boost::gil::rgba8_view_t rgba8_view(Image & img)
using boost::gil::interleaved_view;
using boost::gil::rgba8_pixel_t;
return interleaved_view(img.width(), img.height(),
- reinterpret_cast<rgba8_pixel_t*>(img.raw_data()),
+ reinterpret_cast<rgba8_pixel_t*>(img.bytes()),
img.width() * sizeof(rgba8_pixel_t));
}
@@ -391,17 +391,17 @@ template <typename Src, typename Filter>
void apply_filter(Src & src, Filter const& filter)
{
{
- src.demultiply();
+ demultiply_alpha(src);
double_buffer<Src> tb(src);
apply_convolution_3x3(tb.src_view, tb.dst_view, filter);
} // ensure ~double_buffer() is called before premultiplying
- src.premultiply();
+ premultiply_alpha(src);
}
template <typename Src>
void apply_filter(Src & src, agg_stack_blur const& op)
{
- agg::rendering_buffer buf(src.raw_data(),src.width(),src.height(), src.width() * 4);
+ agg::rendering_buffer buf(src.bytes(),src.width(),src.height(), src.row_size());
agg::pixfmt_rgba32_pre pixf(buf);
agg::stack_blur_rgba32(pixf,op.rx,op.ry);
}
@@ -761,7 +761,7 @@ void apply_filter(Src & src, invert const& /*op*/)
}
template <typename Src>
-struct filter_visitor : util::static_visitor<void>
+struct filter_visitor
{
filter_visitor(Src & src)
: src_(src) {}
@@ -775,7 +775,7 @@ struct filter_visitor : util::static_visitor<void>
Src & src_;
};
-struct filter_radius_visitor : util::static_visitor<void>
+struct filter_radius_visitor
{
int & radius_;
filter_radius_visitor(int & radius)
diff --git a/include/mapnik/image_filter_grammar.hpp b/include/mapnik/image_filter_grammar.hpp
index 9f94a3b..a7c0bd9 100644
--- a/include/mapnik/image_filter_grammar.hpp
+++ b/include/mapnik/image_filter_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/image_filter_grammar_impl.hpp b/include/mapnik/image_filter_grammar_impl.hpp
index 38fbcc1..c88089f 100644
--- a/include/mapnik/image_filter_grammar_impl.hpp
+++ b/include/mapnik/image_filter_grammar_impl.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/image_filter_types.hpp b/include/mapnik/image_filter_types.hpp
index 0a8abb1..e4c9df0 100644
--- a/include/mapnik/image_filter_types.hpp
+++ b/include/mapnik/image_filter_types.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,7 +26,6 @@
// mapnik
#include <mapnik/config.hpp>
#include <mapnik/color.hpp>
-#include <mapnik/config_error.hpp>
#include <mapnik/util/variant.hpp>
// stl
@@ -34,6 +33,7 @@
#include <ostream>
#include <iterator> // for std::back_insert_iterator
#include <functional> // std::ref
+#include <exception>
namespace mapnik { namespace filter {
@@ -101,7 +101,7 @@ struct scale_hsla : image_filter_base
a0 < 0 || a0 > 1 ||
a1 < 0 || a1 > 1)
{
- throw config_error("scale-hsla values must be between 0 and 1");
+ throw std::runtime_error("scale-hsla values must be between 0 and 1");
}
}
inline bool is_identity() const {
@@ -267,7 +267,7 @@ inline std::ostream& operator<< (std::ostream& os, colorize_alpha const& filter)
template <typename Out>
-struct to_string_visitor : util::static_visitor<void>
+struct to_string_visitor
{
to_string_visitor(Out & out)
: out_(out) {}
diff --git a/include/mapnik/image_impl.hpp b/include/mapnik/image_impl.hpp
new file mode 100644
index 0000000..f4815b7
--- /dev/null
+++ b/include/mapnik/image_impl.hpp
@@ -0,0 +1,317 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/image.hpp>
+#include <mapnik/pixel_types.hpp>
+
+// stl
+#include <cassert>
+#include <stdexcept>
+#include <algorithm>
+
+namespace mapnik {
+
+namespace detail {
+
+// IMAGE_DIMENSIONS
+template <std::size_t max_size>
+image_dimensions<max_size>::image_dimensions(int width, int height)
+ : width_(width),
+ height_(height)
+{
+ if (width < 0 || static_cast<std::size_t>(width) > max_size) throw std::runtime_error("Invalid width for image dimensions requested");
+ if (height < 0 || static_cast<std::size_t>(height) > max_size) throw std::runtime_error("Invalid height for image dimensions requested");
+}
+
+template <std::size_t max_size>
+image_dimensions<max_size>& image_dimensions<max_size>::operator= (image_dimensions rhs)
+{
+ std::swap(width_, rhs.width_);
+ std::swap(height_, rhs.height_);
+ return *this;
+}
+
+template <std::size_t max_size>
+std::size_t image_dimensions<max_size>::width() const
+{
+ return width_;
+}
+
+template <std::size_t max_size>
+std::size_t image_dimensions<max_size>::height() const
+{
+ return height_;
+}
+
+} // end detail ns
+
+// IMAGE
+template <typename T>
+image<T>::image()
+ : dimensions_(0,0),
+ buffer_(0),
+ pData_(nullptr),
+ offset_(0.0),
+ scaling_(1.0),
+ premultiplied_alpha_(false),
+ painted_(false)
+{}
+
+template <typename T>
+image<T>::image(int width, int height, bool initialize, bool premultiplied, bool painted)
+ : dimensions_(width, height),
+ buffer_(dimensions_.width() * dimensions_.height() * pixel_size),
+ pData_(reinterpret_cast<pixel_type*>(buffer_.data())),
+ offset_(0.0),
+ scaling_(1.0),
+ premultiplied_alpha_(premultiplied),
+ painted_(painted)
+{
+ if (pData_ && initialize)
+ {
+ std::fill(pData_, pData_ + dimensions_.width() * dimensions_.height(), 0);
+ }
+}
+
+template <typename T>
+image<T>::image(image<T> const& rhs)
+ : dimensions_(rhs.dimensions_),
+ buffer_(rhs.buffer_),
+ pData_(reinterpret_cast<pixel_type*>(buffer_.data())),
+ offset_(rhs.offset_),
+ scaling_(rhs.scaling_),
+ premultiplied_alpha_(rhs.premultiplied_alpha_),
+ painted_(rhs.painted_)
+{}
+
+template <typename T>
+image<T>::image(image<T> && rhs) noexcept
+ : dimensions_(std::move(rhs.dimensions_)),
+ buffer_(std::move(rhs.buffer_)),
+ pData_(reinterpret_cast<pixel_type*>(buffer_.data())),
+ offset_(rhs.offset_),
+ scaling_(rhs.scaling_),
+ premultiplied_alpha_(rhs.premultiplied_alpha_),
+ painted_(rhs.painted_)
+{
+ rhs.dimensions_ = { 0, 0 };
+ rhs.pData_ = nullptr;
+}
+
+template <typename T>
+image<T>& image<T>::operator=(image<T> rhs)
+{
+ swap(rhs);
+ return *this;
+}
+
+template <typename T>
+bool image<T>::operator==(image<T> const& rhs) const
+{
+ return rhs.bytes() == bytes();
+}
+
+template <typename T>
+bool image<T>::operator<(image<T> const& rhs) const
+{
+ return size() < rhs.size();
+}
+
+template <typename T>
+void image<T>::swap(image<T> & rhs)
+{
+ std::swap(dimensions_, rhs.dimensions_);
+ std::swap(buffer_, rhs.buffer_);
+ std::swap(offset_, rhs.offset_);
+ std::swap(scaling_, rhs.scaling_);
+ std::swap(premultiplied_alpha_, rhs.premultiplied_alpha_);
+ std::swap(painted_, rhs.painted_);
+}
+
+template <typename T>
+inline typename image<T>::pixel_type& image<T>::operator() (std::size_t i, std::size_t j)
+{
+ assert(i < dimensions_.width() && j < dimensions_.height());
+ return pData_[j * dimensions_.width() + i];
+}
+
+template <typename T>
+inline const typename image<T>::pixel_type& image<T>::operator() (std::size_t i, std::size_t j) const
+{
+ assert(i < dimensions_.width() && j < dimensions_.height());
+ return pData_[j * dimensions_.width() + i];
+}
+
+template <typename T>
+inline std::size_t image<T>::width() const
+{
+ return dimensions_.width();
+}
+
+template <typename T>
+inline std::size_t image<T>::height() const
+{
+ return dimensions_.height();
+}
+
+template <typename T>
+inline std::size_t image<T>::size() const
+{
+ return dimensions_.height() * dimensions_.width() * pixel_size;
+}
+
+template <typename T>
+inline std::size_t image<T>::row_size() const
+{
+ return dimensions_.width() * pixel_size;
+}
+
+template <typename T>
+inline void image<T>::set(pixel_type const& t)
+{
+ std::fill(pData_, pData_ + dimensions_.width() * dimensions_.height(), t);
+}
+
+template <typename T>
+inline const typename image<T>::pixel_type* image<T>::data() const
+{
+ return pData_;
+}
+
+template <typename T>
+inline typename image<T>::pixel_type* image<T>::data()
+{
+ return pData_;
+}
+
+template <typename T>
+inline const unsigned char* image<T>::bytes() const
+{
+ return buffer_.data();
+}
+
+template <typename T>
+inline unsigned char* image<T>::bytes()
+{
+ return buffer_.data();
+}
+
+template <typename T>
+inline typename image<T>::pixel_type const* image<T>::get_row(std::size_t row) const
+{
+ return pData_ + row * dimensions_.width();
+}
+
+template <typename T>
+inline const typename image<T>::pixel_type* image<T>::get_row(std::size_t row, std::size_t x0) const
+{
+ return pData_ + row * dimensions_.width() + x0;
+}
+
+template <typename T>
+inline typename image<T>::pixel_type* image<T>::get_row(std::size_t row)
+{
+ return pData_ + row * dimensions_.width();
+}
+
+template <typename T>
+inline typename image<T>::pixel_type* image<T>::get_row(std::size_t row, std::size_t x0)
+{
+ return pData_ + row * dimensions_.width() + x0;
+}
+
+template <typename T>
+inline void image<T>::set_row(std::size_t row, pixel_type const* buf, std::size_t size)
+{
+ assert(row < dimensions_.height());
+ assert(size <= dimensions_.width());
+ std::copy(buf, buf + size, pData_ + row * dimensions_.width());
+}
+
+template <typename T>
+inline void image<T>::set_row(std::size_t row, std::size_t x0, std::size_t x1, pixel_type const* buf)
+{
+ assert(row < dimensions_.height());
+ assert ((x1 - x0) <= dimensions_.width() );
+ std::copy(buf, buf + (x1 - x0), pData_ + row * dimensions_.width() + x0);
+}
+
+template <typename T>
+inline double image<T>::get_offset() const
+{
+ return offset_;
+}
+
+template <typename T>
+inline void image<T>::set_offset(double set)
+{
+ offset_ = set;
+}
+
+template <typename T>
+inline double image<T>::get_scaling() const
+{
+ return scaling_;
+}
+
+template <typename T>
+inline void image<T>::set_scaling(double scaling)
+{
+ if (scaling != 0.0)
+ {
+ scaling_ = scaling;
+ return;
+ }
+}
+
+template <typename T>
+inline bool image<T>::get_premultiplied() const
+{
+ return premultiplied_alpha_;
+}
+
+template <typename T>
+inline void image<T>::set_premultiplied(bool set)
+{
+ premultiplied_alpha_ = set;
+}
+
+template <typename T>
+inline void image<T>::painted(bool painted)
+{
+ painted_ = painted;
+}
+
+template <typename T>
+inline bool image<T>::painted() const
+{
+ return painted_;
+}
+
+template <typename T>
+inline image_dtype image<T>::get_dtype() const
+{
+ return dtype;
+}
+
+} // end ns
diff --git a/include/mapnik/image_null.hpp b/include/mapnik/image_null.hpp
new file mode 100644
index 0000000..285a579
--- /dev/null
+++ b/include/mapnik/image_null.hpp
@@ -0,0 +1,79 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_IMAGE_NULL_HPP
+#define MAPNIK_IMAGE_NULL_HPP
+
+// mapnik
+#include <mapnik/config.hpp>
+#include <mapnik/pixel_types.hpp>
+
+//stl
+#include <stdexcept>
+
+namespace mapnik
+{
+
+template <>
+class MAPNIK_DECL image<null_t>
+{
+public:
+ using pixel_type = null_t::type;
+ static const image_dtype dtype = null_t::id;
+private:
+public:
+ image() {}
+ image(int width,
+ int height,
+ bool initialize = true,
+ bool premultiplied = false,
+ bool painted = false) {}
+ image(image<null_t> const& rhs) {}
+ image(image<null_t> && rhs) noexcept {}
+ image<null_t>& operator=(image<null_t> rhs) { return *this; }
+ image<null_t>const& operator=(image<null_t> const& rhs) const { return rhs; }
+ bool operator==(image<null_t> const& rhs) const { return true; }
+ bool operator<(image<null_t> const& rhs) const { return false; }
+
+ std::size_t width() const { return 0; }
+ std::size_t height() const { return 0; }
+ std::size_t size() const { return 0; }
+ std::size_t row_size() const { return 0; }
+ void set(pixel_type const& t) { throw std::runtime_error("Can not set values for null image"); }
+ pixel_type& operator() (std::size_t i, std::size_t j) { throw std::runtime_error("Can not get or set values for null image"); }
+ pixel_type const& operator() (std::size_t i, std::size_t j) const { throw std::runtime_error("Can not get or set values for null image"); }
+ unsigned const char* bytes() const { return nullptr; }
+ unsigned char* bytes() {return nullptr; }
+ double get_offset() const { return 0.0; }
+ void set_offset(double set) {}
+ double get_scaling() const { return 1.0; }
+ void set_scaling(double set) {}
+ bool get_premultiplied() const { return false; }
+ void set_premultiplied(bool set) {}
+ void painted(bool painted) {}
+ bool painted() const { return false; }
+ image_dtype get_dtype() const { return dtype; }
+};
+
+} // end ns mapnik
+
+#endif // MAPNIK_IMAGE_NULL_HPP
diff --git a/include/mapnik/image_options.hpp b/include/mapnik/image_options.hpp
new file mode 100644
index 0000000..fc8f9f1
--- /dev/null
+++ b/include/mapnik/image_options.hpp
@@ -0,0 +1,38 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_IMAGE_OPTIONS_HPP
+#define MAPNIK_IMAGE_OPTIONS_HPP
+
+#include <map>
+#include <string>
+#include <boost/optional.hpp>
+
+namespace mapnik {
+
+using image_options_map = std::map<std::string, boost::optional<std::string> >;
+inline std::string to_string(boost::optional<std::string> const& val) { return val ? *val : "<unitialised>";}
+image_options_map parse_image_options(std::string const& options);
+
+}
+
+#endif // MAPNIK_IMAGE_OPTIONS_HPP
diff --git a/include/mapnik/image_reader.hpp b/include/mapnik/image_reader.hpp
index e571ba0..471a08b 100644
--- a/include/mapnik/image_reader.hpp
+++ b/include/mapnik/image_reader.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,10 +24,11 @@
#define MAPNIK_IMAGE_READER_HPP
// mapnik
-#include <mapnik/image_data.hpp>
+#include <mapnik/image_any.hpp>
#include <mapnik/config.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/factory.hpp>
+#include <mapnik/box2d.hpp>
// boost
#include <boost/optional.hpp>
// stl
@@ -53,13 +54,14 @@ public:
}
};
-struct MAPNIK_DECL image_reader : private mapnik::noncopyable
+struct MAPNIK_DECL image_reader : private util::noncopyable
{
- virtual unsigned width() const=0;
- virtual unsigned height() const=0;
- virtual bool has_alpha() const=0;
- virtual bool premultiplied_alpha() const=0;
- virtual void read(unsigned x,unsigned y,image_data_32& image)=0;
+ virtual unsigned width() const = 0;
+ virtual unsigned height() const = 0;
+ virtual bool has_alpha() const = 0;
+ virtual boost::optional<box2d<double> > bounding_box() const = 0;
+ virtual void read(unsigned x,unsigned y,image_rgba8& image) = 0;
+ virtual image_any read(unsigned x, unsigned y, unsigned width, unsigned height) = 0;
virtual ~image_reader() {}
};
@@ -69,7 +71,7 @@ bool register_image_reader(std::string const& type, image_reader* (* fun)(Args..
return factory<image_reader,std::string, Args...>::instance().register_product(type, fun);
}
-MAPNIK_DECL image_reader* get_image_reader(std::string const& file,std::string const& type);
+MAPNIK_DECL image_reader* get_image_reader(std::string const& file, std::string const& type);
MAPNIK_DECL image_reader* get_image_reader(std::string const& file);
MAPNIK_DECL image_reader* get_image_reader(char const* data, size_t size);
diff --git a/include/mapnik/image_scaling.hpp b/include/mapnik/image_scaling.hpp
index a7d8434..0dd94c9 100644
--- a/include/mapnik/image_scaling.hpp
+++ b/include/mapnik/image_scaling.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,7 @@
// mapnik
#include <mapnik/config.hpp>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
// stl
#include <iosfwd>
@@ -60,25 +60,14 @@ enum scaling_method_e
MAPNIK_DECL boost::optional<scaling_method_e> scaling_method_from_string(std::string const& name);
MAPNIK_DECL boost::optional<std::string> scaling_method_to_string(scaling_method_e scaling_method);
-template <typename Image>
-MAPNIK_DECL void scale_image_agg(Image & target,
- Image const& source,
- scaling_method_e scaling_method,
- double image_ratio_x,
- double image_ratio_y,
- double x_off_f,
- double y_off_f,
- double filter_factor);
-
-extern template MAPNIK_DECL void scale_image_agg<mapnik::image_data_32>(
- mapnik::image_data_32 & target,
- mapnik::image_data_32 const& source,
- scaling_method_e scaling_method,
- double image_ratio_x,
- double image_ratio_y,
- double x_off_f,
- double y_off_f,
- double filter_radius);
-
+template <typename T>
+MAPNIK_DECL void scale_image_agg(T & target, T const& source,
+ scaling_method_e scaling_method,
+ double image_ratio_x,
+ double image_ratio_y,
+ double x_off_f,
+ double y_off_f,
+ double filter_factor);
}
+
#endif // MAPNIK_IMAGE_SCALING_HPP
diff --git a/include/mapnik/image_scaling_traits.hpp b/include/mapnik/image_scaling_traits.hpp
new file mode 100644
index 0000000..9b78306
--- /dev/null
+++ b/include/mapnik/image_scaling_traits.hpp
@@ -0,0 +1,209 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_IMAGE_SCALING_TRAITS_HPP
+#define MAPNIK_IMAGE_SCALING_TRAITS_HPP
+
+// agg
+#include "agg_image_accessors.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_pixfmt_gray.h"
+#include "agg_span_allocator.h"
+#include "agg_span_image_filter_gray.h"
+#include "agg_span_image_filter_rgba.h"
+#include "agg_span_interpolator_linear.h"
+
+namespace mapnik { namespace detail {
+
+template <typename T>
+struct agg_scaling_traits {};
+
+template <>
+struct agg_scaling_traits<image_rgba8>
+{
+ using pixfmt_pre = agg::pixfmt_rgba32_pre;
+ using color_type = agg::rgba8;
+ using interpolator_type = agg::span_interpolator_linear<>;
+ using img_src_type = agg::image_accessor_clone<pixfmt_pre>;
+ using span_image_filter = agg::span_image_filter_rgba_nn<img_src_type,interpolator_type>;
+ using span_image_resample_affine = agg::span_image_resample_rgba_affine<img_src_type>;
+
+};
+
+template <>
+struct agg_scaling_traits<image_gray8>
+{
+ using pixfmt_pre = agg::pixfmt_gray8_pre;
+ using color_type = agg::gray8;
+ using interpolator_type = agg::span_interpolator_linear<>;
+ using img_src_type = agg::image_accessor_clone<pixfmt_pre>;
+ using span_image_filter = agg::span_image_filter_gray_nn<img_src_type,interpolator_type>;
+ using span_image_resample_affine = agg::span_image_resample_gray_affine<img_src_type>;
+};
+
+template <>
+struct agg_scaling_traits<image_gray8s>
+{
+ using pixfmt_pre = agg::pixfmt_gray8_pre;
+ using color_type = agg::gray8;
+ using interpolator_type = agg::span_interpolator_linear<>;
+ using img_src_type = agg::image_accessor_clone<pixfmt_pre>;
+ using span_image_filter = agg::span_image_filter_gray_nn<img_src_type,interpolator_type>;
+ using span_image_resample_affine = agg::span_image_resample_gray_affine<img_src_type>;
+};
+
+template <>
+struct agg_scaling_traits<image_gray16>
+{
+ using pixfmt_pre = agg::pixfmt_gray16_pre;
+ using color_type = agg::gray16;
+ using interpolator_type = agg::span_interpolator_linear<>;
+ using img_src_type = agg::image_accessor_clone<pixfmt_pre>;
+ using span_image_filter = agg::span_image_filter_gray_nn<img_src_type,interpolator_type>;
+ using span_image_resample_affine = agg::span_image_resample_gray_affine<img_src_type>;
+};
+
+template <>
+struct agg_scaling_traits<image_gray16s>
+{
+ using pixfmt_pre = agg::pixfmt_gray16_pre;
+ using color_type = agg::gray16;
+ using interpolator_type = agg::span_interpolator_linear<>;
+ using img_src_type = agg::image_accessor_clone<pixfmt_pre>;
+ using span_image_filter = agg::span_image_filter_gray_nn<img_src_type,interpolator_type>;
+ using span_image_resample_affine = agg::span_image_resample_gray_affine<img_src_type>;
+};
+
+template <>
+struct agg_scaling_traits<image_gray32>
+{
+ using pixfmt_pre = agg::pixfmt_gray32_pre;
+ using color_type = agg::gray32;
+ using interpolator_type = agg::span_interpolator_linear<>;
+ using img_src_type = agg::image_accessor_clone<pixfmt_pre>;
+ using span_image_filter = agg::span_image_filter_gray_nn<img_src_type,interpolator_type>;
+ using span_image_resample_affine = agg::span_image_resample_gray_affine<img_src_type>;
+};
+
+template <>
+struct agg_scaling_traits<image_gray32s>
+{
+ using pixfmt_pre = agg::pixfmt_gray32_pre;
+ using color_type = agg::gray32;
+ using interpolator_type = agg::span_interpolator_linear<>;
+ using img_src_type = agg::image_accessor_clone<pixfmt_pre>;
+ using span_image_filter = agg::span_image_filter_gray_nn<img_src_type,interpolator_type>;
+ using span_image_resample_affine = agg::span_image_resample_gray_affine<img_src_type>;
+};
+
+template <>
+struct agg_scaling_traits<image_gray32f>
+{
+ using pixfmt_pre = agg::pixfmt_gray32_pre;
+ using color_type = agg::gray32;
+ using interpolator_type = agg::span_interpolator_linear<>;
+ using img_src_type = agg::image_accessor_clone<pixfmt_pre>;
+ using span_image_filter = agg::span_image_filter_gray_nn<img_src_type,interpolator_type>;
+ using span_image_resample_affine = agg::span_image_resample_gray_affine<img_src_type>;
+};
+
+template <>
+struct agg_scaling_traits<image_gray64>
+{
+ using pixfmt_pre = agg::pixfmt_gray32_pre;
+ using color_type = agg::gray32;
+ using interpolator_type = agg::span_interpolator_linear<>;
+ using img_src_type = agg::image_accessor_clone<pixfmt_pre>;
+ using span_image_filter = agg::span_image_filter_gray_nn<img_src_type,interpolator_type>;
+ using span_image_resample_affine = agg::span_image_resample_gray_affine<img_src_type>;
+};
+
+template <>
+struct agg_scaling_traits<image_gray64s>
+{
+ using pixfmt_pre = agg::pixfmt_gray32_pre;
+ using color_type = agg::gray32;
+ using interpolator_type = agg::span_interpolator_linear<>;
+ using img_src_type = agg::image_accessor_clone<pixfmt_pre>;
+ using span_image_filter = agg::span_image_filter_gray_nn<img_src_type,interpolator_type>;
+ using span_image_resample_affine = agg::span_image_resample_gray_affine<img_src_type>;
+};
+
+template <>
+struct agg_scaling_traits<image_gray64f>
+{
+ using pixfmt_pre = agg::pixfmt_gray32_pre;
+ using color_type = agg::gray32;
+ using interpolator_type = agg::span_interpolator_linear<>;
+ using img_src_type = agg::image_accessor_clone<pixfmt_pre>;
+ using span_image_filter = agg::span_image_filter_gray_nn<img_src_type,interpolator_type>;
+ using span_image_resample_affine = agg::span_image_resample_gray_affine<img_src_type>;
+};
+
+template <typename Filter>
+void set_scaling_method(Filter & filter, scaling_method_e scaling_method, double filter_factor)
+{
+ switch(scaling_method)
+ {
+ case SCALING_BILINEAR:
+ filter.calculate(agg::image_filter_bilinear(), true); break;
+ case SCALING_BICUBIC:
+ filter.calculate(agg::image_filter_bicubic(), true); break;
+ case SCALING_SPLINE16:
+ filter.calculate(agg::image_filter_spline16(), true); break;
+ case SCALING_SPLINE36:
+ filter.calculate(agg::image_filter_spline36(), true); break;
+ case SCALING_HANNING:
+ filter.calculate(agg::image_filter_hanning(), true); break;
+ case SCALING_HAMMING:
+ filter.calculate(agg::image_filter_hamming(), true); break;
+ case SCALING_HERMITE:
+ filter.calculate(agg::image_filter_hermite(), true); break;
+ case SCALING_KAISER:
+ filter.calculate(agg::image_filter_kaiser(), true); break;
+ case SCALING_QUADRIC:
+ filter.calculate(agg::image_filter_quadric(), true); break;
+ case SCALING_CATROM:
+ filter.calculate(agg::image_filter_catrom(), true); break;
+ case SCALING_GAUSSIAN:
+ filter.calculate(agg::image_filter_gaussian(), true); break;
+ case SCALING_BESSEL:
+ filter.calculate(agg::image_filter_bessel(), true); break;
+ case SCALING_MITCHELL:
+ filter.calculate(agg::image_filter_mitchell(), true); break;
+ case SCALING_SINC:
+ filter.calculate(agg::image_filter_sinc(filter_factor), true); break;
+ case SCALING_LANCZOS:
+ filter.calculate(agg::image_filter_lanczos(filter_factor), true); break;
+ case SCALING_BLACKMAN:
+ filter.calculate(agg::image_filter_blackman(filter_factor), true); break;
+ default:
+ break;
+ }
+}
+
+}
+
+} //
+
+
+#endif // MAPNIK_IMAGE_SCALING_TRAITS_HPP
diff --git a/include/mapnik/image_util.hpp b/include/mapnik/image_util.hpp
index ec946b3..7185d64 100644
--- a/include/mapnik/image_util.hpp
+++ b/include/mapnik/image_util.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,9 +25,8 @@
// mapnik
#include <mapnik/config.hpp>
-#include <mapnik/image_data.hpp>
-#include <mapnik/image_view.hpp>
-
+#include <mapnik/pixel_types.hpp>
+#include <mapnik/image_compositing.hpp>
// boost
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-local-typedef"
@@ -37,25 +36,27 @@
// stl
#include <string>
-#include <cmath>
#include <exception>
namespace mapnik {
// fwd declares
-class Map;
class rgba_palette;
-class image_32;
+struct image_any;
+template <typename T> class image;
+struct image_view_any;
+template <typename T> class image_view;
+class color;
-class ImageWriterException : public std::exception
+class image_writer_exception : public std::exception
{
private:
std::string message_;
public:
- ImageWriterException(std::string const& message)
+ image_writer_exception(std::string const& message)
: message_(message) {}
- ~ImageWriterException() throw() {}
+ ~image_writer_exception() throw() {}
virtual const char* what() const throw()
{
@@ -63,18 +64,6 @@ public:
}
};
-#if defined(HAVE_CAIRO)
-MAPNIK_DECL void save_to_cairo_file(mapnik::Map const& map,
- std::string const& filename,
- double scale_factor=1.0,
- double scale_denominator=0.0);
-MAPNIK_DECL void save_to_cairo_file(mapnik::Map const& map,
- std::string const& filename,
- std::string const& type,
- double scale_factor=1.0,
- double scale_denominator=0.0);
-#endif
-
template <typename T>
MAPNIK_DECL void save_to_file(T const& image,
std::string const& filename,
@@ -122,17 +111,229 @@ MAPNIK_DECL void save_to_stream
std::string const& type
);
+// PREMULTIPLY ALPHA
+MAPNIK_DECL bool premultiply_alpha(image_any & image);
+
+template <typename T>
+MAPNIK_DECL bool premultiply_alpha(T & image);
+
+// DEMULTIPLY ALPHA
+MAPNIK_DECL bool demultiply_alpha(image_any & image);
+
+template <typename T>
+MAPNIK_DECL bool demultiply_alpha(T & image);
+
+// SET PREMULTIPLIED ALPHA
+MAPNIK_DECL void set_premultiplied_alpha(image_any & image, bool status);
+
+template <typename T>
+MAPNIK_DECL void set_premultiplied_alpha(T & image, bool status);
+
+// IS SOLID
+MAPNIK_DECL bool is_solid (image_any const& image);
+MAPNIK_DECL bool is_solid (image_view_any const& image);
+
+template <typename T>
+MAPNIK_DECL bool is_solid (T const& image);
+
+// APPLY OPACITY
+MAPNIK_DECL void apply_opacity (image_any & image, float opacity);
+
+template <typename T>
+MAPNIK_DECL void apply_opacity (T & image, float opacity);
+
+// SET GRAYSCALE TO ALPHA
+MAPNIK_DECL void set_grayscale_to_alpha (image_any & image);
+MAPNIK_DECL void set_grayscale_to_alpha (image_any & image, color const& c);
+
+template <typename T>
+MAPNIK_DECL void set_grayscale_to_alpha (T & image);
+
+template <typename T>
+MAPNIK_DECL void set_grayscale_to_alpha (T & image, color const& c);
+
+// SET COLOR TO ALPHA
+MAPNIK_DECL void set_color_to_alpha (image_any & image, color const& c);
+
+template <typename T>
+MAPNIK_DECL void set_color_to_alpha (T & image, color const& c);
+
+// FILL
+template <typename T>
+MAPNIK_DECL void fill (image_any & data, T const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image<rgba8_t> & data, T const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image<gray8_t> & data, T const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image<gray8s_t> & data, T const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image<gray16_t> & data, T const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image<gray16s_t> & data, T const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image<gray32_t> & data, T const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image<gray32s_t> & data, T const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image<gray32f_t> & data, T const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image<gray64_t> & data, T const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image<gray64s_t> & data, T const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image<gray64f_t> & data, T const&);
+
+// SET RECTANGLE
+MAPNIK_DECL void set_rectangle (image_any & dst, image_any const& src, int x = 0, int y = 0);
+
+template <typename T>
+MAPNIK_DECL void set_rectangle (T & dst, T const& src, int x = 0, int y = 0);
+
+// CHECK BOUNDS
+template <typename T>
+inline bool check_bounds (T const& data, std::size_t x, std::size_t y)
+{
+ return (x < data.width() && y < data.height());
+}
+
+// COMPOSITE_PIXEL
+MAPNIK_DECL void composite_pixel(image_any & data, composite_mode_e comp_op, std::size_t x, std::size_t y, unsigned c, unsigned cover, double opacity );
+
+template <typename T>
+MAPNIK_DECL void composite_pixel(T & data, composite_mode_e comp_op, std::size_t x, std::size_t y, unsigned c, unsigned cover, double opacity );
+
+// SET PIXEL
+template <typename T>
+MAPNIK_DECL void set_pixel(image_any & data, std::size_t x, std::size_t y, T const& val);
+
+template <typename T>
+MAPNIK_DECL void set_pixel(image<rgba8_t> & data, std::size_t x, std::size_t y, T const& val);
+
+template <typename T>
+MAPNIK_DECL void set_pixel(image<gray8_t> & data, std::size_t x, std::size_t y, T const& val);
+
+template <typename T>
+MAPNIK_DECL void set_pixel(image<gray8s_t> & data, std::size_t x, std::size_t y, T const& val);
+
+template <typename T>
+MAPNIK_DECL void set_pixel(image<gray16_t> & data, std::size_t x, std::size_t y, T const& val);
+
+template <typename T>
+MAPNIK_DECL void set_pixel(image<gray16s_t> & data, std::size_t x, std::size_t y, T const& val);
+
+template <typename T>
+MAPNIK_DECL void set_pixel(image<gray32_t> & data, std::size_t x, std::size_t y, T const& val);
+
+template <typename T>
+MAPNIK_DECL void set_pixel(image<gray32s_t> & data, std::size_t x, std::size_t y, T const& val);
+
+template <typename T>
+MAPNIK_DECL void set_pixel(image<gray32f_t> & data, std::size_t x, std::size_t y, T const& val);
+
+template <typename T>
+MAPNIK_DECL void set_pixel(image<gray64_t> & data, std::size_t x, std::size_t y, T const& val);
+
+template <typename T>
+MAPNIK_DECL void set_pixel(image<gray64s_t> & data, std::size_t x, std::size_t y, T const& val);
+
+template <typename T>
+MAPNIK_DECL void set_pixel(image<gray64f_t> & data, std::size_t x, std::size_t y, T const& val);
+
+// GET PIXEL
+template <typename T>
+MAPNIK_DECL T get_pixel(image_any const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image_view_any const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image<rgba8_t> const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image<gray8_t> const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image<gray8s_t> const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image<gray16_t> const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image<gray16s_t> const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image<gray32_t> const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image<gray32s_t> const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image<gray32f_t> const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image<gray64_t> const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image<gray64s_t> const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image<gray64f_t> const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image_view<image<rgba8_t> > const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image_view<image<gray8_t> > const& data, std::size_t x, std::size_t y);
+
template <typename T>
-void save_as_png(T const& image,
- std::string const& filename,
- rgba_palette const& palette);
+MAPNIK_DECL T get_pixel(image_view<image<gray8s_t> > const& data, std::size_t x, std::size_t y);
-#if defined(HAVE_JPEG)
template <typename T>
-void save_as_jpeg(std::string const& filename,
- int quality,
- T const& image);
-#endif
+MAPNIK_DECL T get_pixel(image_view<image<gray16_t> > const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image_view<image<gray16s_t> > const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image_view<image<gray32_t> > const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image_view<image<gray32s_t> > const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image_view<image<gray32f_t> > const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image_view<image<gray64_t> > const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image_view<image<gray64s_t> > const& data, std::size_t x, std::size_t y);
+
+template <typename T>
+MAPNIK_DECL T get_pixel(image_view<image<gray64f_t> > const& data, std::size_t x, std::size_t y);
+
+// VIEW TO OUTPUT STREAM
+template <typename Out>
+MAPNIK_DECL void view_to_stream (image_view_any const& view, Out & os);
+
+// CREATE VIEW
+MAPNIK_DECL image_view_any create_view (image_any const& data, std::size_t x, std::size_t y, std::size_t w, std::size_t h);
+
+// COMPARE
+template <typename T>
+MAPNIK_DECL std::size_t compare(T const& im1, T const& im2, double threshold = 0.0, bool alpha = true);
inline bool is_png(std::string const& filename)
{
@@ -209,121 +410,6 @@ void add_border(T & image)
image(image.width()-1,y) = 0xffff0000; // blue
}
}
-
-
-
-/////////// save_to_file //////////////////////////////////////////////////
-
-MAPNIK_DECL void save_to_file(image_32 const& image,
- std::string const& file);
-
-MAPNIK_DECL void save_to_file (image_32 const& image,
- std::string const& file,
- std::string const& type);
-
-MAPNIK_DECL void save_to_file (image_32 const& image,
- std::string const& file,
- std::string const& type,
- rgba_palette const& palette);
-
-///////////////////////////////////////////////////////////////////////////
-
-
-MAPNIK_DECL std::string save_to_string(image_32 const& image,
- std::string const& type);
-
-MAPNIK_DECL std::string save_to_string(image_32 const& image,
- std::string const& type,
- rgba_palette const& palette);
-
-///////////////////////////////////////////////////////////////////////////
-
-MAPNIK_DECL void save_to_stream(image_32 const& image,
- std::ostream & stream,
- std::string const& type,
- rgba_palette const& palette);
-
-MAPNIK_DECL void save_to_stream(image_32 const& image,
- std::ostream & stream,
- std::string const& type);
-
-///////////////////////////////////////////////////////////////////////////
-
-extern template MAPNIK_DECL void save_to_file<image_data_32>(image_data_32 const&,
- std::string const&,
- std::string const&,
- rgba_palette const&);
-
-extern template MAPNIK_DECL void save_to_file<image_data_32>(image_data_32 const&,
- std::string const&,
- std::string const&);
-
-extern template MAPNIK_DECL void save_to_file<image_data_32>(image_data_32 const&,
- std::string const&,
- rgba_palette const&);
-
-extern template MAPNIK_DECL void save_to_file<image_data_32>(image_data_32 const&,
- std::string const&);
-
-
-extern template MAPNIK_DECL void save_to_file<image_view<image_data_32> > (image_view<image_data_32> const&,
- std::string const&,
- std::string const&,
- rgba_palette const&);
-
-extern template MAPNIK_DECL void save_to_file<image_view<image_data_32> > (image_view<image_data_32> const&,
- std::string const&,
- std::string const&);
-
-extern template MAPNIK_DECL void save_to_file<image_view<image_data_32> > (image_view<image_data_32> const&,
- std::string const&,
- rgba_palette const&);
-
-extern template MAPNIK_DECL void save_to_file<image_view<image_data_32> > (image_view<image_data_32> const&,
- std::string const&);
-
-extern template MAPNIK_DECL std::string save_to_string<image_data_32>(image_data_32 const&,
- std::string const&);
-
-extern template MAPNIK_DECL std::string save_to_string<image_data_32>(image_data_32 const&,
- std::string const&,
- rgba_palette const&);
-
-extern template MAPNIK_DECL std::string save_to_string<image_view<image_data_32> > (image_view<image_data_32> const&,
- std::string const&);
-
-extern template MAPNIK_DECL std::string save_to_string<image_view<image_data_32> > (image_view<image_data_32> const&,
- std::string const&,
- rgba_palette const&);
-#ifdef _MSC_VER
-
-template MAPNIK_DECL void save_to_stream<image_data_32>(
- image_data_32 const& image,
- std::ostream & stream,
- std::string const& type,
- rgba_palette const& palette
-);
-
-template MAPNIK_DECL void save_to_stream<image_data_32>(
- image_data_32 const& image,
- std::ostream & stream,
- std::string const& type
-);
-
-template MAPNIK_DECL void save_to_stream<image_view<image_data_32> > (
- image_view<image_data_32> const& image,
- std::ostream & stream,
- std::string const& type,
- rgba_palette const& palette
-);
-
-template MAPNIK_DECL void save_to_stream<image_view<image_data_32> > (
- image_view<image_data_32> const& image,
- std::ostream & stream,
- std::string const& type
-);
-#endif
-
}
#endif // MAPNIK_IMAGE_UTIL_HPP
diff --git a/include/mapnik/image_util_jpeg.hpp b/include/mapnik/image_util_jpeg.hpp
new file mode 100644
index 0000000..5f77f56
--- /dev/null
+++ b/include/mapnik/image_util_jpeg.hpp
@@ -0,0 +1,44 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_IMAGE_UTIL_JPEG_HPP
+#define MAPNIK_IMAGE_UTIL_JPEG_HPP
+
+// stl
+#include <string>
+#include <iostream>
+
+namespace mapnik {
+
+struct jpeg_saver
+{
+ jpeg_saver(std::ostream &, std::string const&);
+ template <typename T>
+ void operator() (T const&) const;
+ private:
+ std::ostream & stream_;
+ std::string const& t_;
+};
+
+} // end ns
+
+#endif // MAPNIK_IMAGE_UTIL_JPEG_HPP
diff --git a/include/mapnik/image_util_png.hpp b/include/mapnik/image_util_png.hpp
new file mode 100644
index 0000000..06dcde8
--- /dev/null
+++ b/include/mapnik/image_util_png.hpp
@@ -0,0 +1,55 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_IMAGE_UTIL_PNG_HPP
+#define MAPNIK_IMAGE_UTIL_PNG_HPP
+
+// stl
+#include <string>
+#include <iostream>
+
+namespace mapnik {
+
+struct png_saver_pal
+{
+ png_saver_pal(std::ostream &, std::string const&, rgba_palette const&);
+ template <typename T>
+ void operator() (T const&) const;
+ private:
+ std::ostream & stream_;
+ std::string const& t_;
+ rgba_palette const& pal_;
+};
+
+struct png_saver
+{
+ png_saver(std::ostream &, std::string const&);
+ template <typename T>
+ void operator() (T const&) const;
+ private:
+ std::ostream & stream_;
+ std::string const& t_;
+};
+
+} // end ns
+
+#endif // MAPNIK_IMAGE_UTIL_PNG_HPP
diff --git a/include/mapnik/image_util_tiff.hpp b/include/mapnik/image_util_tiff.hpp
new file mode 100644
index 0000000..5cacc67
--- /dev/null
+++ b/include/mapnik/image_util_tiff.hpp
@@ -0,0 +1,44 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_IMAGE_UTIL_TIFF_HPP
+#define MAPNIK_IMAGE_UTIL_TIFF_HPP
+
+// stl
+#include <string>
+#include <iostream>
+
+namespace mapnik {
+
+struct tiff_saver
+{
+ tiff_saver(std::ostream &, std::string const&);
+ template <typename T>
+ void operator() (T const&) const;
+ private:
+ std::ostream & stream_;
+ std::string const& t_;
+};
+
+} // end ns
+
+#endif // MAPNIK_IMAGE_UTIL_TIFF_HPP
diff --git a/include/mapnik/image_util_webp.hpp b/include/mapnik/image_util_webp.hpp
new file mode 100644
index 0000000..14a2183
--- /dev/null
+++ b/include/mapnik/image_util_webp.hpp
@@ -0,0 +1,44 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_IMAGE_UTIL_WEBP_HPP
+#define MAPNIK_IMAGE_UTIL_WEBP_HPP
+
+// stl
+#include <string>
+#include <iostream>
+
+namespace mapnik {
+
+struct webp_saver
+{
+ webp_saver(std::ostream &, std::string const&);
+ template <typename T>
+ void operator() (T const&) const;
+ private:
+ std::ostream & stream_;
+ std::string const& t_;
+};
+
+} // end ns
+
+#endif // MAPNIK_IMAGE_UTIL_WEBP_HPP
diff --git a/include/mapnik/image_view.hpp b/include/mapnik/image_view.hpp
index 71921f0..302cd40 100644
--- a/include/mapnik/image_view.hpp
+++ b/include/mapnik/image_view.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,92 +23,64 @@
#ifndef MAPNIK_IMAGE_VIEW_HPP
#define MAPNIK_IMAGE_VIEW_HPP
+#include <mapnik/image.hpp>
+
namespace mapnik {
template <typename T>
class image_view
{
public:
+ using pixel = typename T::pixel;
using pixel_type = typename T::pixel_type;
+ static constexpr image_dtype dtype = T::dtype;
+ static constexpr std::size_t pixel_size = sizeof(pixel_type);
- image_view(unsigned x, unsigned y, unsigned width, unsigned height, T const& data)
- : x_(x),
- y_(y),
- width_(width),
- height_(height),
- data_(data)
- {
- if (x_ >= data_.width()) x_=data_.width()-1;
- if (y_ >= data_.height()) y_=data_.height()-1;
- if (x_ + width_ > data_.width()) width_= data_.width() - x_;
- if (y_ + height_ > data_.height()) height_= data_.height() - y_;
- }
-
- ~image_view() {}
-
- image_view(image_view<T> const& rhs)
- : x_(rhs.x_),
- y_(rhs.y_),
- width_(rhs.width_),
- height_(rhs.height_),
- data_(rhs.data_) {}
-
- image_view<T> & operator=(image_view<T> const& rhs)
- {
- if (&rhs==this) return *this;
- x_ = rhs.x_;
- y_ = rhs.y_;
- width_ = rhs.width_;
- height_ = rhs.height_;
- data_ = rhs.data_;
- return *this;
- }
-
- inline unsigned x() const
- {
- return x_;
- }
+ image_view(std::size_t x, std::size_t y, std::size_t width, std::size_t height, T const& data);
+ ~image_view();
- inline unsigned y() const
- {
- return y_;
- }
+ image_view(image_view<T> const& rhs);
+ image_view(image_view<T> && other) noexcept;
+ image_view<T>& operator=(image_view<T> rhs) = delete;
+ bool operator==(image_view<T> const& rhs) const;
+ bool operator<(image_view<T> const& rhs) const;
- inline unsigned width() const
- {
- return width_;
- }
-
- inline unsigned height() const
- {
- return height_;
- }
-
- inline const pixel_type* getRow(unsigned row) const
- {
- return data_.getRow(row + y_) + x_;
- }
-
- inline const unsigned char* getBytes() const
- {
- return data_.getBytes();
- }
- inline T& data()
- {
- return data_;
- }
- inline T const& data() const
- {
- return data_;
- }
+ std::size_t x() const;
+ std::size_t y() const;
+ std::size_t width() const;
+ std::size_t height() const;
+ pixel_type const& operator() (std::size_t i, std::size_t j) const;
+ std::size_t size() const;
+ std::size_t row_size() const;
+ pixel_type const* get_row(std::size_t row) const;
+ pixel_type const* get_row(std::size_t row, std::size_t x0) const;
+ T const& data() const;
+ bool get_premultiplied() const;
+ double get_offset() const;
+ double get_scaling() const;
+ image_dtype get_dtype() const;
private:
- unsigned x_;
- unsigned y_;
- unsigned width_;
- unsigned height_;
+ std::size_t x_;
+ std::size_t y_;
+ std::size_t width_;
+ std::size_t height_;
T const& data_;
};
-}
+
+using image_view_null = image_view<image_null>;
+using image_view_rgba8 = image_view<image_rgba8>;
+using image_view_gray8 = image_view<image_gray8>;
+using image_view_gray8s = image_view<image_gray8s>;
+using image_view_gray16 = image_view<image_gray16>;
+using image_view_gray16s = image_view<image_gray16s>;
+using image_view_gray32 = image_view<image_gray32>;
+using image_view_gray32s = image_view<image_gray32s>;
+using image_view_gray32f = image_view<image_gray32f>;
+using image_view_gray64 = image_view<image_gray64>;
+using image_view_gray64s = image_view<image_gray64s>;
+using image_view_gray64f = image_view<image_gray64f>;
+
+} // end ns
#endif // MAPNIK_IMAGE_VIEW_HPP
diff --git a/include/mapnik/image_view_any.hpp b/include/mapnik/image_view_any.hpp
new file mode 100644
index 0000000..6ce0fe5
--- /dev/null
+++ b/include/mapnik/image_view_any.hpp
@@ -0,0 +1,65 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_IMAGE_VIEW_ANY_HPP
+#define MAPNIK_IMAGE_VIEW_ANY_HPP
+
+#include <mapnik/image_view.hpp>
+#include <mapnik/image_view_null.hpp>
+#include <mapnik/util/variant.hpp>
+
+namespace mapnik {
+
+using image_view_base = util::variant<image_view_null,
+ image_view_rgba8,
+ image_view_gray8,
+ image_view_gray8s,
+ image_view_gray16,
+ image_view_gray16s,
+ image_view_gray32,
+ image_view_gray32s,
+ image_view_gray32f,
+ image_view_gray64,
+ image_view_gray64s,
+ image_view_gray64f>;
+
+struct MAPNIK_DECL image_view_any : image_view_base
+{
+ image_view_any() = default;
+
+ template <typename T>
+ image_view_any(T && data) noexcept
+ : image_view_base(std::move(data)) {}
+
+ std::size_t width() const;
+ std::size_t height() const;
+ std::size_t size() const;
+ std::size_t row_size() const;
+ bool get_premultiplied() const;
+ double get_offset() const;
+ double get_scaling() const;
+ image_dtype get_dtype() const;
+};
+
+} // end mapnik ns
+
+#endif // MAPNIK_IMAGE_VIEW_ANY_HPP
diff --git a/include/mapnik/image_view_impl.hpp b/include/mapnik/image_view_impl.hpp
new file mode 100644
index 0000000..6fc8517
--- /dev/null
+++ b/include/mapnik/image_view_impl.hpp
@@ -0,0 +1,160 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#include <mapnik/image.hpp>
+#include <mapnik/image_view.hpp>
+
+//std
+#include <utility>
+
+namespace mapnik {
+
+template <typename T>
+image_view<T>::image_view(std::size_t x, std::size_t y, std::size_t width, std::size_t height, T const& data)
+ : x_(x),
+ y_(y),
+ width_(width),
+ height_(height),
+ data_(data)
+{
+ if (x_ >= data_.width() && data_.width() > 0) x_ = data_.width() - 1;
+ if (y_ >= data_.height() && data.height() > 0) y_ = data_.height() - 1;
+ if (x_ + width_ > data_.width()) width_ = data_.width() - x_;
+ if (y_ + height_ > data_.height()) height_ = data_.height() - y_;
+}
+
+template <typename T>
+image_view<T>::~image_view() {}
+
+template <typename T>
+image_view<T>::image_view(image_view<T> const& rhs)
+ : x_(rhs.x_),
+ y_(rhs.y_),
+ width_(rhs.width_),
+ height_(rhs.height_),
+ data_(rhs.data_) {}
+
+template <typename T>
+image_view<T>::image_view(image_view<T> && other) noexcept
+ : x_(std::move(other.x_)),
+ y_(std::move(other.y_)),
+ width_(std::move(other.width_)),
+ height_(std::move(other.height_)),
+ data_(std::move(other.data_)) {}
+
+template <typename T>
+bool image_view<T>::operator==(image_view<T> const& rhs) const
+{
+ return rhs.data_.bytes() == data_.bytes();
+}
+
+template <typename T>
+bool image_view<T>::operator<(image_view<T> const& rhs) const
+{
+ return data_.size() < rhs.data_.size();
+}
+
+template <typename T>
+inline std::size_t image_view<T>::x() const
+{
+ return x_;
+}
+
+template <typename T>
+inline std::size_t image_view<T>::y() const
+{
+ return y_;
+}
+
+template <typename T>
+inline std::size_t image_view<T>::width() const
+{
+ return width_;
+}
+
+template <typename T>
+inline std::size_t image_view<T>::height() const
+{
+ return height_;
+}
+
+template <typename T>
+inline typename image_view<T>::pixel_type const& image_view<T>::operator() (std::size_t i, std::size_t j) const
+{
+ return data_(i + x_,j + y_);
+}
+
+template <typename T>
+inline std::size_t image_view<T>::size() const
+{
+ return height_ * width_ * pixel_size;
+}
+
+template <typename T>
+inline std::size_t image_view<T>::row_size() const
+{
+ return width_ * pixel_size;
+}
+
+template <typename T>
+inline typename image_view<T>::pixel_type const* image_view<T>::get_row(std::size_t row) const
+{
+ return data_.get_row(row + y_) + x_;
+}
+
+template <typename T>
+inline typename image_view<T>::pixel_type const* image_view<T>::get_row(std::size_t row, std::size_t x0) const
+{
+ return data_.get_row(row + y_, x0) + x_;
+}
+
+template <typename T>
+inline T const& image_view<T>::data() const
+{
+ return data_;
+}
+
+template <typename T>
+inline bool image_view<T>::get_premultiplied() const
+{
+ return data_.get_premultiplied();
+}
+
+template <typename T>
+inline double image_view<T>::get_offset() const
+{
+ return data_.get_offset();
+}
+
+template <typename T>
+inline double image_view<T>::get_scaling() const
+{
+ return data_.get_scaling();
+}
+
+template <typename T>
+inline image_dtype image_view<T>::get_dtype() const
+{
+ return dtype;
+}
+
+} // end ns
diff --git a/include/mapnik/image_view_null.hpp b/include/mapnik/image_view_null.hpp
new file mode 100644
index 0000000..1ad6c3d
--- /dev/null
+++ b/include/mapnik/image_view_null.hpp
@@ -0,0 +1,65 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_IMAGE_VIEW_NULL_HPP
+#define MAPNIK_IMAGE_VIEW_NULL_HPP
+
+#include <mapnik/image.hpp>
+
+//stl
+#include <stdexcept>
+
+namespace mapnik {
+
+template <>
+class MAPNIK_DECL image_view<image_null>
+{
+public:
+ using pixel_type = image_null::pixel_type;
+ static const image_dtype dtype = image_null::dtype;
+
+ image_view() {}
+ ~image_view() {};
+
+ image_view(image_view<image_null> const& rhs) {}
+ image_view<image_null> & operator=(image_view<image_null> const& rhs) { return *this; }
+ bool operator==(image_view<image_null> const& rhs) const { return true; }
+ bool operator<(image_view<image_null> const& rhs) const { return false; }
+
+ std::size_t x() const { return 0; }
+ std::size_t y() const { return 0; }
+ std::size_t width() const { return 0; }
+ std::size_t height() const { return 0; }
+ pixel_type operator() (std::size_t i, std::size_t j) const { throw std::runtime_error("Can not get from a null image view"); }
+ std::size_t size() const { return 0; }
+ std::size_t row_size() const { return 0; }
+ const pixel_type* get_row(std::size_t row) const { return nullptr; }
+ const pixel_type* get_row(std::size_t row, std::size_t x0) const { return nullptr; }
+ bool get_premultiplied() const { return false; }
+ double get_offset() const { return 0.0; }
+ double get_scaling() const { return 1.0; }
+ image_dtype get_dtype() const { return dtype; }
+};
+
+} // end ns
+
+#endif // MAPNIK_IMAGE_VIEW_NULL_HPP
diff --git a/include/mapnik/jpeg_io.hpp b/include/mapnik/jpeg_io.hpp
index 3e61811..2c3c284 100644
--- a/include/mapnik/jpeg_io.hpp
+++ b/include/mapnik/jpeg_io.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -111,7 +111,7 @@ void save_as_jpeg(T1 & file,int quality, T2 const& image)
JSAMPLE* row=reinterpret_cast<JSAMPLE*>( ::operator new (sizeof(JSAMPLE) * width*3));
while (cinfo.next_scanline < cinfo.image_height)
{
- const unsigned* imageRow=image.getRow(cinfo.next_scanline);
+ const unsigned* imageRow=image.get_row(cinfo.next_scanline);
int index=0;
for (int i=0;i<width;++i)
{
diff --git a/include/mapnik/json/error_handler.hpp b/include/mapnik/json/error_handler.hpp
index f1a4f8b..74b0aa4 100644
--- a/include/mapnik/json/error_handler.hpp
+++ b/include/mapnik/json/error_handler.hpp
@@ -34,11 +34,14 @@ struct error_handler
{
using result_type = void;
void operator() (
- Iterator, Iterator last,
+ Iterator, Iterator,
Iterator err_pos, boost::spirit::info const& what) const
{
std::stringstream s;
- s << what << " expected but got: " << std::string(err_pos, std::min(err_pos + 16,last));
+ auto start = err_pos;
+ std::advance(err_pos,16);
+ auto end = err_pos;
+ s << what << " expected but got: " << std::string(start, end);
throw std::runtime_error(s.str());
}
};
diff --git a/include/mapnik/json/extract_bounding_box_grammar.hpp b/include/mapnik/json/extract_bounding_box_grammar.hpp
new file mode 100644
index 0000000..0cc3733
--- /dev/null
+++ b/include/mapnik/json/extract_bounding_box_grammar.hpp
@@ -0,0 +1,107 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_JSON_EXTRACT_BOUNDING_BOX_GRAMMAR_HPP
+#define MAPNIK_JSON_EXTRACT_BOUNDING_BOX_GRAMMAR_HPP
+
+// mapnik
+#include <mapnik/json/generic_json.hpp>
+#include <mapnik/json/error_handler.hpp>
+#include <mapnik/box2d.hpp>
+#include <mapnik/geometry.hpp>
+// boost
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wunused-local-typedef"
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/phoenix_function.hpp>
+#include <boost/fusion/adapted/std_tuple.hpp>
+#pragma GCC diagnostic pop
+
+// stl
+#include <tuple>
+
+namespace mapnik { namespace json {
+
+using position = mapnik::geometry::point<double>;
+using boxes = std::vector<std::pair<box2d<double>, std::pair<std::size_t, std::size_t>>>;
+
+namespace qi = boost::spirit::qi;
+
+struct calculate_bounding_box_impl
+{
+ using result_type = void;
+ template <typename T0, typename T1>
+ result_type operator() (T0 & bbox, T1 const& pos) const
+ {
+ if (pos)
+ {
+ double x = pos->x;
+ double y = pos->y;
+ if (!bbox.valid())
+ {
+ bbox.init(x, y, x, y); //TODO: add init(x,y) convinience method
+ }
+ else
+ {
+ bbox.expand_to_include(x, y);
+ }
+ }
+ }
+};
+
+struct push_box_impl
+{
+ using result_type = void;
+ template <typename T0, typename T1, typename T2, typename T3>
+ void operator() (T0 & boxes, T1 const& begin, T2 const& box, T3 const& range) const
+ {
+ if (box.valid()) boxes.emplace_back(box, std::make_pair(std::distance(begin, range.begin()), std::distance(range.begin(), range.end())));
+ }
+};
+
+template <typename Iterator, typename ErrorHandler = error_handler<Iterator> >
+struct extract_bounding_box_grammar :
+ qi::grammar<Iterator, void(boxes&), space_type>
+{
+ extract_bounding_box_grammar();
+ // rules
+ qi::rule<Iterator, void(boxes&), space_type> start;
+ qi::rule<Iterator, qi::locals<Iterator>, void(boxes&), space_type> features;
+ qi::rule<Iterator, qi::locals<int, box2d<double>>, void(boxes&, Iterator const&), space_type> feature;
+ qi::rule<Iterator, qi::locals<box2d<double>>, box2d<double>(), space_type> coords;
+ qi::rule<Iterator, boost::optional<position>(), space_type> pos;
+ qi::rule<Iterator, void(box2d<double>&), space_type> ring;
+ qi::rule<Iterator, void(box2d<double>&), space_type> rings;
+ qi::rule<Iterator, void(box2d<double>&), space_type> rings_array;
+ // generic JSON support
+ json::generic_json<Iterator> json;
+ // phoenix functions
+ boost::phoenix::function<push_box_impl> push_box;
+ boost::phoenix::function<calculate_bounding_box_impl> calculate_bounding_box;
+ // error handler
+ boost::phoenix::function<ErrorHandler> const error_handler;
+};
+
+}}
+
+#endif // MAPNIK_JSON_EXTRACT_BOUNDING_BOX_GRAMMAR_HPP
diff --git a/include/mapnik/json/extract_bounding_box_grammar_impl.hpp b/include/mapnik/json/extract_bounding_box_grammar_impl.hpp
new file mode 100644
index 0000000..c6fd321
--- /dev/null
+++ b/include/mapnik/json/extract_bounding_box_grammar_impl.hpp
@@ -0,0 +1,135 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/json/extract_bounding_box_grammar.hpp>
+
+// boost
+#include <boost/spirit/include/qi_omit.hpp>
+#include <boost/spirit/include/phoenix_object.hpp>
+#include <boost/spirit/include/phoenix_stl.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/repository/include/qi_iter_pos.hpp>
+// stl
+#include <iostream>
+#include <string>
+
+namespace mapnik { namespace json {
+
+namespace repo = boost::spirit::repository;
+
+template <typename Iterator, typename ErrorHandler>
+extract_bounding_box_grammar<Iterator, ErrorHandler>::extract_bounding_box_grammar()
+ : extract_bounding_box_grammar::base_type(start,"bounding boxes")
+{
+ qi::lit_type lit;
+ qi::double_type double_;
+ qi::_val_type _val;
+ qi::_1_type _1;
+ qi::_2_type _2;
+ qi::_3_type _3;
+ qi::_4_type _4;
+ qi::omit_type omit;
+ qi::_r1_type _r1;
+ qi::_r2_type _r2;
+ qi::_a_type _a;
+ qi::_b_type _b;
+ qi::eps_type eps;
+ qi::raw_type raw;
+ qi::char_type char_;
+ boost::spirit::repository::qi::iter_pos_type iter_pos;
+ using qi::fail;
+ using qi::on_error;
+
+ start = features(_r1)
+ ;
+
+ features = iter_pos[_a = _1] >> -(lit('{') >> -lit("\"type\"")
+ >> lit(':') >> lit("\"FeatureCollection\"")
+ >> *(lit(',') >> (json.key_value - lit("\"features\"")))
+ >> lit(',') >> lit("\"features\"")
+ >> lit(':'))
+ >> lit('[') >> (feature(_r1,_a) % lit(',')) >> lit(']')
+ ;
+
+ feature = raw[lit('{')[_a = 1]
+ >> *(eps(_a > 0) >> (lit('{')[_a += 1]
+ |
+ lit('}')[_a -=1]
+ |
+ coords[_b = _1]
+ |
+ char_))][push_box(_r1, _r2, _b, _1)]
+ ;
+
+ coords = lit("\"coordinates\"")
+ >> lit(':') >> (rings_array(_a) | rings (_a) | ring(_a) | pos[calculate_bounding_box(_a,_1)])[_val = _a]
+ ;
+
+ pos = lit('[') > -(double_ > lit(',') > double_) > omit[*(lit(',') > double_)] > lit(']')
+ ;
+
+ ring = lit('[') >> pos[calculate_bounding_box(_r1,_1)] % lit(',') > lit(']')
+ ;
+
+ rings = lit('[') >> ring(_r1) % lit(',') > lit(']')
+ ;
+
+ rings_array = lit('[') >> rings(_r1) % lit(',') > lit(']')
+ ;
+
+ // generic json types
+ json.value = json.object | json.array | json.string_ | json.number
+ ;
+
+ json.pairs = json.key_value % lit(',')
+ ;
+
+ json.key_value = (json.string_ >> lit(':') >> json.value)
+ ;
+
+ json.object = lit('{') >> *json.pairs >> lit('}')
+ ;
+
+ json.array = lit('[')
+ >> json.value >> *(lit(',') >> json.value)
+ >> lit(']')
+ ;
+
+ json.number = json.strict_double
+ | json.int__
+ | lit("true")
+ | lit("false")
+ | lit("null")
+ ;
+
+ coords.name("Coordinates");
+ pos.name("Position");
+ ring.name("Ring");
+ rings.name("Rings");
+ rings_array.name("Rings array");
+
+ // error handler
+ on_error<fail>(coords, error_handler(_1, _2, _3, _4));
+}
+
+}}
diff --git a/include/mapnik/json/feature_collection_grammar.hpp b/include/mapnik/json/feature_collection_grammar.hpp
index 9f5e24b..2089cfe 100644
--- a/include/mapnik/json/feature_collection_grammar.hpp
+++ b/include/mapnik/json/feature_collection_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -37,38 +37,46 @@ namespace mapnik { namespace json {
namespace qi = boost::spirit::qi;
namespace phoenix = boost::phoenix;
-namespace standard_wide = boost::spirit::standard_wide;
-using standard_wide::space_type;
-struct generate_id
+struct default_feature_callback
{
- using result_type = int;
-
- generate_id(int start)
- : id_(start) {}
+ default_feature_callback(std::vector<feature_ptr> & features)
+ : features_(features) {}
+ void operator() (feature_ptr const& feature)
+ {
+ features_.push_back(feature);
+ }
+ std::vector<feature_ptr> & features_;
+};
- int operator() () const
+struct apply_feature_callback
+{
+ using result_type = void;
+ template <typename Callback, typename Feature>
+ void operator() (Callback & callback, Feature const& feature) const
{
- return id_++;
+ callback(feature);
}
- mutable int id_;
};
-template <typename Iterator, typename FeatureType>
+template <typename Iterator, typename FeatureType, typename FeatureCallback = default_feature_callback>
struct feature_collection_grammar :
- qi::grammar<Iterator, std::vector<feature_ptr>(context_ptr const&), space_type>
+ qi::grammar<Iterator, void(context_ptr const&, std::size_t&, FeatureCallback &), space_type>
{
feature_collection_grammar(mapnik::transcoder const& tr);
+ // grammars
feature_grammar<Iterator,FeatureType> feature_g;
geometry_grammar<Iterator> geometry_g;
- phoenix::function<extract_geometry> extract_geometry_;
- qi::rule<Iterator, std::vector<feature_ptr>(context_ptr const&), space_type> start; // START
- qi::rule<Iterator, std::vector<feature_ptr>(context_ptr const&), space_type> feature_collection;
+ // rules
+ qi::rule<Iterator, void(context_ptr const&, std::size_t&, FeatureCallback&), space_type> start; // START
+ qi::rule<Iterator, void(context_ptr const&, std::size_t&, FeatureCallback&), space_type> feature_collection;
qi::rule<Iterator, space_type> type;
- qi::rule<Iterator, std::vector<feature_ptr>(context_ptr const&), space_type> features;
- qi::rule<Iterator, qi::locals<feature_ptr,int>, void(context_ptr const& ctx, std::vector<feature_ptr>&), space_type> feature;
- qi::rule<Iterator, qi::locals<feature_ptr,int>, void(context_ptr const& ctx, std::vector<feature_ptr>&), space_type> feature_from_geometry;
- boost::phoenix::function<generate_id> generate_id_;
+ qi::rule<Iterator, void(context_ptr const&, std::size_t&, FeatureCallback&), space_type> features;
+ qi::rule<Iterator, qi::locals<feature_ptr,int>, void(context_ptr const& ctx, std::size_t, FeatureCallback&), space_type> feature;
+ qi::rule<Iterator, qi::locals<feature_ptr,int>, void(context_ptr const& ctx, std::size_t, FeatureCallback&), space_type> feature_from_geometry;
+ // phoenix functions
+ phoenix::function<json::set_geometry_impl> set_geometry;
+ phoenix::function<apply_feature_callback> on_feature;
};
}}
diff --git a/include/mapnik/json/feature_collection_grammar_impl.hpp b/include/mapnik/json/feature_collection_grammar_impl.hpp
index 93c49b7..0275b47 100644
--- a/include/mapnik/json/feature_collection_grammar_impl.hpp
+++ b/include/mapnik/json/feature_collection_grammar_impl.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -31,30 +31,29 @@
namespace mapnik { namespace json {
-template <typename Iterator, typename FeatureType>
-feature_collection_grammar<Iterator,FeatureType>::feature_collection_grammar(mapnik::transcoder const& tr)
+template <typename Iterator, typename FeatureType, typename FeatureCallback>
+feature_collection_grammar<Iterator,FeatureType, FeatureCallback>::feature_collection_grammar(mapnik::transcoder const& tr)
: feature_collection_grammar::base_type(start,"start"),
- feature_g(tr),
- generate_id_(1)
+ feature_g(tr)
{
qi::lit_type lit;
qi::eps_type eps;
+ qi::_1_type _1;
+ qi::_2_type _2;
+ qi::_3_type _3;
qi::_4_type _4;
- qi::_3_type _2;
- qi::_2_type _3;
qi::_a_type _a;
- qi::_val_type _val;
qi::_r1_type _r1;
qi::_r2_type _r2;
- using phoenix::push_back;
+ qi::_r3_type _r3;
using phoenix::construct;
using phoenix::new_;
using phoenix::val;
- start = feature_collection(_r1) | feature_from_geometry(_r1, _val) | feature(_r1, _val)
+ start = feature_collection(_r1, _r2, _r3) | feature_from_geometry(_r1, _r2, _r3) | feature(_r1, _r2, _r3)
;
- feature_collection = lit('{') >> (type | features(_r1) | feature_g.json_.key_value) % lit(',') >> lit('}')
+ feature_collection = lit('{') >> (type | features(_r1, _r2, _r3) | feature_g.json_.key_value) % lit(',') >> lit('}')
;
type = lit("\"type\"") >> lit(':') >> lit("\"FeatureCollection\"")
@@ -63,17 +62,17 @@ feature_collection_grammar<Iterator,FeatureType>::feature_collection_grammar(map
features = lit("\"features\"")
>> lit(':')
>> lit('[')
- >> -(feature(_r1, _val) % lit(','))
+ >> -(feature(_r1, _r2, _r3) [_r2 +=1] % lit(','))
>> lit(']')
;
- feature = eps[_a = phoenix::construct<mapnik::feature_ptr>(new_<mapnik::feature_impl>(_r1, generate_id_()))]
- >> feature_g(*_a)[push_back(_r2,_a)]
+ feature = eps[_a = phoenix::construct<mapnik::feature_ptr>(new_<mapnik::feature_impl>(_r1, _r2))]
+ >> feature_g(*_a)[on_feature(_r3,_a)]
;
feature_from_geometry =
- eps[_a = phoenix::construct<mapnik::feature_ptr>(new_<mapnik::feature_impl>(_r1, generate_id_()))]
- >> geometry_g(extract_geometry_(*_a)) [push_back(_r2, _a)]
+ eps[_a = phoenix::construct<mapnik::feature_ptr>(new_<mapnik::feature_impl>(_r1, _r2))]
+ >> geometry_g[set_geometry(*_a, _1)] [on_feature(_r3, _a)]
;
start.name("start");
diff --git a/include/mapnik/json/feature_generator.hpp b/include/mapnik/json/feature_generator.hpp
index bf5a2e5..0d3fcb8 100644
--- a/include/mapnik/json/feature_generator.hpp
+++ b/include/mapnik/json/feature_generator.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -35,7 +35,7 @@ namespace mapnik { namespace json {
inline bool to_geojson(std::string & json, mapnik::feature_impl const& feature)
{
using sink_type = std::back_insert_iterator<std::string>;
- static const mapnik::json::feature_generator_grammar<sink_type> grammar;
+ static const mapnik::json::feature_generator_grammar<sink_type, mapnik::feature_impl> grammar;
sink_type sink(json);
return boost::spirit::karma::generate(sink, grammar, feature);
}
diff --git a/include/mapnik/json/feature_generator_grammar.hpp b/include/mapnik/json/feature_generator_grammar.hpp
index a023975..3852c7b 100644
--- a/include/mapnik/json/feature_generator_grammar.hpp
+++ b/include/mapnik/json/feature_generator_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,23 +24,13 @@
#define MAPNIK_JSON_FEATURE_GENERATOR_GRAMMAR_HPP
// mapnik
-#include <mapnik/value_types.hpp>
-#include <mapnik/value.hpp>
#include <mapnik/feature.hpp>
-#include <mapnik/geometry_container.hpp>
+
#include <mapnik/json/geometry_generator_grammar.hpp>
-#include <mapnik/feature_kv_iterator.hpp>
+#include <mapnik/json/properties_generator_grammar.hpp>
// boost
#include <boost/spirit/include/karma.hpp>
-#include <boost/spirit/include/phoenix.hpp>
-#include <boost/spirit/include/phoenix_function.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/fusion/adapted/std_tuple.hpp>
-#include <boost/fusion/include/at.hpp>
-#include <boost/fusion/include/cons.hpp>
namespace boost { namespace spirit { namespace traits {
@@ -75,12 +65,12 @@ struct end_container<mapnik::feature_impl const>
template <>
struct transform_attribute<const boost::fusion::cons<mapnik::feature_impl const&, boost::fusion::nil>,
- mapnik::geometry_container const& ,karma::domain>
+ mapnik::geometry::geometry<double> const& , karma::domain>
{
- using type = mapnik::geometry_container const&;
+ using type = mapnik::geometry::geometry<double> const&;
static type pre(const boost::fusion::cons<mapnik::feature_impl const&, boost::fusion::nil>& f)
{
- return boost::fusion::at<mpl::int_<0> >(f).paths();
+ return boost::fusion::at<mpl::int_<0> >(f).get_geometry();
}
};
@@ -90,84 +80,27 @@ namespace mapnik { namespace json {
namespace karma = boost::spirit::karma;
+template <typename T>
struct get_id
{
- template <typename T>
- struct result { using type = int; };
-
- int operator() (mapnik::feature_impl const& f) const
+ using feature_type = T;
+ using result_type = int;
+ int operator() (feature_type const& f) const
{
return f.id();
}
};
-struct make_properties_range
-{
- using properties_range_type = boost::iterator_range<mapnik::feature_kv_iterator>;
-
- template <typename T>
- struct result { using type = properties_range_type; };
-
- properties_range_type operator() (mapnik::feature_impl const& f) const
- {
- return boost::make_iterator_range(f.begin(),f.end());
- }
-};
-
-struct utf8
-{
- template <typename T>
- struct result { using type = std::string; };
-
- std::string operator() (mapnik::value_unicode_string const& ustr) const
- {
- std::string result;
- to_utf8(ustr,result);
- return result;
- }
-};
-
-template <typename OutputIterator>
-struct escaped_string
- : karma::grammar<OutputIterator, std::string(char const*)>
-{
- escaped_string();
- karma::rule<OutputIterator, std::string(char const*)> esc_str;
- karma::symbols<char, char const*> esc_char;
-};
-
-struct extract_string
-{
- using result_type = std::tuple<std::string,bool>;
-
- result_type operator() (mapnik::value const& val) const
- {
- bool need_quotes = val.is<value_unicode_string>();
- return std::make_tuple(val.to_string(), need_quotes);
- }
-};
-template <typename OutputIterator>
-struct feature_generator_grammar:
- karma::grammar<OutputIterator, mapnik::feature_impl const&()>
+template <typename OutputIterator, typename FeatureType>
+struct feature_generator_grammar :
+ karma::grammar<OutputIterator, FeatureType const&()>
{
- using pair_type = std::tuple<std::string, mapnik::value>;
- using range_type = make_properties_range::properties_range_type;
-
feature_generator_grammar();
- karma::rule<OutputIterator, mapnik::feature_impl const&()> feature;
- multi_geometry_generator_grammar<OutputIterator, mapnik::geometry_container> geometry;
- escaped_string<OutputIterator> escaped_string_;
- karma::rule<OutputIterator, mapnik::feature_impl const&()> properties;
- karma::rule<OutputIterator, pair_type()> pair;
- karma::rule<OutputIterator, std::tuple<std::string,bool>()> value;
- karma::rule<OutputIterator, mapnik::value_null()> value_null_;
- karma::rule<OutputIterator, mapnik::value_unicode_string()> ustring;
- typename karma::int_generator<mapnik::value_integer,10, false> int__;
- boost::phoenix::function<get_id> id_;
- boost::phoenix::function<extract_string> extract_string_;
- boost::phoenix::function<utf8> utf8_;
- std::string quote_;
+ karma::rule<OutputIterator, FeatureType const&()> feature;
+ geometry_generator_grammar<OutputIterator, mapnik::geometry::geometry<double> > geometry;
+ properties_generator_grammar<OutputIterator, FeatureType> properties;
+ boost::phoenix::function<get_id<FeatureType> > id_;
};
}}
diff --git a/include/mapnik/json/feature_generator_grammar_impl.hpp b/include/mapnik/json/feature_generator_grammar_impl.hpp
index 1d1d3c9..7147bd8 100644
--- a/include/mapnik/json/feature_generator_grammar_impl.hpp
+++ b/include/mapnik/json/feature_generator_grammar_impl.hpp
@@ -29,50 +29,14 @@
namespace mapnik { namespace json {
-namespace karma = boost::spirit::karma;
-
-template <typename OutputIterator>
-escaped_string<OutputIterator>::escaped_string()
- : escaped_string::base_type(esc_str)
-{
- karma::lit_type lit;
- karma::_r1_type _r1;
- karma::hex_type hex;
- karma::right_align_type right_align;
- karma::print_type kprint;
- esc_char.add
- ('"', "\\\"")
- ('\\', "\\\\")
- ('\b', "\\b")
- ('\f', "\\f")
- ('\n', "\\n")
- ('\r', "\\r")
- ('\t', "\\t")
- ;
-
- esc_str = lit(_r1)
- << *(esc_char
- | kprint
- | "\\u" << right_align(4,lit('0'))[hex])
- << lit(_r1)
- ;
-}
-
-template <typename OutputIterator>
-feature_generator_grammar<OutputIterator>::feature_generator_grammar()
- : feature_generator_grammar::base_type(feature),
- quote_("\"")
+template <typename OutputIterator, typename FeatureType>
+feature_generator_grammar<OutputIterator, FeatureType>::feature_generator_grammar()
+ : feature_generator_grammar::base_type(feature)
{
boost::spirit::karma::lit_type lit;
boost::spirit::karma::uint_type uint_;
- boost::spirit::karma::bool_type bool_;
- boost::spirit::karma::double_type double_;
boost::spirit::karma::_val_type _val;
boost::spirit::karma::_1_type _1;
- boost::spirit::karma::string_type kstring;
- boost::spirit::karma::eps_type eps;
-
- using boost::phoenix::at_c;
feature = lit("{\"type\":\"Feature\",\"id\":")
<< uint_[_1 = id_(_val)]
@@ -80,30 +44,6 @@ feature_generator_grammar<OutputIterator>::feature_generator_grammar()
<< lit(",\"properties\":") << properties
<< lit('}')
;
-
- properties = lit('{')
- << -(pair % lit(','))
- << lit('}')
- ;
-
- pair = lit('"')
- << kstring[_1 = boost::phoenix::at_c<0>(_val)] << lit('"')
- << lit(':')
- << value[_1 = extract_string_(at_c<1>(_val))]
- ;
-
- value = eps(at_c<1>(_val)) << escaped_string_(quote_.c_str())[_1 = at_c<0>(_val)]
- |
- kstring[_1 = at_c<0>(_val)]
- ;
-
- // FIXME http://boost-spirit.com/home/articles/karma-examples/creating-your-own-generator-component-for-spirit-karma/
- //value = (value_null_| bool_ | int__ | double_ | ustring)//[_1 = value_base_(_r1)]
- // ;
- //value_null_ = kstring[_1 = "null"]
- // ;
- //ustring = escaped_string_(quote_.c_str())[_1 = utf8_(_val)]
- // ;
}
}}
diff --git a/include/mapnik/json/feature_grammar.hpp b/include/mapnik/json/feature_grammar.hpp
index 90f65b0..08eb39d 100644
--- a/include/mapnik/json/feature_grammar.hpp
+++ b/include/mapnik/json/feature_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,7 +27,6 @@
#include <mapnik/json/geometry_grammar.hpp>
#include <mapnik/value.hpp>
#include <mapnik/feature.hpp>
-#include <mapnik/geometry_container.hpp>
#include <mapnik/unicode.hpp>
#include <mapnik/value.hpp>
#include <mapnik/json/generic_json.hpp>
@@ -42,11 +41,9 @@ namespace mapnik { namespace json {
namespace qi = boost::spirit::qi;
namespace phoenix = boost::phoenix;
namespace fusion = boost::fusion;
-namespace standard_wide = boost::spirit::standard_wide;
-using standard_wide::space_type;
class attribute_value_visitor
- : public mapnik::util::static_visitor<mapnik::value>
+
{
public:
attribute_value_visitor(mapnik::transcoder const& tr)
@@ -79,13 +76,13 @@ struct put_property
mapnik::transcoder const& tr_;
};
-struct extract_geometry
+struct set_geometry_impl
{
- using result_type = mapnik::geometry_container&;
- template <typename T>
- result_type operator() (T & feature) const
+ using result_type = void;
+ template <typename T0, typename T1>
+ result_type operator() (T0 & feature, T1 && geom) const
{
- return feature.paths();
+ return feature.set_geometry(std::move(geom));
}
};
@@ -99,7 +96,6 @@ struct feature_grammar :
// start
// generic JSON
generic_json<Iterator> json_;
-
// geoJSON
qi::rule<Iterator,void(FeatureType&),space_type> feature; // START
qi::rule<Iterator,space_type> feature_type;
@@ -107,9 +103,11 @@ struct feature_grammar :
qi::rule<Iterator,void(FeatureType &),space_type> properties;
qi::rule<Iterator,qi::locals<std::string>, void(FeatureType &),space_type> attributes;
qi::rule<Iterator, json_value(), space_type> attribute_value;
-
+ qi::rule<Iterator, qi::locals<std::int32_t>, std::string(), space_type> stringify_object;
+ qi::rule<Iterator, qi::locals<std::int32_t>, std::string(), space_type> stringify_array;
+ // functions
phoenix::function<put_property> put_property_;
- phoenix::function<extract_geometry> extract_geometry_;
+ phoenix::function<set_geometry_impl> set_geometry;
// error handler
boost::phoenix::function<ErrorHandler> const error_handler;
// geometry
diff --git a/include/mapnik/json/feature_grammar_impl.hpp b/include/mapnik/json/feature_grammar_impl.hpp
index b83b79f..c7f50bb 100644
--- a/include/mapnik/json/feature_grammar_impl.hpp
+++ b/include/mapnik/json/feature_grammar_impl.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -35,8 +35,6 @@ feature_grammar<Iterator,FeatureType,ErrorHandler>::feature_grammar(mapnik::tran
qi::lit_type lit;
qi::long_long_type long_long;
qi::double_type double_;
- qi::no_skip_type no_skip;
- standard_wide::char_type char_;
qi::_val_type _val;
qi::_1_type _1;
qi::_2_type _2;
@@ -45,15 +43,14 @@ feature_grammar<Iterator,FeatureType,ErrorHandler>::feature_grammar(mapnik::tran
qi::_a_type _a;
qi::_r1_type _r1;
qi::eps_type eps;
-
+ qi::char_type char_;
using qi::fail;
using qi::on_error;
using phoenix::new_;
using phoenix::construct;
// generic json types
- json_.value = json_.object | json_.array | json_.string_
- | json_.number
+ json_.value = json_.object | json_.array | json_.string_ | json_.number
;
json_.pairs = json_.key_value % lit(',')
@@ -77,20 +74,6 @@ feature_grammar<Iterator,FeatureType,ErrorHandler>::feature_grammar(mapnik::tran
| lit("null")[_val = construct<value_null>()]
;
- json_.unesc_char.add
- ("\\\"", '\"') // quotation mark
- ("\\\\", '\\') // reverse solidus
- ("\\/", '/') // solidus
- ("\\b", '\b') // backspace
- ("\\f", '\f') // formfeed
- ("\\n", '\n') // newline
- ("\\r", '\r') // carrige return
- ("\\t", '\t') // tab
- ;
-
- json_.string_ %= lit('"') >> no_skip[*(json_.unesc_char | "\\u" >> json_.hex4 | (char_ - lit('"')))] >> lit('"')
- ;
-
// geojson types
feature_type = lit("\"type\"")
>> lit(':')
@@ -99,18 +82,25 @@ feature_grammar<Iterator,FeatureType,ErrorHandler>::feature_grammar(mapnik::tran
feature = lit('{')
>> (feature_type | (lit("\"geometry\"") >> lit(':')
- >> geometry_grammar_(extract_geometry_(_r1))) | properties(_r1) | json_.key_value) % lit(',')
- >> lit('}')
+ >> geometry_grammar_[set_geometry(_r1, _1)]) | properties(_r1) | json_.key_value) % lit(',')
+ >> lit('}')
;
properties = lit("\"properties\"")
- > lit(':') > (lit('{') > -attributes(_r1) > lit('}')) | lit("null")
+ > lit(':') > ((lit('{') > -attributes(_r1) > lit('}')) | lit("null"))
;
attributes = (json_.string_ [_a = _1] > lit(':') > attribute_value [put_property_(_r1,_a,_1)]) % lit(',')
;
- attribute_value %= json_.number | json_.string_ ;
+ attribute_value %= json_.number | json_.string_ | stringify_object | stringify_array
+ ;
+
+ stringify_object %= char_('{')[_a = 1 ] >> *(eps(_a > 0) >> (char_('{')[_a +=1] | char_('}')[_a -=1] | char_))
+ ;
+
+ stringify_array %= char_('[')[_a = 1 ] >> *(eps(_a > 0) >> (char_('[')[_a +=1] | char_(']')[_a -=1] | char_))
+ ;
feature.name("Feature");
feature_type.name("type");
diff --git a/include/mapnik/json/feature_parser.hpp b/include/mapnik/json/feature_parser.hpp
index 9154aca..e4cf569 100644
--- a/include/mapnik/json/feature_parser.hpp
+++ b/include/mapnik/json/feature_parser.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -36,11 +36,13 @@ namespace mapnik { namespace json {
inline bool from_geojson(std::string const& json, mapnik::feature_impl & feature)
{
static const mapnik::transcoder tr("utf8");
- using iterator_type = std::string::const_iterator;
+ using iterator_type = char const*;
static const mapnik::json::feature_grammar<iterator_type,mapnik::feature_impl> g(tr);
using namespace boost::spirit;
- standard_wide::space_type space;
- return qi::phrase_parse(json.begin(), json.end(), (g)(boost::phoenix::ref(feature)), space);
+ ascii::space_type space;
+ iterator_type start = json.c_str();
+ iterator_type end = start + json.length();
+ return qi::phrase_parse(start, end, (g)(boost::phoenix::ref(feature)), space);
}
}}
diff --git a/include/mapnik/json/generic_json.hpp b/include/mapnik/json/generic_json.hpp
index e8baaf1..c4fa67c 100644
--- a/include/mapnik/json/generic_json.hpp
+++ b/include/mapnik/json/generic_json.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -37,19 +37,114 @@
namespace mapnik { namespace json {
namespace qi = boost::spirit::qi;
-namespace standard_wide = boost::spirit::standard_wide;
-using standard_wide::space_type;
-
+namespace ascii = boost::spirit::ascii;
+namespace phoenix = boost::phoenix;
+using space_type = ascii::space_type;
using json_value = mapnik::util::variant<value_null,value_bool, value_integer, value_double, std::string>;
+using uchar = std::uint32_t; // a unicode code point
+
+// unicode string grammar via boost/libs/spirit/example/qi/json/json/parser/grammar.hpp
+
+template <typename Iterator>
+struct unicode_string : qi::grammar<Iterator, std::string()>
+{
+ unicode_string();
+ qi::rule<Iterator, void(std::string&)> escape;
+ qi::rule<Iterator, void(std::string&)> char_esc;
+ qi::rule<Iterator, std::string()> double_quoted;
+};
+
+
+struct push_utf8
+{
+ using result_type = void;
+
+ void operator()(std::string& utf8, uchar code_point) const
+ {
+ typedef std::back_insert_iterator<std::string> insert_iter;
+ insert_iter out_iter(utf8);
+ boost::utf8_output_iterator<insert_iter> utf8_iter(out_iter);
+ *utf8_iter++ = code_point;
+ }
+};
+
+struct push_esc
+{
+ using result_type = void;
+
+ void operator()(std::string& utf8, uchar c) const
+ {
+ switch (c)
+ {
+ case ' ': utf8 += ' '; break;
+ case '\t': utf8 += '\t'; break;
+ case '0': utf8 += char(0); break;
+ case 'a': utf8 += 0x7; break;
+ case 'b': utf8 += 0x8; break;
+ case 't': utf8 += 0x9; break;
+ case 'n': utf8 += 0xA; break;
+ case 'v': utf8 += 0xB; break;
+ case 'f': utf8 += 0xC; break;
+ case 'r': utf8 += 0xD; break;
+ case 'e': utf8 += 0x1B; break;
+ case '"': utf8 += '"'; break;
+ case '/': utf8 += '/'; break;
+ case '\\': utf8 += '\\'; break;
+ case '_': push_utf8()(utf8, 0xA0); break;
+ case 'N': push_utf8()(utf8, 0x85); break;
+ case 'L': push_utf8()(utf8, 0x2028); break;
+ case 'P': push_utf8()(utf8, 0x2029); break;
+ }
+ }
+};
+
+template< typename Iterator >
+unicode_string<Iterator>::unicode_string()
+ : unicode_string::base_type(double_quoted)
+{
+ qi::char_type char_;
+ qi::_val_type _val;
+ qi::_r1_type _r1;
+ qi::_1_type _1;
+ qi::lit_type lit;
+ qi::eol_type eol;
+ qi::repeat_type repeat;
+ qi::hex_type hex;
+
+ using boost::spirit::qi::uint_parser;
+ using boost::phoenix::function;
+ using boost::phoenix::ref;
+
+ uint_parser<uchar, 16, 4, 4> hex4;
+ uint_parser<uchar, 16, 8, 8> hex8;
+ function<push_utf8> push_utf8;
+ function<push_esc> push_esc;
+
+ escape =
+ ('x' > hex) [push_utf8(_r1, _1)]
+ | ('u' > hex4) [push_utf8(_r1, _1)]
+ | ('U' > hex8) [push_utf8(_r1, _1)]
+ | char_("0abtnvfre\"/\\N_LP \t") [push_esc(_r1, _1)]
+ | eol // continue to next line
+ ;
+
+ char_esc =
+ '\\' > escape(_r1)
+ ;
+
+ double_quoted =
+ '"'
+ > *(char_esc(_val) | (~char_('"')) [_val += _1])
+ > '"'
+ ;
+}
template <typename Iterator>
struct generic_json
{
qi::rule<Iterator,space_type> value;
- qi::symbols<char const, char const> unesc_char;
- qi::uint_parser< unsigned, 16, 4, 4 > hex4 ;
qi::int_parser<mapnik::value_integer,10,1,-1> int__;
- qi::rule<Iterator,std::string(), space_type> string_;
+ unicode_string<Iterator> string_;
qi::rule<Iterator,space_type> key_value;
qi::rule<Iterator,json_value(),space_type> number;
qi::rule<Iterator,space_type> object;
@@ -57,8 +152,8 @@ struct generic_json
qi::rule<Iterator,space_type> pairs;
qi::real_parser<double, qi::strict_real_policies<double> > strict_double;
// conversions
- boost::phoenix::function<detail::value_converter<mapnik::value_integer> > integer_converter;
- boost::phoenix::function<detail::value_converter<mapnik::value_double> > double_converter;
+ boost::phoenix::function<mapnik::detail::value_converter<mapnik::value_integer> > integer_converter;
+ boost::phoenix::function<mapnik::detail::value_converter<mapnik::value_double> > double_converter;
};
}}
diff --git a/include/mapnik/json/geometry_generator_grammar.hpp b/include/mapnik/json/geometry_generator_grammar.hpp
index befb803..a26de5b 100644
--- a/include/mapnik/json/geometry_generator_grammar.hpp
+++ b/include/mapnik/json/geometry_generator_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,23 +26,18 @@
// mapnik
#include <mapnik/global.hpp>
#include <mapnik/geometry.hpp>
-#include <mapnik/util/path_iterator.hpp>
-#include <mapnik/util/container_adapter.hpp>
-#include <mapnik/vertex.hpp> // for CommandType::SEG_MOVETO
-
+#include <mapnik/geometry_type.hpp>
+#include <mapnik/geometry_fusion_adapted.hpp>
// boost
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
#pragma GCC diagnostic ignored "-Wunused-local-typedef"
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/phoenix_function.hpp>
-#include <boost/fusion/adapted/std_tuple.hpp>
#include <boost/math/special_functions/trunc.hpp> // for vc++ and android whose c++11 libs lack std::trunc
+#include <boost/spirit/home/karma/domain.hpp>
#pragma GCC diagnostic pop
-//stl
-#include <tuple>
-
namespace mapnik { namespace json {
namespace karma = boost::spirit::karma;
@@ -52,59 +47,12 @@ namespace detail {
template <typename Geometry>
struct get_type
{
- using result_type = int;
- result_type operator() (Geometry const& geom) const
+ using result_type = mapnik::geometry::geometry_types;
+ template <typename T>
+ result_type operator() (T const& geom) const
{
- return static_cast<int>(geom.type());
- }
-};
-
-template <typename Geometry>
-struct get_first
-{
- using result_type = typename Geometry::value_type const;
- result_type operator() (Geometry const& geom) const
- {
- typename Geometry::value_type coord;
- geom.rewind(0);
- std::get<0>(coord) = geom.vertex(&std::get<1>(coord),&std::get<2>(coord));
- return coord;
- }
-};
-
-template <typename GeometryContainer>
-struct multi_geometry_type
-{
- using result_type = std::tuple<unsigned,bool> ;
- result_type operator() (GeometryContainer const& cont) const
- {
- unsigned type = 0u;
- bool collection = false;
- for (auto const& geom : cont)
- {
- if (type != 0u && geom.type() != type)
- {
- collection = true;
- break;
- }
- type = geom.type();
- }
- if (cont.size() > 1) type +=3;
- return std::tuple<unsigned,bool>(type, collection);
- }
-};
-
-template <typename GeometryContainer>
-struct not_empty
-{
- using result_type = bool;
- result_type operator() (GeometryContainer const& cont) const
- {
- for (auto const& geom : cont)
- {
- if (geom.size() > 0) return true;
- }
- return false;
+ auto type = mapnik::geometry::geometry_type(geom);
+ return type;
}
};
@@ -141,47 +89,30 @@ struct json_coordinate_policy : karma::real_policies<T>
template <typename OutputIterator, typename Geometry>
struct geometry_generator_grammar :
- karma::grammar<OutputIterator, Geometry const& ()>
+ karma::grammar<OutputIterator, Geometry const&()>
{
- using geometry_type = Geometry;
- using coord_type = typename std::remove_pointer<typename geometry_type::value_type>::type;
geometry_generator_grammar();
- karma::rule<OutputIterator, geometry_type const& ()> coordinates;
- karma::rule<OutputIterator, geometry_type const& ()> point;
- karma::rule<OutputIterator, geometry_type const& ()> linestring;
- karma::rule<OutputIterator, geometry_type const& ()> polygon;
- karma::rule<OutputIterator, geometry_type const& ()> coords;
- karma::rule<OutputIterator, karma::locals<unsigned>, geometry_type const& ()> coords2;
- karma::rule<OutputIterator, coord_type()> point_coord;
- karma::rule<OutputIterator, coord_type(unsigned& )> polygon_coord;
- boost::phoenix::function<detail::get_type<geometry_type> > _type;
- boost::phoenix::function<detail::get_first<geometry_type> > _first;
+ karma::rule<OutputIterator, Geometry const&()> geometry;
+ karma::rule<OutputIterator, karma::locals<mapnik::geometry::geometry_types>, Geometry const&() > geometry_dispatch;
+ karma::rule<OutputIterator, geometry::geometry<double> const&()> point;
+ karma::rule<OutputIterator, geometry::point<double> const&()> point_coord;
+ karma::rule<OutputIterator, geometry::geometry<double> const&()> linestring;
+ karma::rule<OutputIterator, geometry::line_string<double> const&()> linestring_coord;
+ karma::rule<OutputIterator, geometry::geometry<double> const&()> polygon;
+ karma::rule<OutputIterator, geometry::polygon<double> const&()> polygon_coord;
+ karma::rule<OutputIterator, geometry::linear_ring<double> const&()> exterior_ring_coord;
+ karma::rule<OutputIterator, std::vector<geometry::linear_ring<double> > const&()> interior_ring_coord;
+ karma::rule<OutputIterator, geometry::geometry<double> const& ()> multi_point;
+ karma::rule<OutputIterator, geometry::multi_point<double> const& ()> multi_point_coord;
+ karma::rule<OutputIterator, geometry::geometry<double> const& ()> multi_linestring;
+ karma::rule<OutputIterator, geometry::multi_line_string<double> const& ()> multi_linestring_coord;
+ karma::rule<OutputIterator, geometry::geometry<double> const& ()> multi_polygon;
+ karma::rule<OutputIterator, geometry::multi_polygon<double> const& ()> multi_polygon_coord;
+ karma::rule<OutputIterator, geometry::geometry<double> const& ()> geometry_collection;
+ karma::rule<OutputIterator, geometry::geometry_collection<double> const& ()> geometries;
+ boost::phoenix::function<detail::get_type<Geometry> > geometry_type;
karma::real_generator<double, detail::json_coordinate_policy<double> > coordinate;
-};
-
-template <typename OutputIterator, typename GeometryContainer>
-struct multi_geometry_generator_grammar :
- karma::grammar<OutputIterator, karma::locals<std::tuple<unsigned,bool> >,
- GeometryContainer const& ()>
-{
- using geometry_type = typename std::remove_pointer<typename GeometryContainer::value_type>::type;
- multi_geometry_generator_grammar();
- karma::rule<OutputIterator, karma::locals<std::tuple<unsigned,bool> >,
- GeometryContainer const&()> start;
- karma::rule<OutputIterator, karma::locals<std::tuple<unsigned,bool> >,
- GeometryContainer const&()> geometry_collection;
- karma::rule<OutputIterator, karma::locals<std::tuple<unsigned,bool> >,
- GeometryContainer const&()> geometry;
- karma::rule<OutputIterator, karma::locals<unsigned>,
- geometry_type const&()> geometry2;
- karma::rule<OutputIterator, GeometryContainer const&()> coordinates;
- geometry_generator_grammar<OutputIterator, geometry_type> path;
- // phoenix functions
- boost::phoenix::function<detail::multi_geometry_type<GeometryContainer> > multi_type_;
- boost::phoenix::function<detail::get_type<geometry_type> > type_;
- boost::phoenix::function<detail::not_empty<GeometryContainer> > not_empty_;
- karma::symbols<unsigned, char const*> geometry_types;
};
}}
diff --git a/include/mapnik/json/geometry_generator_grammar_impl.hpp b/include/mapnik/json/geometry_generator_grammar_impl.hpp
index e1b16bc..c6968cf 100644
--- a/include/mapnik/json/geometry_generator_grammar_impl.hpp
+++ b/include/mapnik/json/geometry_generator_grammar_impl.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2014 Artem Pavlenko
+ * Copyright (C) 2015 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,6 +22,7 @@
// mapnik
#include <mapnik/json/geometry_generator_grammar.hpp>
+#include <mapnik/util/spirit_transform_attribute.hpp>
// boost
#include <boost/spirit/include/karma.hpp>
@@ -33,110 +34,78 @@
namespace mapnik { namespace json {
namespace karma = boost::spirit::karma;
+namespace phoenix = boost::phoenix;
template <typename OutputIterator, typename Geometry>
geometry_generator_grammar<OutputIterator, Geometry>::geometry_generator_grammar()
- : geometry_generator_grammar::base_type(coordinates)
+ : geometry_generator_grammar::base_type(geometry)
{
- boost::spirit::karma::uint_type uint_;
- boost::spirit::bool_type bool_;
boost::spirit::karma::_val_type _val;
boost::spirit::karma::_1_type _1;
- boost::spirit::karma::lit_type lit;
boost::spirit::karma::_a_type _a;
- boost::spirit::karma::_r1_type _r1;
+ boost::spirit::karma::lit_type lit;
+ boost::spirit::karma::uint_type uint_;
boost::spirit::karma::eps_type eps;
- boost::spirit::karma::string_type kstring;
- coordinates = point | linestring | polygon
+ geometry = geometry_dispatch.alias()
;
- point = &uint_(mapnik::geometry_type::types::Point)[_1 = _type(_val)]
- << point_coord [_1 = _first(_val)]
+ geometry_dispatch = eps[_a = geometry_type(_val)] <<
+ (&uint_(geometry::geometry_types::Point)[_1 = _a]
+ << (point | lit("null")))
+ |
+ (&uint_(geometry::geometry_types::LineString)[_1 = _a]
+ << (linestring | lit("null")))
+ |
+ (&uint_(geometry::geometry_types::Polygon)[_1 = _a]
+ << (polygon | lit("null")))
+ |
+ (&uint_(geometry::geometry_types::MultiPoint)[_1 = _a]
+ << (multi_point | lit("null")))
+ |
+ (&uint_(geometry::geometry_types::MultiLineString)[_1 = _a]
+ << (multi_linestring | lit("null")))
+ |
+ (&uint_(geometry::geometry_types::MultiPolygon)[_1 = _a]
+ << (multi_polygon | lit("null")))
+ |
+ (&uint_(geometry::geometry_types::GeometryCollection)[_1 = _a]
+ << (geometry_collection | lit("null")))
+ |
+ lit("null")
;
- linestring = &uint_(mapnik::geometry_type::types::LineString)[_1 = _type(_val)]
- << lit('[')
- << coords
- << lit(']')
+ point = lit("{\"type\":\"Point\",\"coordinates\":") << point_coord << lit("}")
;
-
- polygon = &uint_(mapnik::geometry_type::types::Polygon)[_1 = _type(_val)]
- << lit('[')
- << coords2
- << lit("]]")
+ linestring = lit("{\"type\":\"LineString\",\"coordinates\":[") << linestring_coord << lit("]}")
;
-
- point_coord = &uint_
- << lit('[')
- << coordinate << lit(',') << coordinate
- << lit(']')
+ polygon = lit("{\"type\":\"Polygon\",\"coordinates\":[") << polygon_coord << lit("]}")
;
-
- polygon_coord %= ( &uint_(mapnik::SEG_MOVETO) << eps[_r1 += 1]
- << kstring[ if_ (_r1 > 1u) [_1 = "],["]
- .else_[_1 = '[' ]]
- |
- &uint_(mapnik::SEG_LINETO)
- << lit(',')) << lit('[') << coordinate << lit(',') << coordinate << lit(']')
+ multi_point = lit("{\"type\":\"MultiPoint\",\"coordinates\":[") << multi_point_coord << lit("]}")
;
-
- coords2 %= *polygon_coord(_a)
+ multi_linestring = lit("{\"type\":\"MultiLineString\",\"coordinates\":[") << multi_linestring_coord << lit("]}")
;
-
- coords = point_coord % lit(',')
+ multi_polygon = lit("{\"type\":\"MultiPolygon\",\"coordinates\":[") << multi_polygon_coord << lit("]}")
;
-}
-
-template <typename OutputIterator, typename GeometryContainer>
-multi_geometry_generator_grammar<OutputIterator, GeometryContainer>::multi_geometry_generator_grammar()
- : multi_geometry_generator_grammar::base_type(start)
-{
- boost::spirit::karma::uint_type uint_;
- boost::spirit::bool_type bool_;
- boost::spirit::karma::_val_type _val;
- boost::spirit::karma::_1_type _1;
- boost::spirit::karma::lit_type lit;
- boost::spirit::karma::_a_type _a;
- boost::spirit::karma::eps_type eps;
- boost::spirit::karma::string_type kstring;
-
- geometry_types.add
- (mapnik::geometry_type::types::Point,"\"Point\"")
- (mapnik::geometry_type::types::LineString,"\"LineString\"")
- (mapnik::geometry_type::types::Polygon,"\"Polygon\"")
- (mapnik::geometry_type::types::Point + 3,"\"MultiPoint\"")
- (mapnik::geometry_type::types::LineString + 3,"\"MultiLineString\"")
- (mapnik::geometry_type::types::Polygon + 3,"\"MultiPolygon\"")
+ geometry_collection = lit("{\"type\":\"GeometryCollection\",\"geometries\":[") << geometries << lit("]}")
;
-
- start %= ( eps(boost::phoenix::at_c<1>(_a))[_a = multi_type_(_val)]
- << lit("{\"type\":\"GeometryCollection\",\"geometries\":[")
- << geometry_collection << lit("]}")
- |
- geometry)
+ point_coord = lit('[') << coordinate << lit(',') << coordinate << lit(']')
;
-
- geometry_collection = -(geometry2 % lit(','))
+ linestring_coord = point_coord % lit(',')
;
-
- geometry = ( &bool_(true)[_1 = not_empty_(_val)] << lit("{\"type\":")
- << geometry_types[_1 = boost::phoenix::at_c<0>(_a)][_a = multi_type_(_val)]
- << lit(",\"coordinates\":")
- << kstring[ boost::phoenix::if_ (boost::phoenix::at_c<0>(_a) > 3u) [_1 = '['].else_[_1 = ""]]
- << coordinates
- << kstring[ boost::phoenix::if_ (boost::phoenix::at_c<0>(_a) > 3u) [_1 = ']'].else_[_1 = ""]]
- << lit('}')) | lit("null")
+ polygon_coord = lit('[') << exterior_ring_coord << lit(']') << interior_ring_coord
;
-
- geometry2 = lit("{\"type\":")
- << geometry_types[_1 = _a][_a = type_(_val)]
- << lit(",\"coordinates\":")
- << path
- << lit('}')
+ exterior_ring_coord = linestring_coord.alias()
;
-
- coordinates %= path % lit(',')
+ interior_ring_coord = *(lit(",[") << exterior_ring_coord << lit(']'))
+ ;
+ multi_point_coord = linestring_coord.alias()
+ ;
+ multi_linestring_coord = (lit('[') << linestring_coord << lit(']')) % lit(',')
+ ;
+ multi_polygon_coord = (lit('[') << polygon_coord << lit(']')) % lit(',')
+ ;
+ geometries = geometry % lit(',')
;
}
diff --git a/include/mapnik/json/geometry_grammar.hpp b/include/mapnik/json/geometry_grammar.hpp
index 6d132cf..2414557 100644
--- a/include/mapnik/json/geometry_grammar.hpp
+++ b/include/mapnik/json/geometry_grammar.hpp
@@ -25,11 +25,10 @@
// mapnik
#include <mapnik/geometry.hpp> // for geometry_type
-#include <mapnik/vertex.hpp> // for CommandType
#include <mapnik/make_unique.hpp>
+#include <mapnik/json/generic_json.hpp>
#include <mapnik/json/positions_grammar.hpp>
#include <mapnik/json/geometry_util.hpp>
-#include <mapnik/geometry_container.hpp>
// spirit::qi
#include <boost/spirit/include/qi.hpp>
@@ -38,19 +37,16 @@
namespace mapnik { namespace json {
namespace qi = boost::spirit::qi;
-namespace standard_wide = boost::spirit::standard_wide;
-using standard_wide::space_type;
template <typename Iterator, typename ErrorHandler = error_handler<Iterator> >
struct geometry_grammar :
- qi::grammar<Iterator,void(mapnik::geometry_container& )
- , space_type>
+ qi::grammar<Iterator, mapnik::geometry::geometry<double>() ,space_type>
{
geometry_grammar();
- qi::rule<Iterator,void(mapnik::geometry_container& ), space_type> start;
- qi::rule<Iterator, qi::locals<int, mapnik::json::coordinates>, void(mapnik::geometry_container& ), space_type> geometry;
+ qi::rule<Iterator, mapnik::geometry::geometry<double>(), space_type> start;
+ qi::rule<Iterator, qi::locals<int, mapnik::json::coordinates>, mapnik::geometry::geometry<double>(), space_type> geometry;
qi::symbols<char, int> geometry_type_dispatch;
- qi::rule<Iterator,void(mapnik::geometry_container& ),space_type> geometry_collection;
+ qi::rule<Iterator, mapnik::geometry::geometry_collection<double>(), space_type> geometry_collection;
positions_grammar<Iterator> coordinates;
boost::phoenix::function<create_geometry_impl> create_geometry;
// error handler
diff --git a/include/mapnik/json/geometry_grammar_impl.hpp b/include/mapnik/json/geometry_grammar_impl.hpp
index afc22f8..71188a7 100644
--- a/include/mapnik/json/geometry_grammar_impl.hpp
+++ b/include/mapnik/json/geometry_grammar_impl.hpp
@@ -42,23 +42,23 @@ geometry_grammar<Iterator, ErrorHandler>::geometry_grammar()
qi::lit_type lit;
qi::int_type int_;
qi::double_type double_;
+ qi::_val_type _val;
qi::_1_type _1;
qi::_2_type _2;
qi::_3_type _3;
qi::_4_type _4;
qi::_a_type _a;
qi::_b_type _b;
- qi::_r1_type _r1;
qi::eps_type eps;
using qi::fail;
using qi::on_error;
-
- start = geometry(_r1) | geometry_collection(_r1);
+ using phoenix::push_back;
+ start = geometry | geometry_collection;
geometry = (lit('{')[_a = 0 ]
>> (-lit(',') >> lit("\"type\"") >> lit(':') >> geometry_type_dispatch[_a = _1]
^
- (-lit(',') >> lit("\"coordinates\"") >> lit(':') >> coordinates[_b = _1]))[create_geometry(_r1,_a,_b)]
+ (-lit(',') >> lit("\"coordinates\"") >> lit(':') >> coordinates[_b = _1]))[create_geometry(_val,_a,_b)]
>> lit('}'))
| lit("null")
;
@@ -67,7 +67,7 @@ geometry_grammar<Iterator, ErrorHandler>::geometry_grammar()
>> (-lit(',') >> lit("\"type\"") >> lit(':') >> lit("\"GeometryCollection\"")
^
-lit(',') >> lit("\"geometries\"") >> lit(':')
- >> lit('[') >> geometry(_r1) % lit(',') >> lit(']'))
+ >> lit('[') >> geometry[push_back(_val, _1)] % lit(',') >> lit(']'))
>> lit('}'))
| lit("null")
;
diff --git a/include/mapnik/json/geometry_parser.hpp b/include/mapnik/json/geometry_parser.hpp
index 57f5ac6..f4aabe5 100644
--- a/include/mapnik/json/geometry_parser.hpp
+++ b/include/mapnik/json/geometry_parser.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,8 +24,8 @@
#define MAPNIK_JSON_GEOMETRY_PARSER_HPP
// mapnik
-#include <mapnik/geometry.hpp>
-#include <mapnik/geometry_container.hpp>
+
+
#include <mapnik/json/geometry_grammar.hpp>
// boost
@@ -34,14 +34,14 @@
namespace mapnik { namespace json {
-inline bool from_geojson(std::string const& json, geometry_container & paths)
+inline bool from_geojson(std::string const& json, mapnik::geometry::geometry<double> & geom)
{
using namespace boost::spirit;
- static const geometry_grammar<std::string::const_iterator> g;
- standard_wide::space_type space;
- std::string::const_iterator start = json.begin();
- std::string::const_iterator end = json.end();
- return qi::phrase_parse(start, end, (g)(boost::phoenix::ref(paths)), space);
+ static const geometry_grammar<char const*> g;
+ ascii::space_type space;
+ char const* start = json.c_str();
+ char const* end = start + json.length();
+ return qi::phrase_parse(start, end, g, space, geom);
}
}}
diff --git a/include/mapnik/json/geometry_util.hpp b/include/mapnik/json/geometry_util.hpp
index dd0c566..36c4175 100644
--- a/include/mapnik/json/geometry_util.hpp
+++ b/include/mapnik/json/geometry_util.hpp
@@ -23,208 +23,218 @@
#ifndef MAPNIK_JSON_GEOMETRY_UTIL_HPP
#define MAPNIK_JSON_GEOMETRY_UTIL_HPP
-#include <mapnik/geometry.hpp> // for geometry_type
-#include <mapnik/vertex.hpp> // for CommandType
-#include <mapnik/make_unique.hpp>
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_correct.hpp>
namespace mapnik { namespace json {
// geometries
-template <typename Path>
-struct create_point : util::static_visitor<>
+template <typename Geometry>
+struct create_point
{
- explicit create_point(Path & path)
- : path_(path) {}
+ explicit create_point(Geometry & geom)
+ : geom_(geom) {}
- void operator()(position const& pos) const
+ void operator() (position const& pos) const
{
- auto pt = std::make_unique<geometry_type>(geometry_type::types::Point);
- pt->move_to(std::get<0>(pos), std::get<1>(pos));
- path_.push_back(pt.release());
+ mapnik::geometry::point<double> point(pos.x, pos.y);
+ geom_ = std::move(point);
}
template <typename T>
void operator()(T const&) const {} // no-op - shouldn't get here
- Path & path_;
+ Geometry & geom_;
};
-template <typename Path>
-struct create_linestring : util::static_visitor<>
+template <typename Geometry>
+struct create_linestring
{
- explicit create_linestring(Path & path)
- : path_(path) {}
+ explicit create_linestring(Geometry & geom)
+ : geom_(geom) {}
- void operator()(positions const& ring) const
+ void operator() (positions const& ring) const
{
std::size_t size = ring.size();
if (size > 1)
{
- auto line = std::make_unique<geometry_type>(geometry_type::types::LineString);
- line->move_to(std::get<0>(ring.front()), std::get<1>(ring.front()));
-
- for (std::size_t index = 1; index < size; ++index)
+ mapnik::geometry::line_string<double> line;
+ line.reserve(size);
+ for (auto && pt : ring)
{
- line->line_to(std::get<0>(ring[index]), std::get<1>(ring[index]));
+ line.emplace_back(std::move(pt));
}
- path_.push_back(line.release());
+ geom_ = std::move(line);
}
}
template <typename T>
void operator()(T const&) const {} // no-op - shouldn't get here
- Path & path_;
+ Geometry & geom_;
};
-template <typename Path>
-struct create_polygon : util::static_visitor<>
+template <typename Geometry>
+struct create_polygon
{
- explicit create_polygon(Path & path)
- : path_(path) {}
+ explicit create_polygon(Geometry & geom)
+ : geom_(geom) {}
- void operator()(std::vector<positions> const& rings) const
+ void operator() (std::vector<positions> const& rings) const
{
- auto poly = std::make_unique<geometry_type>(geometry_type::types::Polygon);
+ mapnik::geometry::polygon<double> poly;
+ std::size_t num_rings = rings.size();
+ if (num_rings > 1)
+ {
+ poly.interior_rings.reserve(num_rings - 1);
+ }
- for (auto const& ring : rings)
+ for ( std::size_t i = 0; i < num_rings; ++i)
{
- std::size_t size = ring.size();
- if (size > 2) // at least 3 vertices to form a ring
+ std::size_t size = rings[i].size();
+ mapnik::geometry::linear_ring<double> ring;
+ ring.reserve(size);
+ for ( auto && pt : rings[i])
{
- poly->move_to(std::get<0>(ring.front()), std::get<1>(ring.front()));
- for (std::size_t index = 1; index < size; ++index)
- {
- poly->line_to(std::get<0>(ring[index]), std::get<1>(ring[index]));
- }
- poly->close_path();
+ ring.emplace_back(std::move(pt));
}
+ if (i == 0) poly.set_exterior_ring(std::move(ring));
+ else poly.add_hole(std::move(ring));
}
- path_.push_back(poly.release());
+ geom_ = std::move(poly);
+ mapnik::geometry::correct(geom_);
}
template <typename T>
void operator()(T const&) const {} // no-op - shouldn't get here
- Path & path_;
+ Geometry & geom_;
};
// multi-geometries
-
-template <typename Path>
-struct create_multipoint : util::static_visitor<>
+template <typename Geometry>
+struct create_multipoint
{
- explicit create_multipoint(Path & path)
- : path_(path) {}
+ explicit create_multipoint(Geometry & geom)
+ : geom_(geom) {}
- void operator()(positions const& points) const
+ void operator() (positions const& points) const
{
- for (auto const& pos : points)
+ mapnik::geometry::multi_point<double> multi_point;
+ multi_point.reserve(points.size());
+ for (auto && pos : points)
{
- auto point = std::make_unique<geometry_type>(geometry_type::types::Point);
- point->move_to(std::get<0>(pos), std::get<1>(pos));
- path_.push_back(point.release());
+ multi_point.emplace_back(std::move(pos));
}
+ geom_ = std::move(multi_point);
}
template <typename T>
void operator()(T const&) const {} // no-op - shouldn't get here
- Path & path_;
+ Geometry & geom_;
};
-template <typename Path>
-struct create_multilinestring : util::static_visitor<>
+template <typename Geometry>
+struct create_multilinestring
{
- explicit create_multilinestring(Path & path)
- : path_(path) {}
+ explicit create_multilinestring(Geometry & geom)
+ : geom_(geom) {}
- void operator()(std::vector<positions> const& rings) const
+ void operator() (std::vector<positions> const& rings) const
{
+ mapnik::geometry::multi_line_string<double> multi_line;
+ multi_line.reserve(rings.size());
+
for (auto const& ring : rings)
{
- auto line = std::make_unique<geometry_type>(geometry_type::types::LineString);
- std::size_t size = ring.size();
- if (size > 1) // at least 2 vertices to form a linestring
+ mapnik::geometry::line_string<double> line;
+ line.reserve(ring.size());
+ for (auto && pt : ring)
{
- line->move_to(std::get<0>(ring.front()), std::get<1>(ring.front()));
- for (std::size_t index = 1; index < size; ++index)
- {
- line->line_to(std::get<0>(ring[index]), std::get<1>(ring[index]));
- }
+ line.emplace_back(std::move(pt));
}
- path_.push_back(line.release());
+ multi_line.emplace_back(std::move(line));
}
+ geom_ = std::move(multi_line);
}
template <typename T>
void operator()(T const&) const {} // no-op - shouldn't get here
- Path & path_;
+ Geometry & geom_;
};
-template <typename Path>
-struct create_multipolygon : util::static_visitor<>
+template <typename Geometry>
+struct create_multipolygon
{
- explicit create_multipolygon(Path & path)
- : path_(path) {}
+ explicit create_multipolygon(Geometry & geom)
+ : geom_(geom) {}
void operator()(std::vector<std::vector<positions> > const& rings_array) const
{
+ mapnik::geometry::multi_polygon<double> multi_poly;
+ multi_poly.reserve(rings_array.size());
for (auto const& rings : rings_array)
{
- auto poly = std::make_unique<geometry_type>(geometry_type::types::Polygon);
- for (auto const& ring : rings)
+ mapnik::geometry::polygon<double> poly;
+ std::size_t num_rings = rings.size();
+ if ( num_rings > 1)
+ poly.interior_rings.reserve(num_rings - 1);
+
+ for ( std::size_t i = 0; i < num_rings; ++i)
{
- std::size_t size = ring.size();
- if (size > 2) // at least 3 vertices to form a ring
+ std::size_t size = rings[i].size();
+ mapnik::geometry::linear_ring<double> ring;
+ ring.reserve(size);
+ for ( auto && pt : rings[i])
{
- poly->move_to(std::get<0>(ring.front()), std::get<1>(ring.front()));
- for (std::size_t index = 1; index < size; ++index)
- {
- poly->line_to(std::get<0>(ring[index]), std::get<1>(ring[index]));
- }
- poly->close_path();
+ ring.emplace_back(std::move(pt));
}
+ if (i == 0) poly.set_exterior_ring(std::move(ring));
+ else poly.add_hole(std::move(ring));
}
- path_.push_back(poly.release());
+ multi_poly.emplace_back(std::move(poly));
}
+ geom_ = std::move(multi_poly);
+ mapnik::geometry::correct(geom_);
}
template <typename T>
void operator()(T const&) const {} // no-op - shouldn't get here
- Path & path_;
+ Geometry & geom_;
};
struct create_geometry_impl
{
using result_type = void;
- template <typename T0>
- void operator() (T0 & path, int type, mapnik::json::coordinates const& coords) const
+ template <typename Geometry>
+ void operator() (Geometry & geom, int type, mapnik::json::coordinates const& coords) const
{
switch (type)
{
case 1 ://Point
- util::apply_visitor(create_point<T0>(path), coords);
+ util::apply_visitor(create_point<Geometry>(geom), coords);
break;
case 2 ://LineString
- util::apply_visitor(create_linestring<T0>(path), coords);
- break;
+ util::apply_visitor(create_linestring<Geometry>(geom), coords);
+ break;
case 3 ://Polygon
- util::apply_visitor(create_polygon<T0>(path), coords);
+ util::apply_visitor(create_polygon<Geometry>(geom), coords);
break;
case 4 ://MultiPoint
- util::apply_visitor(create_multipoint<T0>(path), coords);
+ util::apply_visitor(create_multipoint<Geometry>(geom), coords);
break;
case 5 ://MultiLineString
- util::apply_visitor(create_multilinestring<T0>(path), coords);
+ util::apply_visitor(create_multilinestring<Geometry>(geom), coords);
break;
case 6 ://MultiPolygon
- util::apply_visitor(create_multipolygon<T0>(path), coords);
+ util::apply_visitor(create_multipolygon<Geometry>(geom), coords);
break;
default:
break;
}
+
}
};
diff --git a/include/mapnik/json/positions_grammar.hpp b/include/mapnik/json/positions_grammar.hpp
index 32b1e2a..2a70306 100644
--- a/include/mapnik/json/positions_grammar.hpp
+++ b/include/mapnik/json/positions_grammar.hpp
@@ -25,8 +25,10 @@
// mapnik
#include <mapnik/util/variant.hpp>
+#include <mapnik/json/generic_json.hpp>
#include <mapnik/json/error_handler.hpp>
-
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_fusion_adapted.hpp>
// boost
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
@@ -40,14 +42,14 @@
#include <tuple>
namespace mapnik { namespace json {
+
struct empty {};
-using position = std::tuple<double,double>;
+
+using position = mapnik::geometry::point<double>;
using positions = std::vector<position>;
using coordinates = util::variant<empty, position, positions, std::vector<positions>, std::vector<std::vector<positions> > > ;
namespace qi = boost::spirit::qi;
-namespace standard_wide = boost::spirit::standard_wide;
-using standard_wide::space_type;
struct set_position_impl
{
diff --git a/include/mapnik/json/properties_generator_grammar.hpp b/include/mapnik/json/properties_generator_grammar.hpp
new file mode 100644
index 0000000..e52b55e
--- /dev/null
+++ b/include/mapnik/json/properties_generator_grammar.hpp
@@ -0,0 +1,83 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_JSON_PROPERTIES_GENERATOR_GRAMMAR_HPP
+#define MAPNIK_JSON_PROPERTIES_GENERATOR_GRAMMAR_HPP
+
+#include <mapnik/value_types.hpp>
+#include <mapnik/value.hpp>
+#include <mapnik/feature_kv_iterator.hpp>
+
+// boost
+#include <boost/spirit/include/karma.hpp>
+#include <boost/spirit/include/phoenix.hpp>
+#include <boost/spirit/include/phoenix_function.hpp>
+#include <boost/spirit/include/phoenix_fusion.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/fusion/adapted/std_tuple.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/cons.hpp>
+
+namespace mapnik { namespace json {
+
+template <typename OutputIterator>
+struct escaped_string
+ : karma::grammar<OutputIterator, std::string(char const*)>
+{
+ escaped_string();
+ karma::rule<OutputIterator, std::string(char const*)> esc_str;
+ karma::symbols<char, char const*> esc_char;
+};
+
+struct extract_string
+{
+ using result_type = std::tuple<std::string,bool>;
+
+ result_type operator() (mapnik::value const& val) const
+ {
+ bool need_quotes = val.is<value_unicode_string>();
+ return std::make_tuple(val.to_string(), need_quotes);
+ }
+};
+
+template <typename OutputIterator, typename KeyValueStore>
+struct properties_generator_grammar : karma::grammar<OutputIterator, KeyValueStore const&()>
+
+{
+ using pair_type = std::tuple<std::string, mapnik::value>;
+ properties_generator_grammar();
+ // rules
+ karma::rule<OutputIterator, KeyValueStore const&()> properties;
+ karma::rule<OutputIterator, pair_type()> pair;
+ karma::rule<OutputIterator, std::tuple<std::string,bool>()> value;
+ karma::rule<OutputIterator, mapnik::value_null()> value_null_;
+ karma::rule<OutputIterator, mapnik::value_unicode_string()> ustring;
+ escaped_string<OutputIterator> escaped_string_;
+ typename karma::int_generator<mapnik::value_integer,10, false> int__;
+ boost::phoenix::function<extract_string> extract_string_;
+ std::string quote_;
+};
+
+}}
+
+#endif //MAPNIK_JSON_PROPERTIES_GENERATOR_GRAMMAR_HPP
diff --git a/include/mapnik/json/properties_generator_grammar_impl.hpp b/include/mapnik/json/properties_generator_grammar_impl.hpp
new file mode 100644
index 0000000..197f000
--- /dev/null
+++ b/include/mapnik/json/properties_generator_grammar_impl.hpp
@@ -0,0 +1,92 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+
+#include <mapnik/json/properties_generator_grammar.hpp>
+
+namespace mapnik { namespace json {
+
+namespace karma = boost::spirit::karma;
+
+template <typename OutputIterator>
+escaped_string<OutputIterator>::escaped_string()
+ : escaped_string::base_type(esc_str)
+{
+ karma::lit_type lit;
+ karma::_r1_type _r1;
+ karma::char_type char_;
+ esc_char.add
+ ('\a', "\\u0007")
+ ('\b', "\\b")
+ ('\f', "\\f")
+ ('\n', "\\n")
+ ('\r', "\\r")
+ ('\t', "\\t")
+ ('\v', "\\u000b")
+ ('"', "\\\"")
+ ('\\', "\\\\")
+ ;
+ esc_str = lit(_r1)
+ << *(esc_char | char_)
+ << lit(_r1)
+ ;
+}
+
+template <typename OutputIterator, typename KeyValueStore>
+properties_generator_grammar<OutputIterator,KeyValueStore>::properties_generator_grammar()
+ : properties_generator_grammar::base_type(properties),
+ quote_("\"")
+{
+
+ boost::spirit::karma::lit_type lit;
+ boost::spirit::karma::_val_type _val;
+ boost::spirit::karma::_1_type _1;
+ boost::spirit::karma::string_type kstring;
+ boost::spirit::karma::eps_type eps;
+ using boost::phoenix::at_c;
+
+ properties = lit('{')
+ << -(pair % lit(','))
+ << lit('}')
+ ;
+
+ pair = lit('"')
+ << kstring[_1 = boost::phoenix::at_c<0>(_val)] << lit('"')
+ << lit(':')
+ << value[_1 = extract_string_(at_c<1>(_val))]
+ ;
+
+ value = eps(at_c<1>(_val)) << escaped_string_(quote_.c_str())[_1 = at_c<0>(_val)]
+ |
+ kstring[_1 = at_c<0>(_val)]
+ ;
+
+ // FIXME http://boost-spirit.com/home/articles/karma-examples/creating-your-own-generator-component-for-spirit-karma/
+ //value = (value_null_| bool_ | int__ | double_ | ustring)//[_1 = value_base_(_r1)]
+ // ;
+ //value_null_ = kstring[_1 = "null"]
+ // ;
+ //ustring = escaped_string_(quote_.c_str())[_1 = utf8_(_val)]
+ // ;
+}
+
+}}
diff --git a/include/mapnik/json/symbolizer_grammar.hpp b/include/mapnik/json/symbolizer_grammar.hpp
index 5f1a7c3..bd34af0 100644
--- a/include/mapnik/json/symbolizer_grammar.hpp
+++ b/include/mapnik/json/symbolizer_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -45,7 +45,7 @@ namespace standard_wide = boost::spirit::standard_wide;
using standard_wide::space_type;
template <typename Symbolizer>
-struct json_value_visitor : mapnik::util::static_visitor<>
+struct json_value_visitor
{
json_value_visitor(Symbolizer & sym, mapnik::keys key)
: sym_(sym), key_(key) {}
@@ -82,7 +82,7 @@ struct json_value_visitor : mapnik::util::static_visitor<>
};
template <typename T>
-struct put_property_visitor : mapnik::util::static_visitor<>
+struct put_property_visitor
{
using value_type = T;
diff --git a/include/mapnik/json/topojson_grammar.hpp b/include/mapnik/json/topojson_grammar.hpp
index b36f8ab..881dcb5 100644
--- a/include/mapnik/json/topojson_grammar.hpp
+++ b/include/mapnik/json/topojson_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -44,8 +44,7 @@ namespace mapnik { namespace topojson {
namespace qi = boost::spirit::qi;
namespace fusion = boost::fusion;
-namespace standard_wide = boost::spirit::standard_wide;
-using standard_wide::space_type;
+using space_type = boost::spirit::ascii::space_type;
template <typename Iterator, typename ErrorHandler = json::error_handler<Iterator> >
struct topojson_grammar : qi::grammar<Iterator, space_type, topology()>
diff --git a/include/mapnik/json/topojson_grammar_impl.hpp b/include/mapnik/json/topojson_grammar_impl.hpp
index 3231c9f..d939d4b 100644
--- a/include/mapnik/json/topojson_grammar_impl.hpp
+++ b/include/mapnik/json/topojson_grammar_impl.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,8 +27,6 @@ namespace mapnik { namespace topojson {
namespace qi = boost::spirit::qi;
namespace phoenix = boost::phoenix;
namespace fusion = boost::fusion;
-namespace standard_wide = boost::spirit::standard_wide;
-using standard_wide::space_type;
template <typename Iterator, typename ErrorHandler>
topojson_grammar<Iterator, ErrorHandler>::topojson_grammar()
@@ -37,7 +35,6 @@ topojson_grammar<Iterator, ErrorHandler>::topojson_grammar()
qi::lit_type lit;
qi::double_type double_;
qi::int_type int_;
- qi::no_skip_type no_skip;
qi::omit_type omit;
qi::_val_type _val;
qi::_1_type _1;
@@ -45,7 +42,6 @@ topojson_grammar<Iterator, ErrorHandler>::topojson_grammar()
qi::_3_type _3;
qi::_4_type _4;
qi::_r1_type _r1;
- standard_wide::char_type char_;
using qi::fail;
using qi::on_error;
using phoenix::push_back;
@@ -75,20 +71,6 @@ topojson_grammar<Iterator, ErrorHandler>::topojson_grammar()
| lit("null")[_val = construct<value_null>()]
;
- json_.unesc_char.add
- ("\\\"", '\"') // quotation mark
- ("\\\\", '\\') // reverse solidus
- ("\\/", '/') // solidus
- ("\\b", '\b') // backspace
- ("\\f", '\f') // formfeed
- ("\\n", '\n') // newline
- ("\\r", '\r') // carrige return
- ("\\t", '\t') // tab
- ;
-
- json_.string_ %= lit('"') >> no_skip[*(json_.unesc_char | "\\u" >> json_.hex4 | (char_ - lit('"')))] >> lit('"')
- ;
-
// topo json
topology = lit('{') >> lit("\"type\"") >> lit(':') >> lit("\"Topology\"")
>> ( (lit(',') >> objects) ^ ( lit(',') >> arcs) ^ (lit(',') >> transform) ^ (lit(',') >> bbox))
@@ -131,13 +113,15 @@ topojson_grammar<Iterator, ErrorHandler>::topojson_grammar()
;
geometry_collection = lit('{')
- >> lit("\"type\"") >> lit(':') >> lit("\"GeometryCollection\"") >> lit(',')
- >> lit("\"geometries\"") >> lit(':') >> lit('[') >> -(geometry[push_back(_r1, _1)] % lit(','))
+ >> lit("\"type\"") >> lit(':') >> lit("\"GeometryCollection\"")
+ >> -(lit(',') >> omit[bbox])
+ >> lit(',') >> lit("\"geometries\"") >> lit(':') >> lit('[') >> -(geometry[push_back(_r1, _1)] % lit(','))
>> lit(']')
>> lit('}')
;
point = lit('{')
>> lit("\"type\"") >> lit(':') >> lit("\"Point\"")
+ >> -(lit(',') >> omit[bbox])
>> ((lit(',') >> lit("\"coordinates\"") >> lit(':') >> coordinate)
^ (lit(',') >> properties) /*^ (lit(',') >> omit[id])*/)
>> lit('}')
@@ -145,6 +129,7 @@ topojson_grammar<Iterator, ErrorHandler>::topojson_grammar()
multi_point = lit('{')
>> lit("\"type\"") >> lit(':') >> lit("\"MultiPoint\"")
+ >> -(lit(',') >> omit[bbox])
>> ((lit(',') >> lit("\"coordinates\"") >> lit(':')
>> lit('[') >> -(coordinate % lit(',')) >> lit(']'))
^ (lit(',') >> properties) ^ (lit(',') >> omit[id]))
@@ -160,6 +145,7 @@ topojson_grammar<Iterator, ErrorHandler>::topojson_grammar()
multi_linestring = lit('{')
>> lit("\"type\"") >> lit(':') >> lit("\"MultiLineString\"")
+ >> -(lit(',') >> omit[bbox])
>> ((lit(',') >> lit("\"arcs\"") >> lit(':') >> lit('[')
>> -((lit('[') >> int_ >> lit(']')) % lit(',')) >> lit(']'))
^ (lit(',') >> properties) ^ (lit(',') >> omit[id]))
@@ -168,6 +154,7 @@ topojson_grammar<Iterator, ErrorHandler>::topojson_grammar()
polygon = lit('{')
>> lit("\"type\"") >> lit(':') >> lit("\"Polygon\"")
+ >> -(lit(',') >> omit[bbox])
>> ((lit(',') >> lit("\"arcs\"") >> lit(':')
>> lit('[') >> -(ring % lit(',')) >> lit(']'))
^ (lit(',') >> properties) ^ (lit(',') >> omit[id]))
@@ -176,6 +163,7 @@ topojson_grammar<Iterator, ErrorHandler>::topojson_grammar()
multi_polygon = lit('{')
>> lit("\"type\"") >> lit(':') >> lit("\"MultiPolygon\"")
+ >> -(lit(',') >> omit[bbox])
>> ((lit(',') >> lit("\"arcs\"") >> lit(':')
>> lit('[')
>> -((lit('[') >> -(ring % lit(',')) >> lit(']')) % lit(','))
diff --git a/include/mapnik/json/topojson_utils.hpp b/include/mapnik/json/topojson_utils.hpp
index e3d4a08..9055218 100644
--- a/include/mapnik/json/topojson_utils.hpp
+++ b/include/mapnik/json/topojson_utils.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,14 +26,14 @@
// mapnik
#include <mapnik/box2d.hpp>
#include <mapnik/json/topology.hpp>
-#include <mapnik/util/variant.hpp>
namespace mapnik { namespace topojson {
-struct bounding_box_visitor : public mapnik::util::static_visitor<box2d<double> >
+struct bounding_box_visitor
{
bounding_box_visitor(topology const& topo)
- : topo_(topo) {}
+ : topo_(topo),
+ num_arcs_(topo_.arcs.size()) {}
box2d<double> operator() (mapnik::topojson::point const& pt) const
{
@@ -50,113 +50,57 @@ struct bounding_box_visitor : public mapnik::util::static_visitor<box2d<double>
box2d<double> operator() (mapnik::topojson::multi_point const& multi_pt) const
{
box2d<double> bbox;
- bool first = true;
- for (auto const& pt : multi_pt.points)
+ if (num_arcs_ > 0)
{
- double x = pt.x;
- double y = pt.y;
- if (topo_.tr)
- {
- x = x * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
- y = y * (*topo_.tr).scale_y + (*topo_.tr).translate_y; // TODO : delta encoded ?
- }
- if (first)
- {
- first = false;
- bbox.init(x,y,x,y);
- }
- else
- {
- bbox.expand_to_include(x,y);
- }
- }
- return bbox;
- }
-
- box2d<double> operator() (mapnik::topojson::linestring const& line) const
- {
- box2d<double> bbox;
- bool first = true;
- double px = 0, py = 0;
- index_type arc_index = line.ring;
- for (auto pt : topo_.arcs[arc_index].coordinates)
- {
- double x = pt.x;
- double y = pt.y;
- if (topo_.tr)
- {
- x = (px += x) * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
- y = (py += y) * (*topo_.tr).scale_y + (*topo_.tr).translate_y;
- }
- if (first)
- {
- first = false;
- bbox.init(x, y, x, y);
- }
- else
- {
- bbox.expand_to_include(x, y);
- }
- }
- return bbox;
- }
-
- box2d<double> operator() (mapnik::topojson::multi_linestring const& multi_line) const
- {
- box2d<double> bbox;
- bool first = true;
- for (auto index : multi_line.rings)
- {
- double px = 0, py = 0;
- index_type arc_index = index < 0 ? std::abs(index) - 1 : index;
- for (auto pt : topo_.arcs[arc_index].coordinates)
+ bool first = true;
+ for (auto const& pt : multi_pt.points)
{
double x = pt.x;
double y = pt.y;
if (topo_.tr)
{
- x = (px += x) * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
- y = (py += y) * (*topo_.tr).scale_y + (*topo_.tr).translate_y;
+ x = x * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
+ y = y * (*topo_.tr).scale_y + (*topo_.tr).translate_y; // TODO : delta encoded ?
}
if (first)
{
first = false;
- bbox.init(x, y, x, y);
+ bbox.init(x,y,x,y);
}
else
{
- bbox.expand_to_include(x, y);
+ bbox.expand_to_include(x,y);
}
}
}
return bbox;
}
- box2d<double> operator() (mapnik::topojson::polygon const& poly) const
+ box2d<double> operator() (mapnik::topojson::linestring const& line) const
{
box2d<double> bbox;
- bool first = true;
- for (auto const& ring : poly.rings)
+ if (num_arcs_ > 0)
{
- for (auto index : ring)
+ index_type index = line.ring;
+ index_type arc_index = index < 0 ? std::abs(index) - 1 : index;
+ if (arc_index < num_arcs_)
{
+ bool first = true;
double px = 0, py = 0;
- index_type arc_index = index < 0 ? std::abs(index) - 1 : index;
- for (auto const& pt : topo_.arcs[arc_index].coordinates)
+ auto const& arcs = topo_.arcs[arc_index];
+ for (auto pt : arcs.coordinates)
{
double x = pt.x;
double y = pt.y;
-
if (topo_.tr)
{
x = (px += x) * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
y = (py += y) * (*topo_.tr).scale_y + (*topo_.tr).translate_y;
}
-
if (first)
{
first = false;
- bbox.init( x, y, x, y);
+ bbox.init(x, y, x, y);
}
else
{
@@ -168,33 +112,32 @@ struct bounding_box_visitor : public mapnik::util::static_visitor<box2d<double>
return bbox;
}
- box2d<double> operator() (mapnik::topojson::multi_polygon const& multi_poly) const
+ box2d<double> operator() (mapnik::topojson::multi_linestring const& multi_line) const
{
box2d<double> bbox;
- bool first = true;
- for (auto const& poly : multi_poly.polygons)
+ if (num_arcs_ > 0)
{
- for (auto const& ring : poly)
+ bool first = true;
+ for (auto index : multi_line.rings)
{
- for (auto index : ring)
+ index_type arc_index = index < 0 ? std::abs(index) - 1 : index;
+ if (arc_index < num_arcs_)
{
double px = 0, py = 0;
- index_type arc_index = index < 0 ? std::abs(index) - 1 : index;
- for (auto const& pt : topo_.arcs[arc_index].coordinates)
+ auto const& arcs = topo_.arcs[arc_index];
+ for (auto pt : arcs.coordinates)
{
double x = pt.x;
double y = pt.y;
-
if (topo_.tr)
{
x = (px += x) * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
y = (py += y) * (*topo_.tr).scale_y + (*topo_.tr).translate_y;
}
-
if (first)
{
first = false;
- bbox.init( x, y, x, y);
+ bbox.init(x, y, x, y);
}
else
{
@@ -207,14 +150,103 @@ struct bounding_box_visitor : public mapnik::util::static_visitor<box2d<double>
return bbox;
}
- template<typename T>
- box2d<double> operator() (T const& ) const
+ box2d<double> operator() (mapnik::topojson::polygon const& poly) const
+ {
+ box2d<double> bbox;
+ if (num_arcs_ > 0)
+ {
+ bool first = true;
+ for (auto const& ring : poly.rings)
+ {
+ for (auto index : ring)
+ {
+ index_type arc_index = index < 0 ? std::abs(index) - 1 : index;
+ if (arc_index < num_arcs_)
+ {
+ double px = 0, py = 0;
+ auto const& arcs = topo_.arcs[arc_index];
+ for (auto const& pt : arcs.coordinates)
+ {
+ double x = pt.x;
+ double y = pt.y;
+
+ if (topo_.tr)
+ {
+ x = (px += x) * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
+ y = (py += y) * (*topo_.tr).scale_y + (*topo_.tr).translate_y;
+ }
+
+ if (first)
+ {
+ first = false;
+ bbox.init( x, y, x, y);
+ }
+ else
+ {
+ bbox.expand_to_include(x, y);
+ }
+ }
+ }
+ }
+ }
+ }
+ return bbox;
+ }
+
+ box2d<double> operator() (mapnik::topojson::multi_polygon const& multi_poly) const
+ {
+ box2d<double> bbox;
+ if (num_arcs_ > 0)
+ {
+ bool first = true;
+ for (auto const& poly : multi_poly.polygons)
+ {
+ for (auto const& ring : poly)
+ {
+ for (auto index : ring)
+ {
+ index_type arc_index = index < 0 ? std::abs(index) - 1 : index;
+ if (arc_index < num_arcs_)
+ {
+ double px = 0, py = 0;
+ auto const& arcs = topo_.arcs[arc_index];
+ for (auto const& pt : arcs.coordinates)
+ {
+ double x = pt.x;
+ double y = pt.y;
+
+ if (topo_.tr)
+ {
+ x = (px += x) * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
+ y = (py += y) * (*topo_.tr).scale_y + (*topo_.tr).translate_y;
+ }
+
+ if (first)
+ {
+ first = false;
+ bbox.init( x, y, x, y);
+ }
+ else
+ {
+ bbox.expand_to_include(x, y);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return bbox;
+ }
+
+ box2d<double> operator() (mapnik::topojson::invalid const&) const
{
return box2d<double>();
}
private:
topology const& topo_;
+ std::size_t num_arcs_;
};
}}
diff --git a/include/mapnik/json/topology.hpp b/include/mapnik/json/topology.hpp
index ad31697..12e0f9a 100644
--- a/include/mapnik/json/topology.hpp
+++ b/include/mapnik/json/topology.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,17 +23,17 @@
#ifndef MAPNIK_TOPOLOGY_HPP
#define MAPNIK_TOPOLOGY_HPP
-#include <vector>
-#include <list>
-
#include <mapnik/json/generic_json.hpp>
-#include <mapnik/feature.hpp>
#include <mapnik/util/variant.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/adapted/std_tuple.hpp>
#include <boost/optional.hpp>
+#include <tuple>
+#include <vector>
+#include <list>
+
namespace mapnik { namespace topojson {
using index_type = int;
diff --git a/include/mapnik/label_collision_detector.hpp b/include/mapnik/label_collision_detector.hpp
index 585be4f..a33747b 100644
--- a/include/mapnik/label_collision_detector.hpp
+++ b/include/mapnik/label_collision_detector.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,7 @@
// mapnik
#include <mapnik/quad_tree.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/value_types.hpp>
// icu
@@ -63,7 +63,7 @@ private:
};
// quad_tree based label collision detector
-class label_collision_detector2 : mapnik::noncopyable
+class label_collision_detector2 : util::noncopyable
{
using tree_t = quad_tree<box2d<double> >;
tree_t tree_;
@@ -92,7 +92,7 @@ public:
};
// quad_tree based label collision detector with seperate check/insert
-class label_collision_detector3 : mapnik::noncopyable
+class label_collision_detector3 : util::noncopyable
{
using tree_t = quad_tree< box2d<double> >;
tree_t tree_;
@@ -126,7 +126,7 @@ public:
//quad tree based label collision detector so labels dont appear within a given distance
-class label_collision_detector4 : mapnik::noncopyable
+class label_collision_detector4 : util::noncopyable
{
public:
struct label
diff --git a/include/mapnik/layer.hpp b/include/mapnik/layer.hpp
index 9ce8ff7..4b4e9f8 100644
--- a/include/mapnik/layer.hpp
+++ b/include/mapnik/layer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -97,24 +97,24 @@ public:
std::vector<std::string>& styles();
/*!
- * @param min_zoom The minimum zoom level to set
+ * @param minimum_scale_denom The minimum scale denominator
*/
- void set_min_zoom(double min_zoom);
+ void set_minimum_scale_denominator(double minimum_scale_denom);
/*!
- * @param max_zoom The maximum zoom level to set
+ * @param maximum_scale_denom The maximum scale denominator
*/
- void set_max_zoom(double max_zoom);
+ void set_maximum_scale_denominator(double maximum_scale_denom);
/*!
* @return the minimum zoom level of the layer.
*/
- double min_zoom() const;
+ double minimum_scale_denominator() const;
/*!
* @return the maximum zoom level of the layer.
*/
- double max_zoom() const;
+ double maximum_scale_denominator() const;
/*!
* @brief Set whether this layer is active and will be rendered.
@@ -137,18 +137,18 @@ public:
bool queryable() const;
/*!
- * @brief Get the visability for a specific scale.
+ * @brief Get the visibility for a specific scale denominator.
*
- * @param scale Accepts an integer or float input.
+ * @param scale_denom Accepts an integer or float input.
*
- * @return true if this layer's data is active and visible at a given scale.
+ * @return true if this layer's data is active and visible at a given scale denominator.
* Otherwise returns False.
* false if:
- * scale >= minzoom - 1e-6
+ * scale_denominator >= minimum_scale_denominator - 1e-6
* or
- * scale < maxzoom + 1e-6
+ * scale_denominator < maximum_scale_denominator + 1e-6
*/
- bool visible(double scale) const;
+ bool visible(double scale_denom) const;
/*!
* @param clear_cache Set whether this layer's labels are cached.
@@ -207,8 +207,8 @@ public:
private:
std::string name_;
std::string srs_;
- double min_zoom_;
- double max_zoom_;
+ double minimum_scale_denom_;
+ double maximum_scale_denom_;
bool active_;
bool queryable_;
bool clear_label_cache_;
diff --git a/include/mapnik/load_map.hpp b/include/mapnik/load_map.hpp
index 1ef69fb..5696a9e 100644
--- a/include/mapnik/load_map.hpp
+++ b/include/mapnik/load_map.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/map.hpp b/include/mapnik/map.hpp
index 815d6a8..ee1c7a3 100644
--- a/include/mapnik/map.hpp
+++ b/include/mapnik/map.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -231,7 +231,7 @@ public:
/*! \brief register fonts.
*/
- bool register_fonts(std::string const& dir, bool recurse);
+ bool register_fonts(std::string const& dir, bool recurse = false);
/*! \brief cache registered fonts.
*/
diff --git a/include/mapnik/mapped_memory_cache.hpp b/include/mapnik/mapped_memory_cache.hpp
index c1f9c50..3673c15 100644
--- a/include/mapnik/mapped_memory_cache.hpp
+++ b/include/mapnik/mapped_memory_cache.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,7 +26,7 @@
// mapnik
#include <mapnik/config.hpp>
#include <mapnik/utils.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// boost
#include <memory>
@@ -42,7 +42,7 @@ using mapped_region_ptr = std::shared_ptr<boost::interprocess::mapped_region>;
class MAPNIK_DECL mapped_memory_cache :
public singleton<mapped_memory_cache, CreateStatic>,
- private mapnik::noncopyable
+ private util::noncopyable
{
friend class CreateStatic<mapped_memory_cache>;
std::unordered_map<std::string,mapped_region_ptr> cache_;
diff --git a/include/mapnik/marker.hpp b/include/mapnik/marker.hpp
index 9f008ff..3eaaebe 100644
--- a/include/mapnik/marker.hpp
+++ b/include/mapnik/marker.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,118 +24,190 @@
#define MAPNIK_MARKER_HPP
// mapnik
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
#include <mapnik/svg/svg_storage.hpp>
-#include <mapnik/svg/svg_path_attributes.hpp>
#include <mapnik/svg/svg_path_adapter.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/variant.hpp>
// agg
#include "agg_array.h"
-// boost
-#include <boost/optional.hpp>
-
// stl
#include <memory>
namespace mapnik
{
+struct image_any;
+namespace svg { struct path_attributes; }
+
using attr_storage = agg::pod_bvector<mapnik::svg::path_attributes>;
using svg_storage_type = mapnik::svg::svg_storage<mapnik::svg::svg_path_storage,attr_storage>;
using svg_path_ptr = std::shared_ptr<svg_storage_type>;
-using image_ptr = std::shared_ptr<image_data_32>;
-/**
- * A class to hold either vector or bitmap marker data. This allows these to be treated equally
- * in the image caches and most of the render paths.
- */
-class marker: private mapnik::noncopyable
+using image_ptr = std::shared_ptr<image_any>;
+
+struct marker_rgba8
{
public:
- marker()
+ marker_rgba8()
+ : bitmap_data_(4,4,true,true)
{
// create default OGC 4x4 black pixel
- bitmap_data_ = boost::optional<mapnik::image_ptr>(std::make_shared<image_data_32>(4,4));
- (*bitmap_data_)->set(0xff000000);
+ bitmap_data_.set(0xff000000);
}
- marker(boost::optional<mapnik::image_ptr> const& data)
+ marker_rgba8(image_rgba8 const & data)
: bitmap_data_(data) {}
+
+ marker_rgba8(image_rgba8 && data)
+ : bitmap_data_(std::move(data)) {}
+
+ marker_rgba8(marker_rgba8 const& rhs)
+ : bitmap_data_(rhs.bitmap_data_) {}
+
+ marker_rgba8(marker_rgba8 && rhs) noexcept
+ : bitmap_data_(std::move(rhs.bitmap_data_)) {}
+
+ box2d<double> bounding_box() const
+ {
+ double width = bitmap_data_.width();
+ double height = bitmap_data_.height();
+ return box2d<double>(0, 0, width, height);
+ }
+
+ inline std::size_t width() const
+ {
+ return bitmap_data_.width();
+ }
+
+ inline std::size_t height() const
+ {
+ return bitmap_data_.height();
+ }
+
+ image_rgba8 const& get_data() const
+ {
+ return bitmap_data_;
+ }
+
+private:
+ image_rgba8 bitmap_data_;
+};
- marker(boost::optional<mapnik::svg_path_ptr> const& data)
+struct marker_svg
+{
+public:
+ marker_svg() { }
+
+ marker_svg(mapnik::svg_path_ptr data)
: vector_data_(data) {}
- marker(marker const& rhs)
- : bitmap_data_(rhs.bitmap_data_),
- vector_data_(rhs.vector_data_) {}
+ marker_svg(marker_svg const& rhs)
+ : vector_data_(rhs.vector_data_) {}
+
+ marker_svg(marker_svg && rhs) noexcept
+ : vector_data_(rhs.vector_data_) {}
box2d<double> bounding_box() const
{
- if (is_vector())
- {
- return (*vector_data_)->bounding_box();
- }
- if (is_bitmap())
- {
- double width = (*bitmap_data_)->width();
- double height = (*bitmap_data_)->height();
- return box2d<double>(0, 0, width, height);
- }
- return box2d<double>();
+ return vector_data_->bounding_box();
+ }
+
+ inline double width() const
+ {
+ return vector_data_->bounding_box().width();
+ }
+ inline double height() const
+ {
+ return vector_data_->bounding_box().height();
}
+ mapnik::svg_path_ptr get_data() const
+ {
+ return vector_data_;
+ }
+
+private:
+ mapnik::svg_path_ptr vector_data_;
+
+};
+
+struct marker_null
+{
+ marker_null() = default;
+public:
+ box2d<double> bounding_box() const
+ {
+ return box2d<double>();
+ }
inline double width() const
{
- if (is_bitmap())
- {
- return (*bitmap_data_)->width();
- }
- else if (is_vector())
- {
- return (*vector_data_)->bounding_box().width();
- }
return 0;
}
inline double height() const
{
- if (is_bitmap())
- {
- return (*bitmap_data_)->height();
- }
- else if (is_vector())
- {
- return (*vector_data_)->bounding_box().height();
- }
return 0;
}
+};
- inline bool is_bitmap() const
+using marker_base = util::variant<marker_null,
+ marker_rgba8,
+ marker_svg>;
+namespace detail {
+
+struct get_marker_bbox_visitor
+{
+ template <typename T>
+ box2d<double> operator()(T & data) const
{
- return !!bitmap_data_;
+ return data.bounding_box();
}
+};
- inline bool is_vector() const
+struct get_marker_width_visitor
+{
+ template <typename T>
+ double operator()(T const& data) const
{
- return !!vector_data_;
+ return static_cast<double>(data.width());
}
+};
- boost::optional<mapnik::image_ptr> get_bitmap_data() const
+struct get_marker_height_visitor
+{
+ template <typename T>
+ double operator()(T const& data) const
{
- return bitmap_data_;
+ return static_cast<double>(data.height());
}
+};
+
+} // end detail ns
+
+struct marker : marker_base
+{
+ marker() = default;
- boost::optional<mapnik::svg_path_ptr> get_vector_data() const
+ template <typename T>
+ marker(T && data) noexcept
+ : marker_base(std::move(data)) {}
+
+ double width() const
{
- return vector_data_;
+ return util::apply_visitor(detail::get_marker_width_visitor(),*this);
}
-private:
- boost::optional<mapnik::image_ptr> bitmap_data_;
- boost::optional<mapnik::svg_path_ptr> vector_data_;
+ double height() const
+ {
+ return util::apply_visitor(detail::get_marker_height_visitor(),*this);
+ }
+ box2d<double> bounding_box() const
+ {
+ return util::apply_visitor(detail::get_marker_bbox_visitor(),*this);
+ }
};
-}
+} // end mapnik ns
#endif // MAPNIK_MARKER_HPP
diff --git a/include/mapnik/marker_cache.hpp b/include/mapnik/marker_cache.hpp
index 6210deb..d685cc9 100644
--- a/include/mapnik/marker_cache.hpp
+++ b/include/mapnik/marker_cache.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,31 +26,27 @@
// mapnik
#include <mapnik/utils.hpp>
#include <mapnik/config.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// boost
#include <boost/unordered_map.hpp>
#include <memory>
-#include <boost/optional.hpp>
namespace mapnik
{
-class marker;
-
-using marker_ptr = std::shared_ptr<marker>;
-
+struct marker;
class MAPNIK_DECL marker_cache :
public singleton <marker_cache, CreateUsingNew>,
- private mapnik::noncopyable
+ private util::noncopyable
{
friend class CreateUsingNew<marker_cache>;
private:
marker_cache();
~marker_cache();
- bool insert_marker(std::string const& key, marker_ptr path);
- boost::unordered_map<std::string,marker_ptr> marker_cache_;
+ bool insert_marker(std::string const& key, marker && path);
+ boost::unordered_map<std::string, std::shared_ptr<mapnik::marker const> > marker_cache_;
bool insert_svg(std::string const& name, std::string const& svg_string);
boost::unordered_map<std::string,std::string> svg_cache_;
public:
@@ -59,7 +55,7 @@ public:
inline bool is_uri(std::string const& path) { return is_svg_uri(path) || is_image_uri(path); }
bool is_svg_uri(std::string const& path);
bool is_image_uri(std::string const& path);
- boost::optional<marker_ptr> find(std::string const& key, bool update_cache = false);
+ std::shared_ptr<marker const> find(std::string const& key, bool update_cache = false);
void clear();
};
diff --git a/include/mapnik/marker_helpers.hpp b/include/mapnik/marker_helpers.hpp
index ed6eca1..15dca62 100644
--- a/include/mapnik/marker_helpers.hpp
+++ b/include/mapnik/marker_helpers.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,94 +23,58 @@
#ifndef MAPNIK_MARKER_HELPERS_HPP
#define MAPNIK_MARKER_HELPERS_HPP
-#include <mapnik/color.hpp>
#include <mapnik/feature.hpp>
+#include <mapnik/color.hpp>
#include <mapnik/geometry.hpp>
-#include <mapnik/geom_util.hpp>
+#include <mapnik/geometry_type.hpp>
+#include <mapnik/geometry_centroid.hpp>
#include <mapnik/symbolizer.hpp>
-#include <mapnik/expression_node.hpp>
-#include <mapnik/expression_evaluator.hpp>
-#include <mapnik/svg/svg_path_attributes.hpp>
#include <mapnik/svg/svg_converter.hpp>
#include <mapnik/marker.hpp> // for svg_storage_type
#include <mapnik/markers_placement.hpp>
#include <mapnik/attribute.hpp>
#include <mapnik/box2d.hpp>
-#include <mapnik/vertex_converters.hpp>
-#include <mapnik/label_collision_detector.hpp>
+#include <mapnik/vertex_processor.hpp>
+#include <mapnik/renderer_common/apply_vertex_converter.hpp>
// agg
-#include "agg_ellipse.h"
-#include "agg_color_rgba.h"
-#include "agg_renderer_base.h"
-#include "agg_renderer_scanline.h"
-#include "agg_rendering_buffer.h"
-#include "agg_scanline_u.h"
-#include "agg_image_filters.h"
#include "agg_trans_affine.h"
-#include "agg_span_allocator.h"
-#include "agg_image_accessors.h"
-#include "agg_pixfmt_rgba.h"
-#include "agg_span_image_filter_rgba.h"
-#include "agg_span_interpolator_linear.h"
-
-// boost
-#include <boost/optional.hpp>
// stl
#include <memory>
-#include <type_traits> // remove_reference
-#include <cmath>
namespace mapnik {
struct clip_poly_tag;
+namespace svg { struct path_attributes; }
+
using svg_attribute_type = agg::pod_bvector<svg::path_attributes>;
-template <typename SvgRenderer, typename Detector, typename RendererContext>
-struct vector_markers_rasterizer_dispatch : mapnik::noncopyable
+template <typename Detector>
+struct vector_markers_dispatch : util::noncopyable
{
- using renderer_base = typename SvgRenderer::renderer_base ;
- using vertex_source_type = typename SvgRenderer::vertex_source_type ;
- using attribute_source_type = typename SvgRenderer::attribute_source_type;
- using pixfmt_type = typename renderer_base::pixfmt_type ;
-
- using BufferType = typename std::tuple_element<0,RendererContext>::type;
- using RasterizerType = typename std::tuple_element<1,RendererContext>::type;
+ vector_markers_dispatch(svg_path_ptr const& src,
+ agg::trans_affine const& marker_trans,
+ symbolizer_base const& sym,
+ Detector & detector,
+ double scale_factor,
+ feature_impl const& feature,
+ attributes const& vars)
+ : src_(src),
+ marker_trans_(marker_trans),
+ sym_(sym),
+ detector_(detector),
+ feature_(feature),
+ vars_(vars),
+ scale_factor_(scale_factor)
+ {}
- vector_markers_rasterizer_dispatch(vertex_source_type & path,
- attribute_source_type const& attrs,
- box2d<double> const& bbox,
- agg::trans_affine const& marker_trans,
- symbolizer_base const& sym,
- Detector & detector,
- double scale_factor,
- feature_impl & feature,
- attributes const& vars,
- bool snap_to_pixels,
- RendererContext const& renderer_context)
- : buf_(std::get<0>(renderer_context)),
- pixf_(buf_),
- renb_(pixf_),
- svg_renderer_(path, attrs),
- ras_(std::get<1>(renderer_context)),
- bbox_(bbox),
- marker_trans_(marker_trans),
- sym_(sym),
- detector_(detector),
- feature_(feature),
- vars_(vars),
- scale_factor_(scale_factor),
- snap_to_pixels_(snap_to_pixels)
- {
- pixf_.comp_op(static_cast<agg::comp_op_e>(get<composite_mode_e, keys::comp_op>(sym,feature_, vars_)));
- }
+ virtual ~vector_markers_dispatch() {}
template <typename T>
void add_path(T & path)
{
- agg::scanline_u8 sl_;
marker_placement_enum placement_method = get<marker_placement_enum, keys::markers_placement_type>(sym_, feature_, vars_);
value_bool ignore_placement = get<value_bool, keys::ignore_placement>(sym_, feature_, vars_);
value_bool allow_overlap = get<value_bool, keys::allow_overlap>(sym_, feature_, vars_);
@@ -118,10 +82,11 @@ struct vector_markers_rasterizer_dispatch : mapnik::noncopyable
value_double opacity = get<value_double,keys::opacity>(sym_, feature_, vars_);
value_double spacing = get<value_double, keys::spacing>(sym_, feature_, vars_);
value_double max_error = get<value_double, keys::max_error>(sym_, feature_, vars_);
- coord2d center = bbox_.center();
+ coord2d center = src_->bounding_box().center();
agg::trans_affine_translation recenter(-center.x, -center.y);
agg::trans_affine tr = recenter * marker_trans_;
- markers_placement_params params { bbox_, tr, spacing * scale_factor_, max_error, allow_overlap, avoid_edges };
+ direction_enum direction = get<direction_enum, keys::direction>(sym_, feature_, vars_);
+ markers_placement_params params { src_->bounding_box(), tr, spacing * scale_factor_, max_error, allow_overlap, avoid_edges, direction };
markers_placement_finder<T, Detector> placement_finder(
placement_method, path, detector_, params);
double x, y, angle = .0;
@@ -130,69 +95,42 @@ struct vector_markers_rasterizer_dispatch : mapnik::noncopyable
agg::trans_affine matrix = tr;
matrix.rotate(angle);
matrix.translate(x, y);
- if (snap_to_pixels_)
- {
- // https://github.com/mapnik/mapnik/issues/1316
- matrix.tx = std::floor(matrix.tx + .5);
- matrix.ty = std::floor(matrix.ty + .5);
- }
- svg_renderer_.render(ras_, sl_, renb_, matrix, opacity, bbox_);
+ render_marker(matrix, opacity);
}
}
-private:
- BufferType & buf_;
- pixfmt_type pixf_;
- renderer_base renb_;
- SvgRenderer svg_renderer_;
- RasterizerType & ras_;
- box2d<double> const& bbox_;
+ virtual void render_marker(agg::trans_affine const& marker_tr, double opacity) = 0;
+
+protected:
+ svg_path_ptr const& src_;
agg::trans_affine const& marker_trans_;
symbolizer_base const& sym_;
Detector & detector_;
- feature_impl & feature_;
+ feature_impl const& feature_;
attributes const& vars_;
double scale_factor_;
- bool snap_to_pixels_;
};
-template <typename Detector,typename RendererContext>
-struct raster_markers_rasterizer_dispatch : mapnik::noncopyable
+template <typename Detector>
+struct raster_markers_dispatch : util::noncopyable
{
- using BufferType = typename std::remove_reference<typename std::tuple_element<0,RendererContext>::type>::type;
- using RasterizerType = typename std::tuple_element<1,RendererContext>::type;
-
- using color_type = agg::rgba8;
- using order_type = agg::order_rgba;
- using pixel_type = agg::pixel32_type;
- using blender_type = agg::comp_op_adaptor_rgba_pre<color_type, order_type>; // comp blender
- using pixfmt_comp_type = agg::pixfmt_custom_blend_rgba<blender_type, BufferType>;
- using renderer_base = agg::renderer_base<pixfmt_comp_type>;
-
- raster_markers_rasterizer_dispatch(image_data_32 const& src,
- agg::trans_affine const& marker_trans,
- symbolizer_base const& sym,
- Detector & detector,
- double scale_factor,
- feature_impl & feature,
- attributes const& vars,
- RendererContext const& renderer_context,
- bool snap_to_pixels = false)
- : buf_(std::get<0>(renderer_context)),
- pixf_(buf_),
- renb_(pixf_),
- ras_(std::get<1>(renderer_context)),
- src_(src),
+ raster_markers_dispatch(image_rgba8 const& src,
+ agg::trans_affine const& marker_trans,
+ symbolizer_base const& sym,
+ Detector & detector,
+ double scale_factor,
+ feature_impl const& feature,
+ attributes const& vars)
+ : src_(src),
marker_trans_(marker_trans),
sym_(sym),
detector_(detector),
feature_(feature),
vars_(vars),
- scale_factor_(scale_factor),
- snap_to_pixels_(snap_to_pixels)
- {
- pixf_.comp_op(static_cast<agg::comp_op_e>(get<composite_mode_e, keys::comp_op>(sym, feature_, vars_)));
- }
+ scale_factor_(scale_factor)
+ {}
+
+ virtual ~raster_markers_dispatch() {}
template <typename T>
void add_path(T & path)
@@ -200,13 +138,14 @@ struct raster_markers_rasterizer_dispatch : mapnik::noncopyable
marker_placement_enum placement_method = get<marker_placement_enum, keys::markers_placement_type>(sym_, feature_, vars_);
value_bool allow_overlap = get<value_bool, keys::allow_overlap>(sym_, feature_, vars_);
value_bool avoid_edges = get<value_bool, keys::avoid_edges>(sym_, feature_, vars_);
- box2d<double> bbox_(0,0, src_.width(),src_.height());
value_double opacity = get<value_double, keys::opacity>(sym_, feature_, vars_);
value_bool ignore_placement = get<value_bool, keys::ignore_placement>(sym_, feature_, vars_);
value_double spacing = get<value_double, keys::spacing>(sym_, feature_, vars_);
value_double max_error = get<value_double, keys::max_error>(sym_, feature_, vars_);
- markers_placement_params params { bbox_, marker_trans_, spacing * scale_factor_, max_error, allow_overlap, avoid_edges };
- markers_placement_finder<T, label_collision_detector4> placement_finder(
+ box2d<double> bbox(0,0, src_.width(),src_.height());
+ direction_enum direction = get<direction_enum, keys::direction>(sym_, feature_, vars_);
+ markers_placement_params params { bbox, marker_trans_, spacing * scale_factor_, max_error, allow_overlap, avoid_edges, direction };
+ markers_placement_finder<T, Detector> placement_finder(
placement_method, path, detector_, params);
double x, y, angle = .0;
while (placement_finder.get_point(x, y, angle, ignore_placement))
@@ -214,104 +153,24 @@ struct raster_markers_rasterizer_dispatch : mapnik::noncopyable
agg::trans_affine matrix = marker_trans_;
matrix.rotate(angle);
matrix.translate(x, y);
- render_raster_marker(matrix, opacity);
+ render_marker(matrix, opacity);
}
}
- void render_raster_marker(agg::trans_affine const& marker_tr,
- double opacity)
- {
- using pixfmt_pre = agg::pixfmt_rgba32_pre;
- agg::scanline_u8 sl_;
- double width = src_.width();
- double height = src_.height();
- if (std::fabs(1.0 - scale_factor_) < 0.001
- && (std::fabs(1.0 - marker_tr.sx) < agg::affine_epsilon)
- && (std::fabs(0.0 - marker_tr.shy) < agg::affine_epsilon)
- && (std::fabs(0.0 - marker_tr.shx) < agg::affine_epsilon)
- && (std::fabs(1.0 - marker_tr.sy) < agg::affine_epsilon))
- {
- agg::rendering_buffer src_buffer((unsigned char *)src_.getBytes(),src_.width(),src_.height(),src_.width() * 4);
- pixfmt_pre pixf_mask(src_buffer);
- if (snap_to_pixels_)
- {
- renb_.blend_from(pixf_mask,
- 0,
- std::floor(marker_tr.tx + .5),
- std::floor(marker_tr.ty + .5),
- unsigned(255*opacity));
- }
- else
- {
- renb_.blend_from(pixf_mask,
- 0,
- marker_tr.tx,
- marker_tr.ty,
- unsigned(255*opacity));
- }
- }
- else
- {
- using img_accessor_type = agg::image_accessor_clone<pixfmt_pre>;
- using interpolator_type = agg::span_interpolator_linear<>;
- //using span_gen_type = agg::span_image_filter_rgba_2x2<img_accessor_type,interpolator_type>;
- using span_gen_type = agg::span_image_resample_rgba_affine<img_accessor_type>;
- using renderer_type = agg::renderer_scanline_aa_alpha<renderer_base,
- agg::span_allocator<color_type>,
- span_gen_type>;
-
- double p[8];
- p[0] = 0; p[1] = 0;
- p[2] = width; p[3] = 0;
- p[4] = width; p[5] = height;
- p[6] = 0; p[7] = height;
- marker_tr.transform(&p[0], &p[1]);
- marker_tr.transform(&p[2], &p[3]);
- marker_tr.transform(&p[4], &p[5]);
- marker_tr.transform(&p[6], &p[7]);
- agg::span_allocator<color_type> sa;
- agg::image_filter_lut filter;
- filter.calculate(agg::image_filter_bilinear(), true);
- agg::rendering_buffer marker_buf((unsigned char *)src_.getBytes(),
- src_.width(),
- src_.height(),
- src_.width()*4);
- pixfmt_pre pixf(marker_buf);
- img_accessor_type ia(pixf);
- agg::trans_affine final_tr(p, 0, 0, width, height);
- if (snap_to_pixels_)
- {
- final_tr.tx = std::floor(final_tr.tx+.5);
- final_tr.ty = std::floor(final_tr.ty+.5);
- }
- interpolator_type interpolator(final_tr);
- span_gen_type sg(ia, interpolator, filter);
- renderer_type rp(renb_,sa, sg, unsigned(opacity*255));
- ras_.move_to_d(p[0],p[1]);
- ras_.line_to_d(p[2],p[3]);
- ras_.line_to_d(p[4],p[5]);
- ras_.line_to_d(p[6],p[7]);
- agg::render_scanlines(ras_, sl_, rp);
- }
- }
+ virtual void render_marker(agg::trans_affine const& marker_tr, double opacity) = 0;
-private:
- BufferType & buf_;
- pixfmt_comp_type pixf_;
- renderer_base renb_;
- RasterizerType & ras_;
- image_data_32 const& src_;
+protected:
+ image_rgba8 const& src_;
agg::trans_affine const& marker_trans_;
symbolizer_base const& sym_;
Detector & detector_;
- feature_impl & feature_;
+ feature_impl const& feature_;
attributes const& vars_;
double scale_factor_;
- bool snap_to_pixels_;
};
-
-void build_ellipse(symbolizer_base const& sym, mapnik::feature_impl & feature, attributes const& vars, svg_storage_type & marker_ellipse, svg::svg_path_adapter & svg_path);
+void build_ellipse(symbolizer_base const& sym, mapnik::feature_impl & feature, attributes const& vars,
+ svg_storage_type & marker_ellipse, svg::svg_path_adapter & svg_path);
bool push_explicit_style(svg_attribute_type const& src,
svg_attribute_type & dst,
@@ -327,30 +186,40 @@ void setup_transform_scaling(agg::trans_affine & tr,
symbolizer_base const& sym);
// Apply markers to a feature with multiple geometries
-template <typename Converter>
-void apply_markers_multi(feature_impl const& feature, attributes const& vars, Converter & converter, symbolizer_base const& sym)
+template <typename Converter, typename Processor>
+void apply_markers_multi(feature_impl const& feature, attributes const& vars, Converter & converter, Processor & proc, symbolizer_base const& sym)
{
- std::size_t geom_count = feature.paths().size();
- if (geom_count == 1)
+ using vertex_converter_type = Converter;
+ using apply_vertex_converter_type = detail::apply_vertex_converter<vertex_converter_type,Processor>;
+ using vertex_processor_type = geometry::vertex_processor<apply_vertex_converter_type>;
+
+ auto const& geom = feature.get_geometry();
+ geometry::geometry_types type = geometry::geometry_type(geom);
+
+ if (type == geometry::geometry_types::Point
+ || type == geometry::geometry_types::LineString
+ || type == geometry::geometry_types::Polygon)
{
- converter.apply(const_cast<geometry_type&>(feature.paths()[0]));
+ apply_vertex_converter_type apply(converter, proc);
+ mapnik::util::apply_visitor(vertex_processor_type(apply), geom);
}
- else if (geom_count > 1)
+ else
{
+
marker_multi_policy_enum multi_policy = get<marker_multi_policy_enum, keys::markers_multipolicy>(sym, feature, vars);
marker_placement_enum placement = get<marker_placement_enum, keys::markers_placement_type>(sym, feature, vars);
if (placement == MARKER_POINT_PLACEMENT &&
multi_policy == MARKER_WHOLE_MULTI)
{
- double x, y;
- if (label::centroid_geoms(feature.paths().begin(), feature.paths().end(), x, y))
+ geometry::point<double> pt;
+ // test if centroid is contained by bounding box
+ if (geometry::centroid(geom, pt) && converter.disp_.args_.bbox.contains(pt.x, pt.y))
{
- geometry_type pt(geometry_type::types::Point);
- pt.move_to(x, y);
// unset any clipping since we're now dealing with a point
converter.template unset<clip_poly_tag>();
- converter.apply(pt);
+ geometry::point_vertex_adapter<double> va(pt);
+ converter.apply(va, proc);
}
}
else if ((placement == MARKER_POINT_PLACEMENT || placement == MARKER_INTERIOR_PLACEMENT) &&
@@ -358,21 +227,31 @@ void apply_markers_multi(feature_impl const& feature, attributes const& vars, Co
{
// Only apply to path with largest envelope area
// TODO: consider using true area for polygon types
- double maxarea = 0;
- geometry_type const* largest = 0;
- for (geometry_type const& geom : feature.paths())
+ if (type == geometry::geometry_types::MultiPolygon)
{
- const box2d<double>& env = geom.envelope();
- double area = env.width() * env.height();
- if (area > maxarea)
+ geometry::multi_polygon<double> const& multi_poly = mapnik::util::get<geometry::multi_polygon<double> >(geom);
+ double maxarea = 0;
+ geometry::polygon<double> const* largest = 0;
+ for (geometry::polygon<double> const& poly : multi_poly)
{
- maxarea = area;
- largest = &geom;
+ box2d<double> bbox = geometry::envelope(poly);
+ geometry::polygon_vertex_adapter<double> va(poly);
+ double area = bbox.width() * bbox.height();
+ if (area > maxarea)
+ {
+ maxarea = area;
+ largest = &poly;
+ }
+ }
+ if (largest)
+ {
+ geometry::polygon_vertex_adapter<double> va(*largest);
+ converter.apply(va, proc);
}
}
- if (largest)
+ else
{
- converter.apply(const_cast<geometry_type&>(*largest));
+ MAPNIK_LOG_WARN(marker_symbolizer) << "TODO: if you get here -> open an issue";
}
}
else
@@ -381,10 +260,8 @@ void apply_markers_multi(feature_impl const& feature, attributes const& vars, Co
{
MAPNIK_LOG_WARN(marker_symbolizer) << "marker_multi_policy != 'each' has no effect with marker_placement != 'point'";
}
- for (geometry_type const& path : feature.paths())
- {
- converter.apply(const_cast<geometry_type&>(path));
- }
+ apply_vertex_converter_type apply(converter, proc);
+ mapnik::util::apply_visitor(vertex_processor_type(apply), geom);
}
}
}
diff --git a/include/mapnik/markers_placement.hpp b/include/mapnik/markers_placement.hpp
index 88e20b5..1472e6e 100644
--- a/include/mapnik/markers_placement.hpp
+++ b/include/mapnik/markers_placement.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -35,7 +35,7 @@ namespace mapnik
{
template <typename Locator, typename Detector>
-class markers_placement_finder : mapnik::noncopyable
+class markers_placement_finder : util::noncopyable
{
public:
using markers_placement = util::variant<markers_point_placement<Locator, Detector>,
@@ -44,7 +44,7 @@ public:
markers_vertex_first_placement<Locator, Detector>,
markers_vertex_last_placement<Locator, Detector>>;
- class get_point_visitor : public util::static_visitor<bool>
+ class get_point_visitor
{
public:
get_point_visitor(double &x, double &y, double &angle, bool ignore_placement)
diff --git a/include/mapnik/markers_placements/interior.hpp b/include/mapnik/markers_placements/interior.hpp
index 6d36c44..9fbc14c 100644
--- a/include/mapnik/markers_placements/interior.hpp
+++ b/include/mapnik/markers_placements/interior.hpp
@@ -25,6 +25,7 @@
#include <mapnik/markers_placements/point.hpp>
#include <mapnik/geom_util.hpp>
+#include <mapnik/geometry_types.hpp>
namespace mapnik {
@@ -37,6 +38,10 @@ public:
{
}
+ markers_interior_placement(markers_interior_placement && rhs)
+ : markers_point_placement<Locator, Detector>(std::move(rhs))
+ {}
+
bool get_point(double &x, double &y, double &angle, bool ignore_placement)
{
if (this->done_)
@@ -44,12 +49,12 @@ public:
return false;
}
- if (this->locator_.type() == mapnik::geometry_type::types::Point)
+ if (this->locator_.type() == geometry::geometry_types::Point)
{
return markers_point_placement<Locator, Detector>::get_point(x, y, angle, ignore_placement);
}
- if (this->locator_.type() == mapnik::geometry_type::types::LineString)
+ if (this->locator_.type() == geometry::geometry_types::LineString)
{
if (!label::middle_point(this->locator_, x, y))
{
diff --git a/include/mapnik/markers_placements/line.hpp b/include/mapnik/markers_placements/line.hpp
index 3c829e7..c8017b5 100644
--- a/include/mapnik/markers_placements/line.hpp
+++ b/include/mapnik/markers_placements/line.hpp
@@ -25,10 +25,9 @@
#include <mapnik/markers_placements/point.hpp>
#include <mapnik/view_transform.hpp>
-#include <mapnik/debug.hpp>
-#include <mapnik/global.hpp> //round
-
-#include <cmath>
+#include <mapnik/vertex_cache.hpp>
+#include <mapnik/tolerance_iterator.hpp>
+#include <mapnik/geometry_types.hpp>
namespace mapnik {
@@ -38,29 +37,28 @@ class markers_line_placement : public markers_point_placement<Locator, Detector>
public:
markers_line_placement(Locator &locator, Detector &detector, markers_placement_params const& params)
: markers_point_placement<Locator, Detector>(locator, detector, params),
- last_x(0.0),
- last_y(0.0),
- next_x(0.0),
- next_y(0.0),
+ first_point_(true),
spacing_(0.0),
marker_width_((params.size * params.tr).width()),
- error_(0.0),
- spacing_left_(0.0),
- marker_nr_(0)
+ path_(locator)
{
spacing_ = params.spacing < 1 ? 100 : params.spacing;
rewind();
}
+ markers_line_placement(markers_line_placement && rhs)
+ : markers_point_placement<Locator, Detector>(std::move(rhs)),
+ first_point_(std::move(rhs.first_point_)),
+ spacing_(std::move(rhs.spacing_)),
+ marker_width_(std::move(rhs.marker_width_)),
+ path_(std::move(rhs.path_))
+ {}
+
void rewind()
{
this->locator_.rewind(0);
- //Get first point
- this->done_ = agg::is_stop(this->locator_.vertex(&next_x, &next_y));
- last_x = next_x;
- last_y = next_y; // Force request of new segment
- error_ = 0.0;
- marker_nr_ = 0;
+ this->done_ = false;
+ first_point_ = true;
}
bool get_point(double &x, double &y, double &angle, bool ignore_placement)
@@ -70,164 +68,65 @@ public:
return false;
}
- if (this->locator_.type() == mapnik::geometry_type::types::Point)
+ if (this->locator_.type() == geometry::geometry_types::Point)
{
return markers_point_placement<Locator, Detector>::get_point(x, y, angle, ignore_placement);
}
- unsigned cmd;
- /* This functions starts at the position of the previous marker,
- walks along the path, counting how far it has to go in spacing_left.
- If one marker can't be placed at the position it should go to it is
- moved a bit. The error is compensated for in the next call to this
- function.
-
- error > 0: Marker too near to the end of the path.
- error = 0: Perfect position.
- error < 0: Marker too near to the beginning of the path.
- */
- if (marker_nr_ == 0)
- {
- //First marker
- marker_nr_++;
- spacing_left_ = spacing_ / 2;
- }
- else
- {
- spacing_left_ = spacing_;
- }
- spacing_left_ -= error_;
- error_ = 0.0;
- double max_err_allowed = this->params_.max_error * spacing_;
- //Loop exits when a position is found or when no more segments are available
- while (true)
+ double move = spacing_;
+
+ if (first_point_)
{
- //Do not place markers too close to the beginning of a segment
- if (spacing_left_ < this->marker_width_ / 2)
- {
- set_spacing_left(this->marker_width_ / 2); //Only moves forward
- }
- //Error for this marker is too large. Skip to the next position.
- if (std::fabs(error_) > max_err_allowed)
- {
- while (this->error_ > spacing_)
- {
- error_ -= spacing_; //Avoid moving backwards
- }
- spacing_left_ += spacing_ - this->error_;
- error_ = 0.0;
- }
- double dx = next_x - last_x;
- double dy = next_y - last_y;
- double segment_length = std::sqrt(dx * dx + dy * dy);
- if (segment_length <= spacing_left_)
- {
- //Segment is too short to place marker. Find next segment
- spacing_left_ -= segment_length;
- last_x = next_x;
- last_y = next_y;
- while (agg::is_move_to(cmd = this->locator_.vertex(&next_x, &next_y)))
- {
- //Skip over "move" commands
- last_x = next_x;
- last_y = next_y;
- }
- if (agg::is_stop(cmd) || cmd == SEG_CLOSE)
- {
- this->done_ = true;
- return false;
- }
- continue; //Try again
- }
- /* At this point we know the following things:
- - segment_length > spacing_left
- - error is small enough
- - at least half a marker fits into this segment
- */
- //Check if marker really fits in this segment
- if (segment_length < this->marker_width_)
+ if (!path_.next_subpath())
{
- //Segment to short => Skip this segment
- set_spacing_left(segment_length + this->marker_width_/2); //Only moves forward
- continue;
+ this->done_ = true;
+ return false;
}
- else if (segment_length - spacing_left_ < this->marker_width_/2)
+ first_point_ = false;
+ move = spacing_ / 2.0;
+ }
+
+ while (path_.forward(move))
+ {
+ tolerance_iterator tolerance_offset(spacing_ * this->params_.max_error, 0.0);
+ while (tolerance_offset.next())
{
- //Segment is long enough, but we are to close to the end
- //Note: This function moves backwards. This could lead to an infinite
- // loop when another function adds a positive offset. Therefore we
- // only move backwards when there is no offset
- if (error_ == 0)
- {
- set_spacing_left(segment_length - this->marker_width_/2, true);
- }
- else
+ vertex_cache::scoped_state state(path_);
+ if (path_.move(tolerance_offset.get()) && (path_.linear_position() + marker_width_ / 2.0) < path_.length())
{
- //Skip this segment
- set_spacing_left(segment_length + this->marker_width_/2); //Only moves forward
+ pixel_position pos = path_.current_position();
+ x = pos.x;
+ y = pos.y;
+ angle = path_.current_segment_angle();
+ if (!this->set_direction(angle))
+ {
+ continue;
+ }
+ box2d<double> box = this->perform_transform(angle, x, y);
+ if ((this->params_.avoid_edges && !this->detector_.extent().contains(box))
+ || (!this->params_.allow_overlap && !this->detector_.has_placement(box)))
+ {
+ continue;
+ }
+ if (!ignore_placement)
+ {
+ this->detector_.insert(box);
+ }
+ return true;
}
- continue; //Force checking of max_error constraint
}
- angle = std::atan2(dy, dx);
- x = last_x + dx * (spacing_left_ / segment_length);
- y = last_y + dy * (spacing_left_ / segment_length);
- box2d<double> box = this->perform_transform(angle, x, y);
- if (this->params_.avoid_edges && !this->detector_.extent().contains(box))
- {
- set_spacing_left(spacing_left_ + spacing_ * this->params_.max_error / 10.0);
- continue;
- }
- if (!this->params_.allow_overlap && !this->detector_.has_placement(box))
- {
- //10.0 is the approxmiate number of positions tried and choosen arbitrarily
- set_spacing_left(spacing_left_ + spacing_ * this->params_.max_error / 10.0); //Only moves forward
- continue;
- }
- if (!ignore_placement)
- {
- this->detector_.insert(box);
- }
- last_x = x;
- last_y = y;
- return true;
}
+
+ this->done_ = true;
+
+ return false;
}
private:
- double last_x;
- double last_y;
- double next_x;
- double next_y;
+ bool first_point_;
double spacing_;
double marker_width_;
- // If a marker could not be placed at the exact point where it should
- // go the next marker's distance will be a bit lower.
- double error_;
- double spacing_left_;
- unsigned marker_nr_;
-
- // Set spacing_left_, adjusts error_ and performs sanity checks.
- void set_spacing_left(double sl, bool allow_negative=false)
- {
- double delta_error = sl - spacing_left_;
- if (!allow_negative && delta_error < 0)
- {
- MAPNIK_LOG_WARN(markers_line_placement)
- << "Unexpected negative error in markers_line_placement. "
- "Please file a bug report.";
- return;
- }
-#ifdef MAPNIK_DEBUG
- if (delta_error == 0.0)
- {
- MAPNIK_LOG_WARN(markers_line_placement)
- << "Not moving at all in set_spacing_left()! "
- "Please file a bug report.";
- }
-#endif
- error_ += delta_error;
- spacing_left_ = sl;
- }
+ vertex_cache path_;
};
}
diff --git a/include/mapnik/markers_placements/point.hpp b/include/mapnik/markers_placements/point.hpp
index e9af96f..37cda84 100644
--- a/include/mapnik/markers_placements/point.hpp
+++ b/include/mapnik/markers_placements/point.hpp
@@ -23,11 +23,19 @@
#ifndef MAPNIK_MARKERS_PLACEMENTS_POINT_HPP
#define MAPNIK_MARKERS_PLACEMENTS_POINT_HPP
+#include <mapnik/box2d.hpp>
#include <mapnik/geom_util.hpp>
+#include <mapnik/geometry_types.hpp>
+#include <mapnik/util/math.hpp>
+#include <mapnik/label_collision_detector.hpp>
+#include <mapnik/symbolizer_enumerations.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include "agg_basics.h"
#include "agg_trans_affine.h"
+#include <cmath>
+
namespace mapnik {
struct markers_placement_params
@@ -38,10 +46,11 @@ struct markers_placement_params
double max_error;
bool allow_overlap;
bool avoid_edges;
+ direction_enum direction;
};
template <typename Locator, typename Detector>
-class markers_point_placement
+class markers_point_placement : util::noncopyable
{
public:
markers_point_placement(Locator &locator, Detector &detector, markers_placement_params const& params)
@@ -53,6 +62,14 @@ public:
rewind();
}
+ markers_point_placement(markers_point_placement && rhs)
+ : locator_(rhs.locator_),
+ detector_(rhs.detector_),
+ params_(rhs.params_),
+ done_(rhs.done_)
+ {}
+
+
// Start again at first marker. Returns the same list of markers only works when they were NOT added to the detector.
void rewind()
{
@@ -68,7 +85,7 @@ public:
return false;
}
- if (locator_.type() == mapnik::geometry_type::types::LineString)
+ if (locator_.type() == geometry::geometry_types::LineString)
{
if (!label::middle_point(locator_, x, y))
{
@@ -133,6 +150,36 @@ protected:
result.expand_to_include(xD, yD);
return result;
}
+
+ bool set_direction(double & angle)
+ {
+ switch (params_.direction)
+ {
+ case DIRECTION_UP:
+ angle = .0;
+ return true;
+ case DIRECTION_DOWN:
+ angle = M_PI;
+ return true;
+ case DIRECTION_AUTO:
+ angle = (std::fabs(util::normalize_angle(angle)) > 0.5 * M_PI) ? (angle + M_PI) : angle;
+ return true;
+ case DIRECTION_AUTO_DOWN:
+ angle = (std::fabs(util::normalize_angle(angle)) < 0.5 * M_PI) ? (angle + M_PI) : angle;
+ return true;
+ case DIRECTION_LEFT:
+ angle += M_PI;
+ return true;
+ case DIRECTION_LEFT_ONLY:
+ angle += M_PI;
+ return std::fabs(util::normalize_angle(angle)) < 0.5 * M_PI;
+ case DIRECTION_RIGHT_ONLY:
+ return std::fabs(util::normalize_angle(angle)) < 0.5 * M_PI;
+ case DIRECTION_RIGHT:
+ default:
+ return true;
+ }
+ }
};
}
diff --git a/include/mapnik/markers_placements/vertext_first.hpp b/include/mapnik/markers_placements/vertext_first.hpp
index 8ac11e2..7c149eb 100644
--- a/include/mapnik/markers_placements/vertext_first.hpp
+++ b/include/mapnik/markers_placements/vertext_first.hpp
@@ -36,6 +36,10 @@ public:
{
}
+ markers_vertex_first_placement(markers_vertex_first_placement && rhs)
+ : markers_point_placement<Locator, Detector>(std::move(rhs))
+ {}
+
bool get_point(double &x, double &y, double &angle, bool ignore_placement)
{
if (this->done_)
@@ -43,7 +47,7 @@ public:
return false;
}
- if (this->locator_.type() == mapnik::geometry_type::types::Point)
+ if (this->locator_.type() == mapnik::geometry::geometry_types::Point)
{
return markers_point_placement<Locator, Detector>::get_point(x, y, angle, ignore_placement);
}
@@ -65,6 +69,10 @@ public:
if (agg::is_line_to(this->locator_.vertex(&x1, &y1)))
{
angle = std::atan2(y1 - y0, x1 - x0);
+ if (!this->set_direction(angle))
+ {
+ return false;
+ }
}
box2d<double> box = this->perform_transform(angle, x, y);
diff --git a/include/mapnik/markers_placements/vertext_last.hpp b/include/mapnik/markers_placements/vertext_last.hpp
index 3268c7c..1c85c95 100644
--- a/include/mapnik/markers_placements/vertext_last.hpp
+++ b/include/mapnik/markers_placements/vertext_last.hpp
@@ -32,7 +32,12 @@ class markers_vertex_last_placement : public markers_point_placement<Locator, De
{
public:
markers_vertex_last_placement(Locator &locator, Detector &detector, markers_placement_params const& params)
- : markers_point_placement<Locator, Detector>(locator, detector, params) {}
+ : markers_point_placement<Locator, Detector>(locator, detector, params)
+ {}
+
+ markers_vertex_last_placement(markers_vertex_last_placement && rhs)
+ : markers_point_placement<Locator, Detector>(std::move(rhs))
+ {}
bool get_point(double &x, double &y, double &angle, bool ignore_placement)
{
@@ -69,6 +74,10 @@ public:
if (agg::is_line_to(command1))
{
angle = std::atan2(y0 - y1, x0 - x1);
+ if (!this->set_direction(angle))
+ {
+ return false;
+ }
}
box2d<double> box = this->perform_transform(angle, x, y);
diff --git a/include/mapnik/memory.hpp b/include/mapnik/memory.hpp
index 98a225a..c4bff29 100644
--- a/include/mapnik/memory.hpp
+++ b/include/mapnik/memory.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/memory_datasource.hpp b/include/mapnik/memory_datasource.hpp
index a442d61..83fdba6 100644
--- a/include/mapnik/memory_datasource.hpp
+++ b/include/mapnik/memory_datasource.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -43,7 +43,7 @@ public:
virtual featureset_ptr features(query const& q) const;
virtual featureset_ptr features_at_point(coord2d const& pt, double tol = 0) const;
virtual box2d<double> envelope() const;
- virtual boost::optional<geometry_t> get_geometry_type() const;
+ virtual boost::optional<datasource_geometry_t> get_geometry_type() const;
virtual layer_descriptor get_descriptor() const;
//
void push(feature_ptr feature);
diff --git a/include/mapnik/memory_featureset.hpp b/include/mapnik/memory_featureset.hpp
index 9deb6fe..5193c8c 100644
--- a/include/mapnik/memory_featureset.hpp
+++ b/include/mapnik/memory_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,6 +26,7 @@
// mapnik
#include <mapnik/box2d.hpp>
#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_envelope.hpp>
#include <mapnik/featureset.hpp>
#include <mapnik/datasource.hpp>
#include <mapnik/memory_datasource.hpp>
@@ -77,13 +78,10 @@ public:
}
else
{
- for (std::size_t i=0; i<(*pos_)->num_geometries();++i)
+ geometry::geometry<double> const& geom = (*pos_)->get_geometry();
+ if (bbox_.intersects(geometry::envelope(geom)))
{
- geometry_type & geom = (*pos_)->get_geometry(i);
- if (bbox_.intersects(geom.envelope()))
- {
- return *pos_++;
- }
+ return *pos_++;
}
}
++pos_;
diff --git a/include/mapnik/miniz_png.hpp b/include/mapnik/miniz_png.hpp
index cc59931..0414c32 100644
--- a/include/mapnik/miniz_png.hpp
+++ b/include/mapnik/miniz_png.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -32,7 +32,7 @@
#include <iostream>
#include <stdexcept>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
#include <mapnik/image_view.hpp>
/* miniz.c porting issues:
@@ -83,12 +83,12 @@ private:
static const unsigned char IEND_tpl[];
};
-extern template MAPNIK_DECL void PNGWriter::writeIDAT<image_data_8>(image_data_8 const& image);
-extern template MAPNIK_DECL void PNGWriter::writeIDAT<image_view<image_data_8> >(image_view<image_data_8> const& image);
-extern template MAPNIK_DECL void PNGWriter::writeIDAT<image_data_32>(image_data_32 const& image);
-extern template MAPNIK_DECL void PNGWriter::writeIDAT<image_view<image_data_32> >(image_view<image_data_32> const& image);
-extern template MAPNIK_DECL void PNGWriter::writeIDATStripAlpha<image_data_32>(image_data_32 const& image);
-extern template MAPNIK_DECL void PNGWriter::writeIDATStripAlpha<image_view<image_data_32> >(image_view<image_data_32> const& image);
+extern template MAPNIK_DECL void PNGWriter::writeIDAT<image_gray8>(image_gray8 const& image);
+extern template MAPNIK_DECL void PNGWriter::writeIDAT<image_view_gray8>(image_view_gray8 const& image);
+extern template MAPNIK_DECL void PNGWriter::writeIDAT<image_rgba8>(image_rgba8 const& image);
+extern template MAPNIK_DECL void PNGWriter::writeIDAT<image_view_rgba8>(image_view_rgba8 const& image);
+extern template MAPNIK_DECL void PNGWriter::writeIDATStripAlpha<image_rgba8>(image_rgba8 const& image);
+extern template MAPNIK_DECL void PNGWriter::writeIDATStripAlpha<image_view_rgba8>(image_view_rgba8 const& image);
}}
diff --git a/include/mapnik/noncopyable.hpp b/include/mapnik/noncopyable.hpp
deleted file mode 100644
index f5dfbdc..0000000
--- a/include/mapnik/noncopyable.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2012 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#ifndef MAPNIK_NONCOPYABLE_HPP
-#define MAPNIK_NONCOPYABLE_HPP
-
-namespace mapnik {
-
-namespace non_copyable_
-{
-
-class noncopyable
-{
-protected:
- constexpr noncopyable() = default;
- ~noncopyable() = default;
- noncopyable( noncopyable const& ) = delete;
- noncopyable& operator=(noncopyable const& ) = delete;
-};
-}
-
-using noncopyable = non_copyable_::noncopyable;
-
-} // namespace mapnik
-
-#endif // MAPNIK_NONCOPYABLE_HPP
diff --git a/include/mapnik/octree.hpp b/include/mapnik/octree.hpp
index f98eb53..ea813c8 100644
--- a/include/mapnik/octree.hpp
+++ b/include/mapnik/octree.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,7 +26,7 @@
// mapnik
#include <mapnik/global.hpp>
#include <mapnik/palette.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// stl
#include <algorithm>
@@ -49,7 +49,7 @@ struct RGBPolicy
};
template <typename T, typename InsertPolicy = RGBPolicy >
-class octree : private mapnik::noncopyable
+class octree : private util::noncopyable
{
struct node
{
@@ -88,8 +88,8 @@ class octree : private mapnik::noncopyable
unsigned count;
double reduce_cost;
unsigned count_cum;
- byte children_count;
- byte index;
+ std::uint8_t children_count;
+ std::uint8_t index;
};
struct node_cmp
{
@@ -297,9 +297,9 @@ public:
if (itr->count != 0)
{
unsigned count = itr->count;
- palette.push_back(rgb(byte(itr->reds/float(count)),
- byte(itr->greens/float(count)),
- byte(itr->blues/float(count))));
+ palette.push_back(rgb(std::uint8_t(itr->reds/float(count)),
+ std::uint8_t(itr->greens/float(count)),
+ std::uint8_t(itr->blues/float(count))));
itr->index = static_cast<unsigned>(palette.size()) - 1;
}
for (unsigned i=0; i < 8 ;++i)
diff --git a/include/mapnik/offset_converter.hpp b/include/mapnik/offset_converter.hpp
index e01c1d7..ad9d73d 100644
--- a/include/mapnik/offset_converter.hpp
+++ b/include/mapnik/offset_converter.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -302,9 +302,18 @@ private:
// intersection detection smoothes it out.
pre_first_ = v1;
displace(pre_first_, -2 * std::fabs(offset_), 0, angle_b);
-
+ start_ = pre_first_;
while ((v1 = v2, v2.cmd = geom_.vertex(&v2.x, &v2.y)) != SEG_END)
{
+ if (v2.cmd == SEG_MOVETO)
+ {
+ start_ = v2;
+ }
+ else if (v2.cmd == SEG_CLOSE)
+ {
+ v2.x = start_.x;
+ v2.y = start_.y;
+ }
angle_a = angle_b;
angle_b = std::atan2((v2.y - v1.y), (v2.x - v1.x));
joint_angle = explement_reflex_angle(angle_b - angle_a);
@@ -375,17 +384,15 @@ private:
unsigned output_vertex(double* px, double* py)
{
- *px = cur_.x;
- *py = cur_.y;
+ if (cur_.cmd == SEG_CLOSE) *px = *py = 0.0;
+ else
+ {
+ *px = cur_.x;
+ *py = cur_.y;
+ }
return cur_.cmd;
}
- unsigned output_vertex(double* px, double* py, status st)
- {
- status_ = st;
- return output_vertex(px, py);
- }
-
void push_vertex(vertex2d const& v)
{
vertices_.push_back(v);
@@ -398,6 +405,7 @@ private:
status status_;
size_t pos_;
std::vector<vertex2d> vertices_;
+ vertex2d start_;
vertex2d pre_first_;
vertex2d pre_;
vertex2d cur_;
diff --git a/include/mapnik/palette.hpp b/include/mapnik/palette.hpp
index 0d1d9e6..cf21338 100644
--- a/include/mapnik/palette.hpp
+++ b/include/mapnik/palette.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,7 +26,7 @@
// mapnik
#include <mapnik/config.hpp>
#include <mapnik/global.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#define USE_DENSE_HASH_MAP
@@ -51,11 +51,11 @@ namespace mapnik {
struct rgba;
struct MAPNIK_DECL rgb {
- byte r;
- byte g;
- byte b;
+ std::uint8_t r;
+ std::uint8_t g;
+ std::uint8_t b;
- inline rgb(byte r_, byte g_, byte b_) : r(r_), g(g_), b(b_) {}
+ inline rgb(std::uint8_t r_, std::uint8_t g_, std::uint8_t b_) : r(r_), g(g_), b(b_) {}
rgb(rgba const& c);
inline bool operator==(const rgb& y) const
@@ -66,12 +66,12 @@ struct MAPNIK_DECL rgb {
struct MAPNIK_DECL rgba
{
- byte r;
- byte g;
- byte b;
- byte a;
+ std::uint8_t r;
+ std::uint8_t g;
+ std::uint8_t b;
+ std::uint8_t a;
- inline rgba(byte r_, byte g_, byte b_, byte a_)
+ inline rgba(std::uint8_t r_, std::uint8_t g_, std::uint8_t b_, std::uint8_t a_)
: r(r_),
g(g_),
b(b_),
@@ -103,7 +103,7 @@ struct MAPNIK_DECL rgba
};
-class MAPNIK_DECL rgba_palette : private mapnik::noncopyable {
+class MAPNIK_DECL rgba_palette : private util::noncopyable {
public:
enum palette_type { PALETTE_RGBA = 0, PALETTE_RGB = 1, PALETTE_ACT = 2 };
diff --git a/include/mapnik/params.hpp b/include/mapnik/params.hpp
index 6699e63..8407667 100644
--- a/include/mapnik/params.hpp
+++ b/include/mapnik/params.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -40,7 +40,7 @@ namespace mapnik
// fwd declare
class boolean_type;
-using value_holder_base = util::variant<value_null,value_integer,value_double,std::string>;
+using value_holder_base = util::variant<value_null,value_integer,value_double,std::string,value_bool>;
struct value_holder : value_holder_base
{
@@ -48,19 +48,11 @@ struct value_holder : value_holder_base
value_holder()
: value_holder_base() {}
- // copy
- value_holder(const char* val)
- : value_holder_base(val) {}
-
- template <typename T>
- value_holder(T const& obj)
- : value_holder_base(typename detail::mapnik_value_type<T>::type(obj))
- {}
-
- // move
+ // perfect forwarding
template <typename T>
value_holder(T && obj) noexcept
- : value_holder_base(std::move(obj)) {}
+ : value_holder_base(std::forward<T>(obj))
+ {}
};
using parameter = std::pair<std::string, value_holder>;
@@ -96,6 +88,12 @@ boost::optional<value_integer> parameters::get(std::string const& key,
value_integer const& default_opt_value) const;
template MAPNIK_DECL
+boost::optional<value_bool> parameters::get(std::string const& key) const;
+template MAPNIK_DECL
+boost::optional<value_bool> parameters::get(std::string const& key,
+ value_bool const& default_opt_value) const;
+
+template MAPNIK_DECL
boost::optional<mapnik::boolean_type> parameters::get(std::string const& key) const;
template MAPNIK_DECL
boost::optional<mapnik::boolean_type> parameters::get(std::string const& key,
diff --git a/include/mapnik/params_impl.hpp b/include/mapnik/params_impl.hpp
index 1362f22..c262cac 100644
--- a/include/mapnik/params_impl.hpp
+++ b/include/mapnik/params_impl.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -53,6 +53,29 @@ struct extract_value
s << "No conversion from std::string to " << typeid(T).name();
throw std::runtime_error(s.str());
}
+ static inline boost::optional<T> do_extract_from_bool(value_bool const& /*source*/)
+ {
+ std::ostringstream s;
+ s << "No conversion from boolean to " << typeid(T).name();
+ throw std::runtime_error(s.str());
+ }
+};
+
+template <>
+struct extract_value<value_bool>
+{
+ static inline boost::optional<value_bool> do_extract_from_string(std::string const& source)
+ {
+ bool result;
+ if (mapnik::util::string2bool(source, result))
+ return boost::optional<value_bool>(result);
+ return boost::optional<value_bool>();
+ }
+
+ static inline boost::optional<value_bool> do_extract_from_bool(value_bool const& source)
+ {
+ return boost::optional<value_bool>(source);
+ }
};
template <>
@@ -65,6 +88,11 @@ struct extract_value<mapnik::boolean_type>
return boost::optional<mapnik::boolean_type>(result);
return boost::optional<mapnik::boolean_type>();
}
+
+ static inline boost::optional<mapnik::boolean_type> do_extract_from_bool(value_bool const& source)
+ {
+ return boost::optional<mapnik::boolean_type>(source);
+ }
};
template <>
@@ -77,6 +105,10 @@ struct extract_value<mapnik::value_integer>
return boost::optional<mapnik::value_integer>(result);
return boost::optional<mapnik::value_integer>();
}
+ static inline boost::optional<mapnik::value_integer> do_extract_from_bool(value_bool const& source)
+ {
+ return boost::optional<mapnik::value_integer>(boost::lexical_cast<mapnik::value_integer>(source));
+ }
};
template <>
@@ -89,6 +121,11 @@ struct extract_value<mapnik::value_double>
return boost::optional<double>(result);
return boost::optional<double>();
}
+
+ static inline boost::optional<mapnik::value_double> do_extract_from_bool(value_bool const& source)
+ {
+ return boost::optional<double>(boost::lexical_cast<double>(source));
+ }
};
template <>
@@ -98,6 +135,11 @@ struct extract_value<mapnik::value_null>
{
return boost::optional<mapnik::value_null>(); // FIXME
}
+
+ static inline boost::optional<mapnik::value_null> do_extract_from_bool(value_bool const&)
+ {
+ return boost::optional<mapnik::value_null>(); // FIXME
+ }
};
@@ -108,6 +150,14 @@ struct extract_value<std::string>
{
return boost::optional<std::string>(source);
}
+
+ static inline boost::optional<std::string> do_extract_from_bool(value_bool const& source)
+ {
+ if (source) {
+ return boost::optional<std::string>("true");
+ }
+ return boost::optional<std::string>("false");
+ }
};
@@ -118,10 +168,16 @@ boost::optional<T> param_cast(std::string const& source)
return extract_value<T>::do_extract_from_string(source);
}
+template <typename T>
+boost::optional<T> param_cast(value_bool const& source)
+{
+ return extract_value<T>::do_extract_from_bool(source);
+}
+
} // end namespace detail
template <typename T>
-struct value_extractor_visitor : public util::static_visitor<>
+struct value_extractor_visitor
{
value_extractor_visitor(boost::optional<T> & var)
@@ -132,6 +188,12 @@ struct value_extractor_visitor : public util::static_visitor<>
var_ = detail::param_cast<T>(val);
}
+
+ void operator() (value_bool const& val) const
+ {
+ var_ = detail::param_cast<T>(val);
+
+ }
template <typename T1>
void operator () (T1 const& val) const
diff --git a/include/mapnik/parse_path.hpp b/include/mapnik/parse_path.hpp
index 3d61bb5..0667e90 100644
--- a/include/mapnik/parse_path.hpp
+++ b/include/mapnik/parse_path.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/parse_transform.hpp b/include/mapnik/parse_transform.hpp
index b19c448..7baef79 100644
--- a/include/mapnik/parse_transform.hpp
+++ b/include/mapnik/parse_transform.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/path.hpp b/include/mapnik/path.hpp
new file mode 100644
index 0000000..b57fe50
--- /dev/null
+++ b/include/mapnik/path.hpp
@@ -0,0 +1,184 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_PATH_HPP
+#define MAPNIK_PATH_HPP
+
+// mapnik
+#include <mapnik/vertex_vector.hpp>
+#include <mapnik/box2d.hpp>
+#include <mapnik/util/noncopyable.hpp>
+
+namespace mapnik { namespace detail {
+
+template <typename T, template <typename> class Container=vertex_vector>
+class path : private util::noncopyable
+{
+public:
+ static const std::uint8_t geometry_bits = 7;
+ enum types : std::uint8_t
+ {
+ Unknown = 0x00,
+ Point = 0x01,
+ LineString = 0x02,
+ Polygon = 0x03,
+ PolygonExterior = Polygon,
+ PolygonInterior = Polygon | ( 1 << geometry_bits)
+ };
+ using coord_type = T;
+ using container_type = Container<coord_type>;
+ using value_type = typename container_type::value_type;
+ using size_type = typename container_type::size_type;
+ container_type cont_;
+ types type_;
+public:
+
+ path()
+ : type_(Unknown)
+ {}
+
+ explicit path(types type)
+ : type_(type)
+ {}
+
+ types type() const
+ {
+ return static_cast<types>(type_ & types::Polygon);
+ }
+
+ bool interior() const
+ {
+ return static_cast<bool>(type_ >> geometry_bits);
+ }
+
+ void set_type(types type)
+ {
+ type_ = type;
+ }
+
+ container_type const& data() const
+ {
+ return cont_;
+ }
+
+ size_type size() const
+ {
+ return cont_.size();
+ }
+ void push_vertex(coord_type x, coord_type y, CommandType c)
+ {
+ cont_.push_back(x,y,c);
+ }
+
+ void line_to(coord_type x,coord_type y)
+ {
+ push_vertex(x,y,SEG_LINETO);
+ }
+
+ void move_to(coord_type x,coord_type y)
+ {
+ push_vertex(x,y,SEG_MOVETO);
+ }
+
+ void close_path()
+ {
+ push_vertex(0,0,SEG_CLOSE);
+ }
+};
+
+template <typename T>
+struct vertex_adapter : private util::noncopyable
+{
+ using path_type = T;
+ using size_type = typename path_type::size_type;
+ using value_type = typename path_type::value_type;
+ using types = typename path_type::types;
+
+ vertex_adapter(path_type const& path)
+ : path_(path),
+ itr_(0) {}
+
+ size_type size() const
+ {
+ return path_.size();
+ }
+
+ unsigned vertex(double* x, double* y) const
+ {
+ return path_.cont_.get_vertex(itr_++,x,y);
+ }
+
+ unsigned vertex(std::size_t index, double* x, double* y) const
+ {
+ return path_.cont_.get_vertex(index, x, y);
+ }
+
+ void rewind(unsigned ) const
+ {
+ itr_ = 0;
+ }
+
+ types type() const
+ {
+ return path_.type();
+ }
+
+ box2d<double> envelope() const
+ {
+ box2d<double> result;
+ double x = 0;
+ double y = 0;
+ rewind(0);
+ size_type path_size = size();
+ for (size_type i = 0; i < path_size; ++i)
+ {
+ unsigned cmd = vertex(&x,&y);
+ if (cmd == SEG_CLOSE) continue;
+ if (i == 0)
+ {
+ result.init(x,y,x,y);
+ }
+ else
+ {
+ result.expand_to_include(x,y);
+ }
+ }
+ return result;
+ }
+ path_type const& path_;
+ mutable size_type itr_;
+};
+}
+
+template <typename PathType>
+box2d<double> envelope(PathType const& path)
+{
+ detail::vertex_adapter<PathType> va(path);
+ return va.envelope();
+}
+
+using path_type = detail::path<double,vertex_vector>;
+using vertex_adapter = detail::vertex_adapter<path_type>;
+
+}
+
+#endif // MAPNIK_PATH_HPP
diff --git a/include/mapnik/path_expression.hpp b/include/mapnik/path_expression.hpp
index ab568dd..296348b 100644
--- a/include/mapnik/path_expression.hpp
+++ b/include/mapnik/path_expression.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/path_expression_grammar.hpp b/include/mapnik/path_expression_grammar.hpp
index 1a0a3ac..f39947e 100644
--- a/include/mapnik/path_expression_grammar.hpp
+++ b/include/mapnik/path_expression_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/path_expression_grammar_impl.hpp b/include/mapnik/path_expression_grammar_impl.hpp
index 6b764ed..4801d20 100644
--- a/include/mapnik/path_expression_grammar_impl.hpp
+++ b/include/mapnik/path_expression_grammar_impl.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -43,7 +43,7 @@ path_expression_grammar<Iterator>::path_expression_grammar()
qi::lexeme_type lexeme;
using phoenix::push_back;
using boost::phoenix::construct;
-
+
expr =
* (
str [ push_back(_val, _1)]
@@ -51,7 +51,7 @@ path_expression_grammar<Iterator>::path_expression_grammar()
( '[' >> attr [ push_back(_val, construct<mapnik::attribute>( _1 )) ] >> ']')
)
;
-
+
attr %= +(char_ - ']');
str %= lexeme[+(char_ -'[')];
}
diff --git a/include/mapnik/pixel_position.hpp b/include/mapnik/pixel_position.hpp
index 11501bc..40d00ac 100644
--- a/include/mapnik/pixel_position.hpp
+++ b/include/mapnik/pixel_position.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/pixel_types.hpp b/include/mapnik/pixel_types.hpp
new file mode 100644
index 0000000..68e7ede
--- /dev/null
+++ b/include/mapnik/pixel_types.hpp
@@ -0,0 +1,61 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_PIXEL_TYPES_HPP
+#define MAPNIK_PIXEL_TYPES_HPP
+
+#include <mapnik/global.hpp>
+
+namespace mapnik {
+
+enum image_dtype : std::uint8_t
+{
+ image_dtype_rgba8 = 0,
+ image_dtype_gray8,
+ image_dtype_gray8s,
+ image_dtype_gray16,
+ image_dtype_gray16s,
+ image_dtype_gray32,
+ image_dtype_gray32s,
+ image_dtype_gray32f,
+ image_dtype_gray64,
+ image_dtype_gray64s,
+ image_dtype_gray64f,
+ image_dtype_null,
+ IMAGE_DTYPE_MAX
+};
+
+struct null_t { using type = std::uint8_t; static const image_dtype id = image_dtype_null; };
+struct rgba8_t { using type = std::uint32_t; static const image_dtype id = image_dtype_rgba8; };
+struct gray8_t { using type = std::uint8_t; static const image_dtype id = image_dtype_gray8; };
+struct gray8s_t { using type = std::int8_t; static const image_dtype id = image_dtype_gray8s; };
+struct gray16_t { using type = std::uint16_t; static const image_dtype id = image_dtype_gray16; };
+struct gray16s_t { using type = std::int16_t; static const image_dtype id = image_dtype_gray16s; };
+struct gray32_t { using type = std::uint32_t; static const image_dtype id = image_dtype_gray32; };
+struct gray32s_t { using type = std::int32_t; static const image_dtype id = image_dtype_gray32s; };
+struct gray32f_t { using type = float; static const image_dtype id = image_dtype_gray32f; };
+struct gray64_t { using type = std::uint64_t; static const image_dtype id = image_dtype_gray64; };
+struct gray64s_t { using type = std::int64_t; static const image_dtype id = image_dtype_gray64s; };
+struct gray64f_t { using type = double; static const image_dtype id = image_dtype_gray64f; };
+
+} // end ns
+#endif // MAPNIK_PIXEL_TYPES_HPP
diff --git a/include/mapnik/plugin.hpp b/include/mapnik/plugin.hpp
index bc25ff1..4be5f4f 100644
--- a/include/mapnik/plugin.hpp
+++ b/include/mapnik/plugin.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,7 @@
#define MAPNIK_PLUGIN_HPP
// mapnik
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// stl
#include <string>
@@ -35,7 +35,7 @@ namespace mapnik
// Opaque structure for handle
using mapnik_lib_t = struct _mapnik_lib_t;
-class PluginInfo : mapnik::noncopyable
+class PluginInfo : util::noncopyable
{
public:
using name_func = const char* (*) ();
diff --git a/include/mapnik/png_io.hpp b/include/mapnik/png_io.hpp
index 3df3197..9a35a29 100644
--- a/include/mapnik/png_io.hpp
+++ b/include/mapnik/png_io.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -28,7 +28,7 @@
#include <mapnik/octree.hpp>
#include <mapnik/hextree.hpp>
#include <mapnik/miniz_png.hpp>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
// zlib
#include <zlib.h> // for Z_DEFAULT_COMPRESSION
@@ -140,7 +140,7 @@ void save_as_png(T1 & file,
const std::unique_ptr<png_bytep[]> row_pointers(new png_bytep[image.height()]);
for (unsigned int i = 0; i < image.height(); i++)
{
- row_pointers[i] = (png_bytep)image.getRow(i);
+ row_pointers[i] = (png_bytep)image.get_row(i);
}
png_set_rows(png_ptr, info_ptr, row_pointers.get());
png_write_png(png_ptr, info_ptr, (opts.trans_mode == 0) ? PNG_TRANSFORM_STRIP_FILLER_AFTER : PNG_TRANSFORM_IDENTITY, nullptr);
@@ -149,7 +149,7 @@ void save_as_png(T1 & file,
template <typename T>
void reduce_8(T const& in,
- image_data_8 & out,
+ image_gray8 & out,
octree<rgb> trees[],
unsigned limits[],
unsigned levels,
@@ -166,12 +166,12 @@ void reduce_8(T const& in,
}
for (unsigned y = 0; y < height; ++y)
{
- mapnik::image_data_32::pixel_type const * row = in.getRow(y);
- mapnik::image_data_8::pixel_type * row_out = out.getRow(y);
+ mapnik::image_rgba8::pixel_type const * row = in.get_row(y);
+ mapnik::image_gray8::pixel_type * row_out = out.get_row(y);
for (unsigned x = 0; x < width; ++x)
{
unsigned val = row[x];
- byte index = 0;
+ std::uint8_t index = 0;
int idx = -1;
for(int j=levels-1; j>0; j--)
{
@@ -200,7 +200,7 @@ void reduce_8(T const& in,
template <typename T>
void reduce_4(T const& in,
- image_data_8 & out,
+ image_gray8 & out,
octree<rgb> trees[],
unsigned limits[],
unsigned levels,
@@ -217,12 +217,12 @@ void reduce_4(T const& in,
}
for (unsigned y = 0; y < height; ++y)
{
- mapnik::image_data_32::pixel_type const * row = in.getRow(y);
- mapnik::image_data_8::pixel_type * row_out = out.getRow(y);
+ mapnik::image_rgba8::pixel_type const * row = in.get_row(y);
+ mapnik::image_gray8::pixel_type * row_out = out.get_row(y);
for (unsigned x = 0; x < width; ++x)
{
unsigned val = row[x];
- byte index = 0;
+ std::uint8_t index = 0;
int idx=-1;
for(int j=levels-1; j>0; j--)
{
@@ -256,7 +256,7 @@ void reduce_4(T const& in,
// 1-bit but only one color.
template <typename T>
void reduce_1(T const&,
- image_data_8 & out,
+ image_gray8 & out,
octree<rgb> /*trees*/[],
unsigned /*limits*/[],
std::vector<unsigned> & /*alpha*/)
@@ -266,7 +266,7 @@ void reduce_1(T const&,
template <typename T>
void save_as_png(T & file, std::vector<mapnik::rgb> const& palette,
- mapnik::image_data_8 const& image,
+ mapnik::image_gray8 const& image,
unsigned width,
unsigned height,
unsigned color_depth,
@@ -350,7 +350,7 @@ void save_as_png(T & file, std::vector<mapnik::rgb> const& palette,
png_write_info(png_ptr, info_ptr);
for (unsigned i=0;i<height;i++)
{
- png_write_row(png_ptr,(png_bytep)image.getRow(i));
+ png_write_row(png_ptr,(png_bytep)image.get_row(i));
}
png_write_end(png_ptr, info_ptr);
@@ -385,7 +385,7 @@ void save_as_png8_oct(T1 & file,
{
for (unsigned x = 0; x < width; ++x)
{
- unsigned val = U2ALPHA((unsigned)image.getRow(y)[x]);
+ unsigned val = U2ALPHA((unsigned)image.get_row(y)[x]);
alphaHist[val]++;
meanAlpha += val;
if (val>0 && val<255)
@@ -503,7 +503,7 @@ void save_as_png8_oct(T1 & file,
}
for (unsigned y = 0; y < height; ++y)
{
- typename T2::pixel_type const * row = image.getRow(y);
+ typename T2::pixel_type const * row = image.get_row(y);
for (unsigned x = 0; x < width; ++x)
{
unsigned val = row[x];
@@ -541,7 +541,7 @@ void save_as_png8_oct(T1 & file,
trees[j].create_palette(pal);
leftovers = cols[j] - static_cast<unsigned>(pal.size());
cols[j] = static_cast<unsigned>(pal.size());
- palette.insert(palette.begin(), pal.begin(), pal.end());
+ palette.insert(palette.end(), pal.begin(), pal.end());
}
}
@@ -556,7 +556,7 @@ void save_as_png8_oct(T1 & file,
if (palette.size() > 16 )
{
// >16 && <=256 colors -> write 8-bit color depth
- image_data_8 reduced_image(width,height);
+ image_gray8 reduced_image(width,height);
reduce_8(image, reduced_image, trees, limits, TRANSPARENCY_LEVELS, alphaTable);
save_as_png(file,palette,reduced_image,width,height,8,alphaTable,opts);
}
@@ -565,7 +565,7 @@ void save_as_png8_oct(T1 & file,
// 1 color image -> write 1-bit color depth PNG
unsigned image_width = ((width + 15) >> 3) & ~1U; // 1-bit image, round up to 16-bit boundary
unsigned image_height = height;
- image_data_8 reduced_image(image_width,image_height);
+ image_gray8 reduced_image(image_width,image_height);
reduce_1(image,reduced_image,trees, limits, alphaTable);
if (meanAlpha<255 && cols[0]==0)
{
@@ -579,7 +579,7 @@ void save_as_png8_oct(T1 & file,
// <=16 colors -> write 4-bit color depth PNG
unsigned image_width = ((width + 7) >> 1) & ~3U; // 4-bit image, round up to 32-bit boundary
unsigned image_height = height;
- image_data_8 reduced_image(image_width,image_height);
+ image_gray8 reduced_image(image_width,image_height);
reduce_4(image, reduced_image, trees, limits, TRANSPARENCY_LEVELS, alphaTable);
save_as_png(file,palette,reduced_image,width,height,4,alphaTable,opts);
}
@@ -600,11 +600,11 @@ void save_as_png8(T1 & file,
if (palette.size() > 16 )
{
// >16 && <=256 colors -> write 8-bit color depth
- image_data_8 reduced_image(width, height);
+ image_gray8 reduced_image(width, height);
for (unsigned y = 0; y < height; ++y)
{
- mapnik::image_data_32::pixel_type const * row = image.getRow(y);
- mapnik::image_data_8::pixel_type * row_out = reduced_image.getRow(y);
+ mapnik::image_rgba8::pixel_type const * row = image.get_row(y);
+ mapnik::image_gray8::pixel_type * row_out = reduced_image.get_row(y);
for (unsigned x = 0; x < width; ++x)
{
row_out[x] = tree.quantize(row[x]);
@@ -617,7 +617,7 @@ void save_as_png8(T1 & file,
// 1 color image -> write 1-bit color depth PNG
unsigned image_width = ((width + 15) >> 3) & ~1U; // 1-bit image, round up to 16-bit boundary
unsigned image_height = height;
- image_data_8 reduced_image(image_width, image_height);
+ image_gray8 reduced_image(image_width, image_height);
reduced_image.set(0);
save_as_png(file, palette, reduced_image, width, height, 1, alphaTable, opts);
}
@@ -626,12 +626,12 @@ void save_as_png8(T1 & file,
// <=16 colors -> write 4-bit color depth PNG
unsigned image_width = ((width + 7) >> 1) & ~3U; // 4-bit image, round up to 32-bit boundary
unsigned image_height = height;
- image_data_8 reduced_image(image_width, image_height);
+ image_gray8 reduced_image(image_width, image_height);
for (unsigned y = 0; y < height; ++y)
{
- mapnik::image_data_32::pixel_type const * row = image.getRow(y);
- mapnik::image_data_8::pixel_type * row_out = reduced_image.getRow(y);
- byte index = 0;
+ mapnik::image_rgba8::pixel_type const * row = image.get_row(y);
+ mapnik::image_gray8::pixel_type * row_out = reduced_image.get_row(y);
+ std::uint8_t index = 0;
for (unsigned x = 0; x < width; ++x)
{
@@ -669,7 +669,7 @@ void save_as_png8_hex(T1 & file,
for (unsigned y = 0; y < height; ++y)
{
- typename T2::pixel_type const * row = image.getRow(y);
+ typename T2::pixel_type const * row = image.get_row(y);
for (unsigned x = 0; x < width; ++x)
{
unsigned val = row[x];
diff --git a/include/mapnik/polygon_clipper.hpp b/include/mapnik/polygon_clipper.hpp
deleted file mode 100644
index a9384fc..0000000
--- a/include/mapnik/polygon_clipper.hpp
+++ /dev/null
@@ -1,283 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2013 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef MAPNIK_POLYGON_CLIPPER_HPP
-#define MAPNIK_POLYGON_CLIPPER_HPP
-
-// stl
-#include <iostream>
-#include <deque>
-
-// mapnik
-#include <mapnik/box2d.hpp>
-#include <mapnik/debug.hpp>
-#include <mapnik/geometry.hpp>
-
-// boost
-#include <boost/geometry.hpp>
-#include <boost/geometry/geometries/point_xy.hpp>
-#include <boost/geometry/geometries/box.hpp>
-#include <boost/geometry/geometries/polygon.hpp>
-#include <boost/geometry/geometries/register/point.hpp>
-
-BOOST_GEOMETRY_REGISTER_POINT_2D(mapnik::coord2d, double, cs::cartesian, x, y)
-
-// register mapnik::box2d<double>
-namespace boost { namespace geometry { namespace traits
-{
-
-template<> struct tag<mapnik::box2d<double> > { using type = box_tag; };
-
-template<> struct point_type<mapnik::box2d<double> > { using type = mapnik::coord2d; };
-
-template <>
-struct indexed_access<mapnik::box2d<double>, min_corner, 0>
-{
- using ct = coordinate_type<mapnik::coord2d>::type;
- static inline ct get(mapnik::box2d<double> const& b) { return b.minx();}
- static inline void set(mapnik::box2d<double> &b, ct const& value) { b.set_minx(value); }
-};
-
-template <>
-struct indexed_access<mapnik::box2d<double>, min_corner, 1>
-{
- using ct = coordinate_type<mapnik::coord2d>::type;
- static inline ct get(mapnik::box2d<double> const& b) { return b.miny();}
- static inline void set(mapnik::box2d<double> &b, ct const& value) { b.set_miny(value); }
-};
-
-template <>
-struct indexed_access<mapnik::box2d<double>, max_corner, 0>
-{
- using ct = coordinate_type<mapnik::coord2d>::type;
- static inline ct get(mapnik::box2d<double> const& b) { return b.maxx();}
- static inline void set(mapnik::box2d<double> &b, ct const& value) { b.set_maxx(value); }
-};
-
-template <>
-struct indexed_access<mapnik::box2d<double>, max_corner, 1>
-{
- using ct = coordinate_type<mapnik::coord2d>::type;
- static inline ct get(mapnik::box2d<double> const& b) { return b.maxy();}
- static inline void set(mapnik::box2d<double> &b , ct const& value) { b.set_maxy(value); }
-};
-
-}}}
-
-namespace mapnik {
-
-using namespace boost::geometry;
-
-template <typename Geometry>
-struct polygon_clipper
-{
- using point_2d = mapnik::coord2d;
- using polygon_2d = model::polygon<mapnik::coord2d>;
- using polygon_list = std::deque<polygon_2d>;
-
- enum
- {
- clip = 1,
- no_clip = 2,
- ignore = 3
-
- } state_;
-
- polygon_clipper(Geometry & geom)
- : state_(clip),
- clip_box_(),
- geom_(geom)
- {
-
- }
-
- polygon_clipper(box2d<double> const& clip_box, Geometry & geom)
- :state_(clip),
- clip_box_(clip_box),
- geom_(geom)
- {
- init();
- }
-
- void set_clip_box(box2d<double> const& clip_box)
- {
- state_ = clip;
- clip_box_ = clip_box;
- init();
- }
-
- unsigned type() const
- {
- return geom_.type();
- }
-
- void rewind(unsigned path_id)
- {
- if (state_ == clip) output_.rewind(path_id);
- else geom_.rewind(path_id);
- }
-
- unsigned vertex (double * x, double * y)
- {
- switch (state_)
- {
- case clip:
- return output_.vertex(x,y);
- case no_clip:
- return geom_.vertex(x,y);
- case ignore:
- return SEG_END;
- }
- return SEG_END;
- }
-
-private:
-
- void init()
- {
- geom_.rewind(0);
- box2d<double> bbox = geom_.envelope();
- if (clip_box_.contains(bbox))
- {
- // shortcut to original geometry (no-clipping)
- state_ = no_clip;
- return;
- }
- else if (!clip_box_.intersects(bbox))
- {
- // polygon is outside of clipping box
- state_ = ignore;
- return;
- }
-
- polygon_2d subject_poly;
- double x = 0;
- double y = 0;
- double prev_x = 0;
- double prev_y = 0;
- geom_.rewind(0);
- unsigned ring_count = 0;
- while (true)
- {
- unsigned cmd = geom_.vertex(&x,&y);
- if (cmd == SEG_END) break;
- if (cmd == SEG_MOVETO)
- {
- prev_x = x;
- prev_y = y;
- if (ring_count == 0)
- {
- append(subject_poly, make<point_2d>(x,y));
- }
- else
- {
- subject_poly.inners().push_back(polygon_2d::inner_container_type::value_type());
- append(subject_poly.inners().back(),make<point_2d>(x,y));
- }
- ++ring_count;
- }
- else if (cmd == SEG_LINETO)
- {
- if (std::abs(x - prev_x) < 1e-12 && std::abs(y - prev_y) < 1e-12)
- {
-#ifdef MAPNIK_LOG
- MAPNIK_LOG_WARN(polygon_clipper)
- << std::setprecision(12) << "coincident vertices:(" << prev_x << ","
- << prev_y << ") , (" << x << "," << y << ")";
-#endif
- continue;
- }
- prev_x = x;
- prev_y = y;
- if (ring_count == 1)
- {
- append(subject_poly, make<point_2d>(x,y));
- }
- else
- {
- append(subject_poly.inners().back(),make<point_2d>(x,y));
- }
- }
- }
-
- polygon_list clipped_polygons;
-#ifdef MAPNIK_LOG
- double area = boost::geometry::area(subject_poly);
- if (area < 0)
- {
- MAPNIK_LOG_ERROR(polygon_clipper) << "negative area detected for polygon indicating incorrect winding order";
- }
-#endif
- try
- {
- boost::geometry::intersection(clip_box_, subject_poly, clipped_polygons);
- }
- catch (boost::geometry::exception const& ex)
- {
- std::cerr << ex.what() << std::endl;
- }
-
- for (polygon_2d const& poly : clipped_polygons)
- {
- bool move_to = true;
- for (point_2d const& c : boost::geometry::exterior_ring(poly))
- {
- if (move_to)
- {
- move_to = false;
- output_.move_to(c.x,c.y);
- }
- else
- {
- output_.line_to(c.x,c.y);
- }
- }
- output_.close_path();
- // interior rings
- for (polygon_2d::inner_container_type::value_type const& ring : boost::geometry::interior_rings(poly))
- {
- move_to = true;
- for (point_2d const& c : ring)
- {
- if (move_to)
- {
- move_to = false;
- output_.move_to(c.x,c.y);
- }
- else
- {
- output_.line_to(c.x,c.y);
- }
- }
- output_.close_path();
- }
- }
- }
-
- box2d<double> clip_box_;
- Geometry & geom_;
- mapnik::geometry_type output_;
-
-};
-
-}
-
-#endif //MAPNIK_POLYGON_CLIPPER_HPP
diff --git a/include/mapnik/pool.hpp b/include/mapnik/pool.hpp
index 52147a5..59e8661 100644
--- a/include/mapnik/pool.hpp
+++ b/include/mapnik/pool.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,9 +24,8 @@
#define MAPNIK_POOL_HPP
// mapnik
-#include <mapnik/unique_lock.hpp>
#include <mapnik/utils.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// boost
#include <memory>
@@ -41,7 +40,7 @@
namespace mapnik
{
template <typename T,template <typename> class Creator>
-class Pool : private mapnik::noncopyable
+class Pool : private util::noncopyable
{
using HolderType = std::shared_ptr<T>;
using ContType = std::deque<HolderType>;
@@ -71,7 +70,7 @@ public:
HolderType borrowObject()
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
typename ContType::iterator itr=pool_.begin();
@@ -106,7 +105,7 @@ public:
unsigned size() const
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
return pool_.size();
}
@@ -114,7 +113,7 @@ public:
unsigned max_size() const
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
return maxSize_;
}
@@ -122,7 +121,7 @@ public:
void set_max_size(unsigned size)
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
maxSize_ = std::max(maxSize_,size);
}
@@ -130,7 +129,7 @@ public:
unsigned initial_size() const
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
return initialSize_;
}
@@ -138,7 +137,7 @@ public:
void set_initial_size(unsigned size)
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
if (size > initialSize_)
{
diff --git a/include/mapnik/proj_strategy.hpp b/include/mapnik/proj_strategy.hpp
new file mode 100644
index 0000000..69ef18a
--- /dev/null
+++ b/include/mapnik/proj_strategy.hpp
@@ -0,0 +1,149 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_PROJ_STRATEGY_HPP
+#define MAPNIK_PROJ_STRATEGY_HPP
+
+// mapnik
+#include <mapnik/config.hpp>
+#include <mapnik/util/noncopyable.hpp>
+#include <mapnik/proj_transform.hpp>
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wunused-local-typedef"
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/core/access.hpp>
+#include <boost/numeric/conversion/cast.hpp>
+#pragma GCC diagnostic pop
+
+
+namespace mapnik {
+
+namespace geometry {
+template <typename T> struct point;
+template <typename T> struct line_string;
+}
+class projection;
+template <typename T> class box2d;
+
+struct proj_strategy
+{
+ proj_strategy(proj_transform const& prj_trans)
+ : prj_trans_(prj_trans) {}
+
+ template <typename P1, typename P2>
+ inline bool apply(P1 const& p1, P2 & p2) const
+ {
+ using p2_type = typename boost::geometry::coordinate_type<P2>::type;
+ double x = boost::geometry::get<0>(p1);
+ double y = boost::geometry::get<1>(p1);
+ double z = 0.0;
+ if (!prj_trans_.forward(x, y, z)) return false;
+ try {
+ boost::geometry::set<0>(p2, boost::numeric_cast<p2_type>(x));
+ }
+ catch(boost::numeric::negative_overflow&)
+ {
+ boost::geometry::set<0>(p2, std::numeric_limits<p2_type>::min());
+ }
+ catch(boost::numeric::positive_overflow&)
+ {
+ boost::geometry::set<0>(p2, std::numeric_limits<p2_type>::max());
+ }
+ try {
+ boost::geometry::set<1>(p2, boost::numeric_cast<p2_type>(y));
+ }
+ catch(boost::numeric::negative_overflow&)
+ {
+ boost::geometry::set<1>(p2, std::numeric_limits<p2_type>::min());
+ }
+ catch(boost::numeric::positive_overflow&)
+ {
+ boost::geometry::set<1>(p2, std::numeric_limits<p2_type>::max());
+ }
+ return true;
+ }
+
+ template <typename P1, typename P2>
+ inline P2 execute(P1 const& p1, bool & status) const
+ {
+ P2 p2;
+ status = apply(p1, p2);
+ return p2;
+ }
+
+ proj_transform const& prj_trans_;
+};
+
+struct proj_backward_strategy
+{
+ proj_backward_strategy(proj_transform const& prj_trans)
+ : prj_trans_(prj_trans) {}
+
+ template <typename P1, typename P2>
+ inline bool apply(P1 const& p1, P2 & p2) const
+ {
+ using p2_type = typename boost::geometry::coordinate_type<P2>::type;
+ double x = boost::geometry::get<0>(p1);
+ double y = boost::geometry::get<1>(p1);
+ double z = 0.0;
+ if (!prj_trans_.backward(x, y, z)) return false;
+ try {
+ boost::geometry::set<0>(p2, boost::numeric_cast<p2_type>(x));
+ }
+ catch(boost::numeric::negative_overflow&)
+ {
+ boost::geometry::set<0>(p2, std::numeric_limits<p2_type>::min());
+ }
+ catch(boost::numeric::positive_overflow&)
+ {
+ boost::geometry::set<0>(p2, std::numeric_limits<p2_type>::max());
+ }
+ try {
+ boost::geometry::set<1>(p2, boost::numeric_cast<p2_type>(y));
+ }
+ catch(boost::numeric::negative_overflow&)
+ {
+ boost::geometry::set<1>(p2, std::numeric_limits<p2_type>::min());
+ }
+ catch(boost::numeric::positive_overflow&)
+ {
+ boost::geometry::set<1>(p2, std::numeric_limits<p2_type>::max());
+ }
+ return true;
+ }
+
+ template <typename P1, typename P2>
+ inline P2 execute(P1 const& p1, bool & status) const
+ {
+ P2 p2;
+ status = apply(p1, p2);
+ return p2;
+ }
+
+ proj_transform const& prj_trans_;
+};
+
+}
+
+#endif // MAPNIK_PROJ_STRATEGY_HPP
diff --git a/include/mapnik/proj_transform.hpp b/include/mapnik/proj_transform.hpp
index b15eaa0..fa27b63 100644
--- a/include/mapnik/proj_transform.hpp
+++ b/include/mapnik/proj_transform.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,24 +25,33 @@
// mapnik
#include <mapnik/config.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
namespace mapnik {
+namespace geometry {
+template <typename T> struct point;
+template <typename T> struct line_string;
+}
class projection;
template <typename T> class box2d;
-class MAPNIK_DECL proj_transform : private mapnik::noncopyable
+class MAPNIK_DECL proj_transform : private util::noncopyable
{
public:
proj_transform(projection const& source,
projection const& dest);
bool equal() const;
+ bool is_known() const;
bool forward (double& x, double& y , double& z) const;
bool backward (double& x, double& y , double& z) const;
- bool forward (double *x, double *y , double *z, int point_count) const;
- bool backward (double *x, double *y , double *z, int point_count) const;
+ bool forward (double *x, double *y , double *z, int point_count, int offset = 1) const;
+ bool backward (double *x, double *y , double *z, int point_count, int offset = 1) const;
+ bool forward (geometry::point<double> & p) const;
+ bool backward (geometry::point<double> & p) const;
+ unsigned int forward (geometry::line_string<double> & ls) const;
+ unsigned int backward (geometry::line_string<double> & ls) const;
bool forward (box2d<double> & box) const;
bool backward (box2d<double> & box) const;
bool forward (box2d<double> & box, int points) const;
@@ -59,6 +68,7 @@ private:
bool wgs84_to_merc_;
bool merc_to_wgs84_;
};
+
}
#endif // MAPNIK_PROJ_TRANSFORM_HPP
diff --git a/include/mapnik/projection.hpp b/include/mapnik/projection.hpp
index 238280a..5267dd7 100644
--- a/include/mapnik/projection.hpp
+++ b/include/mapnik/projection.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/ptree_helpers.hpp b/include/mapnik/ptree_helpers.hpp
index dece130..fe1a1de 100644
--- a/include/mapnik/ptree_helpers.hpp
+++ b/include/mapnik/ptree_helpers.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/quad_tree.hpp b/include/mapnik/quad_tree.hpp
index 5af4c61..d8d4054 100644
--- a/include/mapnik/quad_tree.hpp
+++ b/include/mapnik/quad_tree.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,7 @@
// mapnik
#include <mapnik/box2d.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// boost
#pragma GCC diagnostic push
@@ -41,7 +41,7 @@
namespace mapnik
{
template <typename T>
-class quad_tree : mapnik::noncopyable
+class quad_tree : util::noncopyable
{
struct node
{
diff --git a/include/mapnik/query.hpp b/include/mapnik/query.hpp
index d746089..4c9455e 100644
--- a/include/mapnik/query.hpp
+++ b/include/mapnik/query.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/raster.hpp b/include/mapnik/raster.hpp
index 5cde2f6..a4b26cb 100644
--- a/include/mapnik/raster.hpp
+++ b/include/mapnik/raster.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,30 +25,29 @@
// mapnik
#include <mapnik/box2d.hpp>
-#include <mapnik/image_data.hpp>
-#include <mapnik/noncopyable.hpp>
-
+#include <mapnik/image_any.hpp>
+#include <mapnik/util/noncopyable.hpp>
+#include <mapnik/util/variant.hpp>
// boost
#include <boost/optional.hpp>
namespace mapnik {
-class raster : private mapnik::noncopyable
+
+class raster : private util::noncopyable
{
public:
box2d<double> ext_;
- image_data_32 data_;
+ image_any data_;
double filter_factor_;
- bool premultiplied_alpha_;
boost::optional<double> nodata_;
+
+ template <typename ImageData>
raster(box2d<double> const& ext,
- unsigned width,
- unsigned height,
- double filter_factor,
- bool premultiplied_alpha = false)
+ ImageData && data,
+ double filter_factor)
: ext_(ext),
- data_(width,height),
- filter_factor_(filter_factor),
- premultiplied_alpha_(premultiplied_alpha) {}
+ data_(std::move(data)),
+ filter_factor_(filter_factor) {}
void set_nodata(double nodata)
{
diff --git a/include/mapnik/raster_colorizer.hpp b/include/mapnik/raster_colorizer.hpp
index 63397b1..63e2d07 100644
--- a/include/mapnik/raster_colorizer.hpp
+++ b/include/mapnik/raster_colorizer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -40,7 +40,9 @@
#include <mapnik/config.hpp>
#include <mapnik/color.hpp>
#include <mapnik/enumeration.hpp>
-
+#include <mapnik/image.hpp>
+ // boost
+#include <boost/optional.hpp>
// boost
#include <memory>
@@ -55,7 +57,7 @@ class raster;
//! \brief Enumerates the modes of interpolation
-enum colorizer_mode_enum
+enum colorizer_mode_enum : std::uint8_t
{
COLORIZER_INHERIT = 0, //!< The stop inherits the mode from the colorizer
COLORIZER_LINEAR = 1, //!< Linear interpolation between colors
@@ -195,12 +197,8 @@ public:
//! \return The list of stops
colorizer_stops const& get_stops() const { return stops_; }
-
- //! \brief Colorize a raster
- //!
- //! \param[in, out] raster A raster stored in float32 single channel format, which gets colorized in place.
- void colorize(std::shared_ptr<raster> const& raster, feature_impl const& f) const;
-
+ template <typename T>
+ void colorize(image_rgba8 & out, T const& in, boost::optional<double>const& nodata, feature_impl const& f) const;
//! \brief Perform the translation of input to output
//!
diff --git a/include/mapnik/renderer_common.hpp b/include/mapnik/renderer_common.hpp
index 45b70f8..ab74956 100644
--- a/include/mapnik/renderer_common.hpp
+++ b/include/mapnik/renderer_common.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -28,7 +28,7 @@
#include <mapnik/box2d.hpp> // for box2d
#include <mapnik/view_transform.hpp> // for view_transform
#include <mapnik/attribute.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// fwd declarations to speed up compile
namespace mapnik {
@@ -40,7 +40,7 @@ namespace mapnik {
namespace mapnik {
-struct renderer_common : private mapnik::noncopyable
+struct renderer_common : private util::noncopyable
{
renderer_common(Map const &m, attributes const& vars, unsigned offset_x, unsigned offset_y,
unsigned width, unsigned height, double scale_factor);
diff --git a/include/mapnik/renderer_common/apply_vertex_converter.hpp b/include/mapnik/renderer_common/apply_vertex_converter.hpp
new file mode 100644
index 0000000..de239c9
--- /dev/null
+++ b/include/mapnik/renderer_common/apply_vertex_converter.hpp
@@ -0,0 +1,44 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_APPLY_VERTEX_ADAPTER_HPP
+#define MAPNIK_APPLY_VERTEX_ADAPTER_HPP
+
+namespace mapnik { namespace detail {
+
+template <typename VertexConverter, typename Processor>
+struct apply_vertex_converter
+{
+ apply_vertex_converter(VertexConverter & converter, Processor & proc)
+ : converter_(converter), proc_(proc) {}
+ template <typename Adapter>
+ void operator() (Adapter const& adapter) const
+ {
+ converter_.apply(adapter, proc_);
+ }
+ VertexConverter & converter_;
+ Processor & proc_;
+};
+
+}}
+
+#endif // MAPNIK_APPLY_VERTEX_ADAPTER_HPP
diff --git a/include/mapnik/renderer_common/pattern_alignment.hpp b/include/mapnik/renderer_common/pattern_alignment.hpp
new file mode 100644
index 0000000..53084b8
--- /dev/null
+++ b/include/mapnik/renderer_common/pattern_alignment.hpp
@@ -0,0 +1,68 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+
+#ifndef MAPNIK_PATTERN_ALIGNMENT_HPP
+#define MAPNIK_PATTERN_ALIGNMENT_HPP
+
+#include <mapnik/geometry.hpp>
+
+namespace mapnik { namespace detail {
+
+struct apply_local_alignment
+{
+ apply_local_alignment(view_transform const& t,
+ proj_transform const& prj_trans,
+ box2d<double> const& clip_box,
+ double & x, double & y)
+ : t_(t),
+ prj_trans_(prj_trans),
+ clip_box_(clip_box),
+ x_(x),
+ y_(y) {}
+
+ void operator() (geometry::polygon_vertex_adapter<double> & va)
+ {
+ using clipped_geometry_type = agg::conv_clip_polygon<geometry::polygon_vertex_adapter<double> >;
+ using path_type = transform_path_adapter<view_transform,clipped_geometry_type>;
+ clipped_geometry_type clipped(va);
+ clipped.clip_box(clip_box_.minx(),clip_box_.miny(),clip_box_.maxx(),clip_box_.maxy());
+ path_type path(t_, clipped, prj_trans_);
+ path.vertex(&x_,&y_);
+ }
+
+ template <typename Adapter>
+ void operator() (Adapter & va)
+ {
+ // no-op
+ }
+
+ view_transform const& t_;
+ proj_transform const& prj_trans_;
+ box2d<double> const& clip_box_;
+ double & x_;
+ double & y_;
+};
+
+}}
+
+#endif // MAPNIK_PATTERN_ALIGNMENT_HPP
diff --git a/include/mapnik/renderer_common/process_building_symbolizer.hpp b/include/mapnik/renderer_common/process_building_symbolizer.hpp
index e4e8ab7..809d36a 100644
--- a/include/mapnik/renderer_common/process_building_symbolizer.hpp
+++ b/include/mapnik/renderer_common/process_building_symbolizer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,88 +25,107 @@
#include <mapnik/segment.hpp>
#include <mapnik/feature.hpp>
-#include <mapnik/geometry.hpp>
+#include <mapnik/vertex_adapters.hpp>
+#include <mapnik/path.hpp>
#include <algorithm>
#include <deque>
namespace mapnik {
+namespace detail {
+
template <typename F1, typename F2, typename F3>
-void render_building_symbolizer(mapnik::feature_impl &feature,
- double height,
- F1 face_func, F2 frame_func, F3 roof_func)
+void make_building(geometry::polygon<double> const& poly, double height, F1 const& face_func, F2 const& frame_func, F3 const& roof_func)
{
- for (auto const& geom : feature.paths())
+ const std::unique_ptr<path_type> frame(new path_type(path_type::types::LineString));
+ const std::unique_ptr<path_type> roof(new path_type(path_type::types::Polygon));
+ std::deque<segment_t> face_segments;
+ double x0 = 0;
+ double y0 = 0;
+ double x,y;
+ geometry::polygon_vertex_adapter<double> va(poly);
+ va.rewind(0);
+ for (unsigned cm = va.vertex(&x, &y); cm != SEG_END;
+ cm = va.vertex(&x, &y))
{
- if (geom.size() > 2)
+ if (cm == SEG_MOVETO)
+ {
+ frame->move_to(x,y);
+ }
+ else if (cm == SEG_LINETO)
+ {
+ frame->line_to(x,y);
+ face_segments.push_back(segment_t(x0,y0,x,y));
+ }
+ else if (cm == SEG_CLOSE)
{
- const std::unique_ptr<geometry_type> frame(new geometry_type(geometry_type::types::LineString));
- const std::unique_ptr<geometry_type> roof(new geometry_type(geometry_type::types::Polygon));
- std::deque<segment_t> face_segments;
- double x0 = 0;
- double y0 = 0;
- double x,y;
- geom.rewind(0);
- for (unsigned cm = geom.vertex(&x, &y); cm != SEG_END;
- cm = geom.vertex(&x, &y))
- {
- if (cm == SEG_MOVETO)
- {
- frame->move_to(x,y);
- }
- else if (cm == SEG_LINETO)
- {
- frame->line_to(x,y);
- face_segments.push_back(segment_t(x0,y0,x,y));
- }
- else if (cm == SEG_CLOSE)
- {
- frame->close_path();
- }
- x0 = x;
- y0 = y;
- }
+ frame->close_path();
+ }
+ x0 = x;
+ y0 = y;
+ }
+
+ std::sort(face_segments.begin(),face_segments.end(), y_order);
+ for (auto const& seg : face_segments)
+ {
+ const std::unique_ptr<path_type> faces(new path_type(path_type::types::Polygon));
+ faces->move_to(std::get<0>(seg),std::get<1>(seg));
+ faces->line_to(std::get<2>(seg),std::get<3>(seg));
+ faces->line_to(std::get<2>(seg),std::get<3>(seg) + height);
+ faces->line_to(std::get<0>(seg),std::get<1>(seg) + height);
- std::sort(face_segments.begin(),face_segments.end(), y_order);
- for (auto const& seg : face_segments)
- {
- const std::unique_ptr<geometry_type> faces(new geometry_type(geometry_type::types::Polygon));
- faces->move_to(std::get<0>(seg),std::get<1>(seg));
- faces->line_to(std::get<2>(seg),std::get<3>(seg));
- faces->line_to(std::get<2>(seg),std::get<3>(seg) + height);
- faces->line_to(std::get<0>(seg),std::get<1>(seg) + height);
+ face_func(*faces);
+ //
+ frame->move_to(std::get<0>(seg),std::get<1>(seg));
+ frame->line_to(std::get<0>(seg),std::get<1>(seg)+height);
+ }
+
+ va.rewind(0);
+ for (unsigned cm = va.vertex(&x, &y); cm != SEG_END;
+ cm = va.vertex(&x, &y))
+ {
+ if (cm == SEG_MOVETO)
+ {
+ frame->move_to(x,y+height);
+ roof->move_to(x,y+height);
+ }
+ else if (cm == SEG_LINETO)
+ {
+ frame->line_to(x,y+height);
+ roof->line_to(x,y+height);
+ }
+ else if (cm == SEG_CLOSE)
+ {
+ frame->close_path();
+ roof->close_path();
+ }
+ }
- face_func(*faces);
- //
- frame->move_to(std::get<0>(seg),std::get<1>(seg));
- frame->line_to(std::get<0>(seg),std::get<1>(seg)+height);
+ frame_func(*frame);
+ roof_func(*roof);
+}
- }
+} // ns detail
- geom.rewind(0);
- for (unsigned cm = geom.vertex(&x, &y); cm != SEG_END;
- cm = geom.vertex(&x, &y))
- {
- if (cm == SEG_MOVETO)
- {
- frame->move_to(x,y+height);
- roof->move_to(x,y+height);
- }
- else if (cm == SEG_LINETO)
- {
- frame->line_to(x,y+height);
- roof->line_to(x,y+height);
- }
- else if (cm == SEG_CLOSE)
- {
- frame->close_path();
- roof->close_path();
- }
- }
+template <typename F1, typename F2, typename F3>
+void render_building_symbolizer(mapnik::feature_impl const& feature,
+ double height,
+ F1 face_func, F2 frame_func, F3 roof_func)
+{
- frame_func(*frame);
- roof_func(*roof);
+ auto const& geom = feature.get_geometry();
+ if (geom.is<geometry::polygon<double> >())
+ {
+ auto const& poly = geom.get<geometry::polygon<double> >();
+ detail::make_building(poly, height, face_func, frame_func, roof_func);
+ }
+ else if (geom.is<geometry::multi_polygon<double> >())
+ {
+ auto const& multi_poly = geom.get<geometry::multi_polygon<double> >();
+ for (auto const& poly : multi_poly)
+ {
+ detail::make_building(poly, height, face_func, frame_func, roof_func);
}
}
}
diff --git a/include/mapnik/renderer_common/process_group_symbolizer.hpp b/include/mapnik/renderer_common/process_group_symbolizer.hpp
index 59f9116..c072ca5 100644
--- a/include/mapnik/renderer_common/process_group_symbolizer.hpp
+++ b/include/mapnik/renderer_common/process_group_symbolizer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,7 @@
// mapnik
#include <mapnik/pixel_position.hpp>
-#include <mapnik/marker_cache.hpp>
+#include <mapnik/marker.hpp>
#include <mapnik/feature.hpp>
#include <mapnik/feature_factory.hpp>
#include <mapnik/renderer_common.hpp>
@@ -38,7 +38,9 @@
#include <mapnik/util/conversions.hpp>
#include <mapnik/util/variant.hpp>
#include <mapnik/label_collision_detector.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+#include <mapnik/svg/svg_path_attributes.hpp>
// agg
#include <agg_trans_affine.h>
@@ -49,9 +51,11 @@ class proj_transform;
struct glyph_info;
class text_symbolizer_helper;
-struct virtual_renderer_common : private mapnik::noncopyable
-{
+using svg::svg_path_adapter;
+using svg_attribute_type = agg::pod_bvector<svg::path_attributes>;
+struct virtual_renderer_common : private util::noncopyable
+{
virtual_renderer_common(renderer_common & common) :
width_(common.width_),
height_(common.height_),
@@ -97,28 +101,56 @@ struct virtual_renderer_common : private mapnik::noncopyable
// stores all the arguments necessary to re-render this point
// symbolizer at a later time.
-struct point_render_thunk : noncopyable
+struct vector_marker_render_thunk : util::noncopyable
+{
+ svg_path_ptr src_;
+ svg_attribute_type attrs_;
+ agg::trans_affine tr_;
+ double opacity_;
+ composite_mode_e comp_op_;
+ bool snap_to_pixels_;
+
+ vector_marker_render_thunk(svg_path_ptr const& src,
+ svg_attribute_type const& attrs,
+ agg::trans_affine const& marker_trans,
+ double opacity,
+ composite_mode_e comp_op,
+ bool snap_to_pixels);
+
+ vector_marker_render_thunk(vector_marker_render_thunk && rhs)
+ : src_(std::move(rhs.src_)),
+ attrs_(std::move(rhs.attrs_)),
+ tr_(std::move(rhs.tr_)),
+ opacity_(std::move(rhs.opacity_)),
+ comp_op_(std::move(rhs.comp_op_)),
+ snap_to_pixels_(std::move(rhs.snap_to_pixels_)) {}
+};
+
+struct raster_marker_render_thunk : util::noncopyable
{
- pixel_position pos_;
- marker_ptr marker_;
+ image_rgba8 const& src_;
agg::trans_affine tr_;
double opacity_;
composite_mode_e comp_op_;
+ bool snap_to_pixels_;
+
+ raster_marker_render_thunk(image_rgba8 const& src,
+ agg::trans_affine const& marker_trans,
+ double opacity,
+ composite_mode_e comp_op,
+ bool snap_to_pixels);
- point_render_thunk(pixel_position const& pos, marker const& m,
- agg::trans_affine const& tr, double opacity,
- composite_mode_e comp_op);
- point_render_thunk(point_render_thunk && rhs)
- : pos_(std::move(rhs.pos_)),
- marker_(std::move(rhs.marker_)),
+ raster_marker_render_thunk(raster_marker_render_thunk && rhs)
+ : src_(rhs.src_),
tr_(std::move(rhs.tr_)),
opacity_(std::move(rhs.opacity_)),
- comp_op_(std::move(rhs.comp_op_)) {}
+ comp_op_(std::move(rhs.comp_op_)),
+ snap_to_pixels_(std::move(rhs.snap_to_pixels_)) {}
};
using helper_ptr = std::unique_ptr<text_symbolizer_helper>;
-struct text_render_thunk : noncopyable
+struct text_render_thunk : util::noncopyable
{
// helper is stored here in order
// to keep in scope the text rendering structures
@@ -131,6 +163,7 @@ struct text_render_thunk : noncopyable
text_render_thunk(helper_ptr && helper,
double opacity, composite_mode_e comp_op,
halo_rasterizer_enum halo_rasterizer);
+
text_render_thunk(text_render_thunk && rhs)
: helper_(std::move(rhs.helper_)),
placements_(std::move(rhs.placements_)),
@@ -143,7 +176,8 @@ struct text_render_thunk : noncopyable
// Variant type for render thunks to allow us to re-render them
// via a static visitor later.
-using render_thunk = util::variant<point_render_thunk,
+using render_thunk = util::variant<vector_marker_render_thunk,
+ raster_marker_render_thunk,
text_render_thunk>;
using render_thunk_ptr = std::unique_ptr<render_thunk>;
using render_thunk_list = std::list<render_thunk_ptr>;
@@ -154,7 +188,7 @@ using render_thunk_list = std::list<render_thunk_ptr>;
// The bounding boxes can be used for layout, and the thunks are
// used to re-render at locations according to the group layout.
-struct render_thunk_extractor : public util::static_visitor<>
+struct render_thunk_extractor
{
render_thunk_extractor(box2d<double> & box,
render_thunk_list & thunks,
@@ -164,7 +198,7 @@ struct render_thunk_extractor : public util::static_visitor<>
virtual_renderer_common & common,
box2d<double> const& clipping_extent);
- void operator()(point_symbolizer const& sym) const;
+ void operator()(markers_symbolizer const& sym) const;
void operator()(text_symbolizer const& sym) const;
@@ -190,9 +224,6 @@ private:
void update_box() const;
};
-geometry_type *origin_point(proj_transform const& prj_trans,
- renderer_common const& common);
-
template <typename F>
void render_offset_placements(placements_list const& placements,
pixel_position const& offset,
@@ -205,7 +236,7 @@ void render_offset_placements(placements_list const& placements,
glyphs->set_base_point(base_point + offset);
// update the position of any marker
- marker_info_ptr marker_info = glyphs->marker();
+ marker_info_ptr marker_info = glyphs->get_marker();
pixel_position marker_pos = glyphs->marker_pos();
if (marker_info)
{
@@ -304,8 +335,15 @@ void render_group_symbolizer(group_symbolizer const& sym,
}
// add a single point geometry at pixel origin
- sub_feature->add_geometry(origin_point(prj_trans, common));
-
+ double x = common.width_ / 2.0, y = common.height_ / 2.0, z = 0.0;
+ common.t_.backward(&x, &y);
+ prj_trans.forward(x, y, z);
+ // note that we choose a point in the middle of the screen to
+ // try to ensure that we don't get edge artefacts due to any
+ // symbolizers with avoid-edges set: only the avoid-edges of
+ // the group symbolizer itself should matter.
+ geometry::point<double> origin_pt(x,y);
+ sub_feature->set_geometry(origin_pt);
// get the layout for this set of properties
for (auto const& rule : props->get_rules())
{
diff --git a/include/mapnik/renderer_common/process_markers_symbolizer.hpp b/include/mapnik/renderer_common/process_markers_symbolizer.hpp
index 6251ee2..3bc1f31 100644
--- a/include/mapnik/renderer_common/process_markers_symbolizer.hpp
+++ b/include/mapnik/renderer_common/process_markers_symbolizer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,186 +23,250 @@
#ifndef MAPNIK_RENDERER_COMMON_PROCESS_MARKERS_SYMBOLIZER_HPP
#define MAPNIK_RENDERER_COMMON_PROCESS_MARKERS_SYMBOLIZER_HPP
-#include <mapnik/renderer_common.hpp>
#include <mapnik/svg/svg_storage.hpp>
#include <mapnik/svg/svg_path_adapter.hpp>
#include <mapnik/vertex_converters.hpp>
#include <mapnik/marker_cache.hpp>
#include <mapnik/marker_helpers.hpp>
+#include <mapnik/geometry_type.hpp>
namespace mapnik {
-template <typename T0, typename T1, typename T2>
-void render_markers_symbolizer(markers_symbolizer const& sym,
- mapnik::feature_impl & feature,
- proj_transform const& prj_trans,
- renderer_common const& common,
- box2d<double> const& clip_box,
- T2 const& renderer_context)
+template <typename VD, typename RD, typename RendererType, typename ContextType>
+struct render_marker_symbolizer_visitor
{
- using namespace mapnik::svg;
- using vector_dispatch_type = T0;
- using raster_dispatch_type = T1;
+ using vector_dispatch_type = VD;
+ using raster_dispatch_type = RD;
+ using buffer_type = typename std::tuple_element<0,ContextType>::type;
- std::string filename = get<std::string>(sym, keys::file, feature, common.vars_, "shape://ellipse");
- bool clip = get<value_bool, keys::clip>(sym, feature, common.vars_);
- double offset = get<value_double, keys::offset>(sym, feature, common.vars_);
- double simplify_tolerance = get<value_double, keys::simplify_tolerance>(sym, feature, common.vars_);
- double smooth = get<value_double, keys::smooth>(sym, feature, common.vars_);
+ using vertex_converter_type = vertex_converter<clip_line_tag,
+ clip_poly_tag,
+ transform_tag,
+ affine_transform_tag,
+ simplify_tag,
+ smooth_tag,
+ offset_transform_tag>;
- // https://github.com/mapnik/mapnik/issues/1316
- bool snap_to_pixels = !mapnik::marker_cache::instance().is_uri(filename);
- if (!filename.empty())
+ render_marker_symbolizer_visitor(std::string const& filename,
+ markers_symbolizer const& sym,
+ mapnik::feature_impl & feature,
+ proj_transform const& prj_trans,
+ RendererType const& common,
+ box2d<double> const& clip_box,
+ ContextType const& renderer_context)
+ : filename_(filename),
+ sym_(sym),
+ feature_(feature),
+ prj_trans_(prj_trans),
+ common_(common),
+ clip_box_(clip_box),
+ renderer_context_(renderer_context) {}
+
+ void operator() (marker_null const&) {}
+
+ void operator() (marker_svg const& mark)
{
- boost::optional<marker_ptr> mark = mapnik::marker_cache::instance().find(filename, true);
- if (mark && *mark)
+ using namespace mapnik::svg;
+ bool clip = get<value_bool, keys::clip>(sym_, feature_, common_.vars_);
+ double offset = get<value_double, keys::offset>(sym_, feature_, common_.vars_);
+ double simplify_tolerance = get<value_double, keys::simplify_tolerance>(sym_, feature_, common_.vars_);
+ double smooth = get<value_double, keys::smooth>(sym_, feature_, common_.vars_);
+
+ // https://github.com/mapnik/mapnik/issues/1316
+ bool snap_to_pixels = !mapnik::marker_cache::instance().is_uri(filename_);
+
+ agg::trans_affine geom_tr;
+ auto transform = get_optional<transform_type>(sym_, keys::geometry_transform);
+ if (transform) evaluate_transform(geom_tr, feature_, common_.vars_, *transform, common_.scale_factor_);
+ agg::trans_affine image_tr = agg::trans_affine_scaling(common_.scale_factor_);
+
+ boost::optional<svg_path_ptr> const& stock_vector_marker = mark.get_data();
+
+ // special case for simple ellipse markers
+ // to allow for full control over rx/ry dimensions
+ if (filename_ == "shape://ellipse"
+ && (has_key(sym_,keys::width) || has_key(sym_,keys::height)))
{
- agg::trans_affine geom_tr;
- auto transform = get_optional<transform_type>(sym, keys::geometry_transform);
- if (transform) evaluate_transform(geom_tr, feature, common.vars_, *transform, common.scale_factor_);
- agg::trans_affine image_tr = agg::trans_affine_scaling(common.scale_factor_);
+ svg_path_ptr marker_ellipse = std::make_shared<svg_storage_type>();
+ vertex_stl_adapter<svg_path_storage> stl_storage(marker_ellipse->source());
+ svg_path_adapter svg_path(stl_storage);
+ build_ellipse(sym_, feature_, common_.vars_, *marker_ellipse, svg_path);
+ svg_attribute_type attributes;
+ bool result = push_explicit_style( (*stock_vector_marker)->attributes(), attributes, sym_, feature_, common_.vars_);
+ auto image_transform = get_optional<transform_type>(sym_, keys::image_transform);
+ if (image_transform) evaluate_transform(image_tr, feature_, common_.vars_, *image_transform);
+ vector_dispatch_type rasterizer_dispatch(marker_ellipse,
+ svg_path,
+ result ? attributes : (*stock_vector_marker)->attributes(),
+ image_tr,
+ sym_,
+ *common_.detector_,
+ common_.scale_factor_,
+ feature_,
+ common_.vars_,
+ snap_to_pixels,
+ renderer_context_);
- if ((*mark)->is_vector())
+ vertex_converter_type converter(clip_box_,
+ sym_,
+ common_.t_,
+ prj_trans_,
+ geom_tr,
+ feature_,
+ common_.vars_,
+ common_.scale_factor_);
+ if (clip) // optional clip (default: true)
{
- boost::optional<svg_path_ptr> const& stock_vector_marker = (*mark)->get_vector_data();
-
- // special case for simple ellipse markers
- // to allow for full control over rx/ry dimensions
- if (filename == "shape://ellipse"
- && (has_key(sym,keys::width) || has_key(sym,keys::height)))
- {
- svg_storage_type marker_ellipse;
- vertex_stl_adapter<svg_path_storage> stl_storage(marker_ellipse.source());
- svg_path_adapter svg_path(stl_storage);
- build_ellipse(sym, feature, common.vars_, marker_ellipse, svg_path);
- svg_attribute_type attributes;
- bool result = push_explicit_style( (*stock_vector_marker)->attributes(), attributes, sym, feature, common.vars_);
- auto image_transform = get_optional<transform_type>(sym, keys::image_transform);
- if (image_transform) evaluate_transform(image_tr, feature, common.vars_, *image_transform);
- box2d<double> bbox = marker_ellipse.bounding_box();
- vector_dispatch_type rasterizer_dispatch(svg_path,
- result ? attributes : (*stock_vector_marker)->attributes(),
- bbox,
- image_tr,
- sym,
- *common.detector_,
- common.scale_factor_,
- feature,
- common.vars_,
- snap_to_pixels,
- renderer_context);
-
- using vertex_converter_type = vertex_converter<vector_dispatch_type,clip_line_tag,
- clip_poly_tag,
- transform_tag,
- affine_transform_tag,
- simplify_tag, smooth_tag,
- offset_transform_tag>;
- vertex_converter_type converter(clip_box, rasterizer_dispatch, sym,common.t_,prj_trans,geom_tr,feature,common.vars_,common.scale_factor_);
- if (clip && feature.paths().size() > 0) // optional clip (default: true)
- {
- geometry_type::types type = feature.paths()[0].type();
- if (type == geometry_type::types::Polygon)
- converter.template set<clip_poly_tag>();
- else if (type == geometry_type::types::LineString)
- converter.template set<clip_line_tag>();
- }
- converter.template set<transform_tag>(); //always transform
- if (std::fabs(offset) > 0.0) converter.template set<offset_transform_tag>(); // parallel offset
- converter.template set<affine_transform_tag>(); // optional affine transform
- if (simplify_tolerance > 0.0) converter.template set<simplify_tag>(); // optional simplify converter
- if (smooth > 0.0) converter.template set<smooth_tag>(); // optional smooth converter
- apply_markers_multi(feature, common.vars_, converter, sym);
- }
- else
- {
- box2d<double> const& bbox = (*mark)->bounding_box();
- setup_transform_scaling(image_tr, bbox.width(), bbox.height(), feature, common.vars_, sym);
- auto image_transform = get_optional<transform_type>(sym, keys::image_transform);
- if (image_transform) evaluate_transform(image_tr, feature, common.vars_, *image_transform);
- vertex_stl_adapter<svg_path_storage> stl_storage((*stock_vector_marker)->source());
- svg_path_adapter svg_path(stl_storage);
- svg_attribute_type attributes;
- bool result = push_explicit_style( (*stock_vector_marker)->attributes(), attributes, sym, feature, common.vars_);
- vector_dispatch_type rasterizer_dispatch(svg_path,
- result ? attributes : (*stock_vector_marker)->attributes(),
- bbox,
- image_tr,
- sym,
- *common.detector_,
- common.scale_factor_,
- feature,
- common.vars_,
- snap_to_pixels,
- renderer_context);
-
- using vertex_converter_type = vertex_converter<vector_dispatch_type,clip_line_tag,
- clip_poly_tag,
- transform_tag,
- affine_transform_tag,
- simplify_tag, smooth_tag,
- offset_transform_tag>;
- vertex_converter_type converter(clip_box, rasterizer_dispatch, sym,common.t_,prj_trans,geom_tr,feature,common.vars_,common.scale_factor_);
- if (clip && feature.paths().size() > 0) // optional clip (default: true)
- {
- geometry_type::types type = feature.paths()[0].type();
- if (type == geometry_type::types::Polygon)
- converter.template set<clip_poly_tag>();
- else if (type == geometry_type::types::LineString)
- converter.template set<clip_line_tag>();
- }
- converter.template set<transform_tag>(); //always transform
- if (std::fabs(offset) > 0.0) converter.template set<offset_transform_tag>(); // parallel offset
- converter.template set<affine_transform_tag>(); // optional affine transform
- if (simplify_tolerance > 0.0) converter.template set<simplify_tag>(); // optional simplify converter
- if (smooth > 0.0) converter.template set<smooth_tag>(); // optional smooth converter
- apply_markers_multi(feature, common.vars_, converter, sym);
- }
+ geometry::geometry_types type = geometry::geometry_type(feature_.get_geometry());
+ if (type == geometry::geometry_types::Polygon)
+ converter.template set<clip_poly_tag>();
+ else if (type == geometry::geometry_types::LineString)
+ converter.template set<clip_line_tag>();
}
- else // raster markers
+
+ converter.template set<transform_tag>(); //always transform
+ if (std::fabs(offset) > 0.0) converter.template set<offset_transform_tag>(); // parallel offset
+ converter.template set<affine_transform_tag>(); // optional affine transform
+ if (simplify_tolerance > 0.0) converter.template set<simplify_tag>(); // optional simplify converter
+ if (smooth > 0.0) converter.template set<smooth_tag>(); // optional smooth converter
+ apply_markers_multi(feature_, common_.vars_, converter, rasterizer_dispatch, sym_);
+ }
+ else
+ {
+ box2d<double> const& bbox = mark.bounding_box();
+ setup_transform_scaling(image_tr, bbox.width(), bbox.height(), feature_, common_.vars_, sym_);
+ auto image_transform = get_optional<transform_type>(sym_, keys::image_transform);
+ if (image_transform) evaluate_transform(image_tr, feature_, common_.vars_, *image_transform);
+ vertex_stl_adapter<svg_path_storage> stl_storage((*stock_vector_marker)->source());
+ svg_path_adapter svg_path(stl_storage);
+ svg_attribute_type attributes;
+ bool result = push_explicit_style( (*stock_vector_marker)->attributes(), attributes, sym_, feature_, common_.vars_);
+ vector_dispatch_type rasterizer_dispatch(*stock_vector_marker,
+ svg_path,
+ result ? attributes : (*stock_vector_marker)->attributes(),
+ image_tr,
+ sym_,
+ *common_.detector_,
+ common_.scale_factor_,
+ feature_,
+ common_.vars_,
+ snap_to_pixels,
+ renderer_context_);
+
+ vertex_converter_type converter(clip_box_,
+ sym_,
+ common_.t_,
+ prj_trans_,
+ geom_tr,
+ feature_,
+ common_.vars_,
+ common_.scale_factor_);
+ if (clip) // optional clip (default: true)
{
- setup_transform_scaling(image_tr, (*mark)->width(), (*mark)->height(), feature, common.vars_, sym);
- auto image_transform = get_optional<transform_type>(sym, keys::image_transform);
- if (image_transform) evaluate_transform(image_tr, feature, common.vars_, *image_transform);
- box2d<double> const& bbox = (*mark)->bounding_box();
- boost::optional<mapnik::image_ptr> marker = (*mark)->get_bitmap_data();
- // - clamp sizes to > 4 pixels of interactivity
- coord2d center = bbox.center();
- agg::trans_affine_translation recenter(-center.x, -center.y);
- agg::trans_affine marker_trans = recenter * image_tr;
- raster_dispatch_type rasterizer_dispatch(**marker,
- marker_trans,
- sym,
- *common.detector_,
- common.scale_factor_,
- feature,
- common.vars_,
- renderer_context);
-
- using vertex_converter_type = vertex_converter<raster_dispatch_type,clip_line_tag,
- clip_poly_tag,
- transform_tag,
- affine_transform_tag,
- simplify_tag, smooth_tag,
- offset_transform_tag>;
- vertex_converter_type converter(clip_box, rasterizer_dispatch, sym,common.t_,prj_trans,geom_tr,feature,common.vars_,common.scale_factor_);
-
- if (clip && feature.paths().size() > 0) // optional clip (default: true)
- {
- geometry_type::types type = feature.paths()[0].type();
- if (type == geometry_type::types::Polygon)
- converter.template set<clip_poly_tag>();
- else if (type == geometry_type::types::LineString)
- converter.template set<clip_line_tag>();
- }
- converter.template set<transform_tag>(); //always transform
- if (std::fabs(offset) > 0.0) converter.template set<offset_transform_tag>(); // parallel offset
- converter.template set<affine_transform_tag>(); // optional affine transform
- if (simplify_tolerance > 0.0) converter.template set<simplify_tag>(); // optional simplify converter
- if (smooth > 0.0) converter.template set<smooth_tag>(); // optional smooth converter
- apply_markers_multi(feature, common.vars_, converter, sym);
+ geometry::geometry_types type = geometry::geometry_type(feature_.get_geometry());
+ if (type == geometry::geometry_types::Polygon || type == geometry::geometry_types::MultiPolygon)
+ converter.template set<clip_poly_tag>();
+ else if (type == geometry::geometry_types::LineString || type == geometry::geometry_types::MultiLineString)
+ converter.template set<clip_line_tag>();
}
+
+ converter.template set<transform_tag>(); //always transform
+ if (std::fabs(offset) > 0.0) converter.template set<offset_transform_tag>(); // parallel offset
+ converter.template set<affine_transform_tag>(); // optional affine transform
+ if (simplify_tolerance > 0.0) converter.template set<simplify_tag>(); // optional simplify converter
+ if (smooth > 0.0) converter.template set<smooth_tag>(); // optional smooth converter
+ apply_markers_multi(feature_, common_.vars_, converter, rasterizer_dispatch, sym_);
+ }
+ }
+
+ void operator() (marker_rgba8 const& mark)
+ {
+ using namespace mapnik::svg;
+ bool clip = get<value_bool, keys::clip>(sym_, feature_, common_.vars_);
+ double offset = get<value_double, keys::offset>(sym_, feature_, common_.vars_);
+ double simplify_tolerance = get<value_double, keys::simplify_tolerance>(sym_, feature_, common_.vars_);
+ double smooth = get<value_double, keys::smooth>(sym_, feature_, common_.vars_);
+
+ agg::trans_affine geom_tr;
+ auto transform = get_optional<transform_type>(sym_, keys::geometry_transform);
+ if (transform) evaluate_transform(geom_tr, feature_, common_.vars_, *transform, common_.scale_factor_);
+ agg::trans_affine image_tr = agg::trans_affine_scaling(common_.scale_factor_);
+
+ setup_transform_scaling(image_tr, mark.width(), mark.height(), feature_, common_.vars_, sym_);
+ auto image_transform = get_optional<transform_type>(sym_, keys::image_transform);
+ if (image_transform) evaluate_transform(image_tr, feature_, common_.vars_, *image_transform);
+ box2d<double> const& bbox = mark.bounding_box();
+ mapnik::image_rgba8 const& marker = mark.get_data();
+ // - clamp sizes to > 4 pixels of interactivity
+ coord2d center = bbox.center();
+ agg::trans_affine_translation recenter(-center.x, -center.y);
+ agg::trans_affine marker_trans = recenter * image_tr;
+ raster_dispatch_type rasterizer_dispatch(marker,
+ marker_trans,
+ sym_,
+ *common_.detector_,
+ common_.scale_factor_,
+ feature_,
+ common_.vars_,
+ renderer_context_);
+
+
+ vertex_converter_type converter(clip_box_,
+ sym_,
+ common_.t_,
+ prj_trans_,
+ geom_tr,
+ feature_,
+ common_.vars_,
+ common_.scale_factor_);
+
+ if (clip) // optional clip (default: true)
+ {
+ geometry::geometry_types type = geometry::geometry_type(feature_.get_geometry());
+ if (type == geometry::geometry_types::Polygon)
+ converter.template set<clip_poly_tag>();
+ else if (type == geometry::geometry_types::LineString)
+ converter.template set<clip_line_tag>();
}
+ converter.template set<transform_tag>(); //always transform
+ if (std::fabs(offset) > 0.0) converter.template set<offset_transform_tag>(); // parallel offset
+ converter.template set<affine_transform_tag>(); // optional affine transform
+ if (simplify_tolerance > 0.0) converter.template set<simplify_tag>(); // optional simplify converter
+ if (smooth > 0.0) converter.template set<smooth_tag>(); // optional smooth converter
+ apply_markers_multi(feature_, common_.vars_, converter, rasterizer_dispatch, sym_);
+ }
+
+ private:
+ std::string const& filename_;
+ markers_symbolizer const& sym_;
+ mapnik::feature_impl & feature_;
+ proj_transform const& prj_trans_;
+ RendererType const& common_;
+ box2d<double> const& clip_box_;
+ ContextType const& renderer_context_;
+};
+
+template <typename VD, typename RD, typename RendererType, typename ContextType>
+void render_markers_symbolizer(markers_symbolizer const& sym,
+ mapnik::feature_impl & feature,
+ proj_transform const& prj_trans,
+ RendererType const& common,
+ box2d<double> const& clip_box,
+ ContextType const& renderer_context)
+{
+ using namespace mapnik::svg;
+ std::string filename = get<std::string>(sym, keys::file, feature, common.vars_, "shape://ellipse");
+ if (!filename.empty())
+ {
+ std::shared_ptr<mapnik::marker const> mark = mapnik::marker_cache::instance().find(filename, true);
+ render_marker_symbolizer_visitor<VD,RD,RendererType,ContextType> visitor(filename,
+ sym,
+ feature,
+ prj_trans,
+ common,
+ clip_box,
+ renderer_context);
+ util::apply_visitor(visitor, *mark);
}
}
diff --git a/include/mapnik/renderer_common/process_point_symbolizer.hpp b/include/mapnik/renderer_common/process_point_symbolizer.hpp
index 9841f5d..7cfe9f2 100644
--- a/include/mapnik/renderer_common/process_point_symbolizer.hpp
+++ b/include/mapnik/renderer_common/process_point_symbolizer.hpp
@@ -23,13 +23,17 @@
#ifndef MAPNIK_RENDERER_COMMON_PROCESS_POINT_SYMBOLIZER_HPP
#define MAPNIK_RENDERER_COMMON_PROCESS_POINT_SYMBOLIZER_HPP
-#include <mapnik/geom_util.hpp>
#include <mapnik/feature.hpp>
#include <mapnik/symbolizer.hpp>
#include <mapnik/proj_transform.hpp>
#include <mapnik/marker.hpp>
#include <mapnik/marker_cache.hpp>
#include <mapnik/label_collision_detector.hpp>
+#include <mapnik/geometry_centroid.hpp>
+#include <mapnik/geometry_type.hpp>
+#include <mapnik/geometry_types.hpp>
+#include <mapnik/vertex_adapters.hpp>
+#include <mapnik/geom_util.hpp>
namespace mapnik {
@@ -41,18 +45,18 @@ void render_point_symbolizer(point_symbolizer const &sym,
F render_marker)
{
std::string filename = get<std::string,keys::file>(sym,feature, common.vars_);
- boost::optional<mapnik::marker_ptr> marker = filename.empty()
- ? std::make_shared<mapnik::marker>()
+ std::shared_ptr<mapnik::marker const> mark = filename.empty()
+ ? std::make_shared<mapnik::marker const>(std::move(mapnik::marker_rgba8()))
: marker_cache::instance().find(filename, true);
-
- if (marker)
+
+ if (!mark->is<mapnik::marker_null>())
{
value_double opacity = get<value_double,keys::opacity>(sym, feature, common.vars_);
value_bool allow_overlap = get<value_bool, keys::allow_overlap>(sym, feature, common.vars_);
value_bool ignore_placement = get<value_bool, keys::ignore_placement>(sym, feature, common.vars_);
point_placement_enum placement= get<point_placement_enum, keys::point_placement_type>(sym, feature, common.vars_);
- box2d<double> const& bbox = (*marker)->bounding_box();
+ box2d<double> const& bbox = mark->bounding_box();
coord2d center = bbox.center();
agg::trans_affine tr;
@@ -63,42 +67,40 @@ void render_point_symbolizer(point_symbolizer const &sym,
agg::trans_affine recenter_tr = recenter * tr;
box2d<double> label_ext = bbox * recenter_tr * agg::trans_affine_scaling(common.scale_factor_);
- for (std::size_t i=0; i<feature.num_geometries(); ++i)
+ mapnik::geometry::geometry<double> const& geometry = feature.get_geometry();
+ mapnik::geometry::point<double> pt;
+ if (placement == CENTROID_POINT_PLACEMENT)
+ {
+ if (!geometry::centroid(geometry, pt)) return;
+ }
+ else if (mapnik::geometry::geometry_type(geometry) == mapnik::geometry::geometry_types::Polygon)
+ {
+ auto const& poly = mapnik::util::get<geometry::polygon<double> >(geometry);
+ geometry::polygon_vertex_adapter<double> va(poly);
+ if (!label::interior_position(va ,pt.x, pt.y))
+ return;
+ }
+ double x = pt.x;
+ double y = pt.y;
+ double z = 0;
+ prj_trans.backward(x,y,z);
+ common.t_.forward(&x,&y);
+ label_ext.re_center(x,y);
+ if (allow_overlap ||
+ common.detector_->has_placement(label_ext))
{
- geometry_type const& geom = feature.get_geometry(i);
- double x;
- double y;
- double z=0;
- if (placement == CENTROID_POINT_PLACEMENT)
- {
- if (!label::centroid(geom, x, y))
- return;
- }
- else
- {
- if (!label::interior_position(geom ,x, y))
- return;
- }
-
- prj_trans.backward(x,y,z);
- common.t_.forward(&x,&y);
- label_ext.re_center(x,y);
- if (allow_overlap ||
- common.detector_->has_placement(label_ext))
- {
- render_marker(pixel_position(x, y),
- **marker,
- tr,
- opacity);
+ render_marker(pixel_position(x, y),
+ *mark,
+ tr,
+ opacity);
- if (!ignore_placement)
- common.detector_->insert(label_ext);
- }
+ if (!ignore_placement)
+ common.detector_->insert(label_ext);
}
}
}
} // namespace mapnik
-#endif /* MAPNIK_RENDERER_COMMON_PROCESS_POINT_SYMBOLIZER_HPP */
+#endif // MAPNIK_RENDERER_COMMON_PROCESS_POINT_SYMBOLIZER_HPP
diff --git a/include/mapnik/renderer_common/process_polygon_symbolizer.hpp b/include/mapnik/renderer_common/process_polygon_symbolizer.hpp
index 262b313..60c7810 100644
--- a/include/mapnik/renderer_common/process_polygon_symbolizer.hpp
+++ b/include/mapnik/renderer_common/process_polygon_symbolizer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,9 +25,11 @@
#include <mapnik/renderer_common.hpp>
#include <mapnik/vertex_converters.hpp>
+#include <mapnik/vertex_processor.hpp>
#include <mapnik/symbolizer.hpp>
-#include <mapnik/geometry.hpp>
+
#include <mapnik/feature.hpp>
+#include <mapnik/renderer_common/apply_vertex_converter.hpp>
namespace mapnik {
@@ -49,7 +51,7 @@ void render_polygon_symbolizer(polygon_symbolizer const &sym,
value_double smooth = get<value_double,keys::smooth>(sym, feature, common.vars_);
value_double opacity = get<value_double,keys::fill_opacity>(sym, feature, common.vars_);
- vertex_converter_type converter(clip_box, ras, sym, common.t_, prj_trans, tr,
+ vertex_converter_type converter(clip_box, sym, common.t_, prj_trans, tr,
feature,common.vars_,common.scale_factor_);
if (prj_trans.equal() && clip) converter.template set<clip_poly_tag>(); //optional clip (default: true)
@@ -58,13 +60,10 @@ void render_polygon_symbolizer(polygon_symbolizer const &sym,
if (simplify_tolerance > 0.0) converter.template set<simplify_tag>(); // optional simplify converter
if (smooth > 0.0) converter.template set<smooth_tag>(); // optional smooth converter
- for (geometry_type & geom : feature.paths())
- {
- if (geom.size() > 2)
- {
- converter.apply(geom);
- }
- }
+ using apply_vertex_converter_type = detail::apply_vertex_converter<vertex_converter_type, rasterizer_type>;
+ using vertex_processor_type = geometry::vertex_processor<apply_vertex_converter_type>;
+ apply_vertex_converter_type apply(converter, ras);
+ mapnik::util::apply_visitor(vertex_processor_type(apply),feature.get_geometry());
color const& fill = get<mapnik::color, keys::fill>(sym, feature, common.vars_);
fill_func(fill, opacity);
@@ -72,4 +71,4 @@ void render_polygon_symbolizer(polygon_symbolizer const &sym,
} // namespace mapnik
-#endif /* MAPNIK_RENDERER_COMMON_PROCESS_POLYGON_SYMBOLIZER_HPP */
+#endif // MAPNIK_RENDERER_COMMON_PROCESS_POLYGON_SYMBOLIZER_HPP
diff --git a/include/mapnik/renderer_common/process_raster_symbolizer.hpp b/include/mapnik/renderer_common/process_raster_symbolizer.hpp
index 2fdeca6..3ef8b19 100644
--- a/include/mapnik/renderer_common/process_raster_symbolizer.hpp
+++ b/include/mapnik/renderer_common/process_raster_symbolizer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,6 +24,7 @@
#define MAPNIK_RENDERER_COMMON_PROCESS_RASTER_SYMBOLIZER_HPP
// mapnik
+#include <mapnik/image_util.hpp>
#include <mapnik/warp.hpp>
#include <mapnik/raster.hpp>
#include <mapnik/symbolizer.hpp>
@@ -34,24 +35,161 @@
// agg
#include "agg_rendering_buffer.h"
#include "agg_pixfmt_rgba.h"
+#include "agg_pixfmt_gray.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_scanline_u.h"
+#include "agg_renderer_scanline.h"
namespace mapnik {
+namespace detail {
+
+template <typename F>
+struct image_dispatcher
+{
+ using composite_function = F;
+ image_dispatcher(int start_x, int start_y,
+ int width, int height,
+ double scale_x, double scale_y,
+ scaling_method_e method, double filter_factor,
+ double opacity, composite_mode_e comp_op,
+ raster_symbolizer const& sym, feature_impl const& feature, F & composite, boost::optional<double> const& nodata)
+ : start_x_(start_x),
+ start_y_(start_y),
+ width_(width),
+ height_(height),
+ scale_x_(scale_x),
+ scale_y_(scale_y),
+ method_(method),
+ filter_factor_(filter_factor),
+ opacity_(opacity),
+ comp_op_(comp_op),
+ sym_(sym),
+ feature_(feature),
+ composite_(composite),
+ nodata_(nodata) {}
+
+ void operator() (image_null const& data_in) const {} //no-op
+ void operator() (image_rgba8 const& data_in) const
+ {
+ image_rgba8 data_out(width_, height_, true, true);
+ scale_image_agg(data_out, data_in, method_, scale_x_, scale_y_, 0.0, 0.0, filter_factor_);
+ composite_(data_out, comp_op_, opacity_, start_x_, start_y_);
+ }
+
+ template <typename T>
+ void operator() (T const& data_in) const
+ {
+ using image_type = T;
+ image_type data_out(width_, height_);
+ scale_image_agg(data_out, data_in, method_, scale_x_, scale_y_, 0.0, 0.0, filter_factor_);
+ image_rgba8 dst(width_, height_);
+ raster_colorizer_ptr colorizer = get<raster_colorizer_ptr>(sym_, keys::colorizer);
+ if (colorizer) colorizer->colorize(dst, data_out, nodata_, feature_);
+ premultiply_alpha(dst);
+ composite_(dst, comp_op_, opacity_, start_x_, start_y_);
+ }
+private:
+ int start_x_;
+ int start_y_;
+ int width_;
+ int height_;
+ double scale_x_;
+ double scale_y_;
+ scaling_method_e method_;
+ double filter_factor_;
+ double opacity_;
+ composite_mode_e comp_op_;
+ raster_symbolizer const& sym_;
+ feature_impl const& feature_;
+ composite_function & composite_;
+ boost::optional<double> const& nodata_;
+};
+
+template <typename F>
+struct image_warp_dispatcher
+{
+ using composite_function = F;
+ image_warp_dispatcher(proj_transform const& prj_trans,
+ int start_x, int start_y, int width, int height,
+ box2d<double> const& target_ext, box2d<double> const& source_ext,
+ double offset_x, double offset_y, unsigned mesh_size, scaling_method_e scaling_method,
+ double filter_factor, double opacity, composite_mode_e comp_op,
+ raster_symbolizer const& sym, feature_impl const& feature, F & composite, boost::optional<double> const& nodata)
+ : prj_trans_(prj_trans),
+ start_x_(start_x),
+ start_y_(start_y),
+ width_(width),
+ height_(height),
+ target_ext_(target_ext),
+ source_ext_(source_ext),
+ offset_x_(offset_x),
+ offset_y_(offset_y),
+ mesh_size_(mesh_size),
+ scaling_method_(scaling_method),
+ filter_factor_(filter_factor),
+ opacity_(opacity),
+ comp_op_(comp_op),
+ sym_(sym),
+ feature_(feature),
+ composite_(composite),
+ nodata_(nodata) {}
+
+ void operator() (image_null const& data_in) const {} //no-op
+
+ void operator() (image_rgba8 const& data_in) const
+ {
+ image_rgba8 data_out(width_, height_, true, true);
+ warp_image(data_out, data_in, prj_trans_, target_ext_, source_ext_, offset_x_, offset_y_, mesh_size_, scaling_method_, filter_factor_);
+ composite_(data_out, comp_op_, opacity_, start_x_, start_y_);
+ }
+
+ template <typename T>
+ void operator() (T const& data_in) const
+ {
+ using image_type = T;
+ image_type data_out(width_, height_);
+ if (nodata_) data_out.set(*nodata_);
+ warp_image(data_out, data_in, prj_trans_, target_ext_, source_ext_, offset_x_, offset_y_, mesh_size_, scaling_method_, filter_factor_);
+ image_rgba8 dst(width_, height_);
+ raster_colorizer_ptr colorizer = get<raster_colorizer_ptr>(sym_, keys::colorizer);
+ if (colorizer) colorizer->colorize(dst, data_out, nodata_, feature_);
+ premultiply_alpha(dst);
+ composite_(dst, comp_op_, opacity_, start_x_, start_y_);
+ }
+private:
+ proj_transform const& prj_trans_;
+ int start_x_;
+ int start_y_;
+ int width_;
+ int height_;
+ box2d<double> const& target_ext_;
+ box2d<double> const& source_ext_;
+ double offset_x_;
+ double offset_y_;
+ unsigned mesh_size_;
+ scaling_method_e scaling_method_;
+ double filter_factor_;
+ double opacity_;
+ composite_mode_e comp_op_;
+ raster_symbolizer const& sym_;
+ feature_impl const& feature_;
+ composite_function & composite_;
+ boost::optional<double> const& nodata_;
+};
+
+}
+
template <typename F>
-void render_raster_symbolizer(raster_symbolizer const &sym,
- mapnik::feature_impl &feature,
- proj_transform const &prj_trans,
- renderer_common &common,
+void render_raster_symbolizer(raster_symbolizer const& sym,
+ mapnik::feature_impl& feature,
+ proj_transform const& prj_trans,
+ renderer_common& common,
F composite)
{
raster_ptr const& source = feature.get_raster();
if (source)
{
- // If there's a colorizer defined, use it to color the raster in-place
- raster_colorizer_ptr colorizer = get<raster_colorizer_ptr>(sym, keys::colorizer);
- if (colorizer)
- colorizer->colorize(source,feature);
-
box2d<double> target_ext = box2d<double>(source->ext_);
prj_trans.backward(target_ext, PROJ_ENVELOPE_POINTS);
box2d<double> ext = common.t_.forward(target_ext);
@@ -66,36 +204,27 @@ void render_raster_symbolizer(raster_symbolizer const &sym,
scaling_method_e scaling_method = get<scaling_method_e>(sym, keys::scaling, feature, common.vars_, SCALING_NEAR);
composite_mode_e comp_op = get<composite_mode_e>(sym, keys::comp_op, feature, common.vars_, src_over);
double opacity = get<double>(sym,keys::opacity,feature, common.vars_, 1.0);
- bool premultiply_source = !source->premultiplied_alpha_;
- auto is_premultiplied = get_optional<bool>(sym, keys::premultiplied, feature, common.vars_);
- if (is_premultiplied)
- {
- if (*is_premultiplied) premultiply_source = false;
- else premultiply_source = true;
- }
- if (premultiply_source)
+ // only premultiply rgba8 images
+ if (source->data_.is<image_rgba8>())
{
- agg::rendering_buffer buffer(source->data_.getBytes(),
- source->data_.width(),
- source->data_.height(),
- source->data_.width() * 4);
- agg::pixfmt_rgba32 pixf(buffer);
- pixf.premultiply();
+ auto is_premultiplied = get_optional<bool>(sym, keys::premultiplied, feature, common.vars_);
+ if (is_premultiplied && *is_premultiplied)
+ {
+ mapnik::set_premultiplied_alpha(source->data_, true);
+ }
+ mapnik::premultiply_alpha(source->data_);
}
+
if (!prj_trans.equal())
{
double offset_x = ext.minx() - start_x;
double offset_y = ext.miny() - start_y;
- raster target(target_ext, raster_width, raster_height, source->get_filter_factor());
unsigned mesh_size = static_cast<unsigned>(get<value_integer>(sym,keys::mesh_size,feature, common.vars_, 16));
- reproject_and_scale_raster(target,
- *source,
- prj_trans,
- offset_x,
- offset_y,
- mesh_size,
- scaling_method);
- composite(target.data_, comp_op, opacity, start_x, start_y);
+ detail::image_warp_dispatcher<F> dispatcher(prj_trans, start_x, start_y, raster_width, raster_height,
+ target_ext, source->ext_, offset_x, offset_y, mesh_size,
+ scaling_method, source->get_filter_factor(),
+ opacity, comp_op, sym, feature, composite, source->nodata());
+ util::apply_visitor(dispatcher, source->data_);
}
else
{
@@ -107,20 +236,18 @@ void render_raster_symbolizer(raster_symbolizer const &sym,
(std::abs(start_x) <= eps) &&
(std::abs(start_y) <= eps) )
{
- composite(source->data_, comp_op, opacity, start_x, start_y);
+ if (source->data_.is<image_rgba8>())
+ {
+ composite(util::get<image_rgba8>(source->data_), comp_op, opacity, start_x, start_y);
+ }
}
else
{
- raster target(target_ext, raster_width, raster_height, source->get_filter_factor());
- scale_image_agg<image_data_32>(target.data_,
- source->data_,
- scaling_method,
- image_ratio_x,
- image_ratio_y,
- 0.0,
- 0.0,
- source->get_filter_factor());
- composite(target.data_, comp_op, opacity, start_x, start_y);
+ detail::image_dispatcher<F> dispatcher(start_x, start_y, raster_width, raster_height,
+ image_ratio_x, image_ratio_y,
+ scaling_method, source->get_filter_factor(),
+ opacity, comp_op, sym, feature, composite, source->nodata());
+ util::apply_visitor(dispatcher, source->data_);
}
}
}
diff --git a/include/mapnik/renderer_common/render_pattern.hpp b/include/mapnik/renderer_common/render_pattern.hpp
index 885d89c..ffa3140 100644
--- a/include/mapnik/renderer_common/render_pattern.hpp
+++ b/include/mapnik/renderer_common/render_pattern.hpp
@@ -23,7 +23,7 @@
#ifndef MAPNIK_RENDER_PATTERN_HPP
#define MAPNIK_RENDER_PATTERN_HPP
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
#include <memory>
// fwd decl
@@ -35,12 +35,14 @@ namespace mapnik {
// fwd decl
struct rasterizer;
-class marker;
-
-std::shared_ptr<image_data_32> render_pattern(rasterizer & ras,
- marker const& marker,
- agg::trans_affine const& tr,
- double opacity);
+struct marker_svg;
+
+template <typename T>
+void render_pattern(rasterizer & ras,
+ marker_svg const& marker,
+ agg::trans_affine const& tr,
+ double opacity,
+ T & image);
} // namespace mapnik
diff --git a/include/mapnik/request.hpp b/include/mapnik/request.hpp
index 8f5272b..e351f57 100644
--- a/include/mapnik/request.hpp
+++ b/include/mapnik/request.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/rule.hpp b/include/mapnik/rule.hpp
index bc31685..e32210e 100644
--- a/include/mapnik/rule.hpp
+++ b/include/mapnik/rule.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/rule_cache.hpp b/include/mapnik/rule_cache.hpp
index 244b89d..44a3406 100644
--- a/include/mapnik/rule_cache.hpp
+++ b/include/mapnik/rule_cache.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,7 @@
// mapnik
#include <mapnik/rule.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// stl
#include <vector>
@@ -34,7 +34,7 @@
namespace mapnik
{
-class rule_cache : private noncopyable
+class rule_cache : private util::noncopyable
{
public:
using rule_ptrs = std::vector<rule const*>;
diff --git a/include/mapnik/save_map.hpp b/include/mapnik/save_map.hpp
index ed950ef..8945320 100644
--- a/include/mapnik/save_map.hpp
+++ b/include/mapnik/save_map.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/scale_denominator.hpp b/include/mapnik/scale_denominator.hpp
index 37d8413..e4aaee9 100644
--- a/include/mapnik/scale_denominator.hpp
+++ b/include/mapnik/scale_denominator.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/segment.hpp b/include/mapnik/segment.hpp
index ef05821..2cf1039 100644
--- a/include/mapnik/segment.hpp
+++ b/include/mapnik/segment.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/simplify_converter.hpp b/include/mapnik/simplify_converter.hpp
index c6c2d73..e9a88c4 100644
--- a/include/mapnik/simplify_converter.hpp
+++ b/include/mapnik/simplify_converter.hpp
@@ -5,7 +5,7 @@
#include <mapnik/config.hpp>
#include <mapnik/vertex.hpp>
#include <mapnik/simplify.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// stl
#include <limits>
@@ -19,7 +19,7 @@
namespace mapnik
{
-struct weighted_vertex : private mapnik::noncopyable
+struct weighted_vertex : private util::noncopyable
{
vertex2d coord;
double weight;
@@ -34,7 +34,8 @@ struct weighted_vertex : private mapnik::noncopyable
double nominalWeight()
{
- if (prev == nullptr || next == nullptr || coord.cmd != SEG_LINETO) {
+ if (prev == nullptr || next == nullptr || coord.cmd != SEG_LINETO)
+ {
return std::numeric_limits<double>::infinity();
}
vertex2d const& A = prev->coord;
@@ -45,7 +46,7 @@ struct weighted_vertex : private mapnik::noncopyable
struct ascending_sort
{
- bool operator() (const weighted_vertex *a, const weighted_vertex *b)
+ bool operator() (const weighted_vertex *a, const weighted_vertex *b) const
{
return b->weight > a->weight;
}
@@ -92,7 +93,7 @@ template <typename Geometry>
struct MAPNIK_DECL simplify_converter
{
public:
- simplify_converter(Geometry& geom)
+ simplify_converter(Geometry & geom)
: geom_(geom),
tolerance_(0.0),
status_(initial),
@@ -100,7 +101,7 @@ public:
pos_(0)
{}
- enum status
+ enum status : std::uint8_t
{
initial,
process,
@@ -135,7 +136,8 @@ public:
void set_simplify_tolerance(double value)
{
- if (tolerance_ != value) {
+ if (tolerance_ != value)
+ {
tolerance_ = value;
reset();
}
@@ -171,6 +173,7 @@ private:
switch (algorithm_)
{
case visvalingam_whyatt:
+ case douglas_peucker:
return output_vertex_cached(x, y);
case radial_distance:
return output_vertex_distance(x, y);
@@ -183,54 +186,77 @@ private:
return SEG_END;
}
- unsigned output_vertex_cached(double* x, double* y) {
+ unsigned output_vertex_cached(double* x, double* y)
+ {
if (pos_ >= vertices_.size())
return SEG_END;
previous_vertex_ = vertices_[pos_];
- *x = previous_vertex_.x;
- *y = previous_vertex_.y;
+ if (previous_vertex_.cmd == SEG_CLOSE)
+ {
+ *x = *y = 0.0; // restore SEG_CLOSE command
+ }
+ else
+ {
+ *x = previous_vertex_.x;
+ *y = previous_vertex_.y;
+ }
pos_++;
return previous_vertex_.cmd;
}
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunknown-pragmas"
-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
- unsigned output_vertex_distance(double* x, double* y) {
- if (status_ == closing) {
+ unsigned output_vertex_distance(double* x, double* y)
+ {
+ if (status_ == closing)
+ {
+ *x = *y = 0.0;
status_ = end;
return SEG_CLOSE;
}
- vertex2d last(vertex2d::no_init);
+ vertex2d last;
vertex2d vtx(vertex2d::no_init);
while ((vtx.cmd = geom_.vertex(&vtx.x, &vtx.y)) != SEG_END)
{
- if (vtx.cmd == SEG_LINETO) {
- if (distance_to_previous(vtx) > tolerance_) {
+ if (vtx.cmd == SEG_LINETO)
+ {
+ if (distance_to_previous(vtx) > tolerance_)
+ {
// Only output a vertex if it's far enough away from the previous
break;
- } else {
+ }
+ else
+ {
last = vtx;
// continue
}
- } else if (vtx.cmd == SEG_CLOSE) {
- if (last.cmd == vertex2d::no_init) {
+ }
+ else if (vtx.cmd == SEG_CLOSE)
+ {
+ if (last.cmd == SEG_END)
+ {
// The previous vertex was already output in the previous call.
// We can now safely output SEG_CLOSE.
status_ = end;
- } else {
+ }
+ else
+ {
// We eliminated the previous point because it was too close, but
// we have to output it now anyway, since this is the end of the
// vertex stream. Make sure that we output SEG_CLOSE in the next call.
- vtx = last;
+ vtx.x = start_vertex_.x;
+ vtx.y = start_vertex_.y;
status_ = closing;
}
break;
- } else if (vtx.cmd == SEG_MOVETO) {
+ }
+ else if (vtx.cmd == SEG_MOVETO)
+ {
+ start_vertex_ = vtx;
break;
- } else {
+ }
+ else
+ {
throw std::runtime_error("Unknown vertex command");
}
}
@@ -240,7 +266,6 @@ private:
*y = vtx.y;
return vtx.cmd;
}
-#pragma GCC diagnostic pop
template <typename Iterator>
bool fit_sleeve(Iterator itr,Iterator end, vertex2d const& v)
@@ -271,8 +296,6 @@ private:
vertices_.size() >= min_size)
status_ = process;
- previous_vertex_ = vtx;
-
if (vtx.cmd == SEG_MOVETO)
{
if (sleeve_cont_.size() > 1)
@@ -282,6 +305,7 @@ private:
}
vertices_.push_back(vtx);
sleeve_cont_.push_back(vtx);
+ start_vertex_ = vtx;
if (status_ == process) break;
}
else if (vtx.cmd == SEG_LINETO)
@@ -308,6 +332,8 @@ private:
vertices_.push_back(sleeve_cont_.back());
sleeve_cont_.clear();
}
+ vtx.x = start_vertex_.x;
+ vtx.y = start_vertex_.y;
vertices_.push_back(vtx);
if (status_ == process) break;
}
@@ -334,14 +360,22 @@ private:
{
vertex2d v = vertices_.front();
vertices_.pop_front();
- *x = v.x;
- *y = v.y;
+ if (v.cmd == SEG_CLOSE)
+ {
+ *x = *y = 0.0; // restore SEG_CLOSE command
+ }
+ else
+ {
+ *x = v.x;
+ *y = v.y;
+ }
return v.cmd;
}
return SEG_END;
}
- double distance_to_previous(vertex2d const& vtx) {
+ double distance_to_previous(vertex2d const& vtx)
+ {
double dx = previous_vertex_.x - vtx.x;
double dy = previous_vertex_.y - vtx.y;
return dx * dx + dy * dy;
@@ -363,6 +397,8 @@ private:
return status_ = process;
case zhao_saalfeld:
return status_ = cache;
+ case douglas_peucker:
+ return init_vertices_RDP();
default:
throw std::runtime_error("simplification algorithm not yet implemented");
}
@@ -377,10 +413,20 @@ private:
vertex2d vtx(vertex2d::no_init);
while ((vtx.cmd = geom_.vertex(&vtx.x, &vtx.y)) != SEG_END)
{
+ if (vtx.cmd == SEG_MOVETO)
+ {
+ start_vertex_ = vtx;
+ }
+ else if (vtx.cmd == SEG_CLOSE)
+ {
+ vtx.x = start_vertex_.x;
+ vtx.y = start_vertex_.y;
+ }
v_list.push_back(new weighted_vertex(vtx));
}
- if (v_list.empty()) {
+ if (v_list.empty())
+ {
return status_ = process;
}
@@ -399,7 +445,8 @@ private:
{
VertexSet::iterator lowest = v.begin();
weighted_vertex *removed = *lowest;
- if (removed->weight >= tolerance_) {
+ if (removed->weight >= tolerance_)
+ {
break;
}
@@ -409,12 +456,14 @@ private:
if (removed->prev) removed->prev->next = removed->next;
if (removed->next) removed->next->prev = removed->prev;
// Adjust weight and reinsert prev/next to move them to their correct position.
- if (removed->prev) {
+ if (removed->prev)
+ {
v.erase(removed->prev);
removed->prev->weight = std::max(removed->weight, removed->prev->nominalWeight());
v.insert(removed->prev);
}
- if (removed->next) {
+ if (removed->next)
+ {
v.erase(removed->next);
removed->next->weight = std::max(removed->weight, removed->next->nominalWeight());
v.insert(removed->next);
@@ -437,13 +486,131 @@ private:
return status_ = process;
}
- Geometry& geom_;
+ void RDP(std::vector<vertex2d>& vertices, const size_t start, const size_t end)
+ {
+ // Squared length of a vector
+ auto sqlen = [] (vertex2d const& vec) { return vec.x*vec.x + vec.y*vec.y; };
+ // Compute square distance of p to a line segment
+ auto segment_distance = [&sqlen] (vertex2d const& p, vertex2d const& a, vertex2d const& b, vertex2d const& dir, double dir_sq_len)
+ {
+ // Special case where segment has same start and end point at which point we are just doing a radius check
+ if (dir_sq_len == 0)
+ {
+ return sqlen(vertex2d(p.x - b.x, p.y - b.y, SEG_END));
+ }
+
+ // Project p onto dir by ((p dot dir / dir dot dir) * dir)
+ double scale = ((p.x - a.x) * dir.x + (p.y - a.y) * dir.y) / dir_sq_len;
+ double projected_x = dir.x * scale;
+ double projected_y = dir.y * scale;
+ double projected_origin_distance = projected_x * projected_x + projected_y * projected_y;
+
+ // Projected point doesn't lie on the segment
+ if (projected_origin_distance > dir_sq_len)
+ {
+ // Projected point lies past the end of the segment
+ if (scale > 0)
+ {
+ return sqlen(vertex2d(p.x - b.x, p.y - b.y, SEG_END));
+ }// Projected point lies before the beginning of the segment
+ else
+ {
+ return sqlen(vertex2d(p.x - a.x, p.y - a.y, SEG_END));
+ }
+ }// Projected point lies on the segment
+ else
+ {
+ return sqlen(vertex2d(p.x - (projected_x + a.x), p.y - (projected_y + a.y), SEG_END));
+ }
+ };
+
+ // Compute the directional vector along the segment
+ vertex2d dir = vertex2d(vertices[end].x - vertices[start].x, vertices[end].y - vertices[start].y, SEG_END);
+ double dir_sq_len = sqlen(dir);
+
+ // Find the point with the maximum distance from this line segment
+ double max = std::numeric_limits<double>::min();
+ size_t keeper = 0;
+ for (size_t i = start + 1; i < end; ++i)
+ {
+ double d = segment_distance(vertices[i], vertices[start], vertices[end], dir, dir_sq_len);
+ if (d > max)
+ {
+ keeper = i;
+ max = d;
+ }
+ }
+
+ // Split at the vertex that is furthest outside of the tolerance
+ // NOTE: we work in square distances to avoid sqrt so we sqaure tolerance accordingly
+ if (max > tolerance_ * tolerance_)
+ {
+ // Make sure not to smooth out the biggest outlier (keeper)
+ if (keeper - start != 1)
+ {
+ RDP(vertices, start, keeper);
+ }
+ if (end - keeper != 1)
+ {
+ RDP(vertices, keeper, end);
+ }
+ }// Everyone between the start and the end was close enough to the line
+ else
+ {
+ // Mark each of them as discarded
+ for (size_t i = start + 1; i < end; ++i)
+ {
+ vertices[i].cmd = SEG_END;
+ }
+ }
+ }
+
+ status init_vertices_RDP()
+ {
+ // Slurp out the original vertices
+ std::vector<vertex2d> vertices;
+ //vertices.reserve(geom_.size());
+ vertex2d vtx(vertex2d::no_init);
+ while ((vtx.cmd = geom_.vertex(&vtx.x, &vtx.y)) != SEG_END)
+ {
+ if (vtx.cmd == SEG_MOVETO)
+ {
+ start_vertex_ = vtx;
+ }
+ else if (vtx.cmd == SEG_CLOSE)
+ {
+ vtx.x = start_vertex_.x;
+ vtx.y = start_vertex_.y;
+ }
+ vertices.push_back(vtx);
+ }
+
+ // Run ramer douglas peucker on it
+ if (vertices.size() > 2)
+ {
+ RDP(vertices, 0, vertices.size() - 1);
+ }
+
+ // Slurp the points back out that haven't been marked as discarded
+ for (vertex2d const& vertex : vertices)
+ {
+ if (vertex.cmd != SEG_END)
+ {
+ vertices_.emplace_back(vertex);
+ }
+ }
+
+ return status_ = process;
+ }
+
+ Geometry & geom_;
double tolerance_;
status status_;
simplify_algorithm_e algorithm_;
std::deque<vertex2d> vertices_;
std::deque<vertex2d> sleeve_cont_;
vertex2d previous_vertex_;
+ vertex2d start_vertex_;
mutable size_t pos_;
};
diff --git a/include/mapnik/span_image_filter.hpp b/include/mapnik/span_image_filter.hpp
index 8d5008e..c84ee04 100644
--- a/include/mapnik/span_image_filter.hpp
+++ b/include/mapnik/span_image_filter.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/sql_utils.hpp b/include/mapnik/sql_utils.hpp
index f8ade31..f45af6c 100644
--- a/include/mapnik/sql_utils.hpp
+++ b/include/mapnik/sql_utils.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -73,7 +73,7 @@ namespace mapnik { namespace sql_utils {
{
table_name=table_name.substr(idx);
}
- idx = table_name.find_first_of(" )");
+ idx = table_name.find_first_of(", )");
if (idx != std::string::npos)
{
table_name = table_name.substr(0,idx);
diff --git a/include/mapnik/sse.hpp b/include/mapnik/sse.hpp
new file mode 100644
index 0000000..d68684c
--- /dev/null
+++ b/include/mapnik/sse.hpp
@@ -0,0 +1,156 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_SSE_HPP
+#define MAPNIK_SSE_HPP
+
+#include <emmintrin.h>
+#include <xmmintrin.h>
+
+#define ROUND_DOWN(x, s) ((x) & ~((s)-1))
+
+typedef union
+{
+ __m128i v;
+ int32_t i32[4];
+ uint32_t u32[4];
+ uint16_t u16[8];
+ uint8_t u8[16];
+} m128_int;
+
+static inline __m128i
+_mm_cmple_epu16 (__m128i x, __m128i y)
+{
+ // Returns 0xFFFF where x <= y:
+ return _mm_cmpeq_epi16(_mm_subs_epu16(x, y), _mm_setzero_si128());
+}
+
+static inline __m128i
+_mm_cmple_epu8 (__m128i x, __m128i y)
+{
+ // Returns 0xFF where x <= y:
+ return _mm_cmpeq_epi8(_mm_min_epu8(x, y), x);
+}
+
+static inline __m128i
+_mm_cmpgt_epu16 (__m128i x, __m128i y)
+{
+ // Returns 0xFFFF where x > y:
+ return _mm_andnot_si128(_mm_cmpeq_epi16(x, y), _mm_cmple_epu16(y, x));
+}
+
+static inline __m128i
+_mm_cmpgt_epu8 (__m128i x, __m128i y)
+{
+ // Returns 0xFF where x > y:
+ return _mm_andnot_si128(
+ _mm_cmpeq_epi8(x, y),
+ _mm_cmpeq_epi8(_mm_max_epu8(x, y), x)
+ );
+}
+
+static inline __m128i
+_mm_cmplt_epu16 (__m128i x, __m128i y)
+{
+ // Returns 0xFFFF where x < y:
+ return _mm_cmpgt_epu16(y, x);
+}
+
+static inline __m128i
+_mm_cmplt_epu8 (__m128i x, __m128i y)
+{
+ // Returns 0xFF where x < y:
+ return _mm_cmpgt_epu8(y, x);
+}
+
+static inline __m128i
+_mm_cmpge_epu16 (__m128i x, __m128i y)
+{
+ // Returns 0xFFFF where x >= y:
+ return _mm_cmple_epu16(y, x);
+}
+
+static inline __m128i
+_mm_cmpge_epu8 (__m128i x, __m128i y)
+{
+ // Returns 0xFF where x >= y:
+ return _mm_cmple_epu8(y, x);
+}
+
+// Its not often that you want to use this!
+static inline __m128i
+_mm_not_si128 (__m128i x)
+{
+ // Returns ~x, the bitwise complement of x:
+ return _mm_xor_si128(x, _mm_cmpeq_epi32(_mm_setzero_si128(), _mm_setzero_si128()));
+}
+
+static inline __m128i
+_mm_absdiff_epu16 (__m128i x, __m128i y)
+{
+ // Calculate absolute difference: abs(x - y):
+ return _mm_or_si128(_mm_subs_epu16(x, y), _mm_subs_epu16(y, x));
+}
+
+static inline __m128i
+_mm_absdiff_epu8 (__m128i x, __m128i y)
+{
+ // Calculate absolute difference: abs(x - y):
+ return _mm_or_si128(_mm_subs_epu8(x, y), _mm_subs_epu8(y, x));
+}
+
+static inline __m128i
+_mm_div255_epu16 (__m128i x)
+{
+ // Divide 8 16-bit uints by 255:
+ // x := ((x + 1) + (x >> 8)) >> 8:
+ return _mm_srli_epi16(_mm_adds_epu16(
+ _mm_adds_epu16(x, _mm_set1_epi16(1)),
+ _mm_srli_epi16(x, 8)), 8);
+}
+
+static __m128i
+_mm_scale_epu8 (__m128i x, __m128i y)
+{
+ // Returns an "alpha blend" of x scaled by y/255;
+ // x := x * (y / 255)
+ // Reorder: x := (x * y) / 255
+
+ // Unpack x and y into 16-bit uints:
+ __m128i xlo = _mm_unpacklo_epi8(x, _mm_setzero_si128());
+ __m128i ylo = _mm_unpacklo_epi8(y, _mm_setzero_si128());
+ __m128i xhi = _mm_unpackhi_epi8(x, _mm_setzero_si128());
+ __m128i yhi = _mm_unpackhi_epi8(y, _mm_setzero_si128());
+
+ // Multiply x with y, keeping the low 16 bits:
+ xlo = _mm_mullo_epi16(xlo, ylo);
+ xhi = _mm_mullo_epi16(xhi, yhi);
+
+ // Divide by 255:
+ xlo = _mm_div255_epu16(xlo);
+ xhi = _mm_div255_epu16(xhi);
+
+ // Repack the 16-bit uints to clamped 8-bit values:
+ return _mm_packus_epi16(xlo, xhi);
+}
+
+#endif // MAPNIK_SSE_HPP
diff --git a/include/mapnik/svg/geometry_svg_generator.hpp b/include/mapnik/svg/geometry_svg_generator.hpp
index e3061d2..1aa056e 100644
--- a/include/mapnik/svg/geometry_svg_generator.hpp
+++ b/include/mapnik/svg/geometry_svg_generator.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,7 +26,8 @@
// mapnik
#include <mapnik/global.hpp>
-#include <mapnik/geometry.hpp> // for container stuff
+// for container stuff
+#include <mapnik/geometry.hpp>
#include <mapnik/view_transform.hpp> // for container stuff
#include <mapnik/transform_path_adapter.hpp>
#include <mapnik/util/path_iterator.hpp>
@@ -54,7 +55,7 @@
namespace boost { namespace spirit { namespace traits {
// TODO - this needs to be made generic to any path type
-using path_type = mapnik::transform_path_adapter<mapnik::view_transform, mapnik::geometry_type>;
+using path_type = mapnik::transform_path_adapter<mapnik::view_transform, mapnik::vertex_adapter>;
template <>
struct is_container<path_type const> : mpl::true_ {} ;
@@ -90,69 +91,82 @@ struct end_container<path_type const>
namespace mapnik { namespace svg {
- namespace karma = boost::spirit::karma;
- namespace phoenix = boost::phoenix;
+namespace karma = boost::spirit::karma;
+namespace phoenix = boost::phoenix;
- namespace svg_detail {
+namespace svg_detail {
- template <typename Geometry>
- struct get_type
- {
- using result_type = int;
- result_type operator() (Geometry const& geom) const
- {
- return static_cast<int>(geom.type());
- }
- };
-
- template <typename T>
- struct get_first
+template <typename Geometry>
+struct get_type
+{
+ using result_type = int;
+ result_type operator() (Geometry const& geom) const
{
- using geometry_type = T;
- using result_type = typename geometry_type::value_type const;
- result_type operator() (geometry_type const& geom) const
- {
- typename geometry_type::value_type coord;
- geom.rewind(0);
- std::get<0>(coord) = geom.vertex(&std::get<1>(coord),&std::get<2>(coord));
- return coord;
- }
- };
-
- template <typename T>
- struct coordinate_policy : karma::real_policies<T>
+ return static_cast<int>(geom.type());
+ }
+};
+
+template <typename T>
+struct get_first
+{
+ using path_type = T;
+ using result_type = typename path_type::value_type const;
+ result_type operator() (path_type const& geom) const
{
- using base_type = boost::spirit::karma::real_policies<T>;
- static int floatfield(T) { return base_type::fmtflags::fixed; }
- static unsigned precision(T) { return 4u ;}
- };
+ typename path_type::value_type coord;
+ geom.rewind(0);
+ std::get<0>(coord) = geom.vertex(&std::get<1>(coord),&std::get<2>(coord));
+ return coord;
}
+};
- template <typename OutputIterator, typename Geometry>
- struct svg_path_generator :
- karma::grammar<OutputIterator, Geometry const& ()>
+template <>
+struct get_first<mapnik::path_type>
+{
+ using path_type = mapnik::path_type;
+ using result_type = path_type::value_type const;
+ result_type operator() (path_type const& geom) const
{
+ path_type::value_type coord;
+ std::get<0>(coord) = geom.cont_.get_vertex(0, &std::get<1>(coord),&std::get<2>(coord));
+ return coord;
+ }
+};
+
+
+template <typename T>
+struct coordinate_policy : karma::real_policies<T>
+{
+ using base_type = boost::spirit::karma::real_policies<T>;
+ static int floatfield(T) { return base_type::fmtflags::fixed; }
+ static unsigned precision(T) { return 4u ;}
+};
+}
- using geometry_type = Geometry;
- using coord_type = typename boost::remove_pointer<typename geometry_type::value_type>::type;
+template <typename OutputIterator, typename Path>
+struct svg_path_generator :
+ karma::grammar<OutputIterator, Path const& ()>
+{
- svg_path_generator();
- // rules
- karma::rule<OutputIterator, geometry_type const& ()> svg;
- karma::rule<OutputIterator, geometry_type const& ()> point;
- karma::rule<OutputIterator, geometry_type const& ()> linestring;
- karma::rule<OutputIterator, geometry_type const& ()> polygon;
+ using path_type = Path;
+ using coord_type = typename boost::remove_pointer<typename path_type::value_type>::type;
- karma::rule<OutputIterator, coord_type ()> svg_point;
- karma::rule<OutputIterator, karma::locals<unsigned>, geometry_type const& ()> svg_path;
+ svg_path_generator();
+ // rules
+ karma::rule<OutputIterator, path_type const& ()> svg;
+ karma::rule<OutputIterator, path_type const& ()> point;
+ karma::rule<OutputIterator, path_type const& ()> linestring;
+ karma::rule<OutputIterator, path_type const& ()> polygon;
+ karma::rule<OutputIterator, coord_type ()> svg_point;
+ karma::rule<OutputIterator, path_type const& ()> svg_path;
- // phoenix functions
- phoenix::function<svg_detail::get_type<geometry_type> > _type;
- phoenix::function<svg_detail::get_first<geometry_type> > _first;
- //
- karma::real_generator<double, svg_detail::coordinate_policy<double> > coordinate;
+ // phoenix functions
+ phoenix::function<svg_detail::get_type<path_type> > _type;
+ phoenix::function<svg_detail::get_first<path_type> > _first;
+ //
+ karma::real_generator<double, svg_detail::coordinate_policy<double> > coordinate;
- };
+};
}}
diff --git a/include/mapnik/svg/geometry_svg_generator_impl.hpp b/include/mapnik/svg/geometry_svg_generator_impl.hpp
index 3f284ae..4424fbe 100644
--- a/include/mapnik/svg/geometry_svg_generator_impl.hpp
+++ b/include/mapnik/svg/geometry_svg_generator_impl.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -21,7 +21,7 @@
*****************************************************************************/
// mapnik
-
+#include <mapnik/geometry_types.hpp>
#include <mapnik/svg/geometry_svg_generator.hpp>
namespace mapnik { namespace svg {
@@ -29,21 +29,19 @@ namespace mapnik { namespace svg {
namespace karma = boost::spirit::karma;
namespace phoenix = boost::phoenix;
- template <typename OutputIterator, typename Geometry>
- svg_path_generator<OutputIterator,Geometry>::svg_path_generator()
+ template <typename OutputIterator, typename Path>
+ svg_path_generator<OutputIterator,Path>::svg_path_generator()
: svg_path_generator::base_type(svg)
{
boost::spirit::karma::uint_type uint_;
boost::spirit::karma::_val_type _val;
boost::spirit::karma::_1_type _1;
boost::spirit::karma::lit_type lit;
- boost::spirit::karma::_a_type _a;
- boost::spirit::karma::string_type kstring;
svg = point | linestring | polygon
;
- point = &uint_(mapnik::geometry_type::types::Point)[_1 = _type(_val)]
+ point = &uint_(mapnik::geometry::geometry_types::Point)[_1 = _type(_val)]
<< svg_point [_1 = _first(_val)]
;
@@ -53,18 +51,18 @@ namespace mapnik { namespace svg {
<< lit('\"')
;
- linestring = &uint_(mapnik::geometry_type::types::LineString)[_1 = _type(_val)]
+ linestring = &uint_(mapnik::geometry::geometry_types::LineString)[_1 = _type(_val)]
<< lit("d=\"") << svg_path << lit("\"")
;
- polygon = &uint_(mapnik::geometry_type::types::Polygon)[_1 = _type(_val)]
+ polygon = &uint_(mapnik::geometry::geometry_types::Polygon)[_1 = _type(_val)]
<< lit("d=\"") << svg_path << lit("\"")
;
svg_path %= ((&uint_(mapnik::SEG_MOVETO) << lit('M')
- | &uint_(mapnik::SEG_LINETO) [_a +=1] << kstring [if_(_a == 1u) [_1 = "L" ].else_[_1 =""]])
- << lit(' ') << coordinate << lit(' ') << coordinate) % lit(' ')
- ;
+ | &uint_(mapnik::SEG_LINETO) << lit('L'))
+ << coordinate << lit(' ') << coordinate) % lit(' ')
+ ;
}
diff --git a/include/mapnik/svg/output/svg_generator.hpp b/include/mapnik/svg/output/svg_generator.hpp
index e9ff4bd..42c4bb4 100644
--- a/include/mapnik/svg/output/svg_generator.hpp
+++ b/include/mapnik/svg/output/svg_generator.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,10 +26,10 @@
// mapnik
#include <mapnik/view_transform.hpp>
#include <mapnik/color.hpp>
-#include <mapnik/geometry.hpp>
+
#include <mapnik/svg/geometry_svg_generator.hpp>
#include <mapnik/svg/output/svg_output_attributes.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/value_types.hpp>
@@ -42,7 +42,7 @@ namespace mapnik { namespace svg {
* structure.
*/
template <typename OutputIterator>
- class svg_generator : private mapnik::noncopyable
+ class svg_generator : private util::noncopyable
{
public:
explicit svg_generator(OutputIterator& output_iterator);
diff --git a/include/mapnik/svg/output/svg_output_attributes.hpp b/include/mapnik/svg/output/svg_output_attributes.hpp
index 8bdf6a3..1de9769 100644
--- a/include/mapnik/svg/output/svg_output_attributes.hpp
+++ b/include/mapnik/svg/output/svg_output_attributes.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/svg/output/svg_output_grammars.hpp b/include/mapnik/svg/output/svg_output_grammars.hpp
index 428a9f7..f3ef886 100644
--- a/include/mapnik/svg/output/svg_output_grammars.hpp
+++ b/include/mapnik/svg/output/svg_output_grammars.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/svg/output/svg_path_iterator.hpp b/include/mapnik/svg/output/svg_path_iterator.hpp
index 73886ac..a56a175 100644
--- a/include/mapnik/svg/output/svg_path_iterator.hpp
+++ b/include/mapnik/svg/output/svg_path_iterator.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,7 @@
#define SVG_PATH_ITERATOR_HPP
// mapnik
-#include <mapnik/geometry.hpp>
+
#include <mapnik/view_transform.hpp>
#include <mapnik/transform_path_adapter.hpp>
// boost
diff --git a/include/mapnik/svg/output/svg_renderer.hpp b/include/mapnik/svg/output/svg_renderer.hpp
index 1784d42..fe4fc65 100644
--- a/include/mapnik/svg/output/svg_renderer.hpp
+++ b/include/mapnik/svg/output/svg_renderer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -28,7 +28,7 @@
#include <mapnik/feature_style_processor.hpp>
#include <mapnik/svg/output/svg_generator.hpp>
#include <mapnik/svg/output/svg_output_attributes.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/rule.hpp> // for rule, symbolizers
#include <mapnik/box2d.hpp> // for box2d
#include <mapnik/color.hpp> // for color
@@ -53,7 +53,7 @@ namespace mapnik {
class feature_type_style;
class label_collision_detector4;
class layer;
- class marker;
+ struct marker;
class proj_transform;
}
@@ -64,7 +64,7 @@ namespace mapnik
// can target many other output destinations besides streams.
template <typename OutputIterator>
class MAPNIK_DECL svg_renderer : public feature_style_processor<svg_renderer<OutputIterator> >,
- private mapnik::noncopyable
+ private util::noncopyable
{
public:
using processor_impl_type = svg_renderer<OutputIterator>;
diff --git a/include/mapnik/svg/svg_converter.hpp b/include/mapnik/svg/svg_converter.hpp
index 6c4fe71..ddde41d 100644
--- a/include/mapnik/svg/svg_converter.hpp
+++ b/include/mapnik/svg/svg_converter.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,7 +26,7 @@
// mapnik
#include <mapnik/svg/svg_path_attributes.hpp>
#include <mapnik/svg/svg_path_adapter.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// agg
#include "agg_path_storage.h"
@@ -44,7 +44,7 @@ namespace mapnik {
namespace svg {
template <typename VertexSource, typename AttributeSource>
-class svg_converter : mapnik::noncopyable
+class svg_converter : util::noncopyable
{
public:
@@ -255,11 +255,13 @@ public:
}
void fill_none()
{
+ cur_attr().fill_none = true;
cur_attr().fill_flag = false;
}
void stroke_none()
{
+ cur_attr().stroke_none = true;
cur_attr().stroke_flag = false;
}
diff --git a/include/mapnik/svg/svg_parser.hpp b/include/mapnik/svg/svg_parser.hpp
index 0806aa2..5198bfd 100644
--- a/include/mapnik/svg/svg_parser.hpp
+++ b/include/mapnik/svg/svg_parser.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -28,14 +28,14 @@
#include <mapnik/svg/svg_converter.hpp>
#include <mapnik/svg/svg_path_adapter.hpp>
#include <mapnik/gradient.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// stl
#include <map>
namespace mapnik { namespace svg {
- class svg_parser : private mapnik::noncopyable
+ class svg_parser : private util::noncopyable
{
public:
explicit svg_parser(svg_converter_type & path);
diff --git a/include/mapnik/svg/svg_path_adapter.hpp b/include/mapnik/svg/svg_path_adapter.hpp
index 417fe86..72fa29a 100644
--- a/include/mapnik/svg/svg_path_adapter.hpp
+++ b/include/mapnik/svg/svg_path_adapter.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,7 @@
#define MAPNIK_SVG_PATH_ADAPTER_HPP
// mapnik
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/box2d.hpp>
// agg
#include "agg_math.h"
@@ -40,7 +40,7 @@ namespace svg {
using namespace agg;
-template<class VertexContainer> class path_adapter : mapnik::noncopyable
+template<class VertexContainer> class path_adapter : util::noncopyable
{
public:
using container_type = VertexContainer ;
@@ -838,7 +838,7 @@ void path_adapter<VC>::translate_all_paths(double dx, double dy)
}
-template<class Container> class vertex_stl_adapter : mapnik::noncopyable
+template<class Container> class vertex_stl_adapter : util::noncopyable
{
public:
diff --git a/include/mapnik/svg/svg_path_attributes.hpp b/include/mapnik/svg/svg_path_attributes.hpp
index 831fd1f..29194ba 100644
--- a/include/mapnik/svg/svg_path_attributes.hpp
+++ b/include/mapnik/svg/svg_path_attributes.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -36,90 +36,97 @@ namespace svg {
struct path_attributes
{
- unsigned index;
+ mapnik::gradient fill_gradient;
+ mapnik::gradient stroke_gradient;
+ agg::trans_affine transform;
double opacity;
- agg::rgba8 fill_color;
double fill_opacity;
- agg::rgba8 stroke_color;
double stroke_opacity;
+ double miter_limit;
+ double stroke_width;
+ unsigned index;
+ agg::rgba8 fill_color;
+ agg::rgba8 stroke_color;
+ agg::line_join_e line_join;
+ agg::line_cap_e line_cap;
bool fill_flag;
+ bool fill_none;
bool stroke_flag;
+ bool stroke_none;
bool even_odd_flag;
bool visibility_flag;
bool display_flag;
- agg::line_join_e line_join;
- agg::line_cap_e line_cap;
- double miter_limit;
- double stroke_width;
- agg::trans_affine transform;
- mapnik::gradient fill_gradient;
- mapnik::gradient stroke_gradient;
// Empty constructor
path_attributes() :
- index(0),
+ fill_gradient(),
+ stroke_gradient(),
+ transform(),
opacity(1.0),
- fill_color(agg::rgba(0,0,0)),
fill_opacity(1.0),
- stroke_color(agg::rgba(0,0,0)),
stroke_opacity(1.0),
+ miter_limit(4.0),
+ stroke_width(1.0),
+ index(0),
+ fill_color(agg::rgba(0,0,0)),
+ stroke_color(agg::rgba(0,0,0)),
+ line_join(agg::miter_join),
+ line_cap(agg::butt_cap),
fill_flag(true),
+ fill_none(false),
stroke_flag(false),
+ stroke_none(false),
even_odd_flag(false),
visibility_flag(true),
- display_flag(true),
- line_join(agg::miter_join),
- line_cap(agg::butt_cap),
- miter_limit(4.0),
- stroke_width(1.0),
- transform(),
- fill_gradient(),
- stroke_gradient()
+ display_flag(true)
{
}
// Copy constructor
- path_attributes(const path_attributes& attr)
- : index(attr.index),
+ path_attributes(path_attributes const& attr)
+ : fill_gradient(attr.fill_gradient),
+ stroke_gradient(attr.stroke_gradient),
+ transform(attr.transform),
opacity(attr.opacity),
- fill_color(attr.fill_color),
fill_opacity(attr.fill_opacity),
- stroke_color(attr.stroke_color),
stroke_opacity(attr.stroke_opacity),
+ miter_limit(attr.miter_limit),
+ stroke_width(attr.stroke_width),
+ index(attr.index),
+ fill_color(attr.fill_color),
+ stroke_color(attr.stroke_color),
+ line_join(attr.line_join),
+ line_cap(attr.line_cap),
fill_flag(attr.fill_flag),
+ fill_none(attr.fill_none),
stroke_flag(attr.stroke_flag),
+ stroke_none(attr.stroke_none),
even_odd_flag(attr.even_odd_flag),
visibility_flag(attr.visibility_flag),
- display_flag(attr.display_flag),
- line_join(attr.line_join),
- line_cap(attr.line_cap),
- miter_limit(attr.miter_limit),
- stroke_width(attr.stroke_width),
- transform(attr.transform),
- fill_gradient(attr.fill_gradient),
- stroke_gradient(attr.stroke_gradient)
+ display_flag(attr.display_flag)
{}
-
// Copy constructor with new index value
path_attributes(path_attributes const& attr, unsigned idx)
- : index(idx),
+ : fill_gradient(attr.fill_gradient),
+ stroke_gradient(attr.stroke_gradient),
+ transform(attr.transform),
opacity(attr.opacity),
- fill_color(attr.fill_color),
fill_opacity(attr.fill_opacity),
- stroke_color(attr.stroke_color),
stroke_opacity(attr.stroke_opacity),
+ miter_limit(attr.miter_limit),
+ stroke_width(attr.stroke_width),
+ index(idx),
+ fill_color(attr.fill_color),
+ stroke_color(attr.stroke_color),
+ line_join(attr.line_join),
+ line_cap(attr.line_cap),
fill_flag(attr.fill_flag),
+ fill_none(attr.fill_none),
stroke_flag(attr.stroke_flag),
+ stroke_none(attr.stroke_none),
even_odd_flag(attr.even_odd_flag),
visibility_flag(attr.visibility_flag),
- display_flag(attr.display_flag),
- line_join(attr.line_join),
- line_cap(attr.line_cap),
- miter_limit(attr.miter_limit),
- stroke_width(attr.stroke_width),
- transform(attr.transform),
- fill_gradient(attr.fill_gradient),
- stroke_gradient(attr.stroke_gradient)
+ display_flag(attr.display_flag)
{}
};
diff --git a/include/mapnik/svg/svg_path_commands.hpp b/include/mapnik/svg/svg_path_commands.hpp
index 23df6ee..905f262 100644
--- a/include/mapnik/svg/svg_path_commands.hpp
+++ b/include/mapnik/svg/svg_path_commands.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/svg/svg_path_grammar.hpp b/include/mapnik/svg/svg_path_grammar.hpp
index 74c9358..1710b61 100644
--- a/include/mapnik/svg/svg_path_grammar.hpp
+++ b/include/mapnik/svg/svg_path_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/svg/svg_path_parser.hpp b/include/mapnik/svg/svg_path_parser.hpp
index 46539ee..e72ad1a 100644
--- a/include/mapnik/svg/svg_path_parser.hpp
+++ b/include/mapnik/svg/svg_path_parser.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/svg/svg_points_grammar.hpp b/include/mapnik/svg/svg_points_grammar.hpp
index ffc4129..e993d35 100644
--- a/include/mapnik/svg/svg_points_grammar.hpp
+++ b/include/mapnik/svg/svg_points_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/svg/svg_renderer_agg.hpp b/include/mapnik/svg/svg_renderer_agg.hpp
index 90ff20a..569f3fa 100644
--- a/include/mapnik/svg/svg_renderer_agg.hpp
+++ b/include/mapnik/svg/svg_renderer_agg.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,7 +27,7 @@
#include <mapnik/svg/svg_path_attributes.hpp>
#include <mapnik/gradient.hpp>
#include <mapnik/box2d.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#if defined(GRID_RENDERER)
#include <mapnik/grid/grid_pixel.hpp>
@@ -98,7 +98,7 @@ private:
};
template <typename VertexSource, typename AttributeSource, typename ScanlineRenderer, typename PixelFormat>
-class svg_renderer_agg : mapnik::noncopyable
+class svg_renderer_agg : util::noncopyable
{
public:
using curved_type = agg::conv_curve<VertexSource> ;
diff --git a/include/mapnik/svg/svg_storage.hpp b/include/mapnik/svg/svg_storage.hpp
index 89e6ebc..c3618b6 100644
--- a/include/mapnik/svg/svg_storage.hpp
+++ b/include/mapnik/svg/svg_storage.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,13 +25,13 @@
// mapnik
#include <mapnik/box2d.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
namespace mapnik {
namespace svg {
template <typename VertexSource ,typename AttributeSource>
-class svg_storage : mapnik::noncopyable
+class svg_storage : util::noncopyable
{
public:
svg_storage() :
diff --git a/include/mapnik/svg/svg_transform_grammar.hpp b/include/mapnik/svg/svg_transform_grammar.hpp
index 5b0f495..ce5563d 100644
--- a/include/mapnik/svg/svg_transform_grammar.hpp
+++ b/include/mapnik/svg/svg_transform_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/symbolizer.hpp b/include/mapnik/symbolizer.hpp
index a0b4d95..8a4745a 100644
--- a/include/mapnik/symbolizer.hpp
+++ b/include/mapnik/symbolizer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -91,6 +91,7 @@ enum class property_types : std::uint8_t
target_justify_alignment,
target_vertical_alignment,
target_upright,
+ target_direction,
target_font_feature_settings
};
@@ -184,6 +185,7 @@ ENUM_FROM_STRING( horizontal_alignment_enum )
ENUM_FROM_STRING( justify_alignment_enum )
ENUM_FROM_STRING( text_transform_enum )
ENUM_FROM_STRING( text_upright_enum )
+ENUM_FROM_STRING( direction_enum )
ENUM_FROM_STRING( gamma_method_enum )
// enum
@@ -289,7 +291,7 @@ struct evaluate_expression_wrapper<mapnik::color>
mapnik::color operator() (T1 const& expr, T2 const& feature, T3 const& vars) const
{
mapnik::value_type val = util::apply_visitor(mapnik::evaluate<T2,mapnik::value_type,T3>(feature,vars), expr);
- if (val.is_null()) return mapnik::color(255,192,203); // pink
+ if (val.is_null()) return mapnik::color(0,0,0,0); // transparent
return mapnik::color(val.to_string());
}
};
@@ -339,7 +341,7 @@ struct evaluate_expression_wrapper<mapnik::font_feature_settings>
};
template <typename T>
-struct extract_value : public util::static_visitor<T>
+struct extract_value
{
using result_type = T;
@@ -379,7 +381,7 @@ struct extract_value : public util::static_visitor<T>
};
template <typename T1>
-struct extract_raw_value : public util::static_visitor<T1>
+struct extract_raw_value
{
using result_type = T1;
@@ -400,14 +402,10 @@ struct extract_raw_value : public util::static_visitor<T1>
}
};
-
-//
-
using property_meta_type = std::tuple<const char*, std::function<std::string(enumeration_wrapper)>, property_types>;
MAPNIK_DECL property_meta_type const& get_meta(mapnik::keys key);
MAPNIK_DECL mapnik::keys get_key(std::string const& name);
-//
template <typename T>
void put(symbolizer_base & sym, keys key, T const& val)
{
diff --git a/include/mapnik/symbolizer_base.hpp b/include/mapnik/symbolizer_base.hpp
index 55472fa..39a78a2 100644
--- a/include/mapnik/symbolizer_base.hpp
+++ b/include/mapnik/symbolizer_base.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -149,6 +149,7 @@ struct MAPNIK_DECL raster_symbolizer : public symbolizer_base {};
struct MAPNIK_DECL building_symbolizer : public symbolizer_base {};
struct MAPNIK_DECL group_symbolizer : public symbolizer_base {};
struct MAPNIK_DECL debug_symbolizer : public symbolizer_base {};
+struct MAPNIK_DECL dot_symbolizer : public symbolizer_base {};
// symbolizer
using symbolizer = util::variant<point_symbolizer,
@@ -162,7 +163,8 @@ using symbolizer = util::variant<point_symbolizer,
building_symbolizer,
markers_symbolizer,
group_symbolizer,
- debug_symbolizer>;
+ debug_symbolizer,
+ dot_symbolizer>;
}
diff --git a/include/mapnik/symbolizer_default_values.hpp b/include/mapnik/symbolizer_default_values.hpp
index 8816d7c..c793acb 100644
--- a/include/mapnik/symbolizer_default_values.hpp
+++ b/include/mapnik/symbolizer_default_values.hpp
@@ -329,6 +329,13 @@ struct symbolizer_default<marker_multi_policy_enum, keys::markers_multipolicy>
static marker_multi_policy_enum value() { return MARKER_EACH_MULTI; }
};
+// direction
+template <>
+struct symbolizer_default<direction_enum, keys::direction>
+{
+ static direction_enum value() { return DIRECTION_RIGHT; }
+};
+
// placement
// colorizer
diff --git a/include/mapnik/symbolizer_dispatch.hpp b/include/mapnik/symbolizer_dispatch.hpp
index a0320cc..213a388 100644
--- a/include/mapnik/symbolizer_dispatch.hpp
+++ b/include/mapnik/symbolizer_dispatch.hpp
@@ -67,7 +67,7 @@ struct process_impl<false>
* \param sym Symbolizer object
*/
template <typename Processor>
-struct symbolizer_dispatch : public util::static_visitor<>
+struct symbolizer_dispatch
{
symbolizer_dispatch(Processor & output,
mapnik::feature_impl & f,
diff --git a/include/mapnik/symbolizer_enumerations.hpp b/include/mapnik/symbolizer_enumerations.hpp
index fef3638..09ec17d 100644
--- a/include/mapnik/symbolizer_enumerations.hpp
+++ b/include/mapnik/symbolizer_enumerations.hpp
@@ -27,7 +27,7 @@
namespace mapnik {
-enum line_cap_enum
+enum line_cap_enum : std::uint8_t
{
BUTT_CAP,
SQUARE_CAP,
@@ -37,7 +37,7 @@ enum line_cap_enum
DEFINE_ENUM( line_cap_e, line_cap_enum );
-enum line_join_enum
+enum line_join_enum : std::uint8_t
{
MITER_JOIN,
MITER_REVERT_JOIN,
@@ -48,7 +48,7 @@ enum line_join_enum
DEFINE_ENUM( line_join_e, line_join_enum );
-enum line_rasterizer_enum
+enum line_rasterizer_enum : std::uint8_t
{
RASTERIZER_FULL, // agg::renderer_scanline_aa_solid
RASTERIZER_FAST, // agg::rasterizer_outline_aa, twice as fast but only good for thin lines
@@ -58,7 +58,7 @@ enum line_rasterizer_enum
DEFINE_ENUM( line_rasterizer_e, line_rasterizer_enum );
-enum halo_rasterizer_enum
+enum halo_rasterizer_enum : std::uint8_t
{
HALO_RASTERIZER_FULL,
HALO_RASTERIZER_FAST,
@@ -67,7 +67,7 @@ enum halo_rasterizer_enum
DEFINE_ENUM(halo_rasterizer_e, halo_rasterizer_enum);
-enum point_placement_enum
+enum point_placement_enum : std::uint8_t
{
CENTROID_POINT_PLACEMENT,
INTERIOR_POINT_PLACEMENT,
@@ -76,7 +76,7 @@ enum point_placement_enum
DEFINE_ENUM( point_placement_e, point_placement_enum );
-enum pattern_alignment_enum
+enum pattern_alignment_enum : std::uint8_t
{
LOCAL_ALIGNMENT,
GLOBAL_ALIGNMENT,
@@ -85,10 +85,11 @@ enum pattern_alignment_enum
DEFINE_ENUM( pattern_alignment_e, pattern_alignment_enum );
-enum debug_symbolizer_mode_enum
+enum debug_symbolizer_mode_enum : std::uint8_t
{
DEBUG_SYM_MODE_COLLISION,
DEBUG_SYM_MODE_VERTEX,
+ DEBUG_SYM_MODE_RINGS,
debug_symbolizer_mode_enum_MAX
};
@@ -97,7 +98,7 @@ DEFINE_ENUM( debug_symbolizer_mode_e, debug_symbolizer_mode_enum );
// markers
// TODO - consider merging with text_symbolizer label_placement_e
-enum marker_placement_enum
+enum marker_placement_enum : std::uint8_t
{
MARKER_POINT_PLACEMENT,
MARKER_INTERIOR_PLACEMENT,
@@ -109,7 +110,7 @@ enum marker_placement_enum
DEFINE_ENUM( marker_placement_e, marker_placement_enum );
-enum marker_multi_policy_enum
+enum marker_multi_policy_enum : std::uint8_t
{
MARKER_EACH_MULTI, // each component in a multi gets its marker
MARKER_WHOLE_MULTI, // consider all components of a multi as a whole
@@ -119,18 +120,19 @@ enum marker_multi_policy_enum
DEFINE_ENUM( marker_multi_policy_e, marker_multi_policy_enum );
-enum text_transform_enum
+enum text_transform_enum : std::uint8_t
{
NONE = 0,
UPPERCASE,
LOWERCASE,
CAPITALIZE,
+ REVERSE,
text_transform_enum_MAX
};
DEFINE_ENUM(text_transform_e, text_transform_enum);
-enum label_placement_enum
+enum label_placement_enum : std::uint8_t
{
POINT_PLACEMENT,
LINE_PLACEMENT,
@@ -141,7 +143,7 @@ enum label_placement_enum
DEFINE_ENUM(label_placement_e, label_placement_enum);
-enum vertical_alignment_enum
+enum vertical_alignment_enum : std::uint8_t
{
V_TOP = 0,
V_MIDDLE,
@@ -152,7 +154,7 @@ enum vertical_alignment_enum
DEFINE_ENUM(vertical_alignment_e, vertical_alignment_enum);
-enum horizontal_alignment_enum
+enum horizontal_alignment_enum : std::uint8_t
{
H_LEFT = 0,
H_MIDDLE,
@@ -164,7 +166,7 @@ enum horizontal_alignment_enum
DEFINE_ENUM(horizontal_alignment_e, horizontal_alignment_enum);
-enum justify_alignment_enum
+enum justify_alignment_enum : std::uint8_t
{
J_LEFT = 0,
J_MIDDLE,
@@ -175,9 +177,10 @@ enum justify_alignment_enum
DEFINE_ENUM(justify_alignment_e, justify_alignment_enum);
-enum text_upright_enum
+enum text_upright_enum : std::uint8_t
{
UPRIGHT_AUTO,
+ UPRIGHT_AUTO_DOWN,
UPRIGHT_LEFT,
UPRIGHT_RIGHT,
UPRIGHT_LEFT_ONLY,
@@ -187,7 +190,23 @@ enum text_upright_enum
DEFINE_ENUM(text_upright_e, text_upright_enum);
-enum gamma_method_enum {
+enum direction_enum : std::uint8_t
+{
+ DIRECTION_LEFT,
+ DIRECTION_RIGHT,
+ DIRECTION_LEFT_ONLY,
+ DIRECTION_RIGHT_ONLY,
+ DIRECTION_AUTO,
+ DIRECTION_AUTO_DOWN,
+ DIRECTION_UP,
+ DIRECTION_DOWN,
+ direction_enum_MAX
+};
+
+DEFINE_ENUM(direction_e, direction_enum);
+
+enum gamma_method_enum : std::uint8_t
+{
GAMMA_POWER, //agg::gamma_power
GAMMA_LINEAR, //agg::gamma_linear
GAMMA_NONE, //agg::gamma_none
diff --git a/include/mapnik/symbolizer_hash.hpp b/include/mapnik/symbolizer_hash.hpp
index 18f0a68..feadf02 100644
--- a/include/mapnik/symbolizer_hash.hpp
+++ b/include/mapnik/symbolizer_hash.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -33,7 +33,7 @@
namespace mapnik {
-struct property_value_hash_visitor : util::static_visitor<std::size_t>
+struct property_value_hash_visitor
{
std::size_t operator() (color const& val) const
{
@@ -82,7 +82,7 @@ struct symbolizer_hash
}
};
-struct symbolizer_hash_visitor : util::static_visitor<std::size_t>
+struct symbolizer_hash_visitor
{
template <typename Symbolizer>
std::size_t operator() (Symbolizer const& sym) const
diff --git a/include/mapnik/symbolizer_keys.hpp b/include/mapnik/symbolizer_keys.hpp
index 817ce2f..ec8649d 100644
--- a/include/mapnik/symbolizer_keys.hpp
+++ b/include/mapnik/symbolizer_keys.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -89,6 +89,7 @@ enum class keys : std::uint8_t
justify_alignment,
vertical_alignment,
upright,
+ direction,
avoid_edges,
ff_settings,
MAX_SYMBOLIZER_KEY
diff --git a/include/mapnik/symbolizer_utils.hpp b/include/mapnik/symbolizer_utils.hpp
index 17fb3a3..00a4f02 100644
--- a/include/mapnik/symbolizer_utils.hpp
+++ b/include/mapnik/symbolizer_utils.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -120,10 +120,16 @@ struct symbolizer_traits<debug_symbolizer>
static char const* name() { return "DebugSymbolizer";}
};
+template<>
+struct symbolizer_traits<dot_symbolizer>
+{
+ static char const* name() { return "DotSymbolizer";}
+};
+
// symbolizer name impl
namespace detail {
-struct symbolizer_name_impl : public util::static_visitor<std::string>
+struct symbolizer_name_impl
{
public:
template <typename Symbolizer>
@@ -144,7 +150,7 @@ inline std::string symbolizer_name(symbolizer const& sym)
/*
template <typename Meta>
-class symbolizer_property_value_string : public util::static_visitor<std::string>
+class symbolizer_property_value_string
{
public:
symbolizer_property_value_string (Meta const& meta)
@@ -231,7 +237,7 @@ private:
Meta const& meta_;
};
-struct symbolizer_to_json : public util::static_visitor<std::string>
+struct symbolizer_to_json
{
using result_type = std::string;
diff --git a/include/mapnik/text/evaluated_format_properties_ptr.hpp b/include/mapnik/text/evaluated_format_properties_ptr.hpp
index be6d6d2..8ead5f6 100644
--- a/include/mapnik/text/evaluated_format_properties_ptr.hpp
+++ b/include/mapnik/text/evaluated_format_properties_ptr.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/text/face.hpp b/include/mapnik/text/face.hpp
index 43363bc..31dd45a 100644
--- a/include/mapnik/text/face.hpp
+++ b/include/mapnik/text/face.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,7 @@
//mapnik
#include <mapnik/text/glyph_info.hpp>
#include <mapnik/config.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// freetype2
extern "C"
@@ -44,7 +44,7 @@ extern "C"
namespace mapnik
{
-class font_face : mapnik::noncopyable
+class font_face : util::noncopyable
{
public:
font_face(FT_Face face);
@@ -77,7 +77,7 @@ private:
using face_ptr = std::shared_ptr<font_face>;
-class MAPNIK_DECL font_face_set : private mapnik::noncopyable
+class MAPNIK_DECL font_face_set : private util::noncopyable
{
public:
using iterator = std::vector<face_ptr>::iterator;
@@ -97,7 +97,7 @@ using face_set_ptr = std::unique_ptr<font_face_set>;
// FT_Stroker wrapper
-class stroker : mapnik::noncopyable
+class stroker : util::noncopyable
{
public:
explicit stroker(FT_Stroker s)
diff --git a/include/mapnik/text/font_library.hpp b/include/mapnik/text/font_library.hpp
index b31efe6..fc5959a 100644
--- a/include/mapnik/text/font_library.hpp
+++ b/include/mapnik/text/font_library.hpp
@@ -25,7 +25,7 @@
// mapnik
#include <mapnik/config.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// stl
#include <memory>
@@ -35,7 +35,7 @@ struct FT_MemoryRec_;
namespace mapnik {
-class MAPNIK_DECL font_library : public noncopyable
+class MAPNIK_DECL font_library : public util::noncopyable
{
public:
explicit font_library();
diff --git a/include/mapnik/text/formatting/base.hpp b/include/mapnik/text/formatting/base.hpp
index 7859e6b..efda3d6 100644
--- a/include/mapnik/text/formatting/base.hpp
+++ b/include/mapnik/text/formatting/base.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/text/formatting/format.hpp b/include/mapnik/text/formatting/format.hpp
index 7f53768..3725986 100644
--- a/include/mapnik/text/formatting/format.hpp
+++ b/include/mapnik/text/formatting/format.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/text/formatting/layout.hpp b/include/mapnik/text/formatting/layout.hpp
index 14cadca..1ea1810 100644
--- a/include/mapnik/text/formatting/layout.hpp
+++ b/include/mapnik/text/formatting/layout.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/text/formatting/list.hpp b/include/mapnik/text/formatting/list.hpp
index c23a717..79314cf 100644
--- a/include/mapnik/text/formatting/list.hpp
+++ b/include/mapnik/text/formatting/list.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/text/formatting/registry.hpp b/include/mapnik/text/formatting/registry.hpp
index c6a71c7..5ad22dd 100644
--- a/include/mapnik/text/formatting/registry.hpp
+++ b/include/mapnik/text/formatting/registry.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,7 +26,7 @@
#include <mapnik/utils.hpp>
#include <mapnik/text/formatting/base.hpp>
#include <mapnik/text/text_properties.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// stl
#include <string>
@@ -40,7 +40,7 @@ namespace formatting
using from_xml_function_ptr = node_ptr (*) (xml_node const&, fontset_map const&) ;
class registry : public singleton<registry, CreateStatic>,
- private mapnik::noncopyable
+ private util::noncopyable
{
public:
registry();
diff --git a/include/mapnik/text/formatting/text.hpp b/include/mapnik/text/formatting/text.hpp
index a7c6b1c..214b3cf 100644
--- a/include/mapnik/text/formatting/text.hpp
+++ b/include/mapnik/text/formatting/text.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/text/glyph_info.hpp b/include/mapnik/text/glyph_info.hpp
index 0daf7bb..4b82ffb 100644
--- a/include/mapnik/text/glyph_info.hpp
+++ b/include/mapnik/text/glyph_info.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,7 @@
//mapnik
#include <mapnik/text/evaluated_format_properties_ptr.hpp>
#include <mapnik/pixel_position.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <memory>
#include <cmath>
@@ -36,7 +36,7 @@ namespace mapnik
class font_face;
using face_ptr = std::shared_ptr<font_face>;
-struct glyph_info : noncopyable
+struct glyph_info : util::noncopyable
{
glyph_info(unsigned g_index,
unsigned c_index,
diff --git a/include/mapnik/text/glyph_positions.hpp b/include/mapnik/text/glyph_positions.hpp
index 2db077b..c75cea3 100644
--- a/include/mapnik/text/glyph_positions.hpp
+++ b/include/mapnik/text/glyph_positions.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -50,18 +50,20 @@ struct glyph_position
struct marker_info
{
- marker_info() : marker(), transform() {}
- marker_info(marker_ptr _marker, agg::trans_affine const& _transform) :
- marker(_marker), transform(_transform) {}
- marker_ptr marker;
- agg::trans_affine transform;
+ //marker_info() : marker(), transform() {}
+ marker_info(std::shared_ptr<marker const> _marker, agg::trans_affine const& _transform) :
+ marker_(_marker), transform_(_transform) {}
+ std::shared_ptr<marker const> marker_;
+ agg::trans_affine transform_;
};
+
using marker_info_ptr = std::shared_ptr<marker_info>;
/** Stores positions of glphys.
*
* The actual glyphs and their format are stored in text_layout.
*/
+
class glyph_positions
{
public:
@@ -78,13 +80,13 @@ public:
pixel_position const& get_base_point() const;
void set_base_point(pixel_position const& base_point);
void set_marker(marker_info_ptr marker, pixel_position const& marker_pos);
- marker_info_ptr marker() const;
+ marker_info_ptr get_marker() const;
pixel_position const& marker_pos() const;
box2d<double> const & bbox() const;
private:
std::vector<glyph_position> data_;
pixel_position base_point_;
- marker_info_ptr marker_;
+ marker_info_ptr marker_info_;
pixel_position marker_pos_;
box2d<double> bbox_;
};
diff --git a/include/mapnik/text/harfbuzz_shaper.hpp b/include/mapnik/text/harfbuzz_shaper.hpp
index 443f59b..8bb37b1 100644
--- a/include/mapnik/text/harfbuzz_shaper.hpp
+++ b/include/mapnik/text/harfbuzz_shaper.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -43,7 +43,7 @@ namespace mapnik
static inline hb_script_t _icu_script_to_script(UScriptCode script)
{
if (script == USCRIPT_INVALID_CODE) return HB_SCRIPT_INVALID;
- return hb_script_from_string(uscript_getShortName(script), -1);
+ return hb_script_from_string(uscript_getShortName(script), -1);
}
static inline const uint16_t * uchar_to_utf16(const UChar* src)
@@ -70,7 +70,6 @@ static void shape_text(text_line & line,
if (!length) return;
std::list<text_item> const& list = itemizer.itemize(start, end);
- if (list.empty()) return;
line.reserve(length);
@@ -79,8 +78,6 @@ static void shape_text(text_line & line,
hb_buffer_pre_allocate(buffer.get(), length);
mapnik::value_unicode_string const& text = itemizer.text();
- font_feature_settings const& ff_settings = list.front().format_->ff_settings;
-
for (auto const& text_item : list)
{
face_set_ptr face_set = font_manager.get_face_set(text_item.format_->face_name, text_item.format_->fontset);
@@ -88,6 +85,7 @@ static void shape_text(text_line & line,
face_set->set_unscaled_character_sizes();
std::size_t num_faces = face_set->size();
std::size_t pos = 0;
+ font_feature_settings const& ff_settings = text_item.format_->ff_settings;
for (auto const& face : *face_set)
{
++pos;
diff --git a/include/mapnik/text/itemizer.hpp b/include/mapnik/text/itemizer.hpp
index e73ef92..0b28bc3 100644
--- a/include/mapnik/text/itemizer.hpp
+++ b/include/mapnik/text/itemizer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,7 +26,7 @@
//mapnik
#include <mapnik/text/evaluated_format_properties_ptr.hpp>
#include <mapnik/value_types.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// stl
#include <string>
@@ -41,7 +41,7 @@
namespace mapnik
{
-struct text_item : noncopyable
+struct text_item : util::noncopyable
{
text_item(unsigned s,
unsigned e,
@@ -84,7 +84,7 @@ public:
std::pair<unsigned, unsigned> line(unsigned i) const;
unsigned num_lines() const;
private:
- template<typename T> struct run : noncopyable
+ template<typename T> struct run : util::noncopyable
{
run(T const& data, unsigned start, unsigned end)
: start(start), end(end), data(data) {}
diff --git a/include/mapnik/text/placement_finder.hpp b/include/mapnik/text/placement_finder.hpp
index f5c8635..9a6c439 100644
--- a/include/mapnik/text/placement_finder.hpp
+++ b/include/mapnik/text/placement_finder.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -29,7 +29,7 @@
#include <mapnik/text/placements/base.hpp>
#include <mapnik/text/glyph_positions.hpp>
#include <mapnik/text/rotation.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
namespace mapnik
{
@@ -42,7 +42,7 @@ class vertex_cache;
class text_placement_info;
struct glyph_info;
-class placement_finder : mapnik::noncopyable
+class placement_finder : util::noncopyable
{
public:
placement_finder(feature_impl const& feature,
@@ -76,7 +76,7 @@ private:
bool collision(box2d<double> const& box, const value_unicode_string &repeat_key, bool line_placement) const;
// Adds marker to glyph_positions and to collision detector. Returns false if there is a collision.
bool add_marker(glyph_positions_ptr glyphs, pixel_position const& pos) const;
- // Maps upright==auto, left_only and right_only to left,right to simplify processing.
+ // Maps upright==auto, left-only and right-only to left,right to simplify processing.
// angle = angle of at start of line (to estimate best option for upright==auto)
text_upright_e simplify_upright(text_upright_e upright, double angle) const;
box2d<double> get_bbox(text_layout const& layout, glyph_info const& glyph, pixel_position const& pos, rotation const& rot);
diff --git a/include/mapnik/text/placement_finder_impl.hpp b/include/mapnik/text/placement_finder_impl.hpp
index 866a095..9bf7256 100644
--- a/include/mapnik/text/placement_finder_impl.hpp
+++ b/include/mapnik/text/placement_finder_impl.hpp
@@ -28,8 +28,8 @@
#include <mapnik/text/text_layout.hpp>
#include <mapnik/text/text_properties.hpp>
#include <mapnik/text/glyph_positions.hpp>
-#include <mapnik/text/vertex_cache.hpp>
-#include <mapnik/text/tolerance_iterator.hpp>
+#include <mapnik/vertex_cache.hpp>
+#include <mapnik/tolerance_iterator.hpp>
// agg
#include "agg_conv_clip_polyline.h"
diff --git a/include/mapnik/text/placements/base.hpp b/include/mapnik/text/placements/base.hpp
index e46907e..06c6cce 100644
--- a/include/mapnik/text/placements/base.hpp
+++ b/include/mapnik/text/placements/base.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -33,11 +33,14 @@ namespace mapnik
using dimension_type = std::pair<double,double>;
class MAPNIK_DECL text_placements;
+class feature_impl;
+struct attribute;
+
// Generate a possible placement.
// This placement has first to be tested by placement_finder to verify it
// can actually be used.
-class MAPNIK_DECL text_placement_info : mapnik::noncopyable
+class MAPNIK_DECL text_placement_info : util::noncopyable
{
public:
// Constructor. Takes the parent text_placements object as a parameter
@@ -84,7 +87,7 @@ public:
// return text_placement_info_ptr(new text_placement_info_XXX(this));
// }
- virtual text_placement_info_ptr get_placement_info(double scale_factor) const = 0;
+ virtual text_placement_info_ptr get_placement_info(double scale_factor, feature_impl const& feature, attributes const& vars) const = 0;
// Get a list of all expressions used in any placement.
// This function is used to collect attributes.
diff --git a/include/mapnik/text/placements/dummy.hpp b/include/mapnik/text/placements/dummy.hpp
index b56634b..18d81fe 100644
--- a/include/mapnik/text/placements/dummy.hpp
+++ b/include/mapnik/text/placements/dummy.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -30,12 +30,14 @@ namespace mapnik
{
class text_placement_info_dummy;
+class feature_impl;
+struct attribute;
// Dummy placement algorithm. Always takes the default value.
class MAPNIK_DECL text_placements_dummy: public text_placements
{
public:
- text_placement_info_ptr get_placement_info(double scale_factor) const;
+ text_placement_info_ptr get_placement_info(double scale_factor, feature_impl const& feature, attributes const& vars) const;
friend class text_placement_info_dummy;
};
diff --git a/include/mapnik/text/placements/list.hpp b/include/mapnik/text/placements/list.hpp
index 2ef2ede..1fa4c87 100644
--- a/include/mapnik/text/placements/list.hpp
+++ b/include/mapnik/text/placements/list.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,14 +26,15 @@
namespace mapnik {
class text_placement_info_list;
-
+class feature_impl;
+struct attribute;
// Tries a list of placements.
class text_placements_list: public text_placements
{
public:
text_placements_list();
- text_placement_info_ptr get_placement_info(double scale_factor) const;
+ text_placement_info_ptr get_placement_info(double scale_factor, feature_impl const& feature, attributes const& vars) const;
virtual void add_expressions(expression_set & output) const;
text_symbolizer_properties & add();
text_symbolizer_properties & get(unsigned i);
diff --git a/include/mapnik/text/placements/registry.hpp b/include/mapnik/text/placements/registry.hpp
index eb0c257..eadfdb3 100644
--- a/include/mapnik/text/placements/registry.hpp
+++ b/include/mapnik/text/placements/registry.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,7 @@
// mapnik
#include <mapnik/utils.hpp>
#include <mapnik/text/placements/base.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// stl
#include <string>
@@ -39,7 +39,7 @@ namespace placements
using from_xml_function_ptr = text_placements_ptr (*) (xml_node const&, fontset_map const&, bool) ;
class registry : public singleton<registry, CreateStatic>,
- private mapnik::noncopyable
+ private util::noncopyable
{
public:
registry();
diff --git a/include/mapnik/text/placements/simple.hpp b/include/mapnik/text/placements/simple.hpp
index ff3cdf6..2a9b983 100644
--- a/include/mapnik/text/placements/simple.hpp
+++ b/include/mapnik/text/placements/simple.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -29,21 +29,25 @@
namespace mapnik {
class text_placement_info_simple;
+class feature_impl;
+struct attribute;
// Automatically generates placement options from a user selected list of directions and text sizes.
class text_placements_simple: public text_placements
{
public:
- text_placements_simple();
- text_placements_simple(std::string const& positions);
- text_placement_info_ptr get_placement_info(double scale_factor) const;
- void set_positions(std::string const& positions);
- std::string get_positions();
- static text_placements_ptr from_xml(xml_node const &xml, fontset_map const & fontsets, bool is_shield);
-private:
- std::string positions_;
+ text_placements_simple(symbolizer_base::value_type const& positions);
+ text_placements_simple(symbolizer_base::value_type const& positions,
+ std::vector<directions_e> && direction,
+ std::vector<int> && text_sizes);
+ text_placement_info_ptr get_placement_info(double scale_factor, feature_impl const& feature, attributes const& vars) const;
+ std::string get_positions() const;
+ static text_placements_ptr from_xml(xml_node const& xml, fontset_map const& fontsets, bool is_shield);
+ void init_positions(std::string const& positions) const;
std::vector<directions_e> direction_;
std::vector<int> text_sizes_;
+private:
+ symbolizer_base::value_type positions_;
friend class text_placement_info_simple;
};
@@ -53,14 +57,15 @@ class text_placement_info_simple : public text_placement_info
{
public:
text_placement_info_simple(text_placements_simple const* parent,
- double scale_factor)
- : text_placement_info(parent, scale_factor),
- state(0), position_state(0), parent_(parent) {}
+ std::string const& evaluated_positions,
+ double scale_factor);
bool next() const;
protected:
bool next_position_only() const;
mutable unsigned state;
mutable unsigned position_state;
+ mutable std::vector<directions_e> direction_;
+ mutable std::vector<int> text_sizes_;
text_placements_simple const* parent_;
};
diff --git a/include/mapnik/text/renderer.hpp b/include/mapnik/text/renderer.hpp
index bc6ee37..ac8bcb4 100644
--- a/include/mapnik/text/renderer.hpp
+++ b/include/mapnik/text/renderer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,7 +27,7 @@
#include <mapnik/text/placement_finder.hpp>
#include <mapnik/image_compositing.hpp>
#include <mapnik/symbolizer_enumerations.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// agg
#include <agg_trans_affine.h>
@@ -50,7 +50,7 @@ struct glyph_t
: image(image_), properties(properties_) {}
};
-class text_renderer : private mapnik::noncopyable
+class text_renderer : private util::noncopyable
{
public:
text_renderer (halo_rasterizer_e rasterizer,
diff --git a/include/mapnik/text/symbolizer_helpers.hpp b/include/mapnik/text/symbolizer_helpers.hpp
index 8e13e77..ce31a04 100644
--- a/include/mapnik/text/symbolizer_helpers.hpp
+++ b/include/mapnik/text/symbolizer_helpers.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,6 +25,7 @@
//mapnik
#include <mapnik/text/placement_finder.hpp>
#include <mapnik/vertex_converters.hpp>
+#include <mapnik/geometry.hpp>
namespace mapnik {
@@ -42,7 +43,7 @@ struct placement_finder_adapter
points_on_line_(points_on_line) {}
template <typename PathT>
- void add_path(PathT & path)
+ void add_path(PathT & path) const
{
status_ = finder_.find_line_placements(path, points_on_line_);
}
@@ -55,11 +56,18 @@ struct placement_finder_adapter
};
-using vertex_converter_type = vertex_converter<placement_finder_adapter<placement_finder>,clip_line_tag , transform_tag, affine_transform_tag, simplify_tag, smooth_tag>;
+using vertex_converter_type = vertex_converter<clip_line_tag , transform_tag, affine_transform_tag, simplify_tag, smooth_tag>;
class base_symbolizer_helper
{
public:
+
+ using point_cref = std::reference_wrapper<geometry::point<double> const>;
+ using line_string_cref = std::reference_wrapper<geometry::line_string<double> const>;
+ using polygon_cref = std::reference_wrapper<geometry::polygon<double> const>;
+ using geometry_cref = util::variant<point_cref, line_string_cref, polygon_cref>;
+ // Using list instead of vector, because we delete random elements and need iterators to stay valid.
+ using geometry_container_type = std::list<geometry_cref>;
base_symbolizer_helper(symbolizer_base const& sym,
feature_impl const& feature,
attributes const& vars,
@@ -85,13 +93,12 @@ protected:
float scale_factor_;
//Processing
- // Using list instead of vector, because we delete random elements and need iterators to stay valid.
// Remaining geometries to be processed.
- mutable std::list<geometry_type*> geometries_to_process_;
+ mutable geometry_container_type geometries_to_process_;
+ // Geometry currently being processed.
+ mutable geometry_container_type::iterator geo_itr_;
// Remaining points to be processed.
mutable std::list<pixel_position> points_;
- // Geometry currently being processed.
- mutable std::list<geometry_type*>::iterator geo_itr_;
// Point currently being processed.
mutable std::list<pixel_position>::iterator point_itr_;
// Use point placement. Otherwise line placement is used.
diff --git a/include/mapnik/text/text_layout.hpp b/include/mapnik/text/text_layout.hpp
index 89ed96d..360c518 100644
--- a/include/mapnik/text/text_layout.hpp
+++ b/include/mapnik/text/text_layout.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/text/text_line.hpp b/include/mapnik/text/text_line.hpp
index 70dcd1a..dd3cfee 100644
--- a/include/mapnik/text/text_line.hpp
+++ b/include/mapnik/text/text_line.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,7 @@
//stl
#include <vector>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
namespace mapnik
{
@@ -35,7 +35,7 @@ struct glyph_info;
// It can be used for rendering but no text processing (like line breaking)
// should be done!
-class text_line : noncopyable
+class text_line : util::noncopyable
{
public:
using glyph_vector = std::vector<glyph_info>;
diff --git a/include/mapnik/text/text_properties.hpp b/include/mapnik/text/text_properties.hpp
index 1f28867..90711a4 100644
--- a/include/mapnik/text/text_properties.hpp
+++ b/include/mapnik/text/text_properties.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -30,7 +30,7 @@
#include <mapnik/text/formatting/base.hpp>
#include <mapnik/symbolizer_base.hpp>
#include <mapnik/symbolizer_enumerations.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/text/font_feature_settings.hpp>
// stl
@@ -63,7 +63,7 @@ struct evaluated_format_properties
font_feature_settings ff_settings;
};
-struct evaluated_text_properties : noncopyable
+struct evaluated_text_properties : util::noncopyable
{
label_placement_e label_placement;
double label_spacing;
@@ -84,7 +84,7 @@ struct evaluated_text_properties : noncopyable
using evaluated_text_properties_ptr = std::unique_ptr<detail::evaluated_text_properties>;
-enum directions_e
+enum directions_e : std::uint8_t
{
NORTH,
EAST,
diff --git a/include/mapnik/text/tolerance_iterator.hpp b/include/mapnik/text/tolerance_iterator.hpp
deleted file mode 100644
index ac83ddd..0000000
--- a/include/mapnik/text/tolerance_iterator.hpp
+++ /dev/null
@@ -1,101 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2013 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-#ifndef MAPNIK_TOLERANCE_ITERATOR_HPP
-#define MAPNIK_TOLERANCE_ITERATOR_HPP
-
-//mapnik
-#include <mapnik/debug.hpp>
-
-namespace mapnik
-{
-
-class tolerance_iterator
-{
-public:
- tolerance_iterator(double label_position_tolerance, double spacing)
- : tolerance_(label_position_tolerance > 0 ?
- label_position_tolerance : spacing/2.0),
- linear_position_(1.0),
- value_(0),
- initialized_(false),
- values_tried_(0)
- {
- }
-
- ~tolerance_iterator()
- {
- //std::cout << "values tried:" << values_tried_ << "\n";
- }
-
- double get() const
- {
- return -value_;
- }
-
- bool next()
- {
- ++values_tried_;
- if (values_tried_ > 255)
- {
- /* This point should not be reached during normal operation. But I can think of
- * cases where very bad spacing and or tolerance values are choosen and the
- * placement finder tries an excessive number of placements.
- * 255 is an arbitrarily chosen limit.
- */
- MAPNIK_LOG_WARN(placement_finder) << "Tried a huge number of placements. Please check "
- "'label-position-tolerance' and 'spacing' parameters "
- "of your TextSymbolizers.\n";
- return false;
- }
- if (!initialized_)
- {
- initialized_ = true;
- return true; //Always return value 0 as the first value.
- }
- if (value_ == 0)
- {
- value_ = linear_position_;
- return true;
- }
- value_ = -value_;
- if (value_ > 0)
- {
- value_ = std::pow(1.3, linear_position_) * linear_position_ / (4.0 * tolerance_) + linear_position_;
- linear_position_ += 1.0;
- }
- if (value_ > tolerance_)
- {
- return false;
- }
- return true;
- }
-private:
- double tolerance_;
- double linear_position_;
- double value_;
- bool initialized_;
- unsigned values_tried_;
-};
-
-}//ns mapnik
-
-#endif // MAPNIK_TOLERANCE_ITERATOR_HPP
diff --git a/include/mapnik/text/vertex_cache.hpp b/include/mapnik/text/vertex_cache.hpp
deleted file mode 100644
index 2779360..0000000
--- a/include/mapnik/text/vertex_cache.hpp
+++ /dev/null
@@ -1,228 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2013 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-#ifndef MAPNIK_VERTEX_CACHE_HPP
-#define MAPNIK_VERTEX_CACHE_HPP
-
-// mapnik
-#include <mapnik/pixel_position.hpp>
-#include <mapnik/debug.hpp>
-#include <mapnik/config.hpp>
-#include <mapnik/noncopyable.hpp>
-
-// agg
-#include "agg_basics.h"
-
-// stl
-#include <vector>
-#include <memory>
-#include <map>
-
-namespace mapnik
-{
-
-class vertex_cache;
-using vertex_cache_ptr = std::unique_ptr<vertex_cache>;
-
-// Caches all path points and their lengths. Allows easy moving in both directions.
-class MAPNIK_DECL vertex_cache : noncopyable
-{
- struct segment
- {
- segment(double x, double y, double length) : pos(x, y), length(length) {}
- pixel_position pos; //Last point of this segment, first point is implicitly defined by the previous segement in this vector
- double length;
- };
-
- // The first segment always has the length 0 and just defines the starting point.
- struct segment_vector
- {
- segment_vector() : vector(), length(0.) {}
- void add_segment(double x, double y, double len) {
- if (len == 0. && !vector.empty()) return; //Don't add zero length segments
- vector.emplace_back(x, y, len);
- length += len;
- }
- using iterator = std::vector<segment>::iterator;
- std::vector<segment> vector;
- double length;
- };
-
-public:
- // This class has no public members to avoid acciedential modification.
- // It should only be used with save_state/restore_state.
- class state
- {
- segment_vector::iterator current_segment;
- double position_in_segment;
- pixel_position current_position;
- pixel_position segment_starting_point;
- double position_;
- friend class vertex_cache;
- public:
- pixel_position const& position() const { return current_position; }
- };
-
- class scoped_state : noncopyable
- {
- public:
- scoped_state(vertex_cache &pp) : pp_(pp), state_(pp.save_state()), restored_(false) {}
- void restore() { pp_.restore_state(state_); restored_ = true; }
- ~scoped_state() { if (!restored_) pp_.restore_state(state_); }
- state const& get_state() const { return state_; }
- private:
- vertex_cache &pp_;
- state state_;
- bool restored_;
- };
-
- ///////////////////////////////////////////////////////////////////////
-
- template <typename T> vertex_cache(T &path);
-
- double length() const { return current_subpath_->length; }
-
-
- pixel_position const& current_position() const { return current_position_; }
- double angle(double width=0.);
- double linear_position() const { return position_; }
-
-
- // Returns a parallel line in the specified distance.
- vertex_cache & get_offseted(double offset, double region_width);
-
-
- // Skip a certain amount of space.
- // This functions automatically calculate new points if the position is not exactly
- // on a point on the path.
-
- bool forward(double length);
- // Go backwards.
- bool backward(double length);
- // Move in any direction (based on sign of length). Returns false if it reaches either end of the path.
- bool move(double length);
- // Move to given distance.
- bool move_to_distance(double distance);
- // Work on next subpath. Returns false if the is no next subpath.
- bool next_subpath();
-
- // Compatibility with standard path interface
- void rewind(unsigned);
- unsigned vertex(double *x, double *y);
-
- // State
- state save_state() const;
- void restore_state(state const& s);
- // Go back to initial state.
- void reset();
-
- // position on this line closest to the target position
- double position_closest_to(pixel_position const &target_pos);
-
-private:
- void rewind_subpath();
- bool next_segment();
- bool previous_segment();
- double current_segment_angle();
- void find_line_circle_intersection(
- double cx, double cy, double radius,
- double x1, double y1, double x2, double y2,
- double & ix, double & iy) const;
- // Position as calculated by last move/forward/next call.
- pixel_position current_position_;
- // First pixel of current segment.
- pixel_position segment_starting_point_;
- // List of all subpaths.
- std::vector<segment_vector> subpaths_;
- // Currently active subpath.
- std::vector<segment_vector>::iterator current_subpath_;
- // Current segment for normal operation (move()).
- segment_vector::iterator current_segment_;
- // Current segment in compatibility mode (vertex(), rewind()).
- segment_vector::iterator vertex_segment_;
- // Currently active subpath in compatibility mode.
- std::vector<segment_vector>::iterator vertex_subpath_;
- // State is initialized (after first call to next_subpath()).
- bool initialized_;
- // Position from start of segment.
- double position_in_segment_;
- // Angle for current segment.
- mutable double angle_;
- // Is the value in angle_ valid?
- // Used to avoid unnecessary calculations.
- mutable bool angle_valid_;
- using offseted_lines_map = std::map<double, vertex_cache_ptr>;
- // Cache of all offseted lines already computed.
- offseted_lines_map offseted_lines_;
- // Linear position, i.e distance from start of line.
- double position_;
-};
-
-
-template <typename T>
-vertex_cache::vertex_cache(T & path)
- : current_position_(),
- segment_starting_point_(),
- subpaths_(),
- current_subpath_(),
- current_segment_(),
- vertex_segment_(),
- vertex_subpath_(),
- initialized_(false),
- position_in_segment_(0.),
- angle_(0.),
- angle_valid_(false),
- offseted_lines_(),
- position_(0.)
-{
- path.rewind(0);
- unsigned cmd;
- double new_x = 0., new_y = 0., old_x = 0., old_y = 0.;
- bool first = true; //current_subpath_ uninitalized
- while (!agg::is_stop(cmd = path.vertex(&new_x, &new_y)))
- {
- if (agg::is_move_to(cmd))
- {
- //Create new sub path
- subpaths_.emplace_back();
- current_subpath_ = subpaths_.end()-1;
- current_subpath_->add_segment(new_x, new_y, 0);
- first = false;
- }
- if (agg::is_line_to(cmd))
- {
- if (first)
- {
- MAPNIK_LOG_ERROR(vertex_cache) << "No starting point in path!\n";
- continue;
- }
- double dx = old_x - new_x;
- double dy = old_y - new_y;
- double segment_length = std::sqrt(dx*dx + dy*dy);
- current_subpath_->add_segment(new_x, new_y, segment_length);
- }
- old_x = new_x;
- old_y = new_y;
- }
-}
-
-}
-#endif
diff --git a/include/mapnik/tiff_io.hpp b/include/mapnik/tiff_io.hpp
index 395b9c4..fd3a753 100644
--- a/include/mapnik/tiff_io.hpp
+++ b/include/mapnik/tiff_io.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,24 +25,26 @@
#include <mapnik/global.hpp>
#include <mapnik/image_util.hpp>
+#include <mapnik/image_any.hpp>
+#include <mapnik/util/variant.hpp>
extern "C"
{
-#ifdef HAVE_GEOTIFF
-#include <xtiffio.h>
-#include <geotiffio.h>
-#define RealTIFFOpen XTIFFClientOpen
-#define RealTIFFClose XTIFFClose
-#else
#include <tiffio.h>
#define RealTIFFOpen TIFFClientOpen
#define RealTIFFClose TIFFClose
-#endif
}
+//std
+#include <memory>
+
+#define TIFF_WRITE_SCANLINE 0
+#define TIFF_WRITE_STRIPPED 1
+#define TIFF_WRITE_TILED 2
+
namespace mapnik {
-static tsize_t tiff_write_proc(thandle_t fd, tdata_t buf, tsize_t size)
+static inline tsize_t tiff_write_proc(thandle_t fd, tdata_t buf, tsize_t size)
{
std::ostream* out = reinterpret_cast<std::ostream*>(fd);
std::ios::pos_type pos = out->tellp();
@@ -61,7 +63,7 @@ static tsize_t tiff_write_proc(thandle_t fd, tdata_t buf, tsize_t size)
}
}
-static toff_t tiff_seek_proc(thandle_t fd, toff_t off, int whence)
+static inline toff_t tiff_seek_proc(thandle_t fd, toff_t off, int whence)
{
std::ostream* out = reinterpret_cast<std::ostream*>(fd);
@@ -130,14 +132,14 @@ static toff_t tiff_seek_proc(thandle_t fd, toff_t off, int whence)
return static_cast<toff_t>(out->tellp());
}
-static int tiff_close_proc(thandle_t fd)
+static inline int tiff_close_proc(thandle_t fd)
{
std::ostream* out = (std::ostream*)fd;
out->flush();
return 0;
}
-static toff_t tiff_size_proc(thandle_t fd)
+static inline toff_t tiff_size_proc(thandle_t fd)
{
std::ostream* out = reinterpret_cast<std::ostream*>(fd);
std::ios::pos_type pos = out->tellp();
@@ -147,27 +149,250 @@ static toff_t tiff_size_proc(thandle_t fd)
return static_cast<toff_t>(len);
}
-static tsize_t tiff_dummy_read_proc(thandle_t , tdata_t , tsize_t)
+static inline tsize_t tiff_dummy_read_proc(thandle_t , tdata_t , tsize_t)
{
return 0;
}
-static void tiff_dummy_unmap_proc(thandle_t , tdata_t , toff_t)
+static inline void tiff_dummy_unmap_proc(thandle_t , tdata_t , toff_t) {}
+
+static inline int tiff_dummy_map_proc(thandle_t , tdata_t*, toff_t* )
{
+ return 0;
}
-static int tiff_dummy_map_proc(thandle_t , tdata_t*, toff_t* )
+struct tiff_config
{
- return 0;
+ tiff_config()
+ : compression(COMPRESSION_ADOBE_DEFLATE),
+ zlevel(4),
+ tile_width(0),
+ tile_height(0),
+ rows_per_strip(0),
+ method(TIFF_WRITE_STRIPPED) {}
+
+ int compression;
+ int zlevel;
+ int tile_width; // Tile width of zero means tile the width of the image
+ int tile_height; // Tile height of zero means tile the height of the image
+ int rows_per_strip;
+ int method; // The method to use to write the TIFF.
+
+};
+
+struct tag_setter
+{
+ tag_setter(TIFF * output, tiff_config const& config)
+ : output_(output),
+ config_(config) {}
+
+ template <typename T>
+ void operator() (T const&) const
+ {
+ // Assume this would be null type
+ throw image_writer_exception("Could not write TIFF - unknown image type provided");
+ }
+
+ inline void operator() (image_rgba8 const& data) const
+ {
+ TIFFSetField(output_, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
+ TIFFSetField(output_, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
+ TIFFSetField(output_, TIFFTAG_BITSPERSAMPLE, 8);
+ TIFFSetField(output_, TIFFTAG_SAMPLESPERPIXEL, 4);
+ if (data.get_premultiplied())
+ {
+ uint16 extras[] = { EXTRASAMPLE_ASSOCALPHA };
+ TIFFSetField(output_, TIFFTAG_EXTRASAMPLES, 1, extras);
+ }
+ else
+ {
+ uint16 extras[] = { EXTRASAMPLE_UNASSALPHA };
+ TIFFSetField(output_, TIFFTAG_EXTRASAMPLES, 1, extras);
+ }
+ if (config_.compression == COMPRESSION_DEFLATE
+ || config_.compression == COMPRESSION_ADOBE_DEFLATE
+ || config_.compression == COMPRESSION_LZW)
+ {
+ TIFFSetField(output_, TIFFTAG_PREDICTOR, PREDICTOR_HORIZONTAL);
+
+ }
+ }
+ inline void operator() (image_gray64 const&) const
+ {
+ TIFFSetField(output_, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+ TIFFSetField(output_, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
+ TIFFSetField(output_, TIFFTAG_BITSPERSAMPLE, 64);
+ TIFFSetField(output_, TIFFTAG_SAMPLESPERPIXEL, 1);
+ if (config_.compression == COMPRESSION_DEFLATE
+ || config_.compression == COMPRESSION_ADOBE_DEFLATE
+ || config_.compression == COMPRESSION_LZW)
+ {
+ TIFFSetField(output_, TIFFTAG_PREDICTOR, PREDICTOR_HORIZONTAL);
+
+ }
+ }
+ inline void operator() (image_gray64s const&) const
+ {
+ TIFFSetField(output_, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+ TIFFSetField(output_, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT);
+ TIFFSetField(output_, TIFFTAG_BITSPERSAMPLE, 64);
+ TIFFSetField(output_, TIFFTAG_SAMPLESPERPIXEL, 1);
+ if (config_.compression == COMPRESSION_DEFLATE
+ || config_.compression == COMPRESSION_ADOBE_DEFLATE
+ || config_.compression == COMPRESSION_LZW)
+ {
+ TIFFSetField(output_, TIFFTAG_PREDICTOR, PREDICTOR_HORIZONTAL);
+
+ }
+ }
+ inline void operator() (image_gray64f const&) const
+ {
+ TIFFSetField(output_, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+ TIFFSetField(output_, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP);
+ TIFFSetField(output_, TIFFTAG_BITSPERSAMPLE, 64);
+ TIFFSetField(output_, TIFFTAG_SAMPLESPERPIXEL, 1);
+ if (config_.compression == COMPRESSION_DEFLATE
+ || config_.compression == COMPRESSION_ADOBE_DEFLATE
+ || config_.compression == COMPRESSION_LZW)
+ {
+ TIFFSetField(output_, TIFFTAG_PREDICTOR, PREDICTOR_FLOATINGPOINT);
+ }
+ }
+ inline void operator() (image_gray32 const&) const
+ {
+ TIFFSetField(output_, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+ TIFFSetField(output_, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
+ TIFFSetField(output_, TIFFTAG_BITSPERSAMPLE, 32);
+ TIFFSetField(output_, TIFFTAG_SAMPLESPERPIXEL, 1);
+ if (config_.compression == COMPRESSION_DEFLATE
+ || config_.compression == COMPRESSION_ADOBE_DEFLATE
+ || config_.compression == COMPRESSION_LZW)
+ {
+ TIFFSetField(output_, TIFFTAG_PREDICTOR, PREDICTOR_HORIZONTAL);
+
+ }
+ }
+ inline void operator() (image_gray32s const&) const
+ {
+ TIFFSetField(output_, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+ TIFFSetField(output_, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT);
+ TIFFSetField(output_, TIFFTAG_BITSPERSAMPLE, 32);
+ TIFFSetField(output_, TIFFTAG_SAMPLESPERPIXEL, 1);
+ if (config_.compression == COMPRESSION_DEFLATE
+ || config_.compression == COMPRESSION_ADOBE_DEFLATE
+ || config_.compression == COMPRESSION_LZW)
+ {
+ TIFFSetField(output_, TIFFTAG_PREDICTOR, PREDICTOR_HORIZONTAL);
+
+ }
+ }
+ inline void operator() (image_gray32f const&) const
+ {
+ TIFFSetField(output_, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+ TIFFSetField(output_, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP);
+ TIFFSetField(output_, TIFFTAG_BITSPERSAMPLE, 32);
+ TIFFSetField(output_, TIFFTAG_SAMPLESPERPIXEL, 1);
+ if (config_.compression == COMPRESSION_DEFLATE
+ || config_.compression == COMPRESSION_ADOBE_DEFLATE
+ || config_.compression == COMPRESSION_LZW)
+ {
+ TIFFSetField(output_, TIFFTAG_PREDICTOR, PREDICTOR_FLOATINGPOINT);
+ }
+ }
+ inline void operator() (image_gray16 const&) const
+ {
+ TIFFSetField(output_, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+ TIFFSetField(output_, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
+ TIFFSetField(output_, TIFFTAG_BITSPERSAMPLE, 16);
+ TIFFSetField(output_, TIFFTAG_SAMPLESPERPIXEL, 1);
+ if (config_.compression == COMPRESSION_DEFLATE
+ || config_.compression == COMPRESSION_ADOBE_DEFLATE
+ || config_.compression == COMPRESSION_LZW)
+ {
+ TIFFSetField(output_, TIFFTAG_PREDICTOR, PREDICTOR_HORIZONTAL);
+
+ }
+ }
+ inline void operator() (image_gray16s const&) const
+ {
+ TIFFSetField(output_, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+ TIFFSetField(output_, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT);
+ TIFFSetField(output_, TIFFTAG_BITSPERSAMPLE, 16);
+ TIFFSetField(output_, TIFFTAG_SAMPLESPERPIXEL, 1);
+ if (config_.compression == COMPRESSION_DEFLATE
+ || config_.compression == COMPRESSION_ADOBE_DEFLATE
+ || config_.compression == COMPRESSION_LZW)
+ {
+ TIFFSetField(output_, TIFFTAG_PREDICTOR, PREDICTOR_HORIZONTAL);
+
+ }
+ }
+ inline void operator() (image_gray8 const&) const
+ {
+ TIFFSetField(output_, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+ TIFFSetField(output_, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
+ TIFFSetField(output_, TIFFTAG_BITSPERSAMPLE, 8);
+ TIFFSetField(output_, TIFFTAG_SAMPLESPERPIXEL, 1);
+ if (config_.compression == COMPRESSION_DEFLATE
+ || config_.compression == COMPRESSION_ADOBE_DEFLATE
+ || config_.compression == COMPRESSION_LZW)
+ {
+ TIFFSetField(output_, TIFFTAG_PREDICTOR, PREDICTOR_HORIZONTAL);
+
+ }
+ }
+ inline void operator() (image_gray8s const&) const
+ {
+ TIFFSetField(output_, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+ TIFFSetField(output_, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT);
+ TIFFSetField(output_, TIFFTAG_BITSPERSAMPLE, 8);
+ TIFFSetField(output_, TIFFTAG_SAMPLESPERPIXEL, 1);
+ if (config_.compression == COMPRESSION_DEFLATE
+ || config_.compression == COMPRESSION_ADOBE_DEFLATE
+ || config_.compression == COMPRESSION_LZW)
+ {
+ TIFFSetField(output_, TIFFTAG_PREDICTOR, PREDICTOR_HORIZONTAL);
+
+ }
+ }
+ inline void operator() (image_null const&) const
+ {
+ // Assume this would be null type
+ throw image_writer_exception("Could not write TIFF - Null image provided");
+ }
+
+ private:
+ TIFF * output_;
+ tiff_config const& config_;
+};
+
+inline void set_tiff_config(TIFF* output, tiff_config const& config)
+{
+ // Set some constant tiff information that doesn't vary based on type of data
+ // or image size
+ TIFFSetField(output, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
+
+ // Set the compression for the TIFF
+ TIFFSetField(output, TIFFTAG_COMPRESSION, config.compression);
+
+ if (COMPRESSION_ADOBE_DEFLATE == config.compression
+ || COMPRESSION_DEFLATE == config.compression
+ || COMPRESSION_LZW == config.compression)
+ {
+ // Set the zip level for the compression
+ // http://en.wikipedia.org/wiki/DEFLATE#Encoder.2Fcompressor
+ // Changes the time spent trying to compress
+ TIFFSetField(output, TIFFTAG_ZIPQUALITY, config.zlevel);
+ }
}
template <typename T1, typename T2>
-void save_as_tiff(T1 & file, T2 const& image)
+void save_as_tiff(T1 & file, T2 const& image, tiff_config const& config)
{
+ using pixel_type = typename T2::pixel_type;
+
const int width = image.width();
const int height = image.height();
- const int scanline_size = sizeof(unsigned char) * width * 3;
-
TIFF* output = RealTIFFOpen("mapnik_tiff_stream",
"wm",
@@ -181,18 +406,109 @@ void save_as_tiff(T1 & file, T2 const& image)
tiff_dummy_unmap_proc);
if (! output)
{
- throw ImageWriterException("Could not write TIFF");
+ throw image_writer_exception("Could not write TIFF");
}
TIFFSetField(output, TIFFTAG_IMAGEWIDTH, width);
TIFFSetField(output, TIFFTAG_IMAGELENGTH, height);
- TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE);
- TIFFSetField(output, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
- TIFFSetField(output, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
- TIFFSetField(output, TIFFTAG_BITSPERSAMPLE, 8);
- TIFFSetField(output, TIFFTAG_SAMPLESPERPIXEL, 3);
- TIFFSetField(output, TIFFTAG_ROWSPERSTRIP, 1);
+ TIFFSetField(output, TIFFTAG_IMAGEDEPTH, 1);
+ set_tiff_config(output, config);
+
+ // Set tags that vary based on the type of data being provided.
+ tag_setter set(output, config);
+ set(image);
+
+ // Use specific types of writing methods.
+ if (TIFF_WRITE_SCANLINE == config.method)
+ {
+ // Process Scanline
+ TIFFSetField(output, TIFFTAG_ROWSPERSTRIP, 1);
+
+ int next_scanline = 0;
+ std::unique_ptr<pixel_type[]> row (new pixel_type[width]);
+ while (next_scanline < height)
+ {
+ std::copy(image.get_row(next_scanline), image.get_row(next_scanline) + width, row.get());
+ TIFFWriteScanline(output, row.get(), next_scanline, 0);
+ ++next_scanline;
+ }
+ }
+ else if (TIFF_WRITE_STRIPPED == config.method)
+ {
+ std::size_t rows_per_strip = config.rows_per_strip;
+ if (0 == rows_per_strip)
+ {
+ rows_per_strip = height;
+ }
+ TIFFSetField(output, TIFFTAG_ROWSPERSTRIP, rows_per_strip);
+ std::size_t strip_size = width * rows_per_strip;
+ std::unique_ptr<pixel_type[]> strip_buffer(new pixel_type[strip_size]);
+ for (int y=0; y < height; y+=rows_per_strip)
+ {
+ int ty1 = std::min(height, static_cast<int>(y + rows_per_strip)) - y;
+ int row = y;
+ for (int ty = 0; ty < ty1; ++ty, ++row)
+ {
+ std::copy(image.get_row(row), image.get_row(row) + width, strip_buffer.get() + ty * width);
+ }
+ if (TIFFWriteEncodedStrip(output, TIFFComputeStrip(output, y, 0), strip_buffer.get(), strip_size * sizeof(pixel_type)) == -1)
+ {
+ throw image_writer_exception("Could not write TIFF - TIFF Tile Write failed");
+ }
+ }
+ }
+ else if (TIFF_WRITE_TILED == config.method)
+ {
+ int tile_width = config.tile_width;
+ int tile_height = config.tile_height;
+ if (0 == tile_height)
+ {
+ tile_height = height;
+ if (height % 16 > 0)
+ {
+ tile_height = height + 16 - (height % 16);
+ }
+ }
+ if (0 == tile_width)
+ {
+ tile_width = width;
+ if (width % 16 > 0)
+ {
+ tile_width = width + 16 - (width % 16);
+ }
+ }
+ TIFFSetField(output, TIFFTAG_TILEWIDTH, tile_width);
+ TIFFSetField(output, TIFFTAG_TILELENGTH, tile_height);
+ TIFFSetField(output, TIFFTAG_TILEDEPTH, 1);
+ std::size_t tile_size = tile_width * tile_height;
+ std::unique_ptr<pixel_type[]> image_out (new pixel_type[tile_size]);
+ int end_y = (height / tile_height + 1) * tile_height;
+ int end_x = (width / tile_width + 1) * tile_width;
+ end_y = std::min(end_y, height);
+ end_x = std::min(end_x, width);
+
+ for (int y = 0; y < end_y; y += tile_height)
+ {
+ int ty1 = std::min(height, y + tile_height) - y;
+
+ for (int x = 0; x < end_x; x += tile_width)
+ {
+ // Prefill the entire array with zeros.
+ std::fill(image_out.get(), image_out.get() + tile_size, 0);
+ int tx1 = std::min(width, x + tile_width);
+ int row = y;
+ for (int ty = 0; ty < ty1; ++ty, ++row)
+ {
+ std::copy(image.get_row(row, x), image.get_row(row, tx1), image_out.get() + ty * tile_width);
+ }
+ if (TIFFWriteEncodedTile(output, TIFFComputeTile(output, x, y, 0, 0), image_out.get(), tile_size * sizeof(pixel_type)) == -1)
+ {
+ throw image_writer_exception("Could not write TIFF - TIFF Tile Write failed");
+ }
+ }
+ }
+ }
// TODO - handle palette images
// std::vector<mapnik::rgb> const& palette
@@ -206,55 +522,6 @@ void save_as_tiff(T1 & file, T2 const& image)
// TIFFSetField(output, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE);
// TIFFSetField(output, TIFFTAG_COLORMAP, r, g, b);
-#ifdef HAVE_GEOTIFF
- GTIF* geotiff = GTIFNew(output);
- if (! geotiff)
- {
- // throw ?
- }
-
- GTIFKeySet(geotiff, GTModelTypeGeoKey, TYPE_SHORT, 1, ModelGeographic);
- GTIFKeySet(geotiff, GTRasterTypeGeoKey, TYPE_SHORT, 1, RasterPixelIsPoint);
- GTIFKeySet(geotiff, GeographicTypeGeoKey, TYPE_SHORT, 1, 4326); // parameter needed !
- GTIFKeySet(geotiff, GeogAngularUnitsGeoKey, TYPE_SHORT, 1, Angular_Degree);
- GTIFKeySet(geotiff, GeogLinearUnitsGeoKey, TYPE_SHORT, 1, Linear_Meter);
-
- double lowerLeftLon = 130.0f; // parameter needed !
- double upperRightLat = 32.0; // parameter needed !
- double tiepoints[] = { 0.0, 0.0, 0.0, lowerLeftLon, upperRightLat, 0.0 };
- TIFFSetField(output, TIFFTAG_GEOTIEPOINTS, sizeof(tiepoints)/sizeof(double), tiepoints);
-
- double pixelScaleX = 0.0001; // parameter needed !
- double pixelScaleY = 0.0001; // parameter needed !
- double pixscale[] = { pixelScaleX, pixelScaleY, 0.0 };
- TIFFSetField(output, TIFFTAG_GEOPIXELSCALE, sizeof(pixscale)/sizeof(double), pixscale);
-#endif
-
- int next_scanline = 0;
- unsigned char* row = reinterpret_cast<unsigned char*>(::operator new(scanline_size));
-
- while (next_scanline < height)
- {
- const unsigned* imageRow = image.getRow(next_scanline);
-
- for (int i = 0, index = 0; i < width; ++i)
- {
- row[index++] = (imageRow[i]) & 0xff;
- row[index++] = (imageRow[i] >> 8) & 0xff;
- row[index++] = (imageRow[i] >> 16) & 0xff;
- }
-
- TIFFWriteScanline(output, row, next_scanline, 0);
- ++next_scanline;
- }
-
- ::operator delete(row);
-
-#ifdef HAVE_GEOTIFF
- GTIFWriteKeys(geotiff);
- GTIFFree(geotiff);
-#endif
-
RealTIFFClose(output);
}
diff --git a/include/mapnik/timer.hpp b/include/mapnik/timer.hpp
index d0727b5..22a67a3 100644
--- a/include/mapnik/timer.hpp
+++ b/include/mapnik/timer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/tolerance_iterator.hpp b/include/mapnik/tolerance_iterator.hpp
new file mode 100644
index 0000000..041cb11
--- /dev/null
+++ b/include/mapnik/tolerance_iterator.hpp
@@ -0,0 +1,101 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+#ifndef MAPNIK_TOLERANCE_ITERATOR_HPP
+#define MAPNIK_TOLERANCE_ITERATOR_HPP
+
+//mapnik
+#include <mapnik/debug.hpp>
+
+namespace mapnik
+{
+
+class tolerance_iterator
+{
+public:
+ tolerance_iterator(double label_position_tolerance, double spacing)
+ : tolerance_(label_position_tolerance > 0 ?
+ label_position_tolerance : spacing/2.0),
+ linear_position_(1.0),
+ value_(0),
+ initialized_(false),
+ values_tried_(0)
+ {
+ }
+
+ ~tolerance_iterator()
+ {
+ //std::cout << "values tried:" << values_tried_ << "\n";
+ }
+
+ double get() const
+ {
+ return -value_;
+ }
+
+ bool next()
+ {
+ ++values_tried_;
+ if (values_tried_ > 255)
+ {
+ /* This point should not be reached during normal operation. But I can think of
+ * cases where very bad spacing and or tolerance values are choosen and the
+ * placement finder tries an excessive number of placements.
+ * 255 is an arbitrarily chosen limit.
+ */
+ MAPNIK_LOG_WARN(placement_finder) << "Tried a huge number of placements. Please check "
+ "'label-position-tolerance' and 'spacing' parameters "
+ "of your TextSymbolizers.\n";
+ return false;
+ }
+ if (!initialized_)
+ {
+ initialized_ = true;
+ return true; //Always return value 0 as the first value.
+ }
+ if (value_ == 0)
+ {
+ value_ = linear_position_;
+ return true;
+ }
+ value_ = -value_;
+ if (value_ > 0)
+ {
+ value_ = std::pow(1.3, linear_position_) * linear_position_ / (4.0 * tolerance_) + linear_position_;
+ linear_position_ += 1.0;
+ }
+ if (value_ > tolerance_)
+ {
+ return false;
+ }
+ return true;
+ }
+private:
+ double tolerance_;
+ double linear_position_;
+ double value_;
+ bool initialized_;
+ unsigned values_tried_;
+};
+
+}//ns mapnik
+
+#endif // MAPNIK_TOLERANCE_ITERATOR_HPP
diff --git a/include/mapnik/transform_expression.hpp b/include/mapnik/transform_expression.hpp
index c1715aa..d73554b 100644
--- a/include/mapnik/transform_expression.hpp
+++ b/include/mapnik/transform_expression.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -192,7 +192,7 @@ inline void clear(transform_node& val)
namespace {
-struct is_null_transform_node : public mapnik::util::static_visitor<bool>
+struct is_null_transform_node
{
bool operator() (value const& val) const
{
diff --git a/include/mapnik/transform_expression_grammar.hpp b/include/mapnik/transform_expression_grammar.hpp
index 220d512..6772c80 100644
--- a/include/mapnik/transform_expression_grammar.hpp
+++ b/include/mapnik/transform_expression_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/transform_expression_grammar_impl.hpp b/include/mapnik/transform_expression_grammar_impl.hpp
index b080e20..59ca57a 100644
--- a/include/mapnik/transform_expression_grammar_impl.hpp
+++ b/include/mapnik/transform_expression_grammar_impl.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/transform_path_adapter.hpp b/include/mapnik/transform_path_adapter.hpp
index bb85aa1..bf056a1 100644
--- a/include/mapnik/transform_path_adapter.hpp
+++ b/include/mapnik/transform_path_adapter.hpp
@@ -57,16 +57,16 @@ struct transform_path_adapter
using value_type = typename select_value_type<Geometry, void>::type;
transform_path_adapter(Transform const& t,
- Geometry & geom,
- proj_transform const& prj_trans)
+ Geometry & geom,
+ proj_transform const& prj_trans)
: t_(&t),
- geom_(geom),
- prj_trans_(&prj_trans) {}
+ geom_(geom),
+ prj_trans_(&prj_trans) {}
explicit transform_path_adapter(Geometry & geom)
: t_(0),
- geom_(geom),
- prj_trans_(0) {}
+ geom_(geom),
+ prj_trans_(0) {}
void set_proj_trans(proj_transform const& prj_trans)
{
diff --git a/include/mapnik/transform_processor.hpp b/include/mapnik/transform_processor.hpp
index 82d210c..58f7e7c 100644
--- a/include/mapnik/transform_processor.hpp
+++ b/include/mapnik/transform_processor.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -46,7 +46,7 @@ struct transform_processor
using transform_type = agg::trans_affine;
template <typename Container>
- struct attribute_collector : util::static_visitor<void>
+ struct attribute_collector
{
expression_attributes<Container> collect_;
@@ -97,7 +97,7 @@ struct transform_processor
}
};
- struct node_evaluator : util::static_visitor<void>
+ struct node_evaluator
{
node_evaluator(transform_type& tr,
feature_type const& feat,
diff --git a/include/mapnik/unicode.hpp b/include/mapnik/unicode.hpp
index 4f84c74..89526f5 100644
--- a/include/mapnik/unicode.hpp
+++ b/include/mapnik/unicode.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,10 +25,10 @@
//mapnik
#include <mapnik/config.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/value_types.hpp>
-// stl
+// std
#include <cstdint>
#include <string>
@@ -36,14 +36,13 @@ struct UConverter;
namespace mapnik {
-class MAPNIK_DECL transcoder : private mapnik::noncopyable
+class MAPNIK_DECL transcoder : private util::noncopyable
{
public:
explicit transcoder (std::string const& encoding);
mapnik::value_unicode_string transcode(const char* data, std::int32_t length = -1) const;
~transcoder();
private:
- bool ok_;
UConverter * conv_;
};
}
diff --git a/include/mapnik/unique_lock.hpp b/include/mapnik/unique_lock.hpp
deleted file mode 100644
index 58d113c..0000000
--- a/include/mapnik/unique_lock.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2014 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-#ifndef MAPNIK_UNIQUE_LOCK_HPP
-#define MAPNIK_UNIQUE_LOCK_HPP
-
-#include <mutex>
-
-namespace mapnik
-{
- using scoped_lock = std::unique_lock<std::mutex>;
-}
-
-#endif // MAPNIK_UNIQUE_LOCK_HPP
diff --git a/include/mapnik/util/container_adapter.hpp b/include/mapnik/util/container_adapter.hpp
index e67514d..5ebf09b 100644
--- a/include/mapnik/util/container_adapter.hpp
+++ b/include/mapnik/util/container_adapter.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,8 +24,8 @@
#define CONTAINER_ADAPTER_HPP
// mapnik
-#include <mapnik/geometry.hpp>
-#include <mapnik/geometry_container.hpp>
+
+
#include <mapnik/util/path_iterator.hpp>
// boost
@@ -37,35 +37,66 @@
namespace boost { namespace spirit { namespace traits {
template <>
-struct is_container<mapnik::geometry_type const> : mpl::true_ {} ;
+struct is_container<mapnik::path_type const> : mpl::true_ {} ;
+
+template <>
+struct is_container<mapnik::vertex_adapter const> : mpl::true_ {} ;
// make gcc and darwin toolsets happy.
+// FIXME
+//template <>
+//struct is_container<mapnik::geometry_container const> : mpl::false_ {} ;
+
+//
template <>
-struct is_container<mapnik::geometry_container const> : mpl::false_ {} ;
+struct container_iterator<mapnik::path_type const>
+{
+ using type = mapnik::util::path_iterator<mapnik::path_type>;
+};
template <>
-struct container_iterator<mapnik::geometry_type const>
+struct container_iterator<mapnik::vertex_adapter const>
{
- using type = mapnik::util::path_iterator<mapnik::geometry_type>;
+ using type = mapnik::util::path_iterator<mapnik::vertex_adapter>;
+};
+
+template <>
+struct begin_container<mapnik::path_type const>
+{
+ static mapnik::util::path_iterator<mapnik::path_type>
+ call (mapnik::path_type const& p)
+ {
+ return mapnik::util::path_iterator<mapnik::path_type>(p);
+ }
+};
+
+template <>
+struct begin_container<mapnik::vertex_adapter const>
+{
+ static mapnik::util::path_iterator<mapnik::vertex_adapter>
+ call (mapnik::vertex_adapter const& p)
+ {
+ return mapnik::util::path_iterator<mapnik::vertex_adapter>(p);
+ }
};
template <>
-struct begin_container<mapnik::geometry_type const>
+struct end_container<mapnik::path_type const>
{
- static mapnik::util::path_iterator<mapnik::geometry_type>
- call (mapnik::geometry_type const& g)
+ static mapnik::util::path_iterator<mapnik::path_type>
+ call (mapnik::path_type const&)
{
- return mapnik::util::path_iterator<mapnik::geometry_type>(g);
+ return mapnik::util::path_iterator<mapnik::path_type>();
}
};
template <>
-struct end_container<mapnik::geometry_type const>
+struct end_container<mapnik::vertex_adapter const>
{
- static mapnik::util::path_iterator<mapnik::geometry_type>
- call (mapnik::geometry_type const&)
+ static mapnik::util::path_iterator<mapnik::vertex_adapter>
+ call (mapnik::vertex_adapter const&)
{
- return mapnik::util::path_iterator<mapnik::geometry_type>();
+ return mapnik::util::path_iterator<mapnik::vertex_adapter>();
}
};
diff --git a/include/mapnik/util/conversions.hpp b/include/mapnik/util/conversions.hpp
index 0908814..bf59b25 100644
--- a/include/mapnik/util/conversions.hpp
+++ b/include/mapnik/util/conversions.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -28,8 +28,8 @@
#include <mapnik/value_types.hpp>
// stl
+#include <iosfwd>
#include <string>
-#include <algorithm>
namespace mapnik { namespace util {
@@ -39,32 +39,8 @@ to avoid the compile time overhead given it is included
by many other headers inside mapnik.
*/
-MAPNIK_DECL inline bool string2bool(std::string const& value, bool & result)
-{
- if (value.empty() || value.size() > 5) {
- return false;
- } else if (value == "true") {
- return result = true;
- } else if (value == "false") {
- result = false;
- return true;
- }
- std::string val(value);
- std::transform(val.begin(), val.end(), val.begin(), ::tolower);
- if (val == "true" || val == "yes" || val == "1" || val == "on") {
- return result = true;
- } else if (val == "false" || val == "no" || val == "0" || val == "off") {
- result = false;
- return true;
- }
- return false;
-}
-
-MAPNIK_DECL inline bool string2bool(const char * iter, const char * end, bool & result)
-{
- std::string val(iter,end);
- return string2bool(val,result);
-}
+MAPNIK_DECL bool string2bool(std::string const& value, bool & result);
+MAPNIK_DECL bool string2bool(const char * iter, const char * end, bool & result);
MAPNIK_DECL bool string2int(std::string const& value, int & result);
MAPNIK_DECL bool string2int(const char * iter, const char * end, int & result);
diff --git a/include/mapnik/util/dasharray_parser.hpp b/include/mapnik/util/dasharray_parser.hpp
index f22b927..e5079b2 100644
--- a/include/mapnik/util/dasharray_parser.hpp
+++ b/include/mapnik/util/dasharray_parser.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/util/feature_to_geojson.hpp b/include/mapnik/util/feature_to_geojson.hpp
new file mode 100644
index 0000000..fbf2aa5
--- /dev/null
+++ b/include/mapnik/util/feature_to_geojson.hpp
@@ -0,0 +1,42 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_FEATURE_TO_GEOJSON_HPP
+#define MAPNIK_FEATURE_TO_GEOJSON_HPP
+
+// mapnik
+
+#include <mapnik/json/feature_generator_grammar.hpp>
+
+namespace mapnik { namespace util {
+
+inline bool to_geojson(std::string & json, mapnik::feature_impl const& feat)
+{
+ using sink_type = std::back_insert_iterator<std::string>;
+ static const mapnik::json::feature_generator_grammar<sink_type, mapnik::feature_impl> grammar;
+ sink_type sink(json);
+ return boost::spirit::karma::generate(sink, grammar, feat);
+}
+
+}}
+
+#endif // MAPNIK_FEATURE_TO_GEOJSON_HPP
diff --git a/include/mapnik/util/featureset_buffer.hpp b/include/mapnik/util/featureset_buffer.hpp
index 6fc05a4..842cc8e 100644
--- a/include/mapnik/util/featureset_buffer.hpp
+++ b/include/mapnik/util/featureset_buffer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/util/file_io.hpp b/include/mapnik/util/file_io.hpp
index 803c535..6c65533 100644
--- a/include/mapnik/util/file_io.hpp
+++ b/include/mapnik/util/file_io.hpp
@@ -26,7 +26,7 @@
// mapnik
#include <mapnik/utils.hpp>
#include <mapnik/make_unique.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
//#include <mapnik/config.hpp>
// stl
@@ -36,12 +36,12 @@
namespace mapnik { namespace util {
-class file : public noncopyable
+class file : public util::noncopyable
{
public:
using file_ptr = std::unique_ptr<std::FILE, int (*)(std::FILE *)>;
using data_type = std::unique_ptr<char[]>;
-
+
explicit file(std::string const& filename)
#ifdef _WINDOWS
: file_(_wfopen(mapnik::utf8_to_utf16(filename).c_str(), L"rb"), std::fclose),
diff --git a/include/mapnik/util/fs.hpp b/include/mapnik/util/fs.hpp
index 04775cd..3e01b96 100644
--- a/include/mapnik/util/fs.hpp
+++ b/include/mapnik/util/fs.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -28,6 +28,7 @@
// stl
#include <string>
+#include <vector>
namespace mapnik { namespace util {
@@ -39,6 +40,8 @@ MAPNIK_DECL bool is_relative(std::string const& value);
MAPNIK_DECL std::string make_relative(std::string const& filepath, std::string const& base);
MAPNIK_DECL std::string make_absolute(std::string const& filepath, std::string const& base);
MAPNIK_DECL std::string dirname(std::string const& value);
+MAPNIK_DECL std::string basename(std::string const& value);
+MAPNIK_DECL std::vector<std::string> list_directory(std::string const& value);
}}
diff --git a/include/mapnik/util/geometry_to_ds_type.hpp b/include/mapnik/util/geometry_to_ds_type.hpp
index 234d25e..4d89cc0 100644
--- a/include/mapnik/util/geometry_to_ds_type.hpp
+++ b/include/mapnik/util/geometry_to_ds_type.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -20,43 +20,71 @@
*
*****************************************************************************/
-#ifndef MAPNIK_GEOMETRY_TO_DS_TYPE
-#define MAPNIK_GEOMETRY_TO_DS_TYPE
+#ifndef MAPNIK_GEOMETRY_TO_DS_TYPE_HPP
+#define MAPNIK_GEOMETRY_TO_DS_TYPE_HPP
// mapnik
#include <mapnik/global.hpp>
#include <mapnik/geometry.hpp>
-#include <mapnik/datasource.hpp>
-
+#include <mapnik/datasource_geometry_type.hpp>
+#include <mapnik/util/variant.hpp>
// boost
#include <boost/optional.hpp>
namespace mapnik { namespace util {
- static inline void to_ds_type(mapnik::geometry_container const& paths,
- boost::optional<mapnik::datasource::geometry_t> & result)
- {
- if (paths.size() == 1)
- {
- result.reset(static_cast<mapnik::datasource::geometry_t>(paths.front().type()));
- }
- else if (paths.size() > 1)
- {
- int multi_type = 0;
- for (auto const& geom : paths)
- {
- int type = static_cast<int>(geom.type());
- if (multi_type > 0 && multi_type != type)
- {
- result.reset(datasource::Collection);
- }
- multi_type = type;
- result.reset(static_cast<mapnik::datasource::geometry_t>(type));
- }
- }
- }
-
- }}
-
-
-#endif // MAPNIK_GEOMETRY_TO_DS_TYPE
+namespace detail {
+
+struct datasource_geometry_type
+{
+ mapnik::datasource_geometry_t operator () (mapnik::geometry::geometry_empty const&) const
+ {
+ return mapnik::datasource_geometry_t::Unknown;
+ }
+
+ mapnik::datasource_geometry_t operator () (mapnik::geometry::point<double> const&) const
+ {
+ return mapnik::datasource_geometry_t::Point;
+ }
+
+ mapnik::datasource_geometry_t operator () (mapnik::geometry::line_string<double> const&) const
+ {
+ return mapnik::datasource_geometry_t::LineString;
+ }
+
+ mapnik::datasource_geometry_t operator () (mapnik::geometry::polygon<double> const&) const
+ {
+ return mapnik::datasource_geometry_t::Polygon;
+ }
+
+ mapnik::datasource_geometry_t operator () (mapnik::geometry::multi_point<double> const&) const
+ {
+ return mapnik::datasource_geometry_t::Point;
+ }
+
+ mapnik::datasource_geometry_t operator () (mapnik::geometry::multi_line_string<double> const&) const
+ {
+ return mapnik::datasource_geometry_t::LineString;
+ }
+
+ mapnik::datasource_geometry_t operator () (mapnik::geometry::multi_polygon<double> const&) const
+ {
+ return mapnik::datasource_geometry_t::Polygon;
+ }
+
+ mapnik::datasource_geometry_t operator () (mapnik::geometry::geometry_collection<double> const&) const
+ {
+ return mapnik::datasource_geometry_t::Collection;
+ }
+};
+} // detail
+
+static inline mapnik::datasource_geometry_t to_ds_type(mapnik::geometry::geometry<double> const& geom)
+{
+ return util::apply_visitor(detail::datasource_geometry_type(), geom);
+}
+
+}}
+
+
+#endif // MAPNIK_GEOMETRY_TO_DS_TYPE_HPP
diff --git a/include/mapnik/util/geometry_to_geojson.hpp b/include/mapnik/util/geometry_to_geojson.hpp
index 3500544..beffda7 100644
--- a/include/mapnik/util/geometry_to_geojson.hpp
+++ b/include/mapnik/util/geometry_to_geojson.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,23 +24,15 @@
#define MAPNIK_GEOMETRY_TO_GEOJSON_HPP
// mapnik
-#include <mapnik/geometry.hpp>
+
#include <mapnik/json/geometry_generator_grammar.hpp>
namespace mapnik { namespace util {
-inline bool to_geojson(std::string & json, mapnik::geometry_type const& geom)
-{
- using sink_type = std::back_insert_iterator<std::string>;
- static const mapnik::json::geometry_generator_grammar<sink_type, mapnik::geometry_type> grammar;
- sink_type sink(json);
- return boost::spirit::karma::generate(sink, grammar, geom);
-}
-
-inline bool to_geojson(std::string & json, mapnik::geometry_container const& geom)
+inline bool to_geojson(std::string & json, mapnik::geometry::geometry<double> const& geom)
{
using sink_type = std::back_insert_iterator<std::string>;
- static const mapnik::json::multi_geometry_generator_grammar<sink_type, mapnik::geometry_container> grammar;
+ static const mapnik::json::geometry_generator_grammar<sink_type, mapnik::geometry::geometry<double> > grammar;
sink_type sink(json);
return boost::spirit::karma::generate(sink, grammar, geom);
}
diff --git a/include/mapnik/util/geometry_to_svg.hpp b/include/mapnik/util/geometry_to_svg.hpp
index 6e207db..af55897 100644
--- a/include/mapnik/util/geometry_to_svg.hpp
+++ b/include/mapnik/util/geometry_to_svg.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,8 +25,6 @@
// mapnik
#include <mapnik/global.hpp>
-#include <mapnik/geometry.hpp>
-#include <mapnik/geometry_container.hpp>
#include <mapnik/svg/geometry_svg_generator.hpp>
// boost
@@ -40,7 +38,8 @@ inline bool to_svg(std::string & svg, mapnik::geometry_type const& geom)
{
using sink_type = std::back_insert_iterator<std::string>;
sink_type sink(svg);
- static const svg::svg_path_generator<sink_type, mapnik::geometry_type> generator;
+ mapnik::vertex_adapter va(geom);
+ static const svg::svg_path_generator<sink_type, mapnik::vertex_adapter> generator;
bool result = karma::generate(sink, generator, geom);
return result;
}
diff --git a/include/mapnik/util/geometry_to_wkb.hpp b/include/mapnik/util/geometry_to_wkb.hpp
index 3ec50fc..397baee 100644
--- a/include/mapnik/util/geometry_to_wkb.hpp
+++ b/include/mapnik/util/geometry_to_wkb.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2015 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,9 +26,9 @@
// mapnik
#include <mapnik/config.hpp>
#include <mapnik/make_unique.hpp>
+#include <mapnik/wkb.hpp>
#include <mapnik/geometry.hpp>
-#include <mapnik/geometry_container.hpp>
-#include <mapnik/vertex.hpp>
+#include <mapnik/geometry_type.hpp>
// stl
#include <sstream>
@@ -38,17 +38,17 @@
#include <memory>
#include <cassert>
-namespace mapnik { namespace util {
+namespace mapnik { namespace util { namespace detail {
-std::string to_hex(const char* blob, unsigned size)
+std::string to_hex(const char* blob, std::size_t size)
{
std::string buf;
- buf.reserve(size*2);
+ buf.reserve(size * 2);
std::ostringstream s(buf);
s.seekp(0);
char hex[3];
- std::memset(hex,0,3);
- for ( unsigned pos=0; pos < size; ++pos)
+ std::memset(hex, 0, 3);
+ for (std::size_t pos = 0; pos < size; ++pos)
{
std::sprintf (hex, "%02x", int(blob[pos]) & 0xff);
s << hex;
@@ -56,12 +56,6 @@ std::string to_hex(const char* blob, unsigned size)
return s.str();
}
-enum wkbByteOrder {
- wkbXDR=0,
- wkbNDR=1
-};
-
-
inline void reverse_bytes(char size, char *address)
{
char * first = address;
@@ -113,7 +107,7 @@ struct wkb_buffer
{
wkb_buffer(std::size_t size)
: size_(size),
- data_( (size_!=0) ? static_cast<char*>(::operator new (size_)):0)
+ data_( (size_ != 0) ? static_cast<char*>(::operator new (size_)) : 0)
{}
~wkb_buffer()
@@ -137,96 +131,70 @@ struct wkb_buffer
using wkb_buffer_ptr = std::unique_ptr<wkb_buffer>;
-template<typename GeometryType>
-wkb_buffer_ptr to_point_wkb( GeometryType const& g, wkbByteOrder byte_order)
+wkb_buffer_ptr point_wkb( geometry::point<double> const& pt, wkbByteOrder byte_order)
{
- assert(g.size() == 1);
- std::size_t size = 1 + 4 + 8*2 ; // byteOrder + wkbType + Point
+ std::size_t size = 1 + 4 + 8 * 2 ; // byteOrder + wkbType + Point
wkb_buffer_ptr wkb = std::make_unique<wkb_buffer>(size);
wkb_stream ss(wkb->buffer(), wkb->size());
ss.write(reinterpret_cast<char*>(&byte_order),1);
- int type = static_cast<int>(mapnik::geometry_type::types::Point);
- write(ss,type,4,byte_order);
- double x = 0;
- double y = 0;
- g.vertex(0,&x,&y);
- write(ss,x,8,byte_order);
- write(ss,y,8,byte_order);
+ write(ss, static_cast<int>(geometry::geometry_types::Point), 4 , byte_order);
+ write(ss, pt.x, 8, byte_order);
+ write(ss, pt.y, 8, byte_order);
assert(ss.good());
return std::move(wkb);
}
-template<typename GeometryType>
-wkb_buffer_ptr to_line_string_wkb( GeometryType const& g, wkbByteOrder byte_order)
+wkb_buffer_ptr line_string_wkb(geometry::line_string<double> const& line, wkbByteOrder byte_order)
{
- unsigned num_points = g.size();
+ std::size_t num_points = line.size();
assert(num_points > 1);
- std::size_t size = 1 + 4 + 4 + 8*2*num_points ; // byteOrder + wkbType + numPoints + Point*numPoints
+ std::size_t size = 1 + 4 + 4 + 8 * 2 * num_points ; // byteOrder + wkbType + numPoints + Point*numPoints
wkb_buffer_ptr wkb = std::make_unique<wkb_buffer>(size);
wkb_stream ss(wkb->buffer(), wkb->size());
ss.write(reinterpret_cast<char*>(&byte_order),1);
- int type = static_cast<int>(mapnik::geometry_type::types::LineString);
- write(ss,type,4,byte_order);
- write(ss,num_points,4,byte_order);
- double x = 0;
- double y = 0;
- for (unsigned i=0; i< num_points; ++i)
+ write(ss, static_cast<int>(mapnik::geometry::geometry_types::LineString) , 4, byte_order);
+ write(ss, num_points, 4, byte_order);
+ for (std::size_t i=0; i< num_points; ++i)
{
- g.vertex(i,&x,&y);
- write(ss,x,8,byte_order);
- write(ss,y,8,byte_order);
+ geometry::point<double> const& pt = line[i];
+ write(ss, pt.x, 8, byte_order);
+ write(ss, pt.y, 8, byte_order);
}
assert(ss.good());
return std::move(wkb);
}
-template<typename GeometryType>
-wkb_buffer_ptr to_polygon_wkb( GeometryType const& g, wkbByteOrder byte_order)
+wkb_buffer_ptr polygon_wkb( geometry::polygon<double> const& poly, wkbByteOrder byte_order)
{
- unsigned num_points = g.size();
- assert(num_points > 1);
-
- using point_type = std::pair<double,double>;
- using linear_ring = std::vector<point_type>;
- std::vector<linear_ring> rings;
-
- double x = 0;
- double y = 0;
std::size_t size = 1 + 4 + 4 ; // byteOrder + wkbType + numRings
- for (unsigned i=0; i< num_points; ++i)
+ size += 4 + 2 * 8 * poly.exterior_ring.size();
+ for ( auto const& ring : poly.interior_rings)
{
- unsigned command = g.vertex(i,&x,&y);
- if (command == SEG_MOVETO)
- {
- linear_ring ring;
- ring.reserve(1);
- ring.emplace_back(x,y);
- rings.push_back(std::move(ring)); // start new loop
- size += 4; // num_points
- size += 2 * 8; // point
- }
- else if (command == SEG_LINETO)
- {
- rings.back().emplace_back(x,y);
- size += 2 * 8; // point
- }
+
+ size += 4 + 2 * 8 * ring.size();
}
- unsigned num_rings = rings.size();
+
wkb_buffer_ptr wkb = std::make_unique<wkb_buffer>(size);
wkb_stream ss(wkb->buffer(), wkb->size());
ss.write(reinterpret_cast<char*>(&byte_order),1);
- int type = static_cast<int>(mapnik::geometry_type::types::Polygon);
- write(ss,type,4,byte_order);
- write(ss,num_rings,4,byte_order);
+ write(ss, static_cast<int>(mapnik::geometry::geometry_types::Polygon), 4, byte_order);
+ write(ss, poly.num_rings(), 4, byte_order);
- for ( linear_ring const& ring : rings)
+ // exterior
+ write(ss, poly.exterior_ring.size(), 4, byte_order);
+ for (auto const& pt : poly.exterior_ring)
+ {
+ write(ss, pt.x, 8, byte_order);
+ write(ss, pt.y, 8, byte_order);
+ }
+ // interiors
+ for (auto const& ring : poly.interior_rings)
{
- unsigned num_ring_points = ring.size();
- write(ss,num_ring_points,4,byte_order);
- for ( point_type const& pt : ring)
+ write(ss, ring.size(), 4, byte_order);
+ for ( auto const& pt : ring)
{
- write(ss,pt.first,8,byte_order);
- write(ss,pt.second,8,byte_order);
+ write(ss, pt.x, 8, byte_order);
+ write(ss, pt.y, 8, byte_order);
}
}
@@ -234,71 +202,112 @@ wkb_buffer_ptr to_polygon_wkb( GeometryType const& g, wkbByteOrder byte_order)
return std::move(wkb);
}
-template<typename GeometryType>
-wkb_buffer_ptr to_wkb(GeometryType const& g, wkbByteOrder byte_order )
+wkb_buffer_ptr multi_point_wkb( geometry::multi_point<double> const& multi_pt, wkbByteOrder byte_order)
{
- wkb_buffer_ptr wkb;
-
- switch (g.type())
+ std::size_t size = 1 + 4 + 4 + (1 + 4 + 8 * 2) * multi_pt.size() ; // byteOrder + wkbType + num_point + Point.size * num_points
+ wkb_buffer_ptr wkb = std::make_unique<wkb_buffer>(size);
+ wkb_stream ss(wkb->buffer(), wkb->size());
+ ss.write(reinterpret_cast<char*>(&byte_order),1);
+ write(ss, static_cast<int>(geometry::geometry_types::MultiPoint), 4, byte_order);
+ write(ss, multi_pt.size(), 4 ,byte_order);
+ for (auto const& pt : multi_pt)
{
- case mapnik::geometry_type::types::Point:
- wkb = to_point_wkb(g, byte_order);
- break;
- case mapnik::geometry_type::types::LineString:
- wkb = to_line_string_wkb(g, byte_order);
- break;
- case mapnik::geometry_type::types::Polygon:
- wkb = to_polygon_wkb(g, byte_order);
- break;
- default:
- break;
+ ss.write(reinterpret_cast<char*>(&byte_order),1);
+ write(ss, static_cast<int>(geometry::geometry_types::Point), 4, byte_order);
+ write(ss, pt.x, 8, byte_order);
+ write(ss, pt.y, 8, byte_order);
}
- return wkb;
+ assert(ss.good());
+ return std::move(wkb);
}
-wkb_buffer_ptr to_wkb(geometry_container const& paths, wkbByteOrder byte_order )
+
+template <typename MultiGeometry>
+ wkb_buffer_ptr multi_geom_wkb(MultiGeometry const& multi_geom, wkbByteOrder byte_order);
+
+struct geometry_to_wkb
{
- if (paths.size() == 1)
+
+ using result_type = wkb_buffer_ptr;
+
+ geometry_to_wkb(wkbByteOrder byte_order)
+ : byte_order_(byte_order) {}
+
+ result_type operator() (geometry::geometry<double> const& geom) const
{
- // single geometry
- return to_wkb(paths.front(), byte_order);
+ return util::apply_visitor(*this, geom);
}
- if (paths.size() > 1)
+ result_type operator() (geometry::geometry_empty const&) const
{
- // multi geometry or geometry collection
- std::vector<wkb_buffer_ptr> wkb_cont;
- bool collection = false;
- int multi_type = 0;
- size_t multi_size = 1 + 4 + 4;
+ return result_type();
+ }
- for (auto const& geom : paths)
- {
- wkb_buffer_ptr wkb = to_wkb(geom,byte_order);
- multi_size += wkb->size();
- int type = static_cast<int>(geom.type());
- if (multi_type > 0 && multi_type != geom.type())
- collection = true;
- multi_type = type;
- wkb_cont.push_back(std::move(wkb));
- }
+ result_type operator() (geometry::point<double> const& pt) const
+ {
+ return point_wkb(pt, byte_order_);
+ }
- wkb_buffer_ptr multi_wkb = std::make_unique<wkb_buffer>(multi_size);
- wkb_stream ss(multi_wkb->buffer(), multi_wkb->size());
- ss.write(reinterpret_cast<char*>(&byte_order),1);
- multi_type = collection ? 7 : multi_type + 3;
- write(ss,multi_type, 4, byte_order);
- write(ss,paths.size(),4,byte_order);
+ result_type operator() (geometry::line_string<double> const& line) const
+ {
+ return line_string_wkb(line, byte_order_);
+ }
- for ( wkb_buffer_ptr const& wkb : wkb_cont)
- {
- ss.write(wkb->buffer(),wkb->size());
- }
- return std::move(multi_wkb);
+ result_type operator() (geometry::polygon<double> const& poly) const
+ {
+ return polygon_wkb(poly, byte_order_);
+ }
+
+ // multi/collection
+
+ result_type operator() (geometry::multi_point<double> const& multi_pt) const
+ {
+ return multi_point_wkb(multi_pt, byte_order_);
+ }
+
+ template <typename Geometry>
+ result_type operator() (Geometry const& geom) const
+ {
+ return multi_geom_wkb(geom, byte_order_);
}
- return wkb_buffer_ptr();
+ wkbByteOrder byte_order_;
+};
+
+template <typename MultiGeometry>
+wkb_buffer_ptr multi_geom_wkb(MultiGeometry const& multi_geom, wkbByteOrder byte_order)
+{
+ size_t multi_size = 1 + 4 + 4;
+ std::vector<wkb_buffer_ptr> wkb_cont;
+ for (auto const& geom : multi_geom)
+ {
+ wkb_buffer_ptr wkb = geometry_to_wkb(byte_order)(geom);
+ multi_size += wkb->size();
+ wkb_cont.push_back(std::move(wkb));
+ }
+ wkb_buffer_ptr multi_wkb = std::make_unique<wkb_buffer>(multi_size);
+ wkb_stream ss(multi_wkb->buffer(), multi_wkb->size());
+ ss.write(reinterpret_cast<char*>(&byte_order),1);
+ write(ss, static_cast<int>(geometry::detail::geometry_type()(multi_geom)) , 4, byte_order);
+ write(ss, multi_geom.size(), 4 ,byte_order);
+
+ for ( wkb_buffer_ptr const& wkb : wkb_cont)
+ {
+ ss.write(wkb->buffer(), wkb->size());
+ }
+
+ return std::move(multi_wkb);
+}
+} // ns detail
+
+using wkb_buffer_ptr = detail::wkb_buffer_ptr;
+
+template<typename GeometryType>
+wkb_buffer_ptr to_wkb(GeometryType const& geom, wkbByteOrder byte_order )
+{
+ return std::move(detail::geometry_to_wkb(byte_order)(geom));
}
+
}}
#endif // MAPNIK_GEOMETRY_TO_WKB_HPP
diff --git a/include/mapnik/util/geometry_to_wkt.hpp b/include/mapnik/util/geometry_to_wkt.hpp
index 5d4967f..0e65d7c 100644
--- a/include/mapnik/util/geometry_to_wkt.hpp
+++ b/include/mapnik/util/geometry_to_wkt.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,28 +24,32 @@
#define MAPNIK_GEOMETRY_TO_WKT_HPP
// mapnik
-#include <mapnik/geometry.hpp>
-#include <mapnik/geometry_container.hpp>
+#include <mapnik/wkt/wkt_factory.hpp>
#include <mapnik/wkt/wkt_generator_grammar.hpp>
+// boost
+#include <boost/spirit/include/karma.hpp>
+
namespace mapnik { namespace util {
-inline bool to_wkt(std::string & wkt, mapnik::geometry_type const& geom)
+inline bool to_wkt(std::string & wkt, mapnik::geometry::geometry<double> const& geom)
{
using sink_type = std::back_insert_iterator<std::string>;
+ static const mapnik::wkt::wkt_generator_grammar<sink_type, mapnik::geometry::geometry<double>, double > generator;
sink_type sink(wkt);
- static const mapnik::wkt::wkt_generator<sink_type, mapnik::geometry_type> generator(true);
return boost::spirit::karma::generate(sink, generator, geom);
}
-inline bool to_wkt(std::string & wkt, mapnik::geometry_container const& geom)
+inline bool to_wkt(std::string & wkt, mapnik::geometry::geometry<std::int64_t> const& geom)
{
using sink_type = std::back_insert_iterator<std::string>;
+ static const mapnik::wkt::wkt_generator_grammar_int<sink_type, mapnik::geometry::geometry<std::int64_t>, std::int64_t > generator;
sink_type sink(wkt);
- static const mapnik::wkt::wkt_multi_generator<sink_type, mapnik::geometry_container> generator;
return boost::spirit::karma::generate(sink, generator, geom);
}
}}
+
+
#endif // MAPNIK_GEOMETRY_TO_WKT_HPP
diff --git a/include/mapnik/util/hsl.hpp b/include/mapnik/util/hsl.hpp
index f669c88..e0b2d59 100644
--- a/include/mapnik/util/hsl.hpp
+++ b/include/mapnik/util/hsl.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -62,11 +62,14 @@ inline void hsl2rgb(double h, double s, double l,
if (!s) {
r = g = b = l;
}
- double m2 = (l <= 0.5) ? l * (s + 1.0) : l + s - l * s;
- double m1 = l * 2.0 - m2;
- r = hue_to_rgb(m1, m2, h + 1.0/3.0);
- g = hue_to_rgb(m1, m2, h);
- b = hue_to_rgb(m1, m2, h - 1.0/3.0);
+ else
+ {
+ double m2 = (l <= 0.5) ? l * (s + 1.0) : l + s - l * s;
+ double m1 = l * 2.0 - m2;
+ r = hue_to_rgb(m1, m2, h + 1.0/3.0);
+ g = hue_to_rgb(m1, m2, h);
+ b = hue_to_rgb(m1, m2, h - 1.0/3.0);
+ }
}
}
diff --git a/include/mapnik/util/is_clockwise.hpp b/include/mapnik/util/is_clockwise.hpp
new file mode 100644
index 0000000..2483727
--- /dev/null
+++ b/include/mapnik/util/is_clockwise.hpp
@@ -0,0 +1,43 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_UTIL_IS_CLOCKWISE_HPP
+#define MAPNIK_UTIL_IS_CLOCKWISE_HPP
+
+namespace mapnik { namespace util {
+
+template <typename T>
+bool is_clockwise(T const& ring)
+{
+ double area = 0.0;
+ std::size_t num_points = ring.size();
+ for (std::size_t i = 0; i < num_points; ++i)
+ {
+ auto const& p0 = ring[i];
+ auto const& p1 = ring[(i + 1) % num_points];
+ area += p0.x * p1.y - p0.y * p1.x;
+ }
+ return (area < 0.0) ? true : false;
+}
+}}
+
+#endif //MAPNIK_UTIL_IS_CLOCKWISE_HPP
diff --git a/include/mapnik/util/math.hpp b/include/mapnik/util/math.hpp
new file mode 100644
index 0000000..4b24893
--- /dev/null
+++ b/include/mapnik/util/math.hpp
@@ -0,0 +1,35 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_MATH_HPP
+#define MAPNIK_MATH_HPP
+
+#include <mapnik/config.hpp>
+
+namespace mapnik { namespace util {
+
+MAPNIK_DECL double normalize_angle(double angle);
+
+}}
+
+#endif
+
diff --git a/include/mapnik/util/noncopyable.hpp b/include/mapnik/util/noncopyable.hpp
new file mode 100644
index 0000000..e80fb4e
--- /dev/null
+++ b/include/mapnik/util/noncopyable.hpp
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_UTIL_NONCOPYABLE_HPP
+#define MAPNIK_UTIL_NONCOPYABLE_HPP
+
+namespace mapnik { namespace util {
+
+namespace non_copyable_
+{
+
+class noncopyable
+{
+protected:
+ constexpr noncopyable() = default;
+ ~noncopyable() = default;
+ noncopyable( noncopyable const& ) = delete;
+ noncopyable& operator=(noncopyable const& ) = delete;
+};
+}
+
+using noncopyable = non_copyable_::noncopyable;
+
+}}
+
+#endif // MAPNIK_UTIL_NONCOPYABLE_HPP
diff --git a/include/mapnik/util/path_iterator.hpp b/include/mapnik/util/path_iterator.hpp
index f9e60e0..840e63a 100644
--- a/include/mapnik/util/path_iterator.hpp
+++ b/include/mapnik/util/path_iterator.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,7 @@
// mapnik
#include <mapnik/global.hpp>
-
+#include <mapnik/path.hpp>
// boost
#include <boost/iterator/iterator_facade.hpp>
@@ -78,9 +78,58 @@ private:
value_type v_;
const path_type *vertices_;
- unsigned pos_;
};
+// specialization for mapnik::path_type - vertex interface has been removed
+template <>
+class path_iterator<path_type>
+ : public boost::iterator_facade< path_iterator<path_type>,
+ std::tuple<unsigned,double,double> const,
+ boost::forward_traversal_tag
+ >
+{
+
+public:
+ using path_type = mapnik::path_type;
+ using value_type = std::tuple<unsigned, double, double>;
+ using size_type = path_type::size_type;
+ path_iterator()
+ : v_(mapnik::SEG_END,0,0),
+ vertices_(),
+ pos_(0)
+ {}
+
+ explicit path_iterator(path_type const& vertices)
+ : vertices_(&vertices),
+ pos_(0)
+ {
+ increment();
+ }
+
+private:
+ friend class boost::iterator_core_access;
+
+ void increment()
+ {
+ std::get<0>(v_) = vertices_->cont_.get_vertex(pos_++, &std::get<1>(v_), &std::get<2>(v_));
+ }
+
+ bool equal( path_iterator const& other) const
+ {
+ return std::get<0>(v_) == std::get<0>(other.v_);
+ }
+
+ value_type const& dereference() const
+ {
+ return v_;
+ }
+
+ value_type v_;
+ const path_type *vertices_;
+ size_type pos_;
+};
+
+
}}
diff --git a/include/mapnik/util/rounding_cast.hpp b/include/mapnik/util/rounding_cast.hpp
new file mode 100644
index 0000000..d67c066
--- /dev/null
+++ b/include/mapnik/util/rounding_cast.hpp
@@ -0,0 +1,48 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_UTIL_ROUNDING_CAST_HPP
+#define MAPNIK_UTIL_ROUNDING_CAST_HPP
+
+#include <boost/numeric/conversion/converter.hpp>
+
+namespace mapnik {
+namespace util {
+
+template<typename Target, typename Source>
+inline
+Target rounding_cast ( Source arg )
+{
+ typedef boost::numeric::conversion_traits<Target,Source> Traits ;
+
+ typedef
+boost::numeric::converter<Target,Source,Traits,boost::numeric::def_overflow_handler,boost::numeric::RoundEven<Source>
+ > Converter ;
+
+ return Converter::convert(arg);
+}
+
+} // end util ns
+} // end mapnik ns
+
+#endif //MAPNIK_UTIL_ROUNDING_CAST_HPP
+
diff --git a/include/mapnik/util/spirit_transform_attribute.hpp b/include/mapnik/util/spirit_transform_attribute.hpp
new file mode 100644
index 0000000..1c0bdac
--- /dev/null
+++ b/include/mapnik/util/spirit_transform_attribute.hpp
@@ -0,0 +1,208 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_UTIL_SPIRIT_TRANSFORM_ATTRIBUTE_HPP
+#define MAPNIK_UTIL_SPIRIT_TRANSFORM_ATTRIBUTE_HPP
+
+#include <mapnik/geometry.hpp>
+
+namespace boost { namespace spirit { namespace traits {
+
+ template <>
+ struct transform_attribute<mapnik::geometry::geometry<double> const,
+ mapnik::geometry::point<double> const&, karma::domain>
+ {
+ using type = mapnik::geometry::point<double> const&;
+ static type pre(mapnik::geometry::geometry<double> const& geom)
+ {
+ return mapnik::util::get<mapnik::geometry::point<double> >(geom);
+ }
+ };
+
+ template <>
+ struct transform_attribute<mapnik::geometry::geometry<double> const,
+ mapnik::geometry::line_string<double> const&, karma::domain>
+ {
+ using type = mapnik::geometry::line_string<double> const&;
+ static type pre(mapnik::geometry::geometry<double> const& geom)
+ {
+ return mapnik::util::get<mapnik::geometry::line_string<double> >(geom);
+ }
+ };
+
+ template <>
+ struct transform_attribute<mapnik::geometry::geometry<double> const,
+ mapnik::geometry::polygon<double> const&, karma::domain>
+ {
+ using type = mapnik::geometry::polygon<double> const&;
+ static type pre(mapnik::geometry::geometry<double> const& geom)
+ {
+ return mapnik::util::get<mapnik::geometry::polygon<double> >(geom);
+ }
+ };
+
+ template <>
+ struct transform_attribute<mapnik::geometry::polygon<double> const,
+ std::vector<mapnik::geometry::linear_ring<double> > const&, karma::domain>
+ {
+ using type = std::vector<mapnik::geometry::linear_ring<double> > const&;
+ static type pre(mapnik::geometry::polygon<double> const& poly)
+ {
+ return poly.interior_rings;
+ }
+ };
+
+ template <>
+ struct transform_attribute<mapnik::geometry::geometry<double> const,
+ mapnik::geometry::multi_point<double> const&, karma::domain>
+ {
+ using type = mapnik::geometry::multi_point<double> const&;
+ static type pre(mapnik::geometry::geometry<double> const& geom)
+ {
+ return mapnik::util::get<mapnik::geometry::multi_point<double> >(geom);
+ }
+ };
+
+ template <>
+ struct transform_attribute<mapnik::geometry::geometry<double> const,
+ mapnik::geometry::multi_line_string<double> const&, karma::domain>
+ {
+ using type = mapnik::geometry::multi_line_string<double> const&;
+ static type pre(mapnik::geometry::geometry<double> const& geom)
+ {
+ return mapnik::util::get<mapnik::geometry::multi_line_string<double> >(geom);
+ }
+ };
+
+ template <>
+ struct transform_attribute<mapnik::geometry::geometry<double> const,
+ mapnik::geometry::multi_polygon<double> const&, karma::domain>
+ {
+ using type = mapnik::geometry::multi_polygon<double> const&;
+ static type pre(mapnik::geometry::geometry<double> const& geom)
+ {
+ return mapnik::util::get<mapnik::geometry::multi_polygon<double> >(geom);
+ }
+ };
+
+ template <>
+ struct transform_attribute<mapnik::geometry::geometry<double> const,
+ mapnik::geometry::geometry_collection<double> const&, karma::domain>
+ {
+ using type = mapnik::geometry::geometry_collection<double> const&;
+ static type pre(mapnik::geometry::geometry<double> const& geom)
+ {
+ return mapnik::util::get<mapnik::geometry::geometry_collection<double> >(geom);
+ }
+ };
+
+ template <>
+ struct transform_attribute<mapnik::geometry::geometry<std::int64_t> const,
+ mapnik::geometry::point<std::int64_t> const&, karma::domain>
+ {
+ using type = mapnik::geometry::point<std::int64_t> const&;
+ static type pre(mapnik::geometry::geometry<std::int64_t> const& geom)
+ {
+ return mapnik::util::get<mapnik::geometry::point<std::int64_t> >(geom);
+ }
+ };
+
+ template <>
+ struct transform_attribute<mapnik::geometry::geometry<std::int64_t> const,
+ mapnik::geometry::line_string<std::int64_t> const&, karma::domain>
+ {
+ using type = mapnik::geometry::line_string<std::int64_t> const&;
+ static type pre(mapnik::geometry::geometry<std::int64_t> const& geom)
+ {
+ return mapnik::util::get<mapnik::geometry::line_string<std::int64_t> >(geom);
+ }
+ };
+
+ template <>
+ struct transform_attribute<mapnik::geometry::geometry<std::int64_t> const,
+ mapnik::geometry::polygon<std::int64_t> const&, karma::domain>
+ {
+ using type = mapnik::geometry::polygon<std::int64_t> const&;
+ static type pre(mapnik::geometry::geometry<std::int64_t> const& geom)
+ {
+ return mapnik::util::get<mapnik::geometry::polygon<std::int64_t> >(geom);
+ }
+ };
+
+ template <>
+ struct transform_attribute<mapnik::geometry::polygon<std::int64_t> const,
+ std::vector<mapnik::geometry::linear_ring<std::int64_t> > const&, karma::domain>
+ {
+ using type = std::vector<mapnik::geometry::linear_ring<std::int64_t> > const&;
+ static type pre(mapnik::geometry::polygon<std::int64_t> const& poly)
+ {
+ return poly.interior_rings;
+ }
+ };
+
+ template <>
+ struct transform_attribute<mapnik::geometry::geometry<std::int64_t> const,
+ mapnik::geometry::multi_point<std::int64_t> const&, karma::domain>
+ {
+ using type = mapnik::geometry::multi_point<std::int64_t> const&;
+ static type pre(mapnik::geometry::geometry<std::int64_t> const& geom)
+ {
+ return mapnik::util::get<mapnik::geometry::multi_point<std::int64_t> >(geom);
+ }
+ };
+
+ template <>
+ struct transform_attribute<mapnik::geometry::geometry<std::int64_t> const,
+ mapnik::geometry::multi_line_string<std::int64_t> const&, karma::domain>
+ {
+ using type = mapnik::geometry::multi_line_string<std::int64_t> const&;
+ static type pre(mapnik::geometry::geometry<std::int64_t> const& geom)
+ {
+ return mapnik::util::get<mapnik::geometry::multi_line_string<std::int64_t> >(geom);
+ }
+ };
+
+ template <>
+ struct transform_attribute<mapnik::geometry::geometry<std::int64_t> const,
+ mapnik::geometry::multi_polygon<std::int64_t> const&, karma::domain>
+ {
+ using type = mapnik::geometry::multi_polygon<std::int64_t> const&;
+ static type pre(mapnik::geometry::geometry<std::int64_t> const& geom)
+ {
+ return mapnik::util::get<mapnik::geometry::multi_polygon<std::int64_t> >(geom);
+ }
+ };
+
+ template <>
+ struct transform_attribute<mapnik::geometry::geometry<std::int64_t> const,
+ mapnik::geometry::geometry_collection<std::int64_t> const&, karma::domain>
+ {
+ using type = mapnik::geometry::geometry_collection<std::int64_t> const&;
+ static type pre(mapnik::geometry::geometry<std::int64_t> const& geom)
+ {
+ return mapnik::util::get<mapnik::geometry::geometry_collection<std::int64_t> >(geom);
+ }
+ };
+
+}}}
+
+#endif // MAPNIK_UTIL_SPIRIT_TRANSFORM_ATTRIBUTE_HPP
diff --git a/include/mapnik/util/timer.hpp b/include/mapnik/util/timer.hpp
index ee6ccf5..8f74878 100644
--- a/include/mapnik/util/timer.hpp
+++ b/include/mapnik/util/timer.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/util/trim.hpp b/include/mapnik/util/trim.hpp
index 48ec7e0..cc4816d 100644
--- a/include/mapnik/util/trim.hpp
+++ b/include/mapnik/util/trim.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/util/variant.hpp b/include/mapnik/util/variant.hpp
index 55be089..1000887 100644
--- a/include/mapnik/util/variant.hpp
+++ b/include/mapnik/util/variant.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2014 Artem Pavlenko
+ * Copyright (C) 2015 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -35,7 +35,8 @@
#include <string>
#include "recursive_wrapper.hpp"
-#include <boost/mpl/vector.hpp>
+
+#include <boost/mpl/vector.hpp> // spirit support
#ifdef _MSC_VER
// http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx
@@ -59,7 +60,19 @@
// translates to 100
#define VARIANT_VERSION (VARIANT_MAJOR_VERSION*100000) + (VARIANT_MINOR_VERSION*100) + (VARIANT_PATCH_VERSION)
-namespace mapnik { namespace util { namespace detail {
+namespace mapnik { namespace util {
+
+// static visitor
+template <typename R = void>
+struct static_visitor
+{
+ using result_type = R;
+protected:
+ static_visitor() {}
+ ~static_visitor() {}
+};
+
+namespace detail {
static constexpr std::size_t invalid_value = std::size_t(-1);
@@ -134,18 +147,38 @@ struct select_type<0, T, Types...>
using type = T;
};
-} // namespace detail
-// static visitor
-template <typename R = void>
-struct static_visitor
+template <typename T, typename R = void>
+struct enable_if_type { using type = R; };
+
+template <typename F, typename V, typename Enable = void>
+struct result_of_unary_visit
{
- using result_type = R;
-protected:
- static_visitor() {}
- ~static_visitor() {}
+ using type = typename std::result_of<F(V&)>::type;
+};
+
+template <typename F, typename V>
+struct result_of_unary_visit<F, V, typename enable_if_type<typename F::result_type>::type >
+{
+ using type = typename F::result_type;
};
+template <typename F, typename V, class Enable = void>
+struct result_of_binary_visit
+{
+ using type = typename std::result_of<F(V&,V&)>::type;
+};
+
+
+template <typename F, typename V>
+struct result_of_binary_visit<F, V, typename enable_if_type<typename F::result_type>::type >
+{
+ using type = typename F::result_type;
+};
+
+
+} // namespace detail
+
template <std::size_t arg1, std::size_t ... others>
struct static_max;
@@ -241,16 +274,31 @@ struct unwrapper<recursive_wrapper<T>>
{
return obj.get();
}
+
+ auto operator() (recursive_wrapper<T> & obj) const
+ -> typename recursive_wrapper<T>::type &
+ {
+ return obj.get();
+ }
};
+template <typename T>
+struct unwrapper<std::reference_wrapper<T>>
+{
+ auto operator() (std::reference_wrapper<T> const& obj) const
+ -> typename recursive_wrapper<T>::type const&
+ {
+ return obj.get();
+ }
+};
-template <typename F, typename V, typename...Types>
+template <typename F, typename V, typename R, typename...Types>
struct dispatcher;
-template <typename F, typename V, typename T, typename...Types>
-struct dispatcher<F, V, T, Types...>
+template <typename F, typename V, typename R, typename T, typename...Types>
+struct dispatcher<F, V, R, T, Types...>
{
- using result_type = typename F::result_type;
+ using result_type = R;
VARIANT_INLINE static result_type apply_const(V const& v, F f)
{
if (v.get_type_index() == sizeof...(Types))
@@ -259,7 +307,7 @@ struct dispatcher<F, V, T, Types...>
}
else
{
- return dispatcher<F, V, Types...>::apply_const(v, f);
+ return dispatcher<F, V, R, Types...>::apply_const(v, f);
}
}
@@ -271,15 +319,15 @@ struct dispatcher<F, V, T, Types...>
}
else
{
- return dispatcher<F, V, Types...>::apply(v, f);
+ return dispatcher<F, V, R, Types...>::apply(v, f);
}
}
};
-template<typename F, typename V>
-struct dispatcher<F, V>
+template<typename F, typename V, typename R>
+struct dispatcher<F, V, R>
{
- using result_type = typename F::result_type;
+ using result_type = R;
VARIANT_INLINE static result_type apply_const(V const&, F)
{
throw std::runtime_error(std::string("unary dispatch: FAIL ") + typeid(V).name());
@@ -292,13 +340,13 @@ struct dispatcher<F, V>
};
-template <typename F, typename V, typename T, typename...Types>
+template <typename F, typename V, typename R, typename T, typename...Types>
struct binary_dispatcher_rhs;
-template <typename F, typename V, typename T0, typename T1, typename...Types>
-struct binary_dispatcher_rhs<F, V, T0, T1, Types...>
+template <typename F, typename V, typename R, typename T0, typename T1, typename...Types>
+struct binary_dispatcher_rhs<F, V, R, T0, T1, Types...>
{
- using result_type = typename F::result_type;
+ using result_type = R;
VARIANT_INLINE static result_type apply_const(V const& lhs, V const& rhs, F f)
{
if (rhs.get_type_index() == sizeof...(Types)) // call binary functor
@@ -308,7 +356,7 @@ struct binary_dispatcher_rhs<F, V, T0, T1, Types...>
}
else
{
- return binary_dispatcher_rhs<F, V, T0, Types...>::apply_const(lhs, rhs, f);
+ return binary_dispatcher_rhs<F, V, R, T0, Types...>::apply_const(lhs, rhs, f);
}
}
@@ -321,16 +369,16 @@ struct binary_dispatcher_rhs<F, V, T0, T1, Types...>
}
else
{
- return binary_dispatcher_rhs<F, V, T0, Types...>::apply(lhs, rhs, f);
+ return binary_dispatcher_rhs<F, V, R, T0, Types...>::apply(lhs, rhs, f);
}
}
};
-template<typename F, typename V, typename T>
-struct binary_dispatcher_rhs<F, V, T>
+template<typename F, typename V, typename R, typename T>
+struct binary_dispatcher_rhs<F, V, R, T>
{
- using result_type = typename F::result_type;
+ using result_type = R;
VARIANT_INLINE static result_type apply_const(V const&, V const&, F)
{
throw std::runtime_error("binary dispatch: FAIL");
@@ -342,13 +390,13 @@ struct binary_dispatcher_rhs<F, V, T>
};
-template <typename F, typename V, typename T, typename...Types>
+template <typename F, typename V, typename R, typename T, typename...Types>
struct binary_dispatcher_lhs;
-template <typename F, typename V, typename T0, typename T1, typename...Types>
-struct binary_dispatcher_lhs<F, V, T0, T1, Types...>
+template <typename F, typename V, typename R, typename T0, typename T1, typename...Types>
+struct binary_dispatcher_lhs<F, V, R, T0, T1, Types...>
{
- using result_type = typename F::result_type;
+ using result_type = R;
VARIANT_INLINE static result_type apply_const(V const& lhs, V const& rhs, F f)
{
if (lhs.get_type_index() == sizeof...(Types)) // call binary functor
@@ -357,7 +405,7 @@ struct binary_dispatcher_lhs<F, V, T0, T1, Types...>
}
else
{
- return binary_dispatcher_lhs<F, V, T0, Types...>::apply_const(lhs, rhs, f);
+ return binary_dispatcher_lhs<F, V, R, T0, Types...>::apply_const(lhs, rhs, f);
}
}
@@ -369,16 +417,16 @@ struct binary_dispatcher_lhs<F, V, T0, T1, Types...>
}
else
{
- return binary_dispatcher_lhs<F, V, T0, Types...>::apply(lhs, rhs, f);
+ return binary_dispatcher_lhs<F, V, R, T0, Types...>::apply(lhs, rhs, f);
}
}
};
-template<typename F, typename V, typename T>
-struct binary_dispatcher_lhs<F, V, T>
+template<typename F, typename V, typename R, typename T>
+struct binary_dispatcher_lhs<F, V, R, T>
{
- using result_type = typename F::result_type;
+ using result_type = R;
VARIANT_INLINE static result_type apply_const(V const&, V const&, F)
{
throw std::runtime_error("binary dispatch: FAIL");
@@ -390,13 +438,13 @@ struct binary_dispatcher_lhs<F, V, T>
}
};
-template <typename F, typename V, typename...Types>
+template <typename F, typename V, typename R, typename...Types>
struct binary_dispatcher;
-template <typename F, typename V, typename T, typename...Types>
-struct binary_dispatcher<F, V, T, Types...>
+template <typename F, typename V, typename R, typename T, typename...Types>
+struct binary_dispatcher<F, V, R, T, Types...>
{
- using result_type = typename F::result_type;
+ using result_type = R;
VARIANT_INLINE static result_type apply_const(V const& v0, V const& v1, F f)
{
if (v0.get_type_index() == sizeof...(Types))
@@ -407,14 +455,14 @@ struct binary_dispatcher<F, V, T, Types...>
}
else
{
- return binary_dispatcher_rhs<F, V, T, Types...>::apply_const(v0, v1, f);
+ return binary_dispatcher_rhs<F, V, R, T, Types...>::apply_const(v0, v1, f);
}
}
else if (v1.get_type_index() == sizeof...(Types))
{
- return binary_dispatcher_lhs<F, V, T, Types...>::apply_const(v0, v1, f);
+ return binary_dispatcher_lhs<F, V, R, T, Types...>::apply_const(v0, v1, f);
}
- return binary_dispatcher<F, V, Types...>::apply_const(v0, v1, f);
+ return binary_dispatcher<F, V, R, Types...>::apply_const(v0, v1, f);
}
VARIANT_INLINE static result_type apply(V & v0, V & v1, F f)
@@ -427,21 +475,21 @@ struct binary_dispatcher<F, V, T, Types...>
}
else
{
- return binary_dispatcher_rhs<F, V, T, Types...>::apply(v0, v1, f);
+ return binary_dispatcher_rhs<F, V, R, T, Types...>::apply(v0, v1, f);
}
}
else if (v1.get_type_index() == sizeof...(Types))
{
- return binary_dispatcher_lhs<F, V, T, Types...>::apply(v0, v1, f);
+ return binary_dispatcher_lhs<F, V, R, T, Types...>::apply(v0, v1, f);
}
- return binary_dispatcher<F, V, Types...>::apply(v0, v1, f);
+ return binary_dispatcher<F, V, R, Types...>::apply(v0, v1, f);
}
};
-template<typename F, typename V>
-struct binary_dispatcher<F, V>
+template<typename F, typename V, typename R>
+struct binary_dispatcher<F, V, R>
{
- using result_type = typename F::result_type;
+ using result_type = R;
VARIANT_INLINE static result_type apply_const(V const&, V const&, F)
{
throw std::runtime_error("binary dispatch: FAIL");
@@ -473,7 +521,7 @@ struct less_comp
};
template <typename Variant, typename Comp>
-class comparer : public static_visitor<bool>
+class comparer
{
public:
explicit comparer(Variant const& lhs) noexcept
@@ -490,24 +538,6 @@ private:
Variant const& lhs_;
};
-// operator<< helper
-template <typename Out>
-class printer : public static_visitor<>
-{
-public:
- explicit printer(Out & out)
- : out_(out) {}
- printer& operator=(printer const&) = delete;
-
-// visitor
- template <typename T>
- void operator()(T const& operand) const
- {
- out_ << operand;
- }
-private:
- Out & out_;
-};
} // namespace detail
@@ -528,9 +558,11 @@ private:
data_type data;
public:
+
// tell spirit that this is an adapted variant
struct adapted_variant_tag;
using types = boost::mpl::vector<Types...>;
+
VARIANT_INLINE variant()
: type_index(sizeof...(Types) - 1)
{
@@ -540,6 +572,7 @@ public:
VARIANT_INLINE variant(no_init)
: type_index(detail::invalid_value) {}
+ // http://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers
template <typename T, class = typename std::enable_if<
detail::is_valid_type<typename std::remove_reference<T>::type, Types...>::value>::type>
VARIANT_INLINE variant(T && val) noexcept
@@ -613,7 +646,10 @@ public:
type_index = detail::direct_type<T, Types...>::index;
}
- template<typename T>
+ // get<T>()
+ template<typename T, typename std::enable_if<
+ (detail::direct_type<T, Types...>::index != detail::invalid_value)
+ >::type* = nullptr>
VARIANT_INLINE T& get()
{
if (type_index == detail::direct_type<T, Types...>::index)
@@ -622,11 +658,13 @@ public:
}
else
{
- throw std::runtime_error("in get()");
+ throw std::runtime_error("in get<T>()");
}
}
- template<typename T>
+ template <typename T, typename std::enable_if<
+ (detail::direct_type<T, Types...>::index != detail::invalid_value)
+ >::type* = nullptr>
VARIANT_INLINE T const& get() const
{
if (type_index == detail::direct_type<T, Types...>::index)
@@ -635,7 +673,69 @@ public:
}
else
{
- throw std::runtime_error("in get()");
+ throw std::runtime_error("in get<T>()");
+ }
+ }
+
+ // get<T>() - T stored as recursive_wrapper<T>
+ template <typename T, typename std::enable_if<
+ (detail::direct_type<recursive_wrapper<T>, Types...>::index != detail::invalid_value)
+ >::type* = nullptr>
+ VARIANT_INLINE T& get()
+ {
+ if (type_index == detail::direct_type<recursive_wrapper<T>, Types...>::index)
+ {
+ return (*reinterpret_cast<recursive_wrapper<T>*>(&data)).get();
+ }
+ else
+ {
+ throw std::runtime_error("in get<T>()");
+ }
+ }
+
+ template <typename T,typename std::enable_if<
+ (detail::direct_type<recursive_wrapper<T>, Types...>::index != detail::invalid_value)
+ >::type* = nullptr>
+ VARIANT_INLINE T const& get() const
+ {
+ if (type_index == detail::direct_type<recursive_wrapper<T>, Types...>::index)
+ {
+ return (*reinterpret_cast<recursive_wrapper<T> const*>(&data)).get();
+ }
+ else
+ {
+ throw std::runtime_error("in get<T>()");
+ }
+ }
+
+ // get<T>() - T stored as std::reference_wrapper<T>
+ template <typename T, typename std::enable_if<
+ (detail::direct_type<std::reference_wrapper<T>, Types...>::index != detail::invalid_value)
+ >::type* = nullptr>
+ VARIANT_INLINE T& get()
+ {
+ if (type_index == detail::direct_type<std::reference_wrapper<T>, Types...>::index)
+ {
+ return (*reinterpret_cast<std::reference_wrapper<T>*>(&data)).get();
+ }
+ else
+ {
+ throw std::runtime_error("in get<T>()");
+ }
+ }
+
+ template <typename T,typename std::enable_if<
+ (detail::direct_type<std::reference_wrapper<T const>, Types...>::index != detail::invalid_value)
+ >::type* = nullptr>
+ VARIANT_INLINE T const& get() const
+ {
+ if (type_index == detail::direct_type<std::reference_wrapper<T const>, Types...>::index)
+ {
+ return (*reinterpret_cast<std::reference_wrapper<T const> const*>(&data)).get();
+ }
+ else
+ {
+ throw std::runtime_error("in get<T>()");
}
}
@@ -644,22 +744,32 @@ public:
return type_index;
}
+ VARIANT_INLINE int which() const noexcept
+ {
+ return static_cast<int>(sizeof...(Types) - type_index - 1);
+ }
// visitor
// unary
template <typename F, typename V>
auto VARIANT_INLINE
static visit(V const& v, F f)
- -> decltype(detail::dispatcher<F, V, Types...>::apply_const(v, f))
+ -> decltype(detail::dispatcher<F, V,
+ typename detail::result_of_unary_visit<F,
+ typename detail::select_type<0, Types...>::type>::type, Types...>::apply_const(v, f))
{
- return detail::dispatcher<F, V, Types...>::apply_const(v, f);
+ using R = typename detail::result_of_unary_visit<F, typename detail::select_type<0, Types...>::type>::type;
+ return detail::dispatcher<F, V, R, Types...>::apply_const(v, f);
}
// non-const
template <typename F, typename V>
auto VARIANT_INLINE
static visit(V & v, F f)
- -> decltype(detail::dispatcher<F, V, Types...>::apply(v, f))
+ -> decltype(detail::dispatcher<F, V,
+ typename detail::result_of_unary_visit<F,
+ typename detail::select_type<0, Types...>::type>::type, Types...>::apply(v, f))
{
- return detail::dispatcher<F, V, Types...>::apply(v, f);
+ using R = typename detail::result_of_unary_visit<F, typename detail::select_type<0, Types...>::type>::type;
+ return detail::dispatcher<F, V, R, Types...>::apply(v, f);
}
// binary
@@ -667,17 +777,23 @@ public:
template <typename F, typename V>
auto VARIANT_INLINE
static binary_visit(V const& v0, V const& v1, F f)
- -> decltype(detail::binary_dispatcher<F, V, Types...>::apply_const(v0, v1, f))
+ -> decltype(detail::binary_dispatcher<F, V,
+ typename detail::result_of_binary_visit<F,
+ typename detail::select_type<0, Types...>::type>::type, Types...>::apply_const(v0, v1, f))
{
- return detail::binary_dispatcher<F, V, Types...>::apply_const(v0, v1, f);
+ using R = typename detail::result_of_binary_visit<F,typename detail::select_type<0, Types...>::type>::type;
+ return detail::binary_dispatcher<F, V, R, Types...>::apply_const(v0, v1, f);
}
// non-const
template <typename F, typename V>
auto VARIANT_INLINE
static binary_visit(V& v0, V& v1, F f)
- -> decltype(detail::binary_dispatcher<F, V, Types...>::apply(v0, v1, f))
+ -> decltype(detail::binary_dispatcher<F, V,
+ typename detail::result_of_binary_visit<F,
+ typename detail::select_type<0, Types...>::type>::type, Types...>::apply(v0, v1, f))
{
- return detail::binary_dispatcher<F, V, Types...>::apply(v0, v1, f);
+ using R = typename detail::result_of_binary_visit<F,typename detail::select_type<0, Types...>::type>::type;
+ return detail::binary_dispatcher<F, V, R, Types...>::apply(v0, v1, f);
}
~variant() noexcept
@@ -738,27 +854,17 @@ auto VARIANT_INLINE static apply_visitor(F f, V & v0, V & v1) -> decltype(V::bin
// getter interface
template<typename ResultType, typename T>
-ResultType & get(T & var)
+ResultType & get(T & var)
{
return var.template get<ResultType>();
}
template<typename ResultType, typename T>
-ResultType const& get(T const& var)
+ResultType const& get(T const& var)
{
return var.template get<ResultType>();
}
-// operator<<
-template <typename charT, typename traits, typename... Types>
-VARIANT_INLINE std::basic_ostream<charT, traits>&
-operator<< (std::basic_ostream<charT, traits>& out, variant<Types...> const& rhs)
-{
- detail::printer<std::basic_ostream<charT, traits>> visitor(out);
- apply_visitor(visitor, rhs);
- return out;
-}
-
}}
#endif // MAPNIK_UTIL_VARIANT_HPP
diff --git a/include/mapnik/util/variant_io.hpp b/include/mapnik/util/variant_io.hpp
new file mode 100644
index 0000000..cf08079
--- /dev/null
+++ b/include/mapnik/util/variant_io.hpp
@@ -0,0 +1,74 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_UTIL_VARIANT_IO_HPP
+#define MAPNIK_UTIL_VARIANT_IO_HPP
+
+
+namespace mapnik { namespace util {
+
+namespace detail {
+
+// operator<< helper
+template <typename Out>
+class printer
+{
+public:
+ explicit printer(Out & out)
+ : out_(out) {}
+ printer& operator=(printer const&) = delete;
+
+// visitor
+ template <typename T>
+ void operator()(T const& operand) const
+ {
+ out_ << operand;
+ }
+
+/// specialized visitor for boolean
+ void operator()(bool const & val) const
+ {
+ if (val) {
+ out_ << "true";
+ } else {
+ out_ << "false";
+ }
+ }
+private:
+ Out & out_;
+};
+
+} // namespace detail
+
+// operator<<
+template <typename charT, typename traits, typename... Types>
+VARIANT_INLINE std::basic_ostream<charT, traits>&
+operator<< (std::basic_ostream<charT, traits>& out, variant<Types...> const& rhs)
+{
+ detail::printer<std::basic_ostream<charT, traits>> visitor(out);
+ apply_visitor(visitor, rhs);
+ return out;
+}
+
+}}
+
+#endif // MAPNIK_UTIL_VARIANT_IO_HPP
diff --git a/include/mapnik/utils.hpp b/include/mapnik/utils.hpp
index d6961d9..a306f1c 100644
--- a/include/mapnik/utils.hpp
+++ b/include/mapnik/utils.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,6 @@
#define MAPNIK_UTILS_HPP
#include <mapnik/config.hpp>
-#include <mapnik/unique_lock.hpp>
// stl
#include <stdexcept> // std::runtime_error
@@ -123,7 +122,7 @@ protected:
if (! pInstance_)
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
if (! pInstance_)
{
diff --git a/include/mapnik/value.hpp b/include/mapnik/value.hpp
index 9a94623..83d396a 100644
--- a/include/mapnik/value.hpp
+++ b/include/mapnik/value.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -72,7 +72,7 @@ using value_base = util::variant<value_null, value_bool, value_integer,value_dou
namespace impl {
struct equals
- : public util::static_visitor<bool>
+
{
bool operator() (value_integer lhs, value_double rhs) const
{
@@ -124,7 +124,7 @@ struct equals
};
struct not_equals
- : public util::static_visitor<bool>
+
{
template <typename T, typename U>
bool operator() (const T &, const U &) const
@@ -186,7 +186,7 @@ struct not_equals
};
struct greater_than
- : public util::static_visitor<bool>
+
{
template <typename T, typename U>
bool operator()(const T &, const U &) const
@@ -222,7 +222,7 @@ struct greater_than
};
struct greater_or_equal
- : public util::static_visitor<bool>
+
{
template <typename T, typename U>
bool operator()(const T &, const U &) const
@@ -258,7 +258,7 @@ struct greater_or_equal
};
struct less_than
- : public util::static_visitor<bool>
+
{
template <typename T, typename U>
bool operator()(const T &, const U &) const
@@ -295,7 +295,7 @@ struct less_than
};
struct less_or_equal
- : public util::static_visitor<bool>
+
{
template <typename T, typename U>
bool operator()(const T &, const U &) const
@@ -332,7 +332,7 @@ struct less_or_equal
};
template <typename V>
-struct add : public util::static_visitor<V>
+struct add
{
using value_type = V;
value_type operator() (value_unicode_string const& lhs ,
@@ -398,7 +398,7 @@ struct add : public util::static_visitor<V>
};
template <typename V>
-struct sub : public util::static_visitor<V>
+struct sub
{
using value_type = V;
template <typename T1, typename T2>
@@ -436,7 +436,7 @@ struct sub : public util::static_visitor<V>
};
template <typename V>
-struct mult : public util::static_visitor<V>
+struct mult
{
using value_type = V;
template <typename T1, typename T2>
@@ -473,7 +473,7 @@ struct mult : public util::static_visitor<V>
};
template <typename V>
-struct div: public util::static_visitor<V>
+struct div
{
using value_type = V;
template <typename T1, typename T2>
@@ -514,7 +514,7 @@ struct div: public util::static_visitor<V>
};
template <typename V>
-struct mod: public util::static_visitor<V>
+struct mod
{
using value_type = V;
template <typename T1, typename T2>
@@ -558,7 +558,7 @@ struct mod: public util::static_visitor<V>
};
template <typename V>
-struct negate : public util::static_visitor<V>
+struct negate
{
using value_type = V;
@@ -589,7 +589,7 @@ template <typename T>
struct convert {};
template <>
-struct convert<value_bool> : public util::static_visitor<value_bool>
+struct convert<value_bool>
{
value_bool operator() (value_bool val) const
{
@@ -614,7 +614,7 @@ struct convert<value_bool> : public util::static_visitor<value_bool>
};
template <>
-struct convert<value_double> : public util::static_visitor<value_double>
+struct convert<value_double>
{
value_double operator() (value_double val) const
{
@@ -653,7 +653,7 @@ struct convert<value_double> : public util::static_visitor<value_double>
};
template <>
-struct convert<value_integer> : public util::static_visitor<value_integer>
+struct convert<value_integer>
{
value_integer operator() (value_integer val) const
{
@@ -692,7 +692,7 @@ struct convert<value_integer> : public util::static_visitor<value_integer>
};
template <>
-struct convert<std::string> : public util::static_visitor<std::string>
+struct convert<std::string>
{
template <typename T>
std::string operator() (T val) const
@@ -717,13 +717,18 @@ struct convert<std::string> : public util::static_visitor<std::string>
return str;
}
+ std::string operator() (value_bool val) const
+ {
+ return val ? "true": "false";
+ }
+
std::string operator() (value_null const&) const
{
return "";
}
};
-struct to_unicode : public util::static_visitor<value_unicode_string>
+struct to_unicode
{
template <typename T>
@@ -746,6 +751,16 @@ struct to_unicode : public util::static_visitor<value_unicode_string>
util::to_string(str,val);
return value_unicode_string(str.c_str());
}
+
+ value_unicode_string operator() (value_bool val) const
+ {
+ if (val) {
+ std::string str("true");
+ return value_unicode_string(str.c_str());
+ }
+ std::string str("false");
+ return value_unicode_string(str.c_str());
+ }
value_unicode_string operator() (value_null const&) const
{
@@ -753,7 +768,7 @@ struct to_unicode : public util::static_visitor<value_unicode_string>
}
};
-struct to_expression_string : public util::static_visitor<std::string>
+struct to_expression_string
{
explicit to_expression_string(char quote = '\'')
: quote_(quote) {}
@@ -947,7 +962,7 @@ using value_adl_barrier::operator<<;
namespace detail {
-struct is_null_visitor : public util::static_visitor<bool>
+struct is_null_visitor
{
bool operator() (value const& val) const
{
diff --git a/include/mapnik/value_error.hpp b/include/mapnik/value_error.hpp
index aca3c32..1edc541 100644
--- a/include/mapnik/value_error.hpp
+++ b/include/mapnik/value_error.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/value_hash.hpp b/include/mapnik/value_hash.hpp
index 1a72108..0933f06 100644
--- a/include/mapnik/value_hash.hpp
+++ b/include/mapnik/value_hash.hpp
@@ -42,7 +42,7 @@ inline void hash_combine(std::size_t & seed, T const& v)
seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
-struct value_hasher: public util::static_visitor<std::size_t>
+struct value_hasher
{
std::size_t operator() (value_null val) const
{
diff --git a/include/mapnik/value_types.hpp b/include/mapnik/value_types.hpp
index c4f5e55..fdaa99e 100644
--- a/include/mapnik/value_types.hpp
+++ b/include/mapnik/value_types.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,6 +25,7 @@
// mapnik
#include <mapnik/config.hpp>
+#include <mapnik/pixel_types.hpp>
// icu
#include <unicode/uversion.h> // for U_NAMESPACE_QUALIFIER
@@ -42,9 +43,13 @@ namespace mapnik {
#ifdef BIGINT
//using value_integer = boost::long_long_type;
-using value_integer = long long;
+//using value_integer = long long;
+using value_integer = std::int64_t;
+using value_integer_pixel = gray64s_t;
#else
-using value_integer = int;
+//using value_integer = int;
+using value_integer = std::int32_t;
+using value_integer_pixel = gray32s_t;
#endif
using value_double = double;
diff --git a/include/mapnik/version.hpp b/include/mapnik/version.hpp
index cfb3bd0..8030c5c 100644
--- a/include/mapnik/version.hpp
+++ b/include/mapnik/version.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/vertex.hpp b/include/mapnik/vertex.hpp
index 877c130..597526d 100644
--- a/include/mapnik/vertex.hpp
+++ b/include/mapnik/vertex.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,11 +24,12 @@
#define MAPNIK_VERTEX_HPP
#include <utility>
+#include <cstdint>
namespace mapnik
{
-enum CommandType {
+enum CommandType : std::uint8_t {
SEG_END = 0,
SEG_MOVETO = 1,
SEG_LINETO = 2,
@@ -44,7 +45,7 @@ struct vertex {
template <typename T>
struct vertex<T,2>
{
- enum no_init_t { no_init };
+ enum no_init_t : std::uint8_t { no_init };
using coord_type = T;
coord_type x;
diff --git a/include/mapnik/vertex_adapters.hpp b/include/mapnik/vertex_adapters.hpp
new file mode 100644
index 0000000..ae5f0d4
--- /dev/null
+++ b/include/mapnik/vertex_adapters.hpp
@@ -0,0 +1,277 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_VERTEX_ADAPTERS_HPP
+#define MAPNIK_VERTEX_ADAPTERS_HPP
+
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_types.hpp>
+#include <mapnik/vertex.hpp>
+
+namespace mapnik { namespace geometry {
+
+template <typename T>
+struct point_vertex_adapter
+{
+ using value_type = typename point<T>::value_type;
+
+ point_vertex_adapter(point<T> const& pt)
+ : pt_(pt),
+ first_(true) {}
+
+ unsigned vertex(value_type * x, value_type * y) const
+ {
+ if (first_)
+ {
+ *x = pt_.x;
+ *y = pt_.y;
+ first_ = false;
+ return mapnik::SEG_MOVETO;
+ }
+ return mapnik::SEG_END;
+ }
+
+ void rewind(unsigned) const
+ {
+ first_ = true;
+ }
+
+ inline geometry_types type () const
+ {
+ return geometry_types::Point;
+ }
+
+ point<T> const& pt_;
+ mutable bool first_;
+};
+
+template <typename T>
+struct line_string_vertex_adapter
+{
+ using value_type = typename point<T>::value_type;
+ line_string_vertex_adapter(line_string<T> const& line)
+ : line_(line),
+ current_index_(0),
+ end_index_(line.size())
+ {}
+
+ unsigned vertex(value_type * x, value_type * y) const
+ {
+ if (current_index_ != end_index_)
+ {
+ point<T> const& coord = line_[current_index_++];
+ *x = coord.x;
+ *y = coord.y;
+ if (current_index_ == 1)
+ {
+ return mapnik::SEG_MOVETO;
+ }
+ else
+ {
+ return mapnik::SEG_LINETO;
+ }
+ }
+ return mapnik::SEG_END;
+ }
+
+ void rewind(unsigned) const
+ {
+ current_index_ = 0;
+ }
+
+ inline geometry_types type () const
+ {
+ return geometry_types::LineString;
+ }
+
+ line_string<T> const& line_;
+ mutable std::size_t current_index_;
+ const std::size_t end_index_;
+
+};
+
+template <typename T>
+struct polygon_vertex_adapter
+{
+ using value_type = typename point<T>::value_type;
+ polygon_vertex_adapter(polygon<T> const& poly)
+ : poly_(poly),
+ rings_itr_(0),
+ rings_end_(poly_.interior_rings.size() + 1),
+ current_index_(0),
+ end_index_((rings_itr_ < rings_end_) ? poly_.exterior_ring.size() : 0),
+ start_loop_(true) {}
+
+ void rewind(unsigned) const
+ {
+ rings_itr_ = 0;
+ rings_end_ = poly_.interior_rings.size() + 1;
+ current_index_ = 0;
+ end_index_ = (rings_itr_ < rings_end_) ? poly_.exterior_ring.size() : 0;
+ start_loop_ = true;
+ }
+
+ unsigned vertex(value_type * x, value_type * y) const
+ {
+ if (rings_itr_ == rings_end_)
+ {
+ return mapnik::SEG_END;
+ }
+ if (current_index_ < end_index_)
+ {
+ point<T> const& coord = (rings_itr_ == 0) ?
+ poly_.exterior_ring[current_index_++] : poly_.interior_rings[rings_itr_- 1][current_index_++];
+ *x = coord.x;
+ *y = coord.y;
+ if (start_loop_)
+ {
+ start_loop_= false;
+ return mapnik::SEG_MOVETO;
+ }
+ if (current_index_ == end_index_)
+ {
+ *x = 0;
+ *y = 0;
+ return mapnik::SEG_CLOSE;
+ }
+ return mapnik::SEG_LINETO;
+ }
+ else if (++rings_itr_ != rings_end_)
+ {
+ current_index_ = 0;
+ end_index_ = poly_.interior_rings[rings_itr_ - 1].size();
+ point<T> const& coord = poly_.interior_rings[rings_itr_ - 1][current_index_++];
+ *x = coord.x;
+ *y = coord.y;
+ return mapnik::SEG_MOVETO;
+ }
+ return mapnik::SEG_END;
+ }
+
+ inline geometry_types type () const
+ {
+ return geometry_types::Polygon;
+ }
+
+private:
+ polygon<T> const& poly_;
+ mutable std::size_t rings_itr_;
+ mutable std::size_t rings_end_;
+ mutable std::size_t current_index_;
+ mutable std::size_t end_index_;
+ mutable bool start_loop_;
+};
+
+template <typename T>
+struct ring_vertex_adapter
+{
+ using value_type = typename point<T>::value_type;
+ ring_vertex_adapter(linear_ring<T> const& ring)
+ : ring_(ring),
+ current_index_(0),
+ end_index_(ring_.size()),
+ start_loop_(true) {}
+
+ void rewind(unsigned) const
+ {
+ current_index_ = 0;
+ end_index_ = ring_.size();
+ start_loop_ = true;
+ }
+
+ unsigned vertex(value_type * x, value_type * y) const
+ {
+ if (current_index_ < end_index_)
+ {
+ auto const& coord = ring_[current_index_++];
+ *x = coord.x;
+ *y = coord.y;
+ if (start_loop_)
+ {
+ start_loop_= false;
+ return mapnik::SEG_MOVETO;
+ }
+ if (current_index_ == end_index_)
+ {
+ *x = 0;
+ *y = 0;
+ return mapnik::SEG_CLOSE;
+ }
+ return mapnik::SEG_LINETO;
+ }
+ return mapnik::SEG_END;
+ }
+
+ inline geometry_types type () const
+ {
+ return geometry_types::Polygon;
+ }
+
+private:
+ linear_ring<T> const& ring_;
+ mutable std::size_t current_index_;
+ mutable std::size_t end_index_;
+ mutable bool start_loop_;
+};
+
+template <typename T>
+struct vertex_adapter_traits {};
+
+template <>
+struct vertex_adapter_traits<point<double> >
+{
+ using type = point_vertex_adapter<double>;
+};
+
+template <>
+struct vertex_adapter_traits<line_string<double> >
+{
+ using type = line_string_vertex_adapter<double>;
+};
+
+template <>
+struct vertex_adapter_traits<polygon<double> >
+{
+ using type = polygon_vertex_adapter<double>;
+};
+
+template <>
+struct vertex_adapter_traits<multi_point<double> >
+{
+ using type = point_vertex_adapter<double>;
+};
+
+template <>
+struct vertex_adapter_traits<multi_line_string<double> >
+{
+ using type = line_string_vertex_adapter<double>;
+};
+
+template <>
+struct vertex_adapter_traits<multi_polygon<double> >
+{
+ using type = polygon_vertex_adapter<double>;
+};
+
+}}
+
+#endif //MAPNIK_VERTEX_ADAPTERS_HPP
diff --git a/include/mapnik/vertex_cache.hpp b/include/mapnik/vertex_cache.hpp
new file mode 100644
index 0000000..094101a
--- /dev/null
+++ b/include/mapnik/vertex_cache.hpp
@@ -0,0 +1,237 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+#ifndef MAPNIK_VERTEX_CACHE_HPP
+#define MAPNIK_VERTEX_CACHE_HPP
+
+// mapnik
+#include <mapnik/pixel_position.hpp>
+#include <mapnik/debug.hpp>
+#include <mapnik/config.hpp>
+#include <mapnik/util/noncopyable.hpp>
+
+// agg
+#include "agg_basics.h"
+
+// stl
+#include <vector>
+#include <memory>
+#include <map>
+
+namespace mapnik
+{
+
+class vertex_cache;
+using vertex_cache_ptr = std::unique_ptr<vertex_cache>;
+
+// Caches all path points and their lengths. Allows easy moving in both directions.
+class MAPNIK_DECL vertex_cache : util::noncopyable
+{
+ struct segment
+ {
+ segment(double x, double y, double length) : pos(x, y), length(length) {}
+ pixel_position pos; //Last point of this segment, first point is implicitly defined by the previous segement in this vector
+ double length;
+ };
+
+ // The first segment always has the length 0 and just defines the starting point.
+ struct segment_vector
+ {
+ segment_vector() : vector(), length(0.) {}
+ void add_segment(double x, double y, double len) {
+ if (len == 0. && !vector.empty()) return; //Don't add zero length segments
+ vector.emplace_back(x, y, len);
+ length += len;
+ }
+ using iterator = std::vector<segment>::iterator;
+ std::vector<segment> vector;
+ double length;
+ };
+
+public:
+ // This class has no public members to avoid acciedential modification.
+ // It should only be used with save_state/restore_state.
+ class state
+ {
+ segment_vector::iterator current_segment;
+ double position_in_segment;
+ pixel_position current_position;
+ pixel_position segment_starting_point;
+ double position_;
+ friend class vertex_cache;
+ public:
+ pixel_position const& position() const { return current_position; }
+ };
+
+ class scoped_state : util::noncopyable
+ {
+ public:
+ scoped_state(vertex_cache &pp) : pp_(pp), state_(pp.save_state()), restored_(false) {}
+ void restore() { pp_.restore_state(state_); restored_ = true; }
+ ~scoped_state() { if (!restored_) pp_.restore_state(state_); }
+ state const& get_state() const { return state_; }
+ private:
+ vertex_cache &pp_;
+ state state_;
+ bool restored_;
+ };
+
+ ///////////////////////////////////////////////////////////////////////
+
+ template <typename T> vertex_cache(T &path);
+ vertex_cache(vertex_cache && rhs);
+
+ double length() const { return current_subpath_->length; }
+
+
+ pixel_position const& current_position() const { return current_position_; }
+ double angle(double width=0.);
+ double current_segment_angle();
+ double linear_position() const { return position_; }
+
+
+ // Returns a parallel line in the specified distance.
+ vertex_cache & get_offseted(double offset, double region_width);
+
+
+ // Skip a certain amount of space.
+ // This functions automatically calculate new points if the position is not exactly
+ // on a point on the path.
+
+ bool forward(double length);
+ // Go backwards.
+ bool backward(double length);
+ // Move in any direction (based on sign of length). Returns false if it reaches either end of the path.
+ bool move(double length);
+ // Move to given distance.
+ bool move_to_distance(double distance);
+ // Work on next subpath. Returns false if the is no next subpath.
+ bool next_subpath();
+
+ // Compatibility with standard path interface
+ void rewind(unsigned);
+ unsigned vertex(double *x, double *y);
+
+ // State
+ state save_state() const;
+ void restore_state(state const& s);
+ // Go back to initial state.
+ void reset();
+
+ // position on this line closest to the target position
+ double position_closest_to(pixel_position const &target_pos);
+
+private:
+ void rewind_subpath();
+ bool next_segment();
+ bool previous_segment();
+ void find_line_circle_intersection(
+ double cx, double cy, double radius,
+ double x1, double y1, double x2, double y2,
+ double & ix, double & iy) const;
+ // Position as calculated by last move/forward/next call.
+ pixel_position current_position_;
+ // First pixel of current segment.
+ pixel_position segment_starting_point_;
+ // List of all subpaths.
+ std::vector<segment_vector> subpaths_;
+ // Currently active subpath.
+ std::vector<segment_vector>::iterator current_subpath_;
+ // Current segment for normal operation (move()).
+ segment_vector::iterator current_segment_;
+ // Current segment in compatibility mode (vertex(), rewind()).
+ segment_vector::iterator vertex_segment_;
+ // Currently active subpath in compatibility mode.
+ std::vector<segment_vector>::iterator vertex_subpath_;
+ // State is initialized (after first call to next_subpath()).
+ bool initialized_;
+ // Position from start of segment.
+ double position_in_segment_;
+ // Angle for current segment.
+ mutable double angle_;
+ // Is the value in angle_ valid?
+ // Used to avoid unnecessary calculations.
+ mutable bool angle_valid_;
+ using offseted_lines_map = std::map<double, vertex_cache_ptr>;
+ // Cache of all offseted lines already computed.
+ offseted_lines_map offseted_lines_;
+ // Linear position, i.e distance from start of line.
+ double position_;
+};
+
+
+template <typename T>
+vertex_cache::vertex_cache(T & path)
+ : current_position_(),
+ segment_starting_point_(),
+ subpaths_(),
+ current_subpath_(),
+ current_segment_(),
+ vertex_segment_(),
+ vertex_subpath_(),
+ initialized_(false),
+ position_in_segment_(0.),
+ angle_(0.),
+ angle_valid_(false),
+ offseted_lines_(),
+ position_(0.)
+{
+ path.rewind(0);
+ unsigned cmd;
+ double new_x = 0., new_y = 0., old_x = 0., old_y = 0.;
+ bool first = true; //current_subpath_ uninitalized
+ while (!agg::is_stop(cmd = path.vertex(&new_x, &new_y)))
+ {
+ if (agg::is_move_to(cmd))
+ {
+ //Create new sub path
+ subpaths_.emplace_back();
+ current_subpath_ = subpaths_.end()-1;
+ current_subpath_->add_segment(new_x, new_y, 0);
+ first = false;
+ }
+ else if (agg::is_line_to(cmd))
+ {
+ if (first)
+ {
+ MAPNIK_LOG_ERROR(vertex_cache) << "No starting point in path!\n";
+ continue;
+ }
+ double dx = old_x - new_x;
+ double dy = old_y - new_y;
+ double segment_length = std::sqrt(dx*dx + dy*dy);
+ current_subpath_->add_segment(new_x, new_y, segment_length);
+ }
+ else if (agg::is_closed(cmd) && !current_subpath_->vector.empty())
+ {
+ segment const & first_segment = current_subpath_->vector[0];
+ double dx = old_x - first_segment.pos.x;
+ double dy = old_y - first_segment.pos.y;
+ double segment_length = std::sqrt(dx*dx + dy*dy);
+ current_subpath_->add_segment(first_segment.pos.x, first_segment.pos.y, segment_length);
+ }
+ old_x = new_x;
+ old_y = new_y;
+ }
+}
+
+}
+#endif
diff --git a/include/mapnik/vertex_converters.hpp b/include/mapnik/vertex_converters.hpp
index 0f0e362..13c07d8 100644
--- a/include/mapnik/vertex_converters.hpp
+++ b/include/mapnik/vertex_converters.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,7 +23,6 @@
#ifndef MAPNIK_VERTEX_CONVERTERS_HPP
#define MAPNIK_VERTEX_CONVERTERS_HPP
-
// mapnik
#include <mapnik/config.hpp>
#include <mapnik/attribute.hpp>
@@ -32,18 +31,17 @@
#include <mapnik/offset_converter.hpp>
#include <mapnik/simplify.hpp>
#include <mapnik/simplify_converter.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/value_types.hpp>
#include <mapnik/symbolizer_enumerations.hpp>
#include <mapnik/symbolizer_keys.hpp>
#include <mapnik/symbolizer.hpp>
-#include <mapnik/geometry.hpp>
+
// agg
#include "agg_math_stroke.h"
#include "agg_trans_affine.h"
#include "agg_conv_clip_polygon.h"
#include "agg_conv_clip_polyline.h"
-#include "agg_conv_close_polygon.h"
#include "agg_conv_smooth_poly1.h"
#include "agg_conv_stroke.h"
#include "agg_conv_dash.h"
@@ -59,7 +57,6 @@ namespace mapnik {
struct transform_tag {};
struct clip_line_tag {};
struct clip_poly_tag {};
-struct close_poly_tag {};
struct smooth_tag {};
struct simplify_tag {};
struct stroke_tag {};
@@ -70,14 +67,10 @@ struct offset_transform_tag {};
namespace detail {
template <typename T0, typename T1>
-struct converter_traits
-{
- using geometry_type = T0;
- using conv_type = geometry_type;
-};
+struct converter_traits {};
template <typename T>
-struct converter_traits<T,mapnik::smooth_tag>
+struct converter_traits<T, mapnik::smooth_tag>
{
using geometry_type = T;
using conv_type = typename agg::conv_smooth_poly1_curve<geometry_type>;
@@ -211,15 +204,6 @@ struct converter_traits<T,mapnik::clip_poly_tag>
};
template <typename T>
-struct converter_traits<T,mapnik::close_poly_tag>
-{
- using geometry_type = T;
- using conv_type = typename agg::conv_close_polygon<geometry_type>;
- template <typename Args>
- static void setup(geometry_type & , Args const&) {}
-};
-
-template <typename T>
struct converter_traits<T,mapnik::transform_tag>
{
using geometry_type = T;
@@ -268,6 +252,25 @@ struct converter_traits<T,mapnik::offset_transform_tag>
}
};
+
+template <typename T0, typename T1>
+struct is_switchable
+{
+ static constexpr bool value = true;
+};
+
+template <typename T>
+struct is_switchable<T, transform_tag>
+{
+ static constexpr bool value = false;
+};
+
+template <typename T>
+struct is_switchable<T, stroke_tag>
+{
+ static constexpr bool value = false;
+};
+
template <typename Dispatcher, typename... ConverterTypes>
struct converters_helper;
@@ -288,8 +291,9 @@ struct converters_helper<Dispatcher,Current,ConverterTypes...>
}
}
- template <typename Geometry>
- static void forward(Dispatcher & disp, Geometry & geom)
+ template <typename Geometry, typename Processor>
+ static void forward(Dispatcher & disp, Geometry & geom, Processor & proc,
+ typename std::enable_if<detail::is_switchable<Geometry,Current>::value>::type* = 0)
{
constexpr std::size_t index = sizeof...(ConverterTypes);
if (disp.vec_[index] == 1)
@@ -297,13 +301,22 @@ struct converters_helper<Dispatcher,Current,ConverterTypes...>
using conv_type = typename detail::converter_traits<Geometry,Current>::conv_type;
conv_type conv(geom);
detail::converter_traits<conv_type,Current>::setup(conv,disp.args_);
- converters_helper<Dispatcher, ConverterTypes...>::forward(disp, conv);
+ converters_helper<Dispatcher, ConverterTypes...>::forward(disp, conv, proc);
}
else
{
- converters_helper<Dispatcher,ConverterTypes...>::forward(disp, geom);
+ converters_helper<Dispatcher,ConverterTypes...>::forward(disp, geom, proc);
}
}
+ template <typename Geometry, typename Processor>
+ static void forward(Dispatcher & disp, Geometry & geom, Processor & proc,
+ typename std::enable_if<!detail::is_switchable<Geometry,Current>::value>::type* = 0)
+ {
+ using conv_type = typename detail::converter_traits<Geometry,Current>::conv_type;
+ conv_type conv(geom);
+ detail::converter_traits<conv_type,Current>::setup(conv,disp.args_);
+ converters_helper<Dispatcher, ConverterTypes...>::forward(disp, conv, proc);
+ }
};
template <typename Dispatcher>
@@ -311,40 +324,37 @@ struct converters_helper<Dispatcher>
{
template <typename Converter>
static void set(Dispatcher &, int) {}
- template <typename Geometry>
- static void forward(Dispatcher & disp, Geometry & geom)
+ template <typename Geometry, typename Processor>
+ static void forward(Dispatcher & disp, Geometry & geom, Processor & proc)
{
- disp.args_.proc.add_path(geom);
+ proc.add_path(geom);
}
};
-template <typename Args, typename... ConverterTypes>
-struct dispatcher : mapnik::noncopyable
+template <typename Args, int NUM_CONV>
+struct dispatcher : util::noncopyable
{
using this_type = dispatcher;
using args_type = Args;
- dispatcher(typename Args::processor_type & proc, box2d<double> const& bbox, symbolizer_base const& sym, view_transform const& tr,
+ dispatcher(box2d<double> const& bbox, symbolizer_base const& sym, view_transform const& tr,
proj_transform const& prj_trans, agg::trans_affine const& affine_trans, feature_impl const& feature,
attributes const& vars, double scale_factor)
- : args_(proc,bbox,sym,tr,prj_trans,affine_trans,feature,vars,scale_factor)
+ : args_(bbox,sym,tr,prj_trans,affine_trans,feature,vars,scale_factor)
{
std::fill(vec_.begin(), vec_.end(), 0);
}
- std::array<unsigned, sizeof...(ConverterTypes)> vec_;
+ std::array<unsigned, NUM_CONV> vec_;
args_type args_;
};
-template <typename Processor>
-struct arguments : mapnik::noncopyable
+struct arguments : util::noncopyable
{
- using processor_type = Processor;
- arguments(Processor & proc, box2d<double> const& bbox, symbolizer_base const& sym, view_transform const& tr,
+ arguments(box2d<double> const& bbox, symbolizer_base const& sym, view_transform const& tr,
proj_transform const& prj_trans, agg::trans_affine const& affine_trans, feature_impl const& feature,
attributes const& vars, double scale_factor)
- : proc(proc),
- bbox(bbox),
+ : bbox(bbox),
sym(sym),
tr(tr),
prj_trans(prj_trans),
@@ -353,7 +363,6 @@ struct arguments : mapnik::noncopyable
vars(vars),
scale_factor(scale_factor) {}
- Processor & proc;
box2d<double> const& bbox;
symbolizer_base const& sym;
view_transform const& tr;
@@ -366,21 +375,19 @@ struct arguments : mapnik::noncopyable
}
-template <typename Processor, typename... ConverterTypes >
-struct vertex_converter : private mapnik::noncopyable
+template <typename... ConverterTypes >
+struct vertex_converter : private util::noncopyable
{
using bbox_type = box2d<double>;
- using processor_type = Processor;
using symbolizer_type = symbolizer_base;
using trans_type = view_transform;
using proj_trans_type = proj_transform;
using affine_trans_type = agg::trans_affine;
using feature_type = feature_impl;
- using args_type = detail::arguments<Processor>;
- using dispatcher_type = detail::dispatcher<args_type,ConverterTypes...>;
+ using args_type = detail::arguments;
+ using dispatcher_type = detail::dispatcher<args_type, sizeof...(ConverterTypes)>;
vertex_converter(bbox_type const& bbox,
- processor_type & proc,
symbolizer_type const& sym,
trans_type const& tr,
proj_trans_type const& prj_trans,
@@ -388,11 +395,12 @@ struct vertex_converter : private mapnik::noncopyable
feature_type const& feature,
attributes const& vars,
double scale_factor)
- : disp_(proc,bbox,sym,tr,prj_trans,affine_trans,feature,vars,scale_factor) {}
+ : disp_(bbox,sym,tr,prj_trans,affine_trans,feature,vars,scale_factor) {}
- void apply(geometry_type & geom)
+ template <typename VertexAdapter, typename Processor>
+ void apply(VertexAdapter & geom, Processor & proc)
{
- detail::converters_helper<dispatcher_type, ConverterTypes...>:: template forward<geometry_type>(disp_, geom);
+ detail::converters_helper<dispatcher_type, ConverterTypes...>:: template forward<VertexAdapter, Processor>(disp_, geom, proc);
}
template <typename Converter>
diff --git a/include/mapnik/vertex_processor.hpp b/include/mapnik/vertex_processor.hpp
new file mode 100644
index 0000000..a3b63c1
--- /dev/null
+++ b/include/mapnik/vertex_processor.hpp
@@ -0,0 +1,111 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_VERTEX_PROCESSOR_HPP
+#define MAPNIK_VERTEX_PROCESSOR_HPP
+
+#include <mapnik/vertex_adapters.hpp>
+
+namespace mapnik { namespace geometry {
+
+template <typename T>
+struct vertex_processor
+{
+ using processor_type = T;
+ vertex_processor(processor_type& proc)
+ : proc_(proc) {}
+
+ template <typename Geometry>
+ void operator() (Geometry const& geom)
+ {
+ util::apply_visitor(*this, geom);
+ }
+ void operator() (geometry_empty const&)
+ {
+ // no-op
+ }
+
+ template <typename T1>
+ void operator() (point<T1> const& pt)
+ {
+ point_vertex_adapter<T1> va(pt);
+ proc_(va);
+ }
+
+ template <typename T1>
+ void operator() (line_string<T1> const& line)
+ {
+ line_string_vertex_adapter<T1> va(line);
+ proc_(va);
+ }
+
+ template <typename T1>
+ void operator() (polygon<T1> const& poly)
+ {
+ polygon_vertex_adapter<T1> va(poly);
+ proc_(va);
+ }
+
+ template <typename T1>
+ void operator() (multi_point<T1> const& multi_pt)
+ {
+ for (auto const& pt : multi_pt)
+ {
+ point_vertex_adapter<T1> va(pt);
+ proc_(va);
+ }
+ }
+
+ template <typename T1>
+ void operator() (multi_line_string<T1> const& multi_line)
+ {
+ for (auto const& line : multi_line)
+ {
+ line_string_vertex_adapter<T1> va(line);
+ proc_(va);
+ }
+ }
+
+ template <typename T1>
+ void operator() (multi_polygon<T1> const& multi_poly)
+ {
+ for ( auto const& poly : multi_poly)
+ {
+ polygon_vertex_adapter<T1> va(poly);
+ proc_(va);
+ }
+ }
+
+ template <typename T1>
+ void operator() (geometry_collection<T1> const& collection)
+ {
+ for (auto const& geom : collection)
+ {
+ operator()(geom);
+ }
+ }
+ processor_type & proc_;
+};
+
+}}
+
+#endif // MAPNIK_VERTEX_PROCESSOR_HPP
diff --git a/include/mapnik/vertex_vector.hpp b/include/mapnik/vertex_vector.hpp
index 198865c..a25afc2 100644
--- a/include/mapnik/vertex_vector.hpp
+++ b/include/mapnik/vertex_vector.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -29,7 +29,7 @@
// mapnik
#include <mapnik/vertex.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// stl
#include <algorithm>
@@ -40,7 +40,7 @@ namespace mapnik
{
template <typename T>
-class vertex_vector : private mapnik::noncopyable
+class vertex_vector : private util::noncopyable
{
using coord_type = T;
enum block_e {
diff --git a/include/mapnik/view_strategy.hpp b/include/mapnik/view_strategy.hpp
new file mode 100644
index 0000000..a984dc4
--- /dev/null
+++ b/include/mapnik/view_strategy.hpp
@@ -0,0 +1,95 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_VIEW_STRATEGY_HPP
+#define MAPNIK_VIEW_STRATEGY_HPP
+
+// mapnik
+#include <mapnik/view_transform.hpp>
+
+// boost
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/core/access.hpp>
+#include <boost/numeric/conversion/cast.hpp>
+
+namespace mapnik
+{
+
+struct view_strategy
+{
+ view_strategy(view_transform const& tr)
+ : tr_(tr) {}
+
+ template <typename P1, typename P2>
+ inline bool apply(P1 const& p1, P2 & p2) const
+ {
+ using coordinate_type = typename boost::geometry::coordinate_type<P2>::type;
+ double x = boost::geometry::get<0>(p1);
+ double y = boost::geometry::get<1>(p1);
+ tr_.forward(&x,&y);
+ boost::geometry::set<0>(p2, boost::numeric_cast<coordinate_type>(x));
+ boost::geometry::set<1>(p2, boost::numeric_cast<coordinate_type>(y));
+ return true;
+ }
+
+ template <typename P1, typename P2>
+ inline P2 execute(P1 const& p1, bool & status) const
+ {
+ P2 p2;
+ status = apply(p1, p2);
+ return p2;
+ }
+
+ view_transform const& tr_;
+};
+
+struct unview_strategy
+{
+ unview_strategy(view_transform const& tr)
+ : tr_(tr) {}
+
+ template <typename P1, typename P2>
+ inline bool apply(P1 const& p1, P2 & p2) const
+ {
+ using coordinate_type = typename boost::geometry::coordinate_type<P2>::type;
+ double x = boost::geometry::get<0>(p1);
+ double y = boost::geometry::get<1>(p1);
+ tr_.backward(&x,&y);
+ boost::geometry::set<0>(p2, boost::numeric_cast<coordinate_type>(x));
+ boost::geometry::set<1>(p2, boost::numeric_cast<coordinate_type>(y));
+ return true;
+ }
+
+ template <typename P1, typename P2>
+ inline P2 execute(P1 const& p1, bool & status) const
+ {
+ P2 p2;
+ status = apply(p1, p2);
+ return p2;
+ }
+
+ view_transform const& tr_;
+};
+
+}
+
+#endif // MAPNIK_VIEW_STRATEGY_HPP
diff --git a/include/mapnik/view_transform.hpp b/include/mapnik/view_transform.hpp
index 683e979..e293eb6 100644
--- a/include/mapnik/view_transform.hpp
+++ b/include/mapnik/view_transform.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -178,6 +178,7 @@ public:
return extent_;
}
};
+
}
#endif // MAPNIK_VIEW_TRANSFORM_HPP
diff --git a/include/mapnik/warp.hpp b/include/mapnik/warp.hpp
index 7e53ca0..262164e 100644
--- a/include/mapnik/warp.hpp
+++ b/include/mapnik/warp.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,6 +26,7 @@
// mapnik
#include <mapnik/image_scaling.hpp>
#include <mapnik/config.hpp>
+#include <mapnik/box2d.hpp>
namespace mapnik {
@@ -33,12 +34,17 @@ class raster;
class proj_transform;
MAPNIK_DECL void reproject_and_scale_raster(raster & target,
- raster const& source,
- proj_transform const& prj_trans,
- double offset_x, double offset_y,
- unsigned mesh_size,
- scaling_method_e scaling_method);
+ raster const& source,
+ proj_transform const& prj_trans,
+ double offset_x, double offset_y,
+ unsigned mesh_size,
+ scaling_method_e scaling_method);
+
+template <typename T>
+MAPNIK_DECL void warp_image (T & target, T const& source, proj_transform const& prj_trans,
+ box2d<double> const& target_ext, box2d<double> const& source_ext,
+ double offset_x, double offset_y, unsigned mesh_size, scaling_method_e scaling_method, double filter_factor);
}
#endif // MAPNIK_WARP_HPP
diff --git a/include/mapnik/webp_io.hpp b/include/mapnik/webp_io.hpp
index 2689635..be10b80 100644
--- a/include/mapnik/webp_io.hpp
+++ b/include/mapnik/webp_io.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,7 @@
#define MAPNIK_WEBP_IO_HPP
// mapnik
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
#include <mapnik/util/conversions.hpp>
// webp
@@ -73,69 +73,69 @@ std::string webp_encoding_error(WebPEncodingError error)
}
template <typename T2>
-inline int import_image_data(T2 const& image,
+inline int import_image(T2 const& im_in,
WebPPicture & pic,
bool alpha)
{
- image_data<typename T2::pixel_type> const& data = image.data();
- int stride = sizeof(typename T2::pixel_type) * image.width();
- if (data.width() == image.width() &&
- data.height() == image.height())
+ image<typename T2::pixel> const& data = im_in.data();
+ int stride = sizeof(typename T2::pixel_type) * im_in.width();
+ if (data.width() == im_in.width() &&
+ data.height() == im_in.height())
{
if (alpha)
{
- return WebPPictureImportRGBA(&pic, data.getBytes(), stride);
+ return WebPPictureImportRGBA(&pic, data.bytes(), stride);
}
else
{
#if (WEBP_ENCODER_ABI_VERSION >> 8) >= 1
- return WebPPictureImportRGBX(&pic, data.getBytes(), stride);
+ return WebPPictureImportRGBX(&pic, data.bytes(), stride);
#else
- return WebPPictureImportRGBA(&pic, data.getBytes(), stride);
+ return WebPPictureImportRGBA(&pic, data.bytes(), stride);
#endif
}
}
else
{
// need to copy: https://github.com/mapnik/mapnik/issues/2024
- image_data_32 im(image.width(),image.height());
- for (unsigned y = 0; y < image.height(); ++y)
+ image_rgba8 im(im_in.width(),im_in.height());
+ for (unsigned y = 0; y < im_in.height(); ++y)
{
- typename T2::pixel_type const * row_from = image.getRow(y);
- image_data_32::pixel_type * row_to = im.getRow(y);
+ typename T2::pixel_type const * row_from = im_in.get_row(y);
+ image_rgba8::pixel_type * row_to = im.get_row(y);
std::copy(row_from, row_from + stride, row_to);
}
if (alpha)
{
- return WebPPictureImportRGBA(&pic, im.getBytes(), stride);
+ return WebPPictureImportRGBA(&pic, im.bytes(), stride);
}
else
{
#if (WEBP_ENCODER_ABI_VERSION >> 8) >= 1
- return WebPPictureImportRGBX(&pic, im.getBytes(), stride);
+ return WebPPictureImportRGBX(&pic, im.bytes(), stride);
#else
- return WebPPictureImportRGBA(&pic, im.getBytes(), stride);
+ return WebPPictureImportRGBA(&pic, im.bytes(), stride);
#endif
}
}
}
template <>
-inline int import_image_data(image_data_32 const& im,
+inline int import_image(image_rgba8 const& im,
WebPPicture & pic,
bool alpha)
{
- int stride = sizeof(image_data_32::pixel_type) * im.width();
+ int stride = sizeof(image_rgba8::pixel_type) * im.width();
if (alpha)
{
- return WebPPictureImportRGBA(&pic, im.getBytes(), stride);
+ return WebPPictureImportRGBA(&pic, im.bytes(), stride);
}
else
{
#if (WEBP_ENCODER_ABI_VERSION >> 8) >= 1
- return WebPPictureImportRGBX(&pic, im.getBytes(), stride);
+ return WebPPictureImportRGBX(&pic, im.bytes(), stride);
#else
- return WebPPictureImportRGBA(&pic, im.getBytes(), stride);
+ return WebPPictureImportRGBA(&pic, im.bytes(), stride);
#endif
}
}
@@ -170,7 +170,7 @@ void save_as_webp(T1& file,
const int width = pic.width;
const int height = pic.height;
for (int y = 0; y < height; ++y) {
- typename T2::pixel_type const * row = image.getRow(y);
+ typename T2::pixel_type const * row = image.get_row(y);
for (int x = 0; x < width; ++x) {
const unsigned rgba = row[x];
unsigned a = (rgba >> 24) & 0xff;
@@ -187,10 +187,10 @@ void save_as_webp(T1& file,
{
// different approach for lossy since ImportYUVAFromRGBA is needed
// to prepare WebPPicture and working with view pixels is not viable
- ok = import_image_data(image,pic,alpha);
+ ok = import_image(image,pic,alpha);
}
#else
- ok = import_image_data(image,pic,alpha);
+ ok = import_image(image,pic,alpha);
#endif
if (!ok)
{
diff --git a/include/mapnik/well_known_srs.hpp b/include/mapnik/well_known_srs.hpp
index 5efab62..41d4cac 100644
--- a/include/mapnik/well_known_srs.hpp
+++ b/include/mapnik/well_known_srs.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,6 +26,7 @@
// mapnik
#include <mapnik/global.hpp> // for M_PI on windows
#include <mapnik/enumeration.hpp>
+#include <mapnik/geometry.hpp>
// boost
#include <boost/optional.hpp>
@@ -35,7 +36,7 @@
namespace mapnik {
-enum well_known_srs_enum {
+enum well_known_srs_enum : std::uint8_t {
WGS_84,
G_MERC,
well_known_srs_enum_MAX
@@ -89,6 +90,36 @@ static inline bool merc2lonlat(double * x, double * y , int point_count)
return true;
}
+static inline bool lonlat2merc(geometry::line_string<double> & ls)
+{
+ for(auto & p : ls)
+ {
+ if (p.x > 180) p.x = 180;
+ else if (p.x < -180) p.x = -180;
+ if (p.y > MAX_LATITUDE) p.y = MAX_LATITUDE;
+ else if (p.y < -MAX_LATITUDE) p.y = -MAX_LATITUDE;
+ p.x = p.x * MAXEXTENTby180;
+ p.y = std::log(std::tan((90 + p.y) * M_PIby360)) * R2D;
+ p.y = p.y * MAXEXTENTby180;
+ }
+ return true;
+}
+
+static inline bool merc2lonlat(geometry::line_string<double> & ls)
+{
+ for (auto & p : ls)
+ {
+ if (p.x > MAXEXTENT) p.x = MAXEXTENT;
+ else if (p.x < -MAXEXTENT) p.x = -MAXEXTENT;
+ if (p.y > MAXEXTENT) p.y = MAXEXTENT;
+ else if (p.y < -MAXEXTENT) p.y = -MAXEXTENT;
+ p.x = (p.x / MAXEXTENT) * 180;
+ p.y = (p.y / MAXEXTENT) * 180;
+ p.y = R2D * (2 * std::atan(std::exp(p.y * D2R)) - M_PI_by2);
+ }
+ return true;
+}
+
}
#endif // MAPNIK_WELL_KNOWN_SRS_HPP
diff --git a/include/mapnik/wkb.hpp b/include/mapnik/wkb.hpp
index 2f3052c..3247804 100644
--- a/include/mapnik/wkb.hpp
+++ b/include/mapnik/wkb.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,8 +25,7 @@
// mapnik
#include <mapnik/geometry.hpp>
-#include <mapnik/geometry_container.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
namespace mapnik
{
@@ -42,22 +41,29 @@ namespace mapnik
* the Open Geospatial Consortium (OGC) and described in their Simple Feature
* Access and Coordinate Transformation Service specifications.
*/
-enum wkbFormat
+
+enum wkbFormat : std::uint8_t
{
wkbAuto=1,
wkbGeneric=2,
wkbSpatiaLite=3
};
-class MAPNIK_DECL geometry_utils : private mapnik::noncopyable
+enum wkbByteOrder : std::uint8_t
+{
+ wkbXDR=0,
+ wkbNDR=1
+};
+
+class MAPNIK_DECL geometry_utils : private util::noncopyable
{
public:
- static bool from_wkb(mapnik::geometry_container& paths,
- const char* wkb,
- unsigned size,
- wkbFormat format = wkbGeneric);
+ static mapnik::geometry::geometry<double> from_wkb(const char* wkb,
+ std::size_t size,
+ wkbFormat format = wkbGeneric);
};
+
}
#endif // MAPNIK_WKB_HPP
diff --git a/include/mapnik/wkt/wkt_factory.hpp b/include/mapnik/wkt/wkt_factory.hpp
index c546d59..3e2ece1 100644
--- a/include/mapnik/wkt/wkt_factory.hpp
+++ b/include/mapnik/wkt/wkt_factory.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,22 +25,23 @@
// mapnik
#include <mapnik/geometry.hpp>
-#include <mapnik/geometry_container.hpp>
+
#include <mapnik/wkt/wkt_grammar.hpp>
+#include <mapnik/wkt/wkt_generator_grammar.hpp>
// stl
#include <string>
namespace mapnik {
-inline bool from_wkt(std::string const& wkt, mapnik::geometry_container & paths)
+inline bool from_wkt(std::string const& wkt, mapnik::geometry::geometry<double> & geom)
{
using namespace boost::spirit;
- static const mapnik::wkt::wkt_collection_grammar<std::string::const_iterator> g;
+ static const mapnik::wkt::wkt_grammar<std::string::const_iterator> g;
ascii::space_type space;
std::string::const_iterator first = wkt.begin();
std::string::const_iterator last = wkt.end();
- return qi::phrase_parse(first, last, g, space, paths);
+ return qi::phrase_parse(first, last, (g)(boost::phoenix::ref(geom)), space);
}
}
diff --git a/include/mapnik/wkt/wkt_generator_grammar.hpp b/include/mapnik/wkt/wkt_generator_grammar.hpp
index 9c6337c..fc8e700 100644
--- a/include/mapnik/wkt/wkt_generator_grammar.hpp
+++ b/include/mapnik/wkt/wkt_generator_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2015 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,27 +26,19 @@
// mapnik
#include <mapnik/global.hpp>
#include <mapnik/geometry.hpp>
-#include <mapnik/vertex.hpp> // for CommandType::SEG_MOVETO
-#include <mapnik/util/container_adapter.hpp>
+#include <mapnik/geometry_type.hpp>
+#include <mapnik/geometry_fusion_adapted.hpp>
// boost
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
#pragma GCC diagnostic ignored "-Wunused-local-typedef"
#include <boost/spirit/include/karma.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
#include <boost/spirit/include/phoenix_function.hpp>
-#include <boost/spirit/include/phoenix_statement.hpp>
-#include <boost/fusion/adapted/std_tuple.hpp>
#include <boost/math/special_functions/trunc.hpp> // for vc++ and android whose c++11 libs lack std::trunc
+#include <boost/spirit/home/karma/domain.hpp>
#pragma GCC diagnostic pop
-// stl
-#include <tuple>
-#include <type_traits>
-
namespace mapnik { namespace wkt {
namespace karma = boost::spirit::karma;
@@ -57,68 +49,16 @@ namespace detail {
template <typename Geometry>
struct get_type
{
- using result_type = int;
-
- int operator() (Geometry const& geom) const
+ using result_type = mapnik::geometry::geometry_types;
+ template <typename T>
+ result_type operator() (T const& geom) const
{
- return static_cast<int>(geom.type());
- }
-};
-
-template <typename Geometry>
-struct get_first
-{
- using result_type = const typename Geometry::value_type;
- typename geometry_type::value_type const operator() (Geometry const& geom) const
- {
- typename Geometry::value_type coord;
- geom.rewind(0);
- std::get<0>(coord) = geom.vertex(&std::get<1>(coord),&std::get<2>(coord));
- return coord;
- }
-};
-
-template <typename GeometryContainer>
-struct multi_geometry_
-{
- using result_type = bool;
- bool operator() (GeometryContainer const& geom) const
- {
- return geom.size() > 1 ? true : false;
+ auto type = mapnik::geometry::geometry_type(geom);
+ return type;
}
};
template <typename T>
-struct get_x
-{
- using value_type = T;
- using result_type = double;
- double operator() (value_type const& val) const
- {
- return std::get<1>(val);
- }
-};
-
-template <typename T>
-struct get_y
-{
- using value_type = T;
- using result_type = double;
- double operator() (value_type const& val) const
- {
- return std::get<2>(val);
- }
-};
-
-template <typename GeometryContainer>
-struct multi_geometry_type
-{
- using result_type = std::tuple<unsigned,bool>;
- std::tuple<unsigned,bool> operator() (GeometryContainer const& geom) const;
-};
-
-
-template <typename T>
struct wkt_coordinate_policy : karma::real_policies<T>
{
using base_type = boost::spirit::karma::real_policies<T>;
@@ -148,54 +88,64 @@ struct wkt_coordinate_policy : karma::real_policies<T>
}
-template <typename OutputIterator, typename Geometry>
-struct wkt_generator :
+template <typename OutputIterator, typename Geometry, typename T>
+struct wkt_generator_grammar :
karma::grammar<OutputIterator, Geometry const& ()>
{
- using geometry_type = Geometry;
- using coord_type = typename std::remove_pointer<typename geometry_type::value_type>::type;
-
- wkt_generator(bool single = false);
+ wkt_generator_grammar();
// rules
- karma::rule<OutputIterator, geometry_type const& ()> wkt;
- karma::rule<OutputIterator, geometry_type const& ()> point;
- karma::rule<OutputIterator, geometry_type const& ()> linestring;
- karma::rule<OutputIterator, geometry_type const& ()> polygon;
-
- karma::rule<OutputIterator, geometry_type const& ()> coords;
- karma::rule<OutputIterator, karma::locals<unsigned,double,double>, geometry_type const& ()> coords2;
- karma::rule<OutputIterator, coord_type ()> point_coord;
- karma::rule<OutputIterator, karma::locals<double,double>, coord_type (unsigned&, double&, double& )> polygon_coord;
-
- // phoenix functions
- phoenix::function<detail::get_type<geometry_type> > _type;
- phoenix::function<detail::get_first<geometry_type> > _first;
- phoenix::function<detail::get_x<typename geometry_type::value_type> > _x;
- phoenix::function<detail::get_y<typename geometry_type::value_type> > _y;
+ karma::rule<OutputIterator, Geometry const&()> geometry;
+ karma::rule<OutputIterator, karma::locals<mapnik::geometry::geometry_types>, Geometry const&() > geometry_dispatch;
+ karma::rule<OutputIterator, geometry::geometry<T> const&()> point;
+ karma::rule<OutputIterator, geometry::point<T> const&()> point_coord;
+ karma::rule<OutputIterator, geometry::geometry<T> const&()> linestring;
+ karma::rule<OutputIterator, geometry::line_string<T> const&()> linestring_coord;
+ karma::rule<OutputIterator, geometry::geometry<T> const&()> polygon;
+ karma::rule<OutputIterator, geometry::polygon<T> const&()> polygon_coord;
+ karma::rule<OutputIterator, geometry::linear_ring<T> const&()> exterior_ring_coord;
+ karma::rule<OutputIterator, std::vector<geometry::linear_ring<T> > const&()> interior_ring_coord;
+ karma::rule<OutputIterator, geometry::geometry<T> const& ()> multi_point;
+ karma::rule<OutputIterator, geometry::multi_point<T> const& ()> multi_point_coord;
+ karma::rule<OutputIterator, geometry::geometry<T> const& ()> multi_linestring;
+ karma::rule<OutputIterator, geometry::multi_line_string<T> const& ()> multi_linestring_coord;
+ karma::rule<OutputIterator, geometry::geometry<T> const& ()> multi_polygon;
+ karma::rule<OutputIterator, geometry::multi_polygon<T> const& ()> multi_polygon_coord;
+ karma::rule<OutputIterator, geometry::geometry<T> const& ()> geometry_collection;
+ karma::rule<OutputIterator, geometry::geometry_collection<T> const& ()> geometries;
+ boost::phoenix::function<detail::get_type<Geometry> > geometry_type;
+ karma::symbols<mapnik::geometry::geometry_types, char const*> empty;
//
- karma::real_generator<double, detail::wkt_coordinate_policy<double> > coordinate;
+ karma::real_generator<T, detail::wkt_coordinate_policy<T> > coordinate;
};
-
-template <typename OutputIterator, typename GeometryContainer>
-struct wkt_multi_generator :
- karma::grammar<OutputIterator, karma::locals< std::tuple<unsigned,bool> >, GeometryContainer const& ()>
+template <typename OutputIterator, typename Geometry, typename T>
+struct wkt_generator_grammar_int :
+ karma::grammar<OutputIterator, Geometry const& ()>
{
- using geometry_type = typename std::remove_pointer<typename GeometryContainer::value_type>::type;
-
- wkt_multi_generator();
+ wkt_generator_grammar_int();
// rules
- karma::rule<OutputIterator, karma::locals<std::tuple<unsigned,bool> >, GeometryContainer const& ()> wkt;
- karma::rule<OutputIterator, GeometryContainer const& ()> geometry;
- karma::rule<OutputIterator, geometry_type const& ()> single_geometry;
- karma::rule<OutputIterator, GeometryContainer const& ()> multi_geometry;
- wkt_generator<OutputIterator, geometry_type > path;
- // phoenix
- phoenix::function<detail::multi_geometry_<GeometryContainer> > is_multi;
- phoenix::function<detail::multi_geometry_type<GeometryContainer> > _multi_type;
- phoenix::function<detail::get_type<geometry_type> > _type;
+ karma::rule<OutputIterator, Geometry const&()> geometry;
+ karma::rule<OutputIterator, karma::locals<mapnik::geometry::geometry_types>, Geometry const&() > geometry_dispatch;
+ karma::rule<OutputIterator, geometry::geometry<T> const&()> point;
+ karma::rule<OutputIterator, geometry::point<T> const&()> point_coord;
+ karma::rule<OutputIterator, geometry::geometry<T> const&()> linestring;
+ karma::rule<OutputIterator, geometry::line_string<T> const&()> linestring_coord;
+ karma::rule<OutputIterator, geometry::geometry<T> const&()> polygon;
+ karma::rule<OutputIterator, geometry::polygon<T> const&()> polygon_coord;
+ karma::rule<OutputIterator, geometry::linear_ring<T> const&()> exterior_ring_coord;
+ karma::rule<OutputIterator, std::vector<geometry::linear_ring<T> > const&()> interior_ring_coord;
+ karma::rule<OutputIterator, geometry::geometry<T> const& ()> multi_point;
+ karma::rule<OutputIterator, geometry::multi_point<T> const& ()> multi_point_coord;
+ karma::rule<OutputIterator, geometry::geometry<T> const& ()> multi_linestring;
+ karma::rule<OutputIterator, geometry::multi_line_string<T> const& ()> multi_linestring_coord;
+ karma::rule<OutputIterator, geometry::geometry<T> const& ()> multi_polygon;
+ karma::rule<OutputIterator, geometry::multi_polygon<T> const& ()> multi_polygon_coord;
+ karma::rule<OutputIterator, geometry::geometry<T> const& ()> geometry_collection;
+ karma::rule<OutputIterator, geometry::geometry_collection<T> const& ()> geometries;
+ boost::phoenix::function<detail::get_type<Geometry> > geometry_type;
+ karma::symbols<mapnik::geometry::geometry_types, char const*> empty;
//
- karma::symbols<unsigned, char const*> geometry_types;
+ karma::int_generator<T> coordinate;
};
}}
diff --git a/include/mapnik/wkt/wkt_generator_grammar_impl.hpp b/include/mapnik/wkt/wkt_generator_grammar_impl.hpp
index e4051a7..64624b2 100644
--- a/include/mapnik/wkt/wkt_generator_grammar_impl.hpp
+++ b/include/mapnik/wkt/wkt_generator_grammar_impl.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2015 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,124 +22,178 @@
#include <mapnik/geometry.hpp>
#include <mapnik/wkt/wkt_generator_grammar.hpp>
-#include <mapnik/util/path_iterator.hpp>
-#include <mapnik/util/container_adapter.hpp>
+#include <mapnik/util/spirit_transform_attribute.hpp>
+// boost
+#include <boost/spirit/include/phoenix.hpp>
namespace mapnik { namespace wkt {
-template <typename T>
-std::tuple<unsigned,bool> detail::multi_geometry_type<T>::operator() (T const& geom) const
+template <typename OutputIterator, typename Geometry, typename T>
+wkt_generator_grammar<OutputIterator, Geometry,T>::wkt_generator_grammar()
+ : wkt_generator_grammar::base_type(geometry)
{
- using geometry_container = T;
- unsigned type = 0u;
- bool collection = false;
-
- typename geometry_container::const_iterator itr = geom.begin();
- typename geometry_container::const_iterator end = geom.end();
-
- for ( ; itr != end; ++itr)
- {
- if (type != 0 && itr->type() != type)
- {
- collection = true;
- break;
- }
- type = itr->type();
- }
- return std::tuple<unsigned,bool>(type, collection);
-}
-
-template <typename OutputIterator, typename Geometry>
-wkt_generator<OutputIterator, Geometry>::wkt_generator(bool single)
- : wkt_generator::base_type(wkt)
-{
- boost::spirit::karma::uint_type uint_;
boost::spirit::karma::_val_type _val;
boost::spirit::karma::_1_type _1;
- boost::spirit::karma::lit_type lit;
boost::spirit::karma::_a_type _a;
- boost::spirit::karma::_b_type _b;
- boost::spirit::karma::_c_type _c;
- boost::spirit::karma::_r1_type _r1;
+ boost::spirit::karma::lit_type lit;
+ boost::spirit::karma::uint_type uint_;
boost::spirit::karma::eps_type eps;
- boost::spirit::karma::string_type kstring;
- wkt = point | linestring | polygon
+ empty.add
+ (geometry::geometry_types::Point, "POINT EMPTY")
+ (geometry::geometry_types::LineString, "LINESTRING EMPTY")
+ (geometry::geometry_types::Polygon, "POLYGON EMPTY")
+ (geometry::geometry_types::MultiPoint, "MULTIPOINT EMPTY")
+ (geometry::geometry_types::MultiLineString, "MULTILINESTRING EMPTY")
+ (geometry::geometry_types::MultiPolygon, "MULTIPOLYGON EMPTY")
+ (geometry::geometry_types::GeometryCollection, "GEOMETRYCOLLECTION EMPTY")
;
- point = &uint_(mapnik::geometry_type::types::Point)[_1 = _type(_val)]
- << kstring[ phoenix::if_ (single) [_1 = "Point("]
- .else_[_1 = "("]]
- << point_coord [_1 = _first(_val)] << lit(')')
+ geometry = geometry_dispatch.alias()
;
- linestring = &uint_(mapnik::geometry_type::types::LineString)[_1 = _type(_val)]
- << kstring[ phoenix::if_ (single) [_1 = "LineString("]
- .else_[_1 = "("]]
- << coords
- << lit(')')
+ geometry_dispatch = eps[_a = geometry_type(_val)] <<
+ (&uint_(geometry::geometry_types::Point)[_1 = _a]
+ << point)
+ |
+ (&uint_(geometry::geometry_types::LineString)[_1 = _a]
+ << (linestring | empty[_1 = _a]))
+ |
+ (&uint_(geometry::geometry_types::Polygon)[_1 = _a]
+ << (polygon | empty[_1 = _a]))
+ |
+ (&uint_(geometry::geometry_types::MultiPoint)[_1 = _a]
+ << ( multi_point | empty[_1 = _a]))
+ |
+ (&uint_(geometry::geometry_types::MultiLineString)[_1 = _a]
+ << (multi_linestring | empty[_1 = _a]))
+ |
+ (&uint_(geometry::geometry_types::MultiPolygon)[_1 = _a]
+ << (multi_polygon | empty[_1 = _a]))
+ |
+ (&uint_(geometry::geometry_types::GeometryCollection)[_1 = _a]
+ << (geometry_collection | empty[_1 = _a]))
+ |
+ (&uint_(geometry::geometry_types::Unknown)[_1 = _a]
+ << lit("POINT EMPTY")) // special case for geometry_empty as mapnik::geometry::point<double> can't be empty
;
- polygon = &uint_(mapnik::geometry_type::types::Polygon)[_1 = _type(_val)]
- << kstring[ phoenix::if_ (single) [_1 = "Polygon("]
- .else_[_1 = "("]]
- << coords2
- << lit("))")
+ point = lit("POINT(") << point_coord << lit(")")
;
-
- point_coord = &uint_ << coordinate << lit(' ') << coordinate
+ linestring = lit("LINESTRING(") << linestring_coord << lit(")")
;
-
- polygon_coord %= ( &uint_(mapnik::SEG_MOVETO)
- << eps[_r1 += 1][_a = _x(_val)][ _b = _y(_val)]
- << kstring[ if_ (_r1 > 1u) [_1 = "),("]
- .else_[_1 = "("]]
- |
- &uint_(mapnik::SEG_LINETO)
- << lit(',') << eps[_a = _x(_val)][_b = _y(_val)]
- )
- << coordinate[_1 = _a]
- << lit(' ')
- << coordinate[_1 = _b]
+ polygon = lit("POLYGON(") << polygon_coord << lit(")")
;
-
- coords2 %= *polygon_coord(_a,_b,_c)
+ multi_point = lit("MULTIPOINT(") << multi_point_coord << lit(")")
;
-
- coords = point_coord % lit(',')
+ multi_linestring = lit("MULTILINESTRING(") << multi_linestring_coord << lit(")")
+ ;
+ multi_polygon = lit("MULTIPOLYGON(") << multi_polygon_coord << lit(")")
+ ;
+ geometry_collection = lit("GEOMETRYCOLLECTION(") << geometries << lit(")")
+ ;
+ point_coord = coordinate << lit(' ') << coordinate
+ ;
+ linestring_coord = point_coord % lit(',')
+ ;
+ polygon_coord = lit('(') << exterior_ring_coord << lit(')') << interior_ring_coord
+ ;
+ exterior_ring_coord = linestring_coord.alias()
+ ;
+ interior_ring_coord = *(lit(",(") << exterior_ring_coord << lit(')'))
+ ;
+ multi_point_coord = linestring_coord.alias()
+ ;
+ multi_linestring_coord = (lit('(') << linestring_coord << lit(')')) % lit(',')
+ ;
+ multi_polygon_coord = (lit('(') << polygon_coord << lit(')')) % lit(',')
;
+ geometries = geometry % lit(',')
+ ;
+
}
-template <typename OutputIterator, typename GeometryContainer>
-wkt_multi_generator<OutputIterator, GeometryContainer>::wkt_multi_generator()
- : wkt_multi_generator::base_type(wkt)
+template <typename OutputIterator, typename Geometry, typename T>
+wkt_generator_grammar_int<OutputIterator, Geometry,T>::wkt_generator_grammar_int()
+ : wkt_generator_grammar_int::base_type(geometry)
{
- boost::spirit::karma::lit_type lit;
- boost::spirit::karma::eps_type eps;
boost::spirit::karma::_val_type _val;
boost::spirit::karma::_1_type _1;
boost::spirit::karma::_a_type _a;
+ boost::spirit::karma::lit_type lit;
+ boost::spirit::karma::uint_type uint_;
+ boost::spirit::karma::eps_type eps;
- geometry_types.add
- (mapnik::geometry_type::types::Point,"Point")
- (mapnik::geometry_type::types::LineString,"LineString")
- (mapnik::geometry_type::types::Polygon,"Polygon")
+ empty.add
+ (geometry::geometry_types::Point, "POINT EMPTY")
+ (geometry::geometry_types::LineString, "LINESTRING EMPTY")
+ (geometry::geometry_types::Polygon, "POLYGON EMPTY")
+ (geometry::geometry_types::MultiPoint, "MULTIPOINT EMPTY")
+ (geometry::geometry_types::MultiLineString, "MULTILINESTRING EMPTY")
+ (geometry::geometry_types::MultiPolygon, "MULTIPOLYGON EMPTY")
+ (geometry::geometry_types::GeometryCollection, "GEOMETRYCOLLECTION EMPTY")
;
- wkt = eps(phoenix::at_c<1>(_a))[_a = _multi_type(_val)]
- << lit("GeometryCollection(") << geometry << lit(")")
- | eps(is_multi(_val)) << lit("Multi") << geometry_types[_1 = phoenix::at_c<0>(_a)]
- << "(" << multi_geometry << ")"
- | geometry
+ geometry = geometry_dispatch.alias()
;
- geometry = -(single_geometry % lit(','))
+ geometry_dispatch = eps[_a = geometry_type(_val)] <<
+ (&uint_(geometry::geometry_types::Point)[_1 = _a]
+ << point)
+ |
+ (&uint_(geometry::geometry_types::LineString)[_1 = _a]
+ << (linestring | empty[_1 = _a]))
+ |
+ (&uint_(geometry::geometry_types::Polygon)[_1 = _a]
+ << (polygon | empty[_1 = _a]))
+ |
+ (&uint_(geometry::geometry_types::MultiPoint)[_1 = _a]
+ << ( multi_point | empty[_1 = _a]))
+ |
+ (&uint_(geometry::geometry_types::MultiLineString)[_1 = _a]
+ << (multi_linestring | empty[_1 = _a]))
+ |
+ (&uint_(geometry::geometry_types::MultiPolygon)[_1 = _a]
+ << (multi_polygon | empty[_1 = _a]))
+ |
+ (&uint_(geometry::geometry_types::GeometryCollection)[_1 = _a]
+ << (geometry_collection | empty[_1 = _a]))
+ |
+ (&uint_(geometry::geometry_types::Unknown)[_1 = _a]
+ << lit("POINT EMPTY")) // special case for geometry_empty as mapnik::geometry::point<double> can't be empty
;
- single_geometry = geometry_types[_1 = _type(_val)] << path
+ point = lit("POINT(") << point_coord << lit(")")
;
-
- multi_geometry = -(path % lit(','))
+ linestring = lit("LINESTRING(") << linestring_coord << lit(")")
+ ;
+ polygon = lit("POLYGON(") << polygon_coord << lit(")")
+ ;
+ multi_point = lit("MULTIPOINT(") << multi_point_coord << lit(")")
+ ;
+ multi_linestring = lit("MULTILINESTRING(") << multi_linestring_coord << lit(")")
+ ;
+ multi_polygon = lit("MULTIPOLYGON(") << multi_polygon_coord << lit(")")
+ ;
+ geometry_collection = lit("GEOMETRYCOLLECTION(") << geometries << lit(")")
+ ;
+ point_coord = coordinate << lit(' ') << coordinate
+ ;
+ linestring_coord = point_coord % lit(',')
+ ;
+ polygon_coord = lit('(') << exterior_ring_coord << lit(')') << interior_ring_coord
+ ;
+ exterior_ring_coord = linestring_coord.alias()
+ ;
+ interior_ring_coord = *(lit(",(") << exterior_ring_coord << lit(')'))
+ ;
+ multi_point_coord = linestring_coord.alias()
+ ;
+ multi_linestring_coord = (lit('(') << linestring_coord << lit(')')) % lit(',')
+ ;
+ multi_polygon_coord = (lit('(') << polygon_coord << lit(')')) % lit(',')
+ ;
+ geometries = geometry % lit(',')
;
}
diff --git a/include/mapnik/wkt/wkt_grammar.hpp b/include/mapnik/wkt/wkt_grammar.hpp
index ff004fa..b056663 100644
--- a/include/mapnik/wkt/wkt_grammar.hpp
+++ b/include/mapnik/wkt/wkt_grammar.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2015 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,6 +23,9 @@
#ifndef MAPNIK_WKT_GRAMMAR_HPP
#define MAPNIK_WKT_GRAMMAR_HPP
+// mapnik
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_fusion_adapted.hpp>
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
#pragma GCC diagnostic ignored "-Wunused-local-typedef"
@@ -31,93 +34,84 @@
#include <boost/spirit/include/phoenix_function.hpp>
#pragma GCC diagnostic pop
-// mapnik
-#include <mapnik/geometry.hpp>
-#include <mapnik/geometry_container.hpp>
-#include <mapnik/vertex.hpp>
namespace mapnik { namespace wkt {
using namespace boost::spirit;
-struct push_vertex
-{
- template <typename T>
- struct result
- {
- using type = void;
- };
+namespace detail {
- template <typename T0,typename T1, typename T2, typename T3>
- void operator() (T0 c, T1 path, T2 x, T3 y) const
+struct assign
+{
+ using result_type = void;
+ template <typename T0, typename T1>
+ void operator() (T0 & geom, T1 && obj) const
{
- BOOST_ASSERT( path!=0 );
- path->push_vertex(x,y,c);
+ geom = std::move(obj);
}
};
-struct close_path
+struct move_part
{
- template <typename T>
- struct result
- {
- using type = void;
- };
-
- template <typename T>
- void operator() (T path) const
+ using result_type = void;
+ template <typename Geometry, typename Part>
+ void operator() (Geometry & geom, Part && part) const
{
- BOOST_ASSERT( path!=0 );
- path->close_path();
+ geom.push_back(std::move(part));
}
};
-struct cleanup
+struct set_exterior
{
- template <typename T0>
- struct result
+ using result_type = void;
+ template <typename Polygon, typename Ring>
+ void operator() (Polygon & poly, Ring && ring) const
{
- using type = void;
- };
+ poly.set_exterior_ring(std::move(ring));
+ }
+};
- template <typename T0>
- void operator() (T0 & path) const
+struct add_hole
+{
+ using result_type = void;
+ template <typename Polygon, typename Ring>
+ void operator() (Polygon & poly, Ring && ring) const
{
- if (path) delete path,path=0;
+ poly.add_hole(std::move(ring));
}
};
+}
+
template <typename Iterator>
-struct wkt_grammar : qi::grammar<Iterator, mapnik::geometry_container() , ascii::space_type>
+struct wkt_grammar : qi::grammar<Iterator, void(mapnik::geometry::geometry<double> &) , ascii::space_type>
{
wkt_grammar();
- qi::rule<Iterator,mapnik::geometry_container(),ascii::space_type> geometry_tagged_text;
- qi::rule<Iterator,qi::locals<geometry_type*>,mapnik::geometry_container(),ascii::space_type> point_tagged_text;
- qi::rule<Iterator,qi::locals<geometry_type*>,mapnik::geometry_container(),ascii::space_type> linestring_tagged_text;
- qi::rule<Iterator,qi::locals<geometry_type*>,mapnik::geometry_container(),ascii::space_type> polygon_tagged_text;
- qi::rule<Iterator,mapnik::geometry_container(),ascii::space_type> multipoint_tagged_text;
- qi::rule<Iterator,mapnik::geometry_container(),ascii::space_type> multilinestring_tagged_text;
- qi::rule<Iterator,mapnik::geometry_container(),ascii::space_type> multipolygon_tagged_text;
- qi::rule<Iterator,void(geometry_type*),ascii::space_type> point_text;
- qi::rule<Iterator,void(geometry_type*),ascii::space_type> linestring_text;
- qi::rule<Iterator,void(geometry_type*),ascii::space_type> polygon_text;
- qi::rule<Iterator, qi::locals<geometry_type*>, mapnik::geometry_container(),ascii::space_type> multipoint_text;
- qi::rule<Iterator, qi::locals<geometry_type*>, mapnik::geometry_container(),ascii::space_type> multilinestring_text;
- qi::rule<Iterator, qi::locals<geometry_type*>, mapnik::geometry_container(),ascii::space_type> multipolygon_text;
- qi::rule<Iterator,void(CommandType,geometry_type*),ascii::space_type> point;
- qi::rule<Iterator,qi::locals<CommandType>,void(geometry_type*),ascii::space_type> points;
+ qi::rule<Iterator, void(mapnik::geometry::geometry<double> &), ascii::space_type> geometry_tagged_text;
+ qi::rule<Iterator, void(mapnik::geometry::geometry<double> &), ascii::space_type> point_tagged_text;
+ qi::rule<Iterator, void(mapnik::geometry::geometry<double> &), ascii::space_type> linestring_tagged_text;
+ qi::rule<Iterator, void(mapnik::geometry::geometry<double> &), ascii::space_type> polygon_tagged_text;
+ qi::rule<Iterator, void(mapnik::geometry::geometry<double> &), ascii::space_type> multipoint_tagged_text;
+ qi::rule<Iterator, void(mapnik::geometry::geometry<double> &), ascii::space_type> multilinestring_tagged_text;
+ qi::rule<Iterator, void(mapnik::geometry::geometry<double> &), ascii::space_type> multipolygon_tagged_text;
+ qi::rule<Iterator, void(mapnik::geometry::geometry<double> &), ascii::space_type> geometrycollection_tagged_text;
+ qi::rule<Iterator, mapnik::geometry::point<double>(), ascii::space_type> point_text;
+ qi::rule<Iterator, mapnik::geometry::line_string<double>(), ascii::space_type> linestring_text;
+ qi::rule<Iterator, mapnik::geometry::linear_ring<double>(), ascii::space_type> linearring_text;
+ qi::rule<Iterator, mapnik::geometry::polygon<double>(), ascii::space_type> polygon_text;
+ qi::rule<Iterator, mapnik::geometry::multi_point<double>(), ascii::space_type> multipoint_text;
+ qi::rule<Iterator, mapnik::geometry::multi_line_string<double>(), ascii::space_type> multilinestring_text;
+ qi::rule<Iterator, mapnik::geometry::multi_polygon<double>(), ascii::space_type> multipolygon_text;
+ qi::rule<Iterator, qi::locals<mapnik::geometry::geometry<double> >,
+ mapnik::geometry::geometry_collection<double>(), ascii::space_type> geometrycollection_text;
+ qi::rule<Iterator, mapnik::geometry::point<double>(), ascii::space_type> point;
+ qi::rule<Iterator, mapnik::geometry::line_string<double>(), ascii::space_type> points;
+ qi::rule<Iterator, mapnik::geometry::linear_ring<double>(), ascii::space_type> ring_points;
qi::rule<Iterator,ascii::space_type> empty_set;
- boost::phoenix::function<push_vertex> push_vertex_;
- boost::phoenix::function<close_path> close_path_;
- boost::phoenix::function<cleanup> cleanup_;
-};
-
-template <typename Iterator>
-struct wkt_collection_grammar : qi::grammar<Iterator, mapnik::geometry_container(), ascii::space_type>
-{
- wkt_collection_grammar();
- qi::rule<Iterator,mapnik::geometry_container(),ascii::space_type> start;
- wkt_grammar<Iterator> wkt;
+ boost::phoenix::function<detail::assign> assign;
+ boost::phoenix::function<detail::move_part> move_part;
+ boost::phoenix::function<detail::set_exterior> set_exterior;
+ boost::phoenix::function<detail::add_hole> add_hole;
};
}}
diff --git a/include/mapnik/wkt/wkt_grammar_impl.hpp b/include/mapnik/wkt/wkt_grammar_impl.hpp
index 8cf6f7f..85a9274 100644
--- a/include/mapnik/wkt/wkt_grammar_impl.hpp
+++ b/include/mapnik/wkt/wkt_grammar_impl.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2015 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,11 +22,12 @@
#include <mapnik/config.hpp>
#include <mapnik/wkt/wkt_grammar.hpp>
+#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_fusion.hpp>
#include <boost/spirit/include/phoenix_object.hpp>
#include <boost/spirit/include/phoenix_stl.hpp>
+#include <boost/phoenix/object/construct.hpp>
namespace mapnik { namespace wkt {
@@ -36,115 +37,119 @@ template <typename Iterator>
wkt_grammar<Iterator>::wkt_grammar()
: wkt_grammar::base_type(geometry_tagged_text)
{
- qi::_r1_type _r1;
- qi::_r2_type _r2;
- qi::_pass_type _pass;
qi::eps_type eps;
+ qi::_r1_type _r1;
qi::_val_type _val;
qi::lit_type lit;
qi::no_case_type no_case;
qi::double_type double_;
qi::_1_type _1;
- qi::_2_type _2;
qi::_a_type _a;
- using boost::phoenix::push_back;
- using boost::phoenix::new_;
-
- geometry_tagged_text = point_tagged_text
- | linestring_tagged_text
- | polygon_tagged_text
- | multipoint_tagged_text
- | multilinestring_tagged_text
- | multipolygon_tagged_text
+ using boost::phoenix::construct;
+ using boost::phoenix::at_c;
+ geometry_tagged_text = point_tagged_text(_r1)
+ | linestring_tagged_text(_r1)
+ | polygon_tagged_text(_r1)
+ | multipoint_tagged_text(_r1)
+ | multilinestring_tagged_text(_r1)
+ | multipolygon_tagged_text(_r1)
+ | geometrycollection_tagged_text(_r1)
;
// <point tagged text> ::= point <point text>
- point_tagged_text = no_case[lit("POINT")] [ _a = new_<geometry_type>(geometry_type::types::Point) ]
- >> ( point_text(_a) [push_back(_val,_a)]
- | eps[cleanup_(_a)][_pass = false])
+ point_tagged_text = no_case[lit("POINT")]
+ >> (point_text[assign(_r1,_1)] | empty_set[assign(_r1,construct<geometry::geometry_empty>())])
;
-
// <point text> ::= <empty set> | <left paren> <point> <right paren>
- point_text = (lit("(") >> point(SEG_MOVETO,_r1) >> lit(')'))
- | empty_set
+ point_text = (lit("(") >> point >> lit(')'))
+ //| empty_set - we're catching 'POINT EMPTY' case in point_tagged_text rule ^^ by creating geometry_empty
+ // because our geometry::point<double> can't be empty
;
- // <linestring tagged text> ::= linestring <linestring text>
- linestring_tagged_text = no_case[lit("LINESTRING")] [ _a = new_<geometry_type>(geometry_type::types::LineString) ]
- >> (linestring_text(_a)[push_back(_val,_a)]
- | eps[cleanup_(_a)][_pass = false])
+ //<linestring tagged text> ::= linestring <linestring text>
+ linestring_tagged_text = no_case[lit("LINESTRING")]
+ >> linestring_text[assign(_r1,_1)]
;
// <linestring text> ::= <empty set> | <left paren> <point> {<comma> <point>}* <right paren>
- linestring_text = points(_r1) | empty_set
+ linestring_text = points | empty_set
;
// <polygon tagged text> ::= polygon <polygon text>
- polygon_tagged_text = no_case[lit("POLYGON")] [ _a = new_<geometry_type>(geometry_type::types::Polygon) ]
- >> ( polygon_text(_a)[push_back(_val,_a)]
- | eps[cleanup_(_a)][_pass = false])
+ polygon_tagged_text = no_case[lit("POLYGON")]
+ >> polygon_text[assign(_r1,_1)]
;
// <polygon text> ::= <empty set> | <left paren> <linestring text> {<comma> <linestring text>}* <right paren>
- polygon_text = (lit('(') >> linestring_text(_r1)[close_path_(_r1)] % lit(',') >> lit(')')) | empty_set;
-
+ polygon_text =
+ (lit('(') >> linearring_text[set_exterior(_val,_1)] >> *(lit(',') >> linearring_text[add_hole(_val,_1)]) >> lit(')'))
+ |
+ empty_set
+ ;
+ linearring_text = ring_points | empty_set
+ ;
//<multipoint tagged text> ::= multipoint <multipoint text>
multipoint_tagged_text = no_case[lit("MULTIPOINT")]
- >> multipoint_text
+ >> multipoint_text[assign(_r1,_1)]
;
// <multipoint text> ::= <empty set> | <left paren> <point text> {<comma> <point text>}* <right paren>
multipoint_text = (lit('(')
- >> ((eps[_a = new_<geometry_type>(geometry_type::types::Point)]
- >> (point_text(_a) | empty_set) [push_back(_val,_a)]
- | eps[cleanup_(_a)][_pass = false]) % lit(','))
- >> lit(')')) | empty_set
+ >> point_text % lit(',')
+ >> lit(')'))
+ |
+ (lit('(')
+ >> point % lit(',')
+ >> lit(')'))
+ |
+ empty_set
;
// <multilinestring tagged text> ::= multilinestring <multilinestring text>
multilinestring_tagged_text = no_case[lit("MULTILINESTRING")]
- >> multilinestring_text ;
+ >> multilinestring_text[assign(_r1,_1)] ;
// <multilinestring text> ::= <empty set> | <left paren> <linestring text> {<comma> <linestring text>}* <right paren>
multilinestring_text = (lit('(')
- >> ((eps[_a = new_<geometry_type>(geometry_type::types::LineString)]
- >> ( points(_a)[push_back(_val,_a)]
- | eps[cleanup_(_a)][_pass = false]))
- % lit(','))
+ >> points[move_part(_val,_1)] % lit(',')
>> lit(')')) | empty_set;
// <multipolygon tagged text> ::= multipolygon <multipolygon text>
multipolygon_tagged_text = no_case[lit("MULTIPOLYGON")]
- >> multipolygon_text ;
-
- // <multipolygon text> ::= <empty set> | <left paren> <polygon text> {<comma> <polygon text>}* <right paren>
+ >> multipolygon_text[assign(_r1,_1)] ;
+ //<multipolygon text> ::= <empty set> | <left paren> <polygon text> {<comma> <polygon text>}* <right paren>
multipolygon_text = (lit('(')
- >> ((eps[_a = new_<geometry_type>(geometry_type::types::Polygon)]
- >> ( polygon_text(_a)[push_back(_val,_a)]
- | eps[cleanup_(_a)][_pass = false]))
- % lit(','))
- >> lit(')')) | empty_set;
+ >> polygon_text[move_part(_val,_1)] % lit(',')
+ >> lit(')'))
+ |
+ empty_set;
+
+ // geometry collection tagged text
+ geometrycollection_tagged_text = no_case[lit("GEOMETRYCOLLECTION")]
+ >> geometrycollection_text[assign(_r1,_1)]
+ ;
+ // geometry collection text
+ geometrycollection_text = (lit('(')
+ >> ( eps[_a = construct<geometry::geometry<double> >()]
+ >> geometry_tagged_text(_a)[move_part(_val,_a)] % lit(','))
+ >> lit(')'))
+ |
+ empty_set;
// points
- points = lit('(')[_a = SEG_MOVETO] >> point (_a,_r1) % lit(',') [_a = SEG_LINETO] >> lit(')');
+ points = lit('(') >> point % lit(',') >> lit(')')
+ ;
+ // ring points
+ ring_points = lit('(') >> point % lit(',') >> lit(')')
+ ;
// point
- point = (double_ >> double_) [push_vertex_(_r1,_r2,_1,_2)];
+ point = double_ >> double_
+ ;
// <empty set>
empty_set = no_case[lit("EMPTY")];
-
-}
-
-template <typename Iterator>
-wkt_collection_grammar<Iterator>::wkt_collection_grammar()
- : wkt_collection_grammar::base_type(start)
-{
- qi::lit_type lit;
- qi::no_case_type no_case;
- start = wkt | no_case[lit("GEOMETRYCOLLECTION")]
- >> (lit("(") >> wkt % lit(",") >> lit(")"));
}
}}
diff --git a/include/mapnik/xml_attribute_cast.hpp b/include/mapnik/xml_attribute_cast.hpp
index 3718853..1a3cb98 100644
--- a/include/mapnik/xml_attribute_cast.hpp
+++ b/include/mapnik/xml_attribute_cast.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,6 +25,7 @@
//mapnik
#include <mapnik/debug.hpp>
+#include <mapnik/value_types.hpp>
#include <mapnik/xml_tree.hpp>
#include <mapnik/enumeration.hpp>
#include <mapnik/boolean.hpp>
@@ -87,14 +88,14 @@ struct do_xml_attribute_cast<int>
#ifdef BIGINT
// specialization for long long
template <>
-struct do_xml_attribute_cast<long long>
+struct do_xml_attribute_cast<mapnik::value_integer>
{
- static inline boost::optional<long long> xml_attribute_cast_impl(xml_tree const& /*tree*/, std::string const& source)
+ static inline boost::optional<mapnik::value_integer> xml_attribute_cast_impl(xml_tree const& /*tree*/, std::string const& source)
{
int result;
if (mapnik::util::string2int(source, result))
- return boost::optional<long long>(result);
- return boost::optional<long long>();
+ return boost::optional<mapnik::value_integer>(result);
+ return boost::optional<mapnik::value_integer>();
}
};
diff --git a/include/mapnik/xml_loader.hpp b/include/mapnik/xml_loader.hpp
index b102b61..2bc8f4a 100644
--- a/include/mapnik/xml_loader.hpp
+++ b/include/mapnik/xml_loader.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/xml_node.hpp b/include/mapnik/xml_node.hpp
index 59498e0..28be9ff 100644
--- a/include/mapnik/xml_node.hpp
+++ b/include/mapnik/xml_node.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/include/mapnik/xml_tree.hpp b/include/mapnik/xml_tree.hpp
index 68d980b..9cb29a8 100644
--- a/include/mapnik/xml_tree.hpp
+++ b/include/mapnik/xml_tree.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/localize.sh b/localize.sh
index 4f227e7..ee62e59 100755
--- a/localize.sh
+++ b/localize.sh
@@ -1,13 +1,21 @@
#!/bin/bash
-UNAME=$(uname -s)
+# TODO - use rpath to avoid needing this to run tests locally
export CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
-if [ ${UNAME} = 'Darwin' ]; then
+if [ $(uname -s) = 'Darwin' ]; then
export DYLD_LIBRARY_PATH="${CURRENT_DIR}/src/":${DYLD_LIBRARY_PATH}
else
export LD_LIBRARY_PATH="${CURRENT_DIR}/src/":${LD_LIBRARY_PATH}
fi
-export PYTHONPATH="${CURRENT_DIR}/bindings/python/":$PYTHONPATH
-export MAPNIK_FONT_DIRECTORY="${CURRENT_DIR}/fonts/dejavu-fonts-ttf-2.34/ttf/"
-export MAPNIK_INPUT_PLUGINS_DIRECTORY="${CURRENT_DIR}/plugins/input/"
-export PATH="${CURRENT_DIR}/utils/mapnik-config":${PATH}
-export PATH="${CURRENT_DIR}/utils/nik2img":${PATH}
\ No newline at end of file
+
+export PATH=$(pwd)/utils/nik2img/:${PATH}
+
+# mapnik-settings.env is an optional file to store
+# environment variables that should be used before
+# running tests like PROJ_LIB, GDAL_DATA, and ICU_DATA
+# These do not normally need to be set except when
+# building against binary versions of dependencies like
+# done via bootstrap.sh
+if [[ -f mapnik-settings.env ]]; then
+ echo "Inheriting from mapnik-settings.env"
+ source mapnik-settings.env
+fi
diff --git a/mason_latest.sh b/mason_latest.sh
new file mode 100755
index 0000000..cc4a970
--- /dev/null
+++ b/mason_latest.sh
@@ -0,0 +1,48 @@
+#!/usr/bin/env bash
+
+MASON_NAME=mapnik
+MASON_VERSION=latest
+MASON_LIB_FILE=lib/libmapnik-wkt.a
+
+. ${MASON_DIR:-~/.mason}/mason.sh
+
+function mason_load_source {
+ export MASON_BUILD_PATH=$(pwd)
+}
+
+function mason_compile {
+ HERE=$(pwd)
+ make install
+ if [[ `uname` == 'Darwin' ]]; then
+ install_name_tool -id @loader_path/libmapnik.dylib ${MASON_PREFIX}"/lib/libmapnik.dylib";
+ PLUGINDIR=${MASON_PREFIX}"/lib/mapnik/input/*.input";
+ for f in $PLUGINDIR; do
+ echo $f;
+ echo `basename $f`;
+ install_name_tool -id plugins/input/`basename $f` $f;
+ install_name_tool -change ${MASON_PREFIX}"/lib/libmapnik.dylib" @loader_path/../../libmapnik.dylib $f;
+ done;
+ fi;
+ python -c "data=open('$MASON_PREFIX/bin/mapnik-config','r').read();open('$MASON_PREFIX/bin/mapnik-config','w').write(data.replace('$HERE','.'))"
+ mkdir -p ${MASON_PREFIX}/share/gdal
+ mkdir -p ${MASON_PREFIX}/share/proj
+ mkdir -p ${MASON_PREFIX}/share/icu
+ cp -r $GDAL_DATA/ ${MASON_PREFIX}/share/gdal/
+ cp -r $PROJ_LIB/ ${MASON_PREFIX}/share/proj/
+ cp -r $ICU_DATA/*dat ${MASON_PREFIX}/share/icu/
+ find ${MASON_PREFIX} -name "*.pyc" -exec rm {} \;
+}
+
+function mason_cflags {
+ ""
+}
+
+function mason_ldflags {
+ ""
+}
+
+function mason_clean {
+ echo "Done"
+}
+
+mason_run "$@"
diff --git a/plugins/input/csv/csv_datasource.cpp b/plugins/input/csv/csv_datasource.cpp
index 76b5770..934e579 100644
--- a/plugins/input/csv/csv_datasource.cpp
+++ b/plugins/input/csv/csv_datasource.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -34,13 +34,14 @@
#include <mapnik/feature_layer_desc.hpp>
#include <mapnik/feature_factory.hpp>
#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_correct.hpp>
#include <mapnik/memory_featureset.hpp>
#include <mapnik/wkt/wkt_factory.hpp>
#include <mapnik/json/geometry_parser.hpp>
-#include <mapnik/util/geometry_to_ds_type.hpp>
#include <mapnik/util/conversions.hpp>
#include <mapnik/boolean.hpp>
#include <mapnik/util/trim.hpp>
+#include <mapnik/util/geometry_to_ds_type.hpp>
#include <mapnik/value_types.hpp>
// stl
@@ -540,9 +541,13 @@ void csv_datasource::parse_csv(T & stream,
{
break;
}
-
- if (mapnik::from_wkt(value, feature->paths()))
+ mapnik::geometry::geometry<double> geom;
+ if (mapnik::from_wkt(value, geom))
{
+ // correct orientations etc
+ mapnik::geometry::correct(geom);
+ // set geometry
+ feature->set_geometry(std::move(geom));
parsed_wkt = true;
}
else
@@ -576,8 +581,10 @@ void csv_datasource::parse_csv(T & stream,
{
break;
}
- if (mapnik::json::from_geojson(value, feature->paths()))
+ mapnik::geometry::geometry<double> geom;
+ if (mapnik::json::from_geojson(value, geom))
{
+ feature->set_geometry(std::move(geom));
parsed_json = true;
}
else
@@ -809,9 +816,8 @@ void csv_datasource::parse_csv(T & stream,
{
if (parsed_x && parsed_y)
{
- mapnik::geometry_type * pt = new mapnik::geometry_type(mapnik::geometry_type::types::Point);
- pt->move_to(x,y);
- feature->add_geometry(pt);
+ mapnik::geometry::point<double> pt(x,y);
+ feature->set_geometry(std::move(pt));
features_.push_back(feature);
null_geom = false;
if (!extent_initialized_)
@@ -926,20 +932,25 @@ mapnik::box2d<double> csv_datasource::envelope() const
return extent_;
}
-boost::optional<mapnik::datasource::geometry_t> csv_datasource::get_geometry_type() const
+mapnik::layer_descriptor csv_datasource::get_descriptor() const
{
- boost::optional<mapnik::datasource::geometry_t> result;
+ return desc_;
+}
+
+boost::optional<mapnik::datasource_geometry_t> csv_datasource::get_geometry_type() const
+{
+ boost::optional<mapnik::datasource_geometry_t> result;
int multi_type = 0;
unsigned num_features = features_.size();
for (unsigned i = 0; i < num_features && i < 5; ++i)
{
- mapnik::util::to_ds_type(features_[i]->paths(),result);
+ result = mapnik::util::to_ds_type(features_[i]->get_geometry());
if (result)
{
int type = static_cast<int>(*result);
if (multi_type > 0 && multi_type != type)
{
- result.reset(mapnik::datasource::Collection);
+ result.reset(mapnik::datasource_geometry_t::Collection);
return result;
}
multi_type = type;
@@ -948,11 +959,6 @@ boost::optional<mapnik::datasource::geometry_t> csv_datasource::get_geometry_typ
return result;
}
-mapnik::layer_descriptor csv_datasource::get_descriptor() const
-{
- return desc_;
-}
-
mapnik::featureset_ptr csv_datasource::features(mapnik::query const& q) const
{
const std::set<std::string>& attribute_names = q.property_names();
diff --git a/plugins/input/csv/csv_datasource.hpp b/plugins/input/csv/csv_datasource.hpp
index b5b695b..e26c437 100644
--- a/plugins/input/csv/csv_datasource.hpp
+++ b/plugins/input/csv/csv_datasource.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -51,9 +51,8 @@ public:
mapnik::featureset_ptr features(mapnik::query const& q) const;
mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt, double tol = 0) const;
mapnik::box2d<double> envelope() const;
- boost::optional<mapnik::datasource::geometry_t> get_geometry_type() const;
mapnik::layer_descriptor get_descriptor() const;
-
+ boost::optional<mapnik::datasource_geometry_t> get_geometry_type() const;
template <typename T>
void parse_csv(T & stream,
std::string const& escape,
diff --git a/plugins/input/csv/csv_utils.hpp b/plugins/input/csv/csv_utils.hpp
index a073462..3ec8c9f 100644
--- a/plugins/input/csv/csv_utils.hpp
+++ b/plugins/input/csv/csv_utils.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -51,7 +51,7 @@ namespace csv_utils
wrapping_char = "\"";
j_idx = j_idx_double;
post_idx = csv_line.find("}\"");
-
+
}
else if (j_idx_single != std::string::npos)
{
@@ -89,7 +89,7 @@ namespace csv_utils
csv_line = pre_json + json_chunk + post_json;
}
}
- }
+ }
}
}
diff --git a/plugins/input/gdal/gdal_datasource.cpp b/plugins/input/gdal/gdal_datasource.cpp
index ed71401..187d6aa 100644
--- a/plugins/input/gdal/gdal_datasource.cpp
+++ b/plugins/input/gdal/gdal_datasource.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -29,7 +29,6 @@
#include <mapnik/geom_util.hpp>
#include <mapnik/timer.hpp>
#include <mapnik/value_types.hpp>
-#include <mapnik/boolean.hpp>
#include <gdal_version.h>
@@ -46,37 +45,9 @@ using mapnik::layer_descriptor;
using mapnik::datasource_exception;
-/*
- * Opens a GDALDataset and returns a pointer to it.
- * Caller is responsible for calling GDALClose on it
- */
-inline GDALDataset* gdal_datasource::open_dataset() const
-{
- MAPNIK_LOG_DEBUG(gdal) << "gdal_datasource: Opening " << dataset_name_;
-
- GDALDataset *dataset;
-#if GDAL_VERSION_NUM >= 1600
- if (shared_dataset_)
- {
- dataset = reinterpret_cast<GDALDataset*>(GDALOpenShared((dataset_name_).c_str(), GA_ReadOnly));
- }
- else
-#endif
- {
- dataset = reinterpret_cast<GDALDataset*>(GDALOpen((dataset_name_).c_str(), GA_ReadOnly));
- }
-
- if (! dataset)
- {
- throw datasource_exception(CPLGetLastErrorMsg());
- }
-
- return dataset;
-}
-
-
gdal_datasource::gdal_datasource(parameters const& params)
: datasource(params),
+ dataset_(nullptr),
desc_(gdal_datasource::name(), "utf-8"),
nodata_value_(params.get<double>("nodata")),
nodata_tolerance_(*params.get<double>("nodata_tolerance",1e-12))
@@ -105,12 +76,28 @@ gdal_datasource::gdal_datasource(parameters const& params)
shared_dataset_ = *params.get<mapnik::boolean_type>("shared", false);
band_ = *params.get<mapnik::value_integer>("band", -1);
- GDALDataset *dataset = open_dataset();
+#if GDAL_VERSION_NUM >= 1600
+ if (shared_dataset_)
+ {
+ dataset_ = reinterpret_cast<GDALDataset*>(GDALOpenShared((dataset_name_).c_str(), GA_ReadOnly));
+ }
+ else
+#endif
+ {
+ dataset_ = reinterpret_cast<GDALDataset*>(GDALOpen((dataset_name_).c_str(), GA_ReadOnly));
+ }
+
+ if (! dataset_)
+ {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
+
+ MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: opened Dataset=" << dataset_;
- nbands_ = dataset->GetRasterCount();
- width_ = dataset->GetRasterXSize();
- height_ = dataset->GetRasterYSize();
- desc_.add_descriptor(mapnik::attribute_descriptor("nodata", mapnik::Integer));
+ nbands_ = dataset_->GetRasterCount();
+ width_ = dataset_->GetRasterXSize();
+ height_ = dataset_->GetRasterYSize();
+ desc_.add_descriptor(mapnik::attribute_descriptor("nodata", mapnik::Double));
double tr[6];
bool bbox_override = false;
@@ -141,7 +128,7 @@ gdal_datasource::gdal_datasource(parameters const& params)
}
else
{
- if (dataset->GetGeoTransform(tr) != CPLE_None)
+ if (dataset_->GetGeoTransform(tr) != CPLE_None)
{
MAPNIK_LOG_DEBUG(gdal) << "gdal_datasource GetGeotransform failure gives="
<< tr[0] << "," << tr[1] << ","
@@ -188,8 +175,6 @@ gdal_datasource::gdal_datasource(parameters const& params)
extent_.init(x0, y0, x1, y1);
}
- GDALClose(dataset);
-
MAPNIK_LOG_DEBUG(gdal) << "gdal_datasource: Raster Size=" << width_ << "," << height_;
MAPNIK_LOG_DEBUG(gdal) << "gdal_datasource: Raster Extent=" << extent_;
@@ -197,6 +182,8 @@ gdal_datasource::gdal_datasource(parameters const& params)
gdal_datasource::~gdal_datasource()
{
+ MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Closing Dataset=" << dataset_;
+ GDALClose(dataset_);
}
datasource::datasource_t gdal_datasource::type() const
@@ -214,9 +201,9 @@ box2d<double> gdal_datasource::envelope() const
return extent_;
}
-boost::optional<mapnik::datasource::geometry_t> gdal_datasource::get_geometry_type() const
+boost::optional<mapnik::datasource_geometry_t> gdal_datasource::get_geometry_type() const
{
- return boost::optional<mapnik::datasource::geometry_t>();
+ return boost::optional<mapnik::datasource_geometry_t>();
}
layer_descriptor gdal_datasource::get_descriptor() const
@@ -233,7 +220,7 @@ featureset_ptr gdal_datasource::features(query const& q) const
gdal_query gq = q;
// TODO - move to std::make_shared, but must reduce # of args to <= 9
- return featureset_ptr(new gdal_featureset(*open_dataset(),
+ return featureset_ptr(new gdal_featureset(*dataset_,
band_,
gq,
extent_,
@@ -255,7 +242,7 @@ featureset_ptr gdal_datasource::features_at_point(coord2d const& pt, double tol)
gdal_query gq = pt;
// TODO - move to std::make_shared, but must reduce # of args to <= 9
- return featureset_ptr(new gdal_featureset(*open_dataset(),
+ return featureset_ptr(new gdal_featureset(*dataset_,
band_,
gq,
extent_,
diff --git a/plugins/input/gdal/gdal_datasource.hpp b/plugins/input/gdal/gdal_datasource.hpp
index bb43b95..f2403c3 100644
--- a/plugins/input/gdal/gdal_datasource.hpp
+++ b/plugins/input/gdal/gdal_datasource.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -52,10 +52,11 @@ public:
mapnik::featureset_ptr features(mapnik::query const& q) const;
mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt, double tol = 0) const;
mapnik::box2d<double> envelope() const;
- boost::optional<mapnik::datasource::geometry_t> get_geometry_type() const;
+ boost::optional<mapnik::datasource_geometry_t> get_geometry_type() const;
mapnik::layer_descriptor get_descriptor() const;
private:
GDALDataset* open_dataset() const;
+ GDALDataset* dataset_;
mapnik::box2d<double> extent_;
std::string dataset_name_;
int band_;
diff --git a/plugins/input/gdal/gdal_featureset.cpp b/plugins/input/gdal/gdal_featureset.cpp
index f250cac..514b979 100644
--- a/plugins/input/gdal/gdal_featureset.cpp
+++ b/plugins/input/gdal/gdal_featureset.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,7 @@
#include <mapnik/make_unique.hpp>
#include <mapnik/global.hpp>
#include <mapnik/debug.hpp>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
#include <mapnik/raster.hpp>
#include <mapnik/view_transform.hpp>
#include <mapnik/feature.hpp>
@@ -44,7 +44,6 @@ using mapnik::coord2d;
using mapnik::box2d;
using mapnik::feature_ptr;
using mapnik::view_transform;
-using mapnik::geometry_type;
using mapnik::datasource_exception;
using mapnik::feature_factory;
@@ -80,7 +79,6 @@ gdal_featureset::~gdal_featureset()
{
MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Closing Dataset=" << &dataset_;
- GDALClose(&dataset_);
}
feature_ptr gdal_featureset::next()
@@ -104,6 +102,7 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q)
GDALRasterBand * blue = 0;
GDALRasterBand * alpha = 0;
GDALRasterBand * grey = 0;
+ CPLErr raster_io_error = CE_None;
/*
#ifdef MAPNIK_LOG
@@ -198,31 +197,104 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q)
if (im_width > 0 && im_height > 0)
{
- mapnik::raster_ptr raster = std::make_shared<mapnik::raster>(intersect, im_width, im_height, filter_factor);
- feature->set_raster(raster);
- mapnik::image_data_32 & image = raster->data_;
- image.set(0xffffffff);
-
MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Image Size=(" << im_width << "," << im_height << ")";
MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Reading band=" << band_;
-
if (band_ > 0) // we are querying a single band
{
+ GDALRasterBand * band = dataset_.GetRasterBand(band_);
if (band_ > nbands_)
{
std::ostringstream s;
s << "GDAL Plugin: " << band_ << " is an invalid band, dataset only has " << nbands_ << "bands";
throw datasource_exception(s.str());
}
- float* imageData = (float*)image.getBytes();
- GDALRasterBand * band = dataset_.GetRasterBand(band_);
- raster_nodata = band->GetNoDataValue(&raster_has_nodata);
- band->RasterIO(GF_Read, x_off, y_off, width, height,
- imageData, image.width(), image.height(),
- GDT_Float32, 0, 0);
+ GDALDataType band_type = band->GetRasterDataType();
+ switch (band_type)
+ {
+ case GDT_Byte:
+ {
+ mapnik::image_gray8 image(im_width, im_height);
+ image.set(std::numeric_limits<std::uint8_t>::max());
+ raster_nodata = band->GetNoDataValue(&raster_has_nodata);
+ raster_io_error = band->RasterIO(GF_Read, x_off, y_off, width, height,
+ image.data(), image.width(), image.height(),
+ GDT_Byte, 0, 0);
+ if (raster_io_error == CE_Failure)
+ {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
+ mapnik::raster_ptr raster = std::make_shared<mapnik::raster>(intersect, image, filter_factor);
+ // set nodata value to be used in raster colorizer
+ if (nodata_value_) raster->set_nodata(*nodata_value_);
+ else raster->set_nodata(raster_nodata);
+ feature->set_raster(raster);
+ break;
+ }
+ case GDT_Float64:
+ case GDT_Float32:
+ {
+ mapnik::image_gray32f image(im_width, im_height);
+ image.set(std::numeric_limits<float>::max());
+ raster_nodata = band->GetNoDataValue(&raster_has_nodata);
+ raster_io_error = band->RasterIO(GF_Read, x_off, y_off, width, height,
+ image.data(), image.width(), image.height(),
+ GDT_Float32, 0, 0);
+ if (raster_io_error == CE_Failure)
+ {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
+ mapnik::raster_ptr raster = std::make_shared<mapnik::raster>(intersect, image, filter_factor);
+ // set nodata value to be used in raster colorizer
+ if (nodata_value_) raster->set_nodata(*nodata_value_);
+ else raster->set_nodata(raster_nodata);
+ feature->set_raster(raster);
+ break;
+ }
+ case GDT_UInt16:
+ {
+ mapnik::image_gray16 image(im_width, im_height);
+ image.set(std::numeric_limits<std::uint16_t>::max());
+ raster_nodata = band->GetNoDataValue(&raster_has_nodata);
+ raster_io_error = band->RasterIO(GF_Read, x_off, y_off, width, height,
+ image.data(), image.width(), image.height(),
+ GDT_UInt16, 0, 0);
+ if (raster_io_error == CE_Failure)
+ {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
+ mapnik::raster_ptr raster = std::make_shared<mapnik::raster>(intersect, image, filter_factor);
+ // set nodata value to be used in raster colorizer
+ if (nodata_value_) raster->set_nodata(*nodata_value_);
+ else raster->set_nodata(raster_nodata);
+ feature->set_raster(raster);
+ break;
+ }
+ default:
+ case GDT_Int16:
+ {
+ mapnik::image_gray16s image(im_width, im_height);
+ image.set(std::numeric_limits<std::int16_t>::max());
+ raster_nodata = band->GetNoDataValue(&raster_has_nodata);
+ raster_io_error = band->RasterIO(GF_Read, x_off, y_off, width, height,
+ image.data(), image.width(), image.height(),
+ GDT_Int16, 0, 0);
+ if (raster_io_error == CE_Failure)
+ {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
+ mapnik::raster_ptr raster = std::make_shared<mapnik::raster>(intersect, image, filter_factor);
+ // set nodata value to be used in raster colorizer
+ if (nodata_value_) raster->set_nodata(*nodata_value_);
+ else raster->set_nodata(raster_nodata);
+ feature->set_raster(raster);
+ break;
+ }
+ }
}
else // working with all bands
{
+ mapnik::image_rgba8 image(im_width, im_height);
+ image.set(std::numeric_limits<std::uint32_t>::max());
for (int i = 0; i < nbands_; ++i)
{
GDALRasterBand * band = dataset_.GetRasterBand(i + 1);
@@ -302,16 +374,22 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q)
raster_nodata = red->GetNoDataValue(&raster_has_nodata);
GDALColorTable *color_table = red->GetColorTable();
bool has_nodata = nodata_value_ || raster_has_nodata;
- if (has_nodata && !color_table)
+
+ // we can deduce the alpha channel from nodata in the Byte case
+ // by reusing the reading of R,G,B bands directly
+ if (has_nodata && !color_table && red->GetRasterDataType() == GDT_Byte)
{
double apply_nodata = nodata_value_ ? *nodata_value_ : raster_nodata;
// read the data in and create an alpha channel from the nodata values
// TODO - we assume here the nodata value for the red band applies to all bands
// more details about this at http://trac.osgeo.org/gdal/ticket/2734
- float* imageData = (float*)image.getBytes();
- red->RasterIO(GF_Read, x_off, y_off, width, height,
- imageData, image.width(), image.height(),
- GDT_Float32, 0, 0);
+ float* imageData = (float*)image.bytes();
+ raster_io_error = red->RasterIO(GF_Read, x_off, y_off, width, height,
+ imageData, image.width(), image.height(),
+ GDT_Float32, 0, 0);
+ if (raster_io_error == CE_Failure) {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
int len = image.width() * image.height();
for (int i = 0; i < len; ++i)
{
@@ -325,12 +403,63 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q)
}
}
}
- red->RasterIO(GF_Read, x_off, y_off, width, height, image.getBytes() + 0,
- image.width(), image.height(), GDT_Byte, 4, 4 * image.width());
- green->RasterIO(GF_Read, x_off, y_off, width, height, image.getBytes() + 1,
- image.width(), image.height(), GDT_Byte, 4, 4 * image.width());
- blue->RasterIO(GF_Read, x_off, y_off, width, height, image.getBytes() + 2,
- image.width(), image.height(), GDT_Byte, 4, 4 * image.width());
+
+ /* Use dataset RasterIO in priority in 99.9% of the cases */
+ if( red->GetBand() == 1 && green->GetBand() == 2 && blue->GetBand() == 3 )
+ {
+ int nBandsToRead = 3;
+ if( alpha != NULL && alpha->GetBand() == 4 && !raster_has_nodata )
+ {
+ nBandsToRead = 4;
+ alpha = NULL; // to avoid reading it again afterwards
+ }
+ raster_io_error = dataset_.RasterIO(GF_Read, x_off, y_off, width, height,
+ image.bytes(),
+ image.width(), image.height(), GDT_Byte,
+ nBandsToRead, NULL,
+ 4, 4 * image.width(), 1);
+ if (raster_io_error == CE_Failure) {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
+ }
+ else
+ {
+ raster_io_error = red->RasterIO(GF_Read, x_off, y_off, width, height, image.bytes() + 0,
+ image.width(), image.height(), GDT_Byte, 4, 4 * image.width());
+ if (raster_io_error == CE_Failure) {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
+ raster_io_error = green->RasterIO(GF_Read, x_off, y_off, width, height, image.bytes() + 1,
+ image.width(), image.height(), GDT_Byte, 4, 4 * image.width());
+ if (raster_io_error == CE_Failure) {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
+ raster_io_error = blue->RasterIO(GF_Read, x_off, y_off, width, height, image.bytes() + 2,
+ image.width(), image.height(), GDT_Byte, 4, 4 * image.width());
+ if (raster_io_error == CE_Failure) {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
+ }
+
+ // In the case we skipped initializing the alpha channel
+ if (has_nodata && !color_table && red->GetRasterDataType() == GDT_Byte)
+ {
+ double apply_nodata = nodata_value_ ? *nodata_value_ : raster_nodata;
+ if( apply_nodata >= 0 && apply_nodata <= 255 )
+ {
+ int len = image.width() * image.height();
+ GByte* pabyBytes = (GByte*) image.bytes();
+ for (int i = 0; i < len; ++i)
+ {
+ // TODO - we assume here the nodata value for the red band applies to all bands
+ // more details about this at http://trac.osgeo.org/gdal/ticket/2734
+ if (std::fabs(apply_nodata - pabyBytes[4*i]) < nodata_tolerance_)
+ pabyBytes[4*i + 3] = 0;
+ else
+ pabyBytes[4*i + 3] = 255;
+ }
+ }
+ }
}
else if (grey)
{
@@ -343,10 +472,14 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q)
double apply_nodata = nodata_value_ ? *nodata_value_ : raster_nodata;
MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: applying nodata value for layer=" << apply_nodata;
// first read the data in and create an alpha channel from the nodata values
- float* imageData = (float*)image.getBytes();
- grey->RasterIO(GF_Read, x_off, y_off, width, height,
- imageData, image.width(), image.height(),
- GDT_Float32, 0, 0);
+ float* imageData = (float*)image.bytes();
+ raster_io_error = grey->RasterIO(GF_Read, x_off, y_off, width, height,
+ imageData, image.width(), image.height(),
+ GDT_Float32, 0, 0);
+ if (raster_io_error == CE_Failure)
+ {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
int len = image.width() * image.height();
for (int i = 0; i < len; ++i)
{
@@ -360,19 +493,35 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q)
}
}
}
- grey->RasterIO(GF_Read, x_off, y_off, width, height, image.getBytes() + 0,
- image.width(), image.height(), GDT_Byte, 4, 4 * image.width());
- grey->RasterIO(GF_Read,x_off, y_off, width, height, image.getBytes() + 1,
- image.width(), image.height(), GDT_Byte, 4, 4 * image.width());
- grey->RasterIO(GF_Read,x_off, y_off, width, height, image.getBytes() + 2,
- image.width(), image.height(), GDT_Byte, 4, 4 * image.width());
+
+ raster_io_error = grey->RasterIO(GF_Read, x_off, y_off, width, height, image.bytes() + 0,
+ image.width(), image.height(), GDT_Byte, 4, 4 * image.width());
+ if (raster_io_error == CE_Failure)
+ {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
+
+ raster_io_error = grey->RasterIO(GF_Read,x_off, y_off, width, height, image.bytes() + 1,
+ image.width(), image.height(), GDT_Byte, 4, 4 * image.width());
+ if (raster_io_error == CE_Failure)
+ {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
+
+ raster_io_error = grey->RasterIO(GF_Read,x_off, y_off, width, height, image.bytes() + 2,
+ image.width(), image.height(), GDT_Byte, 4, 4 * image.width());
+
+ if (raster_io_error == CE_Failure)
+ {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
if (color_table)
{
MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: Loading color table...";
for (unsigned y = 0; y < image.height(); ++y)
{
- unsigned int* row = image.getRow(y);
+ unsigned int* row = image.get_row(y);
for (unsigned x = 0; x < image.width(); ++x)
{
unsigned value = row[x] & 0xff;
@@ -396,23 +545,22 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q)
MAPNIK_LOG_DEBUG(gdal) << "gdal_featureset: processing alpha band...";
if (!raster_has_nodata)
{
- alpha->RasterIO(GF_Read, x_off, y_off, width, height, image.getBytes() + 3,
- image.width(), image.height(), GDT_Byte, 4, 4 * image.width());
+ raster_io_error = alpha->RasterIO(GF_Read, x_off, y_off, width, height, image.bytes() + 3,
+ image.width(), image.height(), GDT_Byte, 4, 4 * image.width());
+ if (raster_io_error == CE_Failure) {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
}
else
{
MAPNIK_LOG_WARN(gdal) << "warning: nodata value (" << raster_nodata << ") used to set transparency instead of alpha band";
}
}
- }
- // set nodata value to be used in raster colorizer
- if (nodata_value_)
- {
- raster->set_nodata(*nodata_value_);
- }
- else
- {
- raster->set_nodata(raster_nodata);
+ mapnik::raster_ptr raster = std::make_shared<mapnik::raster>(intersect, image, filter_factor);
+ // set nodata value to be used in raster colorizer
+ if (nodata_value_) raster->set_nodata(*nodata_value_);
+ else raster->set_nodata(raster_nodata);
+ feature->set_raster(raster);
}
// report actual/original source nodata in feature attributes
if (raster_has_nodata)
@@ -428,6 +576,8 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q)
feature_ptr gdal_featureset::get_feature_at_point(mapnik::coord2d const& pt)
{
+ CPLErr raster_io_error = CE_None;
+
if (band_ > 0)
{
unsigned raster_xsize = dataset_.GetRasterXSize();
@@ -455,14 +605,15 @@ feature_ptr gdal_featureset::get_feature_at_point(mapnik::coord2d const& pt)
int raster_has_nodata;
double nodata = band->GetNoDataValue(&raster_has_nodata);
double value;
- band->RasterIO(GF_Read, x, y, 1, 1, &value, 1, 1, GDT_Float64, 0, 0);
+ raster_io_error = band->RasterIO(GF_Read, x, y, 1, 1, &value, 1, 1, GDT_Float64, 0, 0);
+ if (raster_io_error == CE_Failure) {
+ throw datasource_exception(CPLGetLastErrorMsg());
+ }
if (! raster_has_nodata || value != nodata)
{
// construct feature
feature_ptr feature = feature_factory::create(ctx_,1);
- std::unique_ptr<geometry_type> point = std::make_unique<geometry_type>(mapnik::geometry_type::types::Point);
- point->move_to(pt.x, pt.y);
- feature->add_geometry(point.release());
+ feature->set_geometry(mapnik::geometry::point<double>(pt.x,pt.y));
feature->put_new("value",value);
if (raster_has_nodata)
{
diff --git a/plugins/input/gdal/gdal_featureset.hpp b/plugins/input/gdal/gdal_featureset.hpp
index a10a3f0..04f24ed 100644
--- a/plugins/input/gdal/gdal_featureset.hpp
+++ b/plugins/input/gdal/gdal_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -38,7 +38,7 @@ using gdal_query = mapnik::util::variant<mapnik::query, mapnik::coord2d>;
class gdal_featureset : public mapnik::Featureset
{
- struct query_dispatch : public mapnik::util::static_visitor<mapnik::feature_ptr>
+ struct query_dispatch
{
query_dispatch( gdal_featureset & featureset)
: featureset_(featureset) {}
diff --git a/plugins/input/geojson/build.py b/plugins/input/geojson/build.py
index 1302c6a..faa3e9f 100644
--- a/plugins/input/geojson/build.py
+++ b/plugins/input/geojson/build.py
@@ -21,45 +21,57 @@
Import ('env')
-Import ('plugin_base')
+can_build = False
-PLUGIN_NAME = 'geojson'
+if env.get('BOOST_LIB_VERSION_FROM_HEADER'):
+ boost_version_from_header = int(env['BOOST_LIB_VERSION_FROM_HEADER'].split('_')[1])
+ if boost_version_from_header >= 56:
+ can_build = True
-plugin_env = plugin_base.Clone()
+if not can_build:
+ print 'WARNING: skipping building the optional geojson datasource plugin which requires boost >= 1.56'
+else:
-plugin_sources = Split(
- """
- %(PLUGIN_NAME)s_datasource.cpp
- %(PLUGIN_NAME)s_featureset.cpp
- """ % locals()
-)
+ Import ('plugin_base')
-# Link Library to Dependencies
-libraries = []
-libraries.append(env['ICU_LIB_NAME'])
-libraries.append('boost_system%s' % env['BOOST_APPEND'])
-libraries.append('mapnik-json')
+ PLUGIN_NAME = 'geojson'
-if env['PLUGIN_LINKING'] == 'shared':
- libraries.append(env['MAPNIK_NAME'])
+ plugin_env = plugin_base.Clone()
- TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME,
- SHLIBPREFIX='',
- SHLIBSUFFIX='.input',
- source=plugin_sources,
- LIBS=libraries)
+ plugin_sources = Split(
+ """
+ %(PLUGIN_NAME)s_datasource.cpp
+ %(PLUGIN_NAME)s_featureset.cpp
+ large_%(PLUGIN_NAME)s_featureset.cpp
+ """ % locals()
+ )
- # if the plugin links to libmapnik ensure it is built first
- Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
- Depends(TARGET, env.subst('../../../src/json/libmapnik-json${LIBSUFFIX}'))
+ # Link Library to Dependencies
+ libraries = []
+ libraries.append(env['ICU_LIB_NAME'])
+ libraries.append('boost_system%s' % env['BOOST_APPEND'])
+ libraries.append('mapnik-json')
- if 'uninstall' not in COMMAND_LINE_TARGETS:
- env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], TARGET)
- env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
+ if env['PLUGIN_LINKING'] == 'shared':
+ libraries.append(env['MAPNIK_NAME'])
-plugin_obj = {
- 'LIBS': libraries,
- 'SOURCES': plugin_sources,
-}
+ TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME,
+ SHLIBPREFIX='',
+ SHLIBSUFFIX='.input',
+ source=plugin_sources,
+ LIBS=libraries)
-Return('plugin_obj')
+ # if the plugin links to libmapnik ensure it is built first
+ Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
+ Depends(TARGET, env.subst('../../../src/json/libmapnik-json${LIBSUFFIX}'))
+
+ if 'uninstall' not in COMMAND_LINE_TARGETS:
+ env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], TARGET)
+ env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
+
+ plugin_obj = {
+ 'LIBS': libraries,
+ 'SOURCES': plugin_sources,
+ }
+
+ Return('plugin_obj')
diff --git a/plugins/input/geojson/geojson_datasource.cpp b/plugins/input/geojson/geojson_datasource.cpp
index 21c7160..1d3dfd8 100644
--- a/plugins/input/geojson/geojson_datasource.cpp
+++ b/plugins/input/geojson/geojson_datasource.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,38 +22,49 @@
#include "geojson_datasource.hpp"
#include "geojson_featureset.hpp"
-
+#include "large_geojson_featureset.hpp"
#include <fstream>
#include <algorithm>
// boost
-
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wunused-local-typedef"
#include <boost/algorithm/string.hpp>
+#include <boost/spirit/include/qi.hpp>
+#pragma GCC diagnostic pop
// mapnik
+#include <mapnik/boolean.hpp>
#include <mapnik/unicode.hpp>
#include <mapnik/utils.hpp>
#include <mapnik/feature.hpp>
+#include <mapnik/feature_factory.hpp>
#include <mapnik/feature_kv_iterator.hpp>
#include <mapnik/value_types.hpp>
#include <mapnik/box2d.hpp>
#include <mapnik/debug.hpp>
#include <mapnik/proj_transform.hpp>
#include <mapnik/projection.hpp>
-#include <mapnik/util/geometry_to_ds_type.hpp>
#include <mapnik/util/variant.hpp>
#include <mapnik/util/file_io.hpp>
+#include <mapnik/util/geometry_to_ds_type.hpp>
#include <mapnik/make_unique.hpp>
+#include <mapnik/geometry_adapters.hpp>
#include <mapnik/json/feature_collection_grammar.hpp>
+#include <mapnik/json/extract_bounding_box_grammar_impl.hpp>
-#include <boost/spirit/include/qi.hpp>
+#if defined(SHAPE_MEMORY_MAPPED_FILE)
+#include <boost/interprocess/mapped_region.hpp>
+#include <mapnik/mapped_memory_cache.hpp>
+#endif
using mapnik::datasource;
using mapnik::parameters;
DATASOURCE_PLUGIN(geojson_datasource)
-struct attr_value_converter : public mapnik::util::static_visitor<mapnik::eAttributeType>
+struct attr_value_converter
{
mapnik::eAttributeType operator() (mapnik::value_integer) const
{
@@ -95,7 +106,7 @@ geojson_datasource::geojson_datasource(parameters const& params)
: datasource(params),
type_(datasource::Vector),
desc_(geojson_datasource::name(),
- *params.get<std::string>("encoding","utf-8")),
+ *params.get<std::string>("encoding","utf-8")),
filename_(),
inline_string_(),
extent_(),
@@ -120,47 +131,129 @@ geojson_datasource::geojson_datasource(parameters const& params)
}
if (!inline_string_.empty())
{
- parse_geojson(inline_string_);
+ char const* start = inline_string_.c_str();
+ char const* end = start + inline_string_.size();
+ parse_geojson(start, end);
}
else
{
+ cache_features_ = *params.get<mapnik::boolean_type>("cache_features", true);
+#if !defined(SHAPE_MEMORY_MAPPED_FILE)
mapnik::util::file file(filename_);
if (!file.open())
{
- throw mapnik::datasource_exception("TopoJSON Plugin: could not open: '" + filename_ + "'");
+ throw mapnik::datasource_exception("GeoJSON Plugin: could not open: '" + filename_ + "'");
}
+
std::string file_buffer;
file_buffer.resize(file.size());
std::fread(&file_buffer[0], file.size(), 1, file.get());
- parse_geojson(file_buffer);
+ char const* start = file_buffer.c_str();
+ char const* end = start + file_buffer.length();
+ if (cache_features_)
+ {
+ parse_geojson(start, end);
+ }
+ else
+ {
+ initialise_index(start, end);
+ }
+#else
+ boost::optional<mapnik::mapped_region_ptr> mapped_region =
+ mapnik::mapped_memory_cache::instance().find(filename_, false);
+ if (!mapped_region)
+ {
+ throw std::runtime_error("could not get file mapping for "+ filename_);
+ }
+
+ char const* start = reinterpret_cast<char const*>((*mapped_region)->get_address());
+ char const* end = start + (*mapped_region)->get_size();
+ if (cache_features_)
+ {
+ parse_geojson(start, end);
+ }
+ else
+ {
+ initialise_index(start, end);
+ }
+#endif
}
}
namespace {
-using base_iterator_type = std::string::const_iterator;
-const mapnik::transcoder tr("utf8");
-const mapnik::json::feature_collection_grammar<base_iterator_type,mapnik::feature_impl> fc_grammar(tr);
+using base_iterator_type = char const*;
+const mapnik::transcoder geojson_datasource_static_tr("utf8");
+const mapnik::json::feature_collection_grammar<base_iterator_type,mapnik::feature_impl> geojson_datasource_static_fc_grammar(geojson_datasource_static_tr);
+const mapnik::json::feature_grammar<base_iterator_type, mapnik::feature_impl> geojson_datasource_static_feature_grammar(geojson_datasource_static_tr);
+const mapnik::json::extract_bounding_box_grammar<base_iterator_type> geojson_datasource_static_bbox_grammar;
+}
+
+template <typename Iterator>
+void geojson_datasource::initialise_index(Iterator start, Iterator end)
+{
+ mapnik::json::boxes boxes;
+ boost::spirit::ascii::space_type space;
+ Iterator itr = start;
+ if (!boost::spirit::qi::phrase_parse(itr, end, (geojson_datasource_static_bbox_grammar)(boost::phoenix::ref(boxes)) , space))
+ {
+ throw mapnik::datasource_exception("GeoJSON Plugin: could not parse: '" + filename_ + "'");
+ }
+ // bulk insert initialise r-tree
+ tree_ = std::make_unique<spatial_index_type>(boxes);
+ // calculate total extent
+ for (auto const& item : boxes)
+ {
+ auto const& box = std::get<0>(item);
+ auto const& geometry_index = std::get<1>(item);
+ if (!extent_.valid())
+ {
+ extent_ = box;
+ // parse first feature to extract attributes schema.
+ // NOTE: this doesn't yield correct answer for geoJSON in general, just an indication
+ Iterator itr = start + geometry_index.first;
+ Iterator end = itr + geometry_index.second;
+ mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>();
+ mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx,1));
+ boost::spirit::ascii::space_type space;
+ if (!boost::spirit::qi::phrase_parse(itr, end, (geojson_datasource_static_feature_grammar)(boost::phoenix::ref(*feature)), space))
+ {
+ throw std::runtime_error("Failed to parse geojson feature");
+ }
+ for ( auto const& kv : *feature)
+ {
+ desc_.add_descriptor(mapnik::attribute_descriptor(std::get<0>(kv),
+ mapnik::util::apply_visitor(attr_value_converter(),
+ std::get<1>(kv))));
+ }
+ }
+ else
+ {
+ extent_.expand_to_include(box);
+ }
+ }
}
-template <typename T>
-void geojson_datasource::parse_geojson(T const& buffer)
+template <typename Iterator>
+void geojson_datasource::parse_geojson(Iterator start, Iterator end)
{
- boost::spirit::standard_wide::space_type space;
+ boost::spirit::ascii::space_type space;
mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>();
- bool result = boost::spirit::qi::phrase_parse(buffer.begin(), buffer.end(), (fc_grammar)(boost::phoenix::ref(ctx)), space, features_);
+ std::size_t start_id = 1;
+
+ mapnik::json::default_feature_callback callback(features_);
+
+ bool result = boost::spirit::qi::phrase_parse(start, end, (geojson_datasource_static_fc_grammar)
+ (boost::phoenix::ref(ctx),boost::phoenix::ref(start_id), boost::phoenix::ref(callback)),
+ space);
if (!result)
{
if (!inline_string_.empty()) throw mapnik::datasource_exception("geojson_datasource: Failed parse GeoJSON file from in-memory string");
else throw mapnik::datasource_exception("geojson_datasource: Failed parse GeoJSON file '" + filename_ + "'");
}
-#if BOOST_VERSION >= 105600
- using values_container = std::vector< std::pair<box_type, std::size_t> >;
+ using values_container = std::vector< std::pair<box_type, std::pair<std::size_t, std::size_t>>>;
values_container values;
values.reserve(features_.size());
-#else
- tree_ = std::make_unique<spatial_index_type>(16, 4);
-#endif
std::size_t geometry_index = 0;
for (mapnik::feature_ptr const& f : features_)
@@ -183,18 +276,12 @@ void geojson_datasource::parse_geojson(T const& buffer)
extent_.expand_to_include(box);
}
}
-#if BOOST_VERSION >= 105600
- values.emplace_back(box_type(point_type(box.minx(),box.miny()),point_type(box.maxx(),box.maxy())), geometry_index);
-#else
- tree_->insert(box_type(point_type(box.minx(),box.miny()),point_type(box.maxx(),box.maxy())),geometry_index);
-#endif
+ values.emplace_back(box, std::make_pair(geometry_index,0));
++geometry_index;
}
-#if BOOST_VERSION >= 105600
// packing algorithm
tree_ = std::make_unique<spatial_index_type>(values);
-#endif
}
@@ -205,28 +292,6 @@ const char * geojson_datasource::name()
return "geojson";
}
-boost::optional<mapnik::datasource::geometry_t> geojson_datasource::get_geometry_type() const
-{
- boost::optional<mapnik::datasource::geometry_t> result;
- int multi_type = 0;
- unsigned num_features = features_.size();
- for (unsigned i = 0; i < num_features && i < 5; ++i)
- {
- mapnik::util::to_ds_type(features_[i]->paths(),result);
- if (result)
- {
- int type = static_cast<int>(*result);
- if (multi_type > 0 && multi_type != type)
- {
- result.reset(mapnik::datasource::Collection);
- return result;
- }
- multi_type = type;
- }
- }
- return result;
-}
-
mapnik::datasource::datasource_t geojson_datasource::type() const
{
return type_;
@@ -242,26 +307,101 @@ mapnik::layer_descriptor geojson_datasource::get_descriptor() const
return desc_;
}
+boost::optional<mapnik::datasource_geometry_t> geojson_datasource::get_geometry_type() const
+{
+ boost::optional<mapnik::datasource_geometry_t> result;
+ int multi_type = 0;
+ if (cache_features_)
+ {
+ unsigned num_features = features_.size();
+ for (unsigned i = 0; i < num_features && i < 5; ++i)
+ {
+ result = mapnik::util::to_ds_type(features_[i]->get_geometry());
+ if (result)
+ {
+ int type = static_cast<int>(*result);
+ if (multi_type > 0 && multi_type != type)
+ {
+ result.reset(mapnik::datasource_geometry_t::Collection);
+ return result;
+ }
+ multi_type = type;
+ }
+ }
+ }
+ else
+ {
+ mapnik::util::file file(filename_);
+ if (!file.open())
+ {
+ throw mapnik::datasource_exception("GeoJSON Plugin: could not open: '" + filename_ + "'");
+ }
+ auto itr = tree_->qbegin(boost::geometry::index::intersects(extent_));
+ auto end = tree_->qend();
+ mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>();
+ for (std::size_t count = 0; itr !=end && count < 5; ++itr,++count)
+ {
+ geojson_datasource::item_type const& item = *itr;
+ std::size_t file_offset = item.second.first;
+ std::size_t size = item.second.second;
+
+ std::fseek(file.get(), file_offset, SEEK_SET);
+ std::vector<char> json;
+ json.resize(size);
+ std::fread(json.data(), size, 1, file.get());
+
+ using chr_iterator_type = char const*;
+ chr_iterator_type start = json.data();
+ chr_iterator_type end = start + json.size();
+
+ using namespace boost::spirit;
+ ascii::space_type space;
+ mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx,1));
+ if (!qi::phrase_parse(start, end, (geojson_datasource_static_feature_grammar)(boost::phoenix::ref(*feature)), space))
+ {
+ throw std::runtime_error("Failed to parse geojson feature");
+ }
+ result = mapnik::util::to_ds_type(feature->get_geometry());
+ if (result)
+ {
+ int type = static_cast<int>(*result);
+ if (multi_type > 0 && multi_type != type)
+ {
+ result.reset(mapnik::datasource_geometry_t::Collection);
+ return result;
+ }
+ multi_type = type;
+ }
+ }
+ }
+ return result;
+}
+
mapnik::featureset_ptr geojson_datasource::features(mapnik::query const& q) const
{
// if the query box intersects our world extent then query for features
- mapnik::box2d<double> const& b = q.get_bbox();
- if (extent_.intersects(b))
+ mapnik::box2d<double> const& box = q.get_bbox();
+ if (extent_.intersects(box))
{
- box_type box(point_type(b.minx(),b.miny()),point_type(b.maxx(),b.maxy()));
-#if BOOST_VERSION >= 105600
geojson_featureset::array_type index_array;
if (tree_)
{
tree_->query(boost::geometry::index::intersects(box),std::back_inserter(index_array));
- return std::make_shared<geojson_featureset>(features_, std::move(index_array));
- }
-#else
- if (tree_)
- {
- return std::make_shared<geojson_featureset>(features_, tree_->find(box));
+
+ if (cache_features_)
+ {
+ return std::make_shared<geojson_featureset>(features_, std::move(index_array));
+ }
+ else
+ {
+ std::sort(index_array.begin(),index_array.end(),
+ [] (item_type const& item0, item_type const& item1)
+ {
+ return item0.second.first < item1.second.first;
+ });
+ return std::make_shared<large_geojson_featureset>(filename_, std::move(index_array));
+ }
}
-#endif
}
// otherwise return an empty featureset pointer
return mapnik::featureset_ptr();
diff --git a/plugins/input/geojson/geojson_datasource.hpp b/plugins/input/geojson/geojson_datasource.hpp
index c5194ec..42610db 100644
--- a/plugins/input/geojson/geojson_datasource.hpp
+++ b/plugins/input/geojson/geojson_datasource.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -42,13 +42,8 @@
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/geometries/geometries.hpp>
-#include <boost/geometry.hpp>
#include <boost/version.hpp>
-#if BOOST_VERSION >= 105600
#include <boost/geometry/index/rtree.hpp>
-#else
-#include <boost/geometry/extensions/index/rtree/rtree.hpp>
-#endif
#pragma GCC diagnostic pop
// stl
@@ -59,7 +54,6 @@
#include <deque>
-#if BOOST_VERSION >= 105600
template <std::size_t Max, std::size_t Min>
struct geojson_linear : boost::geometry::index::linear<Max,Min> {};
@@ -73,26 +67,22 @@ struct options_type<geojson_linear<Max,Min> >
choose_by_content_diff_tag,
split_default_tag,
linear_tag,
+#if BOOST_VERSION >= 105700
+ node_variant_static_tag>;
+#else
node_s_mem_static_tag>;
+
+#endif
};
}}}}}
-#endif //BOOST_VERSION >= 105600
-
class geojson_datasource : public mapnik::datasource
{
public:
- using point_type = boost::geometry::model::point<double, 2, boost::geometry::cs::cartesian>;
- using box_type = boost::geometry::model::box<point_type>;
-
-#if BOOST_VERSION >= 105600
- using item_type = std::pair<box_type,std::size_t>;
+ using box_type = mapnik::box2d<double>;
+ using item_type = std::pair<box_type, std::pair<std::size_t, std::size_t> >;
using spatial_index_type = boost::geometry::index::rtree<item_type,geojson_linear<16,4> >;
-#else
- using item_type = std::size_t;
- using spatial_index_type = boost::geometry::index::rtree<box_type,std::size_t>;
-#endif
// constructor
geojson_datasource(mapnik::parameters const& params);
@@ -103,9 +93,11 @@ public:
mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt, double tol = 0) const;
mapnik::box2d<double> envelope() const;
mapnik::layer_descriptor get_descriptor() const;
- boost::optional<mapnik::datasource::geometry_t> get_geometry_type() const;
- template <typename T>
- void parse_geojson(T const& buffer);
+ boost::optional<mapnik::datasource_geometry_t> get_geometry_type() const;
+ template <typename Iterator>
+ void parse_geojson(Iterator start, Iterator end);
+ template <typename Iterator>
+ void initialise_index(Iterator start, Iterator end);
private:
mapnik::datasource::datasource_t type_;
mapnik::layer_descriptor desc_;
@@ -114,6 +106,7 @@ private:
mapnik::box2d<double> extent_;
std::vector<mapnik::feature_ptr> features_;
std::unique_ptr<spatial_index_type> tree_;
+ bool cache_features_ = true;
};
diff --git a/plugins/input/geojson/geojson_featureset.cpp b/plugins/input/geojson/geojson_featureset.cpp
index 722108d..20fb415 100644
--- a/plugins/input/geojson/geojson_featureset.cpp
+++ b/plugins/input/geojson/geojson_featureset.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -42,12 +42,8 @@ mapnik::feature_ptr geojson_featureset::next()
{
if (index_itr_ != index_end_)
{
-#if BOOST_VERSION >= 105600
geojson_datasource::item_type const& item = *index_itr_++;
- std::size_t index = item.second;
-#else
- std::size_t index = *index_itr_++;
-#endif
+ std::size_t index = item.second.first;
if ( index < features_.size())
{
return features_.at(index);
diff --git a/plugins/input/geojson/geojson_featureset.hpp b/plugins/input/geojson/geojson_featureset.hpp
index 1f6898b..1af2da7 100644
--- a/plugins/input/geojson/geojson_featureset.hpp
+++ b/plugins/input/geojson/geojson_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/geojson/large_geojson_featureset.cpp b/plugins/input/geojson/large_geojson_featureset.cpp
new file mode 100644
index 0000000..795d619
--- /dev/null
+++ b/plugins/input/geojson/large_geojson_featureset.cpp
@@ -0,0 +1,82 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/feature.hpp>
+#include <mapnik/feature_factory.hpp>
+#include <mapnik/json/geometry_grammar.hpp>
+#include <mapnik/json/feature_grammar.hpp>
+#include <mapnik/utils.hpp>
+// stl
+#include <string>
+#include <vector>
+#include <deque>
+
+#include "large_geojson_featureset.hpp"
+
+large_geojson_featureset::large_geojson_featureset(std::string const& filename,
+ array_type && index_array)
+:
+#ifdef _WINDOWS
+ file_(_wfopen(mapnik::utf8_to_utf16(filename).c_str(), L"rb"), std::fclose),
+#else
+ file_(std::fopen(filename.c_str(),"rb"), std::fclose),
+#endif
+ index_array_(std::move(index_array)),
+ index_itr_(index_array_.begin()),
+ index_end_(index_array_.end()),
+ ctx_(std::make_shared<mapnik::context_type>())
+{
+ if (!file_) throw std::runtime_error("Can't open " + filename);
+}
+
+large_geojson_featureset::~large_geojson_featureset() {}
+
+mapnik::feature_ptr large_geojson_featureset::next()
+{
+ if (index_itr_ != index_end_)
+ {
+ geojson_datasource::item_type const& item = *index_itr_++;
+ std::size_t file_offset = item.second.first;
+ std::size_t size = item.second.second;
+ std::fseek(file_.get(), file_offset, SEEK_SET);
+ std::vector<char> json;
+ json.resize(size);
+ std::fread(json.data(), size, 1, file_.get());
+
+ using chr_iterator_type = char const*;
+ chr_iterator_type start = json.data();
+ chr_iterator_type end = start + json.size();
+
+ static const mapnik::transcoder tr("utf8");
+ static const mapnik::json::feature_grammar<chr_iterator_type,mapnik::feature_impl> grammar(tr);
+ using namespace boost::spirit;
+ ascii::space_type space;
+ mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx_,1));
+ if (!qi::phrase_parse(start, end, (grammar)(boost::phoenix::ref(*feature)), space))
+ {
+ throw std::runtime_error("Failed to parse geojson feature");
+ }
+ return feature;
+ }
+ return mapnik::feature_ptr();
+}
diff --git a/plugins/input/geojson/large_geojson_featureset.hpp b/plugins/input/geojson/large_geojson_featureset.hpp
new file mode 100644
index 0000000..71116ae
--- /dev/null
+++ b/plugins/input/geojson/large_geojson_featureset.hpp
@@ -0,0 +1,54 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef LARGE_GEOJSON_FEATURESET_HPP
+#define LARGE_GEOJSON_FEATURESET_HPP
+
+#include <mapnik/feature.hpp>
+#include "geojson_datasource.hpp"
+
+#include <vector>
+#include <deque>
+#include <fstream>
+#include <cstdio>
+
+class large_geojson_featureset : public mapnik::Featureset
+{
+public:
+ using array_type = std::deque<geojson_datasource::item_type>;
+ using file_ptr = std::unique_ptr<std::FILE, int (*)(std::FILE *)>;
+
+ large_geojson_featureset(std::string const& filename,
+ array_type && index_array);
+ virtual ~large_geojson_featureset();
+ mapnik::feature_ptr next();
+
+private:
+ file_ptr file_;
+
+ const array_type index_array_;
+ array_type::const_iterator index_itr_;
+ array_type::const_iterator index_end_;
+ mapnik::context_ptr ctx_;
+};
+
+#endif // LARGE_GEOJSON_FEATURESET_HPP
diff --git a/plugins/input/occi/build.py b/plugins/input/occi/build.py
index 2797345..4db36eb 100644
--- a/plugins/input/occi/build.py
+++ b/plugins/input/occi/build.py
@@ -31,18 +31,28 @@ plugin_sources = Split(
%(PLUGIN_NAME)s_types.cpp
%(PLUGIN_NAME)s_datasource.cpp
%(PLUGIN_NAME)s_featureset.cpp
- spatial_classesm.cpp
- spatial_classeso.cpp
+ spatial_classesm.cpp
+ spatial_classeso.cpp
""" % locals()
)
-libraries = [ 'occi', 'ociei' ]
+libraries = [ 'clntsh', 'occi' ]
libraries.append('boost_system%s' % env['BOOST_APPEND'])
libraries.append(env['ICU_LIB_NAME'])
if env['PLUGIN_LINKING'] == 'shared':
libraries.append(env['MAPNIK_NAME'])
+ # libocci.dylib, at least for 11.2 links to libstdc++
+ # so we defer symbol resolution to runtime in order to
+ # dodge linking errors like
+ # Undefined symbols for architecture x86_64:
+ # "std::string::_Rep::_M_destroy(std::allocator<char> const&)", referenced from:
+ # RegisterClasses(oracle::occi::Environment*) in spatial_classesm.os
+
+ if env['PLATFORM'] == 'Darwin':
+ plugin_env.Append(LINKFLAGS='-undefined dynamic_lookup')
+
TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME,
SHLIBPREFIX='',
SHLIBSUFFIX='.input',
diff --git a/plugins/input/occi/occi_datasource.cpp b/plugins/input/occi/occi_datasource.cpp
index 364817b..fcfe785 100644
--- a/plugins/input/occi/occi_datasource.cpp
+++ b/plugins/input/occi/occi_datasource.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -79,7 +79,7 @@ occi_datasource::occi_datasource(parameters const& params)
desc_(occi_datasource::name(), *params.get<std::string>("encoding", "utf-8")),
use_wkb_(*params.get<mapnik::boolean_type>("use_wkb", false)),
row_limit_(*params.get<mapnik::value_integer>("row_limit", 0)),
- row_prefetch_(*params.get<int>("row_prefetch", 100)),
+ row_prefetch_(*params.get<mapnik::value_integer>("row_prefetch", 100)),
pool_(0),
conn_(0)
{
@@ -107,7 +107,7 @@ occi_datasource::occi_datasource(parameters const& params)
boost::optional<std::string> ext = params.get<std::string>("extent");
if (ext) extent_initialized_ = extent_.from_string(*ext);
- boost::optional<int> srid = params.get<int>("srid");
+ boost::optional<mapnik::value_integer> srid = params.get<mapnik::value_integer>("srid");
if (srid)
{
srid_ = *srid;
@@ -123,8 +123,8 @@ occi_datasource::occi_datasource(parameters const& params)
*params.get<std::string>("user"),
*params.get<std::string>("password"),
*params.get<std::string>("host"),
- *params.get<int>("max_size", 5),
- *params.get<int>("initial_size", 1),
+ *params.get<mapnik::value_integer>("max_size", 5),
+ *params.get<mapnik::value_integer>("initial_size", 1),
1);
}
catch (SQLException& ex)
@@ -443,9 +443,9 @@ box2d<double> occi_datasource::envelope() const
}
-boost::optional<mapnik::datasource::geometry_t> occi_datasource::get_geometry_type() const
+boost::optional<mapnik::datasource_geometry_t> occi_datasource::get_geometry_type() const
{
- return boost::optional<mapnik::datasource::geometry_t>();
+ return boost::optional<mapnik::datasource_geometry_t>();
}
layer_descriptor occi_datasource::get_descriptor() const
diff --git a/plugins/input/occi/occi_datasource.hpp b/plugins/input/occi/occi_datasource.hpp
index 0aa6f38..27151ff 100644
--- a/plugins/input/occi/occi_datasource.hpp
+++ b/plugins/input/occi/occi_datasource.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -54,7 +54,7 @@ public:
mapnik::featureset_ptr features(mapnik::query const& q) const;
mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt, double tol = 0) const;
mapnik::box2d<double> envelope() const;
- boost::optional<mapnik::datasource::geometry_t> get_geometry_type() const;
+ boost::optional<mapnik::datasource_geometry_t> get_geometry_type() const;
mapnik::layer_descriptor get_descriptor() const;
private:
diff --git a/plugins/input/occi/occi_featureset.cpp b/plugins/input/occi/occi_featureset.cpp
index 33f89e8..1c01140 100644
--- a/plugins/input/occi/occi_featureset.cpp
+++ b/plugins/input/occi/occi_featureset.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,13 +24,13 @@
#include <mapnik/global.hpp>
#include <mapnik/debug.hpp>
#include <mapnik/box2d.hpp>
-#include <mapnik/geometry.hpp>
#include <mapnik/feature.hpp>
#include <mapnik/feature_layer_desc.hpp>
#include <mapnik/wkb.hpp>
#include <mapnik/unicode.hpp>
#include <mapnik/value_types.hpp>
#include <mapnik/feature_factory.hpp>
+#include <mapnik/make_unique.hpp>
// ogr
#include "occi_featureset.hpp"
@@ -259,7 +259,7 @@ void occi_featureset::convert_geometry(SDOGeometry* geom, feature_ptr feature)
SDOPointType* sdopoint = geom->getSdo_point();
if (sdopoint && ! sdopoint->isNull())
{
- std::unique_ptr<geometry_type> point = std::make_unique<geometry_type>(mapnik::geometry_type::types::Point);
+ std::unique_ptr<geometry_type> point = std::make_unique<geometry_type>(mapnik::geometry::geometry_types::Point);
point->move_to(sdopoint->getX(), sdopoint->getY());
feature->add_geometry(point.release());
}
@@ -272,7 +272,7 @@ void occi_featureset::convert_geometry(SDOGeometry* geom, feature_ptr feature)
const bool is_single_geom = true;
const bool is_point_type = false;
convert_ordinates(feature,
- mapnik::geometry_type::types::LineString,
+ mapnik::geometry::geometry_types::LineString,
elem_info,
ordinates,
dimensions,
@@ -288,7 +288,7 @@ void occi_featureset::convert_geometry(SDOGeometry* geom, feature_ptr feature)
const bool is_single_geom = true;
const bool is_point_type = false;
convert_ordinates(feature,
- mapnik::geometry_type::types::Polygon,
+ mapnik::geometry::geometry_types::Polygon,
elem_info,
ordinates,
dimensions,
@@ -304,7 +304,7 @@ void occi_featureset::convert_geometry(SDOGeometry* geom, feature_ptr feature)
const bool is_single_geom = false;
const bool is_point_type = true;
convert_ordinates(feature,
- mapnik::geometry_type::types::Point,
+ mapnik::geometry::geometry_types::Point,
elem_info,
ordinates,
dimensions,
@@ -321,7 +321,7 @@ void occi_featureset::convert_geometry(SDOGeometry* geom, feature_ptr feature)
const bool is_point_type = false;
convert_ordinates(feature,
- mapnik::geometry_type::types::LineString,
+ mapnik::geometry::geometry_types::LineString,
elem_info,
ordinates,
dimensions,
@@ -338,7 +338,7 @@ void occi_featureset::convert_geometry(SDOGeometry* geom, feature_ptr feature)
const bool is_point_type = false;
convert_ordinates(feature,
- mapnik::geometry_type::types::Polygon,
+ mapnik::geometry::geometry_types::Polygon,
elem_info,
ordinates,
dimensions,
@@ -356,7 +356,7 @@ void occi_featureset::convert_geometry(SDOGeometry* geom, feature_ptr feature)
const bool is_point_type = false;
convert_ordinates(feature,
- mapnik::geometry_type::types::Polygon,
+ mapnik::geometry::geometry_types::Polygon,
elem_info,
ordinates,
dimensions,
@@ -404,20 +404,20 @@ void occi_featureset::convert_ordinates(mapnik::feature_ptr feature,
int next_interp = elem_info[i + 2];
bool is_linear_element = true;
bool is_unknown_etype = false;
- mapnik::geometry_type::types gtype = mapnik::geometry_type::types::Point;
+ mapnik::geometry_type::types gtype = mapnik::geometry::geometry_types::Point;
switch (etype)
{
case SDO_ETYPE_POINT:
if (interp == SDO_INTERPRETATION_POINT) {}
if (interp > SDO_INTERPRETATION_POINT) {}
- gtype = mapnik::geometry_type::types::Point;
+ gtype = mapnik::geometry::geometry_types::Point;
break;
case SDO_ETYPE_LINESTRING:
if (interp == SDO_INTERPRETATION_STRAIGHT) {}
if (interp == SDO_INTERPRETATION_CIRCULAR) {}
- gtype = mapnik::geometry_type::types::LineString;
+ gtype = mapnik::geometry::geometry_types::LineString;
break;
case SDO_ETYPE_POLYGON:
@@ -426,7 +426,7 @@ void occi_featureset::convert_ordinates(mapnik::feature_ptr feature,
if (interp == SDO_INTERPRETATION_CIRCULAR) {}
if (interp == SDO_INTERPRETATION_RECTANGLE) {}
if (interp == SDO_INTERPRETATION_CIRCLE) {}
- gtype = mapnik::geometry_type::types::Polygon;
+ gtype = mapnik::geometry::geometry_types::Polygon;
break;
case SDO_ETYPE_COMPOUND_LINESTRING:
@@ -434,7 +434,7 @@ void occi_featureset::convert_ordinates(mapnik::feature_ptr feature,
case SDO_ETYPE_COMPOUND_POLYGON_INTERIOR:
// interp = next ETYPE to consider
is_linear_element = false;
- gtype = mapnik::geometry_type::types::Polygon;
+ gtype = mapnik::geometry::geometry_types::Polygon;
break;
case SDO_ETYPE_UNKNOWN: // unknown
diff --git a/plugins/input/occi/occi_featureset.hpp b/plugins/input/occi/occi_featureset.hpp
index 88f9cfb..9203423 100644
--- a/plugins/input/occi/occi_featureset.hpp
+++ b/plugins/input/occi/occi_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,11 +26,8 @@
// mapnik
#include <mapnik/feature.hpp>
#include <mapnik/datasource.hpp>
-#include <mapnik/geometry.hpp>
#include <mapnik/unicode.hpp>
-
-// boost
-
+// stl
#include <memory>
// oci
diff --git a/plugins/input/occi/occi_types.cpp b/plugins/input/occi/occi_types.cpp
index 0545b80..6fb69aa 100644
--- a/plugins/input/occi/occi_types.cpp
+++ b/plugins/input/occi/occi_types.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software, you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/occi/occi_types.hpp b/plugins/input/occi/occi_types.hpp
index 066704c..752246a 100644
--- a/plugins/input/occi/occi_types.hpp
+++ b/plugins/input/occi/occi_types.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software, you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/ogr/ogr_converter.cpp b/plugins/input/ogr/ogr_converter.cpp
index 341ab04..8f22aaf 100644
--- a/plugins/input/ogr/ogr_converter.cpp
+++ b/plugins/input/ogr/ogr_converter.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -21,151 +21,153 @@
*****************************************************************************/
// mapnik
-#include <mapnik/global.hpp>
#include <mapnik/debug.hpp>
-#include <mapnik/box2d.hpp>
#include <mapnik/geometry.hpp>
-#include <mapnik/feature.hpp>
-#include <mapnik/feature_layer_desc.hpp>
-#include <mapnik/wkb.hpp>
-#include <mapnik/unicode.hpp>
// ogr
#include "ogr_converter.hpp"
+#include <ogr_core.h>
+#include <ogr_geometry.h>
-using mapnik::feature_ptr;
-using mapnik::geometry_utils;
-using mapnik::geometry_type;
-
-void ogr_converter::convert_geometry(OGRGeometry* geom, feature_ptr feature)
+mapnik::geometry::geometry<double> ogr_converter::convert_geometry(OGRGeometry* ogr_geom)
{
// NOTE: wkbFlatten macro in ogr flattens 2.5d types into base 2d type
- switch (wkbFlatten(geom->getGeometryType()))
+ switch (wkbFlatten(ogr_geom->getGeometryType()))
{
case wkbPoint:
- convert_point(static_cast<OGRPoint*>(geom), feature);
+ return convert_point(static_cast<OGRPoint*>(ogr_geom));
break;
case wkbMultiPoint:
- convert_multipoint(static_cast<OGRMultiPoint*>(geom), feature);
+ return convert_multipoint(static_cast<OGRMultiPoint*>(ogr_geom));
break;
case wkbLinearRing:
- convert_linestring(static_cast<OGRLinearRing*>(geom), feature);
+ return convert_linestring(static_cast<OGRLinearRing*>(ogr_geom));
break;
case wkbLineString:
- convert_linestring(static_cast<OGRLineString*>(geom), feature);
+ return convert_linestring(static_cast<OGRLineString*>(ogr_geom));
break;
case wkbMultiLineString:
- convert_multilinestring(static_cast<OGRMultiLineString*>(geom), feature);
+ return convert_multilinestring(static_cast<OGRMultiLineString*>(ogr_geom));
break;
case wkbPolygon:
- convert_polygon(static_cast<OGRPolygon*>(geom), feature);
+ return convert_polygon(static_cast<OGRPolygon*>(ogr_geom));
break;
case wkbMultiPolygon:
- convert_multipolygon(static_cast<OGRMultiPolygon*>(geom), feature);
+ return convert_multipolygon(static_cast<OGRMultiPolygon*>(ogr_geom));
break;
case wkbGeometryCollection:
- convert_collection(static_cast<OGRGeometryCollection*>(geom), feature);
+ return convert_collection(static_cast<OGRGeometryCollection*>(ogr_geom));
break;
case wkbNone:
case wkbUnknown:
default:
{
MAPNIK_LOG_WARN(ogr) << "ogr_converter: unknown <ogr> geometry_type="
- << wkbFlatten(geom->getGeometryType());
+ << wkbFlatten(ogr_geom->getGeometryType());
}
+ return mapnik::geometry::geometry<double>();
break;
}
}
-void ogr_converter::convert_point(OGRPoint* geom, feature_ptr feature)
+mapnik::geometry::point<double> ogr_converter::convert_point(OGRPoint* ogr_geom)
{
- std::unique_ptr<geometry_type> point(new geometry_type(mapnik::geometry_type::types::Point));
- point->move_to(geom->getX(), geom->getY());
- feature->paths().push_back(point.release());
+ return mapnik::geometry::point<double>(ogr_geom->getX(), ogr_geom->getY());
}
-void ogr_converter::convert_linestring(OGRLineString* geom, feature_ptr feature)
+mapnik::geometry::multi_point<double> ogr_converter::convert_multipoint(OGRMultiPoint* ogr_geom)
{
- int num_points = geom->getNumPoints();
- std::unique_ptr<geometry_type> line(new geometry_type(mapnik::geometry_type::types::LineString));
- line->move_to(geom->getX(0), geom->getY(0));
- for (int i = 1; i < num_points; ++i)
+ mapnik::geometry::multi_point<double> geom;
+ int num_geometries = ogr_geom->getNumGeometries();
+ geom.reserve(num_geometries);
+ for (int i = 0; i < num_geometries; ++i)
{
- line->line_to (geom->getX(i), geom->getY(i));
+ OGRPoint const* pt = static_cast<OGRPoint*>(ogr_geom->getGeometryRef(i));
+ geom.emplace_back(pt->getX(), pt->getY());
}
- feature->paths().push_back(line.release());
+ return geom;
}
-void ogr_converter::convert_polygon(OGRPolygon* geom, feature_ptr feature)
+mapnik::geometry::line_string<double> ogr_converter::convert_linestring(OGRLineString* ogr_geom)
{
- OGRLinearRing* exterior = geom->getExteriorRing();
- int num_points = exterior->getNumPoints();
- int num_interior = geom->getNumInteriorRings();
- int capacity = 0;
- for (int r = 0; r < num_interior; ++r)
- {
- OGRLinearRing* interior = geom->getInteriorRing(r);
- capacity += interior->getNumPoints();
- }
-
- std::unique_ptr<geometry_type> poly(new geometry_type(mapnik::geometry_type::types::Polygon));
-
- poly->move_to(exterior->getX(0), exterior->getY(0));
- for (int i = 1; i < num_points; ++i)
- {
- poly->line_to(exterior->getX(i), exterior->getY(i));
- }
- poly->close_path();
- for (int r = 0; r < num_interior; ++r)
+ mapnik::geometry::line_string<double> geom;
+ int num_points = ogr_geom->getNumPoints();
+ geom.reserve(num_points);
+ for (int i = 0; i < num_points; ++i)
{
- OGRLinearRing* interior = geom->getInteriorRing(r);
- num_points = interior->getNumPoints();
- poly->move_to(interior->getX(0), interior->getY(0));
- for (int i = 1; i < num_points; ++i)
- {
- poly->line_to(interior->getX(i), interior->getY(i));
- }
- poly->close_path();
+ geom.add_coord(ogr_geom->getX(i), ogr_geom->getY(i));
}
- feature->paths().push_back(poly.release());
+ return geom;
}
-void ogr_converter::convert_multipoint(OGRMultiPoint* geom, feature_ptr feature)
+mapnik::geometry::multi_line_string<double> ogr_converter::convert_multilinestring(OGRMultiLineString* ogr_geom)
{
- int num_geometries = geom->getNumGeometries();
+ mapnik::geometry::multi_line_string<double> geom;
+ int num_geometries = ogr_geom->getNumGeometries();
+ geom.reserve(num_geometries);
for (int i = 0; i < num_geometries; ++i)
{
- convert_point(static_cast<OGRPoint*>(geom->getGeometryRef(i)), feature);
+ geom.emplace_back(std::move(
+ convert_linestring(static_cast<OGRLineString*>(ogr_geom->getGeometryRef(i)))));
}
+ return geom;
}
-void ogr_converter::convert_multilinestring(OGRMultiLineString* geom, feature_ptr feature)
+
+mapnik::geometry::polygon<double> ogr_converter::convert_polygon(OGRPolygon* ogr_geom)
{
- int num_geometries = geom->getNumGeometries();
- for (int i = 0; i < num_geometries; ++i)
+ mapnik::geometry::polygon<double> geom;
+ mapnik::geometry::linear_ring<double> exterior;
+ OGRLinearRing* ogr_exterior = ogr_geom->getExteriorRing();
+ int num_points = ogr_exterior->getNumPoints();
+ exterior.reserve(num_points);
+ for (int i = 0; i < num_points; ++i)
+ {
+ exterior.emplace_back(ogr_exterior->getX(i), ogr_exterior->getY(i));
+ }
+ geom.set_exterior_ring(std::move(exterior));
+
+ int num_interior = ogr_geom->getNumInteriorRings();
+ for (int r = 0; r < num_interior; ++r)
{
- convert_linestring(static_cast<OGRLineString*>(geom->getGeometryRef(i)), feature);
+ OGRLinearRing* ogr_interior = ogr_geom->getInteriorRing(r);
+ mapnik::geometry::linear_ring<double> interior;
+ int num_interior_points = ogr_interior->getNumPoints();
+ interior.reserve(num_interior_points);
+ for (int i = 0; i < num_interior_points; ++i)
+ {
+ interior.emplace_back(ogr_interior->getX(i), ogr_interior->getY(i));
+ }
+ geom.add_hole(std::move(interior));
}
+ return geom;
}
-void ogr_converter::convert_multipolygon(OGRMultiPolygon* geom, feature_ptr feature)
+mapnik::geometry::multi_polygon<double> ogr_converter::convert_multipolygon(OGRMultiPolygon* ogr_geom)
{
- int num_geometries = geom->getNumGeometries();
+ mapnik::geometry::multi_polygon<double> geom;
+ int num_geometries = ogr_geom->getNumGeometries();
+ geom.reserve(num_geometries);
for (int i = 0; i < num_geometries; ++i)
{
- convert_polygon(static_cast<OGRPolygon*>(geom->getGeometryRef(i)), feature);
+ geom.emplace_back(std::move(
+ convert_polygon(static_cast<OGRPolygon*>(ogr_geom->getGeometryRef(i)))));
}
+ return geom;
}
-void ogr_converter::convert_collection(OGRGeometryCollection* geom, feature_ptr feature)
+mapnik::geometry::geometry_collection<double> ogr_converter::convert_collection(OGRGeometryCollection* ogr_geom)
{
- int num_geometries = geom->getNumGeometries();
+ mapnik::geometry::geometry_collection<double> geom;
+ int num_geometries = ogr_geom->getNumGeometries();
+ geom.reserve(num_geometries);
for (int i = 0; i < num_geometries; ++i)
{
- OGRGeometry* g = geom->getGeometryRef(i);
+ OGRGeometry* g = ogr_geom->getGeometryRef(i);
if (g != nullptr)
{
- convert_geometry(g, feature);
+ geom.emplace_back(std::move(convert_geometry(g)));
}
}
+ return geom;
}
diff --git a/plugins/input/ogr/ogr_converter.hpp b/plugins/input/ogr/ogr_converter.hpp
index a52ab66..e3e2bb3 100644
--- a/plugins/input/ogr/ogr_converter.hpp
+++ b/plugins/input/ogr/ogr_converter.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,24 +24,29 @@
#define OGR_CONVERTER_HPP
// mapnik
-#include <mapnik/datasource.hpp>
-#include <mapnik/params.hpp>
+#include <mapnik/geometry.hpp>
-// ogr
-#include <ogrsf_frmts.h>
+class OGRGeometry;
+class OGRGeometryCollection;
+class OGRLineString;
+class OGRMultiLineString;
+class OGRMultiPoint;
+class OGRMultiPolygon;
+class OGRPoint;
+class OGRPolygon;
class ogr_converter
{
public:
- static void convert_geometry (OGRGeometry* geom, mapnik::feature_ptr feature);
- static void convert_collection (OGRGeometryCollection* geom, mapnik::feature_ptr feature);
- static void convert_point (OGRPoint* geom, mapnik::feature_ptr feature);
- static void convert_linestring (OGRLineString* geom, mapnik::feature_ptr feature);
- static void convert_polygon (OGRPolygon* geom, mapnik::feature_ptr feature);
- static void convert_multipoint (OGRMultiPoint* geom, mapnik::feature_ptr feature);
- static void convert_multilinestring (OGRMultiLineString* geom, mapnik::feature_ptr feature);
- static void convert_multipolygon (OGRMultiPolygon* geom, mapnik::feature_ptr feature);
+ static mapnik::geometry::geometry<double> convert_geometry (OGRGeometry* ogr_geom);
+ static mapnik::geometry::point<double> convert_point (OGRPoint* ogr_geom);
+ static mapnik::geometry::multi_point<double> convert_multipoint (OGRMultiPoint* ogr_geom);
+ static mapnik::geometry::line_string<double> convert_linestring (OGRLineString* ogr_geom);
+ static mapnik::geometry::multi_line_string<double> convert_multilinestring (OGRMultiLineString* ogr_geom);
+ static mapnik::geometry::polygon<double> convert_polygon (OGRPolygon* ogr_geom);
+ static mapnik::geometry::multi_polygon<double> convert_multipolygon (OGRMultiPolygon* ogr_geom);
+ static mapnik::geometry::geometry_collection<double> convert_collection (OGRGeometryCollection* ogr_geom);
};
#endif // OGR_CONVERTER_HPP
diff --git a/plugins/input/ogr/ogr_datasource.cpp b/plugins/input/ogr/ogr_datasource.cpp
index 3e76dd9..dc6247a 100644
--- a/plugins/input/ogr/ogr_datasource.cpp
+++ b/plugins/input/ogr/ogr_datasource.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -32,6 +32,7 @@
#include <mapnik/geom_util.hpp>
#include <mapnik/timer.hpp>
#include <mapnik/utils.hpp>
+#include <mapnik/util/trim.hpp>
// boost
#pragma GCC diagnostic push
@@ -333,6 +334,9 @@ void ogr_datasource::init(mapnik::parameters const& params)
switch (type_oid)
{
case OFTInteger:
+#if GDAL_VERSION_MAJOR >= 2
+ case OFTInteger64:
+#endif
desc_.add_descriptor(attribute_descriptor(fld_name, mapnik::Integer));
break;
@@ -350,6 +354,9 @@ void ogr_datasource::init(mapnik::parameters const& params)
break;
case OFTIntegerList:
+#if GDAL_VERSION_MAJOR >= 2
+ case OFTInteger64List:
+#endif
case OFTRealList:
case OFTStringList:
case OFTWideStringList: // deprecated !
@@ -365,6 +372,13 @@ void ogr_datasource::init(mapnik::parameters const& params)
}
}
}
+ mapnik::parameters & extra_params = desc_.get_extra_parameters();
+ OGRSpatialReference * srs_ref = layer->GetSpatialRef();
+ char * srs_output = NULL;
+ if (srs_ref && srs_ref->exportToProj4( &srs_output ) == OGRERR_NONE ) {
+ extra_params["proj4"] = mapnik::util::trim_copy(srs_output);
+ }
+ CPLFree(srs_output);
}
const char * ogr_datasource::name()
@@ -382,9 +396,9 @@ box2d<double> ogr_datasource::envelope() const
return extent_;
}
-boost::optional<mapnik::datasource::geometry_t> ogr_datasource::get_geometry_type() const
+boost::optional<mapnik::datasource_geometry_t> ogr_datasource::get_geometry_type() const
{
- boost::optional<mapnik::datasource::geometry_t> result;
+ boost::optional<mapnik::datasource_geometry_t> result;
if (dataset_ && layer_.is_valid())
{
OGRLayer* layer = layer_.layer();
@@ -397,19 +411,19 @@ boost::optional<mapnik::datasource::geometry_t> ogr_datasource::get_geometry_typ
{
case wkbPoint:
case wkbMultiPoint:
- result.reset(mapnik::datasource::Point);
+ result.reset(mapnik::datasource_geometry_t::Point);
break;
case wkbLinearRing:
case wkbLineString:
case wkbMultiLineString:
- result.reset(mapnik::datasource::LineString);
+ result.reset(mapnik::datasource_geometry_t::LineString);
break;
case wkbPolygon:
case wkbMultiPolygon:
- result.reset(mapnik::datasource::Polygon);
+ result.reset(mapnik::datasource_geometry_t::Polygon);
break;
case wkbGeometryCollection:
- result.reset(mapnik::datasource::Collection);
+ result.reset(mapnik::datasource_geometry_t::Collection);
break;
case wkbNone:
case wkbUnknown:
@@ -432,19 +446,19 @@ boost::optional<mapnik::datasource::geometry_t> ogr_datasource::get_geometry_typ
{
case wkbPoint:
case wkbMultiPoint:
- result.reset(mapnik::datasource::Point);
+ result.reset(mapnik::datasource_geometry_t::Point);
break;
case wkbLinearRing:
case wkbLineString:
case wkbMultiLineString:
- result.reset(mapnik::datasource::LineString);
+ result.reset(mapnik::datasource_geometry_t::LineString);
break;
case wkbPolygon:
case wkbMultiPolygon:
- result.reset(mapnik::datasource::Polygon);
+ result.reset(mapnik::datasource_geometry_t::Polygon);
break;
case wkbGeometryCollection:
- result.reset(mapnik::datasource::Collection);
+ result.reset(mapnik::datasource_geometry_t::Collection);
break;
default:
break;
diff --git a/plugins/input/ogr/ogr_datasource.hpp b/plugins/input/ogr/ogr_datasource.hpp
index 5691fd8..ddd74b7 100644
--- a/plugins/input/ogr/ogr_datasource.hpp
+++ b/plugins/input/ogr/ogr_datasource.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -54,7 +54,7 @@ public:
mapnik::featureset_ptr features(mapnik::query const& q) const;
mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt, double tol = 0) const;
mapnik::box2d<double> envelope() const;
- boost::optional<mapnik::datasource::geometry_t> get_geometry_type() const;
+ boost::optional<mapnik::datasource_geometry_t> get_geometry_type() const;
mapnik::layer_descriptor get_descriptor() const;
private:
diff --git a/plugins/input/ogr/ogr_featureset.cpp b/plugins/input/ogr/ogr_featureset.cpp
index 7383c7f..1a50024 100644
--- a/plugins/input/ogr/ogr_featureset.cpp
+++ b/plugins/input/ogr/ogr_featureset.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,13 +25,13 @@
#include <mapnik/value_types.hpp>
#include <mapnik/debug.hpp>
#include <mapnik/box2d.hpp>
-#include <mapnik/geometry.hpp>
#include <mapnik/feature.hpp>
#include <mapnik/feature_layer_desc.hpp>
#include <mapnik/wkb.hpp>
#include <mapnik/unicode.hpp>
#include <mapnik/value_types.hpp>
#include <mapnik/feature_factory.hpp>
+#include <mapnik/geometry_correct.hpp>
// ogr
#include "ogr_featureset.hpp"
@@ -101,7 +101,9 @@ feature_ptr ogr_featureset::next()
OGRGeometry* geom = poFeature->GetGeometryRef();
if (geom && ! geom->IsEmpty())
{
- ogr_converter::convert_geometry(geom, feature);
+ auto geom_corrected = ogr_converter::convert_geometry(geom);
+ mapnik::geometry::correct(geom_corrected);
+ feature->set_geometry(std::move(geom_corrected));
}
else
{
diff --git a/plugins/input/ogr/ogr_featureset.hpp b/plugins/input/ogr/ogr_featureset.hpp
index 861ff27..9dfd729 100644
--- a/plugins/input/ogr/ogr_featureset.hpp
+++ b/plugins/input/ogr/ogr_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/ogr/ogr_index.hpp b/plugins/input/ogr/ogr_index.hpp
index ff793c6..b30c92a 100644
--- a/plugins/input/ogr/ogr_index.hpp
+++ b/plugins/input/ogr/ogr_index.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/ogr/ogr_index_featureset.cpp b/plugins/input/ogr/ogr_index_featureset.cpp
index f72a5a6..265ded3 100644
--- a/plugins/input/ogr/ogr_index_featureset.cpp
+++ b/plugins/input/ogr/ogr_index_featureset.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,12 +25,12 @@
#include <mapnik/global.hpp>
#include <mapnik/debug.hpp>
#include <mapnik/box2d.hpp>
-#include <mapnik/geometry.hpp>
#include <mapnik/feature.hpp>
#include <mapnik/feature_layer_desc.hpp>
#include <mapnik/wkb.hpp>
#include <mapnik/unicode.hpp>
#include <mapnik/feature_factory.hpp>
+#include <mapnik/geometry_correct.hpp>
// boost
#ifdef SHAPE_MEMORY_MAPPED_FILE
@@ -44,6 +44,8 @@
#include "ogr_converter.hpp"
#include "ogr_index.hpp"
+#include <gdal_version.h>
+
using mapnik::query;
using mapnik::box2d;
using mapnik::feature_ptr;
@@ -120,7 +122,9 @@ feature_ptr ogr_index_featureset<filterT>::next()
geom->getEnvelope(&feature_envelope_);
if (!filter_.pass(mapnik::box2d<double>(feature_envelope_.MinX,feature_envelope_.MinY,
feature_envelope_.MaxX,feature_envelope_.MaxY))) continue;
- ogr_converter::convert_geometry (geom, feature);
+ auto geom_corrected = ogr_converter::convert_geometry(geom);
+ mapnik::geometry::correct(geom_corrected);
+ feature->set_geometry(std::move(geom_corrected));
}
else
{
@@ -140,6 +144,9 @@ feature_ptr ogr_index_featureset<filterT>::next()
switch (type_oid)
{
case OFTInteger:
+#if GDAL_VERSION_MAJOR >= 2
+ case OFTInteger64:
+#endif
{
feature->put<mapnik::value_integer>(fld_name,poFeature->GetFieldAsInteger (i));
break;
@@ -159,6 +166,9 @@ feature_ptr ogr_index_featureset<filterT>::next()
}
case OFTIntegerList:
+#if GDAL_VERSION_MAJOR >= 2
+ case OFTInteger64List:
+#endif
case OFTRealList:
case OFTStringList:
case OFTWideStringList: // deprecated !
diff --git a/plugins/input/ogr/ogr_index_featureset.hpp b/plugins/input/ogr/ogr_index_featureset.hpp
index 83645da..440743e 100644
--- a/plugins/input/ogr/ogr_index_featureset.hpp
+++ b/plugins/input/ogr/ogr_index_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/ogr/ogr_layer_ptr.hpp b/plugins/input/ogr/ogr_layer_ptr.hpp
index 81fe3dc..07c55c3 100644
--- a/plugins/input/ogr/ogr_layer_ptr.hpp
+++ b/plugins/input/ogr/ogr_layer_ptr.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/osm/Makefile.example b/plugins/input/osm/Makefile.example
deleted file mode 100644
index b896584..0000000
--- a/plugins/input/osm/Makefile.example
+++ /dev/null
@@ -1,9 +0,0 @@
-CXXFLAGS = `xml2-config --cflags` -I/usr/local/include/mapnik -I/usr/include/boost -I/usr/include/freetype2 -I/home/nick/mapnik-osm/agg/include -g
-LDFLAGS = `xml2-config --libs` -L/usr/local/lib
-LDFLAGS5 = `xml2-config --libs` -L/usr/local/lib -lmapnik
-OBJ = test.o osm.o osmparser.o
-test: $(OBJ)
- g++ -o test $(OBJ) $(LDFLAGS)
-render: render.o
- g++ -o render render.o $(LDFLAGS5)
-
diff --git a/plugins/input/osm/basiccurl.cpp b/plugins/input/osm/basiccurl.cpp
index ece3aca..77cab5e 100755
--- a/plugins/input/osm/basiccurl.cpp
+++ b/plugins/input/osm/basiccurl.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/osm/dataset_deliverer.cpp b/plugins/input/osm/dataset_deliverer.cpp
index caaadb8..4920cab 100644
--- a/plugins/input/osm/dataset_deliverer.cpp
+++ b/plugins/input/osm/dataset_deliverer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/osm/libMakefile b/plugins/input/osm/libMakefile
deleted file mode 100644
index d072ba2..0000000
--- a/plugins/input/osm/libMakefile
+++ /dev/null
@@ -1,4 +0,0 @@
-CXXFLAGS = `xml2-config --cflags` -I/usr/local/include/mapnik -I/usr/include/boost -I/usr/include/freetype2 -I/home/nick/mapnik-osm/agg/include -fPIC -g
-MAPNIK_OSM_OBJ = osmparser.o osm.o osm_datasource.o osm_featureset.o
-osm.input: $(MAPNIK_OSM_OBJ)
- g++ -shared -o osm.input $(MAPNIK_OSM_OBJ)
diff --git a/plugins/input/osm/osm.cpp b/plugins/input/osm/osm.cpp
index d5fe096..f822a31 100644
--- a/plugins/input/osm/osm.cpp
+++ b/plugins/input/osm/osm.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/osm/osm_datasource.cpp b/plugins/input/osm/osm_datasource.cpp
index 65a66a8..3f52897 100644
--- a/plugins/input/osm/osm_datasource.cpp
+++ b/plugins/input/osm/osm_datasource.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -153,7 +153,7 @@ box2d<double> osm_datasource::envelope() const
return extent_;
}
-boost::optional<mapnik::datasource::geometry_t> osm_datasource::get_geometry_type() const
+boost::optional<mapnik::datasource_geometry_t> osm_datasource::get_geometry_type() const
{
- return boost::optional<mapnik::datasource::geometry_t>(mapnik::datasource::Collection);
+ return boost::optional<mapnik::datasource_geometry_t>(mapnik::datasource_geometry_t::Collection);
}
diff --git a/plugins/input/osm/osm_datasource.hpp b/plugins/input/osm/osm_datasource.hpp
index fb9fcb3..3a2f0af 100644
--- a/plugins/input/osm/osm_datasource.hpp
+++ b/plugins/input/osm/osm_datasource.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -60,7 +60,7 @@ public:
featureset_ptr features(const query& q) const;
featureset_ptr features_at_point(coord2d const& pt, double tol = 0) const;
box2d<double> envelope() const;
- boost::optional<mapnik::datasource::geometry_t> get_geometry_type() const;
+ boost::optional<mapnik::datasource_geometry_t> get_geometry_type() const;
layer_descriptor get_descriptor() const;
private:
diff --git a/plugins/input/osm/osm_featureset.cpp b/plugins/input/osm/osm_featureset.cpp
index 99be92b..71c44ec 100644
--- a/plugins/input/osm/osm_featureset.cpp
+++ b/plugins/input/osm/osm_featureset.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,13 +27,11 @@
#include <mapnik/feature_factory.hpp>
#include <mapnik/debug.hpp>
#include <mapnik/unicode.hpp>
-
-// boost
+#include <mapnik/geometry_correct.hpp>
#include "osm_featureset.hpp"
using mapnik::feature_ptr;
-using mapnik::geometry_type;
using mapnik::feature_factory;
template <typename filterT>
@@ -64,9 +62,7 @@ feature_ptr osm_featureset<filterT>::next()
feature = feature_factory::create(ctx_, cur_item->id);
double lat = static_cast<osm_node*>(cur_item)->lat;
double lon = static_cast<osm_node*>(cur_item)->lon;
- std::unique_ptr<geometry_type> point = std::make_unique<geometry_type>(mapnik::geometry_type::types::Point);
- point->move_to(lon, lat);
- feature->add_geometry(point.release());
+ feature->set_geometry(mapnik::geometry::point<double>(lon,lat));
}
else if (dataset_->current_item_is_way())
{
@@ -82,24 +78,33 @@ feature_ptr osm_featureset<filterT>::next()
if (!cur_item) return feature_ptr();
feature = feature_factory::create(ctx_, cur_item->id);
- mapnik::geometry_type::types geom_type = mapnik::geometry_type::types::LineString;
if (static_cast<osm_way*>(cur_item)->is_polygon())
{
- geom_type = mapnik::geometry_type::types::Polygon;
+ mapnik::geometry::linear_ring<double> ring;
+ for (unsigned int count = 0;
+ count < static_cast<osm_way*>(cur_item)->nodes.size();
+ count++)
+ {
+ ring.add_coord(static_cast<osm_way*>(cur_item)->nodes[count]->lon,
+ static_cast<osm_way*>(cur_item)->nodes[count]->lat);
+ }
+ mapnik::geometry::polygon<double> geom;
+ geom.set_exterior_ring(std::move(ring));
+ mapnik::geometry::correct(geom);
+ feature->set_geometry(std::move(geom));
}
- std::unique_ptr<geometry_type> geom = std::make_unique<geometry_type>(geom_type);
-
- geom->move_to(static_cast<osm_way*>(cur_item)->nodes[0]->lon,
- static_cast<osm_way*>(cur_item)->nodes[0]->lat);
-
- for (unsigned int count = 1;
- count < static_cast<osm_way*>(cur_item)->nodes.size();
- count++)
+ else
{
- geom->line_to(static_cast<osm_way*>(cur_item)->nodes[count]->lon,
- static_cast<osm_way*>(cur_item)->nodes[count]->lat);
+ mapnik::geometry::line_string<double> geom;
+ for (unsigned int count = 0;
+ count < static_cast<osm_way*>(cur_item)->nodes.size();
+ count++)
+ {
+ geom.add_coord(static_cast<osm_way*>(cur_item)->nodes[count]->lon,
+ static_cast<osm_way*>(cur_item)->nodes[count]->lat);
+ }
+ feature->set_geometry(std::move(geom));
}
- feature->add_geometry(geom.release());
}
else
{
diff --git a/plugins/input/osm/osm_featureset.hpp b/plugins/input/osm/osm_featureset.hpp
index ebf11c7..48c0ff5 100644
--- a/plugins/input/osm/osm_featureset.hpp
+++ b/plugins/input/osm/osm_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/osm/render.cpp b/plugins/input/osm/render.cpp
deleted file mode 100644
index 707ac12..0000000
--- a/plugins/input/osm/render.cpp
+++ /dev/null
@@ -1,75 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2011 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-// stl
-#include <iostream>
-#include <cmath>
-
-// mapnik
-#include <mapnik/map.hpp>
-#include <mapnik/layer.hpp>
-#include <mapnik/box2d.hpp>
-#include <mapnik/agg_renderer.hpp>
-#include <mapnik/image_util.hpp>
-#include <mapnik/load_map.hpp>
-#include <mapnik/datasource_cache.hpp>
-#include <mapnik/font_engine_freetype.hpp>
-#include <mapnik/projection.hpp>
-
-int main(int argc,char *argv[])
-{
- if (argc < 6)
- {
- std::cerr << "Usage: render XMLfile w s e n [OSMfile]" << std::endl;
- exit(0);
- }
-
- mapnik::datasource_cache::instance().register_datasources("/usr/local/lib/mapnik/input");
- mapnik::freetype_engine::register_font("/usr/local/lib/mapnik/fonts/DejaVuSans.ttf");
-
- mapnik::Map m(800, 800);
- mapnik::load_map(m, argv[1]);
-
- if (argc > 6)
- {
- mapnik::parameters p;
- p["type"] = "osm";
- p["file"] = argv[6];
- for (int count = 0; count < m.layer_count(); count++)
- {
- mapnik::parameters q = m.get_layer(count).datasource()->params();
- m.get_layer(count).set_datasource(mapnik::datasource_cache::instance().create(p));
- }
- }
-
- mapnik::box2d<double> bbox (atof(argv[2]), atof(argv[3]), atof(argv[4]), atof(argv[5]));
-
- m.zoom_to_box(bbox);
-
- mapnik::image_32 buf (m.width(), m.height());
- mapnik::agg_renderer<mapnik::image_32> r(m, buf);
- r.apply();
-
- mapnik::save_to_file<mapnik::image_data_32>(buf.data(), "blah.png", "png");
-
- return 0;
-}
diff --git a/plugins/input/pgraster/pgraster_datasource.cpp b/plugins/input/pgraster/pgraster_datasource.cpp
index f4a8a9d..9e393bc 100644
--- a/plugins/input/pgraster/pgraster_datasource.cpp
+++ b/plugins/input/pgraster/pgraster_datasource.cpp
@@ -355,12 +355,22 @@ pgraster_datasource::pgraster_datasource(parameters const& params)
shared_ptr<ResultSet> rs = conn->executeQuery(s.str());
while (rs->next())
{
- overviews_.resize(overviews_.size()+1);
- pgraster_overview& ov = overviews_.back();
+ pgraster_overview ov = pgraster_overview();
+
ov.schema = rs->getValue("sch");
ov.table = rs->getValue("tab");
ov.column = rs->getValue("col");
ov.scale = atof(rs->getValue("scl"));
+
+ if(ov.scale == 0.0f)
+ {
+ MAPNIK_LOG_WARN(pgraster) << "pgraster_datasource: found invalid overview "
+ << ov.schema << "." << ov.table << "." << ov.column << " with scale " << ov.scale;
+ continue;
+ }
+
+ overviews_.push_back(ov);
+
MAPNIK_LOG_DEBUG(pgraster) << "pgraster_datasource: found overview " << ov.schema << "." << ov.table << "." << ov.column << " with scale " << ov.scale;
}
rs->close();
@@ -1191,7 +1201,7 @@ box2d<double> pgraster_datasource::envelope() const
return extent_;
}
-boost::optional<mapnik::datasource::geometry_t> pgraster_datasource::get_geometry_type() const
+boost::optional<mapnik::datasource_geometry_t> pgraster_datasource::get_geometry_type() const
{
- return boost::optional<mapnik::datasource::geometry_t>();
+ return boost::optional<mapnik::datasource_geometry_t>();
}
diff --git a/plugins/input/pgraster/pgraster_datasource.hpp b/plugins/input/pgraster/pgraster_datasource.hpp
index dc012c8..9d1931f 100644
--- a/plugins/input/pgraster/pgraster_datasource.hpp
+++ b/plugins/input/pgraster/pgraster_datasource.hpp
@@ -85,7 +85,7 @@ public:
featureset_ptr features(query const& q) const;
featureset_ptr features_at_point(coord2d const& pt, double tol = 0) const;
mapnik::box2d<double> envelope() const;
- boost::optional<mapnik::datasource::geometry_t> get_geometry_type() const;
+ boost::optional<mapnik::datasource_geometry_t> get_geometry_type() const;
layer_descriptor get_descriptor() const;
private:
diff --git a/plugins/input/pgraster/pgraster_featureset.cpp b/plugins/input/pgraster/pgraster_featureset.cpp
index ee36cc4..3ab87bb 100644
--- a/plugins/input/pgraster/pgraster_featureset.cpp
+++ b/plugins/input/pgraster/pgraster_featureset.cpp
@@ -28,6 +28,7 @@
#include "pgraster_wkb_reader.hpp"
#include "../postgis/resultset.hpp"
#include "../postgis/cursorresultset.hpp"
+#include "../postgis/numeric2string.hpp"
// mapnik
#include <mapnik/global.hpp>
@@ -37,7 +38,7 @@
#include <mapnik/feature_factory.hpp>
#include <mapnik/view_transform.hpp>
#include <mapnik/raster.hpp>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
#include <mapnik/util/conversions.hpp>
#include <mapnik/util/trim.hpp>
#include <mapnik/global.hpp> // for int2net
@@ -46,8 +47,6 @@
#include <sstream>
#include <string>
-using mapnik::geometry_type;
-using mapnik::byte;
using mapnik::feature_factory;
using mapnik::context_ptr;
@@ -64,8 +63,6 @@ pgraster_featureset::pgraster_featureset(std::shared_ptr<IResultSet> const& rs,
{
}
-std::string numeric2string(const char* buf);
-
feature_ptr pgraster_featureset::next()
{
while (rs_->next())
@@ -241,115 +238,3 @@ pgraster_featureset::~pgraster_featureset()
{
rs_->close();
}
-
-std::string numeric2string(const char* buf)
-{
- std::int16_t ndigits = int2net(buf);
- std::int16_t weight = int2net(buf+2);
- std::int16_t sign = int2net(buf+4);
- std::int16_t dscale = int2net(buf+6);
-
- std::unique_ptr<std::int16_t[]> digits(new std::int16_t[ndigits]);
- for (int n=0; n < ndigits ;++n)
- {
- digits[n] = int2net(buf+8+n*2);
- }
-
- std::ostringstream ss;
-
- if (sign == 0x4000) ss << "-";
-
- int i = std::max(weight,std::int16_t(0));
- int d = 0;
-
- // Each numeric "digit" is actually a value between 0000 and 9999 stored in a 16 bit field.
- // For example, the number 1234567809990001 is stored as four digits: [1234] [5678] [999] [1].
- // Note that the last two digits show that the leading 0's are lost when the number is split.
- // We must be careful to re-insert these 0's when building the string.
-
- while ( i >= 0)
- {
- if (i <= weight && d < ndigits)
- {
- // All digits after the first must be padded to make the field 4 characters long
- if (d != 0)
- {
-#ifdef _WINDOWS
- int dig = digits[d];
- if (dig < 10)
- {
- ss << "000"; // 0000 - 0009
- }
- else if (dig < 100)
- {
- ss << "00"; // 0010 - 0099
- }
- else
- {
- ss << "0"; // 0100 - 0999;
- }
-#else
- switch(digits[d])
- {
- case 0 ... 9:
- ss << "000"; // 0000 - 0009
- break;
- case 10 ... 99:
- ss << "00"; // 0010 - 0099
- break;
- case 100 ... 999:
- ss << "0"; // 0100 - 0999
- break;
- }
-#endif
- }
- ss << digits[d++];
- }
- else
- {
- if (d == 0)
- ss << "0";
- else
- ss << "0000";
- }
-
- i--;
- }
- if (dscale > 0)
- {
- ss << '.';
- // dscale counts the number of decimal digits following the point, not the numeric digits
- while (dscale > 0)
- {
- int value;
- if (i <= weight && d < ndigits)
- value = digits[d++];
- else
- value = 0;
-
- // Output up to 4 decimal digits for this value
- if (dscale > 0) {
- ss << (value / 1000);
- value %= 1000;
- dscale--;
- }
- if (dscale > 0) {
- ss << (value / 100);
- value %= 100;
- dscale--;
- }
- if (dscale > 0) {
- ss << (value / 10);
- value %= 10;
- dscale--;
- }
- if (dscale > 0) {
- ss << value;
- dscale--;
- }
-
- i--;
- }
- }
- return ss.str();
-}
diff --git a/plugins/input/pgraster/pgraster_featureset.hpp b/plugins/input/pgraster/pgraster_featureset.hpp
index d7f2001..55aba59 100644
--- a/plugins/input/pgraster/pgraster_featureset.hpp
+++ b/plugins/input/pgraster/pgraster_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/pgraster/pgraster_wkb_reader.cpp b/plugins/input/pgraster/pgraster_wkb_reader.cpp
index 109438a..0e544f3 100644
--- a/plugins/input/pgraster/pgraster_wkb_reader.cpp
+++ b/plugins/input/pgraster/pgraster_wkb_reader.cpp
@@ -32,7 +32,7 @@
#include <mapnik/debug.hpp>
#include <mapnik/view_transform.hpp>
#include <mapnik/raster.hpp>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
#include <mapnik/util/conversions.hpp>
#include <mapnik/util/trim.hpp>
#include <mapnik/box2d.hpp> // for box2d
@@ -178,25 +178,15 @@ typedef enum {
}
-using mapnik::box2d;
-
template<typename T>
-void read_data_band(mapnik::raster_ptr raster,
+mapnik::raster_ptr read_data_band(mapnik::box2d<double> const& bbox,
uint16_t width, uint16_t height,
bool hasnodata, T reader)
{
- mapnik::image_data_32 & image = raster->data_;
-
- // Start with plain white (ABGR or RGBA depending on endiannes)
- // TODO: set to transparent instead?
- image.set(0xffffffff);
-
- raster->premultiplied_alpha_ = true;
-
- float* data = (float*)image.getBytes();
+ mapnik::image_gray32f image(width, height);
+ float* data = image.data();
double val;
val = reader(); // nodata value, need to read anyway
- if ( hasnodata ) raster->set_nodata(val);
for (int y=0; y<height; ++y) {
for (int x=0; x<width; ++x) {
val = reader();
@@ -204,16 +194,14 @@ void read_data_band(mapnik::raster_ptr raster,
data[off] = val;
}
}
+ mapnik::raster_ptr raster = std::make_shared<mapnik::raster>(bbox, image, 1.0);
+ if ( hasnodata ) raster->set_nodata(val);
+ return raster;
}
-void
-pgraster_wkb_reader::read_indexed(mapnik::raster_ptr raster)
+mapnik::raster_ptr pgraster_wkb_reader::read_indexed(mapnik::box2d<double> const& bbox,
+ uint16_t width, uint16_t height)
{
- mapnik::image_data_32 & image = raster->data_;
-
- // Start with all zeroes
- image.set(0);
-
uint8_t type = read_uint8(&ptr_);
int pixtype = BANDTYPE_PIXTYPE(type);
@@ -227,7 +215,7 @@ pgraster_wkb_reader::read_indexed(mapnik::raster_ptr raster)
if ( offline ) {
MAPNIK_LOG_WARN(pgraster) << "pgraster_wkb_reader: offline band "
" unsupported";
- return;
+ return mapnik::raster_ptr();
}
MAPNIK_LOG_DEBUG(pgraster) << "pgraster_wkb_reader: reading " << height_ << "x" << width_ << " pixels";
@@ -240,27 +228,27 @@ pgraster_wkb_reader::read_indexed(mapnik::raster_ptr raster)
case PT_8BSI:
// mapnik does not support signed anyway
case PT_8BUI:
- read_data_band(raster, width_, height_, hasnodata,
+ return read_data_band(bbox, width_, height_, hasnodata,
boost::bind(read_uint8, &ptr_));
break;
case PT_16BSI:
// mapnik does not support signed anyway
case PT_16BUI:
- read_data_band(raster, width_, height_, hasnodata,
+ return read_data_band(bbox, width_, height_, hasnodata,
boost::bind(read_uint16, &ptr_, endian_));
break;
case PT_32BSI:
// mapnik does not support signed anyway
case PT_32BUI:
- read_data_band(raster, width_, height_, hasnodata,
+ return read_data_band(bbox, width_, height_, hasnodata,
boost::bind(read_uint32, &ptr_, endian_));
break;
case PT_32BF:
- read_data_band(raster, width_, height_, hasnodata,
+ return read_data_band(bbox, width_, height_, hasnodata,
boost::bind(read_float32, &ptr_, endian_));
break;
case PT_64BF:
- read_data_band(raster, width_, height_, hasnodata,
+ return read_data_band(bbox, width_, height_, hasnodata,
boost::bind(read_float64, &ptr_, endian_));
break;
default:
@@ -270,28 +258,25 @@ pgraster_wkb_reader::read_indexed(mapnik::raster_ptr raster)
//MAPNIK_LOG_WARN(pgraster) << err.str();
throw mapnik::datasource_exception(err.str());
}
-
+ return mapnik::raster_ptr();
}
template<typename T>
-void read_grayscale_band(mapnik::raster_ptr raster,
+mapnik::raster_ptr read_grayscale_band(mapnik::box2d<double> const& bbox,
uint16_t width, uint16_t height,
bool hasnodata, T reader)
{
- mapnik::image_data_32 & image = raster->data_;
-
+ mapnik::image_rgba8 image(width,height, true, true);
// Start with plain white (ABGR or RGBA depending on endiannes)
// TODO: set to transparent instead?
image.set(0xffffffff);
- raster->premultiplied_alpha_ = true;
int val;
- uint8_t * data = image.getBytes();
- int ps = 4; // sizeof(image_data::pixel_type)
+ uint8_t * data = image.bytes();
+ int ps = 4; // sizeof(image::pixel_type)
int off;
val = reader(); // nodata value, need to read anyway
- if ( hasnodata ) raster->set_nodata(val);
for (int y=0; y<height; ++y) {
for (int x=0; x<width; ++x) {
val = reader();
@@ -302,10 +287,13 @@ void read_grayscale_band(mapnik::raster_ptr raster,
data[off+2] = val;
}
}
+ mapnik::raster_ptr raster = std::make_shared<mapnik::raster>(bbox, image, 1.0);
+ if ( hasnodata ) raster->set_nodata(val);
+ return raster;
}
-void
-pgraster_wkb_reader::read_grayscale(mapnik::raster_ptr raster)
+mapnik::raster_ptr pgraster_wkb_reader::read_grayscale(mapnik::box2d<double> const& bbox,
+ uint16_t width, uint16_t height)
{
uint8_t type = read_uint8(&ptr_);
@@ -320,7 +308,7 @@ pgraster_wkb_reader::read_grayscale(mapnik::raster_ptr raster)
if ( offline ) {
MAPNIK_LOG_WARN(pgraster) << "pgraster_wkb_reader: offline band "
" unsupported";
- return;
+ return mapnik::raster_ptr();
}
switch (pixtype) {
@@ -331,19 +319,19 @@ pgraster_wkb_reader::read_grayscale(mapnik::raster_ptr raster)
case PT_8BSI:
// mapnik does not support signed anyway
case PT_8BUI:
- read_grayscale_band(raster, width_, height_, hasnodata,
+ return read_grayscale_band(bbox, width_, height_, hasnodata,
boost::bind(read_uint8, &ptr_));
break;
case PT_16BSI:
// mapnik does not support signed anyway
case PT_16BUI:
- read_grayscale_band(raster, width_, height_, hasnodata,
+ return read_grayscale_band(bbox, width_, height_, hasnodata,
boost::bind(read_uint16, &ptr_, endian_));
break;
case PT_32BSI:
// mapnik does not support signed anyway
case PT_32BUI:
- read_grayscale_band(raster, width_, height_, hasnodata,
+ return read_grayscale_band(bbox, width_, height_, hasnodata,
boost::bind(read_uint32, &ptr_, endian_));
break;
default:
@@ -353,19 +341,15 @@ pgraster_wkb_reader::read_grayscale(mapnik::raster_ptr raster)
//MAPNIK_LOG_WARN(pgraster) << err.str();
throw mapnik::datasource_exception(err.str());
}
-
+ return mapnik::raster_ptr();
}
-void
-pgraster_wkb_reader::read_rgba(mapnik::raster_ptr raster)
+mapnik::raster_ptr pgraster_wkb_reader::read_rgba(mapnik::box2d<double> const& bbox,
+ uint16_t width, uint16_t height)
{
- mapnik::image_data_32 & image = raster->data_;
-
+ mapnik::image_rgba8 im(width, height, true, true);
// Start with plain white (ABGR or RGBA depending on endiannes)
- image.set(0xffffffff);
- //raster->set_nodata(0xffffffff);
-
- raster->premultiplied_alpha_ = true;
+ im.set(0xffffffff);
uint8_t nodataval;
for (int bn=0; bn<numBands_; ++bn) {
@@ -398,8 +382,8 @@ pgraster_wkb_reader::read_rgba(mapnik::raster_ptr raster)
<< " nodataval " << tmp << " != band 0 nodataval " << nodataval;
}
- int ps = 4; // sizeof(image_data::pixel_type)
- uint8_t * image_data = image.getBytes();
+ int ps = 4; // sizeof(image::pixel_type)
+ uint8_t * image_data = im.bytes();
for (int y=0; y<height_; ++y) {
for (int x=0; x<width_; ++x) {
uint8_t val = read_uint8(&ptr_);
@@ -411,6 +395,9 @@ pgraster_wkb_reader::read_rgba(mapnik::raster_ptr raster)
}
}
}
+ mapnik::raster_ptr raster = std::make_shared<mapnik::raster>(bbox, im, 1.0);
+ raster->set_nodata(0xffffffff);
+ return raster;
}
mapnik::raster_ptr
@@ -458,28 +445,30 @@ pgraster_wkb_reader::get_raster() {
return mapnik::raster_ptr();
}
- box2d<double> ext(ipX,ipY,ipX+(width_*scaleX),ipY+(height_*scaleY));
+ mapnik::box2d<double> ext(ipX,ipY,ipX+(width_*scaleX),ipY+(height_*scaleY));
MAPNIK_LOG_DEBUG(pgraster) << "pgraster_wkb_reader: Raster extent=" << ext;
- mapnik::raster_ptr raster = std::make_shared<mapnik::raster>(ext, width_, height_, 1.0);
-
- if ( bandno_ ) {
- if ( bandno_ != 1 ) {
- MAPNIK_LOG_WARN(pgraster) << "pgraster_wkb_reader: "
+ if ( bandno_ )
+ {
+ if ( bandno_ != 1 )
+ {
+ MAPNIK_LOG_WARN(pgraster) << "pgraster_wkb_reader: "
"reading bands other than 1st as indexed is unsupported";
- return mapnik::raster_ptr();
+ return mapnik::raster_ptr();
}
MAPNIK_LOG_DEBUG(pgraster) << "pgraster_wkb_reader: requested band " << bandno_;
- read_indexed(raster);
+ return read_indexed(ext, width_, height_);
}
- else {
- switch (numBands_) {
+ else
+ {
+ switch (numBands_)
+ {
case 1:
- read_grayscale(raster);
+ return read_grayscale(ext, width_, height_);
break;
case 3:
case 4:
- read_rgba(raster);
+ return read_rgba(ext, width_, height_);
break;
default:
std::ostringstream err;
@@ -491,7 +480,5 @@ pgraster_wkb_reader::get_raster() {
return mapnik::raster_ptr();
}
}
-
- return raster;
-
+ return mapnik::raster_ptr();
}
diff --git a/plugins/input/pgraster/pgraster_wkb_reader.hpp b/plugins/input/pgraster/pgraster_wkb_reader.hpp
index 21f163b..b0ec7f8 100644
--- a/plugins/input/pgraster/pgraster_wkb_reader.hpp
+++ b/plugins/input/pgraster/pgraster_wkb_reader.hpp
@@ -29,6 +29,7 @@
// mapnik
#include <mapnik/feature.hpp> // for raster_ptr
+#include <mapnik/box2d.hpp>
enum pgraster_color_interp {
// Automatic color interpretation:
@@ -65,9 +66,9 @@ public:
}
private:
- void read_indexed(mapnik::raster_ptr raster);
- void read_grayscale(mapnik::raster_ptr raster);
- void read_rgba(mapnik::raster_ptr raster);
+ mapnik::raster_ptr read_indexed(mapnik::box2d<double> const& bbox, uint16_t width, uint16_t height);
+ mapnik::raster_ptr read_grayscale(mapnik::box2d<double> const& bbox, uint16_t width, uint16_t height);
+ mapnik::raster_ptr read_rgba(mapnik::box2d<double> const& bbox, uint16_t width, uint16_t height);
//int wkbsize_;
//const uint8_t* wkb_;
diff --git a/plugins/input/postgis/asyncresultset.hpp b/plugins/input/postgis/asyncresultset.hpp
index 0db1079..b1bc912 100644
--- a/plugins/input/postgis/asyncresultset.hpp
+++ b/plugins/input/postgis/asyncresultset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -34,7 +34,7 @@
class postgis_processor_context;
using postgis_processor_context_ptr = std::shared_ptr<postgis_processor_context>;
-class AsyncResultSet : public IResultSet, private mapnik::noncopyable
+class AsyncResultSet : public IResultSet, private mapnik::util::noncopyable
{
public:
AsyncResultSet(postgis_processor_context_ptr const& ctx,
diff --git a/plugins/input/postgis/connection.hpp b/plugins/input/postgis/connection.hpp
index 4794721..18009e5 100644
--- a/plugins/input/postgis/connection.hpp
+++ b/plugins/input/postgis/connection.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -58,7 +58,7 @@ public:
{
std::string err_msg = "Postgis Plugin: ";
err_msg += status();
- err_msg += "\nConnection string: '";
+ err_msg += "Connection string: '";
err_msg += connection_str;
err_msg += "'\n";
MAPNIK_LOG_DEBUG(postgis) << "postgis_connection: creation failed, closing connection - " << this;
@@ -71,7 +71,7 @@ public:
if ( ! ok ) {
std::string err_msg = "Postgis Plugin: ";
err_msg += status();
- err_msg += "\nConnection string: '";
+ err_msg += "Connection string: '";
err_msg += connection_str;
err_msg += "'\n";
close();
@@ -127,7 +127,7 @@ public:
{
std::string err_msg = "Postgis Plugin: ";
err_msg += status();
- err_msg += "\nin executeQuery Full sql was: '";
+ err_msg += "in executeQuery Full sql was: '";
err_msg += sql;
err_msg += "'\n";
if ( result ) PQclear(result);
@@ -142,12 +142,19 @@ public:
std::string status;
if (conn_)
{
- if ( isOK() ) return PQerrorMessage(conn_);
- else return "Bad connection";
+ char * err_msg = PQerrorMessage(conn_);
+ if (err_msg == nullptr)
+ {
+ status = "Bad connection\n";
+ }
+ else
+ {
+ status = std::string(err_msg);
+ }
}
else
{
- status = "Uninitialized connection";
+ status = "Uninitialized connection\n";
}
return status;
}
@@ -167,7 +174,7 @@ public:
{
std::string err_msg = "Postgis Plugin: ";
err_msg += status();
- err_msg += "\nin executeAsyncQuery Full sql was: '";
+ err_msg += "in executeAsyncQuery Full sql was: '";
err_msg += sql;
err_msg += "'\n";
clearAsyncResult(PQgetResult(conn_));
@@ -191,7 +198,7 @@ public:
{
std::string err_msg = "Postgis Plugin: ";
err_msg += status();
- err_msg += "\nin getNextAsyncResult";
+ err_msg += "in getNextAsyncResult";
clearAsyncResult(result);
// We need to guarde against losing the connection
// (i.e db restart) so here we invalidate the full connection
@@ -208,7 +215,7 @@ public:
{
std::string err_msg = "Postgis Plugin: ";
err_msg += status();
- err_msg += "\nin getAsyncResult";
+ err_msg += "in getAsyncResult";
clearAsyncResult(result);
// We need to be guarded against losing the connection
// (i.e db restart), we invalidate the full connection
diff --git a/plugins/input/postgis/connection_manager.hpp b/plugins/input/postgis/connection_manager.hpp
index 4437c1e..6427190 100644
--- a/plugins/input/postgis/connection_manager.hpp
+++ b/plugins/input/postgis/connection_manager.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/postgis/cursorresultset.hpp b/plugins/input/postgis/cursorresultset.hpp
index 87f4df2..fa071b3 100644
--- a/plugins/input/postgis/cursorresultset.hpp
+++ b/plugins/input/postgis/cursorresultset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -28,7 +28,7 @@
#include "connection.hpp"
#include "resultset.hpp"
-class CursorResultSet : public IResultSet, private mapnik::noncopyable
+class CursorResultSet : public IResultSet, private mapnik::util::noncopyable
{
public:
CursorResultSet(std::shared_ptr<Connection> const &conn, std::string cursorName, int fetch_count)
diff --git a/plugins/input/postgis/numeric2string.hpp b/plugins/input/postgis/numeric2string.hpp
new file mode 100644
index 0000000..0f988c9
--- /dev/null
+++ b/plugins/input/postgis/numeric2string.hpp
@@ -0,0 +1,144 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAPNIK_NUMERIC_2_STRING_HPP
+#define MAPNIK_NUMERIC_2_STRING_HPP
+
+#include <mapnik/global.hpp>
+#include <string>
+#include <sstream>
+#include <memory>
+#include <algorithm>
+
+static inline std::string numeric2string(const char* buf)
+{
+ std::int16_t ndigits = int2net(buf);
+ std::int16_t weight = int2net(buf+2);
+ std::int16_t sign = int2net(buf+4);
+ std::int16_t dscale = int2net(buf+6);
+
+ std::unique_ptr<std::int16_t[]> digits(new std::int16_t[ndigits]);
+ for (int n=0; n < ndigits ;++n)
+ {
+ digits[n] = int2net(buf+8+n*2);
+ }
+
+ std::ostringstream ss;
+
+ if (sign == 0x4000) ss << "-";
+
+ int i = std::max(weight,std::int16_t(0));
+ int d = 0;
+
+ // Each numeric "digit" is actually a value between 0000 and 9999 stored in a 16 bit field.
+ // For example, the number 1234567809990001 is stored as four digits: [1234] [5678] [999] [1].
+ // Note that the last two digits show that the leading 0's are lost when the number is split.
+ // We must be careful to re-insert these 0's when building the string.
+
+ while ( i >= 0)
+ {
+ if (i <= weight && d < ndigits)
+ {
+ // All digits after the first must be padded to make the field 4 characters long
+ if (d != 0)
+ {
+#ifdef _WINDOWS
+ int dig = digits[d];
+ if (dig < 10)
+ {
+ ss << "000"; // 0000 - 0009
+ }
+ else if (dig < 100)
+ {
+ ss << "00"; // 0010 - 0099
+ }
+ else
+ {
+ ss << "0"; // 0100 - 0999;
+ }
+#else
+ switch(digits[d])
+ {
+ case 0 ... 9:
+ ss << "000"; // 0000 - 0009
+ break;
+ case 10 ... 99:
+ ss << "00"; // 0010 - 0099
+ break;
+ case 100 ... 999:
+ ss << "0"; // 0100 - 0999
+ break;
+ }
+#endif
+ }
+ ss << digits[d++];
+ }
+ else
+ {
+ if (d == 0)
+ ss << "0";
+ else
+ ss << "0000";
+ }
+
+ i--;
+ }
+ if (dscale > 0)
+ {
+ ss << '.';
+ // dscale counts the number of decimal digits following the point, not the numeric digits
+ while (dscale > 0)
+ {
+ int value;
+ if (i <= weight && d < ndigits)
+ value = digits[d++];
+ else
+ value = 0;
+
+ // Output up to 4 decimal digits for this value
+ if (dscale > 0) {
+ ss << (value / 1000);
+ value %= 1000;
+ dscale--;
+ }
+ if (dscale > 0) {
+ ss << (value / 100);
+ value %= 100;
+ dscale--;
+ }
+ if (dscale > 0) {
+ ss << (value / 10);
+ value %= 10;
+ dscale--;
+ }
+ if (dscale > 0) {
+ ss << value;
+ dscale--;
+ }
+
+ i--;
+ }
+ }
+ return ss.str();
+}
+
+#endif
diff --git a/plugins/input/postgis/postgis_datasource.cpp b/plugins/input/postgis/postgis_datasource.cpp
index 95cb808..acb9655 100644
--- a/plugins/input/postgis/postgis_datasource.cpp
+++ b/plugins/input/postgis/postgis_datasource.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -154,10 +154,10 @@ postgis_datasource::postgis_datasource(parameters const& params)
schema_ = geometry_table_.substr(0, idx);
geometry_table_ = geometry_table_.substr(idx + 1);
}
- else
- {
- geometry_table_ = geometry_table_.substr(0);
- }
+
+ // NOTE: geometry_table_ how should ideally be a table name, but
+ // there are known edge cases where this will break down and
+ // geometry_table_ may even be empty: https://github.com/mapnik/mapnik/issues/2718
// If we do not know both the geometry_field and the srid
// then first attempt to fetch the geometry name from a geometry_columns entry.
@@ -166,7 +166,7 @@ postgis_datasource::postgis_datasource(parameters const& params)
// the table parameter references a table, view, or subselect not
// registered in the geometry columns.
geometryColumn_ = geometry_field_;
- if (geometryColumn_.empty() || srid_ == 0)
+ if (!geometry_table_.empty() && (geometryColumn_.empty() || srid_ == 0))
{
#ifdef MAPNIK_STATS
mapnik::progress_timer __stats2__(std::clog, "postgis_datasource::init(get_srid_and_geometry_column)");
@@ -195,6 +195,8 @@ postgis_datasource::postgis_datasource(parameters const& params)
if (rs->next())
{
geometryColumn_ = rs->getValue("f_geometry_column");
+ // only accept srid from geometry_tables if
+ // user has not provided as option
if (srid_ == 0)
{
const char* srid_c = rs->getValue("srid");
@@ -211,37 +213,50 @@ postgis_datasource::postgis_datasource(parameters const& params)
}
rs->close();
}
- catch (mapnik::datasource_exception const& ex) {
+ catch (mapnik::datasource_exception const& ex)
+ {
// let this pass on query error and use the fallback below
MAPNIK_LOG_WARN(postgis) << "postgis_datasource: metadata query failed: " << ex.what();
}
+ }
- // If we still do not know the srid then we can try to fetch
- // it from the 'table_' parameter, which should work even if it is
- // a subselect as long as we know the geometry_field to query
- if (! geometryColumn_.empty() && srid_ <= 0)
- {
- s.str("");
+ // If we still do not know the srid then we can try to fetch
+ // it from the 'geometry_table_' parameter, which should work even if it is
+ // a subselect as long as we know the geometry_field to query
+ if (!geometryColumn_.empty() && srid_ <= 0)
+ {
+ std::ostringstream s;
- s << "SELECT ST_SRID(\"" << geometryColumn_ << "\") AS srid FROM "
- << populate_tokens(table_) << " WHERE \"" << geometryColumn_ << "\" IS NOT NULL LIMIT 1;";
+ s << "SELECT ST_SRID(\"" << geometryColumn_ << "\") AS srid FROM ";
+ if (!geometry_table_.empty())
+ {
+ if (!schema_.empty())
+ {
+ s << schema_ << '.';
+ }
+ s << geometry_table_;
+ }
+ else
+ {
+ s << populate_tokens(table_);
+ }
+ s << " WHERE \"" << geometryColumn_ << "\" IS NOT NULL LIMIT 1;";
- shared_ptr<ResultSet> rs = conn->executeQuery(s.str());
- if (rs->next())
+ shared_ptr<ResultSet> rs = conn->executeQuery(s.str());
+ if (rs->next())
+ {
+ const char* srid_c = rs->getValue("srid");
+ if (srid_c != nullptr)
{
- const char* srid_c = rs->getValue("srid");
- if (srid_c != nullptr)
+ int result = 0;
+ const char * end = srid_c + std::strlen(srid_c);
+ if (mapnik::util::string2int(srid_c, end, result))
{
- int result = 0;
- const char * end = srid_c + std::strlen(srid_c);
- if (mapnik::util::string2int(srid_c, end, result))
- {
- srid_ = result;
- }
+ srid_ = result;
}
}
- rs->close();
}
+ rs->close();
}
// detect primary key
@@ -442,6 +457,14 @@ postgis_datasource::postgis_datasource(parameters const& params)
// Close explicitly the connection so we can 'fork()' without sharing open connections
conn->close();
+ // Finally, add unique metadata to layer descriptor
+ mapnik::parameters & extra_params = desc_.get_extra_parameters();
+ // explicitly make copies of values due to https://github.com/mapnik/mapnik/issues/2651
+ extra_params["srid"] = srid_;
+ if (!key_field_.empty())
+ {
+ extra_params["key_field"] = key_field_;
+ }
}
}
@@ -1010,9 +1033,9 @@ box2d<double> postgis_datasource::envelope() const
return extent_;
}
-boost::optional<mapnik::datasource::geometry_t> postgis_datasource::get_geometry_type() const
+boost::optional<mapnik::datasource_geometry_t> postgis_datasource::get_geometry_type() const
{
- boost::optional<mapnik::datasource::geometry_t> result;
+ boost::optional<mapnik::datasource_geometry_t> result;
CnxPool_ptr pool = ConnectionManager::instance().getPool(creator_.id());
if (pool)
@@ -1047,17 +1070,17 @@ boost::optional<mapnik::datasource::geometry_t> postgis_datasource::get_geometry
g_type = rs->getValue("type");
if (boost::algorithm::contains(g_type, "line"))
{
- result.reset(mapnik::datasource::LineString);
+ result.reset(mapnik::datasource_geometry_t::LineString);
return result;
}
else if (boost::algorithm::contains(g_type, "point"))
{
- result.reset(mapnik::datasource::Point);
+ result.reset(mapnik::datasource_geometry_t::Point);
return result;
}
else if (boost::algorithm::contains(g_type, "polygon"))
{
- result.reset(mapnik::datasource::Polygon);
+ result.reset(mapnik::datasource_geometry_t::Polygon);
return result;
}
else // geometry
@@ -1098,26 +1121,26 @@ boost::optional<mapnik::datasource::geometry_t> postgis_datasource::get_geometry
if (boost::algorithm::icontains(data, "line"))
{
g_type = "linestring";
- result.reset(mapnik::datasource::LineString);
+ result.reset(mapnik::datasource_geometry_t::LineString);
}
else if (boost::algorithm::icontains(data, "point"))
{
g_type = "point";
- result.reset(mapnik::datasource::Point);
+ result.reset(mapnik::datasource_geometry_t::Point);
}
else if (boost::algorithm::icontains(data, "polygon"))
{
g_type = "polygon";
- result.reset(mapnik::datasource::Polygon);
+ result.reset(mapnik::datasource_geometry_t::Polygon);
}
else // geometry
{
- result.reset(mapnik::datasource::Collection);
+ result.reset(mapnik::datasource_geometry_t::Collection);
return result;
}
if (! prev_type.empty() && g_type != prev_type)
{
- result.reset(mapnik::datasource::Collection);
+ result.reset(mapnik::datasource_geometry_t::Collection);
return result;
}
prev_type = g_type;
diff --git a/plugins/input/postgis/postgis_datasource.hpp b/plugins/input/postgis/postgis_datasource.hpp
index ebe87d7..7537bf6 100644
--- a/plugins/input/postgis/postgis_datasource.hpp
+++ b/plugins/input/postgis/postgis_datasource.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -74,7 +74,7 @@ public:
featureset_ptr features(query const& q) const;
featureset_ptr features_at_point(coord2d const& pt, double tol = 0) const;
mapnik::box2d<double> envelope() const;
- boost::optional<mapnik::datasource::geometry_t> get_geometry_type() const;
+ boost::optional<mapnik::datasource_geometry_t> get_geometry_type() const;
layer_descriptor get_descriptor() const;
private:
diff --git a/plugins/input/postgis/postgis_featureset.cpp b/plugins/input/postgis/postgis_featureset.cpp
index 8569a03..d256e86 100644
--- a/plugins/input/postgis/postgis_featureset.cpp
+++ b/plugins/input/postgis/postgis_featureset.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,6 +23,7 @@
#include "postgis_featureset.hpp"
#include "resultset.hpp"
#include "cursorresultset.hpp"
+ #include "numeric2string.hpp"
// mapnik
#include <mapnik/global.hpp>
@@ -40,8 +41,6 @@
#include <string>
#include <memory>
-using mapnik::geometry_type;
-using mapnik::byte;
using mapnik::geometry_utils;
using mapnik::feature_factory;
using mapnik::context_ptr;
@@ -59,8 +58,6 @@ postgis_featureset::postgis_featureset(std::shared_ptr<IResultSet> const& rs,
{
}
-std::string numeric2string(const char* buf);
-
feature_ptr postgis_featureset::next()
{
while (rs_->next())
@@ -124,8 +121,8 @@ feature_ptr postgis_featureset::next()
int size = rs_->getFieldLength(0);
const char *data = rs_->getValue(0);
- if (!geometry_utils::from_wkb(feature->paths(), data, size))
- continue;
+ mapnik::geometry::geometry<double> geometry = geometry_utils::from_wkb(data, size);
+ feature->set_geometry(std::move(geometry));
totalGeomSize_ += size;
unsigned num_attrs = ctx_->size() + 1;
@@ -226,115 +223,3 @@ postgis_featureset::~postgis_featureset()
{
rs_->close();
}
-
-std::string numeric2string(const char* buf)
-{
- std::int16_t ndigits = int2net(buf);
- std::int16_t weight = int2net(buf+2);
- std::int16_t sign = int2net(buf+4);
- std::int16_t dscale = int2net(buf+6);
-
- const std::unique_ptr<std::int16_t[]> digits(new std::int16_t[ndigits]);
- for (int n=0; n < ndigits ;++n)
- {
- digits[n] = int2net(buf+8+n*2);
- }
-
- std::ostringstream ss;
-
- if (sign == 0x4000) ss << "-";
-
- int i = std::max(weight,std::int16_t(0));
- int d = 0;
-
- // Each numeric "digit" is actually a value between 0000 and 9999 stored in a 16 bit field.
- // For example, the number 1234567809990001 is stored as four digits: [1234] [5678] [999] [1].
- // Note that the last two digits show that the leading 0's are lost when the number is split.
- // We must be careful to re-insert these 0's when building the string.
-
- while ( i >= 0)
- {
- if (i <= weight && d < ndigits)
- {
- // All digits after the first must be padded to make the field 4 characters long
- if (d != 0)
- {
-#ifdef _WINDOWS
- int dig = digits[d];
- if (dig < 10)
- {
- ss << "000"; // 0000 - 0009
- }
- else if (dig < 100)
- {
- ss << "00"; // 0010 - 0099
- }
- else
- {
- ss << "0"; // 0100 - 0999;
- }
-#else
- switch(digits[d])
- {
- case 0 ... 9:
- ss << "000"; // 0000 - 0009
- break;
- case 10 ... 99:
- ss << "00"; // 0010 - 0099
- break;
- case 100 ... 999:
- ss << "0"; // 0100 - 0999
- break;
- }
-#endif
- }
- ss << digits[d++];
- }
- else
- {
- if (d == 0)
- ss << "0";
- else
- ss << "0000";
- }
-
- i--;
- }
- if (dscale > 0)
- {
- ss << '.';
- // dscale counts the number of decimal digits following the point, not the numeric digits
- while (dscale > 0)
- {
- int value;
- if (i <= weight && d < ndigits)
- value = digits[d++];
- else
- value = 0;
-
- // Output up to 4 decimal digits for this value
- if (dscale > 0) {
- ss << (value / 1000);
- value %= 1000;
- dscale--;
- }
- if (dscale > 0) {
- ss << (value / 100);
- value %= 100;
- dscale--;
- }
- if (dscale > 0) {
- ss << (value / 10);
- value %= 10;
- dscale--;
- }
- if (dscale > 0) {
- ss << value;
- dscale--;
- }
-
- i--;
- }
- }
- return ss.str();
-}
diff --git a/plugins/input/postgis/postgis_featureset.hpp b/plugins/input/postgis/postgis_featureset.hpp
index a3a2cbf..6f5fff4 100644
--- a/plugins/input/postgis/postgis_featureset.hpp
+++ b/plugins/input/postgis/postgis_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/postgis/resultset.hpp b/plugins/input/postgis/resultset.hpp
index 600fc96..b93ce64 100644
--- a/plugins/input/postgis/resultset.hpp
+++ b/plugins/input/postgis/resultset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -45,7 +45,7 @@ public:
virtual const char* getValue(const char* name) const = 0;
};
-class ResultSet : public IResultSet, private mapnik::noncopyable
+class ResultSet : public IResultSet, private mapnik::util::noncopyable
{
public:
ResultSet(PGresult *res)
diff --git a/plugins/input/python/README.md b/plugins/input/python/README.md
deleted file mode 100644
index f1a4c57..0000000
--- a/plugins/input/python/README.md
+++ /dev/null
@@ -1,241 +0,0 @@
-# Python plugin
-
-This plugin allows you to write data sources in the Python programming language.
-This is useful if you want to rapidly prototype a plugin, perform some custom
-manipulation on data or if you want to bind mapnik to a datasource which is most
-conveniently accessed through Python.
-
-The plugin may be used from the existing mapnik Python bindings or it can embed
-the Python interpreter directly allowing it to be used from C++, XML or even
-JavaScript.
-
-## Rationale
-
-Mapnik already has excellent Python bindings but they only directly support
-calling *into* mapnik *from* Python. This forces mapnik and its input plugins to
-be the lowest layer of the stack. The role of this plugin is to allow mapnik to
-call *into* Python itself. This allows mapnik to sit as rendering middleware
-between a custom Python frontend and a custom Python datasource. This increases
-the utility of mapnik as a component in a larger system.
-
-There already exists MemoryDatasource which can be used to dynamically create
-geometry in Python. It suffers from the problem that it does not allow
-generating only the geometry which is seen by a particular query. Similarly the
-entire geometry must exist in memory before rendering can progress. By using a
-custom iterator object or by using generator expressions this plugin allows
-geometry to be created on demand and to be destroyed after use. This can have a
-great impact on memory efficiency. Since geometry is generated on-demand as
-rendering progresses there can be arbitrarily complex 'cleverness' optimising
-the geometry generated for a particular query. Obvious examples of this would
-be generating only geometry within the query bounding box and generating
-geometry with an appropriate level of detail for the output resolution.
-
-## Initialization
-
-Only the `factory` parameter is required. This is of the form
-`[module:]callable`. If `module` is present then `module` will be imported and
-its attribute named `callable` will be used as a factory callable. If `module`
-is omitted, then `__main__` is used. Any other parameter aside from `factory` or
-`type` will be passed directly to the callable as keyword arguments. Note that
-these will always be passed as strings even if the parameter can be parsed as an
-integer of floating point value.
-
-The callable should return an object with the following required attributes:
-
-* `envelope` - a 4-tuple giving the (minx, miny, maxx, maxy) extent of the
- datasource;
-
-* `data_type` - a `mapnik.DataType` instance giving the type of data stored in
- this datasource. This will usually be one of `mapnik.DataType.Vector` or
- `mapnik.DataType.Raster`.
-
-The following attributes are optional:
-
-* `geometry_type` - if the dataset is a vector dataset, this is an instance of
- `mapnik.DataGeometryType` giving the type of geometry returned by the
- datasource.
-
-The following methods must be present:
-
-* `features(query)` - takes a single argument which is an instance of
- `mapnik.Query` and returns an iterable of `mapnik.Feature` instances for that
- query.
-
-* `features_at_point(point)` - almost never used. Takes a single argument which
- is an instance of `mapnik.Point` (I think) and returns an iterable of
- features associated with that point.
-
-## Convenience classes
-
-The standard `mapnik` module provides a convenience class called
-`mapnik.PythonDatasource` which has default implementations for the required
-methods and accepts the geometry type, data type and envelope as constructor
-arguments. It also provides some convenience class methods which take care of
-constructing features for you:
-
-* `mapnik.PythonDatasource.wkb_features` - constructs features from
- well-known-binary (WKB) format geometry. Takes two keyword arguments: `keys`
- which is a sequence of keys associated with each feature and `features` which
- is a sequence of pairs. The first element in each pair is the WKB
- representation of the feature and the second element is a dictionary mapping
- keys to values.
-
-# Caveats
-
-* If used directly from C++, `Py_Initialize()` must have been called before the
- plugin is loaded to initialise the interpreter correctly.
-
-* When inside the interpreter the global interpreter lock is held each time a
- feature is fetched and so multi-threaded rendering performance may suffer. You
- can mitigate this by making sure that the feature iterator yields its value as
- quickly as possible, potentially from an in-memory buffer filled fom another
- process over IPC.
-
-# Examples
-
-In XML:
-
-```xml
-<?xml version="1.0" encoding="utf-8"?>
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="white">
- <Style name="style">
- <Rule>
- <PointSymbolizer />
- <TextSymbolizer name="[label]" face_name="DejaVu Sans Book" size="10" dx="5" dy="5"/>
- </Rule>
- </Style>
- <Layer name="test" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="type">python</Parameter>
- <Parameter name="factory">test:TestDatasource</Parameter>
- </Datasource>
- </Layer>
-</Map>
-```
-
-In Python using the shapely geometry library:
-
-```python
-import mapnik
-from shapely.geometry import *
-
-class TestDatasource(mapnik.PythonDatasource):
- def __init__(self):
- super(TestDatasource, self).__init__()
-
- def features(self, query):
- return mapnik.PythonDatasource.wkb_features(
- keys = ('label',),
- features = (
- ( Point(5,6).wkb, { 'label': 'foo-bar'} ),
- ( Point(100,60).wkb, { 'label': 'buzz-quux'} ),
- )
- )
-
-if __name__ == '__main__':
- m = mapnik.Map(1280,1024)
- m.background = mapnik.Color('white')
- s = mapnik.Style()
- r = mapnik.Rule()
- r.symbols.append(mapnik.PointSymbolizer())
- t = mapnik.TextSymbolizer(mapnik.Expression("[label]"),"DejaVu Sans Book",10,mapnik.Color('black'))
- t.displacement = (5,5)
- r.symbols.append(t)
- s.rules.append(r)
- m.append_style('point_style',s)
- ds = mapnik.Python(factory='TestDatasource')
- layer = mapnik.Layer('python')
- layer.datasource = ds
- layer.styles.append('point_style')
- m.layers.append(layer)
- m.zoom_all()
- mapnik.render_to_file(m,'map.png', 'png')
-```
-
-A more complex Python example which makes use of iterators to generate geometry
-dynamically:
-
-```python
-"""A more complex example which renders an infinite series of concentric
-circles centred on a point.
-
-The circles are represented by a Python iterator which will yield only the
-circles which intersect the query's bounding box. The advantage of this
-approach over a MemoryDatasource is that a) only those circles which intersect
-the viewport are actually generated and b) only the memory for the largest
-circle need be available since each circle is created on demand and destroyed
-when finished with.
-"""
-import math
-import mapnik
-from shapely.geometry import *
-
-def box2d_to_shapely(box):
- import shapely.geometry
- return shapely.geometry.box(box.minx, box.miny, box.maxx, box.maxy)
-
-class ConcentricCircles(object):
- def __init__(self, centre, bounds, step=1):
- self.centre = centre
- self.bounds = bounds
- self.step = step
-
- class Iterator(object):
- def __init__(self, container):
- self.container = container
-
- centre = self.container.centre
- bounds = self.container.bounds
- step = self.container.step
-
- if centre.within(bounds):
- self.radius = 0
- else:
- self.radius = math.ceil(centre.distance(bounds) / float(step)) * step
-
- def next(self):
- circle = self.container.centre.buffer(self.radius)
- self.radius += self.container.step
-
- # has the circle grown so large that the boundary is entirely within it?
- if circle.contains(self.container.bounds):
- raise StopIteration()
-
- return ( circle.wkb, { } )
-
- def __iter__(self):
- return ConcentricCircles.Iterator(self)
-
-class TestDatasource(mapnik.PythonDatasource):
- def __init__(self):
- super(TestDatasource, self).__init__(geometry_type=mapnik.DataGeometryType.Polygon)
-
- def features(self, query):
- # Get the query bounding-box as a shapely bounding box
- bounding_box = box2d_to_shapely(query.bbox)
- centre = Point(-20, 0)
-
- return mapnik.PythonDatasource.wkb_features(
- keys = (),
- features = ConcentricCircles(centre, bounding_box, 0.5)
- )
-
-if __name__ == '__main__':
- m = mapnik.Map(640, 320)
-
- m.background = mapnik.Color('white')
- s = mapnik.Style()
- r = mapnik.Rule()
- r.symbols.append(mapnik.LineSymbolizer())
- s.rules.append(r)
- m.append_style('point_style',s)
- ds = mapnik.Python(factory='TestDatasource')
- layer = mapnik.Layer('python')
- layer.datasource = ds
- layer.styles.append('point_style')
- m.layers.append(layer)
- box = mapnik.Box2d(-60, -60, 0, -30)
- m.zoom_to_box(box)
- mapnik.render_to_file(m,'map.png', 'png')
-```
diff --git a/plugins/input/python/build.py b/plugins/input/python/build.py
deleted file mode 100644
index e5d20ec..0000000
--- a/plugins/input/python/build.py
+++ /dev/null
@@ -1,97 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2013 Artem Pavlenko
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-#
-#
-
-import os
-import copy
-Import ('plugin_base')
-Import ('env')
-
-PLUGIN_NAME = 'python'
-
-plugin_env = plugin_base.Clone()
-
-plugin_sources = Split(
- """
- %(PLUGIN_NAME)s_datasource.cpp
- %(PLUGIN_NAME)s_featureset.cpp
- %(PLUGIN_NAME)s_utils.cpp
- """ % locals()
-)
-
-# Link Library to Dependencies
-libraries = []
-libraries.append('boost_system%s' % env['BOOST_APPEND'])
-libraries.append(env['BOOST_PYTHON_LIB'])
-libraries.append(env['ICU_LIB_NAME'])
-
-python_cpppath = env['PYTHON_INCLUDES']
-allcpp_paths = copy.copy(env['CPPPATH'])
-allcpp_paths.extend(python_cpppath)
-# NOTE: explicit linking to libpython is uneeded on most linux version if the
-# python plugin is used by a app in python using mapnik's python bindings
-# we explicitly link to libpython here so that this plugin
-# can be used from a pure C++ calling application or a different binding language
-if env['PLATFORM'] == 'Darwin' and env['FRAMEWORK_PYTHON']:
- if env['FRAMEWORK_SEARCH_PATH']:
- python_link_flag = '-F%s -framework Python -Z' % env['FRAMEWORK_SEARCH_PATH']
- else:
- link_prefix = env['PYTHON_SYS_PREFIX']
- if '.framework' in link_prefix:
- python_link_flag = '-F%s -framework Python -Z' % os.path.dirname(link_prefix.split('.')[0])
- elif '/System' in link_prefix:
- python_link_flag = '-F/System/Library/Frameworks/ -framework Python -Z'
- else:
- python_link_flag = '-F/ -framework Python'
-else:
- # on linux the linkflags end up to early in the compile flags to work correctly
- python_link_flag = '-L%s' % env['PYTHON_SYS_PREFIX'] + os.path.sep + env['LIBDIR_SCHEMA']
- # so instead add to libraries
- libraries.append('python%s' % env['PYTHON_VERSION'])
-
-plugin_env.Append(LINKFLAGS=python_link_flag)
-
-if env['PLUGIN_LINKING'] == 'shared':
- libraries.append(env['MAPNIK_NAME'])
- TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME,
- SHLIBPREFIX='',
- SHLIBSUFFIX='.input',
- source=plugin_sources,
- CPPPATH=allcpp_paths,
- LIBS=libraries)
-
- # if the plugin links to libmapnik ensure it is built first
- Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
-
- # if 'uninstall' is not passed on the command line
- # then we actually create the install targets that
- # scons will install if 'install' is passed as an arg
- if 'uninstall' not in COMMAND_LINE_TARGETS:
- env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], TARGET)
- env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
-
-plugin_obj = {
- 'LIBS': libraries,
- 'SOURCES': plugin_sources,
- 'CPPPATH': python_cpppath,
- 'LINKFLAGS': python_link_flag.replace('-Z','').split(' '),
-}
-
-Return('plugin_obj')
diff --git a/plugins/input/python/examples/concentric_circles.py b/plugins/input/python/examples/concentric_circles.py
deleted file mode 100644
index b805312..0000000
--- a/plugins/input/python/examples/concentric_circles.py
+++ /dev/null
@@ -1,83 +0,0 @@
-"""A more complex example which renders an infinite series of concentric
-circles centred on a point.
-
-The circles are represented by a Python iterator which will yield only the
-circles which intersect the query's bounding box. The advantage of this
-approach over a MemoryDatasource is that a) only those circles which intersect
-the viewport are actually generated and b) only the memory for the largest
-circle need be available since each circle is created on demand and destroyed
-when finished with.
-"""
-import math
-import mapnik
-from shapely.geometry import *
-
-def box2d_to_shapely(box):
- import shapely.geometry
- return shapely.geometry.box(box.minx, box.miny, box.maxx, box.maxy)
-
-class ConcentricCircles(object):
- def __init__(self, centre, bounds, step=1):
- self.centre = centre
- self.bounds = bounds
- self.step = step
-
- class Iterator(object):
- def __init__(self, container):
- self.container = container
-
- centre = self.container.centre
- bounds = self.container.bounds
- step = self.container.step
-
- if centre.within(bounds):
- self.radius = 0
- else:
- self.radius = math.ceil(centre.distance(bounds) / float(step)) * step
-
- def next(self):
- circle = self.container.centre.buffer(self.radius)
- self.radius += self.container.step
-
- # has the circle grown so large that the boundary is entirely within it?
- if circle.contains(self.container.bounds):
- raise StopIteration()
-
- return ( circle.wkb, { } )
-
- def __iter__(self):
- return ConcentricCircles.Iterator(self)
-
-class TestDatasource(mapnik.PythonDatasource):
- def __init__(self):
- super(TestDatasource, self).__init__(
- geometry_type=mapnik.DataGeometryType.Polygon
- )
-
- def features(self, query):
- # Get the query bounding-box as a shapely bounding box
- bounding_box = box2d_to_shapely(query.bbox)
- centre = Point(-20, 0)
-
- return mapnik.PythonDatasource.wkb_features(
- keys = (),
- features = ConcentricCircles(centre, bounding_box, 0.5)
- )
-
-if __name__ == '__main__':
- m = mapnik.Map(640, 320)
-
- m.background = mapnik.Color('white')
- s = mapnik.Style()
- r = mapnik.Rule()
- r.symbols.append(mapnik.LineSymbolizer())
- s.rules.append(r)
- m.append_style('point_style',s)
- ds = mapnik.Python(factory='TestDatasource')
- layer = mapnik.Layer('python')
- layer.datasource = ds
- layer.styles.append('point_style')
- m.layers.append(layer)
- box = mapnik.Box2d(-60, -60, 0, -30)
- m.zoom_to_box(box)
- mapnik.render_to_file(m,'map.png', 'png')
diff --git a/plugins/input/python/examples/simple_points.py b/plugins/input/python/examples/simple_points.py
deleted file mode 100644
index 1a51fc3..0000000
--- a/plugins/input/python/examples/simple_points.py
+++ /dev/null
@@ -1,34 +0,0 @@
-import mapnik
-from shapely.geometry import *
-
-class TestDatasource(mapnik.PythonDatasource):
- def __init__(self):
- super(TestDatasource, self).__init__()
-
- def features(self, query):
- return mapnik.PythonDatasource.wkb_features(
- keys = ('label',),
- features = (
- ( Point(5,6).wkb, { 'label': 'foo-bar'} ),
- ( Point(100,60).wkb, { 'label': 'buzz-quux'} ),
- )
- )
-
-if __name__ == '__main__':
- m = mapnik.Map(1280,1024)
- m.background = mapnik.Color('white')
- s = mapnik.Style()
- r = mapnik.Rule()
- r.symbols.append(mapnik.PointSymbolizer())
- t = mapnik.TextSymbolizer(mapnik.Expression("[label]"),"DejaVu Sans Book",10,mapnik.Color('black'))
- t.displacement = (5,5)
- r.symbols.append(t)
- s.rules.append(r)
- m.append_style('point_style',s)
- ds = mapnik.Python(factory='TestDatasource')
- layer = mapnik.Layer('python')
- layer.datasource = ds
- layer.styles.append('point_style')
- m.layers.append(layer)
- m.zoom_all()
- mapnik.render_to_file(m,'map.png', 'png')
diff --git a/plugins/input/python/examples/simple_xml.py b/plugins/input/python/examples/simple_xml.py
deleted file mode 100644
index 8dbe326..0000000
--- a/plugins/input/python/examples/simple_xml.py
+++ /dev/null
@@ -1,8 +0,0 @@
-import mapnik
-stylesheet = 'simple_xml.xml'
-image = 'simple_xml.png'
-m = mapnik.Map(600, 300)
-mapnik.load_map(m, stylesheet)
-m.zoom_all()
-mapnik.render_to_file(m, image)
-print "rendered image to '%s'" % image
diff --git a/plugins/input/python/examples/simple_xml.xml b/plugins/input/python/examples/simple_xml.xml
deleted file mode 100644
index a745f5f..0000000
--- a/plugins/input/python/examples/simple_xml.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="white">
- <Style name="style">
- <Rule>
- <PointSymbolizer />
- <TextSymbolizer name="[label]" face-name="DejaVu Sans Book" size="10" dx="5" dy="5"/>
- </Rule>
- </Style>
- <Layer name="test" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="type">python</Parameter>
- <Parameter name="factory">test:TestDatasource</Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/plugins/input/python/python_datasource.cpp b/plugins/input/python/python_datasource.cpp
deleted file mode 100644
index f100d67..0000000
--- a/plugins/input/python/python_datasource.cpp
+++ /dev/null
@@ -1,238 +0,0 @@
-// file plugin
-#include "python_datasource.hpp"
-#include "python_featureset.hpp"
-
-// stl
-#include <string>
-#include <vector>
-
-// boost
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-#include <boost/python.hpp>
-#include <boost/python/stl_iterator.hpp>
-#include <boost/algorithm/string.hpp>
-#pragma GCC diagnostic pop
-
-
-#include "python_utils.hpp"
-
-using mapnik::datasource;
-using mapnik::parameters;
-
-DATASOURCE_PLUGIN(python_datasource)
-
-python_datasource::python_datasource(parameters const& params)
- : datasource(params),
- desc_(python_datasource::name(), *params.get<std::string>("encoding","utf-8")),
- factory_(*params.get<std::string>("factory", ""))
-{
- // extract any remaining parameters as keyword args for the factory
- for (const mapnik::parameters::value_type& kv : params)
- {
- if((kv.first != "type") && (kv.first != "factory"))
- {
- kwargs_.emplace(kv.first, *params.get<std::string>(kv.first));
- }
- }
-
- // The following methods call into the Python interpreter and hence require, unfortunately, that the GIL be held.
- using namespace boost;
-
- if (factory_.empty())
- {
- throw mapnik::datasource_exception("Python: 'factory' option must be defined");
- }
-
- try
- {
- // split factory at ':' to parse out module and callable
- std::vector<std::string> factory_split;
- split(factory_split, factory_, is_any_of(":"));
- if ((factory_split.size() < 1) || (factory_split.size() > 2))
- {
- throw mapnik::datasource_exception(
- std::string("python: factory string must be of the form '[module:]callable' when parsing \"")
- + factory_ + '"');
- }
- // extract the module and the callable
- boost::python::str module_name("__main__"), callable_name;
- if (factory_split.size() == 1)
- {
- callable_name = boost::python::str(factory_split[0]);
- }
- else
- {
- module_name = boost::python::str(factory_split[0]);
- callable_name = boost::python::str(factory_split[1]);
- }
- ensure_gil lock;
- // import the main module from Python (in case we're embedding the
- // interpreter directly) and also import the callable.
- boost::python::object main_module = boost::python::import("__main__");
- boost::python::object callable_module = boost::python::import(module_name);
- boost::python::object callable = callable_module.attr(callable_name);
- // prepare the arguments
- boost::python::dict kwargs;
- using kv_type = std::map<std::string, std::string>::value_type;
- for (kv_type const& kv : kwargs_)
- {
- kwargs[boost::python::str(kv.first)] = boost::python::str(kv.second);
- }
-
- // get our wrapped data source
- datasource_ = callable(*boost::python::make_tuple(), **kwargs);
- }
- catch ( boost::python::error_already_set )
- {
- throw mapnik::datasource_exception(extractException());
- }
-}
-
-python_datasource::~python_datasource() { }
-
-// This name must match the plugin filename, eg 'python.input'
-const char* python_datasource::name_="python";
-
-const char* python_datasource::name()
-{
- return name_;
-}
-
-mapnik::layer_descriptor python_datasource::get_descriptor() const
-{
- return desc_;
-}
-
-mapnik::datasource::datasource_t python_datasource::type() const
-{
- try
- {
- ensure_gil lock;
- boost::python::object data_type = datasource_.attr("data_type");
- long data_type_integer = boost::python::extract<long>(data_type);
- return mapnik::datasource::datasource_t(data_type_integer);
- }
- catch ( boost::python::error_already_set )
- {
- throw mapnik::datasource_exception(extractException());
- }
-
-}
-
-mapnik::box2d<double> python_datasource::envelope() const
-{
- mapnik::box2d<double> box;
- try
- {
- ensure_gil lock;
- if (!PyObject_HasAttrString(datasource_.ptr(), "envelope"))
- {
- throw mapnik::datasource_exception("Python: could not access envelope property");
- }
- else
- {
- boost::python::object py_envelope = datasource_.attr("envelope");
- if (py_envelope.ptr() == boost::python::object().ptr())
- {
- throw mapnik::datasource_exception("Python: could not access envelope property");
- }
- else
- {
- boost::python::extract<double> ex(py_envelope.attr("minx"));
- if (!ex.check()) throw mapnik::datasource_exception("Python: could not convert envelope.minx");
- box.set_minx(ex());
- boost::python::extract<double> ex1(py_envelope.attr("miny"));
- if (!ex1.check()) throw mapnik::datasource_exception("Python: could not convert envelope.miny");
- box.set_miny(ex1());
- boost::python::extract<double> ex2(py_envelope.attr("maxx"));
- if (!ex2.check()) throw mapnik::datasource_exception("Python: could not convert envelope.maxx");
- box.set_maxx(ex2());
- boost::python::extract<double> ex3(py_envelope.attr("maxy"));
- if (!ex3.check()) throw mapnik::datasource_exception("Python: could not convert envelope.maxy");
- box.set_maxy(ex3());
- }
- }
- }
- catch ( boost::python::error_already_set )
- {
- throw mapnik::datasource_exception(extractException());
- }
- return box;
-}
-
-boost::optional<mapnik::datasource::geometry_t> python_datasource::get_geometry_type() const
-{
- using return_type = boost::optional<mapnik::datasource::geometry_t>;
-
- try
- {
- ensure_gil lock;
- // if the datasource object has no geometry_type attribute, return a 'none' value
- if (!PyObject_HasAttrString(datasource_.ptr(), "geometry_type"))
- {
- return return_type();
- }
- boost::python::object py_geometry_type = datasource_.attr("geometry_type");
- // if the attribute value is 'None', return a 'none' value
- if (py_geometry_type.ptr() == boost::python::object().ptr())
- {
- return return_type();
- }
- long geom_type_integer = boost::python::extract<long>(py_geometry_type);
- return mapnik::datasource::geometry_t(geom_type_integer);
- }
- catch ( boost::python::error_already_set )
- {
- throw mapnik::datasource_exception(extractException());
- }
-}
-
-mapnik::featureset_ptr python_datasource::features(mapnik::query const& q) const
-{
- try
- {
- // if the query box intersects our world extent then query for features
- if (envelope().intersects(q.get_bbox()))
- {
- ensure_gil lock;
- boost::python::object features(datasource_.attr("features")(q));
- // if 'None' was returned, return an empty feature set
- if(features.ptr() == boost::python::object().ptr())
- {
- return mapnik::featureset_ptr();
- }
- return std::make_shared<python_featureset>(features);
- }
- // otherwise return an empty featureset pointer
- return mapnik::featureset_ptr();
- }
- catch ( boost::python::error_already_set )
- {
- throw mapnik::datasource_exception(extractException());
- }
-}
-
-mapnik::featureset_ptr python_datasource::features_at_point(mapnik::coord2d const& pt, double tol) const
-{
-
- try
- {
- ensure_gil lock;
- boost::python::object features(datasource_.attr("features_at_point")(pt));
- // if we returned none, return an empty set
- if(features.ptr() == boost::python::object().ptr())
- {
- return mapnik::featureset_ptr();
- }
- // otherwise, return a feature set which can iterate over the iterator
- return std::make_shared<python_featureset>(features);
- }
- catch ( boost::python::error_already_set )
- {
- throw mapnik::datasource_exception(extractException());
- }
-
-}
diff --git a/plugins/input/python/python_datasource.hpp b/plugins/input/python/python_datasource.hpp
deleted file mode 100644
index 599f4c6..0000000
--- a/plugins/input/python/python_datasource.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef PYTHON_DATASOURCE_HPP
-#define PYTHON_DATASOURCE_HPP
-
-// mapnik
-#include <mapnik/datasource.hpp>
-
-// boost
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-#include <boost/python.hpp>
-#pragma GCC diagnostic pop
-
-class python_datasource : public mapnik::datasource
-{
-public:
- // constructor
- // arguments must not change
- python_datasource(mapnik::parameters const& params);
-
- // destructor
- virtual ~python_datasource ();
-
- // mandatory: type of the plugin, used to match at runtime
- mapnik::datasource::datasource_t type() const;
-
- // mandatory: name of the plugin
- static const char* name();
-
- // mandatory: function to query features by box2d
- // this is called when rendering, specifically in feature_style_processor.hpp
- mapnik::featureset_ptr features(mapnik::query const& q) const;
-
- // mandatory: function to query features by point (coord2d)
- // not used by rendering, but available to calling applications
- mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt, double tol = 0) const;
-
- // mandatory: return the box2d of the datasource
- // called during rendering to determine if the layer should be processed
- mapnik::box2d<double> envelope() const;
-
- // mandatory: optionally return the overal geometry type of the datasource
- boost::optional<mapnik::datasource::geometry_t> get_geometry_type() const;
-
- // mandatory: return the layer descriptor
- mapnik::layer_descriptor get_descriptor() const;
-
-private:
- static const char* name_;
- mapnik::layer_descriptor desc_;
- const std::string factory_;
- std::map<std::string, std::string> kwargs_;
- boost::python::object datasource_;
-};
-
-
-#endif // PYTHON_DATASOURCE_HPP
diff --git a/plugins/input/python/python_featureset.cpp b/plugins/input/python/python_featureset.cpp
deleted file mode 100644
index bbd5939..0000000
--- a/plugins/input/python/python_featureset.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-#include "python_featureset.hpp"
-#include "python_utils.hpp"
-
-// boost
-#include <boost/python.hpp>
-
-python_featureset::python_featureset(boost::python::object iterator)
-{
- ensure_gil lock;
- begin_ = boost::python::stl_input_iterator<mapnik::feature_ptr>(iterator);
-}
-
-python_featureset::~python_featureset()
-{
- ensure_gil lock;
- begin_ = end_;
-}
-
-mapnik::feature_ptr python_featureset::next()
-{
- // checking to see if we've reached the end does not require the GIL.
- if(begin_ == end_)
- return mapnik::feature_ptr();
-
- // getting the next feature might call into the interpreter and so the GIL must be held.
- ensure_gil lock;
-
- return *(begin_++);
-}
-
diff --git a/plugins/input/python/python_featureset.hpp b/plugins/input/python/python_featureset.hpp
deleted file mode 100644
index af024be..0000000
--- a/plugins/input/python/python_featureset.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef PYTHON_FEATURESET_HPP
-#define PYTHON_FEATURESET_HPP
-
-// mapnik
-#include <mapnik/config.hpp>
-#include <mapnik/feature.hpp>
-
-// boost
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-#include <boost/python.hpp>
-#include <boost/python/stl_iterator.hpp>
-#pragma GCC diagnostic pop
-
-// mapnik
-#include <mapnik/datasource.hpp>
-
-class python_featureset : public mapnik::Featureset
-{
-public:
- // this constructor can have any arguments you need
- python_featureset(boost::python::object iterator);
-
- // desctructor
- virtual ~python_featureset();
-
- // mandatory: you must expose a next() method, called when rendering
- mapnik::feature_ptr next();
-
-private:
- using feature_iter = boost::python::stl_input_iterator<mapnik::feature_ptr>;
-
- feature_iter begin_, end_;
-};
-
-#endif // PYTHON_FEATURESET_HPP
diff --git a/plugins/input/python/python_utils.cpp b/plugins/input/python/python_utils.cpp
deleted file mode 100644
index 159bf70..0000000
--- a/plugins/input/python/python_utils.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-#include "python_utils.hpp"
-
-std::string extractException()
-{
- using namespace boost::python;
-
- PyObject *exc,*val,*tb;
- PyErr_Fetch(&exc,&val,&tb);
- PyErr_NormalizeException(&exc,&val,&tb);
- handle<> hexc(exc),hval(allow_null(val)),htb(allow_null(tb));
- if(!hval)
- {
- return extract<std::string>(str(hexc));
- }
- else
- {
- object traceback(import("traceback"));
- object format_exception(traceback.attr("format_exception"));
- object formatted_list(format_exception(hexc,hval,htb));
- object formatted(str("").join(formatted_list));
- return extract<std::string>(formatted);
- }
-}
diff --git a/plugins/input/python/python_utils.hpp b/plugins/input/python/python_utils.hpp
deleted file mode 100644
index 5ddc380..0000000
--- a/plugins/input/python/python_utils.hpp
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef PYTHON_UTILS_HPP
-#define PYTHON_UTILS_HPP
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-#include <boost/python.hpp>
-#pragma GCC diagnostic pop
-
-// Use RAII to acquire and release the GIL as needed.
-class ensure_gil
-{
- public:
- ensure_gil() : gil_state_(PyGILState_Ensure()) {}
- ~ensure_gil() { PyGILState_Release( gil_state_ ); }
- protected:
- PyGILState_STATE gil_state_;
-};
-
-std::string extractException();
-
-#endif // PYTHON_UTILS_HPP
diff --git a/plugins/input/raster/raster_datasource.cpp b/plugins/input/raster/raster_datasource.cpp
index 13d996e..e1a7c29 100644
--- a/plugins/input/raster/raster_datasource.cpp
+++ b/plugins/input/raster/raster_datasource.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -84,6 +84,16 @@ raster_datasource::raster_datasource(parameters const& params)
{
extent_initialized_ = extent_.from_string(*ext);
}
+ else //bounding box from image_reader
+ {
+ std::unique_ptr<image_reader> reader(mapnik::get_image_reader(*file));
+ auto bbox = reader->bounding_box();
+ if (bbox)
+ {
+ extent_ = *bbox;
+ extent_initialized_ = true;
+ }
+ }
if (! extent_initialized_)
{
@@ -161,9 +171,9 @@ mapnik::box2d<double> raster_datasource::envelope() const
return extent_;
}
-boost::optional<mapnik::datasource::geometry_t> raster_datasource::get_geometry_type() const
+boost::optional<mapnik::datasource_geometry_t> raster_datasource::get_geometry_type() const
{
- return boost::optional<mapnik::datasource::geometry_t>();
+ return boost::optional<mapnik::datasource_geometry_t>();
}
layer_descriptor raster_datasource::get_descriptor() const
diff --git a/plugins/input/raster/raster_datasource.hpp b/plugins/input/raster/raster_datasource.hpp
index 96bcaf1..0cb7ad4 100644
--- a/plugins/input/raster/raster_datasource.hpp
+++ b/plugins/input/raster/raster_datasource.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -51,7 +51,7 @@ public:
mapnik::featureset_ptr features(const mapnik::query& q) const;
mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt, double tol = 0) const;
mapnik::box2d<double> envelope() const;
- boost::optional<mapnik::datasource::geometry_t> get_geometry_type() const;
+ boost::optional<mapnik::datasource_geometry_t> get_geometry_type() const;
mapnik::layer_descriptor get_descriptor() const;
bool log_enabled() const;
diff --git a/plugins/input/raster/raster_featureset.cpp b/plugins/input/raster/raster_featureset.cpp
index b396abb..4bf9557 100644
--- a/plugins/input/raster/raster_featureset.cpp
+++ b/plugins/input/raster/raster_featureset.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,12 +22,13 @@
// mapnik
#include <mapnik/debug.hpp>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
#include <mapnik/raster.hpp>
#include <mapnik/view_transform.hpp>
#include <mapnik/image_reader.hpp>
#include <mapnik/image_util.hpp>
#include <mapnik/feature_factory.hpp>
+#include <mapnik/util/variant.hpp>
// boost
#pragma GCC diagnostic push
@@ -42,7 +43,7 @@
using mapnik::query;
using mapnik::image_reader;
using mapnik::feature_ptr;
-using mapnik::image_data_32;
+using mapnik::image_rgba8;
using mapnik::raster;
using mapnik::feature_factory;
@@ -113,10 +114,8 @@ feature_ptr raster_featureset<LookupPolicy>::next()
rem.maxx() + x_off + width,
rem.maxy() + y_off + height);
intersect = t.backward(feature_raster_extent);
-
- mapnik::raster_ptr raster = std::make_shared<mapnik::raster>(intersect, width, height, 1.0);
- reader->read(x_off, y_off, raster->data_);
- raster->premultiplied_alpha_ = reader->premultiplied_alpha();
+ mapnik::image_any data = reader->read(x_off, y_off, width, height);
+ mapnik::raster_ptr raster = std::make_shared<mapnik::raster>(intersect, std::move(data), 1.0);
feature->set_raster(raster);
}
}
diff --git a/plugins/input/raster/raster_featureset.hpp b/plugins/input/raster/raster_featureset.hpp
index 18e3ebc..fed7bba 100644
--- a/plugins/input/raster/raster_featureset.hpp
+++ b/plugins/input/raster/raster_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/raster/raster_info.cpp b/plugins/input/raster/raster_info.cpp
index 10bd797..9b04983 100644
--- a/plugins/input/raster/raster_info.cpp
+++ b/plugins/input/raster/raster_info.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/raster/raster_info.hpp b/plugins/input/raster/raster_info.hpp
index 4de9485..2bf5ba9 100644
--- a/plugins/input/raster/raster_info.hpp
+++ b/plugins/input/raster/raster_info.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/rasterlite/build.py b/plugins/input/rasterlite/build.py
index 4b46383..7100b1e 100644
--- a/plugins/input/rasterlite/build.py
+++ b/plugins/input/rasterlite/build.py
@@ -38,6 +38,15 @@ libraries = [env['PLUGINS']['rasterlite']['lib']]
libraries.append(env['ICU_LIB_NAME'])
libraries.append('boost_system%s' % env['BOOST_APPEND'])
+if env['RUNTIME_LINK'] == 'static':
+ libraries.append('geotiff')
+ libraries.append('spatialite')
+ libraries.append('sqlite3')
+ libraries.append('geos_c')
+ libraries.append('geos')
+ libraries.append('proj')
+ libraries.append('z')
+
if env['PLUGIN_LINKING'] == 'shared':
libraries.append(env['MAPNIK_NAME'])
diff --git a/plugins/input/rasterlite/rasterlite_datasource.cpp b/plugins/input/rasterlite/rasterlite_datasource.cpp
index b6e0755..f370f19 100644
--- a/plugins/input/rasterlite/rasterlite_datasource.cpp
+++ b/plugins/input/rasterlite/rasterlite_datasource.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -168,9 +168,9 @@ box2d<double> rasterlite_datasource::envelope() const
return extent_;
}
-boost::optional<mapnik::datasource::geometry_t> rasterlite_datasource::get_geometry_type() const
+boost::optional<mapnik::datasource_geometry_t> rasterlite_datasource::get_geometry_type() const
{
- return boost::optional<mapnik::datasource::geometry_t>();
+ return boost::optional<mapnik::datasource_geometry_t>();
}
layer_descriptor rasterlite_datasource::get_descriptor() const
diff --git a/plugins/input/rasterlite/rasterlite_datasource.hpp b/plugins/input/rasterlite/rasterlite_datasource.hpp
index da52577..dcb1a13 100644
--- a/plugins/input/rasterlite/rasterlite_datasource.hpp
+++ b/plugins/input/rasterlite/rasterlite_datasource.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -52,7 +52,7 @@ public:
mapnik::featureset_ptr features(mapnik::query const& q) const;
mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt, double tol = 0) const;
mapnik::box2d<double> envelope() const;
- boost::optional<mapnik::datasource::geometry_t> get_geometry_type() const;
+ boost::optional<mapnik::datasource_geometry_t> get_geometry_type() const;
mapnik::layer_descriptor get_descriptor() const;
private:
diff --git a/plugins/input/rasterlite/rasterlite_featureset.cpp b/plugins/input/rasterlite/rasterlite_featureset.cpp
index 3c32c69..14e2f3d 100644
--- a/plugins/input/rasterlite/rasterlite_featureset.cpp
+++ b/plugins/input/rasterlite/rasterlite_featureset.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,7 @@
// mapnik
#include <mapnik/debug.hpp>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
#include <mapnik/image_util.hpp>
#include <mapnik/query.hpp>
#include <mapnik/raster.hpp>
@@ -114,19 +114,10 @@ feature_ptr rasterlite_featureset::get_feature(mapnik::query const& q)
{
if (size > 0)
{
- mapnik::raster_ptr rasterp = std::make_shared<mapnik::raster>(intersect, width, height);
- mapnik::image_data_32 & image = rasterp->data_;
- image.set(0xffffffff);
-
+ mapnik::image_rgba8 image(width,height);
unsigned char* raster_data = static_cast<unsigned char*>(raster);
- unsigned char* image_data = image.getBytes();
-
- std::memcpy(image_data, raster_data, size);
-
- feature->set_raster(rasterp);
-
- free (raster);
-
+ std::memcpy(image.bytes(), raster_data, size);
+ feature->set_raster(std::make_shared<mapnik::raster>(intersect, std::move(image), 1.0));
MAPNIK_LOG_DEBUG(rasterlite) << "rasterlite_featureset: Done";
}
else
diff --git a/plugins/input/rasterlite/rasterlite_featureset.hpp b/plugins/input/rasterlite/rasterlite_featureset.hpp
index 63be0db..cf7973f 100644
--- a/plugins/input/rasterlite/rasterlite_featureset.hpp
+++ b/plugins/input/rasterlite/rasterlite_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -35,7 +35,7 @@ using rasterlite_query = mapnik::util::variant<mapnik::query,mapnik::coord2d>;
class rasterlite_featureset : public mapnik::Featureset
{
- struct query_dispatch : public mapnik::util::static_visitor<mapnik::feature_ptr>
+ struct query_dispatch
{
query_dispatch( rasterlite_featureset & featureset)
: featureset_(featureset) {}
diff --git a/plugins/input/rasterlite/rasterlite_include.hpp b/plugins/input/rasterlite/rasterlite_include.hpp
index b94eb48..4662e84 100644
--- a/plugins/input/rasterlite/rasterlite_include.hpp
+++ b/plugins/input/rasterlite/rasterlite_include.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/shape/dbf_test.cpp b/plugins/input/shape/dbf_test.cpp
index c521dc7..b9917a9 100644
--- a/plugins/input/shape/dbf_test.cpp
+++ b/plugins/input/shape/dbf_test.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/shape/dbfile.cpp b/plugins/input/shape/dbfile.cpp
index cada173..5b1c76e 100644
--- a/plugins/input/shape/dbfile.cpp
+++ b/plugins/input/shape/dbfile.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/shape/dbfile.hpp b/plugins/input/shape/dbfile.hpp
index 29aaefa..75e77d3 100644
--- a/plugins/input/shape/dbfile.hpp
+++ b/plugins/input/shape/dbfile.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,7 @@
// mapnik
#include <mapnik/feature.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/unicode.hpp>
#ifdef SHAPE_MEMORY_MAPPED_FILE
#include <mapnik/mapped_memory_cache.hpp>
@@ -52,7 +52,7 @@ struct field_descriptor
};
-class dbf_file : private mapnik::noncopyable
+class dbf_file : private mapnik::util::noncopyable
{
private:
int num_records_;
diff --git a/plugins/input/shape/shape_datasource.cpp b/plugins/input/shape/shape_datasource.cpp
index a649c75..152e107 100644
--- a/plugins/input/shape/shape_datasource.cpp
+++ b/plugins/input/shape/shape_datasource.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -301,13 +301,13 @@ box2d<double> shape_datasource::envelope() const
return extent_;
}
-boost::optional<mapnik::datasource::geometry_t> shape_datasource::get_geometry_type() const
+boost::optional<mapnik::datasource_geometry_t> shape_datasource::get_geometry_type() const
{
#ifdef MAPNIK_STATS
mapnik::progress_timer __stats__(std::clog, "shape_datasource::get_geometry_type");
#endif
- boost::optional<mapnik::datasource::geometry_t> result;
+ boost::optional<mapnik::datasource_geometry_t> result;
switch (shape_type_)
{
case shape_io::shape_point:
@@ -317,21 +317,21 @@ boost::optional<mapnik::datasource::geometry_t> shape_datasource::get_geometry_t
case shape_io::shape_multipointm:
case shape_io::shape_multipointz:
{
- result.reset(mapnik::datasource::Point);
+ result.reset(mapnik::datasource_geometry_t::Point);
break;
}
case shape_io::shape_polyline:
case shape_io::shape_polylinem:
case shape_io::shape_polylinez:
{
- result.reset(mapnik::datasource::LineString);
+ result.reset(mapnik::datasource_geometry_t::LineString);
break;
}
case shape_io::shape_polygon:
case shape_io::shape_polygonm:
case shape_io::shape_polygonz:
{
- result.reset(mapnik::datasource::Polygon);
+ result.reset(mapnik::datasource_geometry_t::Polygon);
break;
}
default:
diff --git a/plugins/input/shape/shape_datasource.hpp b/plugins/input/shape/shape_datasource.hpp
index ae1894d..586496b 100644
--- a/plugins/input/shape/shape_datasource.hpp
+++ b/plugins/input/shape/shape_datasource.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -60,9 +60,8 @@ public:
featureset_ptr features(query const& q) const;
featureset_ptr features_at_point(coord2d const& pt, double tol = 0) const;
box2d<double> envelope() const;
- boost::optional<mapnik::datasource::geometry_t> get_geometry_type() const;
+ boost::optional<mapnik::datasource_geometry_t> get_geometry_type() const;
layer_descriptor get_descriptor() const;
-
private:
void init(shape_io& shape);
diff --git a/plugins/input/shape/shape_featureset.cpp b/plugins/input/shape/shape_featureset.cpp
index 7ae4a64..6367cbf 100644
--- a/plugins/input/shape/shape_featureset.cpp
+++ b/plugins/input/shape/shape_featureset.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -33,7 +33,6 @@
#include "shape_featureset.hpp"
#include "shape_utils.hpp"
-using mapnik::geometry_type;
using mapnik::feature_factory;
using mapnik::context_ptr;
@@ -88,9 +87,7 @@ feature_ptr shape_featureset<filterT>::next()
double y = record.read_double();
if (!filter_.pass(mapnik::box2d<double>(x,y,x,y)))
continue;
- std::unique_ptr<geometry_type> point(new geometry_type(mapnik::geometry_type::types::Point));
- point->move_to(x, y);
- feature->paths().push_back(point.release());
+ feature->set_geometry(mapnik::geometry::point<double>(x,y));
break;
}
case shape_io::shape_multipoint:
@@ -100,14 +97,14 @@ feature_ptr shape_featureset<filterT>::next()
shape_io::read_bbox(record, feature_bbox_);
if (!filter_.pass(feature_bbox_)) continue;
int num_points = record.read_ndr_integer();
+ mapnik::geometry::multi_point<double> multi_point;
for (int i = 0; i < num_points; ++i)
{
double x = record.read_double();
double y = record.read_double();
- std::unique_ptr<geometry_type> point(new geometry_type(mapnik::geometry_type::types::Point));
- point->move_to(x, y);
- feature->paths().push_back(point.release());
+ multi_point.emplace_back(mapnik::geometry::point<double>(x, y));
}
+ feature->set_geometry(std::move(multi_point));
break;
}
@@ -117,7 +114,7 @@ feature_ptr shape_featureset<filterT>::next()
{
shape_io::read_bbox(record, feature_bbox_);
if (!filter_.pass(feature_bbox_)) continue;
- shape_io::read_polyline(record, feature->paths());
+ feature->set_geometry(shape_io::read_polyline(record));
break;
}
case shape_io::shape_polygon:
@@ -126,7 +123,7 @@ feature_ptr shape_featureset<filterT>::next()
{
shape_io::read_bbox(record, feature_bbox_);
if (!filter_.pass(feature_bbox_)) continue;
- shape_io::read_polygon(record, feature->paths());
+ feature->set_geometry(shape_io::read_polygon(record));
break;
}
default :
diff --git a/plugins/input/shape/shape_featureset.hpp b/plugins/input/shape/shape_featureset.hpp
index a71e59e..4ce235e 100644
--- a/plugins/input/shape/shape_featureset.hpp
+++ b/plugins/input/shape/shape_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/shape/shape_index_featureset.cpp b/plugins/input/shape/shape_index_featureset.cpp
index 2ff18cd..89628fa 100644
--- a/plugins/input/shape/shape_index_featureset.cpp
+++ b/plugins/input/shape/shape_index_featureset.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -42,7 +42,6 @@
#include "shp_index.hpp"
using mapnik::feature_factory;
-using mapnik::geometry_type;
template <typename filterT>
shape_index_featureset<filterT>::shape_index_featureset(filterT const& filter,
@@ -104,9 +103,7 @@ feature_ptr shape_index_featureset<filterT>::next()
{
double x = record.read_double();
double y = record.read_double();
- std::unique_ptr<geometry_type> point(new geometry_type(mapnik::geometry_type::types::Point));
- point->move_to(x, y);
- feature->paths().push_back(point.release());
+ feature->set_geometry(mapnik::geometry::point<double>(x,y));
break;
}
case shape_io::shape_multipoint:
@@ -116,14 +113,14 @@ feature_ptr shape_index_featureset<filterT>::next()
shape_io::read_bbox(record, feature_bbox_);
if (!filter_.pass(feature_bbox_)) continue;
int num_points = record.read_ndr_integer();
+ mapnik::geometry::multi_point<double> multi_point;
for (int i = 0; i < num_points; ++i)
{
double x = record.read_double();
double y = record.read_double();
- std::unique_ptr<geometry_type> point(new geometry_type(mapnik::geometry_type::types::Point));
- point->move_to(x, y);
- feature->paths().push_back(point.release());
+ multi_point.emplace_back(mapnik::geometry::point<double>(x, y));
}
+ feature->set_geometry(std::move(multi_point));
break;
}
case shape_io::shape_polyline:
@@ -132,7 +129,7 @@ feature_ptr shape_index_featureset<filterT>::next()
{
shape_io::read_bbox(record, feature_bbox_);
if (!filter_.pass(feature_bbox_)) continue;
- shape_io::read_polyline(record,feature->paths());
+ feature->set_geometry(shape_io::read_polyline(record));
break;
}
case shape_io::shape_polygon:
@@ -141,7 +138,7 @@ feature_ptr shape_index_featureset<filterT>::next()
{
shape_io::read_bbox(record, feature_bbox_);
if (!filter_.pass(feature_bbox_)) continue;
- shape_io::read_polygon(record,feature->paths());
+ feature->set_geometry(shape_io::read_polygon(record));
break;
}
default :
diff --git a/plugins/input/shape/shape_index_featureset.hpp b/plugins/input/shape/shape_index_featureset.hpp
index cc1715b..d62d8ed 100644
--- a/plugins/input/shape/shape_index_featureset.hpp
+++ b/plugins/input/shape/shape_index_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/shape/shape_io.cpp b/plugins/input/shape/shape_io.cpp
index ec1e134..889fe28 100644
--- a/plugins/input/shape/shape_io.cpp
+++ b/plugins/input/shape/shape_io.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,13 +26,10 @@
#include <mapnik/debug.hpp>
#include <mapnik/make_unique.hpp>
#include <mapnik/datasource.hpp>
-#include <mapnik/geom_util.hpp>
-
-// boost
+#include <mapnik/util/is_clockwise.hpp>
+#include <mapnik/geometry_correct.hpp>
using mapnik::datasource_exception;
-using mapnik::geometry_type;
-using mapnik::hit_test_first;
const std::string shape_io::SHP = ".shp";
const std::string shape_io::DBF = ".dbf";
const std::string shape_io::INDEX = ".index";
@@ -91,24 +88,24 @@ void shape_io::read_bbox(shape_file::record_type & record, mapnik::box2d<double>
bbox.init(lox, loy, hix, hiy);
}
-void shape_io::read_polyline( shape_file::record_type & record, mapnik::geometry_container & geom)
+mapnik::geometry::geometry<double> shape_io::read_polyline(shape_file::record_type & record)
{
+ mapnik::geometry::geometry<double> geom; // default empty
int num_parts = record.read_ndr_integer();
int num_points = record.read_ndr_integer();
+
if (num_parts == 1)
{
- std::unique_ptr<geometry_type> line(new geometry_type(mapnik::geometry_type::types::LineString));
+ mapnik::geometry::line_string<double> line;
+ line.reserve(num_points);
record.skip(4);
- double x = record.read_double();
- double y = record.read_double();
- line->move_to(x, y);
- for (int i = 1; i < num_points; ++i)
+ for (int i = 0; i < num_points; ++i)
{
- x = record.read_double();
- y = record.read_double();
- line->line_to(x, y);
+ double x = record.read_double();
+ double y = record.read_double();
+ line.add_coord(x, y);
}
- geom.push_back(line.release());
+ geom = std::move(line);
}
else
{
@@ -119,9 +116,9 @@ void shape_io::read_polyline( shape_file::record_type & record, mapnik::geometry
}
int start, end;
+ mapnik::geometry::multi_line_string<double> multi_line;
for (int k = 0; k < num_parts; ++k)
{
- std::unique_ptr<geometry_type> line(new geometry_type(mapnik::geometry_type::types::LineString));
start = parts[k];
if (k == num_parts - 1)
{
@@ -132,25 +129,28 @@ void shape_io::read_polyline( shape_file::record_type & record, mapnik::geometry
end = parts[k + 1];
}
- double x = record.read_double();
- double y = record.read_double();
- line->move_to(x, y);
-
- for (int j = start + 1; j < end; ++j)
+ mapnik::geometry::line_string<double> line;
+ line.reserve(end - start);
+ for (int j = start; j < end; ++j)
{
- x = record.read_double();
- y = record.read_double();
- line->line_to(x, y);
+ double x = record.read_double();
+ double y = record.read_double();
+ line.add_coord(x, y);
}
- geom.push_back(line.release());
+ multi_line.push_back(std::move(line));
}
+ geom = std::move(multi_line);
}
+ return geom;
}
-void shape_io::read_polygon(shape_file::record_type & record, mapnik::geometry_container & geom)
+
+mapnik::geometry::geometry<double> shape_io::read_polygon(shape_file::record_type & record)
{
+ mapnik::geometry::geometry<double> geom; // default empty
int num_parts = record.read_ndr_integer();
int num_points = record.read_ndr_integer();
+
std::vector<int> parts(num_parts);
for (int i = 0; i < num_parts; ++i)
@@ -158,35 +158,44 @@ void shape_io::read_polygon(shape_file::record_type & record, mapnik::geometry_c
parts[i] = record.read_ndr_integer();
}
- std::unique_ptr<geometry_type> poly(new geometry_type(mapnik::geometry_type::types::Polygon));
+ mapnik::geometry::multi_polygon<double> multi_poly;
+ mapnik::geometry::polygon<double> poly;
for (int k = 0; k < num_parts; ++k)
{
int start = parts[k];
int end;
- if (k == num_parts - 1)
+ if (k == num_parts - 1) end = num_points;
+ else end = parts[k + 1];
+ mapnik::geometry::linear_ring<double> ring;
+ ring.reserve(end - start);
+ for (int j = start; j < end; ++j)
{
- end = num_points;
+ double x = record.read_double();
+ double y = record.read_double();
+ ring.emplace_back(x, y);
}
- else
+ if (k == 0)
{
- end = parts[k + 1];
+ poly.set_exterior_ring(std::move(ring));
}
-
- double x = record.read_double();
- double y = record.read_double();
- if (k > 0 && !hit_test_first(*poly, x, y))
+ else if (mapnik::util::is_clockwise(ring))
{
- geom.push_back(poly.release());
- poly.reset(new geometry_type(mapnik::geometry_type::types::Polygon));
+ multi_poly.emplace_back(std::move(poly));
+ poly.interior_rings.clear();
+ poly.set_exterior_ring(std::move(ring));
}
- poly->move_to(x, y);
- for (int j = start + 1; j < end; ++j)
+ else
{
- x = record.read_double();
- y = record.read_double();
- poly->line_to(x, y);
+ poly.add_hole(std::move(ring));
}
- poly->close_path();
}
- geom.push_back(poly.release());
+ if (multi_poly.size() > 0) // multi
+ {
+ multi_poly.emplace_back(std::move(poly));
+ geom = std::move(multi_poly);
+ } else {
+ geom = std::move(poly);
+ }
+ mapnik::geometry::correct(geom);
+ return geom;
}
diff --git a/plugins/input/shape/shape_io.hpp b/plugins/input/shape/shape_io.hpp
index 727310c..ebf31da 100644
--- a/plugins/input/shape/shape_io.hpp
+++ b/plugins/input/shape/shape_io.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,9 +24,8 @@
#define SHAPE_IO_HPP
// mapnik
-#include <mapnik/geometry.hpp>
#include <mapnik/box2d.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// boost
#include <boost/optional.hpp>
@@ -37,7 +36,7 @@
#include "dbfile.hpp"
#include "shapefile.hpp"
-struct shape_io : mapnik::noncopyable
+struct shape_io : mapnik::util::noncopyable
{
public:
enum shapeType
@@ -77,8 +76,8 @@ public:
void move_to(std::streampos pos);
static void read_bbox(shape_file::record_type & record, mapnik::box2d<double> & bbox);
- static void read_polyline(shape_file::record_type & record,mapnik::geometry_container & geom);
- static void read_polygon(shape_file::record_type & record,mapnik::geometry_container & geom);
+ static mapnik::geometry::geometry<double> read_polyline(shape_file::record_type & record);
+ static mapnik::geometry::geometry<double> read_polygon(shape_file::record_type & record);
shapeType type_;
shape_file shp_;
diff --git a/plugins/input/shape/shape_utils.cpp b/plugins/input/shape/shape_utils.cpp
index 0f90878..9495fda 100644
--- a/plugins/input/shape/shape_utils.cpp
+++ b/plugins/input/shape/shape_utils.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/shape/shape_utils.hpp b/plugins/input/shape/shape_utils.hpp
index f113d3d..eda62a8 100644
--- a/plugins/input/shape/shape_utils.hpp
+++ b/plugins/input/shape/shape_utils.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/shape/shapefile.hpp b/plugins/input/shape/shapefile.hpp
index bd2740a..3e35544 100644
--- a/plugins/input/shape/shapefile.hpp
+++ b/plugins/input/shape/shapefile.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -38,7 +38,7 @@
#include <mapnik/mapped_memory_cache.hpp>
#include <boost/interprocess/streams/bufferstream.hpp>
#endif
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
using mapnik::box2d;
using mapnik::read_int32_ndr;
@@ -131,7 +131,7 @@ struct shape_record
}
};
-class shape_file : mapnik::noncopyable
+class shape_file : mapnik::util::noncopyable
{
public:
@@ -220,30 +220,13 @@ public:
inline double read_double()
{
double val;
-#ifndef MAPNIK_BIG_ENDIAN
file_.read(reinterpret_cast<char*>(&val), 8);
-#else
- char b[8];
- file_.read(b, 8);
- read_double_ndr(b, val);
-#endif
return val;
}
inline void read_envelope(box2d<double>& envelope)
{
-#ifndef MAPNIK_BIG_ENDIAN
file_.read(reinterpret_cast<char*>(&envelope), sizeof(envelope));
-#else
- char data[4 * 8];
- file_.read(data,4 * 8);
- double minx, miny, maxx, maxy;
- read_double_ndr(data + 0 * 8, minx);
- read_double_ndr(data + 1 * 8, miny);
- read_double_ndr(data + 2 * 8, maxx);
- read_double_ndr(data + 3 * 8, maxy);
- envelope.init(minx, miny, maxx, maxy);
-#endif
}
inline void skip(std::streampos bytes)
diff --git a/plugins/input/shape/shp_index.hpp b/plugins/input/shape/shp_index.hpp
index 1d69b5d..bb033e9 100644
--- a/plugins/input/shape/shp_index.hpp
+++ b/plugins/input/shape/shp_index.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/sqlite/sqlite_connection.hpp b/plugins/input/sqlite/sqlite_connection.hpp
index 244c577..c7bd11f 100644
--- a/plugins/input/sqlite/sqlite_connection.hpp
+++ b/plugins/input/sqlite/sqlite_connection.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/sqlite/sqlite_datasource.cpp b/plugins/input/sqlite/sqlite_datasource.cpp
index 25f727b..9c837bd 100644
--- a/plugins/input/sqlite/sqlite_datasource.cpp
+++ b/plugins/input/sqlite/sqlite_datasource.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -34,6 +34,7 @@
#include <mapnik/wkb.hpp>
#include <mapnik/util/trim.hpp>
#include <mapnik/util/fs.hpp>
+#include <mapnik/geometry_is_empty.hpp>
// boost
#include <boost/algorithm/string.hpp>
@@ -417,16 +418,16 @@ box2d<double> sqlite_datasource::envelope() const
return extent_;
}
-boost::optional<mapnik::datasource::geometry_t> sqlite_datasource::get_geometry_type() const
+boost::optional<mapnik::datasource_geometry_t> sqlite_datasource::get_geometry_type() const
{
#ifdef MAPNIK_STATS
mapnik::progress_timer __stats__(std::clog, "sqlite_datasource::get_geometry_type");
#endif
- boost::optional<mapnik::datasource::geometry_t> result;
+ boost::optional<mapnik::datasource_geometry_t> result;
if (dataset_)
{
- // finally, get geometry type by querying first feature
+ // get geometry type by querying first features
std::ostringstream s;
s << "SELECT " << geometry_field_
<< " FROM " << geometry_table_;
@@ -446,20 +447,22 @@ boost::optional<mapnik::datasource::geometry_t> sqlite_datasource::get_geometry_
const char* data = (const char*) rs->column_blob(0, size);
if (data)
{
- mapnik::geometry_container paths;
- if (mapnik::geometry_utils::from_wkb(paths, data, size, format_))
+
+ mapnik::geometry::geometry<double> geom = mapnik::geometry_utils::from_wkb(data, size, format_);
+ if (mapnik::geometry::is_empty(geom))
+ {
+ continue;
+ }
+ result = mapnik::util::to_ds_type(geom);
+ if (result)
{
- mapnik::util::to_ds_type(paths,result);
- if (result)
+ int type = static_cast<int>(*result);
+ if (multi_type > 0 && multi_type != type)
{
- int type = static_cast<int>(*result);
- if (multi_type > 0 && multi_type != type)
- {
- result.reset(mapnik::datasource::Collection);
- return result;
- }
- multi_type = type;
+ result.reset(mapnik::datasource_geometry_t::Collection);
+ return result;
}
+ multi_type = type;
}
}
}
diff --git a/plugins/input/sqlite/sqlite_datasource.hpp b/plugins/input/sqlite/sqlite_datasource.hpp
index db0bcfa..ae21326 100644
--- a/plugins/input/sqlite/sqlite_datasource.hpp
+++ b/plugins/input/sqlite/sqlite_datasource.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -55,7 +55,7 @@ public:
mapnik::featureset_ptr features(mapnik::query const& q) const;
mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt, double tol = 0) const;
mapnik::box2d<double> envelope() const;
- boost::optional<mapnik::datasource::geometry_t> get_geometry_type() const;
+ boost::optional<mapnik::datasource_geometry_t> get_geometry_type() const;
mapnik::layer_descriptor get_descriptor() const;
private:
diff --git a/plugins/input/sqlite/sqlite_featureset.cpp b/plugins/input/sqlite/sqlite_featureset.cpp
index 1153080..e6ee0d4 100644
--- a/plugins/input/sqlite/sqlite_featureset.cpp
+++ b/plugins/input/sqlite/sqlite_featureset.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,13 +24,14 @@
#include <mapnik/global.hpp>
#include <mapnik/debug.hpp>
#include <mapnik/box2d.hpp>
-#include <mapnik/geometry.hpp>
#include <mapnik/feature.hpp>
#include <mapnik/feature_layer_desc.hpp>
#include <mapnik/wkb.hpp>
#include <mapnik/unicode.hpp>
#include <mapnik/value_types.hpp>
#include <mapnik/feature_factory.hpp>
+#include <mapnik/geometry_is_empty.hpp>
+#include <mapnik/geometry_envelope.hpp>
// ogr
#include "sqlite_featureset.hpp"
@@ -80,15 +81,20 @@ feature_ptr sqlite_featureset::next()
}
feature_ptr feature = feature_factory::create(ctx_,rs_->column_integer64(1));
- if (!geometry_utils::from_wkb(feature->paths(), data, size, format_))
+ mapnik::geometry::geometry<double> geom = geometry_utils::from_wkb(data, size, format_);
+ if (mapnik::geometry::is_empty(geom))
+ {
continue;
+ }
if (!spatial_index_)
{
// we are not using r-tree index, check if feature intersects bounding box
- if (!bbox_.intersects(feature->envelope()))
+ box2d<double> bbox = mapnik::geometry::envelope(geom);
+ if (!bbox_.intersects(bbox))
continue;
}
+ feature->set_geometry(std::move(geom));
for (int i = 2; i < rs_->column_count(); ++i)
{
diff --git a/plugins/input/sqlite/sqlite_featureset.hpp b/plugins/input/sqlite/sqlite_featureset.hpp
index 6fc5360..12f3ee0 100644
--- a/plugins/input/sqlite/sqlite_featureset.hpp
+++ b/plugins/input/sqlite/sqlite_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/sqlite/sqlite_prepared.hpp b/plugins/input/sqlite/sqlite_prepared.hpp
index e05e5db..cf81842 100644
--- a/plugins/input/sqlite/sqlite_prepared.hpp
+++ b/plugins/input/sqlite/sqlite_prepared.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -28,7 +28,7 @@
#include <mapnik/datasource.hpp>
#include <mapnik/params.hpp>
#include <mapnik/box2d.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// boost
#include <memory>
@@ -43,7 +43,7 @@ extern "C" {
#include <sqlite3.h>
}
-class prepared_index_statement : mapnik::noncopyable
+class prepared_index_statement : mapnik::util::noncopyable
{
public:
diff --git a/plugins/input/sqlite/sqlite_resultset.hpp b/plugins/input/sqlite/sqlite_resultset.hpp
index e8e6a16..aebd031 100644
--- a/plugins/input/sqlite/sqlite_resultset.hpp
+++ b/plugins/input/sqlite/sqlite_resultset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/plugins/input/sqlite/sqlite_utils.hpp b/plugins/input/sqlite/sqlite_utils.hpp
index 06832f6..b38dd06 100644
--- a/plugins/input/sqlite/sqlite_utils.hpp
+++ b/plugins/input/sqlite/sqlite_utils.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -34,9 +34,10 @@
#include <mapnik/utils.hpp>
#include <mapnik/datasource.hpp>
#include <mapnik/params.hpp>
-#include <mapnik/geometry.hpp>
#include <mapnik/sql_utils.hpp>
#include <mapnik/util/fs.hpp>
+#include <mapnik/geometry_is_empty.hpp>
+#include <mapnik/geometry_envelope.hpp>
// boost
#pragma GCC diagnostic push
@@ -195,23 +196,20 @@ public:
const char* data = static_cast<const char*>(rs->column_blob(0, size));
if (data)
{
- mapnik::geometry_container paths;
- if (mapnik::geometry_utils::from_wkb(paths, data, size, mapnik::wkbAuto))
+ mapnik::geometry::geometry<double> geom = mapnik::geometry_utils::from_wkb(data, size, mapnik::wkbAuto);
+ if (!mapnik::geometry::is_empty(geom))
{
- for (unsigned i=0; i<paths.size(); ++i)
+ mapnik::box2d<double> bbox = mapnik::geometry::envelope(geom);
+ if (bbox.valid())
{
- mapnik::box2d<double> const& bbox = paths[i].envelope();
- if (bbox.valid())
+ if (first)
{
- if (first)
- {
- first = false;
- extent = bbox;
- }
- else
- {
- extent.expand_to_include(bbox);
- }
+ first = false;
+ extent = bbox;
+ }
+ else
+ {
+ extent.expand_to_include(bbox);
}
}
}
@@ -282,43 +280,32 @@ public:
const char* data = (const char*) rs->column_blob(0, size);
if (data)
{
- mapnik::geometry_container paths;
- mapnik::box2d<double> bbox;
- if (mapnik::geometry_utils::from_wkb(paths, data, size, mapnik::wkbAuto))
+ mapnik::geometry::geometry<double> geom = mapnik::geometry_utils::from_wkb(data, size, mapnik::wkbAuto);
+ if (!mapnik::geometry::is_empty(geom))
{
- for (unsigned i=0; i<paths.size(); ++i)
+ mapnik::box2d<double> bbox = mapnik::geometry::envelope(geom);
+ if (bbox.valid())
{
- if (i==0)
- {
- bbox = paths[i].envelope();
- }
- else
+ ps.bind(bbox);
+ const int type_oid = rs->column_type(1);
+ if (type_oid != SQLITE_INTEGER)
{
- bbox.expand_to_include(paths[i].envelope());
+ std::ostringstream error_msg;
+ error_msg << "Sqlite Plugin: invalid type for key field '"
+ << rs->column_name(1) << "' when creating index '" << index_table
+ << "' type was: " << type_oid << "";
+ throw mapnik::datasource_exception(error_msg.str());
}
+ const sqlite_int64 pkid = rs->column_integer64(1);
+ ps.bind(pkid);
}
- }
- if (bbox.valid())
- {
- ps.bind(bbox);
- const int type_oid = rs->column_type(1);
- if (type_oid != SQLITE_INTEGER)
+ else
{
std::ostringstream error_msg;
- error_msg << "Sqlite Plugin: invalid type for key field '"
- << rs->column_name(1) << "' when creating index '" << index_table
- << "' type was: " << type_oid << "";
+ error_msg << "SQLite Plugin: encountered invalid bbox at '"
+ << rs->column_name(1) << "' == " << rs->column_integer64(1);
throw mapnik::datasource_exception(error_msg.str());
}
- const sqlite_int64 pkid = rs->column_integer64(1);
- ps.bind(pkid);
- }
- else
- {
- std::ostringstream error_msg;
- error_msg << "SQLite Plugin: encountered invalid bbox at '"
- << rs->column_name(1) << "' == " << rs->column_integer64(1);
- throw mapnik::datasource_exception(error_msg.str());
}
ps.step_next();
one_success = true;
@@ -369,36 +356,33 @@ public:
const char* data = static_cast<const char*>(rs->column_blob(0, size));
if (data)
{
- mapnik::geometry_container paths;
- if (mapnik::geometry_utils::from_wkb(paths, data, size, mapnik::wkbAuto))
+ mapnik::geometry::geometry<double> geom = mapnik::geometry_utils::from_wkb(data, size, mapnik::wkbAuto);
+ if (!mapnik::geometry::is_empty(geom))
{
- for (unsigned i=0; i<paths.size(); ++i)
+ mapnik::box2d<double> bbox = mapnik::geometry::envelope(geom);
+ if (bbox.valid())
{
- mapnik::box2d<double> const& bbox = paths[i].envelope();
- if (bbox.valid())
- {
- const int type_oid = rs->column_type(1);
- if (type_oid != SQLITE_INTEGER)
- {
- std::ostringstream error_msg;
- error_msg << "Sqlite Plugin: invalid type for key field '"
- << rs->column_name(1) << "' when creating index "
- << "type was: " << type_oid << "";
- throw mapnik::datasource_exception(error_msg.str());
- }
- const sqlite_int64 pkid = rs->column_integer64(1);
- rtree_type entry = rtree_type();
- entry.pkid = pkid;
- entry.bbox = bbox;
- rtree_list.push_back(entry);
- }
- else
+ const int type_oid = rs->column_type(1);
+ if (type_oid != SQLITE_INTEGER)
{
std::ostringstream error_msg;
- error_msg << "SQLite Plugin: encountered invalid bbox at '"
- << rs->column_name(1) << "' == " << rs->column_integer64(1);
+ error_msg << "Sqlite Plugin: invalid type for key field '"
+ << rs->column_name(1) << "' when creating index "
+ << "type was: " << type_oid << "";
throw mapnik::datasource_exception(error_msg.str());
}
+ const sqlite_int64 pkid = rs->column_integer64(1);
+ rtree_type entry = rtree_type();
+ entry.pkid = pkid;
+ entry.bbox = bbox;
+ rtree_list.push_back(entry);
+ }
+ else
+ {
+ std::ostringstream error_msg;
+ error_msg << "SQLite Plugin: encountered invalid bbox at '"
+ << rs->column_name(1) << "' == " << rs->column_integer64(1);
+ throw mapnik::datasource_exception(error_msg.str());
}
}
}
@@ -684,8 +668,8 @@ public:
desc.add_descriptor(mapnik::attribute_descriptor(fld_name, mapnik::String));
}
else if (boost::algorithm::contains(fld_type, "real") ||
- boost::algorithm::contains(fld_type, "float") ||
- boost::algorithm::contains(fld_type, "double"))
+ boost::algorithm::contains(fld_type, "floa") ||
+ boost::algorithm::contains(fld_type, "doub"))
{
desc.add_descriptor(mapnik::attribute_descriptor(fld_name, mapnik::Double));
}
@@ -701,14 +685,17 @@ public:
// "Column Affinity" says default to "Numeric" but for now we pass..
//desc_.add_descriptor(attribute_descriptor(fld_name,mapnik::Double));
+ desc.add_descriptor(mapnik::attribute_descriptor(fld_name, mapnik::String));
+
#ifdef MAPNIK_LOG
// Do not fail when we specify geometry_field in XML file
if (field.empty())
{
MAPNIK_LOG_DEBUG(sqlite) << "Column '"
<< std::string(fld_name)
- << "' unhandled due to unknown type: "
- << fld_type;
+ << "' unhandled due to unknown type: '"
+ << fld_type
+ << "', using String";
}
#endif
}
diff --git a/plugins/input/templates/README.md b/plugins/input/templates/README.md
deleted file mode 100644
index d4232f0..0000000
--- a/plugins/input/templates/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-## template plugins
-
-Directory to hold sample plugin templates.
-
-These are NOT intended to be used except for testing by developers.
-
-Build these plugins with the Mapnik build system:
-
- ./configure SAMPLE_INPUT_PLUGINS=True
- make install
-
-Or develop them locally using the `Makefile` provided.
-
-Only an ultra-simple hello world is available currently,
-but planned are example plugins templates for file-based
-and sql-based datasources.
diff --git a/plugins/input/templates/helloworld/Makefile b/plugins/input/templates/helloworld/Makefile
deleted file mode 100644
index 962f176..0000000
--- a/plugins/input/templates/helloworld/Makefile
+++ /dev/null
@@ -1,30 +0,0 @@
-# To use clang, run: make CXX=clang++
-
-CXXFLAGS = $(shell mapnik-config --cflags) -fPIC
-
-LIBS = $(shell mapnik-config --libs --ldflags --dep-libs)
-
-SRC = $(wildcard *.cpp)
-
-OBJ = $(SRC:.cpp=.o)
-
-BIN = hello.input
-
-all : $(SRC) $(BIN)
-
-$(BIN) : $(OBJ)
- $(CXX) -shared $(OBJ) $(LIBS) -o $@
-
-.cpp.o :
- $(CXX) -c $(CXXFLAGS) $< -o $@
-
-.PHONY : clean
-
-clean:
- rm -f $(OBJ)
- rm -f $(BIN)
-
-deploy : all
- cp hello.input $(shell mapnik-config --input-plugins)
-
-install: all deploy
diff --git a/plugins/input/templates/helloworld/README.md b/plugins/input/templates/helloworld/README.md
deleted file mode 100644
index 5a5b509..0000000
--- a/plugins/input/templates/helloworld/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-## hello world plugin
-
-This is a very simple sample plugin. It is designed to help developers
-see the skeletal basics needed to achieve a functional datasource plugin.
-
-It is not a model plugin of best practices as much as a model of the bare
-minimum you need to have a working plugin that returns a single feature.
-
-Code comments attempt to highlight which code is mandatory, which is
-simply recommended, and which is purely fluff used to get the plugin to
-actually show some data.
-
-When added to a map it provides a single point geometry representing
-the center of any query. This means that it should place a point in
-the middle of any map tile and display a "hello world!" label if used like:
-
-<?xml version="1.0" encoding="utf-8"?>
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="white">
- <Style name="style">
- <Rule>
- <PointSymbolizer />
- <TextSymbolizer name="[key]" face_name="DejaVu Sans Book" size="10" dx="5" dy="5"/>
- </Rule>
- </Style>
- <Layer name="test" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="type">hello</Parameter>
- </Datasource>
- </Layer>
-</Map>
-
-
-Or used in python like:
-
-from mapnik import *
-m = Map(600,400)
-m.background = Color('white')
-s = Style()
-r = Rule()
-r.symbols.append(PointSymbolizer())
-t = TextSymbolizer(Expression("[key]"),"DejaVu Sans Book",10,Color('black'))
-t.displacement = (15,15)
-r.symbols.append(t)
-s.rules.append(r)
-m.append_style('style',s)
-ds = Datasource(type="hello")
-l = Layer('test')
-l.styles.append('style')
-l.datasource = ds
-m.layers.append(l)
-m.zoom_all()
-render_to_file(m,'test.png')
diff --git a/plugins/input/templates/helloworld/build.py b/plugins/input/templates/helloworld/build.py
deleted file mode 100644
index a36aa1d..0000000
--- a/plugins/input/templates/helloworld/build.py
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/env python
-
-# Mapnik uses the build tool SCons.
-
-# This python file is run to compile a plugin
-# It must be called from the main 'SConstruct' file like:
-
-# SConscript('path/to/this/file.py')
-
-# see docs at: http://www.scons.org/wiki/SConscript()
-
-import os
-
-# Here we pull from the SCons environment exported from the main instance
-Import ('plugin_base')
-Import ('env')
-
-# Give this plugin a name
-# here this happens to be the same as the directory
-PLUGIN_NAME = 'hello'
-
-# the below install details are also pulled from the
-# main SConstruct file where configuration happens
-
-# clone the environment here
-# so that if we modify the env it in this file
-# those changes to not pollute other builds later on...
-plugin_env = plugin_base.Clone()
-
-# Add the cpp files that need to be compiled
-plugin_sources = Split(
- """
- %(PLUGIN_NAME)s_datasource.cpp
- %(PLUGIN_NAME)s_featureset.cpp
- """ % locals()
- )
-
-# Add any external libraries this plugin should
-# directly link to
-libraries = [ '' ] # eg 'libfoo'
-
-libraries.append('boost_system%s' % env['BOOST_APPEND'])
-# link libicuuc, but ICU_LIB_NAME is used custom builds of icu can
-# have different library names like osx which offers /usr/lib/libicucore.dylib
-libraries.append(env['ICU_LIB_NAME'])
-
-# this is valid if we are building an external plugin as shared library
-if env['PLUGIN_LINKING'] == 'shared':
- # plugins can go anywhere, and be registered in custom locations by Mapnik
- # but the standard location is '/usr/local/lib/mapnik/input'
- install_dest = env['MAPNIK_INPUT_PLUGINS_DEST']
-
- # only link mapnik if we are build an external shared object
- libraries.append(env['MAPNIK_NAME'])
-
- TARGET = plugin_env.SharedLibrary(
- # the name of the target to build, eg 'sqlite.input'
- '../%s' % PLUGIN_NAME,
- # prefix - normally none used
- SHLIBPREFIX='',
- # extension, mapnik expects '.input'
- SHLIBSUFFIX='.input',
- # list of source files to compile
- source=plugin_sources,
- # libraries to link to
- LIBS=libraries
- )
-
- # if the plugin links to libmapnik ensure it is built first
- Depends(TARGET, env.subst('../../../../src/%s' % env['MAPNIK_LIB_NAME']))
-
- # if 'uninstall' is not passed on the command line
- # then we actually create the install targets that
- # scons will install if 'install' is passed as an arg
- if 'uninstall' not in COMMAND_LINE_TARGETS:
- env.Install(install_dest, TARGET)
- env.Alias('install', install_dest)
-
-# Return the plugin building options to scons
-# This is used when statically linking the plugin with mapnik)
-plugin_obj = {
- 'LIBS': libraries,
- 'SOURCES': plugin_sources,
-}
-
-Return('plugin_obj')
diff --git a/plugins/input/templates/helloworld/hello_datasource.cpp b/plugins/input/templates/helloworld/hello_datasource.cpp
deleted file mode 100644
index 9630740..0000000
--- a/plugins/input/templates/helloworld/hello_datasource.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-// file plugin
-#include "hello_datasource.hpp"
-#include "hello_featureset.hpp"
-
-// boost
-
-
-using mapnik::datasource;
-using mapnik::parameters;
-
-DATASOURCE_PLUGIN(hello_datasource)
-
-hello_datasource::hello_datasource(parameters const& params)
- : datasource(params),
- desc_(hello_datasource::name(), *params.get<std::string>("encoding","utf-8")),
- extent_()
-{
- this->init(params);
-}
-
-void hello_datasource::init(mapnik::parameters const& params)
-{
- // every datasource must have some way of reporting its extent
- // in this case we are not actually reading from any data so for fun
- // let's just create a world extent in Mapnik's default srs:
- // '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' (equivalent to +init=epsg:4326)
- // see http://spatialreference.org/ref/epsg/4326/ for more details
- extent_.init(-180,-90,180,90);
-}
-
-hello_datasource::~hello_datasource() { }
-
-// This name must match the plugin filename, eg 'hello.input'
-const char * hello_datasource::name()
-{
- return "hello";
-}
-
-mapnik::datasource::datasource_t hello_datasource::type() const
-{
- return datasource::Vector;
-}
-
-mapnik::box2d<double> hello_datasource::envelope() const
-{
- return extent_;
-}
-
-boost::optional<mapnik::datasource::geometry_t> hello_datasource::get_geometry_type() const
-{
- return mapnik::datasource::Point;
-}
-
-mapnik::layer_descriptor hello_datasource::get_descriptor() const
-{
- return desc_;
-}
-
-mapnik::featureset_ptr hello_datasource::features(mapnik::query const& q) const
-{
- // if the query box intersects our world extent then query for features
- if (extent_.intersects(q.get_bbox()))
- {
- return std::make_shared<hello_featureset>(q.get_bbox(),desc_.get_encoding());
- }
-
- // otherwise return an empty featureset pointer
- return mapnik::featureset_ptr();
-}
-
-mapnik::featureset_ptr hello_datasource::features_at_point(mapnik::coord2d const& pt, double tol) const
-{
- // features_at_point is rarely used - only by custom applications,
- // so for this sample plugin let's do nothing...
- return mapnik::featureset_ptr();
-}
diff --git a/plugins/input/templates/helloworld/hello_datasource.hpp b/plugins/input/templates/helloworld/hello_datasource.hpp
deleted file mode 100644
index 432489d..0000000
--- a/plugins/input/templates/helloworld/hello_datasource.hpp
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef FILE_DATASOURCE_HPP
-#define FILE_DATASOURCE_HPP
-
-// mapnik
-#include <mapnik/datasource.hpp>
-#include <mapnik/params.hpp>
-#include <mapnik/query.hpp>
-#include <mapnik/feature.hpp>
-#include <mapnik/box2d.hpp>
-#include <mapnik/coord.hpp>
-#include <mapnik/feature_layer_desc.hpp>
-
-// boost
-#include <boost/optional.hpp>
-#include <memory>
-
-// stl
-#include <string>
-
-class hello_datasource : public mapnik::datasource
-{
-public:
- // constructor
- // arguments must not change
- hello_datasource(mapnik::parameters const& params);
-
- // destructor
- virtual ~hello_datasource ();
-
- // mandatory: type of the plugin, used to match at runtime
- mapnik::datasource::datasource_t type() const;
-
- // mandatory: name of the plugin
- static const char * name();
-
- // mandatory: function to query features by box2d
- // this is called when rendering, specifically in feature_style_processor.hpp
- mapnik::featureset_ptr features(mapnik::query const& q) const;
-
- // mandatory: function to query features by point (coord2d)
- // not used by rendering, but available to calling applications
- mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt, double tol = 0) const;
-
- // mandatory: return the box2d of the datasource
- // called during rendering to determine if the layer should be processed
- mapnik::box2d<double> envelope() const;
-
- // mandatory: optionally return the overal geometry type of the datasource
- boost::optional<mapnik::datasource::geometry_t> get_geometry_type() const;
-
- // mandatory: return the layer descriptor
- mapnik::layer_descriptor get_descriptor() const;
-
-private:
- // recommended - do intialization in a so-named init function
- // to reduce code in constructor
- void init(mapnik::parameters const& params);
- // recommended naming convention of datasource members:
- // name_, type_, extent_, and desc_
- static const std::string name_;
- mapnik::layer_descriptor desc_;
- mapnik::box2d<double> extent_;
-};
-
-
-#endif // FILE_DATASOURCE_HPP
diff --git a/plugins/input/templates/helloworld/hello_featureset.cpp b/plugins/input/templates/helloworld/hello_featureset.cpp
deleted file mode 100644
index 1f2cb50..0000000
--- a/plugins/input/templates/helloworld/hello_featureset.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-// mapnik
-#include <mapnik/feature_factory.hpp>
-#include <mapnik/geometry.hpp>
-#include <mapnik/value_types.hpp>
-
-// boost
-
-#include "hello_featureset.hpp"
-
-hello_featureset::hello_featureset(mapnik::box2d<double> const& box, std::string const& encoding)
- : box_(box),
- feature_id_(1),
- tr_(new mapnik::transcoder(encoding)),
- ctx_(std::make_shared<mapnik::context_type>()) { }
-
-hello_featureset::~hello_featureset() { }
-
-mapnik::feature_ptr hello_featureset::next()
-{
- if (feature_id_ == 1)
- {
- // let us pretend it just has one column/attribute name
- std::string attribute("key");
-
- // the featureset context needs to know the field schema
- ctx_->push(attribute);
-
- // create a new feature
- mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx_,feature_id_));
-
- // increment the count so that we only return one feature
- ++feature_id_;
-
- // create an attribute pair of key:value
- mapnik::value_unicode_string ustr = tr_->transcode("hello world!");
- feature->put(attribute,ustr);
-
- // we need a geometry to display so just for fun here
- // we take the center of the bbox that was used to query
- // since we don't actually have any data to pull from...
- mapnik::coord2d center = box_.center();
-
- // create a new point geometry
- mapnik::geometry_type * pt = new mapnik::geometry_type(mapnik::geometry_type::types::Point);
-
- // we use path type geometries in Mapnik to fit nicely with AGG and Cairo
- // here we stick an x,y pair into the geometry using move_to()
- pt->move_to(center.x,center.y);
-
- // add the geometry to the feature
- feature->add_geometry(pt);
-
- // A feature usually will have just one geometry of a given type
- // but mapnik does support many geometries per feature of any type
- // so here we draw a line around the point
- mapnik::geometry_type * line = new mapnik::geometry_type(mapnik::geometry_type::types::LineString);
- line->move_to(box_.minx(),box_.miny());
- line->line_to(box_.minx(),box_.maxy());
- line->line_to(box_.maxx(),box_.maxy());
- line->line_to(box_.maxx(),box_.miny());
- line->line_to(box_.minx(),box_.miny());
- feature->add_geometry(line);
-
- // return the feature!
- return feature;
- }
-
- // otherwise return an empty feature
- return mapnik::feature_ptr();
-}
diff --git a/plugins/input/templates/helloworld/hello_featureset.hpp b/plugins/input/templates/helloworld/hello_featureset.hpp
deleted file mode 100644
index 43f338f..0000000
--- a/plugins/input/templates/helloworld/hello_featureset.hpp
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef HELLO_FEATURESET_HPP
-#define HELLO_FEATURESET_HPP
-
-// mapnik
-#include <mapnik/datasource.hpp>
-#include <mapnik/feature.hpp>
-#include <mapnik/unicode.hpp>
-
-// boost
- // needed for wrapping the transcoder
-
-class hello_featureset : public mapnik::Featureset
-{
-public:
- // this constructor can have any arguments you need
- hello_featureset(mapnik::box2d<double> const& box, std::string const& encoding);
-
- // desctructor
- virtual ~hello_featureset();
-
- // mandatory: you must expose a next() method, called when rendering
- mapnik::feature_ptr next();
-
-private:
- // members are up to you, but these are recommended
- mapnik::box2d<double> box_;
- mapnik::value_integer feature_id_;
- const std::unique_ptr<mapnik::transcoder> tr_;
- mapnik::context_ptr ctx_;
-};
-
-#endif // HELLO_FEATURESET_HPP
diff --git a/plugins/input/templates/helloworld/test.xml b/plugins/input/templates/helloworld/test.xml
deleted file mode 100644
index 3bfe775..0000000
--- a/plugins/input/templates/helloworld/test.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="white" minimum-version="0.7.2">
- <Style name="style">
- <Rule>
- <PointSymbolizer/>
- <!-- the hello world sample hardcodes 'key' as the hypothetical field name -->
- <TextSymbolizer name="[key]" size="10" dx="5" dy="5" face-name="DejaVu Sans Book"/>
- <LineSymbolizer stroke="green" stroke-width="3"/>
- </Rule>
- </Style>
- <!-- this example only works in EPSG:4326 -->
- <Layer name="test" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>style</StyleName>
- <Datasource>
- <!-- here we create a 'hello' type datasource which simply
- displays a point in the middle of the world's boundin box -->
- <Parameter name="type">hello</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/plugins/input/topojson/build.py b/plugins/input/topojson/build.py
index 665ef82..19abd86 100644
--- a/plugins/input/topojson/build.py
+++ b/plugins/input/topojson/build.py
@@ -21,45 +21,55 @@
Import ('env')
-Import ('plugin_base')
+can_build = False
-PLUGIN_NAME = 'topojson'
+if env.get('BOOST_LIB_VERSION_FROM_HEADER'):
+ boost_version_from_header = int(env['BOOST_LIB_VERSION_FROM_HEADER'].split('_')[1])
+ if boost_version_from_header >= 56:
+ can_build = True
-plugin_env = plugin_base.Clone()
+if not can_build:
+ print 'WARNING: skipping building the optional topojson datasource plugin which requires boost >= 1.56'
+else:
+ Import ('plugin_base')
-plugin_sources = Split(
- """
- %(PLUGIN_NAME)s_datasource.cpp
- %(PLUGIN_NAME)s_featureset.cpp
- """ % locals()
-)
+ PLUGIN_NAME = 'topojson'
-# Link Library to Dependencies
-libraries = []
-libraries.append(env['ICU_LIB_NAME'])
-libraries.append('boost_system%s' % env['BOOST_APPEND'])
-libraries.append('mapnik-json')
+ plugin_env = plugin_base.Clone()
-if env['PLUGIN_LINKING'] == 'shared':
- libraries.append(env['MAPNIK_NAME'])
+ plugin_sources = Split(
+ """
+ %(PLUGIN_NAME)s_datasource.cpp
+ %(PLUGIN_NAME)s_featureset.cpp
+ """ % locals()
+ )
- TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME,
- SHLIBPREFIX='',
- SHLIBSUFFIX='.input',
- source=plugin_sources,
- LIBS=libraries)
+ # Link Library to Dependencies
+ libraries = []
+ libraries.append(env['ICU_LIB_NAME'])
+ libraries.append('boost_system%s' % env['BOOST_APPEND'])
+ libraries.append('mapnik-json')
- # if the plugin links to libmapnik ensure it is built first
- Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
- Depends(TARGET, env.subst('../../../src/json/libmapnik-json${LIBSUFFIX}'))
+ if env['PLUGIN_LINKING'] == 'shared':
+ libraries.append(env['MAPNIK_NAME'])
- if 'uninstall' not in COMMAND_LINE_TARGETS:
- env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], TARGET)
- env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
+ TARGET = plugin_env.SharedLibrary('../%s' % PLUGIN_NAME,
+ SHLIBPREFIX='',
+ SHLIBSUFFIX='.input',
+ source=plugin_sources,
+ LIBS=libraries)
-plugin_obj = {
- 'LIBS': libraries,
- 'SOURCES': plugin_sources,
-}
+ # if the plugin links to libmapnik ensure it is built first
+ Depends(TARGET, env.subst('../../../src/%s' % env['MAPNIK_LIB_NAME']))
+ Depends(TARGET, env.subst('../../../src/json/libmapnik-json${LIBSUFFIX}'))
-Return('plugin_obj')
+ if 'uninstall' not in COMMAND_LINE_TARGETS:
+ env.Install(env['MAPNIK_INPUT_PLUGINS_DEST'], TARGET)
+ env.Alias('install', env['MAPNIK_INPUT_PLUGINS_DEST'])
+
+ plugin_obj = {
+ 'LIBS': libraries,
+ 'SOURCES': plugin_sources,
+ }
+
+ Return('plugin_obj')
diff --git a/plugins/input/topojson/topojson_datasource.cpp b/plugins/input/topojson/topojson_datasource.cpp
index 8e92245..6aceb32 100644
--- a/plugins/input/topojson/topojson_datasource.cpp
+++ b/plugins/input/topojson/topojson_datasource.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -44,7 +44,7 @@ using mapnik::parameters;
DATASOURCE_PLUGIN(topojson_datasource)
-struct attr_value_converter : public mapnik::util::static_visitor<mapnik::eAttributeType>
+struct attr_value_converter
{
mapnik::eAttributeType operator() (mapnik::value_integer /*val*/) const
{
@@ -82,31 +82,31 @@ struct attr_value_converter : public mapnik::util::static_visitor<mapnik::eAttri
}
};
-struct geometry_type_visitor : public mapnik::util::static_visitor<int>
+struct geometry_type_visitor
{
int operator() (mapnik::topojson::point const&) const
{
- return static_cast<int>(mapnik::datasource::Point);
+ return static_cast<int>(mapnik::datasource_geometry_t::Point);
}
int operator() (mapnik::topojson::multi_point const&) const
{
- return static_cast<int>(mapnik::datasource::Point);
+ return static_cast<int>(mapnik::datasource_geometry_t::Point);
}
int operator() (mapnik::topojson::linestring const&) const
{
- return static_cast<int>(mapnik::datasource::LineString);
+ return static_cast<int>(mapnik::datasource_geometry_t::LineString);
}
int operator() (mapnik::topojson::multi_linestring const&) const
{
- return static_cast<int>(mapnik::datasource::LineString);
+ return static_cast<int>(mapnik::datasource_geometry_t::LineString);
}
int operator() (mapnik::topojson::polygon const&) const
{
- return static_cast<int>(mapnik::datasource::Polygon);
+ return static_cast<int>(mapnik::datasource_geometry_t::Polygon);
}
int operator() (mapnik::topojson::multi_polygon const&) const
{
- return static_cast<int>(mapnik::datasource::Polygon);
+ return static_cast<int>(mapnik::datasource_geometry_t::Polygon);
}
int operator() (mapnik::topojson::invalid const&) const
{
@@ -114,7 +114,7 @@ struct geometry_type_visitor : public mapnik::util::static_visitor<int>
}
};
-struct collect_attributes_visitor : public mapnik::util::static_visitor<void>
+struct collect_attributes_visitor
{
mapnik::layer_descriptor & desc_;
collect_attributes_visitor(mapnik::layer_descriptor & desc):
@@ -190,20 +190,16 @@ const mapnik::topojson::topojson_grammar<base_iterator_type> g;
template <typename T>
void topojson_datasource::parse_topojson(T const& buffer)
{
- boost::spirit::standard_wide::space_type space;
+ boost::spirit::ascii::space_type space;
bool result = boost::spirit::qi::phrase_parse(buffer.begin(), buffer.end(), g, space, topo_);
if (!result)
{
throw mapnik::datasource_exception("topojson_datasource: Failed parse TopoJSON file '" + filename_ + "'");
}
-#if BOOST_VERSION >= 105600
using values_container = std::vector< std::pair<box_type, std::size_t> >;
values_container values;
values.reserve(topo_.geometries.size());
-#else
- tree_ = std::make_unique<spatial_index_type>(16, 4);
-#endif
std::size_t geometry_index = 0;
@@ -223,18 +219,12 @@ void topojson_datasource::parse_topojson(T const& buffer)
extent_.expand_to_include(box);
}
}
-#if BOOST_VERSION >= 105600
values.emplace_back(box_type(point_type(box.minx(),box.miny()),point_type(box.maxx(),box.maxy())), geometry_index);
-#else
- tree_->insert(box_type(point_type(box.minx(),box.miny()),point_type(box.maxx(),box.maxy())),geometry_index);
-#endif
++geometry_index;
}
-#if BOOST_VERSION >= 105600
// packing algorithm
tree_ = std::make_unique<spatial_index_type>(values);
-#endif
}
topojson_datasource::~topojson_datasource() { }
@@ -244,9 +234,9 @@ const char * topojson_datasource::name()
return "topojson";
}
-boost::optional<mapnik::datasource::geometry_t> topojson_datasource::get_geometry_type() const
+boost::optional<mapnik::datasource_geometry_t> topojson_datasource::get_geometry_type() const
{
- boost::optional<mapnik::datasource::geometry_t> result;
+ boost::optional<mapnik::datasource_geometry_t> result;
int multi_type = 0;
std::size_t num_features = topo_.geometries.size();
for (std::size_t i = 0; i < num_features && i < 5; ++i)
@@ -257,12 +247,12 @@ boost::optional<mapnik::datasource::geometry_t> topojson_datasource::get_geometr
{
if (multi_type > 0 && multi_type != type)
{
- result.reset(mapnik::datasource::Collection);
+ result.reset(mapnik::datasource_geometry_t::Collection);
return result;
}
else
{
- result.reset(static_cast<mapnik::datasource::geometry_t>(type));
+ result.reset(static_cast<mapnik::datasource_geometry_t>(type));
}
multi_type = type;
}
@@ -292,19 +282,12 @@ mapnik::featureset_ptr topojson_datasource::features(mapnik::query const& q) con
if (extent_.intersects(b))
{
box_type box(point_type(b.minx(),b.miny()),point_type(b.maxx(),b.maxy()));
-#if BOOST_VERSION >= 105600
topojson_featureset::array_type index_array;
if (tree_)
{
tree_->query(boost::geometry::index::intersects(box),std::back_inserter(index_array));
return std::make_shared<topojson_featureset>(topo_, *tr_, std::move(index_array));
}
-#else
- if (tree_)
- {
- return std::make_shared<topojson_featureset>(topo_, *tr_, tree_->find(box));
- }
-#endif
}
// otherwise return an empty featureset pointer
return mapnik::featureset_ptr();
diff --git a/plugins/input/topojson/topojson_datasource.hpp b/plugins/input/topojson/topojson_datasource.hpp
index cb7e046..6b090e8 100644
--- a/plugins/input/topojson/topojson_datasource.hpp
+++ b/plugins/input/topojson/topojson_datasource.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -44,11 +44,7 @@
#include <boost/geometry/geometries/geometries.hpp>
#include <boost/geometry.hpp>
#include <boost/version.hpp>
-#if BOOST_VERSION >= 105600
#include <boost/geometry/index/rtree.hpp>
-#else
-#include <boost/geometry/extensions/index/rtree/rtree.hpp>
-#endif
#pragma GCC diagnostic pop
// stl
@@ -64,14 +60,9 @@ public:
using point_type = boost::geometry::model::d2::point_xy<double>;
using box_type = boost::geometry::model::box<point_type>;
-#if BOOST_VERSION >= 105600
using item_type = std::pair<box_type,std::size_t>;
using linear_type = boost::geometry::index::linear<16,4>;
using spatial_index_type = boost::geometry::index::rtree<item_type,linear_type>;
-#else
- using item_type = std::size_t;
- using spatial_index_type = boost::geometry::index::rtree<box_type,std::size_t>;
-#endif
// constructor
topojson_datasource(mapnik::parameters const& params);
@@ -82,7 +73,7 @@ public:
mapnik::featureset_ptr features_at_point(mapnik::coord2d const& pt, double tol = 0) const;
mapnik::box2d<double> envelope() const;
mapnik::layer_descriptor get_descriptor() const;
- boost::optional<mapnik::datasource::geometry_t> get_geometry_type() const;
+ boost::optional<mapnik::datasource_geometry_t> get_geometry_type() const;
template <typename T>
void parse_topojson(T const& buffer);
private:
diff --git a/plugins/input/topojson/topojson_featureset.cpp b/plugins/input/topojson/topojson_featureset.cpp
index b1231a0..ed53932 100644
--- a/plugins/input/topojson/topojson_featureset.cpp
+++ b/plugins/input/topojson/topojson_featureset.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,6 +25,9 @@
#include <mapnik/feature_factory.hpp>
#include <mapnik/json/topology.hpp>
#include <mapnik/util/variant.hpp>
+#include <mapnik/geometry_adapters.hpp>
+#include <mapnik/geometry_correct.hpp>
+
// stl
#include <string>
#include <vector>
@@ -36,22 +39,14 @@
#pragma GCC diagnostic ignored "-Wunused-variable"
#pragma GCC diagnostic ignored "-Wunused-local-typedef"
#include <boost/range/adaptor/reversed.hpp>
-#include <boost/range/adaptor/sliced.hpp>
-#include <boost/geometry.hpp>
-#include <boost/geometry/algorithms/simplify.hpp>
-#include <boost/geometry/geometries/register/point.hpp>
-#include <boost/geometry/geometries/register/linestring.hpp>
#pragma GCC diagnostic pop
#include "topojson_featureset.hpp"
-BOOST_GEOMETRY_REGISTER_POINT_2D(mapnik::topojson::coordinate, double, boost::geometry::cs::cartesian, x, y)
-BOOST_GEOMETRY_REGISTER_LINESTRING(std::vector<mapnik::topojson::coordinate>)
-
namespace mapnik { namespace topojson {
struct attribute_value_visitor
- : mapnik::util::static_visitor<mapnik::value>
+
{
public:
attribute_value_visitor(mapnik::transcoder const& tr)
@@ -84,19 +79,18 @@ void assign_properties(mapnik::feature_impl & feature, T const& geom, mapnik::tr
}
template <typename Context>
-struct feature_generator : public mapnik::util::static_visitor<mapnik::feature_ptr>
+struct feature_generator
{
feature_generator(Context & ctx, mapnik::transcoder const& tr, topology const& topo, std::size_t feature_id)
: ctx_(ctx),
tr_(tr),
topo_(topo),
+ num_arcs_(topo.arcs.size()),
feature_id_(feature_id) {}
feature_ptr operator() (point const& pt) const
{
mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx_,feature_id_));
- std::unique_ptr<geometry_type> point_ptr(new geometry_type(geometry_type::types::Point));
-
double x = pt.coord.x;
double y = pt.coord.y;
if (topo_.tr)
@@ -104,9 +98,8 @@ struct feature_generator : public mapnik::util::static_visitor<mapnik::feature_p
x = x * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
y = y * (*topo_.tr).scale_y + (*topo_.tr).translate_y;
}
-
- point_ptr->move_to(x,y);
- feature->paths().push_back(point_ptr.release());
+ mapnik::geometry::point<double> point(x, y);
+ feature->set_geometry(std::move(point));
assign_properties(*feature, pt, tr_);
return feature;
}
@@ -114,11 +107,10 @@ struct feature_generator : public mapnik::util::static_visitor<mapnik::feature_p
feature_ptr operator() (multi_point const& multi_pt) const
{
mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx_,feature_id_));
-
+ mapnik::geometry::multi_point<double> multi_point;
+ multi_point.reserve(multi_pt.points.size());
for (auto const& pt : multi_pt.points)
{
- std::unique_ptr<geometry_type> point_ptr(new geometry_type(geometry_type::types::Point));
-
double x = pt.x;
double y = pt.y;
if (topo_.tr)
@@ -126,10 +118,9 @@ struct feature_generator : public mapnik::util::static_visitor<mapnik::feature_p
x = x * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
y = y * (*topo_.tr).scale_y + (*topo_.tr).translate_y;
}
-
- point_ptr->move_to(x,y);
- feature->paths().push_back(point_ptr.release());
+ multi_point.add_coord(x, y);
}
+ feature->set_geometry(std::move(multi_point));
assign_properties(*feature, multi_pt, tr_);
return feature;
}
@@ -137,207 +128,231 @@ struct feature_generator : public mapnik::util::static_visitor<mapnik::feature_p
feature_ptr operator() (linestring const& line) const
{
mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx_,feature_id_));
- std::unique_ptr<geometry_type> line_ptr(new geometry_type(geometry_type::types::LineString));
-
- double px = 0, py = 0;
- index_type arc_index = line.ring;
- bool first = true;
- for (auto pt : topo_.arcs[arc_index].coordinates)
+ if (num_arcs_ > 0)
{
- double x = pt.x;
- double y = pt.y;
- if (topo_.tr)
- {
- x = (px += x) * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
- y = (py += y) * (*topo_.tr).scale_y + (*topo_.tr).translate_y;
- }
- if (first)
- {
- first = false;
- line_ptr->move_to(x,y);
- }
- else
- {
- line_ptr->line_to(x,y);
+ index_type index = line.ring;
+ index_type arc_index = index < 0 ? std::abs(index) - 1 : index;
+ if (arc_index < num_arcs_)
+ {
+ auto const& arcs = topo_.arcs[arc_index];
+ double px = 0, py = 0;
+ mapnik::geometry::line_string<double> line_string;
+ line_string.reserve(arcs.coordinates.size());
+
+ for (auto pt : arcs.coordinates)
+ {
+ double x = pt.x;
+ double y = pt.y;
+ if (topo_.tr)
+ {
+ x = (px += x) * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
+ y = (py += y) * (*topo_.tr).scale_y + (*topo_.tr).translate_y;
+ }
+ line_string.add_coord(x,y);
+ }
+ feature->set_geometry(std::move(line_string));
+ assign_properties(*feature, line, tr_);
}
}
-
- feature->paths().push_back(line_ptr.release());
- assign_properties(*feature, line, tr_);
return feature;
}
feature_ptr operator() (multi_linestring const& multi_line) const
{
mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx_,feature_id_));
-
- for (auto const& index : multi_line.rings)
+ if (num_arcs_ > 0)
{
- std::unique_ptr<geometry_type> line_ptr(new geometry_type(geometry_type::types::LineString));
-
- double px = 0, py = 0;
- bool first = true;
- bool reverse = index < 0;
- index_type arc_index = reverse ? std::abs(index) - 1 : index;
- for (auto pt : topo_.arcs[arc_index].coordinates)
+ mapnik::geometry::multi_line_string<double> multi_line_string;
+ bool hit = false;
+ multi_line_string.reserve(multi_line.rings.size());
+ for (auto const& index : multi_line.rings)
{
- double x = pt.x;
- double y = pt.y;
- if (topo_.tr)
- {
- x = (px += x) * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
- y = (py += y) * (*topo_.tr).scale_y + (*topo_.tr).translate_y;
- }
- if (first)
- {
- first = false;
- line_ptr->move_to(x,y);
- }
- else
+ index_type arc_index = index < 0 ? std::abs(index) - 1 : index;
+ if (arc_index < num_arcs_)
{
- line_ptr->line_to(x,y);
+ hit = true;
+ double px = 0, py = 0;
+ mapnik::geometry::line_string<double> line_string;
+ auto const& arcs = topo_.arcs[arc_index];
+ line_string.reserve(arcs.coordinates.size());
+ for (auto pt : arcs.coordinates)
+ {
+ double x = pt.x;
+ double y = pt.y;
+ if (topo_.tr)
+ {
+ x = (px += x) * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
+ y = (py += y) * (*topo_.tr).scale_y + (*topo_.tr).translate_y;
+ }
+ line_string.add_coord(x, y);
+ }
+ multi_line_string.push_back(std::move(line_string));
}
}
- feature->paths().push_back(line_ptr.release());
+ if (hit)
+ {
+ feature->set_geometry(std::move(multi_line_string));
+ assign_properties(*feature, multi_line, tr_);
+ }
}
- assign_properties(*feature, multi_line, tr_);
return feature;
}
feature_ptr operator() (polygon const& poly) const
{
mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx_,feature_id_));
- std::unique_ptr<geometry_type> poly_ptr(new geometry_type(geometry_type::types::Polygon));
- std::vector<mapnik::topojson::coordinate> processed_coords;
-
- for (auto const& ring : poly.rings)
+ if (num_arcs_ > 0)
{
+ std::vector<mapnik::topojson::coordinate> processed_coords;
+ mapnik::geometry::polygon<double> polygon;
+ if (poly.rings.size() > 1) polygon.interior_rings.reserve(poly.rings.size() - 1);
bool first = true;
- for (auto const& index : ring)
+ bool hit = false;
+ for (auto const& ring : poly.rings)
{
- double px = 0, py = 0;
- bool reverse = index < 0;
- index_type arc_index = reverse ? std::abs(index) - 1 : index;
- auto const& coords = topo_.arcs[arc_index].coordinates;
- processed_coords.clear();
- processed_coords.reserve(coords.size());
- for (auto const& pt : coords )
+ mapnik::geometry::linear_ring<double> linear_ring;
+ for (auto const& index : ring)
{
- double x = pt.x;
- double y = pt.y;
-
- if (topo_.tr)
+ double px = 0, py = 0;
+ bool reverse = index < 0;
+ index_type arc_index = reverse ? std::abs(index) - 1 : index;
+ if (arc_index < num_arcs_)
{
- transform const& tr = *topo_.tr;
- x = (px += x) * tr.scale_x + tr.translate_x;
- y = (py += y) * tr.scale_y + tr.translate_y;
- }
- processed_coords.emplace_back(coordinate{x,y});
- }
-
-
- // simplify
- std::vector<mapnik::topojson::coordinate> simplified(processed_coords.size());
- boost::geometry::simplify(processed_coords, simplified, 2);
+ hit = true;
+ auto const& arcs = topo_.arcs[arc_index];
+ auto const& coords = arcs.coordinates;
+ processed_coords.clear();
+ processed_coords.reserve(coords.size());
+ for (auto const& pt : coords )
+ {
+ double x = pt.x;
+ double y = pt.y;
- using namespace boost::adaptors;
+ if (topo_.tr)
+ {
+ transform const& tr = *topo_.tr;
+ x = (px += x) * tr.scale_x + tr.translate_x;
+ y = (py += y) * tr.scale_y + tr.translate_y;
+ }
+ processed_coords.emplace_back(coordinate{x,y});
+ }
- if (reverse)
- {
- for (auto const& c : simplified | reversed | sliced(0, simplified.size()-1))
- {
- if (first)
+ if (reverse)
+ {
+ for (auto const& c : processed_coords | boost::adaptors::reversed)
+ {
+ linear_ring.emplace_back(c.x, c.y);
+ }
+ }
+ else
{
- first = false;
- poly_ptr->move_to(c.x,c.y);
+ for (auto const& c : processed_coords)
+ {
+ linear_ring.emplace_back(c.x, c.y);
+ }
}
- else poly_ptr->line_to(c.x,c.y);
}
}
+ if (first)
+ {
+ first = false;
+ polygon.set_exterior_ring(std::move(linear_ring));
+ }
else
{
- for (auto const& c : simplified | sliced(0, simplified.size()-1))
- {
- if (first)
- {
- first = false;
- poly_ptr->move_to(c.x,c.y);
- }
- else poly_ptr->line_to(c.x,c.y);
- }
+ polygon.add_hole(std::move(linear_ring));
}
}
- poly_ptr->close_path();
+ if (hit)
+ {
+ mapnik::geometry::correct(polygon);
+ feature->set_geometry(std::move(polygon));
+ assign_properties(*feature, poly, tr_);
+ }
}
-
- feature->paths().push_back(poly_ptr.release());
- assign_properties(*feature, poly, tr_);
return feature;
}
feature_ptr operator() (multi_polygon const& multi_poly) const
{
mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx_,feature_id_));
- std::vector<mapnik::topojson::coordinate> processed_coords;
- for (auto const& poly : multi_poly.polygons)
+ if (num_arcs_ > 0)
{
- std::unique_ptr<geometry_type> poly_ptr(new geometry_type(geometry_type::types::Polygon));
- for (auto const& ring : poly)
+ std::vector<mapnik::topojson::coordinate> processed_coords;
+ mapnik::geometry::multi_polygon<double> multi_polygon;
+ multi_polygon.reserve(multi_poly.polygons.size());
+ bool hit = false;
+ for (auto const& poly : multi_poly.polygons)
{
bool first = true;
- for (auto const& index : ring)
+ mapnik::geometry::polygon<double> polygon;
+ if (poly.size() > 1) polygon.interior_rings.reserve(poly.size() - 1);
+
+ for (auto const& ring : poly)
{
- double px = 0, py = 0;
- bool reverse = index < 0;
- index_type arc_index = reverse ? std::abs(index) - 1 : index;
- auto const& coords = topo_.arcs[arc_index].coordinates;
- processed_coords.clear();
- processed_coords.reserve(coords.size());
- for (auto const& pt : coords )
+ mapnik::geometry::linear_ring<double> linear_ring;
+ for (auto const& index : ring)
{
- double x = pt.x;
- double y = pt.y;
-
- if (topo_.tr)
+ double px = 0, py = 0;
+ bool reverse = index < 0;
+ index_type arc_index = reverse ? std::abs(index) - 1 : index;
+ if (arc_index < num_arcs_)
{
- x = (px += x) * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
- y = (py += y) * (*topo_.tr).scale_y + (*topo_.tr).translate_y;
- }
- processed_coords.emplace_back(coordinate{x,y});
- }
+ hit = true;
+ auto const& arcs = topo_.arcs[arc_index];
+ auto const& coords = arcs.coordinates;
+ processed_coords.clear();
+ processed_coords.reserve(coords.size());
+ for (auto const& pt : coords )
+ {
+ double x = pt.x;
+ double y = pt.y;
+
+ if (topo_.tr)
+ {
+ x = (px += x) * (*topo_.tr).scale_x + (*topo_.tr).translate_x;
+ y = (py += y) * (*topo_.tr).scale_y + (*topo_.tr).translate_y;
+ }
+ processed_coords.emplace_back(coordinate{x,y});
+ }
- using namespace boost::adaptors;
+ using namespace boost::adaptors;
- if (reverse)
- {
- for (auto const& c : (processed_coords | reversed | sliced(0,processed_coords.size() - 1)))
- {
- if (first)
+ if (reverse)
{
- first = false;
- poly_ptr->move_to(c.x,c.y);
+ for (auto const& c : (processed_coords | reversed))
+ {
+ linear_ring.add_coord(c.x, c.y);
+ }
+ }
+ else
+ {
+ for (auto const& c : processed_coords)
+ {
+ linear_ring.add_coord(c.x, c.y);
+ }
}
- else poly_ptr->line_to(c.x,c.y);
}
}
+ if (first)
+ {
+ first = false;
+ polygon.set_exterior_ring(std::move(linear_ring));
+ }
else
{
- for (auto const& c : processed_coords | sliced(0,processed_coords.size() - 1))
- {
- if (first)
- {
- first = false;
- poly_ptr->move_to(c.x,c.y);
- }
- else poly_ptr->line_to(c.x,c.y);
- }
+ polygon.add_hole(std::move(linear_ring));
}
}
- poly_ptr->close_path();
+ multi_polygon.push_back(std::move(polygon));
+ }
+ if (hit)
+ {
+ mapnik::geometry::correct(multi_polygon);
+ feature->set_geometry(std::move(multi_polygon));
+ assign_properties(*feature, multi_poly, tr_);
}
- feature->paths().push_back(poly_ptr.release());
}
- assign_properties(*feature, multi_poly, tr_);
return feature;
}
@@ -350,6 +365,7 @@ struct feature_generator : public mapnik::util::static_visitor<mapnik::feature_p
Context & ctx_;
mapnik::transcoder const& tr_;
topology const& topo_;
+ std::size_t num_arcs_;
std::size_t feature_id_;
};
@@ -364,7 +380,7 @@ topojson_featureset::topojson_featureset(mapnik::topojson::topology const& topo,
index_array_(std::move(index_array)),
index_itr_(index_array_.begin()),
index_end_(index_array_.end()),
- feature_id_ (0) {}
+ feature_id_(1) {}
topojson_featureset::~topojson_featureset() {}
@@ -372,12 +388,8 @@ mapnik::feature_ptr topojson_featureset::next()
{
if (index_itr_ != index_end_)
{
-#if BOOST_VERSION >= 105600
topojson_datasource::item_type const& item = *index_itr_++;
std::size_t index = item.second;
-#else
- std::size_t index = *index_itr_++;
-#endif
if ( index < topo_.geometries.size())
{
mapnik::topojson::geometry const& geom = topo_.geometries[index];
diff --git a/plugins/input/topojson/topojson_featureset.hpp b/plugins/input/topojson/topojson_featureset.hpp
index 78ab136..f6dc224 100644
--- a/plugins/input/topojson/topojson_featureset.hpp
+++ b/plugins/input/topojson/topojson_featureset.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/run_tests b/run_tests
deleted file mode 100755
index 5dab76b..0000000
--- a/run_tests
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-
-failures=0
-
-source ./localize.sh
-PYTHON=${PYTHON:-python}
-
-echo "*** Running visual tests..."
-$PYTHON tests/visual_tests/test.py -q
-failures=$((failures+$?))
-
-echo "*** Running C++ tests..."
-./tests/cpp_tests/run
-failures=$((failures+$?))
-echo
-
-echo "*** Running python tests..."
-$PYTHON tests/run_tests.py -q
-failures=$((failures+$?))
-
-exit $failures
diff --git a/scripts/check-padding b/scripts/check-padding
new file mode 100755
index 0000000..b10d34b
--- /dev/null
+++ b/scripts/check-padding
@@ -0,0 +1,63 @@
+#!/usr/bin/env bash
+
+set -eu
+set -o pipefail
+
+cpp="/tmp/alignment.cpp"
+app="/tmp/alignment"
+
+function usage() {
+ echo "Usage:"
+ echo ""
+ echo "./scripts/rebuild.sh [header] [class name]"
+ echo ""
+ echo "Please pass a header file and a class name"
+ echo ""
+ echo " ./scripts/check-padding include/mapnik/attribute.hpp mapnik::attribute"
+ echo ""
+ exit 1
+
+}
+
+function add() {
+ echo $1 >> ${cpp}
+}
+
+CXX=${CXX:-clang++}
+
+function compile() {
+ ${CXX} -o ${app} ${cpp} -Wpadded -I./ -isystem ./mason_packages/.link/include `mapnik-config --all-flags` -Ideps -Lsrc -Ideps/agg/include -Iinclude
+}
+
+if [[ ${1:-unset} == "unset" ]] || [[ ${2:-unset} == "unset" ]] || [[ $@ == '-h' ]] || [[ $@ == '--help' ]]; then
+ usage
+fi
+
+echo '' > ${cpp}
+
+add "#include <iostream>"
+add "#include <vector>"
+
+add "#include \"$1\""
+
+add ""
+
+add '#define REPORT(type) std::clog << "sizeof(" #type ") " << sizeof(type) << "\n";'
+
+add "int main() {"
+add ""
+
+add "REPORT(std::string)"
+add "REPORT(unsigned int)"
+add "REPORT(int)"
+add "REPORT(bool)"
+add "REPORT(std::vector<double>)"
+add "REPORT(std::size_t)"
+
+add "REPORT($2)"
+
+add "return 0;"
+add "}"
+
+compile
+${app}
diff --git a/src/agg/agg_renderer.cpp b/src/agg/agg_renderer.cpp
index 1297651..67723d0 100644
--- a/src/agg/agg_renderer.cpp
+++ b/src/agg/agg_renderer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,6 @@
#include <mapnik/agg_renderer.hpp>
#include <mapnik/agg_rasterizer.hpp>
#include <mapnik/agg_helpers.hpp>
-#include <mapnik/graphics.hpp>
#include <mapnik/rule.hpp>
#include <mapnik/debug.hpp>
#include <mapnik/layer.hpp>
@@ -43,6 +42,7 @@
#include <mapnik/image_compositing.hpp>
#include <mapnik/image_filter.hpp>
#include <mapnik/image_util.hpp>
+#include <mapnik/image_any.hpp>
// agg
#include "agg_rendering_buffer.h"
#include "agg_pixfmt_rgba.h"
@@ -53,8 +53,9 @@
#include "agg_span_allocator.h"
#include "agg_image_accessors.h"
#include "agg_span_image_filter_rgba.h"
+
// boost
-#include <boost/math/special_functions/round.hpp>
+#include <boost/optional.hpp>
// stl
#include <cmath>
@@ -108,9 +109,52 @@ agg_renderer<T0,T1>::agg_renderer(Map const& m, T0 & pixmap, std::shared_ptr<T1>
setup(m);
}
+template <typename buffer_type>
+struct setup_agg_bg_visitor
+{
+ setup_agg_bg_visitor(buffer_type & pixmap,
+ renderer_common const& common,
+ composite_mode_e mode,
+ double opacity)
+ : pixmap_(pixmap),
+ common_(common),
+ mode_(mode),
+ opacity_(opacity) {}
+
+ void operator() (marker_null const&) {}
+
+ void operator() (marker_svg const&) {}
+
+ void operator() (marker_rgba8 const& marker)
+ {
+ mapnik::image_rgba8 const& bg_image = marker.get_data();
+ int w = bg_image.width();
+ int h = bg_image.height();
+ if ( w > 0 && h > 0)
+ {
+ // repeat background-image both vertically and horizontally
+ unsigned x_steps = static_cast<unsigned>(std::ceil(common_.width_/double(w)));
+ unsigned y_steps = static_cast<unsigned>(std::ceil(common_.height_/double(h)));
+ for (unsigned x=0;x<x_steps;++x)
+ {
+ for (unsigned y=0;y<y_steps;++y)
+ {
+ composite(pixmap_, bg_image, mode_, opacity_, x*w, y*h);
+ }
+ }
+ }
+ }
+ private:
+ buffer_type & pixmap_;
+ renderer_common const& common_;
+ composite_mode_e mode_;
+ double opacity_;
+};
+
template <typename T0, typename T1>
void agg_renderer<T0,T1>::setup(Map const &m)
{
+ mapnik::set_premultiplied_alpha(pixmap_, true);
boost::optional<color> const& bg = m.background();
if (bg)
{
@@ -118,11 +162,13 @@ void agg_renderer<T0,T1>::setup(Map const &m)
{
mapnik::color bg_color = *bg;
bg_color.premultiply();
- pixmap_.set_background(bg_color);
+ mapnik::fill(pixmap_, bg_color);
}
else
{
- pixmap_.set_background(*bg);
+ mapnik::color bg_color = *bg;
+ bg_color.set_premultiplied(true);
+ mapnik::fill(pixmap_,bg_color);
}
}
@@ -130,26 +176,12 @@ void agg_renderer<T0,T1>::setup(Map const &m)
if (image_filename)
{
// NOTE: marker_cache returns premultiplied image, if needed
- boost::optional<mapnik::marker_ptr> bg_marker = mapnik::marker_cache::instance().find(*image_filename,true);
- if (bg_marker && (*bg_marker)->is_bitmap())
- {
- mapnik::image_ptr bg_image = *(*bg_marker)->get_bitmap_data();
- int w = bg_image->width();
- int h = bg_image->height();
- if ( w > 0 && h > 0)
- {
- // repeat background-image both vertically and horizontally
- unsigned x_steps = static_cast<unsigned>(std::ceil(common_.width_/double(w)));
- unsigned y_steps = static_cast<unsigned>(std::ceil(common_.height_/double(h)));
- for (unsigned x=0;x<x_steps;++x)
- {
- for (unsigned y=0;y<y_steps;++y)
- {
- composite(pixmap_.data(),*bg_image, m.background_image_comp_op(), m.background_image_opacity(), x*w, y*h, false);
- }
- }
- }
- }
+ std::shared_ptr<mapnik::marker const> bg_marker = mapnik::marker_cache::instance().find(*image_filename,true);
+ setup_agg_bg_visitor<buffer_type> visitor(pixmap_,
+ common_,
+ m.background_image_comp_op(),
+ m.background_image_opacity());
+ util::apply_visitor(visitor, *bg_marker);
}
MAPNIK_LOG_DEBUG(agg_renderer) << "agg_renderer: Scale=" << m.scale();
}
@@ -167,10 +199,7 @@ void agg_renderer<T0,T1>::start_map_processing(Map const& map)
template <typename T0, typename T1>
void agg_renderer<T0,T1>::end_map_processing(Map const& )
{
-
- agg::rendering_buffer buf(pixmap_.raw_data(),common_.width_,common_.height_, common_.width_ * 4);
- agg::pixfmt_rgba32_pre pixf(buf);
- pixf.demultiply();
+ mapnik::demultiply_alpha(pixmap_);
MAPNIK_LOG_DEBUG(agg_renderer) << "agg_renderer: End map processing";
}
@@ -239,7 +268,7 @@ void agg_renderer<T0,T1>::start_style_processing(feature_type_style const& st)
}
else
{
- internal_buffer_->set_background(color(0,0,0,0)); // fill with transparent colour
+ mapnik::fill(*internal_buffer_, 0); // fill with transparent colour
}
}
else
@@ -250,12 +279,13 @@ void agg_renderer<T0,T1>::start_style_processing(feature_type_style const& st)
}
else
{
- internal_buffer_->set_background(color(0,0,0,0)); // fill with transparent colour
+ mapnik::fill(*internal_buffer_, 0); // fill with transparent colour
}
common_.t_.set_offset(0);
ras_ptr->clip_box(0,0,common_.width_,common_.height_);
}
current_buffer_ = internal_buffer_.get();
+ set_premultiplied_alpha(*current_buffer_,true);
}
else
{
@@ -274,7 +304,7 @@ void agg_renderer<T0,T1>::end_style_processing(feature_type_style const& st)
if (st.image_filters().size() > 0)
{
blend_from = true;
- mapnik::filter::filter_visitor<image_32> visitor(*current_buffer_);
+ mapnik::filter::filter_visitor<buffer_type> visitor(*current_buffer_);
for (mapnik::filter::filter_type const& filter_tag : st.image_filters())
{
util::apply_visitor(visitor, filter_tag);
@@ -282,21 +312,21 @@ void agg_renderer<T0,T1>::end_style_processing(feature_type_style const& st)
}
if (st.comp_op())
{
- composite(pixmap_.data(), current_buffer_->data(),
+ composite(pixmap_, *current_buffer_,
*st.comp_op(), st.get_opacity(),
-common_.t_.offset(),
- -common_.t_.offset(), false);
+ -common_.t_.offset());
}
else if (blend_from || st.get_opacity() < 1.0)
{
- composite(pixmap_.data(), current_buffer_->data(),
+ composite(pixmap_, *current_buffer_,
src_over, st.get_opacity(),
-common_.t_.offset(),
- -common_.t_.offset(), false);
+ -common_.t_.offset());
}
}
// apply any 'direct' image filters
- mapnik::filter::filter_visitor<image_32> visitor(pixmap_);
+ mapnik::filter::filter_visitor<buffer_type> visitor(pixmap_);
for (mapnik::filter::filter_type const& filter_tag : st.direct_image_filters())
{
util::apply_visitor(visitor, filter_tag);
@@ -304,87 +334,126 @@ void agg_renderer<T0,T1>::end_style_processing(feature_type_style const& st)
MAPNIK_LOG_DEBUG(agg_renderer) << "agg_renderer: End processing style";
}
-template <typename T0, typename T1>
-void agg_renderer<T0,T1>::render_marker(pixel_position const& pos,
- marker const& marker,
- agg::trans_affine const& tr,
- double opacity,
- composite_mode_e comp_op)
+template <typename buffer_type>
+struct agg_render_marker_visitor
{
- using color_type = agg::rgba8;
- using order_type = agg::order_rgba;
- using blender_type = agg::comp_op_adaptor_rgba_pre<color_type, order_type>; // comp blender
- using pixfmt_comp_type = agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer>;
- using renderer_base = agg::renderer_base<pixfmt_comp_type>;
- using renderer_type = agg::renderer_scanline_aa_solid<renderer_base>;
- using svg_attribute_type = agg::pod_bvector<mapnik::svg::path_attributes>;
-
- ras_ptr->reset();
- if (gamma_method_ != GAMMA_POWER || gamma_ != 1.0)
- {
- ras_ptr->gamma(agg::gamma_power());
- gamma_method_ = GAMMA_POWER;
- gamma_ = 1.0;
- }
- agg::scanline_u8 sl;
- agg::rendering_buffer buf(current_buffer_->raw_data(),
- current_buffer_->width(),
- current_buffer_->height(),
- current_buffer_->width() * 4);
- pixfmt_comp_type pixf(buf);
- pixf.comp_op(static_cast<agg::comp_op_e>(comp_op));
- renderer_base renb(pixf);
-
- if (marker.is_vector())
+ agg_render_marker_visitor(renderer_common & common,
+ buffer_type * current_buffer,
+ std::unique_ptr<rasterizer> const& ras_ptr,
+ gamma_method_enum & gamma_method,
+ double & gamma,
+ pixel_position const& pos,
+ agg::trans_affine const& tr,
+ double opacity,
+ composite_mode_e comp_op)
+ : common_(common),
+ current_buffer_(current_buffer),
+ ras_ptr_(ras_ptr),
+ gamma_method_(gamma_method),
+ gamma_(gamma),
+ pos_(pos),
+ tr_(tr),
+ opacity_(opacity),
+ comp_op_(comp_op) {}
+
+ void operator() (marker_null const&) {}
+
+ void operator() (marker_svg const& marker)
{
- box2d<double> const& bbox = (*marker.get_vector_data())->bounding_box();
+ using color_type = agg::rgba8;
+ using order_type = agg::order_rgba;
+ using blender_type = agg::comp_op_adaptor_rgba_pre<color_type, order_type>; // comp blender
+ using pixfmt_comp_type = agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer>;
+ using renderer_base = agg::renderer_base<pixfmt_comp_type>;
+ using renderer_type = agg::renderer_scanline_aa_solid<renderer_base>;
+ using svg_attribute_type = agg::pod_bvector<mapnik::svg::path_attributes>;
+
+ ras_ptr_->reset();
+ if (gamma_method_ != GAMMA_POWER || gamma_ != 1.0)
+ {
+ ras_ptr_->gamma(agg::gamma_power());
+ gamma_method_ = GAMMA_POWER;
+ gamma_ = 1.0;
+ }
+ agg::scanline_u8 sl;
+ agg::rendering_buffer buf(current_buffer_->bytes(),
+ current_buffer_->width(),
+ current_buffer_->height(),
+ current_buffer_->row_size());
+ pixfmt_comp_type pixf(buf);
+ pixf.comp_op(static_cast<agg::comp_op_e>(comp_op_));
+ renderer_base renb(pixf);
+
+ box2d<double> const& bbox = marker.get_data()->bounding_box();
coord<double,2> c = bbox.center();
// center the svg marker on '0,0'
agg::trans_affine mtx = agg::trans_affine_translation(-c.x,-c.y);
// apply symbol transformation to get to map space
- mtx *= tr;
+ mtx *= tr_;
mtx *= agg::trans_affine_scaling(common_.scale_factor_);
// render the marker at the center of the marker box
- mtx.translate(pos.x, pos.y);
+ mtx.translate(pos_.x, pos_.y);
using namespace mapnik::svg;
- vertex_stl_adapter<svg_path_storage> stl_storage((*marker.get_vector_data())->source());
+ vertex_stl_adapter<svg_path_storage> stl_storage(marker.get_data()->source());
svg_path_adapter svg_path(stl_storage);
svg_renderer_agg<svg_path_adapter,
svg_attribute_type,
renderer_type,
pixfmt_comp_type> svg_renderer(svg_path,
- (*marker.get_vector_data())->attributes());
+ marker.get_data()->attributes());
// https://github.com/mapnik/mapnik/issues/1316
// https://github.com/mapnik/mapnik/issues/1866
mtx.tx = std::floor(mtx.tx+.5);
mtx.ty = std::floor(mtx.ty+.5);
- svg_renderer.render(*ras_ptr, sl, renb, mtx, opacity, bbox);
+ svg_renderer.render(*ras_ptr_, sl, renb, mtx, opacity_, bbox);
}
- else
+
+ void operator() (marker_rgba8 const& marker)
{
- double width = (*marker.get_bitmap_data())->width();
- double height = (*marker.get_bitmap_data())->height();
+ using color_type = agg::rgba8;
+ using order_type = agg::order_rgba;
+ using blender_type = agg::comp_op_adaptor_rgba_pre<color_type, order_type>; // comp blender
+ using pixfmt_comp_type = agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer>;
+ using renderer_base = agg::renderer_base<pixfmt_comp_type>;
+
+ ras_ptr_->reset();
+ if (gamma_method_ != GAMMA_POWER || gamma_ != 1.0)
+ {
+ ras_ptr_->gamma(agg::gamma_power());
+ gamma_method_ = GAMMA_POWER;
+ gamma_ = 1.0;
+ }
+ agg::scanline_u8 sl;
+ agg::rendering_buffer buf(current_buffer_->bytes(),
+ current_buffer_->width(),
+ current_buffer_->height(),
+ current_buffer_->row_size());
+ pixfmt_comp_type pixf(buf);
+ pixf.comp_op(static_cast<agg::comp_op_e>(comp_op_));
+ renderer_base renb(pixf);
+
+ double width = marker.width();
+ double height = marker.height();
if (std::fabs(1.0 - common_.scale_factor_) < 0.001
- && (std::fabs(1.0 - tr.sx) < agg::affine_epsilon)
- && (std::fabs(0.0 - tr.shy) < agg::affine_epsilon)
- && (std::fabs(0.0 - tr.shx) < agg::affine_epsilon)
- && (std::fabs(1.0 - tr.sy) < agg::affine_epsilon))
+ && (std::fabs(1.0 - tr_.sx) < agg::affine_epsilon)
+ && (std::fabs(0.0 - tr_.shy) < agg::affine_epsilon)
+ && (std::fabs(0.0 - tr_.shx) < agg::affine_epsilon)
+ && (std::fabs(1.0 - tr_.sy) < agg::affine_epsilon))
{
double cx = 0.5 * width;
double cy = 0.5 * height;
- composite(current_buffer_->data(), **marker.get_bitmap_data(),
- comp_op, opacity,
- std::floor(pos.x - cx + .5),
- std::floor(pos.y - cy + .5),
- false);
+ composite(*current_buffer_, marker.get_data(),
+ comp_op_, opacity_,
+ std::floor(pos_.x - cx + .5),
+ std::floor(pos_.y - cy + .5));
}
else
{
double p[8];
- double x0 = pos.x - 0.5 * width;
- double y0 = pos.y - 0.5 * height;
+ double x0 = pos_.x - 0.5 * width;
+ double y0 = pos_.y - 0.5 * height;
p[0] = x0; p[1] = y0;
p[2] = x0 + width; p[3] = y0;
p[4] = x0 + width; p[5] = y0 + height;
@@ -392,31 +461,31 @@ void agg_renderer<T0,T1>::render_marker(pixel_position const& pos,
agg::trans_affine marker_tr;
- marker_tr *= agg::trans_affine_translation(-pos.x,-pos.y);
- marker_tr *= tr;
+ marker_tr *= agg::trans_affine_translation(-pos_.x,-pos_.y);
+ marker_tr *= tr_;
marker_tr *= agg::trans_affine_scaling(common_.scale_factor_);
- marker_tr *= agg::trans_affine_translation(pos.x,pos.y);
+ marker_tr *= agg::trans_affine_translation(pos_.x,pos_.y);
marker_tr.transform(&p[0], &p[1]);
marker_tr.transform(&p[2], &p[3]);
marker_tr.transform(&p[4], &p[5]);
marker_tr.transform(&p[6], &p[7]);
- ras_ptr->move_to_d(p[0],p[1]);
- ras_ptr->line_to_d(p[2],p[3]);
- ras_ptr->line_to_d(p[4],p[5]);
- ras_ptr->line_to_d(p[6],p[7]);
+ ras_ptr_->move_to_d(p[0],p[1]);
+ ras_ptr_->line_to_d(p[2],p[3]);
+ ras_ptr_->line_to_d(p[4],p[5]);
+ ras_ptr_->line_to_d(p[6],p[7]);
agg::span_allocator<color_type> sa;
agg::image_filter_bilinear filter_kernel;
agg::image_filter_lut filter(filter_kernel, false);
- image_data_32 const& src = **marker.get_bitmap_data();
- agg::rendering_buffer marker_buf((unsigned char *)src.getBytes(),
+ buffer_type const& src = marker.get_data();
+ agg::rendering_buffer marker_buf((unsigned char *)src.bytes(),
src.width(),
src.height(),
- src.width()*4);
+ src.row_size());
agg::pixfmt_rgba32_pre marker_pixf(marker_buf);
using img_accessor_type = agg::image_accessor_clone<agg::pixfmt_rgba32_pre>;
using interpolator_type = agg::span_interpolator_linear<agg::trans_affine>;
@@ -431,10 +500,41 @@ void agg_renderer<T0,T1>::render_marker(pixel_position const& pos,
final_tr.ty = std::floor(final_tr.ty+.5);
interpolator_type interpolator(final_tr);
span_gen_type sg(ia, interpolator, filter);
- renderer_type rp(renb,sa, sg, unsigned(opacity*255));
- agg::render_scanlines(*ras_ptr, sl, rp);
+ renderer_type rp(renb,sa, sg, unsigned(opacity_*255));
+ agg::render_scanlines(*ras_ptr_, sl, rp);
}
}
+
+ private:
+ renderer_common & common_;
+ buffer_type * current_buffer_;
+ std::unique_ptr<rasterizer> const& ras_ptr_;
+ gamma_method_enum & gamma_method_;
+ double & gamma_;
+ pixel_position const& pos_;
+ agg::trans_affine const& tr_;
+ double opacity_;
+ composite_mode_e comp_op_;
+
+};
+
+template <typename T0, typename T1>
+void agg_renderer<T0,T1>::render_marker(pixel_position const& pos,
+ marker const& marker,
+ agg::trans_affine const& tr,
+ double opacity,
+ composite_mode_e comp_op)
+{
+ agg_render_marker_visitor<buffer_type> visitor(common_,
+ current_buffer_,
+ ras_ptr,
+ gamma_method_,
+ gamma_,
+ pos,
+ tr,
+ opacity,
+ comp_op);
+ util::apply_visitor(visitor, marker);
}
template <typename T0, typename T1>
@@ -453,10 +553,10 @@ template <typename T0, typename T1>
void agg_renderer<T0,T1>::debug_draw_box(box2d<double> const& box,
double x, double y, double angle)
{
- agg::rendering_buffer buf(current_buffer_->raw_data(),
+ agg::rendering_buffer buf(current_buffer_->bytes(),
current_buffer_->width(),
current_buffer_->height(),
- current_buffer_->width() * 4);
+ current_buffer_->row_size());
debug_draw_box(buf, box, x, y, angle);
}
@@ -473,7 +573,7 @@ void agg_renderer<T0,T1>::debug_draw_box(R& buf, box2d<double> const& box,
renderer_base renb(pixf);
renderer_type ren(renb);
- // compute tranformation matrix
+ // compute transformation matrix
agg::trans_affine tr = agg::trans_affine_rotation(angle).translate(x, y);
// prepare path
agg::path_storage pbox;
@@ -509,19 +609,19 @@ void agg_renderer<T0,T1>::draw_geo_extent(box2d<double> const& extent, mapnik::c
unsigned rgba = color.rgba();
for (double x=x0; x<x1; x++)
{
- pixmap_.setPixel(x, y0, rgba);
- pixmap_.setPixel(x, y1, rgba);
+ mapnik::set_pixel(pixmap_, x, y0, rgba);
+ mapnik::set_pixel(pixmap_, x, y1, rgba);
}
for (double y=y0; y<y1; y++)
{
- pixmap_.setPixel(x0, y, rgba);
- pixmap_.setPixel(x1, y, rgba);
+ mapnik::set_pixel(pixmap_, x0, y, rgba);
+ mapnik::set_pixel(pixmap_, x1, y, rgba);
}
}
-template class agg_renderer<image_32>;
-template void agg_renderer<image_32>::debug_draw_box<agg::rendering_buffer>(
+template class agg_renderer<image_rgba8>;
+template void agg_renderer<image_rgba8>::debug_draw_box<agg::rendering_buffer>(
agg::rendering_buffer& buf,
box2d<double> const& box,
double x, double y, double angle);
-}
+} // end ns
diff --git a/src/agg/process_building_symbolizer.cpp b/src/agg/process_building_symbolizer.cpp
index 9d0baeb..8bbdbd4 100644
--- a/src/agg/process_building_symbolizer.cpp
+++ b/src/agg/process_building_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,7 +22,7 @@
// mapnik
#include <mapnik/make_unique.hpp>
-#include <mapnik/graphics.hpp>
+#include <mapnik/image_any.hpp>
#include <mapnik/feature.hpp>
#include <mapnik/agg_renderer.hpp>
#include <mapnik/agg_rasterizer.hpp>
@@ -54,11 +54,11 @@ void agg_renderer<T0,T1>::process(building_symbolizer const& sym,
mapnik::feature_impl & feature,
proj_transform const& prj_trans)
{
- using path_type = transform_path_adapter<view_transform,geometry_type>;
+ using transform_path_type = transform_path_adapter<view_transform, vertex_adapter>;
using ren_base = agg::renderer_base<agg::pixfmt_rgba32_pre>;
using renderer = agg::renderer_scanline_aa_solid<ren_base>;
- agg::rendering_buffer buf(current_buffer_->raw_data(),current_buffer_->width(),current_buffer_->height(), current_buffer_->width() * 4);
+ agg::rendering_buffer buf(current_buffer_->bytes(),current_buffer_->width(),current_buffer_->height(), current_buffer_->row_size());
agg::pixfmt_rgba32_pre pixf(buf);
ren_base renb(pixf);
@@ -85,32 +85,37 @@ void agg_renderer<T0,T1>::process(building_symbolizer const& sym,
render_building_symbolizer(
feature, height,
- [&,r,g,b,a,opacity](geometry_type &faces) {
- path_type faces_path (this->common_.t_,faces,prj_trans);
+ [&,r,g,b,a,opacity](path_type const& faces)
+ {
+ vertex_adapter va(faces);
+ transform_path_type faces_path (this->common_.t_,va,prj_trans);
ras_ptr->add_path(faces_path);
ren.color(agg::rgba8_pre(int(r*0.8), int(g*0.8), int(b*0.8), int(a * opacity)));
agg::render_scanlines(*ras_ptr, sl, ren);
this->ras_ptr->reset();
},
- [&,r,g,b,a,opacity](geometry_type &frame) {
- path_type path(common_.t_,frame,prj_trans);
- agg::conv_stroke<path_type> stroke(path);
+ [&,r,g,b,a,opacity](path_type const& frame)
+ {
+ vertex_adapter va(frame);
+ transform_path_type path(common_.t_,va, prj_trans);
+ agg::conv_stroke<transform_path_type> stroke(path);
stroke.width(common_.scale_factor_);
ras_ptr->add_path(stroke);
ren.color(agg::rgba8_pre(int(r*0.8), int(g*0.8), int(b*0.8), int(a * opacity)));
agg::render_scanlines(*ras_ptr, sl, ren);
ras_ptr->reset();
},
- [&,r,g,b,a,opacity](geometry_type &roof) {
- path_type roof_path (common_.t_,roof,prj_trans);
+ [&,r,g,b,a,opacity](path_type const& roof)
+ {
+ vertex_adapter va(roof);
+ transform_path_type roof_path (common_.t_,va,prj_trans);
ras_ptr->add_path(roof_path);
ren.color(agg::rgba8_pre(r, g, b, int(a * opacity)));
agg::render_scanlines(*ras_ptr, sl, ren);
});
}
-template void agg_renderer<image_32>::process(building_symbolizer const&,
+template void agg_renderer<image_rgba8>::process(building_symbolizer const&,
mapnik::feature_impl &,
proj_transform const&);
-
}
diff --git a/src/agg/process_debug_symbolizer.cpp b/src/agg/process_debug_symbolizer.cpp
index ecd3790..9f03639 100644
--- a/src/agg/process_debug_symbolizer.cpp
+++ b/src/agg/process_debug_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,13 +23,30 @@
// mapnik
#include <mapnik/feature.hpp>
#include <mapnik/agg_renderer.hpp>
-#include <mapnik/graphics.hpp>
+#include <mapnik/image_any.hpp>
#include <mapnik/symbolizer.hpp>
#include <mapnik/label_collision_detector.hpp>
+#include <mapnik/image_util.hpp>
+#include <mapnik/vertex_processor.hpp>
+#include <mapnik/agg_rasterizer.hpp>
+#include <mapnik/transform_path_adapter.hpp>
+#include <mapnik/agg_helpers.hpp>
+#include <mapnik/util/is_clockwise.hpp>
+
+// agg
+#include "agg_basics.h"
+#include "agg_rendering_buffer.h"
+#include "agg_color_rgba.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_scanline_u.h"
+#include "agg_renderer_scanline.h"
+#include "agg_conv_stroke.h"
namespace mapnik {
-void draw_rect(image_32 &pixmap, box2d<double> const& box)
+namespace {
+template <typename T>
+void draw_rect(T &pixmap, box2d<double> const& box)
{
int x0 = static_cast<int>(box.minx());
int x1 = static_cast<int>(box.maxx());
@@ -38,16 +55,157 @@ void draw_rect(image_32 &pixmap, box2d<double> const& box)
unsigned color1 = 0xff0000ff;
for (int x=x0; x<x1; x++)
{
- pixmap.setPixel(x, y0, color1);
- pixmap.setPixel(x, y1, color1);
+ mapnik::set_pixel(pixmap, x, y0, color1);
+ mapnik::set_pixel(pixmap, x, y1, color1);
}
for (int y=y0; y<y1; y++)
{
- pixmap.setPixel(x0, y, color1);
- pixmap.setPixel(x1, y, color1);
+ mapnik::set_pixel(pixmap, x0, y, color1);
+ mapnik::set_pixel(pixmap, x1, y, color1);
}
}
+template <typename Pixmap>
+struct apply_vertex_mode
+{
+ apply_vertex_mode(Pixmap & pixmap, view_transform const& t, proj_transform const& prj_trans)
+ : pixmap_(pixmap),
+ t_(t),
+ prj_trans_(prj_trans) {}
+
+ template <typename Adapter>
+ void operator() (Adapter const& va) const
+ {
+ double x;
+ double y;
+ double z = 0;
+ va.rewind(0);
+ unsigned cmd = SEG_END;
+ while ((cmd = va.vertex(&x, &y)) != mapnik::SEG_END)
+ {
+ if (cmd == SEG_CLOSE) continue;
+ prj_trans_.backward(x,y,z);
+ t_.forward(&x,&y);
+ mapnik::set_pixel(pixmap_,x,y,0xff0000ff);
+ mapnik::set_pixel(pixmap_,x-1,y-1,0xff0000ff);
+ mapnik::set_pixel(pixmap_,x+1,y+1,0xff0000ff);
+ mapnik::set_pixel(pixmap_,x-1,y+1,0xff0000ff);
+ mapnik::set_pixel(pixmap_,x+1,y-1,0xff0000ff);
+ }
+ }
+
+ Pixmap & pixmap_;
+ view_transform const& t_;
+ proj_transform const& prj_trans_;
+};
+
+
+template <typename BufferType>
+struct RingRenderer {
+
+ using color_type = agg::rgba8;
+ using order_type = agg::order_rgba;
+ using blender_type = agg::comp_op_adaptor_rgba_pre<color_type, order_type>; // comp blender
+ using pixfmt_comp_type = agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer>;
+ using renderer_base = agg::renderer_base<pixfmt_comp_type>;
+ using renderer_type = agg::renderer_scanline_aa_solid<renderer_base>;
+
+ using path_type = transform_path_adapter<view_transform, geometry::ring_vertex_adapter<double> >;
+
+ RingRenderer(rasterizer & ras_ptr,
+ BufferType & im,
+ view_transform const& tr,
+ proj_transform const& prj_trans) :
+ ras_ptr_(ras_ptr),
+ im_(im),
+ tr_(tr),
+ prj_trans_(prj_trans),
+ sl_() {}
+
+ void draw_ring(geometry::linear_ring<double> const& ring,
+ agg::rgba8 const& color)
+ {
+ ras_ptr_.reset();
+ agg::rendering_buffer buf(im_.bytes(),im_.width(),im_.height(),im_.row_size());
+ pixfmt_comp_type pixf(buf);
+ renderer_base renb(pixf);
+ renderer_type ren(renb);
+ geometry::ring_vertex_adapter<double> va(ring);
+ path_type path(tr_,va,prj_trans_);
+ ras_ptr_.add_path(path);
+ ras_ptr_.filling_rule(agg::fill_non_zero);
+ ren.color(color);
+ agg::render_scanlines(ras_ptr_, sl_, ren);
+ }
+
+ void draw_outline(geometry::linear_ring<double> const& ring,
+ agg::rgba8 const& color,
+ double stroke_width=3)
+ {
+ ras_ptr_.reset();
+ agg::rendering_buffer buf(im_.bytes(),im_.width(),im_.height(),im_.row_size());
+ pixfmt_comp_type pixf(buf);
+ renderer_base renb(pixf);
+ renderer_type ren(renb);
+ geometry::ring_vertex_adapter<double> va(ring);
+ path_type path(tr_,va,prj_trans_);
+ agg::conv_stroke<path_type> stroke(path);
+ stroke.width(stroke_width);
+ ras_ptr_.add_path(stroke);
+ ras_ptr_.filling_rule(agg::fill_non_zero);
+ ren.color(color);
+ agg::render_scanlines(ras_ptr_, sl_, ren);
+ }
+
+ rasterizer & ras_ptr_;
+ BufferType & im_;
+ view_transform const& tr_;
+ proj_transform const& prj_trans_;
+ agg::scanline_u8 sl_;
+};
+
+template <typename BufferType>
+struct render_ring_visitor {
+
+ render_ring_visitor(RingRenderer<BufferType> & renderer)
+ : renderer_(renderer) {}
+
+ void operator()(mapnik::geometry::multi_polygon<double> const& geom)
+ {
+ for (auto const& poly : geom)
+ {
+ (*this)(poly);
+ }
+ }
+
+ void operator()(mapnik::geometry::polygon<double> const& geom)
+ {
+ agg::rgba8 red(255,0,0,255);
+ agg::rgba8 green(0,255,255,255);
+ agg::rgba8 black(0,0,0,255);
+ renderer_.draw_ring(geom.exterior_ring,red);
+ if (mapnik::util::is_clockwise(geom.exterior_ring))
+ {
+ renderer_.draw_outline(geom.exterior_ring,black);
+ }
+ for (auto const& ring : geom.interior_rings)
+ {
+ renderer_.draw_ring(ring,green);
+ if (!mapnik::util::is_clockwise(ring))
+ {
+ renderer_.draw_outline(ring,black);
+ }
+ }
+ }
+
+ template<typename GeomType>
+ void operator()(GeomType const&) {}
+
+ RingRenderer<BufferType> & renderer_;
+};
+
+} // anonymous namespace
+
template <typename T0, typename T1>
void agg_renderer<T0,T1>::process(debug_symbolizer const& sym,
mapnik::feature_impl & feature,
@@ -56,7 +214,13 @@ void agg_renderer<T0,T1>::process(debug_symbolizer const& sym,
debug_symbolizer_mode_enum mode = get<debug_symbolizer_mode_enum>(sym, keys::mode, feature, common_.vars_, DEBUG_SYM_MODE_COLLISION);
- if (mode == DEBUG_SYM_MODE_COLLISION)
+ if (mode == DEBUG_SYM_MODE_RINGS)
+ {
+ RingRenderer<buffer_type> renderer(*ras_ptr,*current_buffer_,common_.t_,prj_trans);
+ render_ring_visitor<buffer_type> apply(renderer);
+ mapnik::util::apply_visitor(apply,feature.get_geometry());
+ }
+ else if (mode == DEBUG_SYM_MODE_COLLISION)
{
typename detector_type::query_iterator itr = common_.detector_->begin();
typename detector_type::query_iterator end = common_.detector_->end();
@@ -67,29 +231,13 @@ void agg_renderer<T0,T1>::process(debug_symbolizer const& sym,
}
else if (mode == DEBUG_SYM_MODE_VERTEX)
{
- for (auto const& geom : feature.paths())
- {
- double x;
- double y;
- double z = 0;
- geom.rewind(0);
- unsigned cmd = 1;
- while ((cmd = geom.vertex(&x, &y)) != mapnik::SEG_END)
- {
- if (cmd == SEG_CLOSE) continue;
- prj_trans.backward(x,y,z);
- common_.t_.forward(&x,&y);
- pixmap_.setPixel(x,y,0xff0000ff);
- pixmap_.setPixel(x-1,y-1,0xff0000ff);
- pixmap_.setPixel(x+1,y+1,0xff0000ff);
- pixmap_.setPixel(x-1,y+1,0xff0000ff);
- pixmap_.setPixel(x+1,y-1,0xff0000ff);
- }
- }
+ using apply_vertex_mode = apply_vertex_mode<buffer_type>;
+ apply_vertex_mode apply(pixmap_, common_.t_, prj_trans);
+ util::apply_visitor(geometry::vertex_processor<apply_vertex_mode>(apply), feature.get_geometry());
}
}
-template void agg_renderer<image_32>::process(debug_symbolizer const&,
+template void agg_renderer<image_rgba8>::process(debug_symbolizer const&,
mapnik::feature_impl &,
proj_transform const&);
}
diff --git a/src/agg/process_dot_symbolizer.cpp b/src/agg/process_dot_symbolizer.cpp
new file mode 100644
index 0000000..8e19aa9
--- /dev/null
+++ b/src/agg/process_dot_symbolizer.cpp
@@ -0,0 +1,134 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/feature.hpp>
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/agg_rasterizer.hpp>
+#include <mapnik/symbolizer.hpp>
+#include <mapnik/symbolizer_keys.hpp>
+#include <mapnik/image.hpp>
+#include <mapnik/vertex.hpp>
+#include <mapnik/vertex_processor.hpp>
+#include <mapnik/renderer_common.hpp>
+#include <mapnik/proj_transform.hpp>
+#include <mapnik/image_compositing.hpp>
+
+// agg
+#include "agg_ellipse.h"
+#include "agg_rendering_buffer.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_scanline_u.h"
+#include "agg_renderer_scanline.h"
+#include "agg_color_rgba.h"
+#include "agg_renderer_base.h"
+
+namespace mapnik { namespace detail {
+
+template <typename Rasterizer, typename Renderer, typename Common, typename ProjTransform>
+struct render_dot_symbolizer : util::noncopyable
+{
+ render_dot_symbolizer(double rx, double ry, Rasterizer & ras, Renderer & ren, Common & common, ProjTransform const& prj_trans)
+ : ras_(ras),
+ ren_(ren),
+ common_(common),
+ prj_trans_(prj_trans),
+ rx_(rx),
+ ry_(ry),
+ el_(0, 0, rx, ry) {}
+
+ template <typename Adapter>
+ void operator() (Adapter const& va)
+ {
+ double x,y,z = 0;
+ unsigned cmd = SEG_END;
+ va.rewind(0);
+ while ((cmd = va.vertex(&x, &y)) != mapnik::SEG_END)
+ {
+ if (cmd == SEG_CLOSE) continue;
+ prj_trans_.backward(x, y, z);
+ common_.t_.forward(&x, &y);
+ el_.init(x, y, rx_, ry_, el_.num_steps());
+ ras_.add_path(el_);
+ agg::render_scanlines(ras_, sl_, ren_);
+ }
+ }
+ Rasterizer & ras_;
+ Renderer & ren_;
+ Common & common_;
+ ProjTransform const& prj_trans_;
+ double rx_;
+ double ry_;
+ agg::ellipse el_;
+ agg::scanline_u8 sl_;
+};
+
+} // ns detail
+
+template <typename T0, typename T1>
+void agg_renderer<T0,T1>::process(dot_symbolizer const& sym,
+ mapnik::feature_impl & feature,
+ proj_transform const& prj_trans)
+{
+ double width = 0.0;
+ double height = 0.0;
+ bool has_width = has_key(sym,keys::width);
+ bool has_height = has_key(sym,keys::height);
+ if (has_width && has_height)
+ {
+ width = get<double>(sym, keys::width, feature, common_.vars_, 0.0);
+ height = get<double>(sym, keys::height, feature, common_.vars_, 0.0);
+ }
+ else if (has_width)
+ {
+ width = height = get<double>(sym, keys::width, feature, common_.vars_, 0.0);
+ }
+ else if (has_height)
+ {
+ width = height = get<double>(sym, keys::height, feature, common_.vars_, 0.0);
+ }
+ double rx = width/2.0;
+ double ry = height/2.0;
+ double opacity = get<double>(sym, keys::opacity, feature, common_.vars_, 1.0);
+ color const& fill = get<mapnik::color>(sym, keys::fill, feature, common_.vars_, mapnik::color(128,128,128));
+ ras_ptr->reset();
+ agg::rendering_buffer buf(current_buffer_->bytes(),current_buffer_->width(),current_buffer_->height(),current_buffer_->row_size());
+ using blender_type = agg::comp_op_adaptor_rgba_pre<agg::rgba8, agg::order_rgba>;
+ using pixfmt_comp_type = agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer>;
+ using renderer_base = agg::renderer_base<pixfmt_comp_type>;
+ using renderer_type = agg::renderer_scanline_aa_solid<renderer_base>;
+ pixfmt_comp_type pixf(buf);
+ pixf.comp_op(static_cast<agg::comp_op_e>(get<composite_mode_e>(sym, keys::comp_op, feature, common_.vars_, src_over)));
+ renderer_base renb(pixf);
+ renderer_type ren(renb);
+
+ ren.color(agg::rgba8_pre(fill.red(), fill.green(), fill.blue(), int(fill.alpha() * opacity)));
+ using render_dot_symbolizer_type = detail::render_dot_symbolizer<rasterizer, renderer_type, renderer_common, proj_transform>;
+ render_dot_symbolizer_type apply(rx, ry, *ras_ptr, ren, common_, prj_trans);
+ mapnik::util::apply_visitor(geometry::vertex_processor<render_dot_symbolizer_type>(apply), feature.get_geometry());
+}
+
+template void agg_renderer<image_rgba8>::process(dot_symbolizer const&,
+ mapnik::feature_impl &,
+ proj_transform const&);
+
+}
diff --git a/src/agg/process_group_symbolizer.cpp b/src/agg/process_group_symbolizer.cpp
index b48cbf1..a0cf894 100644
--- a/src/agg/process_group_symbolizer.cpp
+++ b/src/agg/process_group_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,9 @@
#include <mapnik/feature.hpp>
#include <mapnik/agg_renderer.hpp>
#include <mapnik/agg_rasterizer.hpp>
+#include <mapnik/agg_render_marker.hpp>
#include <mapnik/image_util.hpp>
+#include <mapnik/image.hpp>
#include <mapnik/util/variant.hpp>
#include <mapnik/text/renderer.hpp>
#include <mapnik/geom_util.hpp>
@@ -32,6 +34,10 @@
#include <mapnik/pixel_position.hpp>
#include <mapnik/renderer_common/process_group_symbolizer.hpp>
#include <mapnik/renderer_common/clipping_extent.hpp>
+#include <mapnik/svg/svg_renderer_agg.hpp>
+#include <mapnik/svg/svg_path_attributes.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+#include <mapnik/svg/svg_converter.hpp>
// agg
#include "agg_trans_affine.h"
@@ -43,24 +49,67 @@ namespace mapnik {
* to render it, and the boxes themselves should already be
* in the detector from the placement_finder.
*/
-struct thunk_renderer : public util::static_visitor<>
+
+template <typename T>
+struct thunk_renderer;
+
+template <>
+struct thunk_renderer<image_rgba8>
{
- using renderer_type = agg_renderer<image_32>;
+ using renderer_type = agg_renderer<image_rgba8>;
using buffer_type = renderer_type::buffer_type;
using text_renderer_type = agg_text_renderer<buffer_type>;
thunk_renderer(renderer_type &ren,
+ std::unique_ptr<rasterizer> const& ras_ptr,
buffer_type *buf,
renderer_common &common,
pixel_position const &offset)
- : ren_(ren), buf_(buf), common_(common), offset_(offset)
+ : ren_(ren), ras_ptr_(ras_ptr), buf_(buf), common_(common), offset_(offset)
{}
- void operator()(point_render_thunk const &thunk) const
+ void operator()(vector_marker_render_thunk const &thunk) const
+ {
+ using blender_type = agg::comp_op_adaptor_rgba_pre<agg::rgba8, agg::order_rgba>; // comp blender
+ using buf_type = agg::rendering_buffer;
+ using pixfmt_comp_type = agg::pixfmt_custom_blend_rgba<blender_type, buf_type>;
+ using renderer_base = agg::renderer_base<pixfmt_comp_type>;
+ using renderer_type = agg::renderer_scanline_aa_solid<renderer_base>;
+ using svg_attribute_type = agg::pod_bvector<svg::path_attributes>;
+ using svg_renderer_type = svg::svg_renderer_agg<svg_path_adapter,
+ svg_attribute_type,
+ renderer_type,
+ pixfmt_comp_type>;
+ ras_ptr_->reset();
+ buf_type render_buffer(buf_->bytes(), buf_->width(), buf_->height(), buf_->row_size());
+ pixfmt_comp_type pixf(render_buffer);
+ pixf.comp_op(static_cast<agg::comp_op_e>(thunk.comp_op_));
+ renderer_base renb(pixf);
+ svg::vertex_stl_adapter<svg::svg_path_storage> stl_storage(thunk.src_->source());
+ svg_path_adapter svg_path(stl_storage);
+ svg_renderer_type svg_renderer(svg_path, thunk.attrs_);
+
+ agg::trans_affine offset_tr = thunk.tr_;
+ offset_tr.translate(offset_.x, offset_.y);
+ render_vector_marker(svg_renderer, *ras_ptr_, renb, thunk.src_->bounding_box(), offset_tr, thunk.opacity_, thunk.snap_to_pixels_);
+ }
+
+ void operator()(raster_marker_render_thunk const &thunk) const
{
- pixel_position new_pos(thunk.pos_.x + offset_.x, thunk.pos_.y + offset_.y);
- ren_.render_marker(new_pos, *thunk.marker_, thunk.tr_, thunk.opacity_,
- thunk.comp_op_);
+ using blender_type = agg::comp_op_adaptor_rgba_pre<agg::rgba8, agg::order_rgba>; // comp blender
+ using buf_type = agg::rendering_buffer;
+ using pixfmt_comp_type = agg::pixfmt_custom_blend_rgba<blender_type, buf_type>;
+ using renderer_base = agg::renderer_base<pixfmt_comp_type>;
+
+ ras_ptr_->reset();
+ buf_type render_buffer(buf_->bytes(), buf_->width(), buf_->height(), buf_->row_size());
+ pixfmt_comp_type pixf(render_buffer);
+ pixf.comp_op(static_cast<agg::comp_op_e>(thunk.comp_op_));
+ renderer_base renb(pixf);
+
+ agg::trans_affine offset_tr = thunk.tr_;
+ offset_tr.translate(offset_.x, offset_.y);
+ render_raster_marker(renb, *ras_ptr_, thunk.src_, offset_tr, thunk.opacity_, common_.scale_factor_, thunk.snap_to_pixels_);
}
void operator()(text_render_thunk const &thunk) const
@@ -73,11 +122,12 @@ struct thunk_renderer : public util::static_visitor<>
offset_,
[&] (glyph_positions_ptr glyphs)
{
- if (glyphs->marker())
+ marker_info_ptr mark = glyphs->get_marker();
+ if (mark)
{
ren_.render_marker(glyphs->marker_pos(),
- *(glyphs->marker()->marker),
- glyphs->marker()->transform,
+ *mark->marker_,
+ mark->transform_,
thunk.opacity_, thunk.comp_op_);
}
ren.render(*glyphs);
@@ -87,11 +137,12 @@ struct thunk_renderer : public util::static_visitor<>
template <typename T>
void operator()(T const &) const
{
- // TODO: warning if unimplemented?
+ throw std::runtime_error("Rendering of this data type is not supported currently by the renderer");
}
private:
renderer_type &ren_;
+ std::unique_ptr<rasterizer> const& ras_ptr_;
buffer_type *buf_;
renderer_common &common_;
pixel_position offset_;
@@ -106,7 +157,7 @@ void agg_renderer<T0,T1>::process(group_symbolizer const& sym,
sym, feature, common_.vars_, prj_trans, clipping_extent(common_), common_,
[&](render_thunk_list const& thunks, pixel_position const& render_offset)
{
- thunk_renderer ren(*this, current_buffer_, common_, render_offset);
+ thunk_renderer<buffer_type> ren(*this, ras_ptr, current_buffer_, common_, render_offset);
for (render_thunk_ptr const& thunk : thunks)
{
util::apply_visitor(ren, *thunk);
@@ -114,7 +165,7 @@ void agg_renderer<T0,T1>::process(group_symbolizer const& sym,
});
}
-template void agg_renderer<image_32>::process(group_symbolizer const&,
+template void agg_renderer<image_rgba8>::process(group_symbolizer const&,
mapnik::feature_impl &,
proj_transform const&);
diff --git a/src/agg/process_line_pattern_symbolizer.cpp b/src/agg/process_line_pattern_symbolizer.cpp
index 412b4d5..03ce251 100644
--- a/src/agg/process_line_pattern_symbolizer.cpp
+++ b/src/agg/process_line_pattern_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,7 +23,7 @@
// mapnik
#include <mapnik/feature.hpp>
#include <mapnik/debug.hpp>
-#include <mapnik/graphics.hpp>
+#include <mapnik/image_any.hpp>
#include <mapnik/agg_renderer.hpp>
#include <mapnik/agg_rasterizer.hpp>
#include <mapnik/agg_pattern_source.hpp>
@@ -31,10 +31,12 @@
#include <mapnik/marker_cache.hpp>
#include <mapnik/symbolizer.hpp>
#include <mapnik/vertex_converters.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/vertex_processor.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/parse_path.hpp>
#include <mapnik/renderer_common/clipping_extent.hpp>
#include <mapnik/renderer_common/render_pattern.hpp>
+#include <mapnik/renderer_common/apply_vertex_converter.hpp>
// agg
#include "agg_basics.h"
#include "agg_pixfmt_rgba.h"
@@ -52,99 +54,199 @@
namespace mapnik {
-template <typename T0, typename T1>
-void agg_renderer<T0,T1>::process(line_pattern_symbolizer const& sym,
- mapnik::feature_impl & feature,
- proj_transform const& prj_trans)
+template <typename buffer_type>
+struct agg_renderer_process_visitor_l
{
-
- using color = agg::rgba8;
- using order = agg::order_rgba;
- using blender_type = agg::comp_op_adaptor_rgba_pre<color, order>;
- using pattern_filter_type = agg::pattern_filter_bilinear_rgba8;
- using pattern_type = agg::line_image_pattern<pattern_filter_type>;
- using pixfmt_type = agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer>;
- using renderer_base = agg::renderer_base<pixfmt_type>;
- using renderer_type = agg::renderer_outline_image<renderer_base, pattern_type>;
- using rasterizer_type = agg::rasterizer_outline_aa<renderer_type>;
-
- std::string filename = get<std::string, keys::file>(sym, feature, common_.vars_);
- if (filename.empty()) return;
- boost::optional<mapnik::marker_ptr> marker_ptr = marker_cache::instance().find(filename, true);
- if (!marker_ptr || !(*marker_ptr)) return;
- boost::optional<image_ptr> pat;
- // TODO - re-implement at renderer level like polygon_pattern symbolizer
- value_double opacity = get<value_double, keys::opacity>(sym, feature, common_.vars_);
- if ((*marker_ptr)->is_bitmap())
- {
- pat = (*marker_ptr)->get_bitmap_data();
- }
- else
+ agg_renderer_process_visitor_l(renderer_common & common,
+ buffer_type & pixmap,
+ buffer_type * current_buffer,
+ std::unique_ptr<rasterizer> const& ras_ptr,
+ line_pattern_symbolizer const& sym,
+ mapnik::feature_impl & feature,
+ proj_transform const& prj_trans)
+ : common_(common),
+ pixmap_(pixmap),
+ current_buffer_(current_buffer),
+ ras_ptr_(ras_ptr),
+ sym_(sym),
+ feature_(feature),
+ prj_trans_(prj_trans) {}
+
+ void operator() (marker_null const&) {}
+
+ void operator() (marker_svg const& marker)
{
+ using color = agg::rgba8;
+ using order = agg::order_rgba;
+ using blender_type = agg::comp_op_adaptor_rgba_pre<color, order>;
+ using pattern_filter_type = agg::pattern_filter_bilinear_rgba8;
+ using pattern_type = agg::line_image_pattern<pattern_filter_type>;
+ using pixfmt_type = agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer>;
+ using renderer_base = agg::renderer_base<pixfmt_type>;
+ using renderer_type = agg::renderer_outline_image<renderer_base, pattern_type>;
+ using rasterizer_type = agg::rasterizer_outline_aa<renderer_type>;
+
+ value_double opacity = get<value_double, keys::opacity>(sym_, feature_, common_.vars_);
agg::trans_affine image_tr = agg::trans_affine_scaling(common_.scale_factor_);
- auto image_transform = get_optional<transform_type>(sym, keys::image_transform);
- if (image_transform) evaluate_transform(image_tr, feature, common_.vars_, *image_transform);
- pat = render_pattern(*ras_ptr, **marker_ptr, image_tr, 1.0);
+ auto image_transform = get_optional<transform_type>(sym_, keys::image_transform);
+ if (image_transform) evaluate_transform(image_tr, feature_, common_.vars_, *image_transform);
+ mapnik::box2d<double> const& bbox_image = marker.get_data()->bounding_box() * image_tr;
+ image_rgba8 image(bbox_image.width(), bbox_image.height());
+ render_pattern<buffer_type>(*ras_ptr_, marker, image_tr, 1.0, image);
+
+ value_bool clip = get<value_bool, keys::clip>(sym_, feature_, common_.vars_);
+ value_double offset = get<value_double, keys::offset>(sym_, feature_, common_.vars_);
+ value_double simplify_tolerance = get<value_double, keys::simplify_tolerance>(sym_, feature_, common_.vars_);
+ value_double smooth = get<value_double, keys::smooth>(sym_, feature_, common_.vars_);
+
+ agg::rendering_buffer buf(current_buffer_->bytes(),current_buffer_->width(),current_buffer_->height(), current_buffer_->row_size());
+ pixfmt_type pixf(buf);
+ pixf.comp_op(static_cast<agg::comp_op_e>(get<composite_mode_e, keys::comp_op>(sym_, feature_, common_.vars_)));
+ renderer_base ren_base(pixf);
+ agg::pattern_filter_bilinear_rgba8 filter;
+
+ pattern_source source(image, opacity);
+ pattern_type pattern (filter,source);
+ renderer_type ren(ren_base, pattern);
+ ren.clip_box(0,0,common_.width_,common_.height_);
+ rasterizer_type ras(ren);
+
+ agg::trans_affine tr;
+ auto transform = get_optional<transform_type>(sym_, keys::geometry_transform);
+ if (transform) evaluate_transform(tr, feature_, common_.vars_, *transform, common_.scale_factor_);
+
+ box2d<double> clip_box = clipping_extent(common_);
+ if (clip)
+ {
+ double padding = (double)(common_.query_extent_.width()/pixmap_.width());
+ double half_stroke = marker.width()/2.0;
+ if (half_stroke > 1)
+ padding *= half_stroke;
+ if (std::fabs(offset) > 0)
+ padding *= std::fabs(offset) * 1.2;
+ padding *= common_.scale_factor_;
+ clip_box.pad(padding);
+ }
+ using vertex_converter_type = vertex_converter<clip_line_tag, transform_tag,
+ affine_transform_tag,
+ simplify_tag,smooth_tag,
+ offset_transform_tag>;
+
+ vertex_converter_type converter(clip_box,sym_,common_.t_,prj_trans_,tr,feature_,common_.vars_,common_.scale_factor_);
+
+ if (clip) converter.set<clip_line_tag>(); //optional clip (default: true)
+ converter.set<transform_tag>(); //always transform
+ if (simplify_tolerance > 0.0) converter.set<simplify_tag>(); // optional simplify converter
+ if (std::fabs(offset) > 0.0) converter.set<offset_transform_tag>(); // parallel offset
+ converter.set<affine_transform_tag>(); // optional affine transform
+ if (smooth > 0.0) converter.set<smooth_tag>(); // optional smooth converter
+
+ using apply_vertex_converter_type = detail::apply_vertex_converter<vertex_converter_type, rasterizer_type>;
+ using vertex_processor_type = geometry::vertex_processor<apply_vertex_converter_type>;
+ apply_vertex_converter_type apply(converter, ras);
+ mapnik::util::apply_visitor(vertex_processor_type(apply),feature_.get_geometry());
}
- if (!pat) return;
-
- value_bool clip = get<value_bool, keys::clip>(sym, feature, common_.vars_);
- value_double offset = get<value_double, keys::offset>(sym, feature, common_.vars_);
- value_double simplify_tolerance = get<value_double, keys::simplify_tolerance>(sym, feature, common_.vars_);
- value_double smooth = get<value_double, keys::smooth>(sym, feature, common_.vars_);
-
- agg::rendering_buffer buf(current_buffer_->raw_data(),current_buffer_->width(),current_buffer_->height(), current_buffer_->width() * 4);
- pixfmt_type pixf(buf);
- pixf.comp_op(static_cast<agg::comp_op_e>(get<composite_mode_e, keys::comp_op>(sym, feature, common_.vars_)));
- renderer_base ren_base(pixf);
- agg::pattern_filter_bilinear_rgba8 filter;
-
- pattern_source source(*(*pat), opacity);
- pattern_type pattern (filter,source);
- renderer_type ren(ren_base, pattern);
- rasterizer_type ras(ren);
-
- agg::trans_affine tr;
- auto transform = get_optional<transform_type>(sym, keys::geometry_transform);
- if (transform) evaluate_transform(tr, feature, common_.vars_, *transform, common_.scale_factor_);
-
- box2d<double> clip_box = clipping_extent(common_);
- if (clip)
+ void operator() (marker_rgba8 const& marker)
{
- double padding = (double)(common_.query_extent_.width()/pixmap_.width());
- double half_stroke = (*marker_ptr)->width()/2.0;
- if (half_stroke > 1)
- padding *= half_stroke;
- if (std::fabs(offset) > 0)
- padding *= std::fabs(offset) * 1.2;
- padding *= common_.scale_factor_;
- clip_box.pad(padding);
+ using color = agg::rgba8;
+ using order = agg::order_rgba;
+ using blender_type = agg::comp_op_adaptor_rgba_pre<color, order>;
+ using pattern_filter_type = agg::pattern_filter_bilinear_rgba8;
+ using pattern_type = agg::line_image_pattern<pattern_filter_type>;
+ using pixfmt_type = agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer>;
+ using renderer_base = agg::renderer_base<pixfmt_type>;
+ using renderer_type = agg::renderer_outline_image<renderer_base, pattern_type>;
+ using rasterizer_type = agg::rasterizer_outline_aa<renderer_type>;
+
+ value_double opacity = get<value_double, keys::opacity>(sym_, feature_, common_.vars_);
+ mapnik::image_rgba8 const& image = marker.get_data();
+
+ value_bool clip = get<value_bool, keys::clip>(sym_, feature_, common_.vars_);
+ value_double offset = get<value_double, keys::offset>(sym_, feature_, common_.vars_);
+ value_double simplify_tolerance = get<value_double, keys::simplify_tolerance>(sym_, feature_, common_.vars_);
+ value_double smooth = get<value_double, keys::smooth>(sym_, feature_, common_.vars_);
+
+ agg::rendering_buffer buf(current_buffer_->bytes(),current_buffer_->width(),
+ current_buffer_->height(), current_buffer_->row_size());
+ pixfmt_type pixf(buf);
+ pixf.comp_op(static_cast<agg::comp_op_e>(get<composite_mode_e, keys::comp_op>(sym_, feature_, common_.vars_)));
+ renderer_base ren_base(pixf);
+ agg::pattern_filter_bilinear_rgba8 filter;
+
+ pattern_source source(image, opacity);
+ pattern_type pattern (filter,source);
+ renderer_type ren(ren_base, pattern);
+ ren.clip_box(0,0,common_.width_,common_.height_);
+ rasterizer_type ras(ren);
+
+ agg::trans_affine tr;
+ auto transform = get_optional<transform_type>(sym_, keys::geometry_transform);
+ if (transform) evaluate_transform(tr, feature_, common_.vars_, *transform, common_.scale_factor_);
+
+ box2d<double> clip_box = clipping_extent(common_);
+ if (clip)
+ {
+ double padding = (double)(common_.query_extent_.width()/pixmap_.width());
+ double half_stroke = marker.width()/2.0;
+ if (half_stroke > 1)
+ padding *= half_stroke;
+ if (std::fabs(offset) > 0)
+ padding *= std::fabs(offset) * 1.2;
+ padding *= common_.scale_factor_;
+ clip_box.pad(padding);
+ }
+ using vertex_converter_type = vertex_converter<clip_line_tag, transform_tag,
+ affine_transform_tag,
+ simplify_tag,smooth_tag,
+ offset_transform_tag>;
+
+ vertex_converter_type converter(clip_box,sym_,common_.t_,prj_trans_,tr,feature_,common_.vars_,common_.scale_factor_);
+
+ if (clip) converter.set<clip_line_tag>(); //optional clip (default: true)
+ converter.set<transform_tag>(); //always transform
+ if (simplify_tolerance > 0.0) converter.set<simplify_tag>(); // optional simplify converter
+ if (std::fabs(offset) > 0.0) converter.set<offset_transform_tag>(); // parallel offset
+ converter.set<affine_transform_tag>(); // optional affine transform
+ if (smooth > 0.0) converter.set<smooth_tag>(); // optional smooth converter
+
+ using apply_vertex_converter_type = detail::apply_vertex_converter<vertex_converter_type, rasterizer_type>;
+ using vertex_processor_type = geometry::vertex_processor<apply_vertex_converter_type>;
+ apply_vertex_converter_type apply(converter, ras);
+ mapnik::util::apply_visitor(vertex_processor_type(apply),feature_.get_geometry());
}
- vertex_converter<rasterizer_type, clip_line_tag, transform_tag,
- affine_transform_tag,
- simplify_tag,smooth_tag,
- offset_transform_tag>
- converter(clip_box,ras,sym,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
+ private:
+ renderer_common & common_;
+ buffer_type & pixmap_;
+ buffer_type * current_buffer_;
+ std::unique_ptr<rasterizer> const& ras_ptr_;
+ line_pattern_symbolizer const& sym_;
+ mapnik::feature_impl & feature_;
+ proj_transform const& prj_trans_;
+};
- if (clip) converter.set<clip_line_tag>(); //optional clip (default: true)
- converter.set<transform_tag>(); //always transform
- if (simplify_tolerance > 0.0) converter.set<simplify_tag>(); // optional simplify converter
- if (std::fabs(offset) > 0.0) converter.set<offset_transform_tag>(); // parallel offset
- converter.set<affine_transform_tag>(); // optional affine transform
- if (smooth > 0.0) converter.set<smooth_tag>(); // optional smooth converter
+template <typename T0, typename T1>
+void agg_renderer<T0,T1>::process(line_pattern_symbolizer const& sym,
+ mapnik::feature_impl & feature,
+ proj_transform const& prj_trans)
+{
- for (geometry_type & geom : feature.paths())
- {
- if (geom.size() > 1)
- {
- converter.apply(geom);
- }
- }
+
+ std::string filename = get<std::string, keys::file>(sym, feature, common_.vars_);
+ if (filename.empty()) return;
+ std::shared_ptr<mapnik::marker const> marker = marker_cache::instance().find(filename, true);
+ agg_renderer_process_visitor_l<buffer_type> visitor(common_,
+ pixmap_,
+ current_buffer_,
+ ras_ptr,
+ sym,
+ feature,
+ prj_trans);
+ util::apply_visitor(visitor, *marker);
}
-template void agg_renderer<image_32>::process(line_pattern_symbolizer const&,
+template void agg_renderer<image_rgba8>::process(line_pattern_symbolizer const&,
mapnik::feature_impl &,
proj_transform const&);
diff --git a/src/agg/process_line_symbolizer.cpp b/src/agg/process_line_symbolizer.cpp
index a2eca24..7397141 100644
--- a/src/agg/process_line_symbolizer.cpp
+++ b/src/agg/process_line_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,13 +22,15 @@
// mapnik
#include <mapnik/feature.hpp>
-#include <mapnik/graphics.hpp>
+#include <mapnik/image_any.hpp>
#include <mapnik/agg_helpers.hpp>
#include <mapnik/agg_renderer.hpp>
#include <mapnik/agg_rasterizer.hpp>
#include <mapnik/symbolizer.hpp>
#include <mapnik/vertex_converters.hpp>
+#include <mapnik/vertex_processor.hpp>
#include <mapnik/renderer_common/clipping_extent.hpp>
+#include <mapnik/renderer_common/apply_vertex_converter.hpp>
// agg
#include "agg_basics.h"
#include "agg_rendering_buffer.h"
@@ -43,9 +45,6 @@
#include "agg_renderer_outline_aa.h"
#include "agg_rasterizer_outline_aa.h"
-// boost
-
-
// stl
#include <string>
#include <cmath>
@@ -109,7 +108,7 @@ void agg_renderer<T0,T1>::process(line_symbolizer const& sym,
gamma_ = gamma;
}
- agg::rendering_buffer buf(current_buffer_->raw_data(),current_buffer_->width(),current_buffer_->height(), current_buffer_->width() * 4);
+ agg::rendering_buffer buf(current_buffer_->bytes(),current_buffer_->width(),current_buffer_->height(), current_buffer_->row_size());
using color_type = agg::rgba8;
using order_type = agg::order_rgba;
@@ -165,12 +164,11 @@ void agg_renderer<T0,T1>::process(line_symbolizer const& sym,
rasterizer_type ras(ren);
set_join_caps_aa(sym, ras, feature, common_.vars_);
- vertex_converter<rasterizer_type,clip_line_tag, transform_tag,
- affine_transform_tag,
- simplify_tag, smooth_tag,
- offset_transform_tag,
- dash_tag, stroke_tag>
- converter(clip_box,ras,sym,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
+ using vertex_converter_type = vertex_converter<clip_line_tag, transform_tag,
+ affine_transform_tag,
+ simplify_tag, smooth_tag,
+ offset_transform_tag>;
+ vertex_converter_type converter(clip_box,sym,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
if (clip) converter.set<clip_line_tag>(); // optional clip (default: true)
converter.set<transform_tag>(); // always transform
if (std::fabs(offset) > 0.0) converter.set<offset_transform_tag>(); // parallel offset
@@ -178,22 +176,19 @@ void agg_renderer<T0,T1>::process(line_symbolizer const& sym,
if (simplify_tolerance > 0.0) converter.set<simplify_tag>(); // optional simplify converter
if (smooth > 0.0) converter.set<smooth_tag>(); // optional smooth converter
- for (geometry_type & geom : feature.paths())
- {
- if (geom.size() > 1)
- {
- converter.apply(geom);
- }
- }
+ using apply_vertex_converter_type = detail::apply_vertex_converter<vertex_converter_type, rasterizer_type>;
+ using vertex_processor_type = geometry::vertex_processor<apply_vertex_converter_type>;
+ apply_vertex_converter_type apply(converter, ras);
+ mapnik::util::apply_visitor(vertex_processor_type(apply),feature.get_geometry());
}
else
{
- vertex_converter<rasterizer,clip_line_tag, transform_tag,
- affine_transform_tag,
- simplify_tag, smooth_tag,
- offset_transform_tag,
- dash_tag, stroke_tag>
- converter(clip_box,*ras_ptr,sym,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
+ using vertex_converter_type = vertex_converter<clip_line_tag, transform_tag,
+ affine_transform_tag,
+ simplify_tag, smooth_tag,
+ offset_transform_tag,
+ dash_tag, stroke_tag>;
+ vertex_converter_type converter(clip_box, sym,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
if (clip) converter.set<clip_line_tag>(); // optional clip (default: true)
converter.set<transform_tag>(); // always transform
@@ -205,13 +200,10 @@ void agg_renderer<T0,T1>::process(line_symbolizer const& sym,
converter.set<dash_tag>();
converter.set<stroke_tag>(); //always stroke
- for (geometry_type & geom : feature.paths())
- {
- if (geom.size() > 1)
- {
- converter.apply(geom);
- }
- }
+ using apply_vertex_converter_type = detail::apply_vertex_converter<vertex_converter_type, rasterizer>;
+ using vertex_processor_type = geometry::vertex_processor<apply_vertex_converter_type>;
+ apply_vertex_converter_type apply(converter, *ras_ptr);
+ mapnik::util::apply_visitor(vertex_processor_type(apply),feature.get_geometry());
using renderer_type = agg::renderer_scanline_aa_solid<renderer_base>;
renderer_type ren(renb);
@@ -223,7 +215,7 @@ void agg_renderer<T0,T1>::process(line_symbolizer const& sym,
}
-template void agg_renderer<image_32>::process(line_symbolizer const&,
+template void agg_renderer<image_rgba8>::process(line_symbolizer const&,
mapnik::feature_impl &,
proj_transform const&);
diff --git a/src/agg/process_markers_symbolizer.cpp b/src/agg/process_markers_symbolizer.cpp
index 4c3ac30..27489d3 100644
--- a/src/agg/process_markers_symbolizer.cpp
+++ b/src/agg/process_markers_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -21,7 +21,6 @@
*****************************************************************************/
// mapnik
-#include <mapnik/graphics.hpp>
#include <mapnik/agg_helpers.hpp>
#include <mapnik/agg_renderer.hpp>
#include <mapnik/agg_rasterizer.hpp>
@@ -32,6 +31,7 @@
#include <mapnik/marker_helpers.hpp>
#include <mapnik/marker.hpp>
#include <mapnik/marker_cache.hpp>
+#include <mapnik/agg_render_marker.hpp>
#include <mapnik/svg/svg_renderer_agg.hpp>
#include <mapnik/svg/svg_storage.hpp>
#include <mapnik/svg/svg_path_adapter.hpp>
@@ -59,6 +59,109 @@
namespace mapnik {
+namespace detail {
+
+template <typename SvgRenderer, typename Detector, typename RendererContext>
+struct vector_markers_rasterizer_dispatch : public vector_markers_dispatch<Detector>
+{
+ using renderer_base = typename SvgRenderer::renderer_base;
+ using vertex_source_type = typename SvgRenderer::vertex_source_type;
+ using attribute_source_type = typename SvgRenderer::attribute_source_type;
+ using pixfmt_type = typename renderer_base::pixfmt_type;
+
+ using BufferType = typename std::tuple_element<0,RendererContext>::type;
+ using RasterizerType = typename std::tuple_element<1,RendererContext>::type;
+
+ vector_markers_rasterizer_dispatch(svg_path_ptr const& src,
+ vertex_source_type & path,
+ svg_attribute_type const& attrs,
+ agg::trans_affine const& marker_trans,
+ symbolizer_base const& sym,
+ Detector & detector,
+ double scale_factor,
+ feature_impl & feature,
+ attributes const& vars,
+ bool snap_to_pixels,
+ RendererContext const& renderer_context)
+: vector_markers_dispatch<Detector>(src, marker_trans, sym, detector, scale_factor, feature, vars),
+ buf_(std::get<0>(renderer_context)),
+ pixf_(buf_),
+ renb_(pixf_),
+ svg_renderer_(path, attrs),
+ ras_(std::get<1>(renderer_context)),
+ snap_to_pixels_(snap_to_pixels)
+ {
+ pixf_.comp_op(static_cast<agg::comp_op_e>(get<composite_mode_e, keys::comp_op>(sym, feature, vars)));
+ }
+
+ ~vector_markers_rasterizer_dispatch() {}
+
+ void render_marker(agg::trans_affine const& marker_tr, double opacity)
+ {
+ render_vector_marker(svg_renderer_, ras_, renb_, this->src_->bounding_box(),
+ marker_tr, opacity, snap_to_pixels_);
+ }
+
+private:
+ BufferType & buf_;
+ pixfmt_type pixf_;
+ renderer_base renb_;
+ SvgRenderer svg_renderer_;
+ RasterizerType & ras_;
+ bool snap_to_pixels_;
+};
+
+template <typename Detector, typename RendererContext>
+struct raster_markers_rasterizer_dispatch : public raster_markers_dispatch<Detector>
+{
+ using BufferType = typename std::remove_reference<typename std::tuple_element<0,RendererContext>::type>::type;
+ using RasterizerType = typename std::tuple_element<1,RendererContext>::type;
+
+ using color_type = agg::rgba8;
+ using order_type = agg::order_rgba;
+ using pixel_type = agg::pixel32_type;
+ using blender_type = agg::comp_op_adaptor_rgba_pre<color_type, order_type>; // comp blender
+ using pixfmt_comp_type = agg::pixfmt_custom_blend_rgba<blender_type, BufferType>;
+ using renderer_base = agg::renderer_base<pixfmt_comp_type>;
+
+ raster_markers_rasterizer_dispatch(image_rgba8 const& src,
+ agg::trans_affine const& marker_trans,
+ symbolizer_base const& sym,
+ Detector & detector,
+ double scale_factor,
+ feature_impl & feature,
+ attributes const& vars,
+ RendererContext const& renderer_context,
+ bool snap_to_pixels = false)
+ : raster_markers_dispatch<Detector>(src, marker_trans, sym, detector, scale_factor, feature, vars),
+ buf_(std::get<0>(renderer_context)),
+ pixf_(buf_),
+ renb_(pixf_),
+ ras_(std::get<1>(renderer_context)),
+ snap_to_pixels_(snap_to_pixels)
+ {
+ pixf_.comp_op(static_cast<agg::comp_op_e>(get<composite_mode_e, keys::comp_op>(sym, feature, vars)));
+ }
+
+ ~raster_markers_rasterizer_dispatch() {}
+
+ void render_marker(agg::trans_affine const& marker_tr, double opacity)
+ {
+ // In the long term this should be a visitor pattern based on the type of render this->src_ provided that converts
+ // the destination pixel type required.
+ render_raster_marker(renb_, ras_, this->src_, marker_tr, opacity, this->scale_factor_, snap_to_pixels_);
+ }
+
+private:
+ BufferType & buf_;
+ pixfmt_comp_type pixf_;
+ renderer_base renb_;
+ RasterizerType & ras_;
+ bool snap_to_pixels_;
+};
+
+}
+
template <typename T0, typename T1>
void agg_renderer<T0,T1>::process(markers_symbolizer const& sym,
feature_impl & feature,
@@ -89,19 +192,19 @@ void agg_renderer<T0,T1>::process(markers_symbolizer const& sym,
gamma_ = gamma;
}
- buf_type render_buffer(current_buffer_->raw_data(), current_buffer_->width(), current_buffer_->height(), current_buffer_->width() * 4);
+ buf_type render_buffer(current_buffer_->bytes(), current_buffer_->width(), current_buffer_->height(), current_buffer_->row_size());
box2d<double> clip_box = clipping_extent(common_);
auto renderer_context = std::tie(render_buffer,*ras_ptr,pixmap_);
using context_type = decltype(renderer_context);
- using vector_dispatch_type = vector_markers_rasterizer_dispatch<svg_renderer_type, detector_type, context_type>;
- using raster_dispatch_type = raster_markers_rasterizer_dispatch<detector_type, context_type>;
+ using vector_dispatch_type = detail::vector_markers_rasterizer_dispatch<svg_renderer_type, detector_type, context_type>;
+ using raster_dispatch_type = detail::raster_markers_rasterizer_dispatch<detector_type, context_type>;
render_markers_symbolizer<vector_dispatch_type, raster_dispatch_type>(
sym, feature, prj_trans, common_, clip_box, renderer_context);
}
-template void agg_renderer<image_32>::process(markers_symbolizer const&,
+template void agg_renderer<image_rgba8>::process(markers_symbolizer const&,
mapnik::feature_impl &,
proj_transform const&);
}
diff --git a/src/agg/process_point_symbolizer.cpp b/src/agg/process_point_symbolizer.cpp
index 96d0410..cabae6d 100644
--- a/src/agg/process_point_symbolizer.cpp
+++ b/src/agg/process_point_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,6 +25,7 @@
#include <mapnik/agg_renderer.hpp>
#include <mapnik/agg_rasterizer.hpp>
#include <mapnik/image_util.hpp>
+#include <mapnik/image_any.hpp>
#include <mapnik/geom_util.hpp>
#include <mapnik/symbolizer.hpp>
#include <mapnik/marker.hpp>
@@ -53,13 +54,13 @@ void agg_renderer<T0,T1>::process(point_symbolizer const& sym,
render_point_symbolizer(
sym, feature, prj_trans, common_,
- [&](pixel_position const& pos, marker const& marker,
+ [&](pixel_position const& pos, marker const& marker,
agg::trans_affine const& tr, double opacity) {
render_marker(pos, marker, tr, opacity, comp_op);
});
}
-template void agg_renderer<image_32>::process(point_symbolizer const&,
+template void agg_renderer<image_rgba8>::process(point_symbolizer const&,
mapnik::feature_impl &,
proj_transform const&);
diff --git a/src/agg/process_polygon_pattern_symbolizer.cpp b/src/agg/process_polygon_pattern_symbolizer.cpp
index ea58d8b..a69d266 100644
--- a/src/agg/process_polygon_pattern_symbolizer.cpp
+++ b/src/agg/process_polygon_pattern_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,13 +23,13 @@
// mapnik
#include <mapnik/feature.hpp>
#include <mapnik/debug.hpp>
-#include <mapnik/graphics.hpp>
#include <mapnik/agg_renderer.hpp>
#include <mapnik/agg_helpers.hpp>
#include <mapnik/agg_rasterizer.hpp>
#include <mapnik/marker.hpp>
#include <mapnik/marker_cache.hpp>
#include <mapnik/vertex_converters.hpp>
+#include <mapnik/vertex_processor.hpp>
#include <mapnik/parse_path.hpp>
#include <mapnik/symbolizer.hpp>
#include <mapnik/svg/svg_converter.hpp>
@@ -37,7 +37,8 @@
#include <mapnik/svg/svg_path_adapter.hpp>
#include <mapnik/renderer_common/clipping_extent.hpp>
#include <mapnik/renderer_common/render_pattern.hpp>
-
+#include <mapnik/renderer_common/apply_vertex_converter.hpp>
+#include <mapnik/renderer_common/pattern_alignment.hpp>
// agg
#include "agg_basics.h"
#include "agg_rendering_buffer.h"
@@ -54,134 +55,264 @@
namespace mapnik {
-template <typename T0, typename T1>
-void agg_renderer<T0,T1>::process(polygon_pattern_symbolizer const& sym,
- mapnik::feature_impl & feature,
- proj_transform const& prj_trans)
+template <typename buffer_type>
+struct agg_renderer_process_visitor_p
{
- std::string filename = get<std::string, keys::file>(sym, feature, common_.vars_);
- if (filename.empty()) return;
- boost::optional<mapnik::marker_ptr> marker_ptr = marker_cache::instance().find(filename, true);
- if (!marker_ptr || !(*marker_ptr)) return;
+ agg_renderer_process_visitor_p(renderer_common & common,
+ buffer_type * current_buffer,
+ std::unique_ptr<rasterizer> const& ras_ptr,
+ gamma_method_enum & gamma_method,
+ double & gamma,
+ polygon_pattern_symbolizer const& sym,
+ mapnik::feature_impl & feature,
+ proj_transform const& prj_trans)
+ : common_(common),
+ current_buffer_(current_buffer),
+ ras_ptr_(ras_ptr),
+ gamma_method_(gamma_method),
+ gamma_(gamma),
+ sym_(sym),
+ feature_(feature),
+ prj_trans_(prj_trans) {}
- boost::optional<image_ptr> pat;
+ void operator() (marker_null const&) {}
- if ((*marker_ptr)->is_bitmap())
- {
- pat = (*marker_ptr)->get_bitmap_data();
- }
- else
+ void operator() (marker_svg const& marker)
{
agg::trans_affine image_tr = agg::trans_affine_scaling(common_.scale_factor_);
- auto image_transform = get_optional<transform_type>(sym, keys::image_transform);
- if (image_transform) evaluate_transform(image_tr, feature, common_.vars_, *image_transform);
- pat = render_pattern(*ras_ptr, **marker_ptr, image_tr, 1.0);
- }
+ auto image_transform = get_optional<transform_type>(sym_, keys::image_transform);
+ if (image_transform) evaluate_transform(image_tr, feature_, common_.vars_, *image_transform);
+ mapnik::box2d<double> const& bbox_image = marker.get_data()->bounding_box() * image_tr;
+ mapnik::image_rgba8 image(bbox_image.width(), bbox_image.height());
+ render_pattern<buffer_type>(*ras_ptr_, marker, image_tr, 1.0, image);
- if (!pat) return;
+ agg::rendering_buffer buf(current_buffer_->bytes(), current_buffer_->width(),
+ current_buffer_->height(), current_buffer_->row_size());
+ ras_ptr_->reset();
+ value_double gamma = get<value_double, keys::gamma>(sym_, feature_, common_.vars_);
+ gamma_method_enum gamma_method = get<gamma_method_enum, keys::gamma_method>(sym_, feature_, common_.vars_);
+ if (gamma != gamma_ || gamma_method != gamma_method_)
+ {
+ set_gamma_method(ras_ptr_, gamma, gamma_method);
+ gamma_method_ = gamma_method;
+ gamma_ = gamma;
+ }
- using clipped_geometry_type = agg::conv_clip_polygon<geometry_type>;
- using path_type = transform_path_adapter<view_transform,clipped_geometry_type>;
+ value_bool clip = get<value_bool, keys::clip>(sym_, feature_, common_.vars_);
+ value_double opacity = get<double, keys::opacity>(sym_, feature_, common_.vars_);
+ value_double simplify_tolerance = get<value_double, keys::simplify_tolerance>(sym_, feature_, common_.vars_);
+ value_double smooth = get<value_double, keys::smooth>(sym_, feature_, common_.vars_);
- agg::rendering_buffer buf(current_buffer_->raw_data(), current_buffer_->width(),
- current_buffer_->height(), current_buffer_->width() * 4);
- ras_ptr->reset();
- value_double gamma = get<value_double, keys::gamma>(sym, feature, common_.vars_);
- gamma_method_enum gamma_method = get<gamma_method_enum, keys::gamma_method>(sym, feature, common_.vars_);
- if (gamma != gamma_ || gamma_method != gamma_method_)
- {
- set_gamma_method(ras_ptr, gamma, gamma_method);
- gamma_method_ = gamma_method;
- gamma_ = gamma;
- }
+ box2d<double> clip_box = clipping_extent(common_);
+
+ using color = agg::rgba8;
+ using order = agg::order_rgba;
+ using blender_type = agg::comp_op_adaptor_rgba_pre<color, order>;
+ using pixfmt_type = agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer>;
+
+ using wrap_x_type = agg::wrap_mode_repeat;
+ using wrap_y_type = agg::wrap_mode_repeat;
+ using img_source_type = agg::image_accessor_wrap<agg::pixfmt_rgba32_pre,
+ wrap_x_type,
+ wrap_y_type>;
- value_bool clip = get<value_bool, keys::clip>(sym, feature, common_.vars_);
- value_double opacity = get<double, keys::opacity>(sym, feature, common_.vars_);
- value_double simplify_tolerance = get<value_double, keys::simplify_tolerance>(sym, feature, common_.vars_);
- value_double smooth = get<value_double, keys::smooth>(sym, feature, common_.vars_);
+ using span_gen_type = agg::span_pattern_rgba<img_source_type>;
+ using ren_base = agg::renderer_base<pixfmt_type>;
- box2d<double> clip_box = clipping_extent(common_);
+ using renderer_type = agg::renderer_scanline_aa_alpha<ren_base,
+ agg::span_allocator<agg::rgba8>,
+ span_gen_type>;
- using color = agg::rgba8;
- using order = agg::order_rgba;
- using blender_type = agg::comp_op_adaptor_rgba_pre<color, order>;
- using pixfmt_type = agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer>;
+ pixfmt_type pixf(buf);
+ pixf.comp_op(static_cast<agg::comp_op_e>(get<composite_mode_e, keys::comp_op>(sym_, feature_, common_.vars_)));
+ ren_base renb(pixf);
- using wrap_x_type = agg::wrap_mode_repeat;
- using wrap_y_type = agg::wrap_mode_repeat;
- using img_source_type = agg::image_accessor_wrap<agg::pixfmt_rgba32_pre,
- wrap_x_type,
- wrap_y_type>;
+ unsigned w = image.width();
+ unsigned h = image.height();
+ agg::rendering_buffer pattern_rbuf((agg::int8u*)image.bytes(),w,h,w*4);
+ agg::pixfmt_rgba32_pre pixf_pattern(pattern_rbuf);
+ img_source_type img_src(pixf_pattern);
- using span_gen_type = agg::span_pattern_rgba<img_source_type>;
- using ren_base = agg::renderer_base<pixfmt_type>;
+ pattern_alignment_enum alignment = get<pattern_alignment_enum, keys::alignment>(sym_, feature_, common_.vars_);
+ unsigned offset_x=0;
+ unsigned offset_y=0;
+
+ if (alignment == LOCAL_ALIGNMENT)
+ {
+ double x0 = 0;
+ double y0 = 0;
+ using apply_local_alignment = detail::apply_local_alignment;
+ apply_local_alignment apply(common_.t_,prj_trans_, clip_box, x0, y0);
+ util::apply_visitor(geometry::vertex_processor<apply_local_alignment>(apply), feature_.get_geometry());
+ offset_x = unsigned(current_buffer_->width() - x0);
+ offset_y = unsigned(current_buffer_->height() - y0);
+ }
- using renderer_type = agg::renderer_scanline_aa_alpha<ren_base,
- agg::span_allocator<agg::rgba8>,
- span_gen_type>;
+ span_gen_type sg(img_src, offset_x, offset_y);
- pixfmt_type pixf(buf);
- pixf.comp_op(static_cast<agg::comp_op_e>(get<composite_mode_e, keys::comp_op>(sym, feature, common_.vars_)));
- ren_base renb(pixf);
+ agg::span_allocator<agg::rgba8> sa;
+ renderer_type rp(renb,sa, sg, unsigned(opacity * 255));
- unsigned w=(*pat)->width();
- unsigned h=(*pat)->height();
- agg::rendering_buffer pattern_rbuf((agg::int8u*)(*pat)->getBytes(),w,h,w*4);
- agg::pixfmt_rgba32_pre pixf_pattern(pattern_rbuf);
- img_source_type img_src(pixf_pattern);
+ agg::trans_affine tr;
+ auto transform = get_optional<transform_type>(sym_, keys::geometry_transform);
+ if (transform) evaluate_transform(tr, feature_, common_.vars_, *transform, common_.scale_factor_);
+ using vertex_converter_type = vertex_converter<clip_poly_tag,
+ transform_tag,
+ affine_transform_tag,
+ simplify_tag,
+ smooth_tag>;
- pattern_alignment_enum alignment = get<pattern_alignment_enum, keys::alignment>(sym, feature, common_.vars_);
- unsigned offset_x=0;
- unsigned offset_y=0;
+ vertex_converter_type converter(clip_box,sym_,common_.t_,prj_trans_,tr,feature_,common_.vars_,common_.scale_factor_);
- if (alignment == LOCAL_ALIGNMENT)
+
+ if (prj_trans_.equal() && clip) converter.set<clip_poly_tag>(); //optional clip (default: true)
+ converter.set<transform_tag>(); //always transform
+ converter.set<affine_transform_tag>(); // optional affine transform
+ if (simplify_tolerance > 0.0) converter.set<simplify_tag>(); // optional simplify converter
+ if (smooth > 0.0) converter.set<smooth_tag>(); // optional smooth converter
+
+ using apply_vertex_converter_type = detail::apply_vertex_converter<vertex_converter_type, rasterizer>;
+ using vertex_processor_type = geometry::vertex_processor<apply_vertex_converter_type>;
+ apply_vertex_converter_type apply(converter, *ras_ptr_);
+ mapnik::util::apply_visitor(vertex_processor_type(apply),feature_.get_geometry());
+ agg::scanline_u8 sl;
+ ras_ptr_->filling_rule(agg::fill_even_odd);
+ agg::render_scanlines(*ras_ptr_, sl, rp);
+ }
+
+ void operator() (marker_rgba8 const& marker)
{
- double x0 = 0;
- double y0 = 0;
- if (feature.num_geometries() > 0)
+ using color = agg::rgba8;
+ using order = agg::order_rgba;
+ using blender_type = agg::comp_op_adaptor_rgba_pre<color, order>;
+ using pixfmt_type = agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer>;
+
+ using wrap_x_type = agg::wrap_mode_repeat;
+ using wrap_y_type = agg::wrap_mode_repeat;
+ using img_source_type = agg::image_accessor_wrap<agg::pixfmt_rgba32_pre,
+ wrap_x_type,
+ wrap_y_type>;
+
+ using span_gen_type = agg::span_pattern_rgba<img_source_type>;
+ using ren_base = agg::renderer_base<pixfmt_type>;
+
+ using renderer_type = agg::renderer_scanline_aa_alpha<ren_base,
+ agg::span_allocator<agg::rgba8>,
+ span_gen_type>;
+ mapnik::image_rgba8 const& image = marker.get_data();
+
+
+ agg::rendering_buffer buf(current_buffer_->bytes(), current_buffer_->width(),
+ current_buffer_->height(), current_buffer_->row_size());
+ ras_ptr_->reset();
+ value_double gamma = get<value_double, keys::gamma>(sym_, feature_, common_.vars_);
+ gamma_method_enum gamma_method = get<gamma_method_enum, keys::gamma_method>(sym_, feature_, common_.vars_);
+ if (gamma != gamma_ || gamma_method != gamma_method_)
{
- clipped_geometry_type clipped(feature.get_geometry(0));
- clipped.clip_box(clip_box.minx(),clip_box.miny(),clip_box.maxx(),clip_box.maxy());
- path_type path(common_.t_,clipped,prj_trans);
- path.vertex(&x0,&y0);
+ set_gamma_method(ras_ptr_, gamma, gamma_method);
+ gamma_method_ = gamma_method;
+ gamma_ = gamma;
}
- offset_x = unsigned(current_buffer_->width() - x0);
- offset_y = unsigned(current_buffer_->height() - y0);
- }
- span_gen_type sg(img_src, offset_x, offset_y);
+ value_bool clip = get<value_bool, keys::clip>(sym_, feature_, common_.vars_);
+ value_double opacity = get<double, keys::opacity>(sym_, feature_, common_.vars_);
+ value_double simplify_tolerance = get<value_double, keys::simplify_tolerance>(sym_, feature_, common_.vars_);
+ value_double smooth = get<value_double, keys::smooth>(sym_, feature_, common_.vars_);
- agg::span_allocator<agg::rgba8> sa;
- renderer_type rp(renb,sa, sg, unsigned(opacity * 255));
+ box2d<double> clip_box = clipping_extent(common_);
- agg::trans_affine tr;
- auto transform = get_optional<transform_type>(sym, keys::geometry_transform);
- if (transform) evaluate_transform(tr, feature, common_.vars_, *transform, common_.scale_factor_);
- vertex_converter<rasterizer, clip_poly_tag,transform_tag,affine_transform_tag,simplify_tag,smooth_tag>
- converter(clip_box,*ras_ptr,sym,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
+ pixfmt_type pixf(buf);
+ pixf.comp_op(static_cast<agg::comp_op_e>(get<composite_mode_e, keys::comp_op>(sym_, feature_, common_.vars_)));
+ ren_base renb(pixf);
- if (prj_trans.equal() && clip) converter.set<clip_poly_tag>(); //optional clip (default: true)
- converter.set<transform_tag>(); //always transform
- converter.set<affine_transform_tag>(); // optional affine transform
- if (simplify_tolerance > 0.0) converter.set<simplify_tag>(); // optional simplify converter
- if (smooth > 0.0) converter.set<smooth_tag>(); // optional smooth converter
+ unsigned w = image.width();
+ unsigned h = image.height();
+ agg::rendering_buffer pattern_rbuf((agg::int8u*)image.bytes(),w,h,w*4);
+ agg::pixfmt_rgba32_pre pixf_pattern(pattern_rbuf);
+ img_source_type img_src(pixf_pattern);
- for ( geometry_type & geom : feature.paths())
- {
- if (geom.size() > 2)
+ pattern_alignment_enum alignment = get<pattern_alignment_enum, keys::alignment>(sym_, feature_, common_.vars_);
+ unsigned offset_x=0;
+ unsigned offset_y=0;
+
+ if (alignment == LOCAL_ALIGNMENT)
{
- converter.apply(geom);
+ double x0 = 0;
+ double y0 = 0;
+ using apply_local_alignment = detail::apply_local_alignment;
+ apply_local_alignment apply(common_.t_,prj_trans_, clip_box, x0, y0);
+ util::apply_visitor(geometry::vertex_processor<apply_local_alignment>(apply), feature_.get_geometry());
+
+ offset_x = unsigned(current_buffer_->width() - x0);
+ offset_y = unsigned(current_buffer_->height() - y0);
}
+
+ span_gen_type sg(img_src, offset_x, offset_y);
+
+ agg::span_allocator<agg::rgba8> sa;
+ renderer_type rp(renb,sa, sg, unsigned(opacity * 255));
+
+ agg::trans_affine tr;
+ auto transform = get_optional<transform_type>(sym_, keys::geometry_transform);
+ if (transform) evaluate_transform(tr, feature_, common_.vars_, *transform, common_.scale_factor_);
+ using vertex_converter_type = vertex_converter<clip_poly_tag,
+ transform_tag,
+ affine_transform_tag,
+ simplify_tag,
+ smooth_tag>;
+
+ vertex_converter_type converter(clip_box, sym_,common_.t_,prj_trans_,tr,feature_,common_.vars_,common_.scale_factor_);
+
+ if (prj_trans_.equal() && clip) converter.set<clip_poly_tag>(); //optional clip (default: true)
+ converter.set<transform_tag>(); //always transform
+ converter.set<affine_transform_tag>(); // optional affine transform
+ if (simplify_tolerance > 0.0) converter.set<simplify_tag>(); // optional simplify converter
+ if (smooth > 0.0) converter.set<smooth_tag>(); // optional smooth converter
+
+ using apply_vertex_converter_type = detail::apply_vertex_converter<vertex_converter_type, rasterizer>;
+ using vertex_processor_type = geometry::vertex_processor<apply_vertex_converter_type>;
+ apply_vertex_converter_type apply(converter, *ras_ptr_);
+ mapnik::util::apply_visitor(vertex_processor_type(apply),feature_.get_geometry());
+ agg::scanline_u8 sl;
+ ras_ptr_->filling_rule(agg::fill_even_odd);
+ agg::render_scanlines(*ras_ptr_, sl, rp);
}
- agg::scanline_u8 sl;
- ras_ptr->filling_rule(agg::fill_even_odd);
- agg::render_scanlines(*ras_ptr, sl, rp);
+
+private:
+ renderer_common & common_;
+ buffer_type * current_buffer_;
+ std::unique_ptr<rasterizer> const& ras_ptr_;
+ gamma_method_enum & gamma_method_;
+ double & gamma_;
+ polygon_pattern_symbolizer const& sym_;
+ mapnik::feature_impl & feature_;
+ proj_transform const& prj_trans_;
+};
+
+template <typename T0, typename T1>
+void agg_renderer<T0,T1>::process(polygon_pattern_symbolizer const& sym,
+ mapnik::feature_impl & feature,
+ proj_transform const& prj_trans)
+{
+ std::string filename = get<std::string, keys::file>(sym, feature, common_.vars_);
+ if (filename.empty()) return;
+ std::shared_ptr<mapnik::marker const> marker = marker_cache::instance().find(filename, true);
+ agg_renderer_process_visitor_p<buffer_type> visitor(common_,
+ current_buffer_,
+ ras_ptr,
+ gamma_method_,
+ gamma_,
+ sym,
+ feature,
+ prj_trans);
+ util::apply_visitor(visitor, *marker);
+
}
-template void agg_renderer<image_32>::process(polygon_pattern_symbolizer const&,
- mapnik::feature_impl &,
- proj_transform const&);
+template void agg_renderer<image_rgba8>::process(polygon_pattern_symbolizer const&,
+ mapnik::feature_impl &,
+ proj_transform const&);
}
diff --git a/src/agg/process_polygon_symbolizer.cpp b/src/agg/process_polygon_symbolizer.cpp
index 5a5fb49..31a61d3 100644
--- a/src/agg/process_polygon_symbolizer.cpp
+++ b/src/agg/process_polygon_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,7 +26,6 @@
// mapnik
#include <mapnik/feature.hpp>
#include <mapnik/agg_renderer.hpp>
-#include <mapnik/graphics.hpp>
#include <mapnik/agg_helpers.hpp>
#include <mapnik/agg_rasterizer.hpp>
#include <mapnik/symbolizer.hpp>
@@ -49,7 +48,7 @@ void agg_renderer<T0,T1>::process(polygon_symbolizer const& sym,
mapnik::feature_impl & feature,
proj_transform const& prj_trans)
{
- using vertex_converter_type = vertex_converter<rasterizer,clip_poly_tag,transform_tag,affine_transform_tag,simplify_tag,smooth_tag>;
+ using vertex_converter_type = vertex_converter<clip_poly_tag,transform_tag,affine_transform_tag,simplify_tag,smooth_tag>;
ras_ptr->reset();
double gamma = get<value_double>(sym, keys::gamma, feature, common_.vars_, 1.0);
@@ -62,7 +61,7 @@ void agg_renderer<T0,T1>::process(polygon_symbolizer const& sym,
}
box2d<double> clip_box = clipping_extent(common_);
- agg::rendering_buffer buf(current_buffer_->raw_data(),current_buffer_->width(),current_buffer_->height(), current_buffer_->width() * 4);
+ agg::rendering_buffer buf(current_buffer_->bytes(),current_buffer_->width(),current_buffer_->height(), current_buffer_->row_size());
render_polygon_symbolizer<vertex_converter_type>(
sym, feature, prj_trans, common_, clip_box, *ras_ptr,
@@ -88,7 +87,7 @@ void agg_renderer<T0,T1>::process(polygon_symbolizer const& sym,
});
}
-template void agg_renderer<image_32>::process(polygon_symbolizer const&,
+template void agg_renderer<image_rgba8>::process(polygon_symbolizer const&,
mapnik::feature_impl &,
proj_transform const&);
diff --git a/src/agg/process_raster_symbolizer.cpp b/src/agg/process_raster_symbolizer.cpp
index e79664f..7d5cd4b 100644
--- a/src/agg/process_raster_symbolizer.cpp
+++ b/src/agg/process_raster_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,11 +25,10 @@
#include <mapnik/agg_renderer.hpp>
#include <mapnik/image_scaling.hpp>
#include <mapnik/image_compositing.hpp>
-#include <mapnik/graphics.hpp>
#include <mapnik/symbolizer.hpp>
#include <mapnik/raster_colorizer.hpp>
#include <mapnik/agg_rasterizer.hpp>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
#include <mapnik/image_util.hpp>
#include <mapnik/raster.hpp>
#include <mapnik/box2d.hpp>
@@ -52,15 +51,15 @@ void agg_renderer<T0,T1>::process(raster_symbolizer const& sym,
{
render_raster_symbolizer(
sym, feature, prj_trans, common_,
- [&](image_data_32 & target, composite_mode_e comp_op, double opacity,
+ [&](image_rgba8 & target, composite_mode_e comp_op, double opacity,
int start_x, int start_y) {
- composite(current_buffer_->data(), target,
- comp_op, opacity, start_x, start_y, false);
+ composite(*current_buffer_, target,
+ comp_op, opacity, start_x, start_y);
}
);
}
-template void agg_renderer<image_32>::process(raster_symbolizer const&,
+template void agg_renderer<image_rgba8>::process(raster_symbolizer const&,
mapnik::feature_impl &,
proj_transform const&);
diff --git a/src/agg/process_shield_symbolizer.cpp b/src/agg/process_shield_symbolizer.cpp
index ad86e41..1327be4 100644
--- a/src/agg/process_shield_symbolizer.cpp
+++ b/src/agg/process_shield_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,7 +23,6 @@
// mapnik
#include <mapnik/feature.hpp>
#include <mapnik/agg_renderer.hpp>
-#include <mapnik/graphics.hpp>
#include <mapnik/agg_rasterizer.hpp>
#include <mapnik/text/symbolizer_helpers.hpp>
#include <mapnik/pixel_position.hpp>
@@ -63,17 +62,20 @@ void agg_renderer<T0,T1>::process(shield_symbolizer const& sym,
placements_list const& placements = helper.get();
for (glyph_positions_ptr glyphs : placements)
{
- if (glyphs->marker())
+ marker_info_ptr mark = glyphs->get_marker();
+ if (mark)
+ {
render_marker(glyphs->marker_pos(),
- *(glyphs->marker()->marker),
- glyphs->marker()->transform,
+ *mark->marker_,
+ mark->transform_,
opacity, comp_op);
+ }
ren.render(*glyphs);
}
}
-template void agg_renderer<image_32>::process(shield_symbolizer const&,
+template void agg_renderer<image_rgba8>::process(shield_symbolizer const&,
mapnik::feature_impl &,
proj_transform const&);
diff --git a/src/agg/process_text_symbolizer.cpp b/src/agg/process_text_symbolizer.cpp
index bb45bed..c697d05 100644
--- a/src/agg/process_text_symbolizer.cpp
+++ b/src/agg/process_text_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,7 +23,7 @@
// mapnik
#include <mapnik/feature.hpp>
#include <mapnik/agg_renderer.hpp>
-#include <mapnik/graphics.hpp>
+#include <mapnik/image_any.hpp>
#include <mapnik/agg_rasterizer.hpp>
#include <mapnik/text/symbolizer_helpers.hpp>
#include <mapnik/text/renderer.hpp>
@@ -75,7 +75,7 @@ void agg_renderer<T0,T1>::process(text_symbolizer const& sym,
}
}
-template void agg_renderer<image_32>::process(text_symbolizer const&,
+template void agg_renderer<image_rgba8>::process(text_symbolizer const&,
mapnik::feature_impl &,
proj_transform const&);
diff --git a/src/box2d.cpp b/src/box2d.cpp
index 209fdec..edea1b5 100644
--- a/src/box2d.cpp
+++ b/src/box2d.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,7 +22,6 @@
// mapnik
#include <mapnik/box2d.hpp>
-#include <mapnik/util/trim.hpp>
// stl
#include <stdexcept>
diff --git a/src/build.py b/src/build.py
index 4b19328..8e86db7 100644
--- a/src/build.py
+++ b/src/build.py
@@ -132,7 +132,8 @@ else: # unix, non-macos
else:
mapnik_lib_link_flag += ' -Wl,-h,%s' % mapnik_libname
else: # Linux and others
- lib_env['LIBS'].append('dl')
+ if env['PLATFORM'] != 'FreeBSD':
+ lib_env['LIBS'].append('dl')
mapnik_lib_link_flag += ' -Wl,-rpath-link,.'
if env['ENABLE_SONAME']:
mapnik_lib_link_flag += ' -Wl,-soname,%s' % mapnik_libname
@@ -152,12 +153,14 @@ source = Split(
miniz_png.cpp
color.cpp
conversions.cpp
+ image_copy.cpp
image_compositing.cpp
image_scaling.cpp
box2d.cpp
datasource_cache.cpp
datasource_cache_static.cpp
debug.cpp
+ geometry_reprojection.cpp
expression_node.cpp
expression_string.cpp
expression.cpp
@@ -170,10 +173,19 @@ source = Split(
font_set.cpp
function_call.cpp
gradient.cpp
- graphics.cpp
parse_path.cpp
image_reader.cpp
+ cairo_io.cpp
+ image.cpp
+ image_view.cpp
+ image_view_any.cpp
+ image_any.cpp
+ image_options.cpp
image_util.cpp
+ image_util_jpeg.cpp
+ image_util_png.cpp
+ image_util_tiff.cpp
+ image_util_webp.cpp
layer.cpp
map.cpp
load_map.cpp
@@ -181,6 +193,7 @@ source = Split(
palette.cpp
marker_helpers.cpp
transform_expression_grammar.cpp
+ geometry_envelope.cpp
plugin.cpp
rule.cpp
save_map.cpp
@@ -204,8 +217,8 @@ source = Split(
svg/svg_transform_parser.cpp
warp.cpp
css_color_grammar.cpp
+ vertex_cache.cpp
text/font_library.cpp
- text/vertex_cache.cpp
text/text_layout.cpp
text/text_line.cpp
text/itemizer.cpp
@@ -238,14 +251,16 @@ source = Split(
renderer_common.cpp
renderer_common/render_pattern.cpp
renderer_common/process_group_symbolizer.cpp
+ math.cpp
"""
)
if env['PLUGIN_LINKING'] == 'static':
hit = False
+ lib_env.AppendUnique(CPPPATH='../plugins/')
for plugin in env['REQUESTED_PLUGINS']:
details = env['PLUGINS'][plugin]
- if details['lib'] in env['LIBS'] or not details['lib']:
+ if not details['lib'] or details['lib'] in env['LIBS']:
plugin_env = SConscript('../plugins/input/%s/build.py' % plugin)
if not plugin_env:
print("Notice: no 'plugin_env' variable found for plugin: '%s'" % plugin)
@@ -273,25 +288,32 @@ if env['PLUGIN_LINKING'] == 'static':
lib_env.Append(CPPDEFINES = '-DMAPNIK_STATIC_PLUGINS')
libmapnik_defines.append('-DMAPNIK_STATIC_PLUGINS')
+# add these to the compile flags no matter what
+# to make it safe to try to compile them from Makefile wrapper
+source += Split("""
+cairo/process_markers_symbolizer.cpp
+cairo/process_group_symbolizer.cpp
+""")
+
if env['HAS_CAIRO']:
lib_env.AppendUnique(LIBPATH=env['CAIRO_LIBPATHS'])
lib_env.Append(CPPDEFINES = '-DHAVE_CAIRO')
libmapnik_defines.append('-DHAVE_CAIRO')
lib_env.AppendUnique(CPPPATH=copy(env['CAIRO_CPPPATHS']))
- source.append('cairo/cairo_context.cpp')
- source.append('cairo/cairo_renderer.cpp')
- source.append('cairo/cairo_render_vector.cpp')
- source.append('cairo/process_markers_symbolizer.cpp')
- source.append('cairo/process_text_symbolizer.cpp')
- source.append('cairo/process_group_symbolizer.cpp')
- source.append('cairo/process_line_symbolizer.cpp')
- source.append('cairo/process_line_pattern_symbolizer.cpp')
- source.append('cairo/process_polygon_symbolizer.cpp')
- source.append('cairo/process_polygon_pattern_symbolizer.cpp')
- source.append('cairo/process_debug_symbolizer.cpp')
- source.append('cairo/process_point_symbolizer.cpp')
- source.append('cairo/process_raster_symbolizer.cpp')
- source.append('cairo/process_building_symbolizer.cpp')
+ source += Split("""
+ cairo/cairo_context.cpp
+ cairo/cairo_renderer.cpp
+ cairo/cairo_render_vector.cpp
+ cairo/process_text_symbolizer.cpp
+ cairo/process_line_symbolizer.cpp
+ cairo/process_line_pattern_symbolizer.cpp
+ cairo/process_polygon_symbolizer.cpp
+ cairo/process_polygon_pattern_symbolizer.cpp
+ cairo/process_debug_symbolizer.cpp
+ cairo/process_point_symbolizer.cpp
+ cairo/process_raster_symbolizer.cpp
+ cairo/process_building_symbolizer.cpp
+ """)
for cpp in enabled_imaging_libraries:
source.append(cpp)
@@ -300,6 +322,7 @@ for cpp in enabled_imaging_libraries:
source += Split(
"""
agg/agg_renderer.cpp
+ agg/process_dot_symbolizer.cpp
agg/process_building_symbolizer.cpp
agg/process_line_symbolizer.cpp
agg/process_line_pattern_symbolizer.cpp
@@ -324,6 +347,13 @@ source += Split(
if env['RUNTIME_LINK'] == "static":
source += glob.glob('../deps/agg/src/' + '*.cpp')
+# add these to the compile flags no matter what
+# to make it safe to try to compile them from Makefile wrapper
+source += Split("""
+grid/process_markers_symbolizer.cpp
+grid/process_group_symbolizer.cpp
+""")
+
# grid backend
if env['GRID_RENDERER']:
source += Split(
@@ -333,14 +363,12 @@ if env['GRID_RENDERER']:
grid/process_building_symbolizer.cpp
grid/process_line_pattern_symbolizer.cpp
grid/process_line_symbolizer.cpp
- grid/process_markers_symbolizer.cpp
grid/process_point_symbolizer.cpp
grid/process_polygon_pattern_symbolizer.cpp
grid/process_polygon_symbolizer.cpp
grid/process_raster_symbolizer.cpp
grid/process_shield_symbolizer.cpp
grid/process_text_symbolizer.cpp
- grid/process_group_symbolizer.cpp
""")
lib_env.Append(CPPDEFINES = '-DGRID_RENDERER')
libmapnik_defines.append('-DGRID_RENDERER')
diff --git a/src/cairo/cairo_context.cpp b/src/cairo/cairo_context.cpp
index 41056b0..fe35c3a 100644
--- a/src/cairo/cairo_context.cpp
+++ b/src/cairo/cairo_context.cpp
@@ -337,7 +337,7 @@ void cairo_context::set_gradient(cairo_gradient const& pattern, const box2d<doub
check_object_status_and_throw_exception(*this);
}
-void cairo_context::add_image(double x, double y, image_data_32 & data, double opacity)
+void cairo_context::add_image(double x, double y, image_rgba8 const& data, double opacity)
{
cairo_pattern pattern(data);
pattern.set_origin(x, y);
@@ -348,7 +348,7 @@ void cairo_context::add_image(double x, double y, image_data_32 & data, double o
check_object_status_and_throw_exception(*this);
}
-void cairo_context::add_image(agg::trans_affine const& tr, image_data_32 & data, double opacity)
+void cairo_context::add_image(agg::trans_affine const& tr, image_rgba8 const& data, double opacity)
{
cairo_pattern pattern(data);
if (!tr.is_identity())
@@ -432,7 +432,6 @@ void cairo_context::glyph_path(unsigned long index, pixel_position const &pos)
void cairo_context::add_text(glyph_positions const& pos,
cairo_face_manager & manager,
- face_manager_freetype & font_manager,
composite_mode_e comp_op,
composite_mode_e halo_comp_op,
double scale_factor)
diff --git a/src/cairo/cairo_render_vector.cpp b/src/cairo/cairo_render_vector.cpp
index 31a24f3..cfe86d6 100644
--- a/src/cairo/cairo_render_vector.cpp
+++ b/src/cairo/cairo_render_vector.cpp
@@ -32,21 +32,12 @@
namespace mapnik
{
-void render_vector_marker(cairo_context & context, pixel_position const& pos,
- svg::svg_path_adapter & svg_path, box2d<double> const& bbox,
+void render_vector_marker(cairo_context & context, svg::svg_path_adapter & svg_path,
agg::pod_bvector<svg::path_attributes> const & attributes,
- agg::trans_affine const& tr, double opacity, bool recenter)
+ box2d<double> const& bbox, agg::trans_affine const& tr,
+ double opacity)
{
using namespace mapnik::svg;
- agg::trans_affine mtx = tr;
- if (recenter)
- {
- coord<double,2> c = bbox.center();
- mtx = agg::trans_affine_translation(-c.x,-c.y);
- mtx *= tr;
- mtx.translate(pos.x, pos.y);
- }
-
agg::trans_affine transform;
for(unsigned i = 0; i < attributes.size(); ++i)
@@ -56,7 +47,7 @@ void render_vector_marker(cairo_context & context, pixel_position const& pos,
continue;
cairo_save_restore guard(context);
transform = attr.transform;
- transform *= mtx;
+ transform *= tr;
// TODO - this 'is_valid' check is not used in the AGG renderer and also
// appears to lead to bogus results with
diff --git a/src/cairo/cairo_renderer.cpp b/src/cairo/cairo_renderer.cpp
index 088c314..b4293af 100644
--- a/src/cairo/cairo_renderer.cpp
+++ b/src/cairo/cairo_renderer.cpp
@@ -99,6 +99,42 @@ cairo_renderer<T>::cairo_renderer(Map const& m,
template <typename T>
cairo_renderer<T>::~cairo_renderer() {}
+struct setup_marker_visitor
+{
+ setup_marker_visitor(cairo_context & context, renderer_common const& common)
+ : context_(context), common_(common) {}
+
+ void operator() (marker_null const &) {}
+ void operator() (marker_svg const &) {}
+
+ void operator() (marker_rgba8 const& marker)
+ {
+ mapnik::image_rgba8 const& bg_image = marker.get_data();
+ int w = bg_image.width();
+ int h = bg_image.height();
+ if ( w > 0 && h > 0)
+ {
+ // repeat background-image both vertically and horizontally
+ unsigned x_steps = unsigned(std::ceil(common_.width_/double(w)));
+ unsigned y_steps = unsigned(std::ceil(common_.height_/double(h)));
+ for (unsigned x=0;x<x_steps;++x)
+ {
+ for (unsigned y=0;y<y_steps;++y)
+ {
+ agg::trans_affine matrix = agg::trans_affine_translation(
+ x*w,
+ y*h);
+ context_.add_image(matrix, bg_image, 1.0f);
+ }
+ }
+ }
+ }
+
+ private:
+ cairo_context & context_;
+ renderer_common const& common_;
+};
+
template <typename T>
void cairo_renderer<T>::setup(Map const& map)
{
@@ -113,29 +149,8 @@ void cairo_renderer<T>::setup(Map const& map)
if (image_filename)
{
// NOTE: marker_cache returns premultiplied image, if needed
- boost::optional<mapnik::marker_ptr> bg_marker = mapnik::marker_cache::instance().find(*image_filename,true);
- if (bg_marker && (*bg_marker)->is_bitmap())
- {
- mapnik::image_ptr bg_image = *(*bg_marker)->get_bitmap_data();
- int w = bg_image->width();
- int h = bg_image->height();
- if ( w > 0 && h > 0)
- {
- // repeat background-image both vertically and horizontally
- unsigned x_steps = unsigned(std::ceil(common_.width_/double(w)));
- unsigned y_steps = unsigned(std::ceil(common_.height_/double(h)));
- for (unsigned x=0;x<x_steps;++x)
- {
- for (unsigned y=0;y<y_steps;++y)
- {
- agg::trans_affine matrix = agg::trans_affine_translation(
- x*w,
- y*h);
- context_.add_image(matrix, *bg_image, 1.0f);
- }
- }
- }
- }
+ std::shared_ptr<mapnik::marker const> bg_marker = mapnik::marker_cache::instance().find(*image_filename,true);
+ util::apply_visitor(setup_marker_visitor(context_, common_), *bg_marker);
}
MAPNIK_LOG_DEBUG(cairo_renderer) << "cairo_renderer: Scale=" << map.scale();
}
@@ -187,42 +202,84 @@ void cairo_renderer<T>::end_style_processing(feature_type_style const& st)
MAPNIK_LOG_DEBUG(cairo_renderer) << "cairo_renderer:end style processing";
}
-template <typename T>
-void cairo_renderer<T>::render_marker(pixel_position const& pos,
- marker const& marker,
- agg::trans_affine const& tr,
- double opacity,
- bool recenter)
-
+struct cairo_render_marker_visitor
{
- cairo_save_restore guard(context_);
- if (marker.is_vector())
+ cairo_render_marker_visitor(cairo_context & context,
+ renderer_common const& common,
+ pixel_position const& pos,
+ agg::trans_affine const& tr,
+ double opacity,
+ bool recenter)
+ : context_(context),
+ common_(common),
+ pos_(pos),
+ tr_(tr),
+ opacity_(opacity),
+ recenter_(recenter) {}
+
+ void operator() (marker_null const&) {}
+
+ void operator() (marker_svg const& marker)
{
- mapnik::svg_path_ptr vmarker = *marker.get_vector_data();
+ mapnik::svg_path_ptr vmarker = marker.get_data();
if (vmarker)
{
- agg::trans_affine marker_tr = tr;
- marker_tr *=agg::trans_affine_scaling(common_.scale_factor_);
box2d<double> bbox = vmarker->bounding_box();
+ agg::trans_affine marker_tr = tr_;
+ if (recenter_)
+ {
+ coord<double,2> c = bbox.center();
+ marker_tr = agg::trans_affine_translation(-c.x,-c.y);
+ marker_tr *= tr_;
+ }
+ marker_tr *= agg::trans_affine_scaling(common_.scale_factor_);
agg::pod_bvector<svg::path_attributes> const & attributes = vmarker->attributes();
svg::vertex_stl_adapter<svg::svg_path_storage> stl_storage(vmarker->source());
svg::svg_path_adapter svg_path(stl_storage);
- render_vector_marker(context_, pos, svg_path, bbox, attributes, marker_tr, opacity, recenter);
+ marker_tr.translate(pos_.x, pos_.y);
+ render_vector_marker(context_, svg_path, attributes, bbox, marker_tr, opacity_);
}
}
- else if (marker.is_bitmap())
+
+ void operator() (marker_rgba8 const& marker)
{
- double width = (*marker.get_bitmap_data())->width();
- double height = (*marker.get_bitmap_data())->height();
+ double width = marker.get_data().width();
+ double height = marker.get_data().height();
double cx = 0.5 * width;
double cy = 0.5 * height;
agg::trans_affine marker_tr;
marker_tr *= agg::trans_affine_translation(-cx,-cy);
- marker_tr *= tr;
+ marker_tr *= tr_;
marker_tr *= agg::trans_affine_scaling(common_.scale_factor_);
- marker_tr *= agg::trans_affine_translation(pos.x,pos.y);
- context_.add_image(marker_tr, **marker.get_bitmap_data(), opacity);
+ marker_tr *= agg::trans_affine_translation(pos_.x,pos_.y);
+ context_.add_image(marker_tr, marker.get_data(), opacity_);
}
+
+ private:
+ cairo_context & context_;
+ renderer_common const& common_;
+ pixel_position const& pos_;
+ agg::trans_affine const& tr_;
+ double opacity_;
+ bool recenter_;
+};
+
+template <typename T>
+void cairo_renderer<T>::render_marker(pixel_position const& pos,
+ marker const& marker,
+ agg::trans_affine const& tr,
+ double opacity,
+ bool recenter)
+
+{
+ cairo_save_restore guard(context_);
+ cairo_render_marker_visitor visitor(context_,
+ common_,
+ pos,
+ tr,
+ opacity,
+ recenter);
+ util::apply_visitor(visitor, marker);
}
template class cairo_renderer<cairo_ptr>;
diff --git a/src/cairo/process_building_symbolizer.cpp b/src/cairo/process_building_symbolizer.cpp
index 060adb0..edb647b 100644
--- a/src/cairo/process_building_symbolizer.cpp
+++ b/src/cairo/process_building_symbolizer.cpp
@@ -43,7 +43,7 @@ void cairo_renderer<T>::process(building_symbolizer const& sym,
mapnik::feature_impl & feature,
proj_transform const& prj_trans)
{
- using path_type = transform_path_adapter<view_transform,geometry_type>;
+ using transform_path_type = transform_path_adapter<view_transform,vertex_adapter>;
cairo_save_restore guard(context_);
composite_mode_e comp_op = get<composite_mode_e, keys::comp_op>(sym, feature, common_.vars_);
mapnik::color fill = get<color, keys::fill>(sym, feature, common_.vars_);
@@ -54,23 +54,29 @@ void cairo_renderer<T>::process(building_symbolizer const& sym,
render_building_symbolizer(
feature, height,
- [&](geometry_type &faces) {
- path_type faces_path(common_.t_, faces, prj_trans);
+ [&](path_type const& faces)
+ {
+ vertex_adapter va(faces);
+ transform_path_type faces_path(common_.t_, va, prj_trans);
context_.set_color(fill.red() * 0.8 / 255.0, fill.green() * 0.8 / 255.0,
fill.blue() * 0.8 / 255.0, fill.alpha() * opacity / 255.0);
context_.add_path(faces_path);
context_.fill();
},
- [&](geometry_type &frame) {
- path_type path(common_.t_, frame, prj_trans);
+ [&](path_type const& frame)
+ {
+ vertex_adapter va(frame);
+ transform_path_type path(common_.t_, va, prj_trans);
context_.set_color(fill.red() * 0.8 / 255.0, fill.green() * 0.8/255.0,
fill.blue() * 0.8 / 255.0, fill.alpha() * opacity / 255.0);
context_.set_line_width(common_.scale_factor_);
context_.add_path(path);
context_.stroke();
},
- [&](geometry_type &roof) {
- path_type roof_path(common_.t_, roof, prj_trans);
+ [&](path_type const& roof)
+ {
+ vertex_adapter va(roof);
+ transform_path_type roof_path(common_.t_, va, prj_trans);
context_.set_color(fill, opacity);
context_.add_path(roof_path);
context_.fill();
diff --git a/src/cairo/process_debug_symbolizer.cpp b/src/cairo/process_debug_symbolizer.cpp
index e3a55b9..ff84dc8 100644
--- a/src/cairo/process_debug_symbolizer.cpp
+++ b/src/cairo/process_debug_symbolizer.cpp
@@ -25,6 +25,7 @@
// mapnik
#include <mapnik/feature.hpp>
#include <mapnik/symbolizer.hpp>
+#include <mapnik/vertex_processor.hpp>
#include <mapnik/proj_transform.hpp>
#include <mapnik/cairo/cairo_renderer.hpp>
#include <mapnik/label_collision_detector.hpp>
@@ -50,6 +51,40 @@ inline void render_debug_box(cairo_context &context, box2d<double> const& b)
context.stroke();
}
+template <typename Context>
+struct apply_vertex_mode
+{
+ apply_vertex_mode(Context & context, view_transform const& t, proj_transform const& prj_trans)
+ : context_(context),
+ t_(t),
+ prj_trans_(prj_trans) {}
+
+ template <typename Adapter>
+ void operator() (Adapter const& va) const
+ {
+ double x;
+ double y;
+ double z = 0;
+ va.rewind(0);
+ unsigned cmd = SEG_END;
+ while ((cmd = va.vertex(&x, &y)) != mapnik::SEG_END)
+ {
+ if (cmd == SEG_CLOSE) continue;
+ prj_trans_.backward(x,y,z);
+ t_.forward(&x,&y);
+ context_.move_to(std::floor(x) - 0.5, std::floor(y) + 0.5);
+ context_.line_to(std::floor(x) + 1.5, std::floor(y) + 0.5);
+ context_.move_to(std::floor(x) + 0.5, std::floor(y) - 0.5);
+ context_.line_to(std::floor(x) + 0.5, std::floor(y) + 1.5);
+ context_.stroke();
+ }
+ }
+
+ Context & context_;
+ view_transform const& t_;
+ proj_transform const& prj_trans_;
+};
+
} // anonymous namespace
template <typename T>
@@ -80,25 +115,9 @@ void cairo_renderer<T>::process(debug_symbolizer const& sym,
}
else if (mode == DEBUG_SYM_MODE_VERTEX)
{
- for (auto const& geom : feature.paths())
- {
- double x;
- double y;
- double z = 0;
- geom.rewind(0);
- unsigned cmd = 1;
- while ((cmd = geom.vertex(&x, &y)) != mapnik::SEG_END)
- {
- if (cmd == SEG_CLOSE) continue;
- prj_trans.backward(x,y,z);
- common_.t_.forward(&x,&y);
- context_.move_to(std::floor(x) - 0.5, std::floor(y) + 0.5);
- context_.line_to(std::floor(x) + 1.5, std::floor(y) + 0.5);
- context_.move_to(std::floor(x) + 0.5, std::floor(y) - 0.5);
- context_.line_to(std::floor(x) + 0.5, std::floor(y) + 1.5);
- context_.stroke();
- }
- }
+ using apply_vertex_mode = apply_vertex_mode<cairo_context>;
+ apply_vertex_mode apply(context_, common_.t_, prj_trans);
+ util::apply_visitor(geometry::vertex_processor<apply_vertex_mode>(apply), feature.get_geometry());
}
}
diff --git a/src/cairo/process_group_symbolizer.cpp b/src/cairo/process_group_symbolizer.cpp
index f26f3d9..ef688b6 100644
--- a/src/cairo/process_group_symbolizer.cpp
+++ b/src/cairo/process_group_symbolizer.cpp
@@ -23,8 +23,11 @@
#if defined(HAVE_CAIRO)
// mapnik
+#include <mapnik/marker.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
#include <mapnik/make_unique.hpp>
#include <mapnik/cairo/cairo_renderer.hpp>
+#include <mapnik/cairo/cairo_render_vector.hpp>
// mapnik symbolizer generics
#include <mapnik/renderer_common/process_group_symbolizer.hpp>
@@ -43,7 +46,7 @@ namespace {
// to render it, and the boxes themselves should already be
// in the detector from the placement_finder.
template <typename T>
-struct thunk_renderer : public util::static_visitor<>
+struct thunk_renderer
{
using renderer_type = cairo_renderer<T>;
@@ -56,11 +59,32 @@ struct thunk_renderer : public util::static_visitor<>
common_(common), offset_(offset)
{}
- void operator()(point_render_thunk const &thunk) const
+ void operator()(vector_marker_render_thunk const &thunk) const
{
- pixel_position new_pos(thunk.pos_.x + offset_.x, thunk.pos_.y + offset_.y);
- ren_.render_marker(new_pos, *thunk.marker_, thunk.tr_, thunk.opacity_,
- thunk.comp_op_);
+ cairo_save_restore guard(context_);
+ context_.set_operator(thunk.comp_op_);
+
+ svg::vertex_stl_adapter<svg::svg_path_storage> stl_storage(thunk.src_->source());
+ svg::svg_path_adapter svg_path(stl_storage);
+
+ agg::trans_affine offset_tr = thunk.tr_;
+ offset_tr.translate(offset_.x, offset_.y);
+ mapnik::render_vector_marker(context_,
+ svg_path,
+ thunk.attrs_,
+ thunk.src_->bounding_box(),
+ offset_tr,
+ thunk.opacity_);
+ }
+
+ void operator()(raster_marker_render_thunk const& thunk) const
+ {
+ cairo_save_restore guard(context_);
+ context_.set_operator(thunk.comp_op_);
+
+ agg::trans_affine offset_tr = thunk.tr_;
+ offset_tr.translate(offset_.x, offset_.y);
+ context_.add_image(offset_tr, thunk.src_, thunk.opacity_);
}
void operator()(text_render_thunk const &thunk) const
@@ -73,21 +97,22 @@ struct thunk_renderer : public util::static_visitor<>
offset_,
[&] (glyph_positions_ptr glyphs)
{
- if (glyphs->marker())
+ marker_info_ptr mark = glyphs->get_marker();
+ if (mark)
{
ren_.render_marker(glyphs->marker_pos(),
- *(glyphs->marker()->marker),
- glyphs->marker()->transform,
+ *mark->marker_,
+ mark->transform_,
thunk.opacity_, thunk.comp_op_);
}
- context_.add_text(*glyphs, face_manager_, common_.font_manager_, src_over, src_over, common_.scale_factor_);
+ context_.add_text(*glyphs, face_manager_, src_over, src_over, common_.scale_factor_);
});
}
template <typename T0>
void operator()(T0 const &) const
{
- // TODO: warning if unimplemented?
+ throw std::runtime_error("Rendering of this type is not supported by the cairo renderer.");
}
private:
diff --git a/src/cairo/process_line_pattern_symbolizer.cpp b/src/cairo/process_line_pattern_symbolizer.cpp
index e14348e..ff7dd01 100644
--- a/src/cairo/process_line_pattern_symbolizer.cpp
+++ b/src/cairo/process_line_pattern_symbolizer.cpp
@@ -29,13 +29,62 @@
#include <mapnik/cairo/cairo_renderer.hpp>
#include <mapnik/renderer_common/render_pattern.hpp>
#include <mapnik/vertex_converters.hpp>
+#include <mapnik/vertex_processor.hpp>
#include <mapnik/marker.hpp>
#include <mapnik/marker_cache.hpp>
#include <mapnik/agg_rasterizer.hpp>
+#include <mapnik/renderer_common/apply_vertex_converter.hpp>
namespace mapnik
{
+struct cairo_renderer_process_visitor_l
+{
+ cairo_renderer_process_visitor_l(renderer_common const& common,
+ line_pattern_symbolizer const& sym,
+ mapnik::feature_impl & feature,
+ unsigned & width,
+ unsigned & height)
+ : common_(common),
+ sym_(sym),
+ feature_(feature),
+ width_(width),
+ height_(height) {}
+
+ std::shared_ptr<cairo_pattern> operator() (mapnik::marker_null const&)
+ {
+ throw std::runtime_error("This should not have been reached.");
+ }
+
+ std::shared_ptr<cairo_pattern> operator() (mapnik::marker_svg const& marker)
+ {
+ double opacity = get<value_double, keys::opacity>(sym_, feature_, common_.vars_);
+ mapnik::rasterizer ras;
+ agg::trans_affine image_tr = agg::trans_affine_scaling(common_.scale_factor_);
+ auto image_transform = get_optional<transform_type>(sym_, keys::image_transform);
+ if (image_transform) evaluate_transform(image_tr, feature_, common_.vars_, *image_transform);
+ mapnik::box2d<double> const& bbox_image = marker.get_data()->bounding_box() * image_tr;
+ mapnik::image_rgba8 image(bbox_image.width(), bbox_image.height());
+ render_pattern<image_rgba8>(ras, marker, image_tr, 1.0, image);
+ width_ = image.width();
+ height_ = image.height();
+ return std::make_shared<cairo_pattern>(image, opacity);
+ }
+
+ std::shared_ptr<cairo_pattern> operator() (mapnik::marker_rgba8 const& marker)
+ {
+ double opacity = get<value_double, keys::opacity>(sym_, feature_, common_.vars_);
+ return std::make_shared<cairo_pattern>(marker.get_data(), opacity);
+ }
+
+ private:
+ renderer_common const& common_;
+ line_pattern_symbolizer const& sym_;
+ mapnik::feature_impl & feature_;
+ unsigned & width_;
+ unsigned & height_;
+};
+
template <typename T>
void cairo_renderer<T>::process(line_pattern_symbolizer const& sym,
mapnik::feature_impl & feature,
@@ -48,39 +97,29 @@ void cairo_renderer<T>::process(line_pattern_symbolizer const& sym,
value_double simplify_tolerance = get<value_double, keys::simplify_tolerance>(sym, feature, common_.vars_);
value_double smooth = get<value_double, keys::smooth>(sym, feature, common_.vars_);
- boost::optional<marker_ptr> marker;
- if ( !filename.empty() )
+ if (filename.empty())
{
- marker = marker_cache::instance().find(filename, true);
+ return;
}
- if (!marker || !(*marker)) return;
- unsigned width = (*marker)->width();
- unsigned height = (*marker)->height();
+ std::shared_ptr<mapnik::marker const> marker = marker_cache::instance().find(filename, true);
+
+ if (marker->is<mapnik::marker_null>()) return;
+
+ unsigned width = marker->width();
+ unsigned height = marker->height();
cairo_save_restore guard(context_);
context_.set_operator(comp_op);
- std::shared_ptr<cairo_pattern> pattern;
- image_ptr image = nullptr;
// TODO - re-implement at renderer level like polygon_pattern symbolizer
- double opacity = get<value_double, keys::opacity>(sym, feature, common_.vars_);
- if ((*marker)->is_bitmap())
- {
- pattern = std::make_unique<cairo_pattern>(**((*marker)->get_bitmap_data()), opacity);
- context_.set_line_width(height);
- }
- else
- {
- mapnik::rasterizer ras;
- agg::trans_affine image_tr = agg::trans_affine_scaling(common_.scale_factor_);
- auto image_transform = get_optional<transform_type>(sym, keys::image_transform);
- if (image_transform) evaluate_transform(image_tr, feature, common_.vars_, *image_transform);
- image = render_pattern(ras, **marker, image_tr, 1.0);
- pattern = std::make_unique<cairo_pattern>(*image, opacity);
- width = image->width();
- height = image->height();
- context_.set_line_width(height);
- }
+ cairo_renderer_process_visitor_l visit(common_,
+ sym,
+ feature,
+ width,
+ height);
+ std::shared_ptr<cairo_pattern> pattern = util::apply_visitor(visit, *marker);
+
+ context_.set_line_width(height);
pattern->set_extend(CAIRO_EXTEND_REPEAT);
pattern->set_filter(CAIRO_FILTER_BILINEAR);
@@ -104,12 +143,12 @@ void cairo_renderer<T>::process(line_pattern_symbolizer const& sym,
using rasterizer_type = line_pattern_rasterizer<cairo_context>;
rasterizer_type ras(context_, *pattern, width, height);
- vertex_converter<rasterizer_type,clip_line_tag, transform_tag,
- affine_transform_tag,
- simplify_tag, smooth_tag,
- offset_transform_tag,
- dash_tag, stroke_tag>
- converter(clipping_extent, ras, sym, common_.t_, prj_trans, tr, feature, common_.vars_, common_.scale_factor_);
+ using vertex_converter_type = vertex_converter<clip_line_tag, transform_tag,
+ affine_transform_tag,
+ simplify_tag, smooth_tag,
+ offset_transform_tag>;
+
+ vertex_converter_type converter(clipping_extent,sym, common_.t_, prj_trans, tr, feature, common_.vars_, common_.scale_factor_);
if (clip) converter.set<clip_line_tag>(); // optional clip (default: true)
converter.set<transform_tag>(); // always transform
@@ -118,14 +157,10 @@ void cairo_renderer<T>::process(line_pattern_symbolizer const& sym,
if (simplify_tolerance > 0.0) converter.set<simplify_tag>(); // optional simplify converter
if (smooth > 0.0) converter.set<smooth_tag>(); // optional smooth converter
-
- for (auto & geom : feature.paths())
- {
- if (geom.size() > 1)
- {
- converter.apply(geom);
- }
- }
+ using apply_vertex_converter_type = detail::apply_vertex_converter<vertex_converter_type, rasterizer_type>;
+ using vertex_processor_type = geometry::vertex_processor<apply_vertex_converter_type>;
+ apply_vertex_converter_type apply(converter, ras);
+ mapnik::util::apply_visitor(vertex_processor_type(apply), feature.get_geometry());
}
template void cairo_renderer<cairo_ptr>::process(line_pattern_symbolizer const&,
diff --git a/src/cairo/process_line_symbolizer.cpp b/src/cairo/process_line_symbolizer.cpp
index 1a3a87d..6021bbf 100644
--- a/src/cairo/process_line_symbolizer.cpp
+++ b/src/cairo/process_line_symbolizer.cpp
@@ -27,6 +27,8 @@
#include <mapnik/proj_transform.hpp>
#include <mapnik/cairo/cairo_renderer.hpp>
#include <mapnik/vertex_converters.hpp>
+#include <mapnik/vertex_processor.hpp>
+#include <mapnik/renderer_common/apply_vertex_converter.hpp>
namespace mapnik
{
@@ -79,14 +81,13 @@ void cairo_renderer<T>::process(line_symbolizer const& sym,
padding *= common_.scale_factor_;
clipping_extent.pad(padding);
}
- vertex_converter<cairo_context,
- clip_line_tag,
- transform_tag,
- affine_transform_tag,
- simplify_tag, smooth_tag,
- offset_transform_tag,
- dash_tag, stroke_tag>
- converter(clipping_extent,context_,sym,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
+ using vertex_converter_type = vertex_converter<clip_line_tag,
+ transform_tag,
+ affine_transform_tag,
+ simplify_tag, smooth_tag,
+ offset_transform_tag>;
+
+ vertex_converter_type converter(clipping_extent,sym,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
if (clip) converter.set<clip_line_tag>(); // optional clip (default: true)
converter.set<transform_tag>(); // always transform
@@ -94,14 +95,10 @@ void cairo_renderer<T>::process(line_symbolizer const& sym,
converter.set<affine_transform_tag>(); // optional affine transform
if (simplify_tolerance > 0.0) converter.set<simplify_tag>(); // optional simplify converter
if (smooth > 0.0) converter.set<smooth_tag>(); // optional smooth converter
-
- for (geometry_type & geom : feature.paths())
- {
- if (geom.size() > 1)
- {
- converter.apply(geom);
- }
- }
+ using apply_vertex_converter_type = detail::apply_vertex_converter<vertex_converter_type, cairo_context>;
+ using vertex_processor_type = geometry::vertex_processor<apply_vertex_converter_type>;
+ apply_vertex_converter_type apply(converter, context_);
+ mapnik::util::apply_visitor(vertex_processor_type(apply),feature.get_geometry());
// stroke
context_.set_fill_rule(CAIRO_FILL_RULE_WINDING);
context_.stroke();
diff --git a/src/cairo/process_markers_symbolizer.cpp b/src/cairo/process_markers_symbolizer.cpp
index 4eb6981..3cfb394 100644
--- a/src/cairo/process_markers_symbolizer.cpp
+++ b/src/cairo/process_markers_symbolizer.cpp
@@ -27,11 +27,12 @@
#include <mapnik/cairo/cairo_render_vector.hpp>
#include <mapnik/markers_placement.hpp>
#include <mapnik/svg/svg_path_adapter.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/pixel_position.hpp>
#include <mapnik/attribute.hpp>
#include <mapnik/marker.hpp>
#include <mapnik/marker_cache.hpp>
+#include <mapnik/marker_helpers.hpp>
#include <mapnik/renderer_common/process_markers_symbolizer.hpp>
// agg
@@ -43,135 +44,67 @@ namespace mapnik
class feature_impl;
class proj_transform;
-namespace svg { struct path_attributes; }
namespace detail {
-template <typename RendererContext, typename SvgPath, typename Attributes, typename Detector>
-struct markers_dispatch : mapnik::noncopyable
+template <typename RendererContext, typename Detector>
+struct vector_markers_dispatch_cairo : public vector_markers_dispatch<Detector>
{
- markers_dispatch(SvgPath & marker,
- Attributes const& attributes,
- box2d<double> const& bbox,
- agg::trans_affine const& marker_trans,
- markers_symbolizer const& sym,
- Detector & detector,
- double scale_factor,
- feature_impl const& feature,
- mapnik::attributes const& vars,
- bool snap_to_pixels,
- RendererContext const& renderer_context)
- :marker_(marker),
- attributes_(attributes),
- bbox_(bbox),
- marker_trans_(marker_trans),
- sym_(sym),
- detector_(detector),
- scale_factor_(scale_factor),
- feature_(feature),
- vars_(vars),
+ vector_markers_dispatch_cairo(svg_path_ptr const& src,
+ svg::svg_path_adapter & path,
+ svg_attribute_type const& attrs,
+ agg::trans_affine const& marker_trans,
+ markers_symbolizer const& sym,
+ Detector & detector,
+ double scale_factor,
+ feature_impl & feature,
+ mapnik::attributes const& vars,
+ bool snap_to_pixels,
+ RendererContext const& renderer_context)
+ : vector_markers_dispatch<Detector>(src, marker_trans, sym, detector, scale_factor, feature, vars),
+ path_(path),
+ attr_(attrs),
ctx_(std::get<0>(renderer_context))
{}
-
- template <typename T>
- void add_path(T & path)
+ void render_marker(agg::trans_affine const& marker_tr, double opacity)
{
- marker_placement_enum placement_method = get<marker_placement_enum>(
- sym_, keys::markers_placement_type, feature_, vars_, MARKER_POINT_PLACEMENT);
- value_bool ignore_placement = get<value_bool, keys::ignore_placement>(sym_, feature_, vars_);
- value_bool allow_overlap = get<value_bool, keys::allow_overlap>(sym_, feature_, vars_);
- value_bool avoid_edges = get<value_bool, keys::avoid_edges>(sym_, feature_, vars_);
- value_double opacity = get<value_double, keys::opacity>(sym_, feature_, vars_);
- value_double spacing = get<value_double, keys::spacing>(sym_, feature_, vars_);
- value_double max_error = get<value_double, keys::max_error>(sym_, feature_, vars_);
- coord2d center = bbox_.center();
- agg::trans_affine_translation recenter(-center.x, -center.y);
- agg::trans_affine tr = recenter * marker_trans_;
- markers_placement_params params { bbox_, tr, spacing * scale_factor_, max_error, allow_overlap, avoid_edges };
- markers_placement_finder<T, label_collision_detector4> placement_finder(
- placement_method, path, detector_, params);
- double x, y, angle = .0;
- while (placement_finder.get_point(x, y, angle, ignore_placement))
- {
- agg::trans_affine matrix = tr;
- matrix.rotate(angle);
- matrix.translate(x, y);
- render_vector_marker(
- ctx_,
- pixel_position(x, y),
- marker_,
- bbox_,
- attributes_,
- matrix,
- opacity,
- false);
- }
+ render_vector_marker(ctx_,
+ path_,
+ attr_,
+ this->src_->bounding_box(),
+ marker_tr,
+ opacity);
}
- SvgPath & marker_;
- Attributes const& attributes_;
- box2d<double> const& bbox_;
- agg::trans_affine const& marker_trans_;
- markers_symbolizer const& sym_;
- Detector & detector_;
- double scale_factor_;
- feature_impl const& feature_;
- attributes const& vars_;
+private:
+ svg::svg_path_adapter & path_;
+ svg_attribute_type const& attr_;
cairo_context & ctx_;
};
template <typename RendererContext, typename Detector>
-struct raster_markers_dispatch : mapnik::noncopyable
+struct raster_markers_dispatch_cairo : public raster_markers_dispatch<Detector>
{
- raster_markers_dispatch(mapnik::image_data_32 & src,
- agg::trans_affine const& marker_trans,
- markers_symbolizer const& sym,
- Detector & detector,
- double scale_factor,
- feature_impl const& feature,
- mapnik::attributes const& vars,
- RendererContext const& renderer_context)
- : src_(src),
- detector_(detector),
- sym_(sym),
- marker_trans_(marker_trans),
- scale_factor_(scale_factor),
- feature_(feature),
- vars_(vars),
+ raster_markers_dispatch_cairo(image_rgba8 const& src,
+ agg::trans_affine const& marker_trans,
+ markers_symbolizer const& sym,
+ Detector & detector,
+ double scale_factor,
+ feature_impl & feature,
+ mapnik::attributes const& vars,
+ RendererContext const& renderer_context)
+ : raster_markers_dispatch<Detector>(src, marker_trans, sym, detector, scale_factor, feature, vars),
ctx_(std::get<0>(renderer_context)) {}
- template <typename T>
- void add_path(T & path)
+ ~raster_markers_dispatch_cairo() {}
+
+ void render_marker(agg::trans_affine const& marker_tr, double opacity)
{
- marker_placement_enum placement_method = get<marker_placement_enum>(sym_, keys::markers_placement_type, feature_, vars_, MARKER_POINT_PLACEMENT);
- value_double opacity = get<value_double, keys::opacity>(sym_, feature_, vars_);
- value_double spacing = get<value_double, keys::spacing>(sym_, feature_, vars_);
- value_double max_error = get<value_double>(sym_, keys::max_error, feature_, vars_, 0.2); // overwrite default
- value_bool allow_overlap = get<value_bool, keys::allow_overlap>(sym_, feature_, vars_);
- value_bool avoid_edges = get<value_bool, keys::avoid_edges>(sym_, feature_, vars_);
- value_bool ignore_placement = get<value_bool, keys::ignore_placement>(sym_, feature_, vars_);
- box2d<double> bbox_(0,0, src_.width(),src_.height());
- markers_placement_params params { bbox_, marker_trans_, spacing * scale_factor_, max_error, allow_overlap, avoid_edges };
- markers_placement_finder<T, label_collision_detector4> placement_finder(
- placement_method, path, detector_, params);
- double x, y, angle = .0;
- while (placement_finder.get_point(x, y, angle, ignore_placement))
- {
- agg::trans_affine matrix = marker_trans_;
- matrix.rotate(angle);
- matrix.translate(x, y);
- ctx_.add_image(matrix, src_, opacity);
- }
+ ctx_.add_image(marker_tr, this->src_, opacity);
}
- image_data_32 & src_;
- Detector & detector_;
- markers_symbolizer const& sym_;
- agg::trans_affine const& marker_trans_;
- double scale_factor_;
- feature_impl const& feature_;
- attributes const& vars_;
+private:
cairo_context & ctx_;
};
@@ -182,8 +115,6 @@ void cairo_renderer<T>::process(markers_symbolizer const& sym,
mapnik::feature_impl & feature,
proj_transform const& prj_trans)
{
- using svg_attribute_type = agg::pod_bvector<svg::path_attributes>;
-
cairo_save_restore guard(context_);
composite_mode_e comp_op = get<composite_mode_e>(sym, keys::comp_op, feature, common_.vars_, src_over);
context_.set_operator(comp_op);
@@ -192,12 +123,11 @@ void cairo_renderer<T>::process(markers_symbolizer const& sym,
auto renderer_context = std::tie(context_);
using RendererContextType = decltype(renderer_context);
- using vector_dispatch_type = detail::markers_dispatch<RendererContextType,
- svg::path_adapter<svg::vertex_stl_adapter<svg::svg_path_storage> >,
- svg_attribute_type,label_collision_detector4>;
+ using vector_dispatch_type = detail::vector_markers_dispatch_cairo<RendererContextType,
+ label_collision_detector4>;
- using raster_dispatch_type = detail::raster_markers_dispatch<RendererContextType,
- label_collision_detector4>;
+ using raster_dispatch_type = detail::raster_markers_dispatch_cairo<RendererContextType,
+ label_collision_detector4>;
render_markers_symbolizer<vector_dispatch_type, raster_dispatch_type>(
diff --git a/src/cairo/process_polygon_pattern_symbolizer.cpp b/src/cairo/process_polygon_pattern_symbolizer.cpp
index 1394d65..08030f7 100644
--- a/src/cairo/process_polygon_pattern_symbolizer.cpp
+++ b/src/cairo/process_polygon_pattern_symbolizer.cpp
@@ -29,14 +29,60 @@
#include <mapnik/cairo/cairo_render_vector.hpp>
#include <mapnik/renderer_common/render_pattern.hpp>
#include <mapnik/vertex_converters.hpp>
+#include <mapnik/vertex_processor.hpp>
#include <mapnik/marker.hpp>
#include <mapnik/marker_cache.hpp>
#include <mapnik/agg_rasterizer.hpp>
#include <mapnik/renderer_common/clipping_extent.hpp>
+#include <mapnik/renderer_common/apply_vertex_converter.hpp>
+#include <mapnik/renderer_common/pattern_alignment.hpp>
namespace mapnik
{
+struct cairo_renderer_process_visitor_p
+{
+ cairo_renderer_process_visitor_p(cairo_context & context,
+ agg::trans_affine & image_tr,
+ unsigned offset_x,
+ unsigned offset_y,
+ float opacity)
+ : context_(context),
+ image_tr_(image_tr),
+ offset_x_(offset_x),
+ offset_y_(offset_y),
+ opacity_(opacity) {}
+
+ void operator() (marker_null const&) {}
+
+ void operator() (marker_svg const& marker)
+ {
+ mapnik::rasterizer ras;
+ mapnik::box2d<double> const& bbox_image = marker.get_data()->bounding_box() * image_tr_;
+ mapnik::image_rgba8 image(bbox_image.width(), bbox_image.height());
+ render_pattern<image_rgba8>(ras, marker, image_tr_, 1.0, image);
+ cairo_pattern pattern(image, opacity_);
+ pattern.set_extend(CAIRO_EXTEND_REPEAT);
+ pattern.set_origin(offset_x_, offset_y_);
+ context_.set_pattern(pattern);
+ }
+
+ void operator() (marker_rgba8 const& marker)
+ {
+ cairo_pattern pattern(marker.get_data(), opacity_);
+ pattern.set_extend(CAIRO_EXTEND_REPEAT);
+ pattern.set_origin(offset_x_, offset_y_);
+ context_.set_pattern(pattern);
+ }
+
+ private:
+ cairo_context & context_;
+ agg::trans_affine & image_tr_;
+ unsigned offset_x_;
+ unsigned offset_y_;
+ float opacity_;
+};
+
template <typename T>
void cairo_renderer<T>::process(polygon_pattern_symbolizer const& sym,
mapnik::feature_impl & feature,
@@ -55,8 +101,8 @@ void cairo_renderer<T>::process(polygon_pattern_symbolizer const& sym,
cairo_save_restore guard(context_);
context_.set_operator(comp_op);
- boost::optional<mapnik::marker_ptr> marker = mapnik::marker_cache::instance().find(filename,true);
- if (!marker || !(*marker)) return;
+ std::shared_ptr<mapnik::marker const> marker = mapnik::marker_cache::instance().find(filename,true);
+ if (marker->is<mapnik::marker_null>()) return;
unsigned offset_x=0;
unsigned offset_y=0;
@@ -66,58 +112,36 @@ void cairo_renderer<T>::process(polygon_pattern_symbolizer const& sym,
{
double x0 = 0.0;
double y0 = 0.0;
-
- if (feature.num_geometries() > 0)
- {
- using clipped_geometry_type = agg::conv_clip_polygon<geometry_type>;
- using path_type = transform_path_adapter<view_transform,clipped_geometry_type>;
- clipped_geometry_type clipped(feature.get_geometry(0));
- clipped.clip_box(clip_box.minx(), clip_box.miny(),
- clip_box.maxx(), clip_box.maxy());
- path_type path(common_.t_, clipped, prj_trans);
- path.vertex(&x0, &y0);
- }
+ using apply_local_alignment = detail::apply_local_alignment;
+ apply_local_alignment apply(common_.t_, prj_trans, clip_box, x0, y0);
+ util::apply_visitor(geometry::vertex_processor<apply_local_alignment>(apply), feature.get_geometry());
offset_x = std::abs(clip_box.width() - x0);
offset_y = std::abs(clip_box.height() - y0);
}
- if ((*marker)->is_bitmap())
- {
- cairo_pattern pattern(**((*marker)->get_bitmap_data()), opacity);
- pattern.set_extend(CAIRO_EXTEND_REPEAT);
- pattern.set_origin(offset_x, offset_y);
- context_.set_pattern(pattern);
- }
- else
- {
- mapnik::rasterizer ras;
- image_ptr image = render_pattern(ras, **marker, image_tr, 1.0); //
- cairo_pattern pattern(*image, opacity);
- pattern.set_extend(CAIRO_EXTEND_REPEAT);
- pattern.set_origin(offset_x, offset_y);
- context_.set_pattern(pattern);
- }
+ util::apply_visitor(cairo_renderer_process_visitor_p(context_, image_tr, offset_x, offset_y, opacity), *marker);
agg::trans_affine tr;
auto geom_transform = get_optional<transform_type>(sym, keys::geometry_transform);
if (geom_transform) { evaluate_transform(tr, feature, common_.vars_, *geom_transform, common_.scale_factor_); }
-
- vertex_converter<cairo_context,clip_poly_tag,transform_tag,affine_transform_tag,simplify_tag,smooth_tag>
- converter(clip_box, context_,sym,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
-
+ using vertex_converter_type = vertex_converter<
+ clip_poly_tag,
+ transform_tag,
+ affine_transform_tag,
+ simplify_tag,
+ smooth_tag>;
+
+ vertex_converter_type converter(clip_box,sym,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
if (prj_trans.equal() && clip) converter.set<clip_poly_tag>(); //optional clip (default: true)
converter.set<transform_tag>(); //always transform
converter.set<affine_transform_tag>();
if (simplify_tolerance > 0.0) converter.set<simplify_tag>(); // optional simplify converter
if (smooth > 0.0) converter.set<smooth_tag>(); // optional smooth converter
- for ( geometry_type & geom : feature.paths())
- {
- if (geom.size() > 2)
- {
- converter.apply(geom);
- }
- }
+ using apply_vertex_converter_type = detail::apply_vertex_converter<vertex_converter_type, cairo_context>;
+ using vertex_processor_type = geometry::vertex_processor<apply_vertex_converter_type>;
+ apply_vertex_converter_type apply(converter, context_);
+ mapnik::util::apply_visitor(vertex_processor_type(apply),feature.get_geometry());
// fill polygon
context_.set_fill_rule(CAIRO_FILL_RULE_EVEN_ODD);
context_.fill();
diff --git a/src/cairo/process_polygon_symbolizer.cpp b/src/cairo/process_polygon_symbolizer.cpp
index bbc48e1..90ca5c9 100644
--- a/src/cairo/process_polygon_symbolizer.cpp
+++ b/src/cairo/process_polygon_symbolizer.cpp
@@ -38,7 +38,7 @@ void cairo_renderer<T>::process(polygon_symbolizer const& sym,
mapnik::feature_impl & feature,
proj_transform const& prj_trans)
{
- using vertex_converter_type = vertex_converter<cairo_context,clip_poly_tag,transform_tag,affine_transform_tag,simplify_tag,smooth_tag>;
+ using vertex_converter_type = vertex_converter<clip_poly_tag,transform_tag,affine_transform_tag,simplify_tag,smooth_tag>;
cairo_save_restore guard(context_);
composite_mode_e comp_op = get<composite_mode_e, keys::comp_op>(sym, feature, common_.vars_);
context_.set_operator(comp_op);
diff --git a/src/cairo/process_raster_symbolizer.cpp b/src/cairo/process_raster_symbolizer.cpp
index c9bfcaf..7915ebb 100644
--- a/src/cairo/process_raster_symbolizer.cpp
+++ b/src/cairo/process_raster_symbolizer.cpp
@@ -43,7 +43,7 @@ void cairo_renderer<T>::process(raster_symbolizer const& sym,
cairo_save_restore guard(context_);
render_raster_symbolizer(
sym, feature, prj_trans, common_,
- [&](image_data_32 &target, composite_mode_e comp_op, double opacity,
+ [&](image_rgba8 &target, composite_mode_e comp_op, double opacity,
int start_x, int start_y) {
context_.set_operator(comp_op);
context_.add_image(start_x, start_y, target, opacity);
diff --git a/src/cairo/process_text_symbolizer.cpp b/src/cairo/process_text_symbolizer.cpp
index 3493ac1..1975114 100644
--- a/src/cairo/process_text_symbolizer.cpp
+++ b/src/cairo/process_text_symbolizer.cpp
@@ -57,14 +57,15 @@ void cairo_renderer<T>::process(shield_symbolizer const& sym,
placements_list const &placements = helper.get();
for (glyph_positions_ptr glyphs : placements)
{
- if (glyphs->marker()) {
+ marker_info_ptr mark = glyphs->get_marker();
+ if (mark) {
pixel_position pos = glyphs->marker_pos();
render_marker(pos,
- *(glyphs->marker()->marker),
- glyphs->marker()->transform,
+ *mark->marker_,
+ mark->transform_,
opacity);
}
- context_.add_text(*glyphs, face_manager_, common_.font_manager_, comp_op, halo_comp_op, common_.scale_factor_);
+ context_.add_text(*glyphs, face_manager_, comp_op, halo_comp_op, common_.scale_factor_);
}
}
@@ -94,7 +95,7 @@ void cairo_renderer<T>::process(text_symbolizer const& sym,
placements_list const& placements = helper.get();
for (glyph_positions_ptr glyphs : placements)
{
- context_.add_text(*glyphs, face_manager_, common_.font_manager_, comp_op, halo_comp_op, common_.scale_factor_);
+ context_.add_text(*glyphs, face_manager_, comp_op, halo_comp_op, common_.scale_factor_);
}
}
diff --git a/src/cairo_io.cpp b/src/cairo_io.cpp
new file mode 100644
index 0000000..d8e9655
--- /dev/null
+++ b/src/cairo_io.cpp
@@ -0,0 +1,131 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/cairo_io.hpp>
+#include <mapnik/image_util.hpp>
+#include <mapnik/map.hpp>
+
+#ifdef HAVE_CAIRO
+#include <mapnik/cairo/cairo_renderer.hpp>
+#include <cairo.h>
+#ifdef CAIRO_HAS_PDF_SURFACE
+#include <cairo-pdf.h>
+#endif
+#ifdef CAIRO_HAS_PS_SURFACE
+#include <cairo-ps.h>
+#endif
+#ifdef CAIRO_HAS_SVG_SURFACE
+#include <cairo-svg.h>
+#endif
+#endif
+
+// stl
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+namespace mapnik {
+
+#if defined(HAVE_CAIRO)
+void save_to_cairo_file(mapnik::Map const& map, std::string const& filename, double scale_factor, double scale_denominator)
+{
+ boost::optional<std::string> type = type_from_filename(filename);
+ if (type)
+ {
+ save_to_cairo_file(map,filename,*type,scale_factor,scale_denominator);
+ }
+ else throw image_writer_exception("Could not write file to " + filename );
+}
+
+void save_to_cairo_file(mapnik::Map const& map,
+ std::string const& filename,
+ std::string const& type,
+ double scale_factor,
+ double scale_denominator)
+{
+ std::ofstream file (filename.c_str(), std::ios::out|std::ios::trunc|std::ios::binary);
+ if (file)
+ {
+ cairo_surface_ptr surface;
+ unsigned width = map.width();
+ unsigned height = map.height();
+ if (type == "pdf")
+ {
+#ifdef CAIRO_HAS_PDF_SURFACE
+ surface = cairo_surface_ptr(cairo_pdf_surface_create(filename.c_str(),width,height),cairo_surface_closer());
+#else
+ throw image_writer_exception("PDFSurface not supported in the cairo backend");
+#endif
+ }
+#ifdef CAIRO_HAS_SVG_SURFACE
+ else if (type == "svg")
+ {
+ surface = cairo_surface_ptr(cairo_svg_surface_create(filename.c_str(),width,height),cairo_surface_closer());
+ }
+#endif
+#ifdef CAIRO_HAS_PS_SURFACE
+ else if (type == "ps")
+ {
+ surface = cairo_surface_ptr(cairo_ps_surface_create(filename.c_str(),width,height),cairo_surface_closer());
+ }
+#endif
+#ifdef CAIRO_HAS_IMAGE_SURFACE
+ else if (type == "ARGB32")
+ {
+ surface = cairo_surface_ptr(cairo_image_surface_create(CAIRO_FORMAT_ARGB32,width,height),cairo_surface_closer());
+ }
+ else if (type == "RGB24")
+ {
+ surface = cairo_surface_ptr(cairo_image_surface_create(CAIRO_FORMAT_RGB24,width,height),cairo_surface_closer());
+ }
+#endif
+ else
+ {
+ throw image_writer_exception("unknown file type: " + type);
+ }
+
+ //cairo_t * ctx = cairo_create(surface);
+
+ // TODO - expose as user option
+ /*
+ if (type == "ARGB32" || type == "RGB24")
+ {
+ context->set_antialias(Cairo::ANTIALIAS_NONE);
+ }
+ */
+
+ mapnik::cairo_renderer<cairo_ptr> ren(map, create_context(surface), scale_factor);
+ ren.apply(scale_denominator);
+
+ if (type == "ARGB32" || type == "RGB24")
+ {
+ cairo_surface_write_to_png(&*surface, filename.c_str());
+ }
+ cairo_surface_finish(&*surface);
+ }
+}
+
+#endif
+
+} // end ns
diff --git a/src/color.cpp b/src/color.cpp
index 5cc33b7..75204ce 100644
--- a/src/color.cpp
+++ b/src/color.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -39,15 +39,16 @@
#include <boost/spirit/include/phoenix_fusion.hpp>
#include <boost/spirit/include/phoenix_function.hpp>
#pragma GCC diagnostic pop
-
+
// stl
#include <sstream>
namespace mapnik {
-color::color(std::string const& str)
+color::color(std::string const& str, bool premultiplied)
{
*this = parse_color(str);
+ premultiplied_ = premultiplied;
}
std::string color::to_string() const
@@ -95,23 +96,28 @@ std::string color::to_hex_string() const
return str;
}
-void color::premultiply()
+bool color::premultiply()
{
+ if (premultiplied_) return false;
agg::rgba8 pre_c = agg::rgba8(red_,green_,blue_,alpha_);
pre_c.premultiply();
red_ = pre_c.r;
green_ = pre_c.g;
blue_ = pre_c.b;
+ premultiplied_ = true;
+ return true;
}
-void color::demultiply()
+bool color::demultiply()
{
- // note: this darkens too much: https://github.com/mapnik/mapnik/issues/1519
+ if (!premultiplied_) return false;
agg::rgba8 pre_c = agg::rgba8(red_,green_,blue_,alpha_);
pre_c.demultiply();
red_ = pre_c.r;
green_ = pre_c.g;
blue_ = pre_c.b;
+ premultiplied_ = false;
+ return true;
}
}
diff --git a/src/color_factory.cpp b/src/color_factory.cpp
index c509c7f..38257ec 100644
--- a/src/color_factory.cpp
+++ b/src/color_factory.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/conversions.cpp b/src/conversions.cpp
index da79ae0..83bdd5f 100644
--- a/src/conversions.cpp
+++ b/src/conversions.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -56,6 +56,33 @@ auto LONGLONG = qi::long_long_type();
auto FLOAT = qi::float_type();
auto DOUBLE = qi::double_type();
+bool string2bool(std::string const& value, bool & result)
+{
+ if (value.empty() || value.size() > 5) {
+ return false;
+ } else if (value == "true") {
+ return result = true;
+ } else if (value == "false") {
+ result = false;
+ return true;
+ }
+ std::string val(value);
+ std::transform(val.begin(), val.end(), val.begin(), ::tolower);
+ if (val == "true" || val == "yes" || val == "1" || val == "on") {
+ return result = true;
+ } else if (val == "false" || val == "no" || val == "0" || val == "off") {
+ result = false;
+ return true;
+ }
+ return false;
+}
+
+bool string2bool(const char * iter, const char * end, bool & result)
+{
+ std::string val(iter,end);
+ return string2bool(val,result);
+}
+
bool string2int(const char * iter, const char * end, int & result)
{
ascii::space_type space;
diff --git a/src/datasource_cache.cpp b/src/datasource_cache.cpp
index cafb8c9..97d6550 100644
--- a/src/datasource_cache.cpp
+++ b/src/datasource_cache.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -34,7 +34,6 @@
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#include <boost/filesystem/operations.hpp>
#include <boost/algorithm/string/join.hpp>
#include <boost/algorithm/string/predicate.hpp>
#pragma GCC diagnostic pop
@@ -90,7 +89,7 @@ datasource_ptr datasource_cache::create(parameters const& params)
// add scope to ensure lock is released asap
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
itr=plugins_.find(*type);
if (itr == plugins_.end())
@@ -157,7 +156,7 @@ std::vector<std::string> datasource_cache::plugin_names()
bool datasource_cache::register_datasources(std::string const& dir, bool recurse)
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
if (!mapnik::util::exists(dir))
{
@@ -171,18 +170,9 @@ bool datasource_cache::register_datasources(std::string const& dir, bool recurse
bool success = false;
try
{
- boost::filesystem::directory_iterator end_itr;
-#ifdef _WINDOWS
- std::wstring wide_dir(mapnik::utf8_to_utf16(dir));
- for (boost::filesystem::directory_iterator itr(wide_dir); itr != end_itr; ++itr)
+ for (std::string const& file_name : mapnik::util::list_directory(dir))
{
- std::string file_name = mapnik::utf16_to_utf8(itr->path().wstring());
-#else
- for (boost::filesystem::directory_iterator itr(dir); itr != end_itr; ++itr)
- {
- std::string file_name = itr->path().string();
-#endif
- if (boost::filesystem::is_directory(*itr) && recurse)
+ if (mapnik::util::is_directory(file_name) && recurse)
{
if (register_datasources(file_name, true))
{
@@ -191,7 +181,7 @@ bool datasource_cache::register_datasources(std::string const& dir, bool recurse
}
else
{
- std::string base_name = itr->path().filename().string();
+ std::string base_name = mapnik::util::basename(file_name);
if (!boost::algorithm::starts_with(base_name,".") &&
mapnik::util::is_regular_file(file_name) &&
is_input_plugin(file_name))
diff --git a/src/datasource_cache_static.cpp b/src/datasource_cache_static.cpp
index 459460a..15f76bf 100644
--- a/src/datasource_cache_static.cpp
+++ b/src/datasource_cache_static.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -38,46 +38,43 @@
// static plugin linkage
#ifdef MAPNIK_STATIC_PLUGINS
#if defined(MAPNIK_STATIC_PLUGIN_CSV)
- #include "plugins/input/csv/csv_datasource.hpp"
+ #include "input/csv/csv_datasource.hpp"
#endif
#if defined(MAPNIK_STATIC_PLUGIN_GDAL)
- #include "plugins/input/gdal/gdal_datasource.hpp"
+ #include "input/gdal/gdal_datasource.hpp"
#endif
#if defined(MAPNIK_STATIC_PLUGIN_GEOJSON)
- #include "plugins/input/geojson/geojson_datasource.hpp"
+ #include "input/geojson/geojson_datasource.hpp"
#endif
#if defined(MAPNIK_STATIC_PLUGIN_GEOS)
- #include "plugins/input/geos/geos_datasource.hpp"
+ #include "input/geos/geos_datasource.hpp"
#endif
#if defined(MAPNIK_STATIC_PLUGIN_KISMET)
- #include "plugins/input/kismet/kismet_datasource.hpp"
+ #include "input/kismet/kismet_datasource.hpp"
#endif
#if defined(MAPNIK_STATIC_PLUGIN_OCCI)
- #include "plugins/input/occi/occi_datasource.hpp"
+ #include "input/occi/occi_datasource.hpp"
#endif
#if defined(MAPNIK_STATIC_PLUGIN_OGR)
- #include "plugins/input/ogr/ogr_datasource.hpp"
+ #include "input/ogr/ogr_datasource.hpp"
#endif
#if defined(MAPNIK_STATIC_PLUGIN_OSM)
- #include "plugins/input/osm/osm_datasource.hpp"
+ #include "input/osm/osm_datasource.hpp"
#endif
#if defined(MAPNIK_STATIC_PLUGIN_POSTGIS)
- #include "plugins/input/postgis/postgis_datasource.hpp"
- #endif
- #if defined(MAPNIK_STATIC_PLUGIN_PYTHON)
- #include "plugins/input/python/python_datasource.hpp"
+ #include "input/postgis/postgis_datasource.hpp"
#endif
#if defined(MAPNIK_STATIC_PLUGIN_RASTER)
- #include "plugins/input/raster/raster_datasource.hpp"
+ #include "input/raster/raster_datasource.hpp"
#endif
#if defined(MAPNIK_STATIC_PLUGIN_RASTERLITE)
- #include "plugins/input/rasterlite/rasterlite_datasource.hpp"
+ #include "input/rasterlite/rasterlite_datasource.hpp"
#endif
#if defined(MAPNIK_STATIC_PLUGIN_SHAPE)
- #include "plugins/input/shape/shape_datasource.hpp"
+ #include "input/shape/shape_datasource.hpp"
#endif
#if defined(MAPNIK_STATIC_PLUGIN_SQLITE)
- #include "plugins/input/sqlite/sqlite_datasource.hpp"
+ #include "input/sqlite/sqlite_datasource.hpp"
#endif
#endif
@@ -90,7 +87,7 @@ datasource_ptr ds_generator(parameters const& params)
return std::make_shared<T>(params);
}
-using params) = datasource_ptr (*ds_generator_ptr)(parameters const&;
+typedef datasource_ptr (*ds_generator_ptr)(parameters const& params);
using datasource_map = boost::unordered_map<std::string, ds_generator_ptr>;
static datasource_map ds_map = boost::assign::map_list_of
@@ -115,9 +112,6 @@ static datasource_map ds_map = boost::assign::map_list_of
#if defined(MAPNIK_STATIC_PLUGIN_POSTGIS)
(std::string("postgis"), &ds_generator<postgis_datasource>)
#endif
- #if defined(MAPNIK_STATIC_PLUGIN_PYTHON)
- (std::string("python"), &ds_generator<python_datasource>)
- #endif
#if defined(MAPNIK_STATIC_PLUGIN_RASTER)
(std::string("raster"), &ds_generator<raster_datasource>)
#endif
diff --git a/src/debug.cpp b/src/debug.cpp
index 44a1250..4a519cd 100644
--- a/src/debug.cpp
+++ b/src/debug.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/expression.cpp b/src/expression.cpp
index 3f01fe2..b8f430a 100644
--- a/src/expression.cpp
+++ b/src/expression.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -40,7 +40,21 @@ expression_ptr parse_expression(std::string const& str)
auto node = std::make_shared<expr_node>();
std::string::const_iterator itr = str.begin();
std::string::const_iterator end = str.end();
- bool r = boost::spirit::qi::phrase_parse(itr, end, g, space, *node);
+ bool r = false;
+ try
+ {
+ r = boost::spirit::qi::phrase_parse(itr, end, g, space, *node);
+ }
+ catch (boost::spirit::qi::expectation_failure<std::string::const_iterator> const& ex)
+ {
+ // no need to show "boost::spirit::qi::expectation_failure" which is a std::runtime_error
+ throw config_error("Failed to parse expression: \"" + str + "\"");
+ }
+ catch (std::exception const& ex)
+ {
+ // show "Could not initialize ICU resources" from boost::regex which is a std::runtime_error
+ throw config_error(std::string(ex.what()) + " for expression: \"" + str + "\"");
+ }
if (r && itr == end)
{
return node;
diff --git a/src/expression_node.cpp b/src/expression_node.cpp
index 69cb530..3eef360 100644
--- a/src/expression_node.cpp
+++ b/src/expression_node.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,7 +22,7 @@
#include <mapnik/expression_node.hpp>
#include <mapnik/value_types.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#if defined(BOOST_REGEX_HAS_ICU)
#include <boost/regex/icu.hpp>
@@ -33,7 +33,7 @@
namespace mapnik
{
-struct _regex_match_impl : noncopyable {
+struct _regex_match_impl : util::noncopyable {
#if defined(BOOST_REGEX_HAS_ICU)
_regex_match_impl(value_unicode_string const& ustr) :
pattern_(boost::make_u32regex(ustr)) {}
@@ -45,7 +45,7 @@ struct _regex_match_impl : noncopyable {
#endif
};
-struct _regex_replace_impl : noncopyable {
+struct _regex_replace_impl : util::noncopyable {
#if defined(BOOST_REGEX_HAS_ICU)
_regex_replace_impl(value_unicode_string const& ustr, value_unicode_string const& f) :
pattern_(boost::make_u32regex(ustr)),
@@ -153,4 +153,4 @@ std::string regex_replace_node::to_string() const
return str_;
}
-}
\ No newline at end of file
+}
diff --git a/src/expression_string.cpp b/src/expression_string.cpp
index a5d1386..6fe3920 100644
--- a/src/expression_string.cpp
+++ b/src/expression_string.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -33,7 +33,7 @@
namespace mapnik
{
-struct expression_string : util::static_visitor<void>
+struct expression_string
{
explicit expression_string(std::string & str)
: str_(str) {}
diff --git a/src/feature_kv_iterator.cpp b/src/feature_kv_iterator.cpp
index ed0c905..ae2543d 100644
--- a/src/feature_kv_iterator.cpp
+++ b/src/feature_kv_iterator.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/feature_style_processor.cpp b/src/feature_style_processor.cpp
index a9af0dc..94bfa6b 100644
--- a/src/feature_style_processor.cpp
+++ b/src/feature_style_processor.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,7 @@
#include <mapnik/feature_style_processor_impl.hpp>
#include <mapnik/agg_renderer.hpp>
-#include <mapnik/graphics.hpp>
+#include <mapnik/image_any.hpp>
#if defined(GRID_RENDERER)
#include <mapnik/grid/grid_renderer.hpp>
@@ -44,17 +44,17 @@ namespace mapnik
{
#if defined(HAVE_CAIRO)
-template class feature_style_processor<cairo_renderer<cairo_ptr> >;
+template class MAPNIK_DECL feature_style_processor<cairo_renderer<cairo_ptr> >;
#endif
#if defined(SVG_RENDERER)
-template class feature_style_processor<svg_renderer<std::ostream_iterator<char> > >;
+template class MAPNIK_DECL feature_style_processor<svg_renderer<std::ostream_iterator<char> > >;
#endif
#if defined(GRID_RENDERER)
-template class feature_style_processor<grid_renderer<grid> >;
+template class MAPNIK_DECL feature_style_processor<grid_renderer<grid> >;
#endif
-template class feature_style_processor<agg_renderer<image_32> >;
+template class MAPNIK_DECL feature_style_processor<agg_renderer<image_rgba8> >;
}
diff --git a/src/feature_type_style.cpp b/src/feature_type_style.cpp
index 8775226..4ee54e2 100644
--- a/src/feature_type_style.cpp
+++ b/src/feature_type_style.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/font_engine_freetype.cpp b/src/font_engine_freetype.cpp
index f4c33c9..1c87f87 100644
--- a/src/font_engine_freetype.cpp
+++ b/src/font_engine_freetype.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -35,7 +35,6 @@
#pragma GCC diagnostic ignored "-Wunused-parameter"
#pragma GCC diagnostic ignored "-Wunused-local-typedef"
#include <boost/algorithm/string/predicate.hpp>
-#include <boost/filesystem.hpp>
#include <boost/optional.hpp>
#pragma GCC diagnostic pop
@@ -66,11 +65,10 @@ bool freetype_engine::is_font_file(std::string const& file_name)
std::transform(fn.begin(), fn.end(), fn.begin(), ::tolower);
return boost::algorithm::ends_with(fn,std::string(".ttf")) ||
boost::algorithm::ends_with(fn,std::string(".otf")) ||
+ boost::algorithm::ends_with(fn,std::string(".woff"))||
boost::algorithm::ends_with(fn,std::string(".ttc")) ||
boost::algorithm::ends_with(fn,std::string(".pfa")) ||
boost::algorithm::ends_with(fn,std::string(".pfb")) ||
- boost::algorithm::ends_with(fn,std::string(".ttc")) ||
- boost::algorithm::ends_with(fn,std::string(".woff"))||
// Plus OSX custom ext
boost::algorithm::ends_with(fn,std::string(".dfont"));
}
@@ -86,7 +84,7 @@ unsigned long ft_read_cb(FT_Stream stream, unsigned long offset, unsigned char *
bool freetype_engine::register_font(std::string const& file_name)
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
font_library library;
return register_font_impl(file_name, library, global_font_file_mapping_);
@@ -168,7 +166,7 @@ bool freetype_engine::register_font_impl(std::string const& file_name,
bool freetype_engine::register_fonts(std::string const& dir, bool recurse)
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
font_library library;
return register_fonts_impl(dir, library, global_font_file_mapping_, recurse);
@@ -190,18 +188,9 @@ bool freetype_engine::register_fonts_impl(std::string const& dir,
bool success = false;
try
{
- boost::filesystem::directory_iterator end_itr;
-#ifdef _WINDOWS
- std::wstring wide_dir(mapnik::utf8_to_utf16(dir));
- for (boost::filesystem::directory_iterator itr(wide_dir); itr != end_itr; ++itr)
+ for (std::string const& file_name : mapnik::util::list_directory(dir))
{
- std::string file_name = mapnik::utf16_to_utf8(itr->path().wstring());
-#else
- for (boost::filesystem::directory_iterator itr(dir); itr != end_itr; ++itr)
- {
- std::string file_name = itr->path().string();
-#endif
- if (boost::filesystem::is_directory(*itr) && recurse)
+ if (mapnik::util::is_directory(file_name) && recurse)
{
if (register_fonts_impl(file_name, library, font_file_mapping, true))
{
@@ -210,7 +199,7 @@ bool freetype_engine::register_fonts_impl(std::string const& dir,
}
else
{
- std::string base_name = itr->path().filename().string();
+ std::string base_name = mapnik::util::basename(file_name);
if (!boost::algorithm::starts_with(base_name,".") &&
mapnik::util::is_regular_file(file_name) &&
is_font_file(file_name))
@@ -327,9 +316,9 @@ face_ptr freetype_engine::create_face(std::string const& family_name,
itr = global_font_file_mapping.find(family_name);
if (itr != global_font_file_mapping.end())
{
- auto mem_font_itr = global_memory_fonts_.find(itr->second.second);
+ auto mem_font_itr = global_memory_fonts.find(itr->second.second);
// if font already in memory, use it
- if (mem_font_itr != global_memory_fonts_.end())
+ if (mem_font_itr != global_memory_fonts.end())
{
FT_Face face;
FT_Error error = FT_New_Memory_Face(library.get(),
@@ -349,9 +338,9 @@ face_ptr freetype_engine::create_face(std::string const& family_name,
if (file.open())
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
- auto result = global_memory_fonts_.emplace(itr->second.second, std::make_pair(std::move(file.data()),file.size()));
+ auto result = global_memory_fonts.emplace(itr->second.second, std::make_pair(std::move(file.data()),file.size()));
FT_Face face;
FT_Error error = FT_New_Memory_Face(library.get(),
reinterpret_cast<FT_Byte const*>(result.first->second.first.get()), // data
@@ -361,7 +350,7 @@ face_ptr freetype_engine::create_face(std::string const& family_name,
if (error)
{
// we can't load font, erase it.
- global_memory_fonts_.erase(result.first);
+ global_memory_fonts.erase(result.first);
return face_ptr();
}
return std::make_shared<font_face>(face);
diff --git a/src/font_set.cpp b/src/font_set.cpp
index c99f804..89f46b0 100644
--- a/src/font_set.cpp
+++ b/src/font_set.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/fs.cpp b/src/fs.cpp
index 247c4a4..6554724 100644
--- a/src/fs.cpp
+++ b/src/fs.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,8 @@
#include <mapnik/util/fs.hpp>
// boost
-#include <boost/filesystem/convenience.hpp>
+#include <boost/filesystem/operations.hpp> // for absolute, exists, etc
+#include <boost/filesystem/path.hpp> // for path, operator/
// stl
#include <stdexcept>
@@ -81,7 +82,6 @@ namespace util {
return (! child_path.has_root_directory() && ! child_path.has_root_name());
}
-
std::string make_relative(std::string const& filepath, std::string const& base)
{
#ifdef _WINDOWS
@@ -109,6 +109,32 @@ namespace util {
return bp.parent_path().string();
}
+ std::string basename(std::string const& value)
+ {
+ boost::filesystem::path bp(value);
+ return bp.filename().string();
+ }
+
+ std::vector<std::string> list_directory(std::string const& dir)
+ {
+ std::vector<std::string> listing;
+ boost::filesystem::directory_iterator end_itr;
+#ifdef _WINDOWS
+ std::wstring wide_dir(mapnik::utf8_to_utf16(dir));
+ for (boost::filesystem::directory_iterator itr(wide_dir); itr != end_itr; ++itr)
+ {
+ listing.emplace_back(mapnik::utf16_to_utf8(itr->path().wstring()));
+ }
+#else
+ for (boost::filesystem::directory_iterator itr(dir); itr != end_itr; ++itr)
+ {
+ listing.emplace_back(itr->path().string());
+ }
+#endif
+ return listing;
+ }
+
+
} // end namespace util
} // end namespace mapnik
diff --git a/src/geometry_envelope.cpp b/src/geometry_envelope.cpp
new file mode 100644
index 0000000..0aa3466
--- /dev/null
+++ b/src/geometry_envelope.cpp
@@ -0,0 +1,50 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#include <mapnik/geometry_envelope.hpp>
+#include <mapnik/geometry_envelope_impl.hpp>
+#include <mapnik/text/symbolizer_helpers.hpp>
+namespace mapnik {
+namespace geometry {
+
+template MAPNIK_DECL mapnik::box2d<double> envelope(geometry<double> const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(mapnik::base_symbolizer_helper::geometry_cref const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(geometry_empty const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(point<double> const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(line_string<double> const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(polygon<double> const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(multi_point<double> const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(multi_line_string<double> const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(multi_polygon<double> const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(geometry_collection<double> const& geom);
+
+template MAPNIK_DECL mapnik::box2d<double> envelope(geometry<std::int64_t> const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(point<std::int64_t> const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(line_string<std::int64_t> const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(polygon<std::int64_t> const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(multi_point<std::int64_t> const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(multi_line_string<std::int64_t> const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(multi_polygon<std::int64_t> const& geom);
+template MAPNIK_DECL mapnik::box2d<double> envelope(geometry_collection<std::int64_t> const& geom);
+
+} // end ns geometry
+} // end ns mapnik
diff --git a/src/geometry_reprojection.cpp b/src/geometry_reprojection.cpp
new file mode 100644
index 0000000..0bdde2f
--- /dev/null
+++ b/src/geometry_reprojection.cpp
@@ -0,0 +1,73 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/geometry_reprojection.hpp>
+#include <mapnik/geometry_reprojection_impl.hpp>
+
+namespace mapnik {
+
+namespace geometry {
+
+template MAPNIK_DECL geometry<double> reproject_copy(geometry<double> const& geom, proj_transform const& proj_trans, unsigned int & n_err);
+template MAPNIK_DECL geometry_empty reproject_copy(geometry_empty const& geom, proj_transform const& proj_trans, unsigned int & n_err);
+template MAPNIK_DECL point<double> reproject_copy(point<double> const& geom, proj_transform const& proj_trans, unsigned int & n_err);
+template MAPNIK_DECL line_string<double> reproject_copy(line_string<double> const& geom, proj_transform const& proj_trans, unsigned int & n_err);
+template MAPNIK_DECL polygon<double> reproject_copy(polygon<double> const& geom, proj_transform const& proj_trans, unsigned int & n_err);
+template MAPNIK_DECL multi_point<double> reproject_copy(multi_point<double> const& geom, proj_transform const& proj_trans, unsigned int & n_err);
+template MAPNIK_DECL multi_line_string<double> reproject_copy(multi_line_string<double> const& geom, proj_transform const& proj_trans, unsigned int & n_err);
+template MAPNIK_DECL multi_polygon<double> reproject_copy(multi_polygon<double> const& geom, proj_transform const& proj_trans, unsigned int & n_err);
+template MAPNIK_DECL geometry_collection<double> reproject_copy(geometry_collection<double> const& geom, proj_transform const& proj_trans, unsigned int & n_err);
+
+template MAPNIK_DECL geometry<double> reproject_copy(geometry<double> const& geom, projection const& source, projection const& dest, unsigned int & n_err);
+template MAPNIK_DECL geometry_empty reproject_copy(geometry_empty const& geom, projection const& source, projection const& dest, unsigned int & n_err);
+template MAPNIK_DECL point<double> reproject_copy(point<double> const& geom, projection const& source, projection const& dest, unsigned int & n_err);
+template MAPNIK_DECL line_string<double> reproject_copy(line_string<double> const& geom, projection const& source, projection const& dest, unsigned int & n_err);
+template MAPNIK_DECL polygon<double> reproject_copy(polygon<double> const& geom, projection const& source, projection const& dest, unsigned int & n_err);
+template MAPNIK_DECL multi_point<double> reproject_copy(multi_point<double> const& geom, projection const& source, projection const& dest, unsigned int & n_err);
+template MAPNIK_DECL multi_line_string<double> reproject_copy(multi_line_string<double> const& geom, projection const& source, projection const& dest, unsigned int & n_err);
+template MAPNIK_DECL multi_polygon<double> reproject_copy(multi_polygon<double> const& geom, projection const& source, projection const& dest, unsigned int & n_err);
+template MAPNIK_DECL geometry_collection<double> reproject_copy(geometry_collection<double> const& geom, projection const& source, projection const& dest, unsigned int & n_err);
+
+template MAPNIK_DECL bool reproject(geometry<double> & geom, proj_transform const& proj_trans);
+template MAPNIK_DECL bool reproject(geometry_empty & geom, proj_transform const& proj_trans);
+template MAPNIK_DECL bool reproject(point<double> & geom, proj_transform const& proj_trans);
+template MAPNIK_DECL bool reproject(line_string<double> & geom, proj_transform const& proj_trans);
+template MAPNIK_DECL bool reproject(polygon<double> & geom, proj_transform const& proj_trans);
+template MAPNIK_DECL bool reproject(multi_point<double> & geom, proj_transform const& proj_trans);
+template MAPNIK_DECL bool reproject(multi_line_string<double> & geom, proj_transform const& proj_trans);
+template MAPNIK_DECL bool reproject(multi_polygon<double> & geom, proj_transform const& proj_trans);
+template MAPNIK_DECL bool reproject(geometry_collection<double> & geom, proj_transform const& proj_trans);
+
+template MAPNIK_DECL bool reproject(geometry<double> & geom, projection const& source, projection const& dest);
+template MAPNIK_DECL bool reproject(geometry_empty & geom, projection const& source, projection const& dest);
+template MAPNIK_DECL bool reproject(point<double> & geom, projection const& source, projection const& dest);
+template MAPNIK_DECL bool reproject(line_string<double> & geom, projection const& source, projection const& dest);
+template MAPNIK_DECL bool reproject(polygon<double> & geom, projection const& source, projection const& dest);
+template MAPNIK_DECL bool reproject(multi_point<double> & geom, projection const& source, projection const& dest);
+template MAPNIK_DECL bool reproject(multi_line_string<double> & geom, projection const& source, projection const& dest);
+template MAPNIK_DECL bool reproject(multi_polygon<double> & geom, projection const& source, projection const& dest);
+template MAPNIK_DECL bool reproject(geometry_collection<double> & geom, projection const& source, projection const& dest);
+
+} // end geometry ns
+
+} // end mapnik ns
diff --git a/src/gradient.cpp b/src/gradient.cpp
index 4161283..912739e 100644
--- a/src/gradient.cpp
+++ b/src/gradient.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -45,28 +45,26 @@ static const char * gradient_unit_strings[] = {
IMPLEMENT_ENUM( gradient_unit_e, gradient_unit_strings )
gradient::gradient()
-: gradient_type_(NO_GRADIENT),
- stops_(),
- x1_(0),
- y1_(0),
- x2_(0),
- y2_(0),
- r_(0),
- units_(OBJECT_BOUNDING_BOX),
- transform_()
-{}
+: transform_(),
+ x1_(0),
+ y1_(0),
+ x2_(0),
+ y2_(0),
+ r_(0),
+ stops_(),
+ units_(OBJECT_BOUNDING_BOX),
+ gradient_type_(NO_GRADIENT) {}
gradient::gradient(gradient const& other)
- : gradient_type_(other.gradient_type_),
- stops_(other.stops_),
+ : transform_(other.transform_),
x1_(other.x1_),
y1_(other.y1_),
x2_(other.x2_),
y2_(other.y2_),
r_(other.r_),
+ stops_(other.stops_),
units_(other.units_),
- transform_(other.transform_)
-{}
+ gradient_type_(other.gradient_type_) {}
gradient & gradient::operator=(const gradient& rhs)
{
diff --git a/src/graphics.cpp b/src/graphics.cpp
deleted file mode 100644
index 31d4536..0000000
--- a/src/graphics.cpp
+++ /dev/null
@@ -1,210 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2011 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-
-// mapnik
-#include <mapnik/debug.hpp>
-#include <mapnik/graphics.hpp>
-#include <mapnik/image_util.hpp>
-#include <mapnik/global.hpp>
-#include <mapnik/color.hpp>
-
-// agg
-#include "agg_rendering_buffer.h"
-#include "agg_pixfmt_rgba.h"
-#include "agg_color_rgba.h"
-
-#ifdef HAVE_CAIRO
-#include <mapnik/cairo/cairo_context.hpp>
-#endif
-
-namespace mapnik
-{
-image_32::image_32(int width,int height)
- :width_(width),
- height_(height),
- data_(width,height),
- painted_(false),
- premultiplied_(false) {}
-
-image_32::image_32(const image_32& rhs)
- :width_(rhs.width_),
- height_(rhs.height_),
- data_(rhs.data_),
- painted_(rhs.painted_),
- premultiplied_(rhs.premultiplied_) {}
-
-#ifdef HAVE_CAIRO
-image_32::image_32(cairo_surface_ptr const& surface)
- :width_(cairo_image_surface_get_width(&*surface)),
- height_(cairo_image_surface_get_height(&*surface)),
- data_(width_, height_),
- premultiplied_(false)
-{
- painted_ = true;
- if ( cairo_image_surface_get_format(&*surface) != CAIRO_FORMAT_ARGB32)
- {
- MAPNIK_LOG_WARN(graphics) << "Unable to convert this Cairo format";
- throw;
- }
-
- int stride = cairo_image_surface_get_stride(&*surface) / 4;
-
- const std::unique_ptr<unsigned int[]> out_row(new unsigned int[width_]);
- const unsigned int *in_row = (const unsigned int *)cairo_image_surface_get_data(&*surface);
-
- for (unsigned int row = 0; row < height_; row++, in_row += stride)
- {
- for (unsigned int column = 0; column < width_; column++)
- {
- unsigned int in = in_row[column];
- unsigned int a = (in >> 24) & 0xff;
- unsigned int r = (in >> 16) & 0xff;
- unsigned int g = (in >> 8) & 0xff;
- unsigned int b = (in >> 0) & 0xff;
-
-#define DE_ALPHA(x) do { \
- if (a == 0) x = 0; \
- else x = x * 255 / a; \
- if (x > 255) x = 255; \
- } while(0)
-
- DE_ALPHA(r);
- DE_ALPHA(g);
- DE_ALPHA(b);
-
- out_row[column] = color(r, g, b, a).rgba();
- }
- data_.setRow(row, out_row.get(), width_);
- }
-}
-#endif
-
-image_32::~image_32() {}
-
-void image_32::set_grayscale_to_alpha()
-{
- for (unsigned int y = 0; y < height_; ++y)
- {
- unsigned int* row_from = data_.getRow(y);
- for (unsigned int x = 0; x < width_; ++x)
- {
- unsigned rgba = row_from[x];
- unsigned r = rgba & 0xff;
- unsigned g = (rgba >> 8 ) & 0xff;
- unsigned b = (rgba >> 16) & 0xff;
-
- // magic numbers for grayscale
- unsigned a = static_cast<unsigned>(std::ceil((r * .3) + (g * .59) + (b * .11)));
-
- row_from[x] = (a << 24)| (255 << 16) | (255 << 8) | (255) ;
- }
- }
-}
-
-void image_32::set_color_to_alpha(const color& c)
-{
- for (unsigned y = 0; y < height_; ++y)
- {
- unsigned int* row_from = data_.getRow(y);
- for (unsigned x = 0; x < width_; ++x)
- {
- unsigned rgba = row_from[x];
- unsigned r = rgba & 0xff;
- unsigned g = (rgba >> 8 ) & 0xff;
- unsigned b = (rgba >> 16) & 0xff;
- if (r == c.red() && g == c.green() && b == c.blue())
- {
- row_from[x] = 0;
- }
- }
- }
-}
-
-void image_32::set_alpha(float opacity)
-{
- for (unsigned int y = 0; y < height_; ++y)
- {
- unsigned int* row_to = data_.getRow(y);
- for (unsigned int x = 0; x < width_; ++x)
- {
- unsigned rgba = row_to[x];
- unsigned a0 = (rgba >> 24) & 0xff;
- unsigned a1 = int( ((rgba >> 24) & 0xff) * opacity );
- //unsigned a1 = opacity;
- if (a0 == a1) continue;
-
- unsigned r = rgba & 0xff;
- unsigned g = (rgba >> 8 ) & 0xff;
- unsigned b = (rgba >> 16) & 0xff;
-
- row_to[x] = (a1 << 24)| (b << 16) | (g << 8) | (r) ;
- }
- }
-}
-
-void image_32::set_background(const color& c)
-{
- background_=c;
- data_.set(background_->rgba());
-}
-
-boost::optional<color> const& image_32::get_background() const
-{
- return background_;
-}
-
-void image_32::premultiply()
-{
- agg::rendering_buffer buffer(data_.getBytes(),width_,height_,width_ * 4);
- agg::pixfmt_rgba32 pixf(buffer);
- pixf.premultiply();
- premultiplied_ = true;
-}
-
-void image_32::demultiply()
-{
- agg::rendering_buffer buffer(data_.getBytes(),width_,height_,width_ * 4);
- agg::pixfmt_rgba32_pre pixf(buffer);
- pixf.demultiply();
- premultiplied_ = false;
-}
-
-void image_32::composite_pixel(unsigned op, int x,int y, unsigned c, unsigned cover, double opacity)
-{
- using color_type = agg::rgba8;
- using value_type = color_type::value_type;
- using order_type = agg::order_rgba;
- using blender_type = agg::comp_op_adaptor_rgba<color_type,order_type>;
-
- if (checkBounds(x,y))
- {
- unsigned rgba = data_(x,y);
- unsigned ca = (unsigned)(((c >> 24) & 0xff) * opacity);
- unsigned cb = (c >> 16 ) & 0xff;
- unsigned cg = (c >> 8) & 0xff;
- unsigned cr = (c & 0xff);
- blender_type::blend_pix(op, (value_type*)&rgba, cr, cg, cb, ca, cover);
- data_(x,y) = rgba;
- }
-}
-
-}
diff --git a/src/grid/grid.cpp b/src/grid/grid.cpp
index 208fe66..0ca7965 100644
--- a/src/grid/grid.cpp
+++ b/src/grid/grid.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -34,15 +34,14 @@ namespace mapnik
{
template <typename T>
-const typename hit_grid<T>::value_type hit_grid<T>::base_mask = std::numeric_limits<T>::min();
+const typename hit_grid<T>::value_type hit_grid<T>::base_mask = std::numeric_limits<typename T::type>::min();
template <typename T>
-hit_grid<T>::hit_grid(int width, int height, std::string const& key, unsigned int resolution)
+hit_grid<T>::hit_grid(int width, int height, std::string const& key)
: width_(width),
height_(height),
key_(key),
data_(width,height),
- resolution_(resolution),
id_name_("__id__"),
painted_(false),
names_(),
@@ -60,7 +59,6 @@ hit_grid<T>::hit_grid(hit_grid<T> const& rhs)
height_(rhs.height_),
key_(rhs.key_),
data_(rhs.data_),
- resolution_(rhs.resolution_),
id_name_("__id__"),
painted_(rhs.painted_),
names_(rhs.names_),
@@ -146,7 +144,7 @@ void hit_grid<T>::add_feature(mapnik::feature_impl const& feature)
}
-template class hit_grid<mapnik::value_integer>;
+template class MAPNIK_DECL hit_grid<mapnik::value_integer_pixel>;
}
diff --git a/src/grid/grid_renderer.cpp b/src/grid/grid_renderer.cpp
index a9a4fc6..e484442 100644
--- a/src/grid/grid_renderer.cpp
+++ b/src/grid/grid_renderer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -125,10 +125,27 @@ void grid_renderer<T>::end_layer_processing(layer const&)
MAPNIK_LOG_DEBUG(grid_renderer) << "grid_renderer: End layer processing";
}
-template <typename T>
-void grid_renderer<T>::render_marker(mapnik::feature_impl const& feature, pixel_position const& pos, marker const& marker, agg::trans_affine const& tr, double opacity, composite_mode_e /*comp_op*/)
+template <typename buffer_type>
+struct grid_render_marker_visitor
{
- if (marker.is_vector())
+ grid_render_marker_visitor(buffer_type & pixmap,
+ std::unique_ptr<grid_rasterizer> const& ras_ptr,
+ renderer_common const& common,
+ mapnik::feature_impl const& feature,
+ pixel_position const& pos,
+ agg::trans_affine const& tr,
+ double opacity)
+ : pixmap_(pixmap),
+ ras_ptr_(ras_ptr),
+ common_(common),
+ feature_(feature),
+ pos_(pos),
+ tr_(tr),
+ opacity_(opacity) {}
+
+ void operator() (marker_null const&) {}
+
+ void operator() (marker_svg const& marker)
{
using pixfmt_type = typename grid_renderer_base_type::pixfmt_type;
using renderer_type = agg::renderer_scanline_bin_solid<grid_renderer_base_type>;
@@ -140,61 +157,88 @@ void grid_renderer<T>::render_marker(mapnik::feature_impl const& feature, pixel_
grid_renderer_base_type renb(pixf);
renderer_type ren(renb);
- ras_ptr->reset();
+ ras_ptr_->reset();
- box2d<double> const& bbox = (*marker.get_vector_data())->bounding_box();
+ box2d<double> const& bbox = marker.get_data()->bounding_box();
coord<double,2> c = bbox.center();
// center the svg marker on '0,0'
agg::trans_affine mtx = agg::trans_affine_translation(-c.x,-c.y);
// apply symbol transformation to get to map space
- mtx *= tr;
+ mtx *= tr_;
mtx *= agg::trans_affine_scaling(common_.scale_factor_);
// render the marker at the center of the marker box
- mtx.translate(pos.x, pos.y);
+ mtx.translate(pos_.x, pos_.y);
using namespace mapnik::svg;
- vertex_stl_adapter<svg_path_storage> stl_storage((*marker.get_vector_data())->source());
+ vertex_stl_adapter<svg_path_storage> stl_storage(marker.get_data()->source());
svg_path_adapter svg_path(stl_storage);
svg_renderer_agg<svg_path_adapter,
agg::pod_bvector<path_attributes>,
renderer_type,
pixfmt_type> svg_renderer(svg_path,
- (*marker.get_vector_data())->attributes());
-
- svg_renderer.render_id(*ras_ptr, sl, renb, feature.id(), mtx, opacity, bbox);
+ marker.get_data()->attributes());
+ svg_renderer.render_id(*ras_ptr_, sl, renb, feature_.id(), mtx, opacity_, bbox);
}
- else
+
+ void operator() (marker_rgba8 const& marker)
{
- image_data_32 const& data = **marker.get_bitmap_data();
+ image_rgba8 const& data = marker.get_data();
double width = data.width();
double height = data.height();
double cx = 0.5 * width;
double cy = 0.5 * height;
- if ((std::fabs(1.0 - common_.scale_factor_) < 0.001 && tr.is_identity()))
+ if ((std::fabs(1.0 - common_.scale_factor_) < 0.001 && tr_.is_identity()))
{
// TODO - support opacity
- pixmap_.set_rectangle(feature.id(), data,
- boost::math::iround(pos.x - cx),
- boost::math::iround(pos.y - cy));
+ pixmap_.set_rectangle(feature_.id(), data,
+ boost::math::iround(pos_.x - cx),
+ boost::math::iround(pos_.y - cy));
}
else
{
- image_data_32 target(data.width(), data.height());
- mapnik::scale_image_agg<image_data_32>(target,
- data,
- SCALING_NEAR,
- 1,
- 1,
- 0.0, 0.0, 1.0); // TODO: is 1.0 a valid default here, and do we even care in grid_renderer what the image looks like?
- pixmap_.set_rectangle(feature.id(), target,
- boost::math::iround(pos.x - cx),
- boost::math::iround(pos.y - cy));
+ image_rgba8 target(data.width(), data.height());
+ mapnik::scale_image_agg(target,
+ data,
+ SCALING_NEAR,
+ 1,
+ 1,
+ 0.0, 0.0, 1.0); // TODO: is 1.0 a valid default here, and do we even care in grid_renderer what the image looks like?
+ pixmap_.set_rectangle(feature_.id(), target,
+ boost::math::iround(pos_.x - cx),
+ boost::math::iround(pos_.y - cy));
}
}
+
+ private:
+ buffer_type & pixmap_;
+ std::unique_ptr<grid_rasterizer> const& ras_ptr_;
+ renderer_common const& common_;
+ mapnik::feature_impl const& feature_;
+ pixel_position const& pos_;
+ agg::trans_affine const& tr_;
+ double opacity_;
+};
+
+template <typename T>
+void grid_renderer<T>::render_marker(mapnik::feature_impl const& feature,
+ pixel_position const& pos,
+ marker const& marker,
+ agg::trans_affine const& tr,
+ double opacity,
+ composite_mode_e /*comp_op*/)
+{
+ grid_render_marker_visitor<buffer_type> visitor(pixmap_,
+ ras_ptr,
+ common_,
+ feature,
+ pos,
+ tr,
+ opacity);
+ util::apply_visitor(visitor, marker);
pixmap_.add_feature(feature);
}
-template class grid_renderer<grid>;
+template class MAPNIK_DECL grid_renderer<grid>;
}
diff --git a/src/grid/process_building_symbolizer.cpp b/src/grid/process_building_symbolizer.cpp
index 319e1a2..48c2320 100644
--- a/src/grid/process_building_symbolizer.cpp
+++ b/src/grid/process_building_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -56,7 +56,7 @@ void grid_renderer<T>::process(building_symbolizer const& sym,
using pixfmt_type = typename grid_renderer_base_type::pixfmt_type;
using color_type = typename grid_renderer_base_type::pixfmt_type::color_type;
using renderer_type = agg::renderer_scanline_bin_solid<grid_renderer_base_type>;
- using path_type = transform_path_adapter<view_transform,geometry_type>;
+ using transform_path_type = transform_path_adapter<view_transform, vertex_adapter>;
agg::scanline_bin sl;
grid_rendering_buffer buf(pixmap_.raw_data(), common_.width_, common_.height_, common_.width_);
@@ -71,23 +71,29 @@ void grid_renderer<T>::process(building_symbolizer const& sym,
render_building_symbolizer(
feature, height,
- [&](geometry_type &faces) {
- path_type faces_path (common_.t_,faces,prj_trans);
+ [&](path_type const& faces)
+ {
+ vertex_adapter va(faces);
+ transform_path_type faces_path (common_.t_,va,prj_trans);
ras_ptr->add_path(faces_path);
ren.color(color_type(feature.id()));
agg::render_scanlines(*ras_ptr, sl, ren);
ras_ptr->reset();
},
- [&](geometry_type &frame) {
- path_type path(common_.t_,frame,prj_trans);
- agg::conv_stroke<path_type> stroke(path);
+ [&](path_type const& frame)
+ {
+ vertex_adapter va(frame);
+ transform_path_type path(common_.t_,va,prj_trans);
+ agg::conv_stroke<transform_path_type> stroke(path);
ras_ptr->add_path(stroke);
ren.color(color_type(feature.id()));
agg::render_scanlines(*ras_ptr, sl, ren);
ras_ptr->reset();
},
- [&](geometry_type &roof) {
- path_type roof_path (common_.t_,roof,prj_trans);
+ [&](path_type const& roof)
+ {
+ vertex_adapter va(roof);
+ transform_path_type roof_path (common_.t_,va,prj_trans);
ras_ptr->add_path(roof_path);
ren.color(color_type(feature.id()));
agg::render_scanlines(*ras_ptr, sl, ren);
diff --git a/src/grid/process_group_symbolizer.cpp b/src/grid/process_group_symbolizer.cpp
index aedd0b4..e74140d 100644
--- a/src/grid/process_group_symbolizer.cpp
+++ b/src/grid/process_group_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -20,16 +20,23 @@
*
*****************************************************************************/
+#if defined(GRID_RENDERER)
+
// mapnik
#include <mapnik/feature.hpp>
#include <mapnik/grid/grid_rasterizer.hpp>
#include <mapnik/grid/grid_renderer.hpp>
#include <mapnik/grid/grid_renderer_base.hpp>
#include <mapnik/grid/grid.hpp>
+#include <mapnik/grid/grid_render_marker.hpp>
#include <mapnik/attribute_collector.hpp>
#include <mapnik/text/placement_finder.hpp>
#include <mapnik/text/symbolizer_helpers.hpp>
#include <mapnik/text/renderer.hpp>
+#include <mapnik/svg/svg_renderer_agg.hpp>
+#include <mapnik/svg/svg_storage.hpp>
+#include <mapnik/svg/svg_path_adapter.hpp>
+#include <mapnik/svg/svg_path_attributes.hpp>
#include <mapnik/group/group_layout_manager.hpp>
#include <mapnik/group/group_symbolizer_helper.hpp>
#include <mapnik/util/variant.hpp>
@@ -53,27 +60,67 @@ namespace mapnik {
* in the detector from the placement_finder.
*/
template <typename T0>
-struct thunk_renderer : public util::static_visitor<>
+struct thunk_renderer
{
using renderer_type = grid_renderer<T0>;
using buffer_type = typename renderer_type::buffer_type;
using text_renderer_type = grid_text_renderer<buffer_type>;
thunk_renderer(renderer_type &ren,
+ grid_rasterizer &ras,
buffer_type &pixmap,
renderer_common &common,
feature_impl &feature,
pixel_position const &offset)
- : ren_(ren), pixmap_(pixmap), common_(common),
- feature_(feature), offset_(offset)
+ : ren_(ren), ras_(ras), pixmap_(pixmap),
+ common_(common), feature_(feature), offset_(offset)
{}
- void operator()(point_render_thunk const &thunk) const
+ void operator()(vector_marker_render_thunk const &thunk) const
{
- ren_.render_marker(feature_, offset_ + thunk.pos_,
- *thunk.marker_, thunk.tr_, thunk.opacity_, thunk.comp_op_);
+ using buf_type = grid_rendering_buffer;
+ using pixfmt_type = typename grid_renderer_base_type::pixfmt_type;
+ using renderer_type = agg::renderer_scanline_bin_solid<grid_renderer_base_type>;
+
+ using namespace mapnik::svg;
+ using svg_attribute_type = agg::pod_bvector<path_attributes>;
+ using svg_renderer_type = svg_renderer_agg<svg_path_adapter,
+ svg_attribute_type,
+ renderer_type,
+ pixfmt_type>;
+
+ buf_type render_buf(pixmap_.raw_data(), common_.width_, common_.height_, common_.width_);
+ ras_.reset();
+ pixfmt_type pixf(render_buf);
+ grid_renderer_base_type renb(pixf);
+ renderer_type ren(renb);
+ vertex_stl_adapter<svg_path_storage> stl_storage(thunk.src_->source());
+ svg_path_adapter svg_path(stl_storage);
+ svg_renderer_type svg_renderer(svg_path, thunk.attrs_);
+ agg::trans_affine offset_tr = thunk.tr_;
+ offset_tr.translate(offset_.x, offset_.y);
+ //render_vector_marker(svg_renderer, *ras_ptr_, renb, thunk.src_->bounding_box(), offset_tr, thunk.opacity_, thunk.snap_to_pixels_);
+ agg::scanline_bin sl;
+ svg_renderer.render_id(ras_, sl, renb, feature_.id(), offset_tr, thunk.opacity_, thunk.src_->bounding_box());
+ pixmap_.add_feature(feature_);
}
+ void operator()(raster_marker_render_thunk const &thunk) const
+ {
+ using buf_type = grid_rendering_buffer;
+ using pixfmt_type = typename grid_renderer_base_type::pixfmt_type;
+ using renderer_type = agg::renderer_scanline_bin_solid<grid_renderer_base_type>;
+ buf_type render_buf(pixmap_.raw_data(), common_.width_, common_.height_, common_.width_);
+ ras_.reset();
+ pixfmt_type pixf(render_buf);
+ grid_renderer_base_type renb(pixf);
+ renderer_type ren(renb);
+ agg::trans_affine offset_tr = thunk.tr_;
+ offset_tr.translate(offset_.x, offset_.y);
+ render_raster_marker(ren, ras_, thunk.src_, feature_, offset_tr, thunk.opacity_);
+ pixmap_.add_feature(feature_);
+ }
+
void operator()(text_render_thunk const &thunk) const
{
text_renderer_type ren(pixmap_, thunk.comp_op_, common_.scale_factor_);
@@ -84,16 +131,18 @@ struct thunk_renderer : public util::static_visitor<>
offset_,
[&] (glyph_positions_ptr glyphs)
{
- if (glyphs->marker())
+ marker_info_ptr mark = glyphs->get_marker();
+ if (mark)
{
ren_.render_marker(feature_,
glyphs->marker_pos(),
- *(glyphs->marker()->marker),
- glyphs->marker()->transform,
+ *mark->marker_,
+ mark->transform_,
thunk.opacity_, thunk.comp_op_);
}
ren.render(*glyphs, feature_id);
});
+ pixmap_.add_feature(feature_);
}
template <typename T1>
@@ -104,6 +153,7 @@ struct thunk_renderer : public util::static_visitor<>
private:
renderer_type &ren_;
+ grid_rasterizer & ras_;
buffer_type &pixmap_;
renderer_common &common_;
feature_impl &feature_;
@@ -119,7 +169,7 @@ void grid_renderer<T>::process(group_symbolizer const& sym,
sym, feature, common_.vars_, prj_trans, common_.query_extent_, common_,
[&](render_thunk_list const& thunks, pixel_position const& render_offset)
{
- thunk_renderer<T> ren(*this, pixmap_, common_, feature, render_offset);
+ thunk_renderer<T> ren(*this, *ras_ptr, pixmap_, common_, feature, render_offset);
for (render_thunk_ptr const& thunk : thunks)
{
util::apply_visitor(ren, *thunk);
@@ -132,3 +182,5 @@ template void grid_renderer<grid>::process(group_symbolizer const&,
proj_transform const&);
}
+
+#endif
diff --git a/src/grid/process_line_pattern_symbolizer.cpp b/src/grid/process_line_pattern_symbolizer.cpp
index 9505987..620d7dd 100644
--- a/src/grid/process_line_pattern_symbolizer.cpp
+++ b/src/grid/process_line_pattern_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -32,8 +32,9 @@
#include <mapnik/marker.hpp>
#include <mapnik/marker_cache.hpp>
#include <mapnik/vertex_converters.hpp>
+#include <mapnik/vertex_processor.hpp>
#include <mapnik/parse_path.hpp>
-
+#include <mapnik/renderer_common/apply_vertex_converter.hpp>
// agg
#include "agg_rasterizer_scanline_aa.h"
#include "agg_renderer_scanline.h"
@@ -53,18 +54,15 @@ void grid_renderer<T>::process(line_pattern_symbolizer const& sym,
{
std::string filename = get<std::string, keys::file>(sym, feature, common_.vars_);
if (filename.empty()) return;
- boost::optional<mapnik::marker_ptr> mark = marker_cache::instance().find(filename, true);
- if (!mark) return;
+ std::shared_ptr<mapnik::marker const> mark = marker_cache::instance().find(filename, true);
+ if (mark->is<mapnik::marker_null>()) return;
- if (!(*mark)->is_bitmap())
+ if (!mark->is<mapnik::marker_rgba8>())
{
MAPNIK_LOG_DEBUG(agg_renderer) << "agg_renderer: Only images (not '" << filename << "') are supported in the line_pattern_symbolizer";
return;
}
- boost::optional<image_ptr> pat = (*mark)->get_bitmap_data();
- if (!pat) return;
-
value_bool clip = get<value_bool, keys::clip>(sym, feature, common_.vars_);
value_double offset = get<value_double, keys::offset>(sym, feature, common_.vars_);
value_double simplify_tolerance = get<value_double, keys::simplify_tolerance>(sym, feature, common_.vars_);
@@ -84,7 +82,7 @@ void grid_renderer<T>::process(line_pattern_symbolizer const& sym,
ras_ptr->reset();
- int stroke_width = (*pat)->width();
+ int stroke_width = mark->width();
agg::trans_affine tr;
auto transform = get_optional<transform_type>(sym, keys::geometry_transform);
@@ -117,11 +115,10 @@ void grid_renderer<T>::process(line_pattern_symbolizer const& sym,
put<value_double>(line, keys::simplify_tolerance, value_double(simplify_tolerance));
put<value_double>(line, keys::smooth, value_double(smooth));
- vertex_converter<grid_rasterizer,
- clip_line_tag, transform_tag,
- offset_transform_tag, affine_transform_tag,
- simplify_tag, smooth_tag, stroke_tag>
- converter(clipping_extent,*ras_ptr,line,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
+ using vertex_converter_type = vertex_converter<clip_line_tag, transform_tag,
+ offset_transform_tag, affine_transform_tag,
+ simplify_tag, smooth_tag, stroke_tag>;
+ vertex_converter_type converter(clipping_extent,line,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
if (clip) converter.set<clip_line_tag>(); // optional clip (default: true)
converter.set<transform_tag>(); // always transform
if (std::fabs(offset) > 0.0) converter.set<offset_transform_tag>(); // parallel offset
@@ -129,14 +126,10 @@ void grid_renderer<T>::process(line_pattern_symbolizer const& sym,
if (simplify_tolerance > 0.0) converter.set<simplify_tag>(); // optional simplify converter
if (smooth > 0.0) converter.set<smooth_tag>(); // optional smooth converter
converter.set<stroke_tag>(); //always stroke
-
- for (geometry_type & geom : feature.paths())
- {
- if (geom.size() > 1)
- {
- converter.apply(geom);
- }
- }
+ using apply_vertex_converter_type = detail::apply_vertex_converter<vertex_converter_type,grid_rasterizer>;
+ using vertex_processor_type = geometry::vertex_processor<apply_vertex_converter_type>;
+ apply_vertex_converter_type apply(converter, *ras_ptr);
+ mapnik::util::apply_visitor(vertex_processor_type(apply),feature.get_geometry());
// render id
ren.color(color_type(feature.id()));
diff --git a/src/grid/process_line_symbolizer.cpp b/src/grid/process_line_symbolizer.cpp
index a54738e..f40439c 100644
--- a/src/grid/process_line_symbolizer.cpp
+++ b/src/grid/process_line_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -29,7 +29,8 @@
#include <mapnik/grid/grid_renderer_base.hpp>
#include <mapnik/grid/grid.hpp>
#include <mapnik/vertex_converters.hpp>
-
+#include <mapnik/vertex_processor.hpp>
+#include <mapnik/renderer_common/apply_vertex_converter.hpp>
// agg
#include "agg_rasterizer_scanline_aa.h"
#include "agg_renderer_scanline.h"
@@ -88,11 +89,11 @@ void grid_renderer<T>::process(line_symbolizer const& sym,
padding *= common_.scale_factor_;
clipping_extent.pad(padding);
}
+ using vertex_converter_type = vertex_converter<clip_line_tag, transform_tag,
+ offset_transform_tag, affine_transform_tag,
+ simplify_tag, smooth_tag, dash_tag, stroke_tag>;
- vertex_converter<grid_rasterizer, clip_line_tag, transform_tag,
- offset_transform_tag, affine_transform_tag,
- simplify_tag, smooth_tag, dash_tag, stroke_tag>
- converter(clipping_extent,*ras_ptr,sym,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
+ vertex_converter_type converter(clipping_extent,sym,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
if (clip) converter.set<clip_line_tag>(); // optional clip (default: true)
converter.set<transform_tag>(); // always transform
if (std::fabs(offset) > 0.0) converter.set<offset_transform_tag>(); // parallel offset
@@ -102,13 +103,10 @@ void grid_renderer<T>::process(line_symbolizer const& sym,
if (has_dash) converter.set<dash_tag>();
converter.set<stroke_tag>(); //always stroke
- for ( geometry_type & geom : feature.paths())
- {
- if (geom.size() > 1)
- {
- converter.apply(geom);
- }
- }
+ using apply_vertex_converter_type = detail::apply_vertex_converter<vertex_converter_type, grid_rasterizer>;
+ using vertex_processor_type = geometry::vertex_processor<apply_vertex_converter_type>;
+ apply_vertex_converter_type apply(converter, *ras_ptr);
+ mapnik::util::apply_visitor(vertex_processor_type(apply),feature.get_geometry());
// render id
ren.color(color_type(feature.id()));
diff --git a/src/grid/process_markers_symbolizer.cpp b/src/grid/process_markers_symbolizer.cpp
index bf0828c..cda2c7d 100644
--- a/src/grid/process_markers_symbolizer.cpp
+++ b/src/grid/process_markers_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -45,11 +45,13 @@ porting notes -->
// mapnik
#include <mapnik/feature.hpp>
+#include <mapnik/geom_util.hpp>
+#include <mapnik/marker_helpers.hpp>
#include <mapnik/grid/grid_rasterizer.hpp>
#include <mapnik/grid/grid_renderer.hpp>
#include <mapnik/grid/grid_renderer_base.hpp>
+#include <mapnik/grid/grid_render_marker.hpp>
#include <mapnik/grid/grid.hpp>
-#include <mapnik/grid/grid_marker_helpers.hpp>
#include <mapnik/debug.hpp>
#include <mapnik/geom_util.hpp>
@@ -77,6 +79,112 @@ porting notes -->
namespace mapnik {
+namespace detail {
+
+template <typename SvgRenderer, typename Detector, typename RendererContext>
+struct vector_markers_rasterizer_dispatch : public vector_markers_dispatch<Detector>
+{
+ using renderer_base = typename SvgRenderer::renderer_base;
+ using vertex_source_type = typename SvgRenderer::vertex_source_type;
+ using attribute_source_type = typename SvgRenderer::attribute_source_type;
+ using pixfmt_type = typename renderer_base::pixfmt_type;
+
+ using BufferType = typename std::tuple_element<0,RendererContext>::type;
+ using RasterizerType = typename std::tuple_element<1,RendererContext>::type;
+ using PixMapType = typename std::tuple_element<2,RendererContext>::type;
+
+ vector_markers_rasterizer_dispatch(svg_path_ptr const& src,
+ vertex_source_type & path,
+ svg_attribute_type const& attrs,
+ agg::trans_affine const& marker_trans,
+ markers_symbolizer const& sym,
+ Detector & detector,
+ double scale_factor,
+ mapnik::feature_impl & feature,
+ attributes const& vars,
+ bool snap_to_pixels,
+ RendererContext const& renderer_context)
+ : vector_markers_dispatch<Detector>(src, marker_trans, sym, detector, scale_factor, feature, vars),
+ buf_(std::get<0>(renderer_context)),
+ pixf_(buf_),
+ renb_(pixf_),
+ svg_renderer_(path, attrs),
+ ras_(std::get<1>(renderer_context)),
+ pixmap_(std::get<2>(renderer_context)),
+ placed_(false)
+ {}
+
+ void render_marker(agg::trans_affine const& marker_tr, double opacity)
+ {
+ agg::scanline_bin sl_;
+ svg_renderer_.render_id(ras_, sl_, renb_, this->feature_.id(), marker_tr, opacity, this->src_->bounding_box());
+ if (!placed_)
+ {
+ pixmap_.add_feature(this->feature_);
+ placed_ = true;
+ }
+ }
+
+private:
+ BufferType & buf_;
+ pixfmt_type pixf_;
+ renderer_base renb_;
+ SvgRenderer svg_renderer_;
+ RasterizerType & ras_;
+ PixMapType & pixmap_;
+ bool placed_;
+};
+
+template <typename RendererBase, typename RendererType, typename Detector, typename RendererContext>
+struct raster_markers_rasterizer_dispatch : public raster_markers_dispatch<Detector>
+{
+ using pixfmt_type = typename RendererBase::pixfmt_type;
+ using color_type = typename RendererBase::pixfmt_type::color_type;
+
+ using BufferType = typename std::tuple_element<0,RendererContext>::type;
+ using RasterizerType = typename std::tuple_element<1,RendererContext>::type;
+ using PixMapType = typename std::tuple_element<2,RendererContext>::type;
+
+ raster_markers_rasterizer_dispatch(image_rgba8 const& src,
+ agg::trans_affine const& marker_trans,
+ markers_symbolizer const& sym,
+ Detector & detector,
+ double scale_factor,
+ mapnik::feature_impl & feature,
+ attributes const& vars,
+ RendererContext const& renderer_context)
+ : raster_markers_dispatch<Detector>(src, marker_trans, sym, detector, scale_factor, feature, vars),
+ buf_(std::get<0>(renderer_context)),
+ pixf_(buf_),
+ renb_(pixf_),
+ ras_(std::get<1>(renderer_context)),
+ pixmap_(std::get<2>(renderer_context)),
+ placed_(false)
+ {}
+
+ void render_marker(agg::trans_affine const& marker_tr, double opacity)
+ {
+ // In the long term this should be a visitor pattern based on the type of render this->src_ provided that converts
+ // the destination pixel type required.
+ render_raster_marker(RendererType(renb_), ras_, this->src_, this->feature_, marker_tr, opacity);
+ if (!placed_)
+ {
+ pixmap_.add_feature(this->feature_);
+ placed_ = true;
+ }
+ }
+
+private:
+ BufferType & buf_;
+ pixfmt_type pixf_;
+ RendererBase renb_;
+ RasterizerType & ras_;
+ PixMapType & pixmap_;
+ bool placed_;
+};
+
+}
+
template <typename T>
void grid_renderer<T>::process(markers_symbolizer const& sym,
mapnik::feature_impl & feature,
@@ -100,13 +208,13 @@ void grid_renderer<T>::process(markers_symbolizer const& sym,
auto renderer_context = std::tie(render_buf,*ras_ptr,pixmap_);
using context_type = decltype(renderer_context);
- using vector_dispatch_type = vector_markers_rasterizer_dispatch_grid<svg_renderer_type,
- detector_type,
- context_type>;
- using raster_dispatch_type = raster_markers_rasterizer_dispatch_grid<grid_renderer_base_type,
- renderer_type,
- detector_type,
- context_type>;
+ using vector_dispatch_type = detail::vector_markers_rasterizer_dispatch<svg_renderer_type,
+ detector_type,
+ context_type>;
+ using raster_dispatch_type = detail::raster_markers_rasterizer_dispatch<grid_renderer_base_type,
+ renderer_type,
+ detector_type,
+ context_type>;
render_markers_symbolizer<vector_dispatch_type, raster_dispatch_type>(
sym, feature, prj_trans, common_, clip_box,renderer_context);
}
diff --git a/src/grid/process_point_symbolizer.cpp b/src/grid/process_point_symbolizer.cpp
index aa749a5..ded8503 100644
--- a/src/grid/process_point_symbolizer.cpp
+++ b/src/grid/process_point_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/grid/process_polygon_pattern_symbolizer.cpp b/src/grid/process_polygon_pattern_symbolizer.cpp
index affe399..cdd5aff 100644
--- a/src/grid/process_polygon_pattern_symbolizer.cpp
+++ b/src/grid/process_polygon_pattern_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -30,9 +30,11 @@
#include <mapnik/grid/grid_renderer_base.hpp>
#include <mapnik/grid/grid.hpp>
#include <mapnik/vertex_converters.hpp>
+#include <mapnik/vertex_processor.hpp>
#include <mapnik/marker.hpp>
#include <mapnik/marker_cache.hpp>
#include <mapnik/parse_path.hpp>
+#include <mapnik/renderer_common/apply_vertex_converter.hpp>
// agg
#include "agg_rasterizer_scanline_aa.h"
@@ -52,18 +54,15 @@ void grid_renderer<T>::process(polygon_pattern_symbolizer const& sym,
{
std::string filename = get<std::string, keys::file>(sym, feature, common_.vars_);
if (filename.empty()) return;
- boost::optional<mapnik::marker_ptr> mark = marker_cache::instance().find(filename, true);
- if (!mark) return;
+ std::shared_ptr<mapnik::marker const> mark = marker_cache::instance().find(filename, true);
+ if (mark->is<mapnik::marker_null>()) return;
- if (!(*mark)->is_bitmap())
+ if (!mark->is<mapnik::marker_rgba8>())
{
MAPNIK_LOG_DEBUG(agg_renderer) << "agg_renderer: Only images (not '" << filename << "') are supported in the line_pattern_symbolizer";
return;
}
- boost::optional<image_ptr> pat = (*mark)->get_bitmap_data();
- if (!pat) return;
-
ras_ptr->reset();
value_bool clip = get<value_bool, keys::clip>(sym, feature, common_.vars_);
@@ -77,8 +76,8 @@ void grid_renderer<T>::process(polygon_pattern_symbolizer const& sym,
evaluate_transform(tr, feature, common_.vars_, *transform, common_.scale_factor_);
}
- vertex_converter<grid_rasterizer, clip_poly_tag,transform_tag,affine_transform_tag,smooth_tag>
- converter(common_.query_extent_,*ras_ptr,sym,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
+ using vertex_converter_type = vertex_converter<clip_poly_tag,transform_tag,affine_transform_tag,smooth_tag>;
+ vertex_converter_type converter(common_.query_extent_,sym,common_.t_,prj_trans,tr,feature,common_.vars_,common_.scale_factor_);
if (prj_trans.equal() && clip) converter.set<clip_poly_tag>(); //optional clip (default: true)
converter.set<transform_tag>(); //always transform
@@ -86,13 +85,11 @@ void grid_renderer<T>::process(polygon_pattern_symbolizer const& sym,
if (simplify_tolerance > 0.0) converter.set<simplify_tag>(); // optional simplify converter
if (smooth > 0.0) converter.set<smooth_tag>(); // optional smooth converter
- for ( geometry_type & geom : feature.paths())
- {
- if (geom.size() > 2)
- {
- converter.apply(geom);
- }
- }
+ using apply_vertex_converter_type = detail::apply_vertex_converter<vertex_converter_type, grid_rasterizer>;
+ using vertex_processor_type = geometry::vertex_processor<apply_vertex_converter_type>;
+ apply_vertex_converter_type apply(converter, *ras_ptr);
+ mapnik::util::apply_visitor(vertex_processor_type(apply),feature.get_geometry());
+
using pixfmt_type = typename grid_renderer_base_type::pixfmt_type;
using color_type = typename grid_renderer_base_type::pixfmt_type::color_type;
using renderer_type = agg::renderer_scanline_bin_solid<grid_renderer_base_type>;
diff --git a/src/grid/process_polygon_symbolizer.cpp b/src/grid/process_polygon_symbolizer.cpp
index f06893e..30f072f 100644
--- a/src/grid/process_polygon_symbolizer.cpp
+++ b/src/grid/process_polygon_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -53,7 +53,7 @@ void grid_renderer<T>::process(polygon_symbolizer const& sym,
using renderer_type = agg::renderer_scanline_bin_solid<grid_renderer_base_type>;
using pixfmt_type = typename grid_renderer_base_type::pixfmt_type;
using color_type = typename grid_renderer_base_type::pixfmt_type::color_type;
- using vertex_converter_type = vertex_converter<grid_rasterizer,clip_poly_tag,transform_tag,affine_transform_tag,simplify_tag,smooth_tag>;
+ using vertex_converter_type = vertex_converter<clip_poly_tag,transform_tag,affine_transform_tag,simplify_tag,smooth_tag>;
ras_ptr->reset();
diff --git a/src/grid/process_raster_symbolizer.cpp b/src/grid/process_raster_symbolizer.cpp
index b229472..aff12a4 100644
--- a/src/grid/process_raster_symbolizer.cpp
+++ b/src/grid/process_raster_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/grid/process_shield_symbolizer.cpp b/src/grid/process_shield_symbolizer.cpp
index ca10dc6..68935c6 100644
--- a/src/grid/process_shield_symbolizer.cpp
+++ b/src/grid/process_shield_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -66,12 +66,13 @@ void grid_renderer<T>::process(shield_symbolizer const& sym,
for (glyph_positions_ptr glyphs : placements)
{
- if (glyphs->marker())
+ marker_info_ptr mark = glyphs->get_marker();
+ if (mark)
{
render_marker(feature,
glyphs->marker_pos(),
- *(glyphs->marker()->marker),
- glyphs->marker()->transform,
+ *mark->marker_,
+ mark->transform_,
opacity, comp_op);
}
ren.render(*glyphs, feature_id);
diff --git a/src/grid/process_text_symbolizer.cpp b/src/grid/process_text_symbolizer.cpp
index 1c768c3..921ce1d 100644
--- a/src/grid/process_text_symbolizer.cpp
+++ b/src/grid/process_text_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/group/group_layout_manager.cpp b/src/group/group_layout_manager.cpp
index 7799d5f..7c6f7b8 100644
--- a/src/group/group_layout_manager.cpp
+++ b/src/group/group_layout_manager.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -31,7 +31,7 @@ namespace mapnik
{
// This visitor will process offsets for the given layout
-struct process_layout : public util::static_visitor<>
+struct process_layout
{
// The vector containing the existing, centered item bounding boxes
vector<bound_box> const& member_boxes_;
diff --git a/src/group/group_rule.cpp b/src/group/group_rule.cpp
index e3c5a6f..4ea7d9c 100644
--- a/src/group/group_rule.cpp
+++ b/src/group/group_rule.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -56,4 +56,3 @@ void group_rule::append(const mapnik::symbolizer &sym)
}
}
-
diff --git a/src/group/group_symbolizer_helper.cpp b/src/group/group_symbolizer_helper.cpp
index faa5e4a..338e541 100644
--- a/src/group/group_symbolizer_helper.cpp
+++ b/src/group/group_symbolizer_helper.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,19 +23,44 @@
// mapnik
#include <mapnik/group/group_symbolizer_helper.hpp>
#include <mapnik/label_collision_detector.hpp>
-#include <mapnik/geom_util.hpp>
+//#include <mapnik/geom_util.hpp>
+#include <mapnik/geometry.hpp>
+#include <mapnik/vertex_processor.hpp>
#include <mapnik/debug.hpp>
#include <mapnik/symbolizer.hpp>
#include <mapnik/value_types.hpp>
#include <mapnik/text/placements/base.hpp>
#include <mapnik/text/placements/dummy.hpp>
-#include <mapnik/text/vertex_cache.hpp>
-#include <mapnik/text/tolerance_iterator.hpp>
+#include <mapnik/vertex_cache.hpp>
+#include <mapnik/tolerance_iterator.hpp>
//agg
#include "agg_conv_clip_polyline.h"
-namespace mapnik {
+namespace mapnik { namespace detail {
+
+template <typename Helper>
+struct apply_find_line_placements : util::noncopyable
+{
+ apply_find_line_placements(view_transform const& t, proj_transform const& prj_trans, Helper & helper)
+ : t_(t),
+ prj_trans_(prj_trans),
+ helper_(helper) {}
+
+ template <typename Adapter>
+ void operator() (Adapter & va) const
+ {
+ using vertex_adapter_type = Adapter;
+ using path_type = transform_path_adapter<view_transform, vertex_adapter_type>;
+ path_type path(t_, va, prj_trans_);
+ helper_.find_line_placements(path);
+ }
+ view_transform const& t_;
+ proj_transform const& prj_trans_;
+ Helper & helper_;
+};
+
+} // ns detail
group_symbolizer_helper::group_symbolizer_helper(
group_symbolizer const& sym, feature_impl const& feature,
@@ -61,13 +86,13 @@ pixel_position_list const& group_symbolizer_helper::get()
}
else
{
+ using apply_find_line_placements = detail::apply_find_line_placements<group_symbolizer_helper>;
for (auto const& geom : geometries_to_process_)
{
// TODO to support clipped geometries this needs to use
// vertex_converters
- using path_type = transform_path_adapter<view_transform,geometry_type>;
- path_type path(t_, *geom, prj_trans_);
- find_line_placements(path);
+ apply_find_line_placements apply(t_, prj_trans_, *this);
+ mapnik::util::apply_visitor(geometry::vertex_processor<apply_find_line_placements>(apply), geom);
}
}
@@ -146,10 +171,10 @@ bool group_symbolizer_helper::collision(box2d<double> const& box, value_unicode_
{
if (!detector_.extent().intersects(box)
||
- (text_props_->avoid_edges && !query_extent_.contains(box))
+ (text_props_->avoid_edges && !dims_.contains(box))
||
(text_props_->minimum_padding > 0 &&
- !query_extent_.contains(box + (scale_factor_ * text_props_->minimum_padding)))
+ !dims_.contains(box + (scale_factor_ * text_props_->minimum_padding)))
||
(!text_props_->allow_overlap &&
((repeat_key.length() == 0 && !detector_.has_placement(box, text_props_->margin * scale_factor_))
diff --git a/src/image.cpp b/src/image.cpp
new file mode 100644
index 0000000..408b29c
--- /dev/null
+++ b/src/image.cpp
@@ -0,0 +1,106 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/config.hpp>
+#include <mapnik/image.hpp>
+#include <mapnik/image_null.hpp>
+#include <mapnik/image_impl.hpp>
+#include <mapnik/pixel_types.hpp>
+
+namespace mapnik
+{
+
+namespace detail
+{
+
+// BUFFER
+buffer::buffer(std::size_t size)
+ : size_(size),
+ data_(static_cast<unsigned char*>(size_ != 0 ? ::operator new(size_) : nullptr))
+{}
+
+buffer::buffer(buffer && rhs) noexcept
+: size_(std::move(rhs.size_)),
+ data_(std::move(rhs.data_))
+{
+ rhs.size_ = 0;
+ rhs.data_ = nullptr;
+}
+
+buffer::buffer(buffer const& rhs)
+ : size_(rhs.size_),
+ data_(static_cast<unsigned char*>(size_ != 0 ? ::operator new(size_) : nullptr))
+{
+ if (data_) std::copy(rhs.data_, rhs.data_ + rhs.size_, data_);
+}
+
+buffer::~buffer()
+{
+ ::operator delete(data_);
+}
+
+buffer& buffer::operator=(buffer rhs)
+{
+ swap(rhs);
+ return *this;
+}
+
+void buffer::swap(buffer & rhs)
+{
+ std::swap(size_, rhs.size_);
+ std::swap(data_, rhs.data_);
+}
+
+unsigned char* buffer::data()
+{
+ return data_;
+}
+
+unsigned char const* buffer::data() const
+{
+ return data_;
+}
+
+std::size_t buffer::size() const
+{
+ return size_;
+}
+
+template struct MAPNIK_DECL image_dimensions<65535>;
+
+} // end ns detail
+
+template class MAPNIK_DECL image<null_t>;
+template class MAPNIK_DECL image<rgba8_t>;
+template class MAPNIK_DECL image<gray8_t>;
+template class MAPNIK_DECL image<gray8s_t>;
+template class MAPNIK_DECL image<gray16_t>;
+template class MAPNIK_DECL image<gray16s_t>;
+template class MAPNIK_DECL image<gray32_t>;
+template class MAPNIK_DECL image<gray32s_t>;
+template class MAPNIK_DECL image<gray32f_t>;
+template class MAPNIK_DECL image<gray64_t>;
+template class MAPNIK_DECL image<gray64s_t>;
+template class MAPNIK_DECL image<gray64f_t>;
+
+} // end ns
diff --git a/src/image_any.cpp b/src/image_any.cpp
new file mode 100644
index 0000000..ef62a4f
--- /dev/null
+++ b/src/image_any.cpp
@@ -0,0 +1,268 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#include <mapnik/image_any.hpp>
+
+namespace mapnik {
+
+namespace detail {
+
+struct get_bytes_visitor
+{
+ template <typename T>
+ unsigned char* operator()(T & data) const
+ {
+ return data.bytes();
+ }
+};
+
+struct get_bytes_visitor_const
+{
+ template <typename T>
+ unsigned char const* operator()(T const& data) const
+ {
+ return data.bytes();
+ }
+};
+
+struct get_dtype_visitor
+{
+ template <typename T>
+ image_dtype operator()(T const& data) const
+ {
+ return data.get_dtype();
+ }
+};
+
+struct get_width_visitor
+{
+ template <typename T>
+ std::size_t operator()(T const& data) const
+ {
+ return data.width();
+ }
+};
+
+struct get_height_visitor
+{
+ template <typename T>
+ std::size_t operator()(T const& data) const
+ {
+ return data.height();
+ }
+};
+
+struct get_premultiplied_visitor
+{
+ template <typename T>
+ bool operator()(T const& data) const
+ {
+ return data.get_premultiplied();
+ }
+};
+
+struct get_painted_visitor
+{
+ template <typename T>
+ bool operator()(T const& data) const
+ {
+ return data.painted();
+ }
+};
+
+struct get_any_size_visitor
+{
+ template <typename T>
+ std::size_t operator()(T const& data) const
+ {
+ return data.size();
+ }
+};
+
+struct get_any_row_size_visitor
+{
+ template <typename T>
+ std::size_t operator()(T const& data) const
+ {
+ return data.row_size();
+ }
+};
+
+struct get_offset_visitor
+{
+ template <typename T>
+ double operator() (T const& data) const
+ {
+ return data.get_offset();
+ }
+};
+
+struct get_scaling_visitor
+{
+ template <typename T>
+ double operator() (T const& data) const
+ {
+ return data.get_scaling();
+ }
+};
+
+struct set_offset_visitor
+{
+ set_offset_visitor(double val)
+ : val_(val) {}
+ template <typename T>
+ void operator() (T & data) const
+ {
+ data.set_offset(val_);
+ }
+private:
+ double val_;
+};
+
+struct set_scaling_visitor
+{
+ set_scaling_visitor(double val)
+ : val_(val) {}
+ template <typename T>
+ void operator() (T & data) const
+ {
+ data.set_scaling(val_);
+ }
+private:
+ double val_;
+};
+
+} // namespace detail
+
+MAPNIK_DECL image_any::image_any(int width,
+ int height,
+ image_dtype type,
+ bool initialize,
+ bool premultiplied,
+ bool painted)
+ : image_base(std::move(create_image_any(width, height, type, initialize, premultiplied, painted))) {}
+
+MAPNIK_DECL unsigned char const* image_any::bytes() const
+{
+ return util::apply_visitor(detail::get_bytes_visitor_const(),*this);
+}
+
+MAPNIK_DECL unsigned char* image_any::bytes()
+{
+ return util::apply_visitor(detail::get_bytes_visitor(),*this);
+}
+
+MAPNIK_DECL std::size_t image_any::width() const
+{
+ return util::apply_visitor(detail::get_width_visitor(),*this);
+}
+
+MAPNIK_DECL std::size_t image_any::height() const
+{
+ return util::apply_visitor(detail::get_height_visitor(),*this);
+}
+
+MAPNIK_DECL bool image_any::get_premultiplied() const
+{
+ return util::apply_visitor(detail::get_premultiplied_visitor(),*this);
+}
+
+MAPNIK_DECL bool image_any::painted() const
+{
+ return util::apply_visitor(detail::get_painted_visitor(),*this);
+}
+
+MAPNIK_DECL std::size_t image_any::size() const
+{
+ return util::apply_visitor(detail::get_any_size_visitor(),*this);
+}
+
+MAPNIK_DECL std::size_t image_any::row_size() const
+{
+ return util::apply_visitor(detail::get_any_row_size_visitor(),*this);
+}
+
+MAPNIK_DECL double image_any::get_offset() const
+{
+ return util::apply_visitor(detail::get_offset_visitor(),*this);
+}
+
+MAPNIK_DECL double image_any::get_scaling() const
+{
+ return util::apply_visitor(detail::get_scaling_visitor(),*this);
+}
+
+MAPNIK_DECL image_dtype image_any::get_dtype() const
+{
+ return util::apply_visitor(detail::get_dtype_visitor(),*this);
+}
+
+MAPNIK_DECL void image_any::set_offset(double val)
+{
+ util::apply_visitor(detail::set_offset_visitor(val),*this);
+}
+
+MAPNIK_DECL void image_any::set_scaling(double val)
+{
+ util::apply_visitor(detail::set_scaling_visitor(val),*this);
+}
+
+
+MAPNIK_DECL image_any create_image_any(int width,
+ int height,
+ image_dtype type,
+ bool initialize,
+ bool premultiplied,
+ bool painted)
+{
+ switch (type)
+ {
+ case image_dtype_gray8:
+ return image_any(std::move(image_gray8(width, height, initialize, premultiplied, painted)));
+ case image_dtype_gray8s:
+ return image_any(std::move(image_gray8s(width, height, initialize, premultiplied, painted)));
+ case image_dtype_gray16:
+ return image_any(std::move(image_gray16(width, height, initialize, premultiplied, painted)));
+ case image_dtype_gray16s:
+ return image_any(std::move(image_gray16s(width, height, initialize, premultiplied, painted)));
+ case image_dtype_gray32:
+ return image_any(std::move(image_gray32(width, height, initialize, premultiplied, painted)));
+ case image_dtype_gray32s:
+ return image_any(std::move(image_gray32s(width, height, initialize, premultiplied, painted)));
+ case image_dtype_gray32f:
+ return image_any(std::move(image_gray32f(width, height, initialize, premultiplied, painted)));
+ case image_dtype_gray64:
+ return image_any(std::move(image_gray64(width, height, initialize, premultiplied, painted)));
+ case image_dtype_gray64s:
+ return image_any(std::move(image_gray64s(width, height, initialize, premultiplied, painted)));
+ case image_dtype_gray64f:
+ return image_any(std::move(image_gray64f(width, height, initialize, premultiplied, painted)));
+ case image_dtype_null:
+ return image_any(std::move(image_null()));
+ case image_dtype_rgba8:
+ case IMAGE_DTYPE_MAX:
+ default:
+ return image_any(std::move(image_rgba8(width, height, initialize, premultiplied, painted)));
+ }
+}
+
+} // end mapnik ns
diff --git a/src/image_compositing.cpp b/src/image_compositing.cpp
index 3c71bc8..5483325 100644
--- a/src/image_compositing.cpp
+++ b/src/image_compositing.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,7 +22,8 @@
// mapnik
#include <mapnik/image_compositing.hpp>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
+#include <mapnik/image_any.hpp>
// boost
#pragma GCC diagnostic push
@@ -38,8 +39,10 @@
#include "agg_scanline_u.h"
#include "agg_renderer_scanline.h"
#include "agg_pixfmt_rgba.h"
+#include "agg_pixfmt_gray.h"
#include "agg_color_rgba.h"
+
namespace mapnik
{
@@ -120,38 +123,135 @@ For example, if you generate some pattern with AGG (premultiplied) and would lik
*/
+namespace detail {
+
+// non-mutable rendering_buffer implementation
+template <typename T>
+struct rendering_buffer
+{
+ using image_type = T;
+ using pixel_type = typename image_type::pixel_type;
+ using row_data = agg::const_row_info<uint8_t>;
+
+ rendering_buffer(T const& data)
+ : data_(data) {}
+
+ uint8_t const* buf() const { return data_.bytes(); }
+ unsigned width() const { return data_.width();}
+ unsigned height() const { return data_.height();}
+ int stride() const { return data_.row_size();}
+ uint8_t const* row_ptr(int, int y, unsigned) {return row_ptr(y);}
+ uint8_t const* row_ptr(int y) const { return reinterpret_cast<uint8_t const*>(data_.get_row(y)); }
+ row_data row (int y) const { return row_data(0, data_.width() - 1, row_ptr(y)); }
+ image_type const& data_;
+};
-template <typename T1, typename T2>
-void composite(T1 & dst, T2 & src, composite_mode_e mode,
+} // end detail ns
+
+template <>
+MAPNIK_DECL void composite(image_rgba8 & dst, image_rgba8 const& src, composite_mode_e mode,
float opacity,
int dx,
- int dy,
- bool premultiply_src)
+ int dy)
{
using color = agg::rgba8;
using order = agg::order_rgba;
+ using const_rendering_buffer = detail::rendering_buffer<image_rgba8>;
using blender_type = agg::comp_op_adaptor_rgba_pre<color, order>;
using pixfmt_type = agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer>;
using renderer_type = agg::renderer_base<pixfmt_type>;
- agg::rendering_buffer dst_buffer(dst.getBytes(),dst.width(),dst.height(),dst.width() * 4);
- agg::rendering_buffer src_buffer(src.getBytes(),src.width(),src.height(),src.width() * 4);
-
+ agg::rendering_buffer dst_buffer(dst.bytes(),dst.width(),dst.height(),dst.row_size());
+ const_rendering_buffer src_buffer(src);
pixfmt_type pixf(dst_buffer);
pixf.comp_op(static_cast<agg::comp_op_e>(mode));
-
- agg::pixfmt_rgba32 pixf_mask(src_buffer);
- if (premultiply_src) pixf_mask.premultiply();
+ agg::pixfmt_alpha_blend_rgba<agg::blender_rgba32, const_rendering_buffer, agg::pixel32_type> pixf_mask(src_buffer);
+#ifdef MAPNIK_DEBUG
+ if (!src.get_premultiplied())
+ {
+ throw std::runtime_error("SOURCE MUST BE PREMULTIPLIED FOR COMPOSITING!");
+ }
+ if (!dst.get_premultiplied())
+ {
+ throw std::runtime_error("DESTINATION MUST BE PREMULTIPLIED FOR COMPOSITING!");
+ }
+#endif
renderer_type ren(pixf);
ren.blend_from(pixf_mask,0,dx,dy,unsigned(255*opacity));
}
-template void composite<mapnik::image_data_32,mapnik::image_data_32>(mapnik::image_data_32&,
- mapnik::image_data_32&,
- composite_mode_e,
- float,
- int,
- int,
- bool);
+template <>
+MAPNIK_DECL void composite(image_gray32f & dst, image_gray32f const& src, composite_mode_e mode,
+ float opacity,
+ int dx,
+ int dy)
+{
+ using const_rendering_buffer = detail::rendering_buffer<image_gray32f>;
+ using src_pixfmt_type = agg::pixfmt_alpha_blend_gray<agg::blender_gray<agg::gray32>, const_rendering_buffer, 1, 0>;
+ using dst_pixfmt_type = agg::pixfmt_alpha_blend_gray<agg::blender_gray<agg::gray32>, agg::rendering_buffer, 1, 0>;
+ using renderer_type = agg::renderer_base<dst_pixfmt_type>;
+
+ agg::rendering_buffer dst_buffer(dst.bytes(),dst.width(),dst.height(),dst.width());
+ const_rendering_buffer src_buffer(src);
+ dst_pixfmt_type pixf(dst_buffer);
+ src_pixfmt_type pixf_mask(src_buffer);
+ renderer_type ren(pixf);
+ ren.copy_from(pixf_mask,0,dx,dy);
+}
+
+namespace detail {
+
+struct composite_visitor
+{
+ composite_visitor(image_any const& src,
+ composite_mode_e mode,
+ float opacity,
+ int dx,
+ int dy)
+ : src_(src),
+ mode_(mode),
+ opacity_(opacity),
+ dx_(dx),
+ dy_(dy) {}
+
+ template <typename T>
+ void operator() (T & dst);
+
+ private:
+ image_any const& src_;
+ composite_mode_e mode_;
+ float opacity_;
+ int dx_;
+ int dy_;
+};
+
+template <typename T>
+void composite_visitor::operator() (T & dst)
+{
+ throw std::runtime_error("Error: Composite with " + std::string(typeid(dst).name()) + " is not supported");
+}
+
+template <>
+void composite_visitor::operator()<image_rgba8> (image_rgba8 & dst)
+{
+ composite(dst, util::get<image_rgba8>(src_), mode_, opacity_, dx_, dy_);
+}
+
+template <>
+void composite_visitor::operator()<image_gray32f> (image_gray32f & dst)
+{
+ composite(dst, util::get<image_gray32f>(src_), mode_, opacity_, dx_, dy_);
+}
+
+} // end ns
+
+template <>
+MAPNIK_DECL void composite(image_any & dst, image_any const& src, composite_mode_e mode,
+ float opacity,
+ int dx,
+ int dy)
+{
+ util::apply_visitor(detail::composite_visitor(src, mode, opacity, dx, dy), dst);
+}
}
diff --git a/src/image_copy.cpp b/src/image_copy.cpp
new file mode 100644
index 0000000..f676cee
--- /dev/null
+++ b/src/image_copy.cpp
@@ -0,0 +1,361 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/image_copy.hpp>
+#include <mapnik/image.hpp>
+#include <mapnik/image_any.hpp>
+
+// boost
+#include <boost/numeric/conversion/cast.hpp>
+
+using boost::numeric_cast;
+using boost::numeric::positive_overflow;
+using boost::numeric::negative_overflow;
+
+namespace mapnik
+{
+
+namespace detail
+{
+
+template <typename T0>
+struct visitor_image_copy
+{
+ using dst_type = typename T0::pixel_type;
+
+ T0 operator() (image_null const&)
+ {
+ throw std::runtime_error("Can not cast a null image");
+ }
+
+ T0 operator() (T0 const& src)
+ {
+ return T0(src);
+ }
+
+ template <typename T1>
+ T0 operator() (T1 const& src)
+ {
+ T0 dst(src.width(), src.height(), false);
+ for (unsigned y = 0; y < dst.height(); ++y)
+ {
+ for (unsigned x = 0; x < dst.width(); ++x)
+ {
+ try
+ {
+ dst(x,y) = numeric_cast<dst_type>(src(x,y));
+ }
+ catch(negative_overflow&)
+ {
+ dst(x,y) = std::numeric_limits<dst_type>::min();
+ }
+ catch(positive_overflow&)
+ {
+ dst(x,y) = std::numeric_limits<dst_type>::max();
+ }
+ }
+ }
+ return T0(std::move(dst));
+ }
+};
+
+template <typename T0>
+struct visitor_image_copy_so
+{
+ using dst_type = typename T0::pixel_type;
+
+ visitor_image_copy_so(double offset, double scaling)
+ : offset_(offset), scaling_(scaling) {}
+
+ T0 operator() (image_null const&)
+ {
+ throw std::runtime_error("Can not cast a null image");
+ }
+
+ T0 operator() (T0 const& src)
+ {
+ if (offset_ == src.get_offset() && scaling_ == src.get_scaling())
+ {
+ return T0(src);
+ }
+ else
+ {
+ T0 dst(src);
+ dst.set_scaling(scaling_);
+ dst.set_offset(offset_);
+ return T0(std::move(dst));
+ }
+ }
+
+ template <typename T1>
+ T0 operator() (T1 const& src)
+ {
+ double src_offset = src.get_offset();
+ double src_scaling = src.get_scaling();
+ T0 dst(src.width(), src.height(), false);
+ dst.set_scaling(scaling_);
+ dst.set_offset(offset_);
+ for (unsigned y = 0; y < dst.height(); ++y)
+ {
+ for (unsigned x = 0; x < dst.width(); ++x)
+ {
+ double scaled_src_val = (numeric_cast<double>(src(x,y)) * src_scaling) + src_offset;
+ double dst_val = (scaled_src_val - offset_) / scaling_;
+ try
+ {
+ dst(x,y) = numeric_cast<dst_type>(dst_val);
+ }
+ catch(negative_overflow&)
+ {
+ dst(x,y) = std::numeric_limits<dst_type>::min();
+ }
+ catch(positive_overflow&)
+ {
+ dst(x,y) = std::numeric_limits<dst_type>::max();
+ }
+ }
+ }
+ return T0(std::move(dst));
+ }
+ private:
+ double offset_;
+ double scaling_;
+};
+
+} // end detail ns
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_any const& data, double offset, double scaling)
+{
+ if (offset == 0.0 && scaling == 1.0 && data.get_offset() == 0.0 && data.get_scaling() == 1.0)
+ {
+ return util::apply_visitor(detail::visitor_image_copy<T>(), data);
+ }
+ else
+ {
+ return util::apply_visitor(detail::visitor_image_copy_so<T>(offset, scaling), data);
+ }
+}
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_rgba8 const& data, double offset, double scaling)
+{
+ if (offset == 0.0 && scaling == 1.0 && data.get_offset() == 0.0 && data.get_scaling() == 1.0)
+ {
+ detail::visitor_image_copy<T> visit;
+ return visit(data);
+ }
+ else
+ {
+ detail::visitor_image_copy_so<T> visit(offset, scaling);
+ return visit(data);
+ }
+}
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray8 const& data, double offset, double scaling)
+{
+ if (offset == 0.0 && scaling == 1.0 && data.get_offset() == 0.0 && data.get_scaling() == 1.0)
+ {
+ detail::visitor_image_copy<T> visit;
+ return visit(data);
+ }
+ else
+ {
+ detail::visitor_image_copy_so<T> visit(offset, scaling);
+ return visit(data);
+ }
+}
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray8s const& data, double offset, double scaling)
+{
+ if (offset == 0.0 && scaling == 1.0 && data.get_offset() == 0.0 && data.get_scaling() == 1.0)
+ {
+ detail::visitor_image_copy<T> visit;
+ return visit(data);
+ }
+ else
+ {
+ detail::visitor_image_copy_so<T> visit(offset, scaling);
+ return visit(data);
+ }
+}
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray16 const& data, double offset, double scaling)
+{
+ if (offset == 0.0 && scaling == 1.0 && data.get_offset() == 0.0 && data.get_scaling() == 1.0)
+ {
+ detail::visitor_image_copy<T> visit;
+ return visit(data);
+ }
+ else
+ {
+ detail::visitor_image_copy_so<T> visit(offset, scaling);
+ return visit(data);
+ }
+}
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray16s const& data, double offset, double scaling)
+{
+ if (offset == 0.0 && scaling == 1.0 && data.get_offset() == 0.0 && data.get_scaling() == 1.0)
+ {
+ detail::visitor_image_copy<T> visit;
+ return visit(data);
+ }
+ else
+ {
+ detail::visitor_image_copy_so<T> visit(offset, scaling);
+ return visit(data);
+ }
+}
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray32 const& data, double offset, double scaling)
+{
+ if (offset == 0.0 && scaling == 1.0 && data.get_offset() == 0.0 && data.get_scaling() == 1.0)
+ {
+ detail::visitor_image_copy<T> visit;
+ return visit(data);
+ }
+ else
+ {
+ detail::visitor_image_copy_so<T> visit(offset, scaling);
+ return visit(data);
+ }
+}
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray32s const& data, double offset, double scaling)
+{
+ if (offset == 0.0 && scaling == 1.0 && data.get_offset() == 0.0 && data.get_scaling() == 1.0)
+ {
+ detail::visitor_image_copy<T> visit;
+ return visit(data);
+ }
+ else
+ {
+ detail::visitor_image_copy_so<T> visit(offset, scaling);
+ return visit(data);
+ }
+}
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray32f const& data, double offset, double scaling)
+{
+ if (offset == 0.0 && scaling == 1.0 && data.get_offset() == 0.0 && data.get_scaling() == 1.0)
+ {
+ detail::visitor_image_copy<T> visit;
+ return visit(data);
+ }
+ else
+ {
+ detail::visitor_image_copy_so<T> visit(offset, scaling);
+ return visit(data);
+ }
+}
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray64 const& data, double offset, double scaling)
+{
+ if (offset == 0.0 && scaling == 1.0 && data.get_offset() == 0.0 && data.get_scaling() == 1.0)
+ {
+ detail::visitor_image_copy<T> visit;
+ return visit(data);
+ }
+ else
+ {
+ detail::visitor_image_copy_so<T> visit(offset, scaling);
+ return visit(data);
+ }
+}
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray64s const& data, double offset, double scaling)
+{
+ if (offset == 0.0 && scaling == 1.0 && data.get_offset() == 0.0 && data.get_scaling() == 1.0)
+ {
+ detail::visitor_image_copy<T> visit;
+ return visit(data);
+ }
+ else
+ {
+ detail::visitor_image_copy_so<T> visit(offset, scaling);
+ return visit(data);
+ }
+}
+
+template <typename T>
+MAPNIK_DECL T image_copy(image_gray64f const& data, double offset, double scaling)
+{
+ if (offset == 0.0 && scaling == 1.0 && data.get_offset() == 0.0 && data.get_scaling() == 1.0)
+ {
+ detail::visitor_image_copy<T> visit;
+ return visit(data);
+ }
+ else
+ {
+ detail::visitor_image_copy_so<T> visit(offset, scaling);
+ return visit(data);
+ }
+}
+
+MAPNIK_DECL image_any image_copy(image_any const& data, image_dtype type, double offset, double scaling)
+{
+ switch (type)
+ {
+ case image_dtype_rgba8:
+ return image_any(std::move(image_copy<image_rgba8>(data, offset, scaling)));
+ case image_dtype_gray8:
+ return image_any(std::move(image_copy<image_gray8>(data, offset, scaling)));
+ case image_dtype_gray8s:
+ return image_any(std::move(image_copy<image_gray8s>(data, offset, scaling)));
+ case image_dtype_gray16:
+ return image_any(std::move(image_copy<image_gray16>(data, offset, scaling)));
+ case image_dtype_gray16s:
+ return image_any(std::move(image_copy<image_gray16s>(data, offset, scaling)));
+ case image_dtype_gray32:
+ return image_any(std::move(image_copy<image_gray32>(data, offset, scaling)));
+ case image_dtype_gray32s:
+ return image_any(std::move(image_copy<image_gray32s>(data, offset, scaling)));
+ case image_dtype_gray32f:
+ return image_any(std::move(image_copy<image_gray32f>(data, offset, scaling)));
+ case image_dtype_gray64:
+ return image_any(std::move(image_copy<image_gray64>(data, offset, scaling)));
+ case image_dtype_gray64s:
+ return image_any(std::move(image_copy<image_gray64s>(data, offset, scaling)));
+ case image_dtype_gray64f:
+ return image_any(std::move(image_copy<image_gray64f>(data, offset, scaling)));
+ case image_dtype_null:
+ throw std::runtime_error("Can not cast a null image");
+ case IMAGE_DTYPE_MAX:
+ default:
+ throw std::runtime_error("Can not cast unknown type");
+
+ }
+ throw std::runtime_error("Unknown image type passed");
+}
+
+} // end mapnik ns
diff --git a/src/image_filter_types.cpp b/src/image_filter_types.cpp
index 702c566..0b28b07 100644
--- a/src/image_filter_types.cpp
+++ b/src/image_filter_types.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/image_options.cpp b/src/image_options.cpp
new file mode 100644
index 0000000..0c102ae
--- /dev/null
+++ b/src/image_options.cpp
@@ -0,0 +1,73 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#include <mapnik/image_options.hpp>
+#include <boost/spirit/include/qi.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+
+namespace mapnik { namespace detail {
+
+namespace qi = boost::spirit::qi;
+
+template <typename Iterator>
+struct image_options_grammar
+ : qi::grammar<Iterator, image_options_map(), boost::spirit::ascii::space_type>
+{
+ using pair_type = std::pair<std::string, boost::optional<std::string>>;
+ image_options_grammar()
+ : image_options_grammar::base_type(start)
+ {
+ qi::lit_type lit;
+ qi::char_type char_;
+ start = pair >> *(lit(':') >> pair)
+ ;
+ pair = key >> -('=' >> value)
+ ;
+ key = char_("a-zA-Z_") >> *char_("a-zA-Z_0-9\\.\\-")
+ ;
+ value = +char_("a-zA-Z_0-9\\.\\-")
+ ;
+ }
+
+ qi::rule<Iterator, image_options_map(), boost::spirit::ascii::space_type> start;
+ qi::rule<Iterator, pair_type(), boost::spirit::ascii::space_type> pair;
+ qi::rule<Iterator, std::string(), boost::spirit::ascii::space_type> key, value;
+};
+
+} // ns detail
+
+image_options_map parse_image_options(std::string const& str)
+{
+ auto const begin = str.begin();
+ auto const end = str.end();
+ boost::spirit::ascii::space_type space;
+ mapnik::detail::image_options_grammar<std::string::const_iterator> g;
+ image_options_map options;
+ bool success = boost::spirit::qi::phrase_parse(begin, end, g, space, options);
+ if (!success)
+ {
+ throw std::runtime_error("Can't parse image options: " + str);
+ }
+ return options; // RVO
+}
+
+} // ns mapnik
diff --git a/src/image_reader.cpp b/src/image_reader.cpp
index 036a051..e3e708b 100644
--- a/src/image_reader.cpp
+++ b/src/image_reader.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -84,7 +84,10 @@ image_reader* get_image_reader(std::string const& filename)
{
return factory<image_reader,std::string,std::string const&>::instance().create_object(*type,filename);
}
- return 0;
+ else
+ {
+ throw image_reader_exception("image_reader: can't determine type from input data");
+ }
}
}
diff --git a/src/image_scaling.cpp b/src/image_scaling.cpp
index c122e89..6b9f9bc 100644
--- a/src/image_scaling.cpp
+++ b/src/image_scaling.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -21,8 +21,9 @@
*****************************************************************************/
// mapnik
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
#include <mapnik/image_scaling.hpp>
+#include <mapnik/image_scaling_traits.hpp>
// does not handle alpha correctly
//#include <mapnik/span_image_filter.hpp>
@@ -37,12 +38,14 @@
// agg
#include "agg_image_accessors.h"
#include "agg_pixfmt_rgba.h"
+#include "agg_pixfmt_gray.h"
#include "agg_color_rgba.h"
#include "agg_rasterizer_scanline_aa.h"
#include "agg_renderer_scanline.h"
#include "agg_rendering_buffer.h"
#include "agg_scanline_u.h"
#include "agg_span_allocator.h"
+#include "agg_span_image_filter_gray.h"
#include "agg_span_image_filter_rgba.h"
#include "agg_span_interpolator_linear.h"
#include "agg_trans_affine.h"
@@ -94,37 +97,39 @@ boost::optional<std::string> scaling_method_to_string(scaling_method_e scaling_m
return mode;
}
-template <typename Image>
-void scale_image_agg(Image & target,
- Image const& source,
- scaling_method_e scaling_method,
- double image_ratio_x,
- double image_ratio_y,
- double x_off_f,
- double y_off_f,
+
+template <typename T>
+void scale_image_agg(T & target, T const& source, scaling_method_e scaling_method,
+ double image_ratio_x, double image_ratio_y, double x_off_f, double y_off_f,
double filter_factor)
{
// "the image filters should work namely in the premultiplied color space"
// http://old.nabble.com/Re:--AGG--Basic-image-transformations-p1110665.html
// "Yes, you need to use premultiplied images only. Only in this case the simple weighted averaging works correctly in the image fitering."
// http://permalink.gmane.org/gmane.comp.graphics.agg/3443
- using pixfmt_pre = agg::pixfmt_rgba32_pre;
+ using image_type = T;
+ using pixel_type = typename image_type::pixel_type;
+ using pixfmt_pre = typename detail::agg_scaling_traits<image_type>::pixfmt_pre;
+ using color_type = typename detail::agg_scaling_traits<image_type>::color_type;
+ using img_src_type = typename detail::agg_scaling_traits<image_type>::img_src_type;
+ using interpolator_type = typename detail::agg_scaling_traits<image_type>::interpolator_type;
using renderer_base_pre = agg::renderer_base<pixfmt_pre>;
+ constexpr std::size_t pixel_size = sizeof(pixel_type);
// define some stuff we'll use soon
agg::rasterizer_scanline_aa<> ras;
agg::scanline_u8 sl;
- agg::span_allocator<agg::rgba8> sa;
- agg::image_filter_lut filter;
+ agg::span_allocator<color_type> sa;
// initialize source AGG buffer
- agg::rendering_buffer rbuf_src((unsigned char*)source.getBytes(), source.width(), source.height(), source.width() * 4);
+ agg::rendering_buffer rbuf_src(const_cast<unsigned char*>(source.bytes()),
+ source.width(), source.height(), source.width() * pixel_size);
pixfmt_pre pixf_src(rbuf_src);
- using img_src_type = agg::image_accessor_clone<pixfmt_pre>;
+
img_src_type img_src(pixf_src);
// initialize destination AGG buffer (with transparency)
- agg::rendering_buffer rbuf_dst((unsigned char*)target.getBytes(), target.width(), target.height(), target.width() * 4);
+ agg::rendering_buffer rbuf_dst(target.bytes(), target.width(), target.height(), target.width() * pixel_size);
pixfmt_pre pixf_dst(rbuf_dst);
renderer_base_pre rb_dst_pre(pixf_dst);
@@ -133,9 +138,7 @@ void scale_image_agg(Image & target,
img_mtx /= agg::trans_affine_scaling(image_ratio_x, image_ratio_y);
// create a linear interpolator for our scaling matrix
- using interpolator_type = agg::span_interpolator_linear<>;
interpolator_type interpolator(img_mtx);
-
// draw an anticlockwise polygon to render our image into
double scaled_width = target.width();
double scaled_height = target.height();
@@ -145,73 +148,53 @@ void scale_image_agg(Image & target,
ras.line_to_d(x_off_f + scaled_width, y_off_f + scaled_height);
ras.line_to_d(x_off_f, y_off_f + scaled_height);
- switch(scaling_method)
- {
- case SCALING_NEAR:
+ if (scaling_method == SCALING_NEAR)
{
- using span_gen_type = agg::span_image_filter_rgba_nn<img_src_type, interpolator_type>;
+ using span_gen_type = typename detail::agg_scaling_traits<image_type>::span_image_filter;
span_gen_type sg(img_src, interpolator);
agg::render_scanlines_aa(ras, sl, rb_dst_pre, sa, sg);
- return;
}
- case SCALING_BILINEAR:
- filter.calculate(agg::image_filter_bilinear(), true); break;
- case SCALING_BICUBIC:
- filter.calculate(agg::image_filter_bicubic(), true); break;
- case SCALING_SPLINE16:
- filter.calculate(agg::image_filter_spline16(), true); break;
- case SCALING_SPLINE36:
- filter.calculate(agg::image_filter_spline36(), true); break;
- case SCALING_HANNING:
- filter.calculate(agg::image_filter_hanning(), true); break;
- case SCALING_HAMMING:
- filter.calculate(agg::image_filter_hamming(), true); break;
- case SCALING_HERMITE:
- filter.calculate(agg::image_filter_hermite(), true); break;
- case SCALING_KAISER:
- filter.calculate(agg::image_filter_kaiser(), true); break;
- case SCALING_QUADRIC:
- filter.calculate(agg::image_filter_quadric(), true); break;
- case SCALING_CATROM:
- filter.calculate(agg::image_filter_catrom(), true); break;
- case SCALING_GAUSSIAN:
- filter.calculate(agg::image_filter_gaussian(), true); break;
- case SCALING_BESSEL:
- filter.calculate(agg::image_filter_bessel(), true); break;
- case SCALING_MITCHELL:
- filter.calculate(agg::image_filter_mitchell(), true); break;
- case SCALING_SINC:
- filter.calculate(agg::image_filter_sinc(filter_factor), true); break;
- case SCALING_LANCZOS:
- filter.calculate(agg::image_filter_lanczos(filter_factor), true); break;
- case SCALING_BLACKMAN:
- filter.calculate(agg::image_filter_blackman(filter_factor), true); break;
+ else
+ {
+ using span_gen_type = typename detail::agg_scaling_traits<image_type>::span_image_resample_affine;
+ agg::image_filter_lut filter;
+ detail::set_scaling_method(filter, scaling_method, filter_factor);
+ span_gen_type sg(img_src, interpolator, filter);
+ agg::render_scanlines_aa(ras, sl, rb_dst_pre, sa, sg);
}
- // details on various resampling considerations
- // http://old.nabble.com/Re%3A-Newbie---texture-p5057255.html
-
- // high quality resampler
- using span_gen_type = agg::span_image_resample_rgba_affine<img_src_type>;
-
- // faster, lower quality
- //using span_gen_type = agg::span_image_filter_rgba<img_src_type,interpolator_type>;
-
- // local, modified agg::span_image_resample_rgba_affine
- // dating back to when we were not handling alpha correctly
- // and this file helped work around symptoms
- // https://github.com/mapnik/mapnik/issues/1489
- //using span_gen_type = mapnik::span_image_resample_rgba_affine<img_src_type>;
- span_gen_type sg(img_src, interpolator, filter);
- agg::render_scanlines_aa(ras, sl, rb_dst_pre, sa, sg);
+
}
-template void scale_image_agg<image_data_32>(image_data_32& target,
- const image_data_32& source,
- scaling_method_e scaling_method,
- double image_ratio_x,
- double image_ratio_y,
- double x_off_f,
- double y_off_f,
- double filter_factor);
+template MAPNIK_DECL void scale_image_agg(image_rgba8 &, image_rgba8 const&, scaling_method_e,
+ double, double , double, double , double);
+
+template MAPNIK_DECL void scale_image_agg(image_gray8 &, image_gray8 const&, scaling_method_e,
+ double, double , double, double , double);
+
+template MAPNIK_DECL void scale_image_agg(image_gray8s &, image_gray8s const&, scaling_method_e,
+ double, double , double, double , double);
+
+template MAPNIK_DECL void scale_image_agg(image_gray16 &, image_gray16 const&, scaling_method_e,
+ double, double , double, double , double);
+
+template MAPNIK_DECL void scale_image_agg(image_gray16s &, image_gray16s const&, scaling_method_e,
+ double, double , double, double , double);
+
+template MAPNIK_DECL void scale_image_agg(image_gray32 &, image_gray32 const&, scaling_method_e,
+ double, double , double, double , double);
+
+template MAPNIK_DECL void scale_image_agg(image_gray32s &, image_gray32s const&, scaling_method_e,
+ double, double , double, double , double);
+
+template MAPNIK_DECL void scale_image_agg(image_gray32f &, image_gray32f const&, scaling_method_e,
+ double, double , double, double , double);
+
+template MAPNIK_DECL void scale_image_agg(image_gray64 &, image_gray64 const&, scaling_method_e,
+ double, double , double, double , double);
+
+template MAPNIK_DECL void scale_image_agg(image_gray64s &, image_gray64s const&, scaling_method_e,
+ double, double , double, double , double);
+template MAPNIK_DECL void scale_image_agg(image_gray64f &, image_gray64f const&, scaling_method_e,
+ double, double , double, double , double);
}
diff --git a/src/image_util.cpp b/src/image_util.cpp
index 3de9b45..0f3951a 100644
--- a/src/image_util.cpp
+++ b/src/image_util.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -20,71 +20,51 @@
*
*****************************************************************************/
-#if defined(HAVE_PNG)
-extern "C"
-{
-#include <png.h>
-}
-#endif
-
// mapnik
-#if defined(HAVE_PNG)
-#include <mapnik/png_io.hpp>
-#endif
-
-#if defined(HAVE_TIFF)
-#include <mapnik/tiff_io.hpp>
-#endif
-
-#if defined(HAVE_JPEG)
-#include <mapnik/jpeg_io.hpp>
-#endif
-
-#if defined(HAVE_WEBP)
-#include <mapnik/webp_io.hpp>
-#endif
-
#include <mapnik/image_util.hpp>
-#include <mapnik/image_data.hpp>
-#include <mapnik/graphics.hpp>
-#include <mapnik/memory.hpp>
+#include <mapnik/image_util_jpeg.hpp>
+#include <mapnik/image_util_png.hpp>
+#include <mapnik/image_util_tiff.hpp>
+#include <mapnik/image_util_webp.hpp>
+#include <mapnik/image.hpp>
+#include <mapnik/image_any.hpp>
+#include <mapnik/image_view_any.hpp>
#include <mapnik/image_view.hpp>
#include <mapnik/palette.hpp>
-#include <mapnik/map.hpp>
-#include <mapnik/util/conversions.hpp>
-
-#ifdef HAVE_CAIRO
-#include <mapnik/cairo/cairo_renderer.hpp>
-#include <cairo.h>
-#ifdef CAIRO_HAS_PDF_SURFACE
-#include <cairo-pdf.h>
-#endif
-#ifdef CAIRO_HAS_PS_SURFACE
-#include <cairo-ps.h>
-#endif
-#ifdef CAIRO_HAS_SVG_SURFACE
-#include <cairo-svg.h>
-#endif
+#include <mapnik/color.hpp>
+#include <mapnik/box2d.hpp>
+#include <mapnik/util/variant.hpp>
+#include <mapnik/debug.hpp>
+#ifdef SSE_MATH
+#include <mapnik/sse.hpp>
+
#endif
-// boost
-#include <boost/tokenizer.hpp>
+// agg
+#include "agg_rendering_buffer.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_color_rgba.h"
// stl
#include <string>
-#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
+// boost
+#include <boost/numeric/conversion/cast.hpp>
+
namespace mapnik
{
+using boost::numeric_cast;
+using boost::numeric::positive_overflow;
+using boost::numeric::negative_overflow;
template <typename T>
-std::string save_to_string(T const& image,
- std::string const& type,
- rgba_palette const& palette)
+MAPNIK_DECL std::string save_to_string(T const& image,
+ std::string const& type,
+ rgba_palette const& palette)
{
std::ostringstream ss(std::ios::out|std::ios::binary);
save_to_stream(image, ss, type, palette);
@@ -92,8 +72,8 @@ std::string save_to_string(T const& image,
}
template <typename T>
-std::string save_to_string(T const& image,
- std::string const& type)
+MAPNIK_DECL std::string save_to_string(T const& image,
+ std::string const& type)
{
std::ostringstream ss(std::ios::out|std::ios::binary);
save_to_stream(image, ss, type);
@@ -101,454 +81,126 @@ std::string save_to_string(T const& image,
}
template <typename T>
-void save_to_file(T const& image,
- std::string const& filename,
- std::string const& type,
- rgba_palette const& palette)
+MAPNIK_DECL void save_to_file(T const& image,
+ std::string const& filename,
+ std::string const& type,
+ rgba_palette const& palette)
{
std::ofstream file (filename.c_str(), std::ios::out| std::ios::trunc|std::ios::binary);
if (file)
{
- save_to_stream(image, file, type, palette);
+ save_to_stream<T>(image, file, type, palette);
}
- else throw ImageWriterException("Could not write file to " + filename );
+ else throw image_writer_exception("Could not write file to " + filename );
}
template <typename T>
-void save_to_file(T const& image,
- std::string const& filename,
- std::string const& type)
+MAPNIK_DECL void save_to_file(T const& image,
+ std::string const& filename,
+ std::string const& type)
{
std::ofstream file (filename.c_str(), std::ios::out| std::ios::trunc|std::ios::binary);
if (file)
{
- save_to_stream(image, file, type);
+ save_to_stream<T>(image, file, type);
}
- else throw ImageWriterException("Could not write file to " + filename );
+ else throw image_writer_exception("Could not write file to " + filename );
}
-#if defined(HAVE_PNG)
-
-void handle_png_options(std::string const& type,
- png_options & opts)
+template <typename T>
+MAPNIK_DECL void save_to_stream(T const& image,
+ std::ostream & stream,
+ std::string const& type,
+ rgba_palette const& palette)
{
- if (type == "png" || type == "png24" || type == "png32")
- {
- opts.paletted = false;
- return;
- }
- else if (type == "png8" || type == "png256")
- {
- opts.paletted = true;
- return;
- }
- boost::char_separator<char> sep(":");
- boost::tokenizer< boost::char_separator<char> > tokens(type, sep);
- bool set_colors = false;
- bool set_gamma = false;
- for (std::string const& t : tokens)
+ if (stream && image.width() > 0 && image.height() > 0)
{
- if (t == "png8" || t == "png256")
- {
- opts.paletted = true;
- }
- else if (t == "png" || t == "png24" || t == "png32")
- {
- opts.paletted = false;
- }
- else if (t == "m=o")
- {
- opts.use_hextree = false;
- }
- else if (t == "m=h")
- {
- opts.use_hextree = true;
- }
- else if (t == "e=miniz")
+ std::string t = type;
+ std::transform(t.begin(), t.end(), t.begin(), ::tolower);
+ if (t == "png" || boost::algorithm::starts_with(t, "png"))
{
- opts.use_miniz = true;
+ png_saver_pal visitor(stream, t, palette);
+ mapnik::util::apply_visitor(visitor, image);
}
- else if (boost::algorithm::starts_with(t, "c="))
+ else if (boost::algorithm::starts_with(t, "tif"))
{
- set_colors = true;
- if (!mapnik::util::string2int(t.substr(2),opts.colors) || opts.colors < 1 || opts.colors > 256)
- {
- throw ImageWriterException("invalid color parameter: " + t.substr(2));
- }
+ throw image_writer_exception("palettes are not currently supported when writing to tiff format (yet)");
}
- else if (boost::algorithm::starts_with(t, "t="))
+ else if (boost::algorithm::starts_with(t, "jpeg"))
{
- if (!mapnik::util::string2int(t.substr(2),opts.trans_mode) || opts.trans_mode < 0 || opts.trans_mode > 2)
- {
- throw ImageWriterException("invalid trans_mode parameter: " + t.substr(2));
- }
+ throw image_writer_exception("palettes are not currently supported when writing to jpeg format");
}
- else if (boost::algorithm::starts_with(t, "g="))
+ else throw image_writer_exception("unknown file type: " + type);
+ }
+ else throw image_writer_exception("Could not write to empty stream" );
+}
+
+// This can be removed once image_any and image_view_any are the only
+// items using this template
+template <>
+MAPNIK_DECL void save_to_stream<image_rgba8>(image_rgba8 const& image,
+ std::ostream & stream,
+ std::string const& type,
+ rgba_palette const& palette)
+{
+ if (stream && image.width() > 0 && image.height() > 0)
+ {
+ std::string t = type;
+ std::transform(t.begin(), t.end(), t.begin(), ::tolower);
+ if (t == "png" || boost::algorithm::starts_with(t, "png"))
{
- set_gamma = true;
- if (!mapnik::util::string2double(t.substr(2),opts.gamma) || opts.gamma < 0)
- {
- throw ImageWriterException("invalid gamma parameter: " + t.substr(2));
- }
- }
- else if (boost::algorithm::starts_with(t, "z="))
- {
- /*
- #define Z_NO_COMPRESSION 0
- #define Z_BEST_SPEED 1
- #define Z_BEST_COMPRESSION 9
- #define Z_DEFAULT_COMPRESSION (-1)
- */
- if (!mapnik::util::string2int(t.substr(2),opts.compression)
- || opts.compression < Z_DEFAULT_COMPRESSION
- || opts.compression > 10) // use 10 here rather than Z_BEST_COMPRESSION (9) to allow for MZ_UBER_COMPRESSION
- {
- throw ImageWriterException("invalid compression parameter: " + t.substr(2) + " (only -1 through 10 are valid)");
- }
+ png_saver_pal visitor(stream, t, palette);
+ visitor(image);
+ //mapnik::util::apply_visitor(visitor, image);
}
- else if (boost::algorithm::starts_with(t, "s="))
+ else if (boost::algorithm::starts_with(t, "tif"))
{
- std::string s = t.substr(2);
- if (s == "default")
- {
- opts.strategy = Z_DEFAULT_STRATEGY;
- }
- else if (s == "filtered")
- {
- opts.strategy = Z_FILTERED;
- }
- else if (s == "huff")
- {
- opts.strategy = Z_HUFFMAN_ONLY;
- }
- else if (s == "rle")
- {
- opts.strategy = Z_RLE;
- }
- else if (s == "fixed")
- {
- opts.strategy = Z_FIXED;
- }
- else
- {
- throw ImageWriterException("invalid compression strategy parameter: " + s);
- }
+ throw image_writer_exception("palettes are not currently supported when writing to tiff format (yet)");
}
- else
+ else if (boost::algorithm::starts_with(t, "jpeg"))
{
- throw ImageWriterException("unhandled png option: " + t);
+ throw image_writer_exception("palettes are not currently supported when writing to jpeg format");
}
+ else throw image_writer_exception("unknown file type: " + type);
}
- // validation
- if (!opts.paletted && set_colors)
- {
- throw ImageWriterException("invalid color parameter: unavailable for true color (non-paletted) images");
- }
- if (!opts.paletted && set_gamma)
- {
- throw ImageWriterException("invalid gamma parameter: unavailable for true color (non-paletted) images");
- }
- if ((opts.use_miniz == false) && opts.compression > Z_BEST_COMPRESSION)
- {
- throw ImageWriterException("invalid compression value: (only -1 through 9 are valid)");
- }
+ else throw image_writer_exception("Could not write to empty stream" );
}
-#endif
-#if defined(HAVE_WEBP)
-void handle_webp_options(std::string const& type,
- WebPConfig & config,
- bool & alpha)
+// This can be removed once image_any and image_view_any are the only
+// items using this template
+template <>
+MAPNIK_DECL void save_to_stream<image_view_rgba8>(image_view_rgba8 const& image,
+ std::ostream & stream,
+ std::string const& type,
+ rgba_palette const& palette)
{
- if (type == "webp")
+ if (stream && image.width() > 0 && image.height() > 0)
{
- return;
- }
- if (type.length() > 4){
- boost::char_separator<char> sep(":");
- boost::tokenizer< boost::char_separator<char> > tokens(type, sep);
- for (auto const& t : tokens)
+ std::string t = type;
+ std::transform(t.begin(), t.end(), t.begin(), ::tolower);
+ if (t == "png" || boost::algorithm::starts_with(t, "png"))
{
- if (t == "webp")
- {
- continue;
- }
- else if (boost::algorithm::starts_with(t, "quality="))
- {
- std::string val = t.substr(8);
- if (!val.empty())
- {
- double quality = 90;
- if (!mapnik::util::string2double(val,quality) || quality < 0.0 || quality > 100.0)
- {
- throw ImageWriterException("invalid webp quality: '" + val + "'");
- }
- config.quality = static_cast<float>(quality);
- }
- }
- else if (boost::algorithm::starts_with(t, "method="))
- {
- std::string val = t.substr(7);
- if (!val.empty())
- {
- if (!mapnik::util::string2int(val,config.method) || config.method < 0 || config.method > 6)
- {
- throw ImageWriterException("invalid webp method: '" + val + "'");
- }
- }
- }
- else if (boost::algorithm::starts_with(t, "lossless="))
- {
- std::string val = t.substr(9);
- if (!val.empty())
- {
- #if (WEBP_ENCODER_ABI_VERSION >> 8) >= 1 // >= v0.1.99 / 0x0100
- if (!mapnik::util::string2int(val,config.lossless) || config.lossless < 0 || config.lossless > 1)
- {
- throw ImageWriterException("invalid webp lossless: '" + val + "'");
- }
- #else
- #ifdef _MSC_VER
- #pragma NOTE(compiling against webp that does not support the lossless flag)
- #else
- #warning "compiling against webp that does not support the lossless flag"
- #endif
- throw ImageWriterException("your webp version does not support the lossless option");
- #endif
- }
- }
- else if (boost::algorithm::starts_with(t, "image_hint="))
- {
- std::string val = t.substr(11);
- if (!val.empty())
- {
- #if (WEBP_ENCODER_ABI_VERSION >> 8) >= 1 // >= v0.1.99 / 0x0100
- int image_hint = 0;
- if (!mapnik::util::string2int(val,image_hint) || image_hint < 0 || image_hint > 3)
- {
- throw ImageWriterException("invalid webp image_hint: '" + val + "'");
- }
- config.image_hint = static_cast<WebPImageHint>(image_hint);
- #else
- #ifdef _MSC_VER
- #pragma NOTE(compiling against webp that does not support the image_hint flag)
- #else
- #warning "compiling against webp that does not support the image_hint flag"
- #endif
- throw ImageWriterException("your webp version does not support the image_hint option");
- #endif
- }
- }
- else if (boost::algorithm::starts_with(t, "alpha="))
- {
- std::string val = t.substr(6);
- if (!val.empty())
- {
- if (!mapnik::util::string2bool(val,alpha))
- {
- throw ImageWriterException("invalid webp alpha: '" + val + "'");
- }
- }
- }
- else if (boost::algorithm::starts_with(t, "target_size="))
- {
- std::string val = t.substr(12);
- if (!val.empty())
- {
- if (!mapnik::util::string2int(val,config.target_size))
- {
- throw ImageWriterException("invalid webp target_size: '" + val + "'");
- }
- }
- }
- else if (boost::algorithm::starts_with(t, "target_psnr="))
- {
- std::string val = t.substr(12);
- if (!val.empty())
- {
- double psnr = 0;
- if (!mapnik::util::string2double(val,psnr))
- {
- throw ImageWriterException("invalid webp target_psnr: '" + val + "'");
- }
- config.target_PSNR = psnr;
- }
- }
- else if (boost::algorithm::starts_with(t, "segments="))
- {
- std::string val = t.substr(9);
- if (!val.empty())
- {
- if (!mapnik::util::string2int(val,config.segments))
- {
- throw ImageWriterException("invalid webp segments: '" + val + "'");
- }
- }
- }
- else if (boost::algorithm::starts_with(t, "sns_strength="))
- {
- std::string val = t.substr(13);
- if (!val.empty())
- {
- if (!mapnik::util::string2int(val,config.sns_strength))
- {
- throw ImageWriterException("invalid webp sns_strength: '" + val + "'");
- }
- }
- }
- else if (boost::algorithm::starts_with(t, "filter_strength="))
- {
- std::string val = t.substr(16);
- if (!val.empty())
- {
- if (!mapnik::util::string2int(val,config.filter_strength))
- {
- throw ImageWriterException("invalid webp filter_strength: '" + val + "'");
- }
- }
- }
- else if (boost::algorithm::starts_with(t, "filter_sharpness="))
- {
- std::string val = t.substr(17);
- if (!val.empty())
- {
- if (!mapnik::util::string2int(val,config.filter_sharpness))
- {
- throw ImageWriterException("invalid webp filter_sharpness: '" + val + "'");
- }
- }
- }
- else if (boost::algorithm::starts_with(t, "filter_type="))
- {
- std::string val = t.substr(12);
- if (!val.empty())
- {
- if (!mapnik::util::string2int(val,config.filter_type))
- {
- throw ImageWriterException("invalid webp filter_type: '" + val + "'");
- }
- }
- }
- else if (boost::algorithm::starts_with(t, "autofilter="))
- {
- std::string val = t.substr(11);
- if (!val.empty())
- {
- if (!mapnik::util::string2int(val,config.autofilter))
- {
- throw ImageWriterException("invalid webp autofilter: '" + val + "'");
- }
- }
- }
- else if (boost::algorithm::starts_with(t, "alpha_compression="))
- {
- std::string val = t.substr(18);
- if (!val.empty())
- {
- if (!mapnik::util::string2int(val,config.alpha_compression))
- {
- throw ImageWriterException("invalid webp alpha_compression: '" + val + "'");
- }
- }
- }
- else if (boost::algorithm::starts_with(t, "alpha_filtering="))
- {
- std::string val = t.substr(16);
- if (!val.empty())
- {
- #if (WEBP_ENCODER_ABI_VERSION >> 8) >= 1 // >= v0.1.99 / 0x0100
- if (!mapnik::util::string2int(val,config.alpha_filtering))
- {
- throw ImageWriterException("invalid webp alpha_filtering: '" + val + "'");
- }
- #else
- #ifdef _MSC_VER
- #pragma NOTE(compiling against webp that does not support the alpha_filtering flag)
- #else
- #warning "compiling against webp that does not support the alpha_filtering flag"
- #endif
- throw ImageWriterException("your webp version does not support the alpha_filtering option");
- #endif
- }
- }
- else if (boost::algorithm::starts_with(t, "alpha_quality="))
- {
- std::string val = t.substr(14);
- if (!val.empty())
- {
- #if (WEBP_ENCODER_ABI_VERSION >> 8) >= 1 // >= v0.1.99 / 0x0100
- if (!mapnik::util::string2int(val,config.alpha_quality))
- {
- throw ImageWriterException("invalid webp alpha_quality: '" + val + "'");
- }
- #else
- #ifdef _MSC_VER
- #pragma NOTE(compiling against webp that does not support the alpha_quality flag)
- #else
- #warning "compiling against webp that does not support the alpha_quality flag"
- #endif
- throw ImageWriterException("your webp version does not support the alpha_quality option");
- #endif
- }
- }
- else if (boost::algorithm::starts_with(t, "pass="))
- {
- std::string val = t.substr(5);
- if (!val.empty())
- {
- if (!mapnik::util::string2int(val,config.pass))
- {
- throw ImageWriterException("invalid webp pass: '" + val + "'");
- }
- }
- }
- else if (boost::algorithm::starts_with(t, "preprocessing="))
- {
- std::string val = t.substr(14);
- if (!val.empty())
- {
- if (!mapnik::util::string2int(val,config.preprocessing))
- {
- throw ImageWriterException("invalid webp preprocessing: '" + val + "'");
- }
- }
- }
- else if (boost::algorithm::starts_with(t, "partitions="))
- {
- std::string val = t.substr(11);
- if (!val.empty())
- {
- if (!mapnik::util::string2int(val,config.partitions))
- {
- throw ImageWriterException("invalid webp partitions: '" + val + "'");
- }
- }
- }
- else if (boost::algorithm::starts_with(t, "partition_limit="))
- {
- std::string val = t.substr(16);
- if (!val.empty())
- {
- if (!mapnik::util::string2int(val,config.partition_limit))
- {
- throw ImageWriterException("invalid webp partition_limit: '" + val + "'");
- }
- }
- }
- else
- {
- throw ImageWriterException("unhandled webp option: " + t);
- }
+ png_saver_pal visitor(stream, t, palette);
+ visitor(image);
+ //mapnik::util::apply_visitor(visitor, image);
+ }
+ else if (boost::algorithm::starts_with(t, "tif"))
+ {
+ throw image_writer_exception("palettes are not currently supported when writing to tiff format (yet)");
}
+ else if (boost::algorithm::starts_with(t, "jpeg"))
+ {
+ throw image_writer_exception("palettes are not currently supported when writing to jpeg format");
+ }
+ else throw image_writer_exception("unknown file type: " + type);
}
+ else throw image_writer_exception("Could not write to empty stream" );
}
-#endif
template <typename T>
-void save_to_stream(T const& image,
- std::ostream & stream,
- std::string const& type,
- rgba_palette const& palette)
+MAPNIK_DECL void save_to_stream(T const& image,
+ std::ostream & stream,
+ std::string const& type)
{
if (stream && image.width() > 0 && image.height() > 0)
{
@@ -556,39 +208,35 @@ void save_to_stream(T const& image,
std::transform(t.begin(), t.end(), t.begin(), ::tolower);
if (t == "png" || boost::algorithm::starts_with(t, "png"))
{
-#if defined(HAVE_PNG)
- if (palette.valid())
- {
- png_options opts;
- handle_png_options(t,opts);
- save_as_png8_pal(stream, image, palette, opts);
- }
- else
- {
- save_to_stream(image,stream,type);
- }
-#else
- throw ImageWriterException("png output is not enabled in your build of Mapnik");
-#endif
+ png_saver visitor(stream, t);
+ util::apply_visitor(visitor, image);
}
else if (boost::algorithm::starts_with(t, "tif"))
{
- throw ImageWriterException("palettes are not currently supported when writing to tiff format (yet)");
+ tiff_saver visitor(stream, t);
+ util::apply_visitor(visitor, image);
}
else if (boost::algorithm::starts_with(t, "jpeg"))
{
- throw ImageWriterException("palettes are not currently supported when writing to jpeg format");
+ jpeg_saver visitor(stream, t);
+ util::apply_visitor(visitor, image);
+ }
+ else if (boost::algorithm::starts_with(t, "webp"))
+ {
+ webp_saver visitor(stream, t);
+ util::apply_visitor(visitor, image);
}
- else throw ImageWriterException("unknown file type: " + type);
+ else throw image_writer_exception("unknown file type: " + type);
}
- else throw ImageWriterException("Could not write to empty stream" );
+ else throw image_writer_exception("Could not write to empty stream" );
}
-
-template <typename T>
-void save_to_stream(T const& image,
- std::ostream & stream,
- std::string const& type)
+// This can be removed once image_any and image_view_any are the only
+// items using this template
+template <>
+MAPNIK_DECL void save_to_stream<image_rgba8>(image_rgba8 const& image,
+ std::ostream & stream,
+ std::string const& type)
{
if (stream && image.width() > 0 && image.height() > 0)
{
@@ -596,256 +244,2246 @@ void save_to_stream(T const& image,
std::transform(t.begin(), t.end(), t.begin(), ::tolower);
if (t == "png" || boost::algorithm::starts_with(t, "png"))
{
-#if defined(HAVE_PNG)
- png_options opts;
- handle_png_options(t,opts);
- if (opts.paletted)
- {
- if (opts.use_hextree)
- {
- save_as_png8_hex(stream, image, opts);
- }
- else
- {
- save_as_png8_oct(stream, image, opts);
- }
- }
- else
- {
- save_as_png(stream, image, opts);
- }
-#else
- throw ImageWriterException("png output is not enabled in your build of Mapnik");
-#endif
+ png_saver visitor(stream, t);
+ visitor(image);
+ //util::apply_visitor(visitor, image);
}
else if (boost::algorithm::starts_with(t, "tif"))
{
-#if defined(HAVE_TIFF)
- save_as_tiff(stream, image);
-#else
- throw ImageWriterException("tiff output is not enabled in your build of Mapnik");
-#endif
+ tiff_saver visitor(stream, t);
+ visitor(image);
+ //util::apply_visitor(visitor, image);
}
else if (boost::algorithm::starts_with(t, "jpeg"))
{
-#if defined(HAVE_JPEG)
- int quality = 85;
- std::string val = t.substr(4);
- if (!val.empty())
- {
- if (!mapnik::util::string2int(val,quality) || quality < 0 || quality > 100)
- {
- throw ImageWriterException("invalid jpeg quality: '" + val + "'");
- }
- }
- save_as_jpeg(stream, quality, image);
-#else
- throw ImageWriterException("jpeg output is not enabled in your build of Mapnik");
-#endif
+ jpeg_saver visitor(stream, t);
+ visitor(image);
+ //util::apply_visitor(visitor, image);
}
else if (boost::algorithm::starts_with(t, "webp"))
{
-#if defined(HAVE_WEBP)
- WebPConfig config;
- // Default values set here will be lossless=0 and quality=75 (as least as of webp v0.3.1)
- if (!WebPConfigInit(&config))
- {
- throw std::runtime_error("version mismatch");
- }
- // see for more details: https://github.com/mapnik/mapnik/wiki/Image-IO#webp-output-options
- bool alpha = true;
- handle_webp_options(t,config,alpha);
- save_as_webp(stream,image,config,alpha);
-#else
- throw ImageWriterException("webp output is not enabled in your build of Mapnik");
-#endif
+ webp_saver visitor(stream, t);
+ visitor(image);
+ //util::apply_visitor(visitor, image);
}
- else throw ImageWriterException("unknown file type: " + type);
+ else throw image_writer_exception("unknown file type: " + type);
}
- else throw ImageWriterException("Could not write to empty stream" );
+ else throw image_writer_exception("Could not write to empty stream" );
}
-template <typename T>
-void save_to_file(T const& image, std::string const& filename)
+// This can be removed once image_any and image_view_any are the only
+// items using this template
+template <>
+MAPNIK_DECL void save_to_stream<image_view_rgba8>(image_view_rgba8 const& image,
+ std::ostream & stream,
+ std::string const& type)
{
- boost::optional<std::string> type = type_from_filename(filename);
- if (type)
+ if (stream && image.width() > 0 && image.height() > 0)
{
- save_to_file<T>(image, filename, *type);
- }
- else throw ImageWriterException("Could not write file to " + filename );
-}
+ std::string t = type;
+ std::transform(t.begin(), t.end(), t.begin(), ::tolower);
+ if (t == "png" || boost::algorithm::starts_with(t, "png"))
+ {
+ png_saver visitor(stream, t);
+ visitor(image);
+ //util::apply_visitor(visitor, image);
+ }
+ else if (boost::algorithm::starts_with(t, "tif"))
+ {
+ tiff_saver visitor(stream, t);
+ visitor(image);
+ //util::apply_visitor(visitor, image);
+ }
+ else if (boost::algorithm::starts_with(t, "jpeg"))
+ {
+ jpeg_saver visitor(stream, t);
+ visitor(image);
+ //util::apply_visitor(visitor, image);
+ }
+ else if (boost::algorithm::starts_with(t, "webp"))
+ {
+ webp_saver visitor(stream, t);
+ visitor(image);
+ //util::apply_visitor(visitor, image);
+ }
+ else throw image_writer_exception("unknown file type: " + type);
+ }
+ else throw image_writer_exception("Could not write to empty stream" );
+}
template <typename T>
-void save_to_file(T const& image, std::string const& filename, rgba_palette const& palette)
+MAPNIK_DECL void save_to_file(T const& image, std::string const& filename)
{
boost::optional<std::string> type = type_from_filename(filename);
if (type)
{
- save_to_file<T>(image, filename, *type, palette);
+ save_to_file<T>(image, filename, *type);
}
- else throw ImageWriterException("Could not write file to " + filename );
+ else throw image_writer_exception("Could not write file to " + filename );
}
-#if defined(HAVE_CAIRO)
-// TODO - move to separate cairo_io.hpp
-void save_to_cairo_file(mapnik::Map const& map, std::string const& filename, double scale_factor, double scale_denominator)
+template <typename T>
+MAPNIK_DECL void save_to_file(T const& image, std::string const& filename, rgba_palette const& palette)
{
boost::optional<std::string> type = type_from_filename(filename);
if (type)
{
- save_to_cairo_file(map,filename,*type,scale_factor,scale_denominator);
+ save_to_file<T>(image, filename, *type, palette);
}
- else throw ImageWriterException("Could not write file to " + filename );
+ else throw image_writer_exception("Could not write file to " + filename );
}
-void save_to_cairo_file(mapnik::Map const& map,
- std::string const& filename,
- std::string const& type,
- double scale_factor,
- double scale_denominator)
+// image_rgba8
+template MAPNIK_DECL void save_to_file<image_rgba8>(image_rgba8 const&,
+ std::string const&,
+ std::string const&);
+
+template MAPNIK_DECL void save_to_file<image_rgba8>(image_rgba8 const&,
+ std::string const&,
+ std::string const&,
+ rgba_palette const& palette);
+
+template MAPNIK_DECL void save_to_file<image_rgba8>(image_rgba8 const&,
+ std::string const&);
+
+template MAPNIK_DECL void save_to_file<image_rgba8>(image_rgba8 const&,
+ std::string const&,
+ rgba_palette const& palette);
+
+template MAPNIK_DECL std::string save_to_string<image_rgba8>(image_rgba8 const&,
+ std::string const&);
+
+template MAPNIK_DECL std::string save_to_string<image_rgba8>(image_rgba8 const&,
+ std::string const&,
+ rgba_palette const& palette);
+
+// image_view_any
+template MAPNIK_DECL void save_to_file<image_view_any> (image_view_any const&,
+ std::string const&,
+ std::string const&);
+
+template MAPNIK_DECL void save_to_file<image_view_any> (image_view_any const&,
+ std::string const&,
+ std::string const&,
+ rgba_palette const& palette);
+
+template MAPNIK_DECL void save_to_file<image_view_any> (image_view_any const&,
+ std::string const&);
+
+template MAPNIK_DECL void save_to_file<image_view_any> (image_view_any const&,
+ std::string const&,
+ rgba_palette const& palette);
+
+template MAPNIK_DECL std::string save_to_string<image_view_any> (image_view_any const&,
+ std::string const&);
+
+template MAPNIK_DECL std::string save_to_string<image_view_any> (image_view_any const&,
+ std::string const&,
+ rgba_palette const& palette);
+
+// image_any
+template MAPNIK_DECL void save_to_file<image_any>(image_any const&,
+ std::string const&,
+ std::string const&);
+
+template MAPNIK_DECL void save_to_file<image_any>(image_any const&,
+ std::string const&,
+ std::string const&,
+ rgba_palette const& palette);
+
+template MAPNIK_DECL void save_to_file<image_any>(image_any const&,
+ std::string const&);
+
+template MAPNIK_DECL void save_to_file<image_any>(image_any const&,
+ std::string const&,
+ rgba_palette const& palette);
+
+template MAPNIK_DECL std::string save_to_string<image_any>(image_any const&,
+ std::string const&);
+
+template MAPNIK_DECL std::string save_to_string<image_any>(image_any const&,
+ std::string const&,
+ rgba_palette const& palette);
+
+namespace detail {
+
+struct is_solid_visitor
{
- std::ofstream file (filename.c_str(), std::ios::out|std::ios::trunc|std::ios::binary);
- if (file)
+ bool operator() (image_view_null const&) const
+ {
+ return true;
+ }
+
+ bool operator() (image_null const&) const
+ {
+ return true;
+ }
+
+ template <typename T>
+ bool operator() (T const & data) const
{
- cairo_surface_ptr surface;
- unsigned width = map.width();
- unsigned height = map.height();
- if (type == "pdf")
+ using pixel_type = typename T::pixel_type;
+ if (data.width() > 0 && data.height() > 0)
{
-#ifdef CAIRO_HAS_PDF_SURFACE
- surface = cairo_surface_ptr(cairo_pdf_surface_create(filename.c_str(),width,height),cairo_surface_closer());
-#else
- throw ImageWriterException("PDFSurface not supported in the cairo backend");
-#endif
+ pixel_type const* first_row = data.get_row(0);
+ pixel_type const first_pixel = first_row[0];
+ for (std::size_t y = 0; y < data.height(); ++y)
+ {
+ pixel_type const * row = data.get_row(y);
+ for (std::size_t x = 0; x < data.width(); ++x)
+ {
+ if (first_pixel != row[x])
+ {
+ return false;
+ }
+ }
+ }
}
-#ifdef CAIRO_HAS_SVG_SURFACE
- else if (type == "svg")
+ return true;
+ }
+};
+
+} // end detail ns
+
+MAPNIK_DECL bool is_solid(image_any const& image)
+{
+ return util::apply_visitor(detail::is_solid_visitor(), image);
+}
+
+MAPNIK_DECL bool is_solid(image_view_any const& image)
+{
+ return util::apply_visitor(detail::is_solid_visitor(), image);
+}
+
+template <typename T>
+MAPNIK_DECL bool is_solid(T const& image)
+{
+ detail::is_solid_visitor visitor;
+ return visitor(image);
+}
+
+template MAPNIK_DECL bool is_solid(image_null const&);
+template MAPNIK_DECL bool is_solid(image_rgba8 const&);
+template MAPNIK_DECL bool is_solid(image_gray8 const&);
+template MAPNIK_DECL bool is_solid(image_gray8s const&);
+template MAPNIK_DECL bool is_solid(image_gray16 const&);
+template MAPNIK_DECL bool is_solid(image_gray16s const&);
+template MAPNIK_DECL bool is_solid(image_gray32 const&);
+template MAPNIK_DECL bool is_solid(image_gray32s const&);
+template MAPNIK_DECL bool is_solid(image_gray32f const&);
+template MAPNIK_DECL bool is_solid(image_gray64 const&);
+template MAPNIK_DECL bool is_solid(image_gray64s const&);
+template MAPNIK_DECL bool is_solid(image_gray64f const&);
+template MAPNIK_DECL bool is_solid(image_view_null const&);
+template MAPNIK_DECL bool is_solid(image_view_rgba8 const&);
+template MAPNIK_DECL bool is_solid(image_view_gray8 const&);
+template MAPNIK_DECL bool is_solid(image_view_gray8s const&);
+template MAPNIK_DECL bool is_solid(image_view_gray16 const&);
+template MAPNIK_DECL bool is_solid(image_view_gray16s const&);
+template MAPNIK_DECL bool is_solid(image_view_gray32 const&);
+template MAPNIK_DECL bool is_solid(image_view_gray32s const&);
+template MAPNIK_DECL bool is_solid(image_view_gray32f const&);
+template MAPNIK_DECL bool is_solid(image_view_gray64 const&);
+template MAPNIK_DECL bool is_solid(image_view_gray64s const&);
+template MAPNIK_DECL bool is_solid(image_view_gray64f const&);
+
+namespace detail {
+
+struct premultiply_visitor
+{
+ bool operator() (image_rgba8 & data) const
+ {
+ if (!data.get_premultiplied())
{
- surface = cairo_surface_ptr(cairo_svg_surface_create(filename.c_str(),width,height),cairo_surface_closer());
+ agg::rendering_buffer buffer(data.bytes(),data.width(),data.height(),data.row_size());
+ agg::pixfmt_rgba32 pixf(buffer);
+ pixf.premultiply();
+ data.set_premultiplied(true);
+ return true;
}
-#endif
-#ifdef CAIRO_HAS_PS_SURFACE
- else if (type == "ps")
+ return false;
+ }
+
+ template <typename T>
+ bool operator() (T &) const
+ {
+ return false;
+ }
+};
+
+struct demultiply_visitor
+{
+ bool operator() (image_rgba8 & data) const
+ {
+ if (data.get_premultiplied())
{
- surface = cairo_surface_ptr(cairo_ps_surface_create(filename.c_str(),width,height),cairo_surface_closer());
+ agg::rendering_buffer buffer(data.bytes(),data.width(),data.height(),data.row_size());
+ agg::pixfmt_rgba32_pre pixf(buffer);
+ pixf.demultiply();
+ data.set_premultiplied(false);
+ return true;
}
-#endif
-#ifdef CAIRO_HAS_IMAGE_SURFACE
- else if (type == "ARGB32")
+ return false;
+ }
+
+ template <typename T>
+ bool operator() (T &) const
+ {
+ return false;
+ }
+};
+
+struct set_premultiplied_visitor
+{
+ set_premultiplied_visitor(bool status)
+ : status_(status) {}
+
+ template <typename T>
+ void operator() (T & data) const
+ {
+ data.set_premultiplied(status_);
+ }
+private:
+ bool const status_;
+};
+
+} // end detail ns
+
+MAPNIK_DECL bool premultiply_alpha(image_any & image)
+{
+ return util::apply_visitor(detail::premultiply_visitor(), image);
+}
+
+template <typename T>
+MAPNIK_DECL bool premultiply_alpha(T & image)
+{
+ detail::premultiply_visitor visit;
+ return visit(image);
+}
+
+template MAPNIK_DECL bool premultiply_alpha(image_rgba8 &);
+template MAPNIK_DECL bool premultiply_alpha(image_gray8 &);
+template MAPNIK_DECL bool premultiply_alpha(image_gray8s &);
+template MAPNIK_DECL bool premultiply_alpha(image_gray16 &);
+template MAPNIK_DECL bool premultiply_alpha(image_gray16s &);
+template MAPNIK_DECL bool premultiply_alpha(image_gray32 &);
+template MAPNIK_DECL bool premultiply_alpha(image_gray32s &);
+template MAPNIK_DECL bool premultiply_alpha(image_gray32f &);
+template MAPNIK_DECL bool premultiply_alpha(image_gray64 &);
+template MAPNIK_DECL bool premultiply_alpha(image_gray64s &);
+template MAPNIK_DECL bool premultiply_alpha(image_gray64f &);
+
+MAPNIK_DECL bool demultiply_alpha(image_any & image)
+{
+ return util::apply_visitor(detail::demultiply_visitor(), image);
+}
+
+template <typename T>
+MAPNIK_DECL bool demultiply_alpha(T & image)
+{
+ detail::demultiply_visitor visit;
+ return visit(image);
+}
+
+template MAPNIK_DECL bool demultiply_alpha(image_rgba8 &);
+template MAPNIK_DECL bool demultiply_alpha(image_gray8 &);
+template MAPNIK_DECL bool demultiply_alpha(image_gray8s &);
+template MAPNIK_DECL bool demultiply_alpha(image_gray16 &);
+template MAPNIK_DECL bool demultiply_alpha(image_gray16s &);
+template MAPNIK_DECL bool demultiply_alpha(image_gray32 &);
+template MAPNIK_DECL bool demultiply_alpha(image_gray32s &);
+template MAPNIK_DECL bool demultiply_alpha(image_gray32f &);
+template MAPNIK_DECL bool demultiply_alpha(image_gray64 &);
+template MAPNIK_DECL bool demultiply_alpha(image_gray64s &);
+template MAPNIK_DECL bool demultiply_alpha(image_gray64f &);
+
+MAPNIK_DECL void set_premultiplied_alpha(image_any & image, bool status)
+{
+ util::apply_visitor(detail::set_premultiplied_visitor(status), image);
+}
+
+template <typename T>
+MAPNIK_DECL void set_premultiplied_alpha(T & image, bool status)
+{
+ detail::set_premultiplied_visitor visit(status);
+ visit(image);
+}
+
+template MAPNIK_DECL void set_premultiplied_alpha(image_rgba8 &, bool);
+template MAPNIK_DECL void set_premultiplied_alpha(image_gray8 &, bool);
+template MAPNIK_DECL void set_premultiplied_alpha(image_gray8s &, bool);
+template MAPNIK_DECL void set_premultiplied_alpha(image_gray16 &, bool);
+template MAPNIK_DECL void set_premultiplied_alpha(image_gray16s &, bool);
+template MAPNIK_DECL void set_premultiplied_alpha(image_gray32 &, bool);
+template MAPNIK_DECL void set_premultiplied_alpha(image_gray32s &, bool);
+template MAPNIK_DECL void set_premultiplied_alpha(image_gray32f &, bool);
+template MAPNIK_DECL void set_premultiplied_alpha(image_gray64 &, bool);
+template MAPNIK_DECL void set_premultiplied_alpha(image_gray64s &, bool);
+template MAPNIK_DECL void set_premultiplied_alpha(image_gray64f &, bool);
+
+namespace detail {
+
+namespace {
+
+template <typename T>
+inline T clamp(T d, T min, T max)
+{
+ T const t = d < min ? min : d;
+ return t > max ? max : t;
+}
+
+}
+struct visitor_apply_opacity
+{
+ visitor_apply_opacity(float opacity)
+ : opacity_(clamp(opacity, 0.0f, 1.0f)) {}
+
+ void operator() (image_rgba8 & data) const
+ {
+ using pixel_type = image_rgba8::pixel_type;
+ for (std::size_t y = 0; y < data.height(); ++y)
{
- surface = cairo_surface_ptr(cairo_image_surface_create(CAIRO_FORMAT_ARGB32,width,height),cairo_surface_closer());
+ pixel_type* row_to = data.get_row(y);
+ for (std::size_t x = 0; x < data.width(); ++x)
+ {
+ pixel_type rgba = row_to[x];
+ pixel_type a = static_cast<pixel_type>(((rgba >> 24) & 0xff) * opacity_);
+ pixel_type r = rgba & 0xff;
+ pixel_type g = (rgba >> 8 ) & 0xff;
+ pixel_type b = (rgba >> 16) & 0xff;
+
+ row_to[x] = (a << 24)| (b << 16) | (g << 8) | (r) ;
+ }
}
- else if (type == "RGB24")
+ }
+
+ template <typename T>
+ void operator() (T & data) const
+ {
+ throw std::runtime_error("Error: apply_opacity with " + std::string(typeid(data).name()) + " is not supported");
+ }
+
+private:
+ float const opacity_;
+};
+
+} // end detail ns
+
+MAPNIK_DECL void apply_opacity(image_any & data, float opacity)
+{
+ // Prior to calling the data must not be premultiplied
+ bool remultiply = mapnik::demultiply_alpha(data);
+ util::apply_visitor(detail::visitor_apply_opacity(opacity), data);
+ if (remultiply)
+ {
+ mapnik::premultiply_alpha(data);
+ }
+}
+
+template <typename T>
+MAPNIK_DECL void apply_opacity(T & data, float opacity)
+{
+ // Prior to calling the data must not be premultiplied
+ bool remultiply = mapnik::demultiply_alpha(data);
+ detail::visitor_apply_opacity visit(opacity);
+ visit(data);
+ if (remultiply)
+ {
+ mapnik::premultiply_alpha(data);
+ }
+}
+
+template MAPNIK_DECL void apply_opacity(image_rgba8 &, float);
+template MAPNIK_DECL void apply_opacity(image_gray8 &, float);
+template MAPNIK_DECL void apply_opacity(image_gray8s &, float);
+template MAPNIK_DECL void apply_opacity(image_gray16 &, float);
+template MAPNIK_DECL void apply_opacity(image_gray16s &, float);
+template MAPNIK_DECL void apply_opacity(image_gray32 &, float);
+template MAPNIK_DECL void apply_opacity(image_gray32s &, float);
+template MAPNIK_DECL void apply_opacity(image_gray32f &, float);
+template MAPNIK_DECL void apply_opacity(image_gray64 &, float);
+template MAPNIK_DECL void apply_opacity(image_gray64s &, float);
+template MAPNIK_DECL void apply_opacity(image_gray64f &, float);
+
+namespace detail {
+
+struct visitor_set_grayscale_to_alpha
+{
+ void operator() (image_rgba8 & data) const
+ {
+ using pixel_type = image_rgba8::pixel_type;
+ for (std::size_t y = 0; y < data.height(); ++y)
{
- surface = cairo_surface_ptr(cairo_image_surface_create(CAIRO_FORMAT_RGB24,width,height),cairo_surface_closer());
+ pixel_type* row_from = data.get_row(y);
+ for (std::size_t x = 0; x < data.width(); ++x)
+ {
+ pixel_type rgba = row_from[x];
+ pixel_type r = rgba & 0xff;
+ pixel_type g = (rgba >> 8 ) & 0xff;
+ pixel_type b = (rgba >> 16) & 0xff;
+
+ // magic numbers for grayscale
+ pixel_type a = static_cast<pixel_type>(std::ceil((r * .3) + (g * .59) + (b * .11)));
+
+ row_from[x] = (a << 24)| (255 << 16) | (255 << 8) | (255) ;
+ }
}
-#endif
- else
+ }
+
+ template <typename T>
+ void operator() (T & data) const
+ {
+ MAPNIK_LOG_WARN(image_util) << "Warning: set_grayscale_to_alpha with " + std::string(typeid(data).name()) + " is not supported, image was not modified";
+ }
+};
+
+struct visitor_set_grayscale_to_alpha_c
+{
+ visitor_set_grayscale_to_alpha_c(color const& c)
+ : c_(c) {}
+
+ void operator() (image_rgba8 & data) const
+ {
+ using pixel_type = image_rgba8::pixel_type;
+ for (std::size_t y = 0; y < data.height(); ++y)
{
- throw ImageWriterException("unknown file type: " + type);
+ pixel_type* row_from = data.get_row(y);
+ for (std::size_t x = 0; x < data.width(); ++x)
+ {
+ pixel_type rgba = row_from[x];
+ pixel_type r = rgba & 0xff;
+ pixel_type g = (rgba >> 8 ) & 0xff;
+ pixel_type b = (rgba >> 16) & 0xff;
+
+ // magic numbers for grayscale
+ pixel_type a = static_cast<pixel_type>(std::ceil((r * .3) + (g * .59) + (b * .11)));
+
+ row_from[x] = (a << 24)| (c_.blue() << 16) | (c_.green() << 8) | (c_.red()) ;
+ }
}
+ }
- //cairo_t * ctx = cairo_create(surface);
+ template <typename T>
+ void operator() (T & data) const
+ {
+ MAPNIK_LOG_WARN(image_util) << "Warning: set_grayscale_to_alpha with " + std::string(typeid(data).name()) + " is not supported, image was not modified";
+ }
- // TODO - expose as user option
- /*
- if (type == "ARGB32" || type == "RGB24")
- {
- context->set_antialias(Cairo::ANTIALIAS_NONE);
- }
- */
+private:
+ color const& c_;
+};
- mapnik::cairo_renderer<cairo_ptr> ren(map, create_context(surface), scale_factor);
- ren.apply(scale_denominator);
+} // end detail ns
- if (type == "ARGB32" || type == "RGB24")
- {
- cairo_surface_write_to_png(&*surface, filename.c_str());
- }
- cairo_surface_finish(&*surface);
+MAPNIK_DECL void set_grayscale_to_alpha(image_any & data)
+{
+ // Prior to calling the data must not be premultiplied
+ bool remultiply = mapnik::demultiply_alpha(data);
+ util::apply_visitor(detail::visitor_set_grayscale_to_alpha(), data);
+ if (remultiply)
+ {
+ mapnik::premultiply_alpha(data);
}
}
-#endif
+template <typename T>
+MAPNIK_DECL void set_grayscale_to_alpha(T & data)
+{
+ // Prior to calling the data must not be premultiplied
+ bool remultiply = mapnik::demultiply_alpha(data);
+ detail::visitor_set_grayscale_to_alpha visit;
+ visit(data);
+ if (remultiply)
+ {
+ mapnik::premultiply_alpha(data);
+ }
+}
-template void save_to_file<image_data_32>(image_data_32 const&,
- std::string const&,
- std::string const&);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_rgba8 &);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray8 &);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray8s &);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray16 &);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray16s &);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray32 &);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray32s &);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray32f &);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray64 &);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray64s &);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray64f &);
-template void save_to_file<image_data_32>(image_data_32 const&,
- std::string const&,
- std::string const&,
- rgba_palette const& palette);
+MAPNIK_DECL void set_grayscale_to_alpha(image_any & data, color const& c)
+{
+ // Prior to calling the data must not be premultiplied
+ bool remultiply = mapnik::demultiply_alpha(data);
+ util::apply_visitor(detail::visitor_set_grayscale_to_alpha_c(c), data);
+ if (remultiply)
+ {
+ mapnik::premultiply_alpha(data);
+ }
+}
-template void save_to_file<image_data_32>(image_data_32 const&,
- std::string const&);
+template <typename T>
+MAPNIK_DECL void set_grayscale_to_alpha(T & data, color const& c)
+{
+ // Prior to calling the data must not be premultiplied
+ bool remultiply = mapnik::demultiply_alpha(data);
+ detail::visitor_set_grayscale_to_alpha_c visit(c);
+ visit(data);
+ if (remultiply)
+ {
+ mapnik::premultiply_alpha(data);
+ }
+}
-template void save_to_file<image_data_32>(image_data_32 const&,
- std::string const&,
- rgba_palette const& palette);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_rgba8 &, color const&);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray8 &, color const&);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray8s &, color const&);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray16 &, color const&);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray16s &, color const&);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray32 &, color const&);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray32s &, color const&);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray32f &, color const&);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray64 &, color const&);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray64s &, color const&);
+template MAPNIK_DECL void set_grayscale_to_alpha(image_gray64f &, color const&);
-template std::string save_to_string<image_data_32>(image_data_32 const&,
- std::string const&);
+namespace detail {
-template std::string save_to_string<image_data_32>(image_data_32 const&,
- std::string const&,
- rgba_palette const& palette);
+struct visitor_set_color_to_alpha
+{
+ visitor_set_color_to_alpha(color const& c)
+ : c_(c) {}
-template void save_to_file<image_view<image_data_32> > (image_view<image_data_32> const&,
- std::string const&,
- std::string const&);
+ void operator() (image_rgba8 & data) const
+ {
+ using pixel_type = image_rgba8::pixel_type;
+ for (std::size_t y = 0; y < data.height(); ++y)
+ {
+ pixel_type* row_from = data.get_row(y);
+ for (std::size_t x = 0; x < data.width(); ++x)
+ {
+ pixel_type rgba = row_from[x];
+ pixel_type r = rgba & 0xff;
+ pixel_type g = (rgba >> 8 ) & 0xff;
+ pixel_type b = (rgba >> 16) & 0xff;
+ if (r == c_.red() && g == c_.green() && b == c_.blue())
+ {
+ row_from[x] = 0;
+ }
+ }
+ }
+ }
-template void save_to_file<image_view<image_data_32> > (image_view<image_data_32> const&,
- std::string const&,
- std::string const&,
- rgba_palette const& palette);
+ template <typename T>
+ void operator() (T & data) const
+ {
+ throw std::runtime_error("Error: set_color_to_alpha with " + std::string(typeid(data).name()) + " is not supported");
+ }
-template void save_to_file<image_view<image_data_32> > (image_view<image_data_32> const&,
- std::string const&);
+private:
+ color const& c_;
-template void save_to_file<image_view<image_data_32> > (image_view<image_data_32> const&,
- std::string const&,
- rgba_palette const& palette);
+};
-template std::string save_to_string<image_view<image_data_32> > (image_view<image_data_32> const&,
- std::string const&);
-template std::string save_to_string<image_view<image_data_32> > (image_view<image_data_32> const&,
- std::string const&,
- rgba_palette const& palette);
+} // end detail ns
-void save_to_file(image_32 const& image,std::string const& file)
+MAPNIK_DECL void set_color_to_alpha (image_any & data, color const& c)
{
- save_to_file<image_data_32>(image.data(), file);
+ // Prior to calling the data must not be premultiplied
+ bool remultiply = mapnik::demultiply_alpha(data);
+ util::apply_visitor(detail::visitor_set_color_to_alpha(c), data);
+ if (remultiply)
+ {
+ mapnik::premultiply_alpha(data);
+ }
}
-void save_to_file (image_32 const& image,
- std::string const& file,
- std::string const& type)
+template <typename T>
+MAPNIK_DECL void set_color_to_alpha(T & data, color const& c)
{
- save_to_file<image_data_32>(image.data(), file, type);
+ // Prior to calling the data must not be premultiplied
+ bool remultiply = mapnik::demultiply_alpha(data);
+ detail::visitor_set_color_to_alpha visit(c);
+ visit(data);
+ if (remultiply)
+ {
+ mapnik::premultiply_alpha(data);
+ }
}
-void save_to_file (image_32 const& image,
- std::string const& file,
- std::string const& type,
- rgba_palette const& palette)
+template MAPNIK_DECL void set_color_to_alpha(image_rgba8 &, color const&);
+template MAPNIK_DECL void set_color_to_alpha(image_gray8 &, color const&);
+template MAPNIK_DECL void set_color_to_alpha(image_gray8s &, color const&);
+template MAPNIK_DECL void set_color_to_alpha(image_gray16 &, color const&);
+template MAPNIK_DECL void set_color_to_alpha(image_gray16s &, color const&);
+template MAPNIK_DECL void set_color_to_alpha(image_gray32 &, color const&);
+template MAPNIK_DECL void set_color_to_alpha(image_gray32s &, color const&);
+template MAPNIK_DECL void set_color_to_alpha(image_gray32f &, color const&);
+template MAPNIK_DECL void set_color_to_alpha(image_gray64 &, color const&);
+template MAPNIK_DECL void set_color_to_alpha(image_gray64s &, color const&);
+template MAPNIK_DECL void set_color_to_alpha(image_gray64f &, color const&);
+
+namespace detail {
+
+template <typename T1>
+struct visitor_fill
{
- save_to_file<image_data_32>(image.data(), file, type, palette);
-}
+ visitor_fill(T1 const& val)
+ : val_(val) {}
+
+ template <typename T2>
+ void operator() (T2 & data) const
+ {
+ using pixel_type = typename T2::pixel_type;
+ pixel_type val;
+ try
+ {
+ val = numeric_cast<pixel_type>(val_);
+ }
+ catch(negative_overflow&)
+ {
+ val = std::numeric_limits<pixel_type>::min();
+ }
+ catch(positive_overflow&)
+ {
+ val = std::numeric_limits<pixel_type>::max();
+ }
+ data.set(val);
+ }
-std::string save_to_string(image_32 const& image,
- std::string const& type)
+private:
+ T1 const& val_;
+};
+
+template<>
+struct visitor_fill<color>
{
- return save_to_string<image_data_32>(image.data(), type);
-}
+ visitor_fill(color const& val)
+ : val_(val) {}
+
+ void operator() (image_rgba8 & data) const
+ {
+ using pixel_type = image_rgba8::pixel_type;
+ pixel_type val = static_cast<pixel_type>(val_.rgba());
+ data.set(val);
+ data.set_premultiplied(val_.get_premultiplied());
+ }
+
+ template <typename T2>
+ void operator() (T2 & data) const
+ {
+ using pixel_type = typename T2::pixel_type;
+ pixel_type val = static_cast<pixel_type>(val_.rgba());
+ data.set(val);
+ }
-std::string save_to_string(image_32 const& image,
- std::string const& type,
- rgba_palette const& palette)
+private:
+ color const& val_;
+};
+
+} // end detail ns
+
+template <typename T>
+MAPNIK_DECL void fill (image_any & data, T const& val)
{
- return save_to_string<image_data_32>(image.data(), type, palette);
+ util::apply_visitor(detail::visitor_fill<T>(val), data);
}
+template MAPNIK_DECL void fill(image_any &, color const&);
+template MAPNIK_DECL void fill(image_any &, uint64_t const&);
+template MAPNIK_DECL void fill(image_any &, int64_t const&);
+template MAPNIK_DECL void fill(image_any &, uint32_t const&);
+template MAPNIK_DECL void fill(image_any &, int32_t const&);
+template MAPNIK_DECL void fill(image_any &, uint16_t const&);
+template MAPNIK_DECL void fill(image_any &, int16_t const&);
+template MAPNIK_DECL void fill(image_any &, uint8_t const&);
+template MAPNIK_DECL void fill(image_any &, int8_t const&);
+template MAPNIK_DECL void fill(image_any &, float const&);
+template MAPNIK_DECL void fill(image_any &, double const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image_rgba8 & data, T const& val)
+{
+ detail::visitor_fill<T> visitor(val);
+ return visitor(data);
}
+
+template MAPNIK_DECL void fill(image_rgba8 &, color const&);
+template MAPNIK_DECL void fill(image_rgba8 &, uint64_t const&);
+template MAPNIK_DECL void fill(image_rgba8 &, int64_t const&);
+template MAPNIK_DECL void fill(image_rgba8 &, uint32_t const&);
+template MAPNIK_DECL void fill(image_rgba8 &, int32_t const&);
+template MAPNIK_DECL void fill(image_rgba8 &, uint16_t const&);
+template MAPNIK_DECL void fill(image_rgba8 &, int16_t const&);
+template MAPNIK_DECL void fill(image_rgba8 &, uint8_t const&);
+template MAPNIK_DECL void fill(image_rgba8 &, int8_t const&);
+template MAPNIK_DECL void fill(image_rgba8 &, float const&);
+template MAPNIK_DECL void fill(image_rgba8 &, double const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image_gray8 & data, T const& val)
+{
+ detail::visitor_fill<T> visitor(val);
+ return visitor(data);
+}
+
+template MAPNIK_DECL void fill(image_gray8 &, color const&);
+template MAPNIK_DECL void fill(image_gray8 &, uint64_t const&);
+template MAPNIK_DECL void fill(image_gray8 &, int64_t const&);
+template MAPNIK_DECL void fill(image_gray8 &, uint32_t const&);
+template MAPNIK_DECL void fill(image_gray8 &, int32_t const&);
+template MAPNIK_DECL void fill(image_gray8 &, uint16_t const&);
+template MAPNIK_DECL void fill(image_gray8 &, int16_t const&);
+template MAPNIK_DECL void fill(image_gray8 &, uint8_t const&);
+template MAPNIK_DECL void fill(image_gray8 &, int8_t const&);
+template MAPNIK_DECL void fill(image_gray8 &, float const&);
+template MAPNIK_DECL void fill(image_gray8 &, double const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image_gray8s & data, T const& val)
+{
+ detail::visitor_fill<T> visitor(val);
+ return visitor(data);
+}
+
+template MAPNIK_DECL void fill(image_gray8s &, color const&);
+template MAPNIK_DECL void fill(image_gray8s &, uint64_t const&);
+template MAPNIK_DECL void fill(image_gray8s &, int64_t const&);
+template MAPNIK_DECL void fill(image_gray8s &, uint32_t const&);
+template MAPNIK_DECL void fill(image_gray8s &, int32_t const&);
+template MAPNIK_DECL void fill(image_gray8s &, uint16_t const&);
+template MAPNIK_DECL void fill(image_gray8s &, int16_t const&);
+template MAPNIK_DECL void fill(image_gray8s &, uint8_t const&);
+template MAPNIK_DECL void fill(image_gray8s &, int8_t const&);
+template MAPNIK_DECL void fill(image_gray8s &, float const&);
+template MAPNIK_DECL void fill(image_gray8s &, double const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image_gray16 & data, T const& val)
+{
+ detail::visitor_fill<T> visitor(val);
+ return visitor(data);
+}
+
+template MAPNIK_DECL void fill(image_gray16 &, color const&);
+template MAPNIK_DECL void fill(image_gray16 &, uint64_t const&);
+template MAPNIK_DECL void fill(image_gray16 &, int64_t const&);
+template MAPNIK_DECL void fill(image_gray16 &, uint32_t const&);
+template MAPNIK_DECL void fill(image_gray16 &, int32_t const&);
+template MAPNIK_DECL void fill(image_gray16 &, uint16_t const&);
+template MAPNIK_DECL void fill(image_gray16 &, int16_t const&);
+template MAPNIK_DECL void fill(image_gray16 &, uint8_t const&);
+template MAPNIK_DECL void fill(image_gray16 &, int8_t const&);
+template MAPNIK_DECL void fill(image_gray16 &, float const&);
+template MAPNIK_DECL void fill(image_gray16 &, double const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image_gray16s & data, T const& val)
+{
+ detail::visitor_fill<T> visitor(val);
+ return visitor(data);
+}
+
+template MAPNIK_DECL void fill(image_gray16s &, color const&);
+template MAPNIK_DECL void fill(image_gray16s &, uint64_t const&);
+template MAPNIK_DECL void fill(image_gray16s &, int64_t const&);
+template MAPNIK_DECL void fill(image_gray16s &, uint32_t const&);
+template MAPNIK_DECL void fill(image_gray16s &, int32_t const&);
+template MAPNIK_DECL void fill(image_gray16s &, uint16_t const&);
+template MAPNIK_DECL void fill(image_gray16s &, int16_t const&);
+template MAPNIK_DECL void fill(image_gray16s &, uint8_t const&);
+template MAPNIK_DECL void fill(image_gray16s &, int8_t const&);
+template MAPNIK_DECL void fill(image_gray16s &, float const&);
+template MAPNIK_DECL void fill(image_gray16s &, double const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image_gray32 & data, T const& val)
+{
+ detail::visitor_fill<T> visitor(val);
+ return visitor(data);
+}
+
+template MAPNIK_DECL void fill(image_gray32 &, color const&);
+template MAPNIK_DECL void fill(image_gray32 &, uint64_t const&);
+template MAPNIK_DECL void fill(image_gray32 &, int64_t const&);
+template MAPNIK_DECL void fill(image_gray32 &, uint32_t const&);
+template MAPNIK_DECL void fill(image_gray32 &, int32_t const&);
+template MAPNIK_DECL void fill(image_gray32 &, uint16_t const&);
+template MAPNIK_DECL void fill(image_gray32 &, int16_t const&);
+template MAPNIK_DECL void fill(image_gray32 &, uint8_t const&);
+template MAPNIK_DECL void fill(image_gray32 &, int8_t const&);
+template MAPNIK_DECL void fill(image_gray32 &, float const&);
+template MAPNIK_DECL void fill(image_gray32 &, double const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image_gray32s & data, T const& val)
+{
+ detail::visitor_fill<T> visitor(val);
+ return visitor(data);
+}
+
+template MAPNIK_DECL void fill(image_gray32s &, color const&);
+template MAPNIK_DECL void fill(image_gray32s &, uint64_t const&);
+template MAPNIK_DECL void fill(image_gray32s &, int64_t const&);
+template MAPNIK_DECL void fill(image_gray32s &, uint32_t const&);
+template MAPNIK_DECL void fill(image_gray32s &, int32_t const&);
+template MAPNIK_DECL void fill(image_gray32s &, uint16_t const&);
+template MAPNIK_DECL void fill(image_gray32s &, int16_t const&);
+template MAPNIK_DECL void fill(image_gray32s &, uint8_t const&);
+template MAPNIK_DECL void fill(image_gray32s &, int8_t const&);
+template MAPNIK_DECL void fill(image_gray32s &, float const&);
+template MAPNIK_DECL void fill(image_gray32s &, double const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image_gray32f & data, T const& val)
+{
+ detail::visitor_fill<T> visitor(val);
+ return visitor(data);
+}
+
+template MAPNIK_DECL void fill(image_gray32f &, color const&);
+template MAPNIK_DECL void fill(image_gray32f &, uint64_t const&);
+template MAPNIK_DECL void fill(image_gray32f &, int64_t const&);
+template MAPNIK_DECL void fill(image_gray32f &, uint32_t const&);
+template MAPNIK_DECL void fill(image_gray32f &, int32_t const&);
+template MAPNIK_DECL void fill(image_gray32f &, uint16_t const&);
+template MAPNIK_DECL void fill(image_gray32f &, int16_t const&);
+template MAPNIK_DECL void fill(image_gray32f &, uint8_t const&);
+template MAPNIK_DECL void fill(image_gray32f &, int8_t const&);
+template MAPNIK_DECL void fill(image_gray32f &, float const&);
+template MAPNIK_DECL void fill(image_gray32f &, double const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image_gray64 & data, T const& val)
+{
+ detail::visitor_fill<T> visitor(val);
+ return visitor(data);
+}
+
+template MAPNIK_DECL void fill(image_gray64 &, color const&);
+template MAPNIK_DECL void fill(image_gray64 &, uint64_t const&);
+template MAPNIK_DECL void fill(image_gray64 &, int64_t const&);
+template MAPNIK_DECL void fill(image_gray64 &, uint32_t const&);
+template MAPNIK_DECL void fill(image_gray64 &, int32_t const&);
+template MAPNIK_DECL void fill(image_gray64 &, uint16_t const&);
+template MAPNIK_DECL void fill(image_gray64 &, int16_t const&);
+template MAPNIK_DECL void fill(image_gray64 &, uint8_t const&);
+template MAPNIK_DECL void fill(image_gray64 &, int8_t const&);
+template MAPNIK_DECL void fill(image_gray64 &, float const&);
+template MAPNIK_DECL void fill(image_gray64 &, double const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image_gray64s & data, T const& val)
+{
+ detail::visitor_fill<T> visitor(val);
+ return visitor(data);
+}
+
+template MAPNIK_DECL void fill(image_gray64s &, color const&);
+template MAPNIK_DECL void fill(image_gray64s &, uint64_t const&);
+template MAPNIK_DECL void fill(image_gray64s &, int64_t const&);
+template MAPNIK_DECL void fill(image_gray64s &, uint32_t const&);
+template MAPNIK_DECL void fill(image_gray64s &, int32_t const&);
+template MAPNIK_DECL void fill(image_gray64s &, uint16_t const&);
+template MAPNIK_DECL void fill(image_gray64s &, int16_t const&);
+template MAPNIK_DECL void fill(image_gray64s &, uint8_t const&);
+template MAPNIK_DECL void fill(image_gray64s &, int8_t const&);
+template MAPNIK_DECL void fill(image_gray64s &, float const&);
+template MAPNIK_DECL void fill(image_gray64s &, double const&);
+
+template <typename T>
+MAPNIK_DECL void fill (image_gray64f & data, T const& val)
+{
+ detail::visitor_fill<T> visitor(val);
+ return visitor(data);
+}
+
+template MAPNIK_DECL void fill(image_gray64f &, color const&);
+template MAPNIK_DECL void fill(image_gray64f &, uint64_t const&);
+template MAPNIK_DECL void fill(image_gray64f &, int64_t const&);
+template MAPNIK_DECL void fill(image_gray64f &, uint32_t const&);
+template MAPNIK_DECL void fill(image_gray64f &, int32_t const&);
+template MAPNIK_DECL void fill(image_gray64f &, uint16_t const&);
+template MAPNIK_DECL void fill(image_gray64f &, int16_t const&);
+template MAPNIK_DECL void fill(image_gray64f &, uint8_t const&);
+template MAPNIK_DECL void fill(image_gray64f &, int8_t const&);
+template MAPNIK_DECL void fill(image_gray64f &, float const&);
+template MAPNIK_DECL void fill(image_gray64f &, double const&);
+
+namespace detail {
+
+struct visitor_set_rectangle
+{
+ visitor_set_rectangle(image_any const & src, std::size_t x0, std::size_t y0)
+ : src_(src), x0_(x0), y0_(y0) {}
+
+ void operator()(image_rgba8 & dst) const
+ {
+ using pixel_type = image_rgba8::pixel_type;
+ image_rgba8 src = util::get<image_rgba8>(src_);
+ box2d<int> ext0(0,0,dst.width(),dst.height());
+ box2d<int> ext1(x0_,y0_,x0_+src.width(),y0_+src.height());
+
+ if (ext0.intersects(ext1))
+ {
+ box2d<int> box = ext0.intersect(ext1);
+ for (std::size_t y = box.miny(); y < box.maxy(); ++y)
+ {
+ pixel_type* row_to = dst.get_row(y);
+ pixel_type const * row_from = src.get_row(y-y0_);
+
+ for (std::size_t x = box.minx(); x < box.maxx(); ++x)
+ {
+ if (row_from[x-x0_] & 0xff000000) // Don't change if alpha == 0
+ {
+ row_to[x] = row_from[x-x0_];
+ }
+ }
+ }
+ }
+ }
+
+ void operator() (image_null &) const
+ {
+ throw std::runtime_error("Set rectangle not support for null images");
+ }
+
+ template <typename T>
+ void operator() (T & dst) const
+ {
+ using pixel_type = typename T::pixel_type;
+ T src = util::get<T>(src_);
+ box2d<int> ext0(0,0,dst.width(),dst.height());
+ box2d<int> ext1(x0_,y0_,x0_+src.width(),y0_+src.height());
+
+ if (ext0.intersects(ext1))
+ {
+ box2d<int> box = ext0.intersect(ext1);
+ for (std::size_t y = box.miny(); y < box.maxy(); ++y)
+ {
+ pixel_type* row_to = dst.get_row(y);
+ pixel_type const * row_from = src.get_row(y-y0_);
+
+ for (std::size_t x = box.minx(); x < box.maxx(); ++x)
+ {
+ row_to[x] = row_from[x-x0_];
+ }
+ }
+ }
+ }
+private:
+ image_any const& src_;
+ std::size_t x0_;
+ std::size_t y0_;
+};
+
+} // end detail ns
+
+MAPNIK_DECL void set_rectangle(image_any & dst, image_any const& src, std::size_t x, std::size_t y)
+{
+ util::apply_visitor(detail::visitor_set_rectangle(src, x, y), dst);
+}
+
+template <typename T>
+MAPNIK_DECL void set_rectangle (T & dst, T const& src, std::size_t x, std::size_t y)
+{
+ detail::visitor_set_rectangle visit(src, x, y);
+ visit(dst);
+}
+
+template MAPNIK_DECL void set_rectangle(image_rgba8 &, image_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL void set_rectangle(image_gray8 &, image_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL void set_rectangle(image_gray8s &, image_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL void set_rectangle(image_gray16 &, image_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL void set_rectangle(image_gray16s &, image_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL void set_rectangle(image_gray32 &, image_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL void set_rectangle(image_gray32s &, image_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL void set_rectangle(image_gray32f &, image_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL void set_rectangle(image_gray64 &, image_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL void set_rectangle(image_gray64s &, image_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL void set_rectangle(image_gray64f &, image_gray64f const&, std::size_t, std::size_t);
+
+namespace detail
+{
+
+struct visitor_composite_pixel
+{
+ // Obviously c variable would only work for rgba8 currently, but didn't want to
+ // make this a template class until new rgba types exist.
+ visitor_composite_pixel(composite_mode_e comp_op, std::size_t x, std::size_t y, unsigned c, unsigned cover, double opacity)
+ : opacity_(clamp(opacity, 0.0, 1.0)),
+ comp_op_(comp_op),
+ x_(x),
+ y_(y),
+ c_(c),
+ cover_(cover) {}
+
+ void operator() (image_rgba8 & data) const
+ {
+ using color_type = agg::rgba8;
+ using value_type = color_type::value_type;
+ using order_type = agg::order_rgba;
+ using blender_type = agg::comp_op_adaptor_rgba<color_type,order_type>;
+
+ if (mapnik::check_bounds(data, x_, y_))
+ {
+ image_rgba8::pixel_type rgba = data(x_,y_);
+ value_type ca = static_cast<unsigned>(((c_ >> 24) & 0xff) * opacity_);
+ value_type cb = (c_ >> 16 ) & 0xff;
+ value_type cg = (c_ >> 8) & 0xff;
+ value_type cr = (c_ & 0xff);
+ blender_type::blend_pix(comp_op_, reinterpret_cast<value_type*>(&rgba), cr, cg, cb, ca, cover_);
+ data(x_,y_) = rgba;
+ }
+ }
+
+ template <typename T>
+ void operator() (T & data) const
+ {
+ throw std::runtime_error("Composite pixel is not supported for this data type");
+ }
+
+private:
+ double const opacity_;
+ composite_mode_e comp_op_;
+ std::size_t const x_;
+ std::size_t const y_;
+ int const c_;
+ unsigned const cover_;
+
+};
+
+} // end detail ns
+
+MAPNIK_DECL void composite_pixel(image_any & data, composite_mode_e comp_op, std::size_t x, std::size_t y, unsigned c, unsigned cover, double opacity )
+{
+ util::apply_visitor(detail::visitor_composite_pixel(comp_op, x, y, c, cover, opacity), data);
+}
+
+template <typename T>
+MAPNIK_DECL void composite_pixel(T & data, composite_mode_e comp_op, std::size_t x, std::size_t y, unsigned c, unsigned cover, double opacity )
+{
+ detail::visitor_composite_pixel visitor(comp_op, x, y, c, cover, opacity);
+ visitor(data);
+}
+
+template MAPNIK_DECL void composite_pixel(image_rgba8 &, composite_mode_e, std::size_t, std::size_t, unsigned, unsigned, double);
+template MAPNIK_DECL void composite_pixel(image_gray8 &, composite_mode_e, std::size_t, std::size_t, unsigned, unsigned, double);
+template MAPNIK_DECL void composite_pixel(image_gray8s &, composite_mode_e, std::size_t, std::size_t, unsigned, unsigned, double);
+template MAPNIK_DECL void composite_pixel(image_gray16 &, composite_mode_e, std::size_t, std::size_t, unsigned, unsigned, double);
+template MAPNIK_DECL void composite_pixel(image_gray16s &, composite_mode_e, std::size_t, std::size_t, unsigned, unsigned, double);
+template MAPNIK_DECL void composite_pixel(image_gray32 &, composite_mode_e, std::size_t, std::size_t, unsigned, unsigned, double);
+template MAPNIK_DECL void composite_pixel(image_gray32s &, composite_mode_e, std::size_t, std::size_t, unsigned, unsigned, double);
+template MAPNIK_DECL void composite_pixel(image_gray32f &, composite_mode_e, std::size_t, std::size_t, unsigned, unsigned, double);
+template MAPNIK_DECL void composite_pixel(image_gray64 &, composite_mode_e, std::size_t, std::size_t, unsigned, unsigned, double);
+template MAPNIK_DECL void composite_pixel(image_gray64s &, composite_mode_e, std::size_t, std::size_t, unsigned, unsigned, double);
+template MAPNIK_DECL void composite_pixel(image_gray64f &, composite_mode_e, std::size_t, std::size_t, unsigned, unsigned, double);
+
+namespace detail {
+
+template <typename T1>
+struct visitor_set_pixel
+{
+ visitor_set_pixel(std::size_t x, std::size_t y, T1 const& val)
+ : val_(val), x_(x), y_(y) {}
+
+ template <typename T2>
+ void operator() (T2 & data) const
+ {
+ using pixel_type = typename T2::pixel_type;
+ pixel_type val;
+ try
+ {
+ val = numeric_cast<pixel_type>(val_);
+ }
+ catch(negative_overflow&)
+ {
+ val = std::numeric_limits<pixel_type>::min();
+ }
+ catch(positive_overflow&)
+ {
+ val = std::numeric_limits<pixel_type>::max();
+ }
+ if (check_bounds(data, x_, y_))
+ {
+ data(x_, y_) = val;
+ }
+ }
+
+private:
+ T1 const& val_;
+ std::size_t const x_;
+ std::size_t const y_;
+};
+
+template<>
+struct visitor_set_pixel<color>
+{
+ visitor_set_pixel(std::size_t x, std::size_t y, color const& val)
+ : val_(val), x_(x), y_(y) {}
+
+ template <typename T2>
+ void operator() (T2 & data) const
+ {
+ using pixel_type = typename T2::pixel_type;
+ pixel_type val;
+ if (data.get_premultiplied() && !val_.get_premultiplied())
+ {
+ color tmp(val_);
+ tmp.premultiply();
+ val = static_cast<pixel_type>(tmp.rgba());
+ }
+ else if (!data.get_premultiplied() && val_.get_premultiplied())
+ {
+ color tmp(val_);
+ tmp.demultiply();
+ val = static_cast<pixel_type>(tmp.rgba());
+ }
+ else
+ {
+ val = static_cast<pixel_type>(val_.rgba());
+ }
+ if (check_bounds(data, x_, y_))
+ {
+ data(x_, y_) = val;
+ }
+ }
+
+private:
+ color const& val_;
+ std::size_t const x_;
+ std::size_t const y_;
+};
+
+} // end detail ns
+
+template <typename T>
+MAPNIK_DECL void set_pixel (image_any & data, std::size_t x, std::size_t y, T const& val)
+{
+ util::apply_visitor(detail::visitor_set_pixel<T>(x, y, val), data);
+}
+
+template MAPNIK_DECL void set_pixel(image_any &, std::size_t, std::size_t, color const&);
+template MAPNIK_DECL void set_pixel(image_any &, std::size_t, std::size_t, uint64_t const&);
+template MAPNIK_DECL void set_pixel(image_any &, std::size_t, std::size_t, int64_t const&);
+template MAPNIK_DECL void set_pixel(image_any &, std::size_t, std::size_t, uint32_t const&);
+template MAPNIK_DECL void set_pixel(image_any &, std::size_t, std::size_t, int32_t const&);
+template MAPNIK_DECL void set_pixel(image_any &, std::size_t, std::size_t, uint16_t const&);
+template MAPNIK_DECL void set_pixel(image_any &, std::size_t, std::size_t, int16_t const&);
+template MAPNIK_DECL void set_pixel(image_any &, std::size_t, std::size_t, uint8_t const&);
+template MAPNIK_DECL void set_pixel(image_any &, std::size_t, std::size_t, int8_t const&);
+template MAPNIK_DECL void set_pixel(image_any &, std::size_t, std::size_t, float const&);
+template MAPNIK_DECL void set_pixel(image_any &, std::size_t, std::size_t, double const&);
+
+template <typename T>
+MAPNIK_DECL void set_pixel (image_rgba8 & data, std::size_t x, std::size_t y, T const& val)
+{
+ detail::visitor_set_pixel<T> visitor(x, y, val);
+ visitor(data);
+}
+
+template MAPNIK_DECL void set_pixel(image_rgba8 &, std::size_t, std::size_t, color const&);
+template MAPNIK_DECL void set_pixel(image_rgba8 &, std::size_t, std::size_t, uint64_t const&);
+template MAPNIK_DECL void set_pixel(image_rgba8 &, std::size_t, std::size_t, int64_t const&);
+template MAPNIK_DECL void set_pixel(image_rgba8 &, std::size_t, std::size_t, uint32_t const&);
+template MAPNIK_DECL void set_pixel(image_rgba8 &, std::size_t, std::size_t, int32_t const&);
+template MAPNIK_DECL void set_pixel(image_rgba8 &, std::size_t, std::size_t, uint16_t const&);
+template MAPNIK_DECL void set_pixel(image_rgba8 &, std::size_t, std::size_t, int16_t const&);
+template MAPNIK_DECL void set_pixel(image_rgba8 &, std::size_t, std::size_t, uint8_t const&);
+template MAPNIK_DECL void set_pixel(image_rgba8 &, std::size_t, std::size_t, int8_t const&);
+template MAPNIK_DECL void set_pixel(image_rgba8 &, std::size_t, std::size_t, float const&);
+template MAPNIK_DECL void set_pixel(image_rgba8 &, std::size_t, std::size_t, double const&);
+
+template <typename T>
+MAPNIK_DECL void set_pixel (image_gray8 & data, std::size_t x, std::size_t y, T const& val)
+{
+ detail::visitor_set_pixel<T> visitor(x, y, val);
+ visitor(data);
+}
+
+template MAPNIK_DECL void set_pixel(image_gray8 &, std::size_t, std::size_t, color const&);
+template MAPNIK_DECL void set_pixel(image_gray8 &, std::size_t, std::size_t, uint64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8 &, std::size_t, std::size_t, int64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8 &, std::size_t, std::size_t, uint32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8 &, std::size_t, std::size_t, int32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8 &, std::size_t, std::size_t, uint16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8 &, std::size_t, std::size_t, int16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8 &, std::size_t, std::size_t, uint8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8 &, std::size_t, std::size_t, int8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8 &, std::size_t, std::size_t, float const&);
+template MAPNIK_DECL void set_pixel(image_gray8 &, std::size_t, std::size_t, double const&);
+
+template <typename T>
+MAPNIK_DECL void set_pixel (image_gray8s & data, std::size_t x, std::size_t y, T const& val)
+{
+ detail::visitor_set_pixel<T> visitor(x, y, val);
+ visitor(data);
+}
+
+template MAPNIK_DECL void set_pixel(image_gray8s &, std::size_t, std::size_t, color const&);
+template MAPNIK_DECL void set_pixel(image_gray8s &, std::size_t, std::size_t, uint64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8s &, std::size_t, std::size_t, int64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8s &, std::size_t, std::size_t, uint32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8s &, std::size_t, std::size_t, int32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8s &, std::size_t, std::size_t, uint16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8s &, std::size_t, std::size_t, int16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8s &, std::size_t, std::size_t, uint8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8s &, std::size_t, std::size_t, int8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray8s &, std::size_t, std::size_t, float const&);
+template MAPNIK_DECL void set_pixel(image_gray8s &, std::size_t, std::size_t, double const&);
+
+template <typename T>
+MAPNIK_DECL void set_pixel (image_gray16 & data, std::size_t x, std::size_t y, T const& val)
+{
+ detail::visitor_set_pixel<T> visitor(x, y, val);
+ visitor(data);
+}
+
+template MAPNIK_DECL void set_pixel(image_gray16 &, std::size_t, std::size_t, color const&);
+template MAPNIK_DECL void set_pixel(image_gray16 &, std::size_t, std::size_t, uint64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16 &, std::size_t, std::size_t, int64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16 &, std::size_t, std::size_t, uint32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16 &, std::size_t, std::size_t, int32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16 &, std::size_t, std::size_t, uint16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16 &, std::size_t, std::size_t, int16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16 &, std::size_t, std::size_t, uint8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16 &, std::size_t, std::size_t, int8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16 &, std::size_t, std::size_t, float const&);
+template MAPNIK_DECL void set_pixel(image_gray16 &, std::size_t, std::size_t, double const&);
+
+template <typename T>
+MAPNIK_DECL void set_pixel (image_gray16s & data, std::size_t x, std::size_t y, T const& val)
+{
+ detail::visitor_set_pixel<T> visitor(x, y, val);
+ visitor(data);
+}
+
+template MAPNIK_DECL void set_pixel(image_gray16s &, std::size_t, std::size_t, color const&);
+template MAPNIK_DECL void set_pixel(image_gray16s &, std::size_t, std::size_t, uint64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16s &, std::size_t, std::size_t, int64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16s &, std::size_t, std::size_t, uint32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16s &, std::size_t, std::size_t, int32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16s &, std::size_t, std::size_t, uint16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16s &, std::size_t, std::size_t, int16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16s &, std::size_t, std::size_t, uint8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16s &, std::size_t, std::size_t, int8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray16s &, std::size_t, std::size_t, float const&);
+template MAPNIK_DECL void set_pixel(image_gray16s &, std::size_t, std::size_t, double const&);
+
+template <typename T>
+MAPNIK_DECL void set_pixel (image_gray32 & data, std::size_t x, std::size_t y, T const& val)
+{
+ detail::visitor_set_pixel<T> visitor(x, y, val);
+ visitor(data);
+}
+
+template MAPNIK_DECL void set_pixel(image_gray32 &, std::size_t, std::size_t, color const&);
+template MAPNIK_DECL void set_pixel(image_gray32 &, std::size_t, std::size_t, uint64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32 &, std::size_t, std::size_t, int64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32 &, std::size_t, std::size_t, uint32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32 &, std::size_t, std::size_t, int32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32 &, std::size_t, std::size_t, uint16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32 &, std::size_t, std::size_t, int16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32 &, std::size_t, std::size_t, uint8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32 &, std::size_t, std::size_t, int8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32 &, std::size_t, std::size_t, float const&);
+template MAPNIK_DECL void set_pixel(image_gray32 &, std::size_t, std::size_t, double const&);
+
+template <typename T>
+MAPNIK_DECL void set_pixel (image_gray32s & data, std::size_t x, std::size_t y, T const& val)
+{
+ detail::visitor_set_pixel<T> visitor(x, y, val);
+ visitor(data);
+}
+
+template MAPNIK_DECL void set_pixel(image_gray32s &, std::size_t, std::size_t, color const&);
+template MAPNIK_DECL void set_pixel(image_gray32s &, std::size_t, std::size_t, uint64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32s &, std::size_t, std::size_t, int64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32s &, std::size_t, std::size_t, uint32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32s &, std::size_t, std::size_t, int32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32s &, std::size_t, std::size_t, uint16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32s &, std::size_t, std::size_t, int16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32s &, std::size_t, std::size_t, uint8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32s &, std::size_t, std::size_t, int8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32s &, std::size_t, std::size_t, float const&);
+template MAPNIK_DECL void set_pixel(image_gray32s &, std::size_t, std::size_t, double const&);
+
+template <typename T>
+MAPNIK_DECL void set_pixel (image_gray32f & data, std::size_t x, std::size_t y, T const& val)
+{
+ detail::visitor_set_pixel<T> visitor(x, y, val);
+ visitor(data);
+}
+
+template MAPNIK_DECL void set_pixel(image_gray32f &, std::size_t, std::size_t, color const&);
+template MAPNIK_DECL void set_pixel(image_gray32f &, std::size_t, std::size_t, uint64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32f &, std::size_t, std::size_t, int64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32f &, std::size_t, std::size_t, uint32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32f &, std::size_t, std::size_t, int32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32f &, std::size_t, std::size_t, uint16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32f &, std::size_t, std::size_t, int16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32f &, std::size_t, std::size_t, uint8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32f &, std::size_t, std::size_t, int8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray32f &, std::size_t, std::size_t, float const&);
+template MAPNIK_DECL void set_pixel(image_gray32f &, std::size_t, std::size_t, double const&);
+
+template <typename T>
+MAPNIK_DECL void set_pixel (image_gray64 & data, std::size_t x, std::size_t y, T const& val)
+{
+ detail::visitor_set_pixel<T> visitor(x, y, val);
+ visitor(data);
+}
+
+template MAPNIK_DECL void set_pixel(image_gray64 &, std::size_t, std::size_t, color const&);
+template MAPNIK_DECL void set_pixel(image_gray64 &, std::size_t, std::size_t, uint64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64 &, std::size_t, std::size_t, int64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64 &, std::size_t, std::size_t, uint32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64 &, std::size_t, std::size_t, int32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64 &, std::size_t, std::size_t, uint16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64 &, std::size_t, std::size_t, int16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64 &, std::size_t, std::size_t, uint8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64 &, std::size_t, std::size_t, int8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64 &, std::size_t, std::size_t, float const&);
+template MAPNIK_DECL void set_pixel(image_gray64 &, std::size_t, std::size_t, double const&);
+
+template <typename T>
+MAPNIK_DECL void set_pixel (image_gray64s & data, std::size_t x, std::size_t y, T const& val)
+{
+ detail::visitor_set_pixel<T> visitor(x, y, val);
+ visitor(data);
+}
+
+template MAPNIK_DECL void set_pixel(image_gray64s &, std::size_t, std::size_t, color const&);
+template MAPNIK_DECL void set_pixel(image_gray64s &, std::size_t, std::size_t, uint64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64s &, std::size_t, std::size_t, int64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64s &, std::size_t, std::size_t, uint32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64s &, std::size_t, std::size_t, int32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64s &, std::size_t, std::size_t, uint16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64s &, std::size_t, std::size_t, int16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64s &, std::size_t, std::size_t, uint8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64s &, std::size_t, std::size_t, int8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64s &, std::size_t, std::size_t, float const&);
+template MAPNIK_DECL void set_pixel(image_gray64s &, std::size_t, std::size_t, double const&);
+
+template <typename T>
+MAPNIK_DECL void set_pixel (image_gray64f & data, std::size_t x, std::size_t y, T const& val)
+{
+ detail::visitor_set_pixel<T> visitor(x, y, val);
+ visitor(data);
+}
+
+template MAPNIK_DECL void set_pixel(image_gray64f &, std::size_t, std::size_t, color const&);
+template MAPNIK_DECL void set_pixel(image_gray64f &, std::size_t, std::size_t, uint64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64f &, std::size_t, std::size_t, int64_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64f &, std::size_t, std::size_t, uint32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64f &, std::size_t, std::size_t, int32_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64f &, std::size_t, std::size_t, uint16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64f &, std::size_t, std::size_t, int16_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64f &, std::size_t, std::size_t, uint8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64f &, std::size_t, std::size_t, int8_t const&);
+template MAPNIK_DECL void set_pixel(image_gray64f &, std::size_t, std::size_t, float const&);
+template MAPNIK_DECL void set_pixel(image_gray64f &, std::size_t, std::size_t, double const&);
+
+namespace detail {
+
+template <typename T1>
+struct visitor_get_pixel
+{
+ visitor_get_pixel(std::size_t x, std::size_t y)
+ : x_(x), y_(y) {}
+
+ template <typename T2>
+ T1 operator() (T2 const& data) const
+ {
+ using pixel_type = T1;
+ if (check_bounds(data, x_, y_))
+ {
+ T1 val;
+ try
+ {
+ val = numeric_cast<T1>(data(x_,y_));
+ }
+ catch(negative_overflow&)
+ {
+ val = std::numeric_limits<T1>::min();
+ }
+ catch(positive_overflow&)
+ {
+ val = std::numeric_limits<T1>::max();
+ }
+ return val;
+ }
+ else
+ {
+ throw std::runtime_error("Out of range for dataset with get pixel");
+ }
+ }
+
+private:
+ std::size_t const x_;
+ std::size_t const y_;
+};
+
+template<>
+struct visitor_get_pixel<color>
+{
+ visitor_get_pixel(std::size_t x, std::size_t y)
+ : x_(x), y_(y) {}
+
+ template <typename T2>
+ color operator() (T2 const& data) const
+ {
+ if (check_bounds(data, x_, y_))
+ {
+ return color(static_cast<uint32_t>(data(x_, y_)), data.get_premultiplied());
+ }
+ else
+ {
+ throw std::runtime_error("Out of range for dataset with get pixel");
+ }
+ }
+
+private:
+ std::size_t const x_;
+ std::size_t const y_;
+};
+
+} // end detail ns
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_any const& data, std::size_t x, std::size_t y)
+{
+ return util::apply_visitor(detail::visitor_get_pixel<T>(x, y), data);
+}
+
+template MAPNIK_DECL color get_pixel(image_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_any const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_view_any const& data, std::size_t x, std::size_t y)
+{
+ return util::apply_visitor(detail::visitor_get_pixel<T>(x, y), data);
+}
+
+template MAPNIK_DECL color get_pixel(image_view_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_view_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_view_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_view_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_view_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_view_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_view_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_view_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_view_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_view_any const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_view_any const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_rgba8 const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_rgba8 const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_gray8 const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_gray8 const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_gray8s const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_gray8s const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_gray16 const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_gray16 const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_gray16s const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_gray16s const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_gray32 const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_gray32 const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_gray32s const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_gray32s const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_gray32f const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_gray32f const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_gray64 const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_gray64 const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_gray64s const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_gray64s const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_gray64f const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_gray64f const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_view_rgba8 const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_view_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_view_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_view_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_view_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_view_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_view_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_view_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_view_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_view_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_view_rgba8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_view_rgba8 const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_view_gray8 const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_view_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_view_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_view_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_view_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_view_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_view_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_view_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_view_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_view_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_view_gray8 const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_view_gray8 const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_view_gray8s const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_view_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_view_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_view_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_view_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_view_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_view_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_view_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_view_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_view_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_view_gray8s const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_view_gray8s const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_view_gray16 const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_view_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_view_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_view_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_view_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_view_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_view_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_view_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_view_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_view_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_view_gray16 const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_view_gray16 const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_view_gray16s const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_view_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_view_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_view_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_view_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_view_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_view_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_view_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_view_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_view_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_view_gray16s const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_view_gray16s const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_view_gray32 const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_view_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_view_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_view_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_view_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_view_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_view_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_view_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_view_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_view_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_view_gray32 const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_view_gray32 const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_view_gray32s const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_view_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_view_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_view_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_view_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_view_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_view_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_view_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_view_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_view_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_view_gray32s const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_view_gray32s const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_view_gray32f const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_view_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_view_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_view_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_view_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_view_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_view_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_view_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_view_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_view_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_view_gray32f const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_view_gray32f const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_view_gray64 const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_view_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_view_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_view_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_view_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_view_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_view_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_view_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_view_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_view_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_view_gray64 const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_view_gray64 const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_view_gray64s const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_view_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_view_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_view_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_view_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_view_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_view_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_view_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_view_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_view_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_view_gray64s const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_view_gray64s const&, std::size_t, std::size_t);
+
+template <typename T>
+MAPNIK_DECL T get_pixel (image_view_gray64f const& data, std::size_t x, std::size_t y)
+{
+ detail::visitor_get_pixel<T> visitor(x, y);
+ return visitor(data);
+}
+
+template MAPNIK_DECL color get_pixel(image_view_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint64_t get_pixel(image_view_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int64_t get_pixel(image_view_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint32_t get_pixel(image_view_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int32_t get_pixel(image_view_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint16_t get_pixel(image_view_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int16_t get_pixel(image_view_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL uint8_t get_pixel(image_view_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL int8_t get_pixel(image_view_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL float get_pixel(image_view_gray64f const&, std::size_t, std::size_t);
+template MAPNIK_DECL double get_pixel(image_view_gray64f const&, std::size_t, std::size_t);
+
+namespace detail
+{
+
+template <typename Out>
+struct visitor_view_to_stream
+{
+ visitor_view_to_stream(Out & os)
+ : os_(os) {}
+
+ template <typename T>
+ void operator() (T const& view)
+ {
+ for (std::size_t i=0;i<view.height();i++)
+ {
+ os_.write(reinterpret_cast<const char*>(view.get_row(i)),
+ view.row_size());
+ }
+ }
+
+private:
+ Out & os_;
+};
+
+} // end detail ns
+
+template <typename Out>
+void view_to_stream (image_view_any const& view, Out & os)
+{
+ util::apply_visitor(detail::visitor_view_to_stream<Out>(os), view);
+}
+
+template MAPNIK_DECL void view_to_stream(image_view_any const& view, std::ostringstream & os);
+
+namespace detail
+{
+
+struct visitor_create_view
+{
+ visitor_create_view(std::size_t x, std::size_t y, std::size_t w, std::size_t h)
+ : x_(x), y_(y), w_(w), h_(h) {}
+
+ image_view_any operator() (image_null const&) const
+ {
+ throw std::runtime_error("Can not make a view from a null image");
+ }
+
+ template <typename T>
+ image_view_any operator() (T const& data) const
+ {
+ image_view<T> view(x_,y_,w_,h_,data);
+ return image_view_any(view);
+ }
+private:
+ std::size_t const x_;
+ std::size_t const y_;
+ std::size_t const w_;
+ std::size_t const h_;
+};
+
+} // end detail ns
+
+MAPNIK_DECL image_view_any create_view(image_any const& data, std::size_t x, std::size_t y, std::size_t w, std::size_t h)
+{
+ return util::apply_visitor(detail::visitor_create_view(x, y, w, h), data);
+}
+
+template <typename T>
+MAPNIK_DECL std::size_t compare(T const& im1, T const& im2, double threshold, bool)
+{
+ using pixel_type = typename T::pixel_type;
+ if (im1.width() != im2.width() || im1.height() != im2.height())
+ {
+ return im1.width() * im1.height();
+ }
+ std::size_t difference = 0;
+ for (std::size_t y = 0; y < im1.height(); ++y)
+ {
+ const pixel_type * row_from = im1.get_row(y);
+ const pixel_type * row_from2 = im2.get_row(y);
+ for (std::size_t x = 0; x < im1.width(); ++x)
+ {
+ double d = std::abs(static_cast<double>(row_from[x]) - static_cast<double>(row_from2[x]));
+ if (d > threshold)
+ {
+ ++difference;
+ }
+ }
+ }
+ return difference;
+}
+
+template MAPNIK_DECL std::size_t compare(image_gray8 const&, image_gray8 const&, double, bool);
+template MAPNIK_DECL std::size_t compare(image_gray8s const&, image_gray8s const&, double, bool);
+template MAPNIK_DECL std::size_t compare(image_gray16 const&, image_gray16 const&, double, bool);
+template MAPNIK_DECL std::size_t compare(image_gray16s const&, image_gray16s const&, double, bool);
+template MAPNIK_DECL std::size_t compare(image_gray32 const&, image_gray32 const&, double, bool);
+template MAPNIK_DECL std::size_t compare(image_gray32s const&, image_gray32s const&, double, bool);
+template MAPNIK_DECL std::size_t compare(image_gray32f const&, image_gray32f const&, double, bool);
+template MAPNIK_DECL std::size_t compare(image_gray64 const&, image_gray64 const&, double, bool);
+template MAPNIK_DECL std::size_t compare(image_gray64s const&, image_gray64s const&, double, bool);
+template MAPNIK_DECL std::size_t compare(image_gray64f const&, image_gray64f const&, double, bool);
+
+template <>
+MAPNIK_DECL std::size_t compare<image_null>(image_null const&, image_null const&, double, bool)
+{
+ return 0;
+}
+
+template <>
+MAPNIK_DECL std::size_t compare<image_rgba8>(image_rgba8 const& im1, image_rgba8 const& im2, double threshold, bool alpha)
+{
+ using pixel_type = image_rgba8::pixel_type;
+ if (im1.width() != im2.width() || im1.height() != im2.height())
+ {
+ return im1.width() * im1.height();
+ }
+ unsigned difference = 0;
+#ifdef SSE_MATH
+ __m128i true_set = _mm_set1_epi8(0xff);
+ __m128i one = _mm_set1_epi32(1);
+ __m128i sum = _mm_setzero_si128();
+ uint32_t alphamask = 0xffffffff;
+ if (!alpha)
+ {
+ alphamask = 0xffffff;
+ }
+ __m128i mask = _mm_set1_epi32(alphamask);
+ if (threshold == 0.0)
+ {
+ for (unsigned int y = 0; y < im1.height(); ++y)
+ {
+ const pixel_type * row_from = im1.get_row(y);
+ const pixel_type * row_from2 = im2.get_row(y);
+ int x = 0;
+ for (; x < ROUND_DOWN(im1.width(),4); x +=4 )
+ {
+ __m128i rgba = _mm_loadu_si128((__m128i*)(row_from + x));
+ __m128i rgba2 = _mm_loadu_si128((__m128i*)(row_from2 + x));
+ rgba = _mm_and_si128(rgba, mask);
+ rgba2 = _mm_and_si128(rgba2, mask);
+ __m128i eq = _mm_cmpeq_epi8(rgba,rgba2);
+ __m128i comp2 = _mm_cmpeq_epi32(eq, true_set);
+ sum = _mm_add_epi32(sum, _mm_andnot_si128(comp2, one));
+ }
+ for (; x < im1.width(); ++x)
+ {
+ if ((row_from[x] & alphamask) != (row_from2[x] & alphamask))
+ {
+ ++difference;
+ }
+ }
+ }
+ m128_int diff_sum;
+ diff_sum.v = sum;
+ difference += diff_sum.u32[0];
+ difference += diff_sum.u32[1];
+ difference += diff_sum.u32[2];
+ difference += diff_sum.u32[3];
+ }
+ else
+ {
+ uint8_t thres = static_cast<uint8_t>(threshold);
+ __m128i m_thres = _mm_set1_epi8(thres);
+ for (unsigned int y = 0; y < im1.height(); ++y)
+ {
+ const pixel_type * row_from = im1.get_row(y);
+ const pixel_type * row_from2 = im2.get_row(y);
+ int x = 0;
+ for (; x < ROUND_DOWN(im1.width(),4); x +=4 )
+ {
+ __m128i rgba = _mm_loadu_si128((__m128i*)(row_from + x));
+ __m128i rgba2 = _mm_loadu_si128((__m128i*)(row_from2 + x));
+ rgba = _mm_and_si128(rgba, mask);
+ rgba2 = _mm_and_si128(rgba2, mask);
+ __m128i abs = _mm_absdiff_epu8(rgba, rgba2);
+ __m128i compare = _mm_cmpgt_epu8(abs, m_thres);
+ __m128i comp2 = _mm_cmpeq_epi32(compare, _mm_setzero_si128());
+ sum = _mm_add_epi32(sum, _mm_andnot_si128(comp2, one));
+ }
+ for (; x < im1.width(); ++x)
+ {
+ unsigned rgba = row_from[x];
+ unsigned rgba2 = row_from2[x];
+ unsigned r = rgba & 0xff;
+ unsigned g = (rgba >> 8 ) & 0xff;
+ unsigned b = (rgba >> 16) & 0xff;
+ unsigned r2 = rgba2 & 0xff;
+ unsigned g2 = (rgba2 >> 8 ) & 0xff;
+ unsigned b2 = (rgba2 >> 16) & 0xff;
+ if (std::abs(static_cast<int>(r - r2)) > static_cast<int>(threshold) ||
+ std::abs(static_cast<int>(g - g2)) > static_cast<int>(threshold) ||
+ std::abs(static_cast<int>(b - b2)) > static_cast<int>(threshold)) {
+ ++difference;
+ continue;
+ }
+ if (alpha) {
+ unsigned a = (rgba >> 24) & 0xff;
+ unsigned a2 = (rgba2 >> 24) & 0xff;
+ if (std::abs(static_cast<int>(a - a2)) > static_cast<int>(threshold)) {
+ ++difference;
+ continue;
+ }
+ }
+ }
+ }
+ m128_int diff_sum;
+ diff_sum.v = sum;
+ difference += diff_sum.u32[0];
+ difference += diff_sum.u32[1];
+ difference += diff_sum.u32[2];
+ difference += diff_sum.u32[3];
+ }
+#else
+ for (unsigned int y = 0; y < im1.height(); ++y)
+ {
+ const pixel_type * row_from = im1.get_row(y);
+ const pixel_type * row_from2 = im2.get_row(y);
+ for (unsigned int x = 0; x < im1.width(); ++x)
+ {
+ unsigned rgba = row_from[x];
+ unsigned rgba2 = row_from2[x];
+ unsigned r = rgba & 0xff;
+ unsigned g = (rgba >> 8 ) & 0xff;
+ unsigned b = (rgba >> 16) & 0xff;
+ unsigned r2 = rgba2 & 0xff;
+ unsigned g2 = (rgba2 >> 8 ) & 0xff;
+ unsigned b2 = (rgba2 >> 16) & 0xff;
+ if (std::abs(static_cast<int>(r - r2)) > static_cast<int>(threshold) ||
+ std::abs(static_cast<int>(g - g2)) > static_cast<int>(threshold) ||
+ std::abs(static_cast<int>(b - b2)) > static_cast<int>(threshold)) {
+ ++difference;
+ continue;
+ }
+ if (alpha) {
+ unsigned a = (rgba >> 24) & 0xff;
+ unsigned a2 = (rgba2 >> 24) & 0xff;
+ if (std::abs(static_cast<int>(a - a2)) > static_cast<int>(threshold)) {
+ ++difference;
+ continue;
+ }
+ }
+ }
+ }
+#endif
+ return difference;
+}
+
+namespace detail
+{
+
+struct visitor_compare
+{
+ visitor_compare(image_any const& im2, double threshold, bool alpha)
+ : im2_(im2),
+ threshold_(threshold),
+ alpha_(alpha) {}
+
+ template <typename T>
+ std::size_t operator() (T const & im1) const
+ {
+ if (!im2_.is<T>())
+ {
+ return im1.width() * im1.height();
+ }
+ return mapnik::compare<T>(im1, util::get<T>(im2_), threshold_, alpha_);
+ }
+
+private:
+ image_any const& im2_;
+ double const threshold_;
+ bool const alpha_;
+};
+
+} // end detail ns
+
+template <>
+MAPNIK_DECL std::size_t compare<image_any>(image_any const& im1, image_any const& im2, double threshold, bool alpha)
+{
+ return util::apply_visitor(detail::visitor_compare(im2, threshold, alpha), im1);
+}
+
+} // end ns
diff --git a/src/image_util_jpeg.cpp b/src/image_util_jpeg.cpp
new file mode 100644
index 0000000..14fbd0f
--- /dev/null
+++ b/src/image_util_jpeg.cpp
@@ -0,0 +1,128 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#if defined(HAVE_JPEG)
+#include <mapnik/jpeg_io.hpp>
+#endif
+
+#include <mapnik/image_util.hpp>
+#include <mapnik/image_util_jpeg.hpp>
+#include <mapnik/image.hpp>
+#include <mapnik/image_view.hpp>
+#include <mapnik/image_options.hpp>
+#include <mapnik/util/conversions.hpp>
+
+// stl
+#include <string>
+
+namespace mapnik
+{
+
+jpeg_saver::jpeg_saver(std::ostream & stream, std::string const& t):
+ stream_(stream), t_(t) {}
+
+template <typename T>
+void process_rgba8_jpeg(T const& image, std::string const& type, std::ostream & stream)
+{
+#if defined(HAVE_JPEG)
+ int quality = 85;
+ if (type != "jpeg")
+ {
+ for (auto const& kv : parse_image_options(type))
+ {
+ auto const& key = kv.first;
+ auto const& val = kv.second;
+
+ if ( key == "jpeg" ) continue;
+ else if ( key == "quality")
+ {
+ if (val && ! (*val).empty())
+ {
+ if (!mapnik::util::string2int(*val, quality) || quality < 0 || quality > 100)
+ {
+ throw image_writer_exception("invalid jpeg quality: '" + *val + "'");
+ }
+ }
+ }
+ }
+ }
+ save_as_jpeg(stream, quality, image);
+#else
+ throw image_writer_exception("jpeg output is not enabled in your build of Mapnik");
+#endif
+}
+
+template<>
+void jpeg_saver::operator()<image_rgba8> (image_rgba8 const& image) const
+{
+ process_rgba8_jpeg(image, t_, stream_);
+}
+
+template<>
+void jpeg_saver::operator()<image_view_rgba8> (image_view_rgba8 const& image) const
+{
+ process_rgba8_jpeg(image, t_, stream_);
+}
+
+template<>
+void jpeg_saver::operator()<image_null> (image_null const& image) const
+{
+ throw image_writer_exception("Can not save a null image to jpeg");
+}
+
+template<>
+void jpeg_saver::operator()<image_view_null> (image_view_null const& image) const
+{
+ throw image_writer_exception("Can not save a null image to jpeg");
+}
+
+template <typename T>
+void jpeg_saver::operator() (T const& image) const
+{
+ throw image_writer_exception("Mapnik does not support jpeg grayscale images");
+}
+
+template void jpeg_saver::operator()<image_rgba8> (image_rgba8 const& image) const;
+template void jpeg_saver::operator()<image_gray8> (image_gray8 const& image) const;
+template void jpeg_saver::operator()<image_gray8s> (image_gray8s const& image) const;
+template void jpeg_saver::operator()<image_gray16> (image_gray16 const& image) const;
+template void jpeg_saver::operator()<image_gray16s> (image_gray16s const& image) const;
+template void jpeg_saver::operator()<image_gray32> (image_gray32 const& image) const;
+template void jpeg_saver::operator()<image_gray32s> (image_gray32s const& image) const;
+template void jpeg_saver::operator()<image_gray32f> (image_gray32f const& image) const;
+template void jpeg_saver::operator()<image_gray64> (image_gray64 const& image) const;
+template void jpeg_saver::operator()<image_gray64s> (image_gray64s const& image) const;
+template void jpeg_saver::operator()<image_gray64f> (image_gray64f const& image) const;
+template void jpeg_saver::operator()<image_view_rgba8> (image_view_rgba8 const& image) const;
+template void jpeg_saver::operator()<image_view_gray8> (image_view_gray8 const& image) const;
+template void jpeg_saver::operator()<image_view_gray8s> (image_view_gray8s const& image) const;
+template void jpeg_saver::operator()<image_view_gray16> (image_view_gray16 const& image) const;
+template void jpeg_saver::operator()<image_view_gray16s> (image_view_gray16s const& image) const;
+template void jpeg_saver::operator()<image_view_gray32> (image_view_gray32 const& image) const;
+template void jpeg_saver::operator()<image_view_gray32s> (image_view_gray32s const& image) const;
+template void jpeg_saver::operator()<image_view_gray32f> (image_view_gray32f const& image) const;
+template void jpeg_saver::operator()<image_view_gray64> (image_view_gray64 const& image) const;
+template void jpeg_saver::operator()<image_view_gray64s> (image_view_gray64s const& image) const;
+template void jpeg_saver::operator()<image_view_gray64f> (image_view_gray64f const& image) const;
+
+} // end ns
diff --git a/src/image_util_png.cpp b/src/image_util_png.cpp
new file mode 100644
index 0000000..8c11f2a
--- /dev/null
+++ b/src/image_util_png.cpp
@@ -0,0 +1,366 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#if defined(HAVE_PNG)
+extern "C"
+{
+#include <png.h>
+}
+#endif
+
+// mapnik
+#if defined(HAVE_PNG)
+#include <mapnik/png_io.hpp>
+#endif
+
+#include <mapnik/image_util.hpp>
+#include <mapnik/image_util_png.hpp>
+#include <mapnik/image.hpp>
+#include <mapnik/image_any.hpp>
+#include <mapnik/image_view.hpp>
+#include <mapnik/image_options.hpp>
+#include <mapnik/util/conversions.hpp>
+
+// stl
+#include <string>
+#include <iostream>
+
+namespace mapnik
+{
+
+#if defined(HAVE_PNG)
+
+void handle_png_options(std::string const& type,
+ png_options & opts)
+{
+ if (type == "png" || type == "png24" || type == "png32")
+ {
+ opts.paletted = false;
+ return;
+ }
+ else if (type == "png8" || type == "png256")
+ {
+ opts.paletted = true;
+ return;
+ }
+
+ bool set_colors = false;
+ bool set_gamma = false;
+
+ for (auto const& kv : parse_image_options(type))
+ {
+ auto const& key = kv.first;
+ auto const& val = kv.second;
+ if (key == "png8" || key == "png256")
+ {
+ opts.paletted = true;
+ }
+ else if (key == "png" || key == "png24" || key == "png32")
+ {
+ opts.paletted = false;
+ }
+ else if (key == "m" && val)
+ {
+ if (*val == "o") opts.use_hextree = false;
+ else if (*val == "h") opts.use_hextree = true;
+ }
+ else if (key == "e" && val && *val == "miniz")
+ {
+ opts.use_miniz = true;
+ }
+ else if (key == "c")
+ {
+ set_colors = true;
+ if (!val || !mapnik::util::string2int(*val, opts.colors) || opts.colors < 1 || opts.colors > 256)
+ {
+ throw image_writer_exception("invalid color parameter: " + to_string(val));
+ }
+ }
+ else if (key == "t")
+ {
+ if (!val || !mapnik::util::string2int(*val,opts.trans_mode) || opts.trans_mode < 0 || opts.trans_mode > 2)
+ {
+ throw image_writer_exception("invalid trans_mode parameter: " + to_string(val));
+ }
+ }
+ else if (key == "g")
+ {
+ set_gamma = true;
+ if (!val || !mapnik::util::string2double(*val, opts.gamma) || opts.gamma < 0)
+ {
+ throw image_writer_exception("invalid gamma parameter: " + to_string(val));
+ }
+ }
+ else if (key == "z")
+ {
+ /*
+ #define Z_NO_COMPRESSION 0
+ #define Z_BEST_SPEED 1
+ #define Z_BEST_COMPRESSION 9
+ #define Z_DEFAULT_COMPRESSION (-1)
+ */
+ if (!val || !mapnik::util::string2int(*val, opts.compression)
+ || opts.compression < Z_DEFAULT_COMPRESSION
+ || opts.compression > 10) // use 10 here rather than Z_BEST_COMPRESSION (9) to allow for MZ_UBER_COMPRESSION
+ {
+ throw image_writer_exception("invalid compression parameter: " + to_string(val) + " (only -1 through 10 are valid)");
+ }
+ }
+ else if (key == "s")
+ {
+ if (!val) throw image_writer_exception("invalid compression parameter: <uninitialised>");
+
+ if (*val == "default")
+ {
+ opts.strategy = Z_DEFAULT_STRATEGY;
+ }
+ else if (*val == "filtered")
+ {
+ opts.strategy = Z_FILTERED;
+ }
+ else if (*val == "huff")
+ {
+ opts.strategy = Z_HUFFMAN_ONLY;
+ }
+ else if (*val == "rle")
+ {
+ opts.strategy = Z_RLE;
+ }
+ else if (*val == "fixed")
+ {
+ opts.strategy = Z_FIXED;
+ }
+ else
+ {
+ throw image_writer_exception("invalid compression strategy parameter: " + *val);
+ }
+ }
+ else
+ {
+ throw image_writer_exception("unhandled png option: " + key);
+ }
+ }
+ // validation
+ if (!opts.paletted && set_colors)
+ {
+ throw image_writer_exception("invalid color parameter: unavailable for true color (non-paletted) images");
+ }
+ if (!opts.paletted && set_gamma)
+ {
+ throw image_writer_exception("invalid gamma parameter: unavailable for true color (non-paletted) images");
+ }
+ if ((opts.use_miniz == false) && opts.compression > Z_BEST_COMPRESSION)
+ {
+ throw image_writer_exception("invalid compression value: (only -1 through 9 are valid)");
+ }
+}
+#endif
+
+png_saver::png_saver(std::ostream & stream, std::string const& t):
+ stream_(stream), t_(t) {}
+
+png_saver_pal::png_saver_pal(std::ostream & stream, std::string const& t, rgba_palette const& pal):
+ stream_(stream), t_(t), pal_(pal) {}
+
+template<>
+void png_saver::operator()<image_null> (image_null const& image) const
+{
+ throw image_writer_exception("null images not supported for png");
+}
+
+template<>
+void png_saver_pal::operator()<image_null> (image_null const& image) const
+{
+ throw image_writer_exception("null images not supported for png");
+}
+
+template<>
+void png_saver::operator()<image_view_null> (image_view_null const& image) const
+{
+ throw image_writer_exception("null image views not supported for png");
+}
+
+template<>
+void png_saver_pal::operator()<image_view_null> (image_view_null const& image) const
+{
+ throw image_writer_exception("null image views not supported for png");
+}
+
+template <typename T>
+void process_rgba8_png_pal(T const& image,
+ std::string const& t,
+ std::ostream & stream,
+ rgba_palette const& pal)
+{
+#if defined(HAVE_PNG)
+ png_options opts;
+ handle_png_options(t, opts);
+ if (pal.valid())
+ {
+ png_options opts;
+ handle_png_options(t,opts);
+ save_as_png8_pal(stream, image, pal, opts);
+ }
+ else if (opts.paletted)
+ {
+ if (opts.use_hextree)
+ {
+ save_as_png8_hex(stream, image, opts);
+ }
+ else
+ {
+ save_as_png8_oct(stream, image, opts);
+ }
+ }
+ else
+ {
+ save_as_png(stream, image, opts);
+ }
+#else
+ throw image_writer_exception("png output is not enabled in your build of Mapnik");
+#endif
+}
+
+template <typename T>
+void process_rgba8_png(T const& image,
+ std::string const& t,
+ std::ostream & stream)
+{
+#if defined(HAVE_PNG)
+ png_options opts;
+ handle_png_options(t, opts);
+ if (opts.paletted)
+ {
+ if (opts.use_hextree)
+ {
+ save_as_png8_hex(stream, image, opts);
+ }
+ else
+ {
+ save_as_png8_oct(stream, image, opts);
+ }
+ }
+ else
+ {
+ save_as_png(stream, image, opts);
+ }
+#else
+ throw image_writer_exception("png output is not enabled in your build of Mapnik");
+#endif
+}
+
+template<>
+void png_saver_pal::operator()<image_rgba8> (image_rgba8 const& image) const
+{
+ process_rgba8_png_pal(image, t_, stream_, pal_);
+}
+
+template<>
+void png_saver_pal::operator()<image_view_rgba8> (image_view_rgba8 const& image) const
+{
+ process_rgba8_png_pal(image, t_, stream_, pal_);
+}
+
+template<>
+void png_saver::operator()<image_rgba8> (image_rgba8 const& image) const
+{
+ process_rgba8_png(image, t_, stream_);
+}
+
+template<>
+void png_saver::operator()<image_view_rgba8> (image_view_rgba8 const& image) const
+{
+ process_rgba8_png(image, t_, stream_);
+}
+
+template <typename T>
+void png_saver::operator() (T const& image) const
+{
+#if defined(HAVE_PNG)
+ throw image_writer_exception("Mapnik does not support grayscale images for png");
+ //png_options opts;
+ //handle_png_options(t_, opts);
+ //save_as_png(stream_, image, opts);
+#else
+ throw image_writer_exception("png output is not enabled in your build of Mapnik");
+#endif
+}
+
+template <typename T>
+void png_saver_pal::operator() (T const& image) const
+{
+#if defined(HAVE_PNG)
+ throw image_writer_exception("Mapnik does not support grayscale images for png");
+ //png_options opts;
+ //handle_png_options(t_, opts);
+ //save_as_png(stream_, image, opts);
+#else
+ throw image_writer_exception("png output is not enabled in your build of Mapnik");
+#endif
+}
+
+template void png_saver::operator()<image_rgba8> (image_rgba8 const& image) const;
+template void png_saver::operator()<image_gray8> (image_gray8 const& image) const;
+template void png_saver::operator()<image_gray8s> (image_gray8s const& image) const;
+template void png_saver::operator()<image_gray16> (image_gray16 const& image) const;
+template void png_saver::operator()<image_gray16s> (image_gray16s const& image) const;
+template void png_saver::operator()<image_gray32> (image_gray32 const& image) const;
+template void png_saver::operator()<image_gray32s> (image_gray32s const& image) const;
+template void png_saver::operator()<image_gray32f> (image_gray32f const& image) const;
+template void png_saver::operator()<image_gray64> (image_gray64 const& image) const;
+template void png_saver::operator()<image_gray64s> (image_gray64s const& image) const;
+template void png_saver::operator()<image_gray64f> (image_gray64f const& image) const;
+template void png_saver::operator()<image_view_rgba8> (image_view_rgba8 const& image) const;
+template void png_saver::operator()<image_view_gray8> (image_view_gray8 const& image) const;
+template void png_saver::operator()<image_view_gray8s> (image_view_gray8s const& image) const;
+template void png_saver::operator()<image_view_gray16> (image_view_gray16 const& image) const;
+template void png_saver::operator()<image_view_gray16s> (image_view_gray16s const& image) const;
+template void png_saver::operator()<image_view_gray32> (image_view_gray32 const& image) const;
+template void png_saver::operator()<image_view_gray32s> (image_view_gray32s const& image) const;
+template void png_saver::operator()<image_view_gray32f> (image_view_gray32f const& image) const;
+template void png_saver::operator()<image_view_gray64> (image_view_gray64 const& image) const;
+template void png_saver::operator()<image_view_gray64s> (image_view_gray64s const& image) const;
+template void png_saver::operator()<image_view_gray64f> (image_view_gray64f const& image) const;
+template void png_saver_pal::operator()<image_rgba8> (image_rgba8 const& image) const;
+template void png_saver_pal::operator()<image_gray8> (image_gray8 const& image) const;
+template void png_saver_pal::operator()<image_gray8s> (image_gray8s const& image) const;
+template void png_saver_pal::operator()<image_gray16> (image_gray16 const& image) const;
+template void png_saver_pal::operator()<image_gray16s> (image_gray16s const& image) const;
+template void png_saver_pal::operator()<image_gray32> (image_gray32 const& image) const;
+template void png_saver_pal::operator()<image_gray32s> (image_gray32s const& image) const;
+template void png_saver_pal::operator()<image_gray32f> (image_gray32f const& image) const;
+template void png_saver_pal::operator()<image_gray64> (image_gray64 const& image) const;
+template void png_saver_pal::operator()<image_gray64s> (image_gray64s const& image) const;
+template void png_saver_pal::operator()<image_gray64f> (image_gray64f const& image) const;
+template void png_saver_pal::operator()<image_view_rgba8> (image_view_rgba8 const& image) const;
+template void png_saver_pal::operator()<image_view_gray8> (image_view_gray8 const& image) const;
+template void png_saver_pal::operator()<image_view_gray8s> (image_view_gray8s const& image) const;
+template void png_saver_pal::operator()<image_view_gray16> (image_view_gray16 const& image) const;
+template void png_saver_pal::operator()<image_view_gray16s> (image_view_gray16s const& image) const;
+template void png_saver_pal::operator()<image_view_gray32> (image_view_gray32 const& image) const;
+template void png_saver_pal::operator()<image_view_gray32s> (image_view_gray32s const& image) const;
+template void png_saver_pal::operator()<image_view_gray32f> (image_view_gray32f const& image) const;
+template void png_saver_pal::operator()<image_view_gray64> (image_view_gray64 const& image) const;
+template void png_saver_pal::operator()<image_view_gray64s> (image_view_gray64s const& image) const;
+template void png_saver_pal::operator()<image_view_gray64f> (image_view_gray64f const& image) const;
+
+} // end ns
diff --git a/src/image_util_tiff.cpp b/src/image_util_tiff.cpp
new file mode 100644
index 0000000..3ac72fc
--- /dev/null
+++ b/src/image_util_tiff.cpp
@@ -0,0 +1,204 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#if defined(HAVE_TIFF)
+#include <mapnik/tiff_io.hpp>
+#endif
+
+#include <mapnik/image_util.hpp>
+#include <mapnik/image_util_tiff.hpp>
+#include <mapnik/image.hpp>
+#include <mapnik/image_view.hpp>
+#include <mapnik/image_options.hpp>
+#include <mapnik/util/conversions.hpp>
+
+// stl
+#include <string>
+
+namespace mapnik
+{
+
+#if defined(HAVE_TIFF)
+void handle_tiff_options(std::string const& type,
+ tiff_config & config)
+{
+ if (type == "tiff")
+ {
+ return;
+ }
+ if (type.length() > 4)
+ {
+
+ for (auto const& kv : parse_image_options(type))
+ {
+ auto const& key = kv.first;
+ auto const& val = kv.second;
+ if (key == "tiff") continue;
+ else if (key == "compression")
+ {
+ if (val && !(*val).empty())
+ {
+ if (*val == "deflate")
+ {
+ config.compression = COMPRESSION_DEFLATE;
+ }
+ else if (*val == "adobedeflate")
+ {
+ config.compression = COMPRESSION_ADOBE_DEFLATE;
+ }
+ else if (*val == "lzw")
+ {
+ config.compression = COMPRESSION_LZW;
+ }
+ else if (*val == "none")
+ {
+ config.compression = COMPRESSION_NONE;
+ }
+ else
+ {
+ throw image_writer_exception("invalid tiff compression: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "method")
+ {
+ if (val && !(*val).empty())
+ {
+ if (*val == "scanline")
+ {
+ config.method = TIFF_WRITE_SCANLINE;
+ }
+ else if (*val == "strip" || *val == "stripped")
+ {
+ config.method = TIFF_WRITE_STRIPPED;
+ }
+ else if (*val == "tiled")
+ {
+ config.method = TIFF_WRITE_TILED;
+ }
+ else
+ {
+ throw image_writer_exception("invalid tiff method: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "zlevel")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.zlevel) || config.zlevel < 0 || config.zlevel > 9)
+ {
+ throw image_writer_exception("invalid tiff zlevel: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "tile_height")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.tile_height) || config.tile_height < 0 )
+ {
+ throw image_writer_exception("invalid tiff tile_height: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "tile_width")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.tile_width) || config.tile_width < 0 )
+ {
+ throw image_writer_exception("invalid tiff tile_width: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "rows_per_strip")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.rows_per_strip) || config.rows_per_strip < 0 )
+ {
+ throw image_writer_exception("invalid tiff rows_per_strip: '" + *val + "'");
+ }
+ }
+ }
+ else
+ {
+ throw image_writer_exception("unhandled tiff option: " + key);
+ }
+ }
+ }
+}
+#endif
+
+tiff_saver::tiff_saver(std::ostream & stream, std::string const& t):
+ stream_(stream), t_(t) {}
+
+template<>
+void tiff_saver::operator()<image_null> (image_null const& image) const
+{
+ throw image_writer_exception("null images not supported");
+}
+
+template<>
+void tiff_saver::operator()<image_view_null> (image_view_null const& image) const
+{
+ throw image_writer_exception("null image views not supported");
+}
+
+template <typename T>
+void tiff_saver::operator() (T const& image) const
+{
+#if defined(HAVE_TIFF)
+ tiff_config opts;
+ handle_tiff_options(t_, opts);
+ save_as_tiff(stream_, image, opts);
+#else
+ throw image_writer_exception("tiff output is not enabled in your build of Mapnik");
+#endif
+}
+
+template void tiff_saver::operator()<image_rgba8> (image_rgba8 const& image) const;
+template void tiff_saver::operator()<image_gray8> (image_gray8 const& image) const;
+template void tiff_saver::operator()<image_gray8s> (image_gray8s const& image) const;
+template void tiff_saver::operator()<image_gray16> (image_gray16 const& image) const;
+template void tiff_saver::operator()<image_gray16s> (image_gray16s const& image) const;
+template void tiff_saver::operator()<image_gray32> (image_gray32 const& image) const;
+template void tiff_saver::operator()<image_gray32s> (image_gray32s const& image) const;
+template void tiff_saver::operator()<image_gray32f> (image_gray32f const& image) const;
+template void tiff_saver::operator()<image_gray64> (image_gray64 const& image) const;
+template void tiff_saver::operator()<image_gray64s> (image_gray64s const& image) const;
+template void tiff_saver::operator()<image_gray64f> (image_gray64f const& image) const;
+template void tiff_saver::operator()<image_view_rgba8> (image_view_rgba8 const& image) const;
+template void tiff_saver::operator()<image_view_gray8> (image_view_gray8 const& image) const;
+template void tiff_saver::operator()<image_view_gray8s> (image_view_gray8s const& image) const;
+template void tiff_saver::operator()<image_view_gray16> (image_view_gray16 const& image) const;
+template void tiff_saver::operator()<image_view_gray16s> (image_view_gray16s const& image) const;
+template void tiff_saver::operator()<image_view_gray32> (image_view_gray32 const& image) const;
+template void tiff_saver::operator()<image_view_gray32s> (image_view_gray32s const& image) const;
+template void tiff_saver::operator()<image_view_gray32f> (image_view_gray32f const& image) const;
+template void tiff_saver::operator()<image_view_gray64> (image_view_gray64 const& image) const;
+template void tiff_saver::operator()<image_view_gray64s> (image_view_gray64s const& image) const;
+template void tiff_saver::operator()<image_view_gray64f> (image_view_gray64f const& image) const;
+
+} // end ns
diff --git a/src/image_util_webp.cpp b/src/image_util_webp.cpp
new file mode 100644
index 0000000..c521e1c
--- /dev/null
+++ b/src/image_util_webp.cpp
@@ -0,0 +1,386 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#if defined(HAVE_WEBP)
+#include <mapnik/webp_io.hpp>
+#endif
+
+#include <mapnik/image_util.hpp>
+#include <mapnik/image_util_webp.hpp>
+#include <mapnik/image.hpp>
+#include <mapnik/image_any.hpp>
+#include <mapnik/image_view.hpp>
+#include <mapnik/image_options.hpp>
+#include <mapnik/util/conversions.hpp>
+
+// stl
+#include <string>
+#include <iostream>
+
+namespace mapnik
+{
+
+#if defined(HAVE_WEBP)
+void handle_webp_options(std::string const& type,
+ WebPConfig & config,
+ bool & alpha)
+{
+ if (type == "webp")
+ {
+ return;
+ }
+ if (type.length() > 4)
+ {
+ for (auto const& kv : parse_image_options(type))
+ {
+ auto const& key = kv.first;
+ auto const& val = kv.second;
+
+ if (key == "webp") continue;
+ else if (key == "quality")
+ {
+ if (val && !(*val).empty())
+ {
+ double quality = 90;
+ if (!mapnik::util::string2double(*val,quality) || quality < 0.0 || quality > 100.0)
+ {
+ throw image_writer_exception("invalid webp quality: '" + *val + "'");
+ }
+ config.quality = static_cast<float>(quality);
+ }
+ }
+ else if (key == "method")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.method) || config.method < 0 || config.method > 6)
+ {
+ throw image_writer_exception("invalid webp method: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "lossless")
+ {
+ if (val && !(*val).empty())
+ {
+ #if (WEBP_ENCODER_ABI_VERSION >> 8) >= 1 // >= v0.1.99 / 0x0100
+ if (!mapnik::util::string2int(*val,config.lossless) || config.lossless < 0 || config.lossless > 1)
+ {
+ throw image_writer_exception("invalid webp lossless: '" + *val + "'");
+ }
+ #else
+ #ifdef _MSC_VER
+ #pragma NOTE(compiling against webp that does not support the lossless flag)
+ #else
+ #warning "compiling against webp that does not support the lossless flag"
+ #endif
+ throw image_writer_exception("your webp version does not support the lossless option");
+ #endif
+ }
+ }
+ else if (key == "image_hint")
+ {
+ if (val && !(*val).empty())
+ {
+ #if (WEBP_ENCODER_ABI_VERSION >> 8) >= 1 // >= v0.1.99 / 0x0100
+ int image_hint = 0;
+ if (!mapnik::util::string2int(*val,image_hint) || image_hint < 0 || image_hint > 3)
+ {
+ throw image_writer_exception("invalid webp image_hint: '" + *val + "'");
+ }
+ config.image_hint = static_cast<WebPImageHint>(image_hint);
+ #else
+ #ifdef _MSC_VER
+ #pragma NOTE(compiling against webp that does not support the image_hint flag)
+ #else
+ #warning "compiling against webp that does not support the image_hint flag"
+ #endif
+ throw image_writer_exception("your webp version does not support the image_hint option");
+ #endif
+ }
+ }
+ else if (key == "alpha")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2bool(*val,alpha))
+ {
+ throw image_writer_exception("invalid webp alpha: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "target_size")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.target_size))
+ {
+ throw image_writer_exception("invalid webp target_size: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "target_psnr")
+ {
+ if (val && !(*val).empty())
+ {
+ double psnr = 0;
+ if (!mapnik::util::string2double(*val,psnr))
+ {
+ throw image_writer_exception("invalid webp target_psnr: '" + *val + "'");
+ }
+ config.target_PSNR = psnr;
+ }
+ }
+ else if (key == "segments")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.segments))
+ {
+ throw image_writer_exception("invalid webp segments: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "sns_strength")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.sns_strength))
+ {
+ throw image_writer_exception("invalid webp sns_strength: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "filter_strength")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.filter_strength))
+ {
+ throw image_writer_exception("invalid webp filter_strength: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "filter_sharpness")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.filter_sharpness))
+ {
+ throw image_writer_exception("invalid webp filter_sharpness: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "filter_type")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.filter_type))
+ {
+ throw image_writer_exception("invalid webp filter_type: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "autofilter")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.autofilter))
+ {
+ throw image_writer_exception("invalid webp autofilter: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "alpha_compression")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.alpha_compression))
+ {
+ throw image_writer_exception("invalid webp alpha_compression: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "alpha_filtering")
+ {
+ if (val && !(*val).empty())
+ {
+ #if (WEBP_ENCODER_ABI_VERSION >> 8) >= 1 // >= v0.1.99 / 0x0100
+ if (!mapnik::util::string2int(*val,config.alpha_filtering))
+ {
+ throw image_writer_exception("invalid webp alpha_filtering: '" + *val + "'");
+ }
+ #else
+ #ifdef _MSC_VER
+ #pragma NOTE(compiling against webp that does not support the alpha_filtering flag)
+ #else
+ #warning "compiling against webp that does not support the alpha_filtering flag"
+ #endif
+ throw image_writer_exception("your webp version does not support the alpha_filtering option");
+ #endif
+ }
+ }
+ else if (key == "alpha_quality")
+ {
+ if (val && !(*val).empty())
+ {
+ #if (WEBP_ENCODER_ABI_VERSION >> 8) >= 1 // >= v0.1.99 / 0x0100
+ if (!mapnik::util::string2int(*val,config.alpha_quality))
+ {
+ throw image_writer_exception("invalid webp alpha_quality: '" + *val + "'");
+ }
+ #else
+ #ifdef _MSC_VER
+ #pragma NOTE(compiling against webp that does not support the alpha_quality flag)
+ #else
+ #warning "compiling against webp that does not support the alpha_quality flag"
+ #endif
+ throw image_writer_exception("your webp version does not support the alpha_quality option");
+ #endif
+ }
+ }
+ else if (key == "pass")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.pass))
+ {
+ throw image_writer_exception("invalid webp pass: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "preprocessing")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.preprocessing))
+ {
+ throw image_writer_exception("invalid webp preprocessing: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "partitions")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.partitions))
+ {
+ throw image_writer_exception("invalid webp partitions: '" + *val + "'");
+ }
+ }
+ }
+ else if (key == "partition_limit")
+ {
+ if (val && !(*val).empty())
+ {
+ if (!mapnik::util::string2int(*val,config.partition_limit))
+ {
+ throw image_writer_exception("invalid webp partition_limit: '" + *val + "'");
+ }
+ }
+ }
+ else
+ {
+ throw image_writer_exception("unhandled webp option: " + key);
+ }
+ }
+ }
+}
+#endif
+
+webp_saver::webp_saver(std::ostream & stream, std::string const& t):
+ stream_(stream), t_(t) {}
+
+template<>
+void webp_saver::operator()<image_null> (image_null const& image) const
+{
+ throw image_writer_exception("null images not supported");
+}
+
+template<>
+void webp_saver::operator()<image_view_null> (image_view_null const& image) const
+{
+ throw image_writer_exception("null image views not supported");
+}
+
+template <typename T>
+void process_rgba8_webp(T const& image, std::string const& t, std::ostream & stream)
+{
+#if defined(HAVE_WEBP)
+ WebPConfig config;
+ // Default values set here will be lossless=0 and quality=75 (as least as of webp v0.3.1)
+ if (!WebPConfigInit(&config))
+ {
+ throw std::runtime_error("version mismatch");
+ }
+ // see for more details: https://github.com/mapnik/mapnik/wiki/Image-IO#webp-output-options
+ bool alpha = true;
+ handle_webp_options(t,config,alpha);
+ save_as_webp(stream,image,config,alpha);
+#else
+ throw image_writer_exception("webp output is not enabled in your build of Mapnik");
+#endif
+}
+
+template <>
+void webp_saver::operator()<image_rgba8> (image_rgba8 const& image) const
+{
+ process_rgba8_webp(image, t_, stream_);
+}
+
+template <>
+void webp_saver::operator()<image_view_rgba8> (image_view_rgba8 const& image) const
+{
+ process_rgba8_webp(image, t_, stream_);
+}
+
+template <typename T>
+void webp_saver::operator() (T const& image) const
+{
+ throw image_writer_exception("Mapnik does not support webp grayscale images");
+}
+
+template void webp_saver::operator()<image_rgba8> (image_rgba8 const& image) const;
+template void webp_saver::operator()<image_gray8> (image_gray8 const& image) const;
+template void webp_saver::operator()<image_gray8s> (image_gray8s const& image) const;
+template void webp_saver::operator()<image_gray16> (image_gray16 const& image) const;
+template void webp_saver::operator()<image_gray16s> (image_gray16s const& image) const;
+template void webp_saver::operator()<image_gray32> (image_gray32 const& image) const;
+template void webp_saver::operator()<image_gray32s> (image_gray32s const& image) const;
+template void webp_saver::operator()<image_gray32f> (image_gray32f const& image) const;
+template void webp_saver::operator()<image_gray64> (image_gray64 const& image) const;
+template void webp_saver::operator()<image_gray64s> (image_gray64s const& image) const;
+template void webp_saver::operator()<image_gray64f> (image_gray64f const& image) const;
+template void webp_saver::operator()<image_view_rgba8> (image_view_rgba8 const& image) const;
+template void webp_saver::operator()<image_view_gray8> (image_view_gray8 const& image) const;
+template void webp_saver::operator()<image_view_gray8s> (image_view_gray8s const& image) const;
+template void webp_saver::operator()<image_view_gray16> (image_view_gray16 const& image) const;
+template void webp_saver::operator()<image_view_gray16s> (image_view_gray16s const& image) const;
+template void webp_saver::operator()<image_view_gray32> (image_view_gray32 const& image) const;
+template void webp_saver::operator()<image_view_gray32s> (image_view_gray32s const& image) const;
+template void webp_saver::operator()<image_view_gray32f> (image_view_gray32f const& image) const;
+template void webp_saver::operator()<image_view_gray64> (image_view_gray64 const& image) const;
+template void webp_saver::operator()<image_view_gray64s> (image_view_gray64s const& image) const;
+template void webp_saver::operator()<image_view_gray64f> (image_view_gray64f const& image) const;
+
+} // end ns
diff --git a/src/image_view.cpp b/src/image_view.cpp
new file mode 100644
index 0000000..680e54e
--- /dev/null
+++ b/src/image_view.cpp
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/image_view.hpp>
+#include <mapnik/image_view_impl.hpp>
+#include <mapnik/image_view_null.hpp>
+#include <mapnik/pixel_types.hpp>
+
+namespace mapnik
+{
+
+template class MAPNIK_DECL image_view<image_null>;
+template class MAPNIK_DECL image_view<image_rgba8>;
+template class MAPNIK_DECL image_view<image_gray8>;
+template class MAPNIK_DECL image_view<image_gray8s>;
+template class MAPNIK_DECL image_view<image_gray16>;
+template class MAPNIK_DECL image_view<image_gray16s>;
+template class MAPNIK_DECL image_view<image_gray32>;
+template class MAPNIK_DECL image_view<image_gray32s>;
+template class MAPNIK_DECL image_view<image_gray32f>;
+template class MAPNIK_DECL image_view<image_gray64>;
+template class MAPNIK_DECL image_view<image_gray64s>;
+template class MAPNIK_DECL image_view<image_gray64f>;
+
+} // end ns mapnik
diff --git a/src/image_view_any.cpp b/src/image_view_any.cpp
new file mode 100644
index 0000000..8bf89b4
--- /dev/null
+++ b/src/image_view_any.cpp
@@ -0,0 +1,143 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#include <mapnik/image_view_any.hpp>
+
+namespace mapnik {
+
+namespace detail {
+
+struct get_view_width_visitor
+{
+ template <typename T>
+ std::size_t operator()(T const& data) const
+ {
+ return data.width();
+ }
+};
+
+struct get_view_height_visitor
+{
+ template <typename T>
+ std::size_t operator()(T const& data) const
+ {
+ return data.height();
+ }
+};
+
+struct get_view_size_visitor
+{
+ template <typename T>
+ unsigned operator()(T const& data) const
+ {
+ return data.size();
+ }
+};
+
+struct get_view_dtype_visitor
+{
+ template <typename T>
+ image_dtype operator()(T const& data) const
+ {
+ return data.get_dtype();
+ }
+};
+
+struct get_view_row_size_visitor
+{
+ template <typename T>
+ unsigned operator()(T const& data) const
+ {
+ return data.row_size();
+ }
+};
+
+struct get_view_premultiplied_visitor
+{
+ template <typename T>
+ bool operator()(T const& data) const
+ {
+ return data.get_premultiplied();
+ }
+};
+
+struct get_view_offset_visitor
+{
+ template <typename T>
+ double operator()(T const& data) const
+ {
+ return data.get_offset();
+ }
+};
+
+struct get_view_scaling_visitor
+{
+ template <typename T>
+ double operator()(T const& data) const
+ {
+ return data.get_scaling();
+ }
+};
+
+} // end namespace detail
+
+std::size_t image_view_any::width() const
+{
+ return util::apply_visitor(detail::get_view_width_visitor(),*this);
+}
+
+std::size_t image_view_any::height() const
+{
+ return util::apply_visitor(detail::get_view_height_visitor(),*this);
+}
+
+std::size_t image_view_any::size() const
+{
+ return util::apply_visitor(detail::get_view_size_visitor(),*this);
+}
+
+std::size_t image_view_any::row_size() const
+{
+ return util::apply_visitor(detail::get_view_row_size_visitor(),*this);
+}
+
+bool image_view_any::get_premultiplied() const
+{
+ return util::apply_visitor(detail::get_view_premultiplied_visitor(),*this);
+}
+
+double image_view_any::get_offset() const
+{
+ return util::apply_visitor(detail::get_view_offset_visitor(),*this);
+}
+
+double image_view_any::get_scaling() const
+{
+ return util::apply_visitor(detail::get_view_scaling_visitor(),*this);
+}
+
+image_dtype image_view_any::get_dtype() const
+{
+ return util::apply_visitor(detail::get_view_dtype_visitor(),*this);
+}
+
+} // end mapnik ns
diff --git a/src/jpeg_reader.cpp b/src/jpeg_reader.cpp
index af2d400..2134694 100644
--- a/src/jpeg_reader.cpp
+++ b/src/jpeg_reader.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -81,11 +81,12 @@ public:
explicit jpeg_reader(std::string const& file_name);
explicit jpeg_reader(char const* data, size_t size);
~jpeg_reader();
- unsigned width() const;
- unsigned height() const;
- inline bool has_alpha() const { return false; }
- inline bool premultiplied_alpha() const { return true; }
- void read(unsigned x,unsigned y,image_data_32& image);
+ unsigned width() const final;
+ unsigned height() const final;
+ boost::optional<box2d<double> > bounding_box() const final;
+ inline bool has_alpha() const final { return false; }
+ void read(unsigned x,unsigned y,image_rgba8& image) final;
+ image_any read(unsigned x, unsigned y, unsigned width, unsigned height) final;
private:
void init();
static void on_error(j_common_ptr cinfo);
@@ -258,7 +259,13 @@ unsigned jpeg_reader<T>::height() const
}
template <typename T>
-void jpeg_reader<T>::read(unsigned x0, unsigned y0, image_data_32& image)
+boost::optional<box2d<double> > jpeg_reader<T>::bounding_box() const
+{
+ return boost::optional<box2d<double> >();
+}
+
+template <typename T>
+void jpeg_reader<T>::read(unsigned x0, unsigned y0, image_rgba8& image)
{
stream_.clear();
stream_.seekg(0, std::ios_base::beg);
@@ -305,11 +312,19 @@ void jpeg_reader<T>::read(unsigned x0, unsigned y0, image_data_32& image)
}
out_row[x] = color(r, g, b, a).rgba();
}
- image.setRow(row - y0, out_row.get(), w);
+ image.set_row(row - y0, out_row.get(), w);
}
++row;
}
jpeg_finish_decompress(&cinfo);
}
+template <typename T>
+image_any jpeg_reader<T>::read(unsigned x, unsigned y, unsigned width, unsigned height)
+{
+ image_rgba8 data(width,height, true, true);
+ read(x, y, data);
+ return image_any(std::move(data));
+}
+
}
diff --git a/src/json/build.py b/src/json/build.py
index 45b4b47..c7b1b96 100644
--- a/src/json/build.py
+++ b/src/json/build.py
@@ -17,7 +17,7 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
-#
+#
import os
from glob import glob
diff --git a/src/json/mapnik_json_feature_collection_grammar.cpp b/src/json/mapnik_json_feature_collection_grammar.cpp
index 779c2e3..9e13d94 100644
--- a/src/json/mapnik_json_feature_collection_grammar.cpp
+++ b/src/json/mapnik_json_feature_collection_grammar.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2014 Artem Pavlenko, Jean-Francois Doyon
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,5 +24,5 @@
#include <mapnik/json/feature_collection_grammar_impl.hpp>
#include <string>
-using iterator_type = std::string::const_iterator;
-template struct mapnik::json::feature_collection_grammar<iterator_type,mapnik::feature_impl> ;
+using iterator_type = char const*;
+template struct mapnik::json::feature_collection_grammar<iterator_type,mapnik::feature_impl, mapnik::json::default_feature_callback> ;
diff --git a/src/json/mapnik_json_feature_grammar.cpp b/src/json/mapnik_json_feature_grammar.cpp
index 9380932..3742dfd 100644
--- a/src/json/mapnik_json_feature_grammar.cpp
+++ b/src/json/mapnik_json_feature_grammar.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2014 Artem Pavlenko, Jean-Francois Doyon
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,5 +24,5 @@
#include <mapnik/json/feature_grammar_impl.hpp>
#include <string>
-using iterator_type = std::string::const_iterator;
+using iterator_type = char const*;
template struct mapnik::json::feature_grammar<iterator_type,mapnik::feature_impl>;
diff --git a/src/json/mapnik_json_generator_grammar.cpp b/src/json/mapnik_json_generator_grammar.cpp
index bc7bc5f..10b1382 100644
--- a/src/json/mapnik_json_generator_grammar.cpp
+++ b/src/json/mapnik_json_generator_grammar.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2014 Artem Pavlenko, Jean-Francois Doyon
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -21,12 +21,15 @@
*****************************************************************************/
#include <mapnik/geometry.hpp>
-#include <mapnik/geometry_container.hpp>
-#include <mapnik/json/feature_generator_grammar_impl.hpp>
+
#include <mapnik/json/geometry_generator_grammar_impl.hpp>
+#include <mapnik/json/properties_generator_grammar_impl.hpp>
+#include <mapnik/json/feature_generator_grammar_impl.hpp>
+
#include <string>
using sink_type = std::back_insert_iterator<std::string>;
-template struct mapnik::json::feature_generator_grammar<sink_type>;
-template struct mapnik::json::geometry_generator_grammar<sink_type, mapnik::geometry_type>;
-template struct mapnik::json::multi_geometry_generator_grammar<sink_type, mapnik::geometry_container>;
+
+template struct mapnik::json::properties_generator_grammar<sink_type, mapnik::feature_impl>;
+template struct mapnik::json::feature_generator_grammar<sink_type, mapnik::feature_impl>;
+template struct mapnik::json::geometry_generator_grammar<sink_type, mapnik::geometry::geometry<double> >;
diff --git a/src/json/mapnik_json_geometry_grammar.cpp b/src/json/mapnik_json_geometry_grammar.cpp
index dff5bc4..73456fa 100644
--- a/src/json/mapnik_json_geometry_grammar.cpp
+++ b/src/json/mapnik_json_geometry_grammar.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2014 Artem Pavlenko, Jean-Francois Doyon
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,5 +23,5 @@
#include <mapnik/json/geometry_grammar_impl.hpp>
#include <string>
-using iterator_type = std::string::const_iterator;
-template struct mapnik::json::geometry_grammar<iterator_type>;
\ No newline at end of file
+using iterator_type = char const*;
+template struct mapnik::json::geometry_grammar<iterator_type>;
diff --git a/src/json/mapnik_topojson_grammar.cpp b/src/json/mapnik_topojson_grammar.cpp
index 6f232ab..81d6552 100644
--- a/src/json/mapnik_topojson_grammar.cpp
+++ b/src/json/mapnik_topojson_grammar.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2014 Artem Pavlenko, Jean-Francois Doyon
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/layer.cpp b/src/layer.cpp
index dd66f26..1a9cf83 100644
--- a/src/layer.cpp
+++ b/src/layer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -34,8 +34,8 @@ namespace mapnik
layer::layer(std::string const& name, std::string const& srs)
: name_(name),
srs_(srs),
- min_zoom_(0),
- max_zoom_(std::numeric_limits<double>::max()),
+ minimum_scale_denom_(0),
+ maximum_scale_denom_(std::numeric_limits<double>::max()),
active_(true),
queryable_(false),
clear_label_cache_(false),
@@ -49,8 +49,8 @@ layer::layer(std::string const& name, std::string const& srs)
layer::layer(layer const& rhs)
: name_(rhs.name_),
srs_(rhs.srs_),
- min_zoom_(rhs.min_zoom_),
- max_zoom_(rhs.max_zoom_),
+ minimum_scale_denom_(rhs.minimum_scale_denom_),
+ maximum_scale_denom_(rhs.maximum_scale_denom_),
active_(rhs.active_),
queryable_(rhs.queryable_),
clear_label_cache_(rhs.clear_label_cache_),
@@ -64,8 +64,8 @@ layer::layer(layer const& rhs)
layer::layer(layer && rhs)
: name_(std::move(rhs.name_)),
srs_(std::move(rhs.srs_)),
- min_zoom_(std::move(rhs.min_zoom_)),
- max_zoom_(std::move(rhs.max_zoom_)),
+ minimum_scale_denom_(std::move(rhs.minimum_scale_denom_)),
+ maximum_scale_denom_(std::move(rhs.maximum_scale_denom_)),
active_(std::move(rhs.active_)),
queryable_(std::move(rhs.queryable_)),
clear_label_cache_(std::move(rhs.clear_label_cache_)),
@@ -81,8 +81,8 @@ layer& layer::operator=(layer rhs)
using std::swap;
std::swap(this->name_,rhs.name_);
std::swap(this->srs_, rhs.srs_);
- std::swap(this->min_zoom_, rhs.min_zoom_);
- std::swap(this->max_zoom_,rhs.max_zoom_);
+ std::swap(this->minimum_scale_denom_, rhs.minimum_scale_denom_);
+ std::swap(this->maximum_scale_denom_,rhs.maximum_scale_denom_);
std::swap(this->active_, rhs.active_);
std::swap(this->queryable_, rhs.queryable_);
std::swap(this->clear_label_cache_, rhs.clear_label_cache_);
@@ -99,8 +99,8 @@ bool layer::operator==(layer const& rhs) const
{
return (name_ == rhs.name_) &&
(srs_ == rhs.srs_) &&
- (min_zoom_ == rhs.min_zoom_) &&
- (max_zoom_ == rhs.max_zoom_) &&
+ (minimum_scale_denom_ == rhs.minimum_scale_denom_) &&
+ (maximum_scale_denom_ == rhs.maximum_scale_denom_) &&
(active_ == rhs.active_) &&
(queryable_ == rhs.queryable_) &&
(clear_label_cache_ == rhs.clear_label_cache_) &&
@@ -149,24 +149,24 @@ std::vector<std::string> & layer::styles()
return styles_;
}
-void layer::set_min_zoom(double min_zoom)
+void layer::set_minimum_scale_denominator(double minimum_scale_denom)
{
- min_zoom_=min_zoom;
+ minimum_scale_denom_=minimum_scale_denom;
}
-void layer::set_max_zoom(double max_zoom)
+void layer::set_maximum_scale_denominator(double maximum_scale_denom)
{
- max_zoom_=max_zoom;
+ maximum_scale_denom_=maximum_scale_denom;
}
-double layer::min_zoom() const
+double layer::minimum_scale_denominator() const
{
- return min_zoom_;
+ return minimum_scale_denom_;
}
-double layer::max_zoom() const
+double layer::maximum_scale_denominator() const
{
- return max_zoom_;
+ return maximum_scale_denom_;
}
void layer::set_active(bool active)
@@ -179,9 +179,9 @@ bool layer::active() const
return active_;
}
-bool layer::visible(double scale) const
+bool layer::visible(double scale_denom) const
{
- return active() && scale >= min_zoom_ - 1e-6 && scale < max_zoom_ + 1e-6;
+ return active() && scale_denom >= minimum_scale_denom_ - 1e-6 && scale_denom < maximum_scale_denom_ + 1e-6;
}
void layer::set_queryable(bool queryable)
diff --git a/src/libxml2_loader.cpp b/src/libxml2_loader.cpp
index 5c03f87..70ca728 100644
--- a/src/libxml2_loader.cpp
+++ b/src/libxml2_loader.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,7 +27,7 @@
#include <mapnik/xml_node.hpp>
#include <mapnik/config_error.hpp>
#include <mapnik/util/trim.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/util/fs.hpp>
// libxml
@@ -43,7 +43,7 @@
namespace mapnik
{
-class libxml2_loader : mapnik::noncopyable
+class libxml2_loader : util::noncopyable
{
public:
libxml2_loader(const char *encoding = nullptr, int options = DEFAULT_OPTIONS, const char *url = nullptr) :
diff --git a/src/load_map.cpp b/src/load_map.cpp
index 74f7b38..75ab4ea 100644
--- a/src/load_map.cpp
+++ b/src/load_map.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -50,7 +50,7 @@
#include <mapnik/util/conversions.hpp>
#include <mapnik/util/trim.hpp>
#include <mapnik/marker_cache.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/util/fs.hpp>
#include <mapnik/image_filter_types.hpp>
#include <mapnik/projection.hpp>
@@ -65,10 +65,9 @@
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <boost/static_assert.hpp>
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#include <boost/algorithm/string.hpp>
-#pragma GCC diagnostic pop
+
+// stl
+#include <algorithm>
// agg
#include "agg_trans_affine.h"
@@ -84,7 +83,7 @@ constexpr unsigned name2int(const char *str, int off = 0)
return !str[off] ? 5381 : (name2int(str, off+1)*33) ^ str[off];
}
-class map_parser : mapnik::noncopyable
+class map_parser : util::noncopyable
{
public:
map_parser(Map & map, bool strict, std::string const& filename = "") :
@@ -119,6 +118,7 @@ private:
void parse_markers_symbolizer(rule & rule, xml_node const& node);
void parse_group_symbolizer(rule &rule, xml_node const& node);
void parse_debug_symbolizer(rule & rule, xml_node const& node);
+ void parse_dot_symbolizer(rule & rule, xml_node const& node);
void parse_group_rule(group_symbolizer_properties &prop, xml_node const& node);
void parse_simple_layout(group_symbolizer_properties &prop, xml_node const& node);
void parse_pair_layout(group_symbolizer_properties &prop, xml_node const& node);
@@ -377,25 +377,15 @@ void map_parser::parse_map_include(Map & map, xml_node const& node)
{
if (p.is("Parameter"))
{
- bool is_string = true;
- boost::optional<std::string> type = p.get_opt_attr<std::string>("type");
- if (type)
- {
- if (*type == "int")
- {
- is_string = false;
- params[p.get_attr<std::string>("name")] = p.get_value<mapnik::value_integer>();
- }
- else if (*type == "float")
- {
- is_string = false;
- params[p.get_attr<std::string>("name")] = p.get_value<mapnik::value_double>();
- }
- }
- if (is_string)
- {
- params[p.get_attr<std::string>("name")] = p.get_text();
- }
+ std::string val = p.get_text();
+ std::string key = p.get_attr<std::string>("name");
+ mapnik::value_bool b;
+ mapnik::value_integer i;
+ mapnik::value_double d;
+ if (mapnik::util::string2int(val,i)) params[key] = i;
+ else if (mapnik::util::string2bool(val,b)) params[key] = b;
+ else if (mapnik::util::string2double(val,d)) params[key] = d;
+ else params[key] = val;
}
}
}
@@ -597,17 +587,34 @@ void map_parser::parse_layer(Map & map, xml_node const& node)
lyr.set_active(* status);
}
- optional<double> min_zoom = node.get_opt_attr<double>("minzoom");
- if (min_zoom)
+ optional<double> minimum_scale_denom = node.get_opt_attr<double>("minimum-scale-denominator");
+ if (minimum_scale_denom)
{
- lyr.set_min_zoom(* min_zoom);
+ lyr.set_minimum_scale_denominator(* minimum_scale_denom);
+ }
+ else // back compatibility: remove at Mapnik 4.x
+ {
+ optional<double> min_zoom = node.get_opt_attr<double>("minzoom");
+ if (min_zoom)
+ {
+ MAPNIK_LOG_ERROR(markers_symbolizer) << "'minzoom' is deprecated and will be removed in Mapnik 4.x, use 'minimum-scale-denominator' instead (encountered in layer " << name << ")";
+ lyr.set_minimum_scale_denominator(* min_zoom);
+ }
}
-
- optional<double> max_zoom = node.get_opt_attr<double>("maxzoom");
- if (max_zoom)
+ optional<double> maximum_scale_denom = node.get_opt_attr<double>("maximum-scale-denominator");
+ if (maximum_scale_denom)
+ {
+ lyr.set_maximum_scale_denominator(* maximum_scale_denom);
+ }
+ else // back compatibility: remove at Mapnik 4.x
{
- lyr.set_max_zoom(* max_zoom);
+ optional<double> max_zoom = node.get_opt_attr<double>("maxzoom");
+ if (max_zoom)
+ {
+ MAPNIK_LOG_ERROR(markers_symbolizer) << "'maxzoom' is deprecated and will be removed in Mapnik 4.x, use 'maximum-scale-denominator' instead (encountered in layer " << name << ")";
+ lyr.set_maximum_scale_denominator(* max_zoom);
+ }
}
optional<mapnik::boolean_type> queryable = node.get_opt_attr<mapnik::boolean_type>("queryable");
@@ -863,6 +870,11 @@ void map_parser::parse_symbolizers(rule & rule, xml_node const & node)
parse_debug_symbolizer(rule, sym_node);
sym_node.set_processed(true);
break;
+ case name2int("DotSymbolizer"):
+ parse_dot_symbolizer(rule, sym_node);
+ sym_node.set_processed(true);
+ break;
+
default:
break;
}
@@ -918,6 +930,25 @@ void map_parser::parse_point_symbolizer(rule & rule, xml_node const & node)
}
}
+void map_parser::parse_dot_symbolizer(rule & rule, xml_node const & node)
+{
+ try
+ {
+ dot_symbolizer sym;
+ set_symbolizer_property<symbolizer_base,color>(sym, keys::fill, node);
+ set_symbolizer_property<symbolizer_base,double>(sym, keys::opacity, node);
+ set_symbolizer_property<symbolizer_base,double>(sym, keys::width, node);
+ set_symbolizer_property<symbolizer_base,double>(sym, keys::height, node);
+ set_symbolizer_property<symbolizer_base,composite_mode_e>(sym, keys::comp_op, node);
+ rule.append(std::move(sym));
+ }
+ catch (config_error const& ex)
+ {
+ ex.append_context(node);
+ throw;
+ }
+}
+
void map_parser::parse_markers_symbolizer(rule & rule, xml_node const& node)
{
try
@@ -981,6 +1012,7 @@ void map_parser::parse_markers_symbolizer(rule & rule, xml_node const& node)
set_symbolizer_property<symbolizer_base,transform_type>(sym, keys::image_transform, node);
set_symbolizer_property<symbolizer_base,marker_placement_enum>(sym, keys::markers_placement_type, node);
set_symbolizer_property<symbolizer_base,marker_multi_policy_enum>(sym, keys::markers_multipolicy, node);
+ set_symbolizer_property<symbolizer_base,direction_enum>(sym, keys::direction, node);
parse_stroke(sym,node);
rule.append(std::move(sym));
}
@@ -1086,17 +1118,20 @@ void map_parser::parse_text_symbolizer(rule & rule, xml_node const& node)
placements = std::make_shared<text_placements_dummy>();
placements->defaults.from_xml(node, fontsets_, false);
}
- if (strict_ && !placements->defaults.format_defaults.fontset)
+ if (placements)
{
- ensure_font_face(placements->defaults.format_defaults.face_name);
+ if (strict_ && !placements->defaults.format_defaults.fontset)
+ {
+ ensure_font_face(placements->defaults.format_defaults.face_name);
+ }
+ text_symbolizer sym;
+ parse_symbolizer_base(sym, node);
+ put<text_placements_ptr>(sym, keys::text_placements_, placements);
+ set_symbolizer_property<symbolizer_base,composite_mode_e>(sym, keys::halo_comp_op, node);
+ set_symbolizer_property<symbolizer_base,halo_rasterizer_enum>(sym, keys::halo_rasterizer, node);
+ set_symbolizer_property<symbolizer_base,transform_type>(sym, keys::halo_transform, node);
+ rule.append(std::move(sym));
}
- text_symbolizer sym;
- parse_symbolizer_base(sym, node);
- put<text_placements_ptr>(sym, keys::text_placements_, placements);
- set_symbolizer_property<symbolizer_base,composite_mode_e>(sym, keys::halo_comp_op, node);
- set_symbolizer_property<symbolizer_base,halo_rasterizer_enum>(sym, keys::halo_rasterizer, node);
- set_symbolizer_property<symbolizer_base,transform_type>(sym, keys::halo_transform, node);
- rule.append(std::move(sym));
}
catch (config_error const& ex)
{
@@ -1256,10 +1291,10 @@ void map_parser::parse_raster_symbolizer(rule & rule, xml_node const & node)
if (mode)
{
std::string mode_string = *mode;
- if (boost::algorithm::find_first(mode_string,"_"))
+ if (mode_string.find('_') != std::string::npos)
{
MAPNIK_LOG_ERROR(raster_symbolizer) << "'mode' values using \"_\" are deprecated and will be removed in Mapnik 3.x, use \"-\"instead";
- boost::algorithm::replace_all(mode_string,"_","-");
+ std::replace(mode_string.begin(), mode_string.end(), '_', '-');
}
put(raster_sym, keys::mode, mode_string);
}
@@ -1588,7 +1623,7 @@ void map_parser::ensure_exists(std::string const& file_path)
if (marker_cache::instance().is_uri(file_path))
return;
// validate that the filename exists if it is not a dynamic PathExpression
- if (!boost::algorithm::find_first(file_path,"[") && !boost::algorithm::find_first(file_path,"]"))
+ if (file_path.find('[') == std::string::npos && file_path.find(']') == std::string::npos)
{
if (!mapnik::util::exists(file_path))
{
@@ -1623,12 +1658,14 @@ void map_parser::find_unused_nodes_recursive(xml_node const& node, std::string &
{
if (node.is_text())
{
- error_message += "\n* text '" + node.text() + "'";
+ error_message += "\n* text '" + node.text();
}
else
{
- error_message += "\n* node '" + node.name() + "' at line " + node.line_to_string();
+ error_message += "\n* node '" + node.name();
}
+ error_message += "' at line " + node.line_to_string();
+
return; //All attributes and children are automatically unprocessed, too.
}
xml_node::attribute_map const& attrs = node.get_attributes();
diff --git a/src/map.cpp b/src/map.cpp
index 764f82d..c8e1da1 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -340,6 +340,9 @@ void Map::remove_all()
{
layers_.clear();
styles_.clear();
+ fontsets_.clear();
+ font_file_mapping_.clear();
+ font_memory_cache_.clear();
}
layer const& Map::get_layer(size_t index) const
diff --git a/src/mapped_memory_cache.cpp b/src/mapped_memory_cache.cpp
index 36b2aa8..c589681 100644
--- a/src/mapped_memory_cache.cpp
+++ b/src/mapped_memory_cache.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -38,7 +38,7 @@ namespace mapnik
void mapped_memory_cache::clear()
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
return cache_.clear();
}
@@ -46,7 +46,7 @@ void mapped_memory_cache::clear()
bool mapped_memory_cache::insert(std::string const& uri, mapped_region_ptr mem)
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
return cache_.emplace(uri,mem).second;
}
@@ -54,7 +54,7 @@ bool mapped_memory_cache::insert(std::string const& uri, mapped_region_ptr mem)
boost::optional<mapped_region_ptr> mapped_memory_cache::find(std::string const& uri, bool update_cache)
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
using iterator_type = std::unordered_map<std::string, mapped_region_ptr>::const_iterator;
boost::optional<mapped_region_ptr> result;
diff --git a/src/marker_cache.cpp b/src/marker_cache.cpp
index 024be9c..e0fe08d 100644
--- a/src/marker_cache.cpp
+++ b/src/marker_cache.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -62,10 +62,7 @@ marker_cache::marker_cache()
"<svg width='100%' height='100%' version='1.1' xmlns='http://www.w3.org/2000/svg'>"
"<path fill='#0000FF' stroke='black' stroke-width='.5' d='m 31.698405,7.5302648 -8.910967,-6.0263712 0.594993,4.8210971 -18.9822542,0 0,2.4105482 18.9822542,0 -0.594993,4.8210971 z'/>"
"</svg>");
- boost::optional<mapnik::image_ptr> bitmap_data = boost::optional<mapnik::image_ptr>(std::make_shared<image_data_32>(4,4));
- (*bitmap_data)->set(0xff000000);
- marker_ptr mark = std::make_shared<mapnik::marker>(bitmap_data);
- marker_cache_.emplace("image://square",mark);
+ marker_cache_.emplace("image://square",std::make_shared<mapnik::marker const>(mapnik::marker_rgba8()));
}
marker_cache::~marker_cache() {}
@@ -73,9 +70,9 @@ marker_cache::~marker_cache() {}
void marker_cache::clear()
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
- using iterator_type = boost::unordered_map<std::string, marker_ptr>::const_iterator;
+ using iterator_type = boost::unordered_map<std::string, std::shared_ptr<mapnik::marker const> >::const_iterator;
iterator_type itr = marker_cache_.begin();
while(itr != marker_cache_.end())
{
@@ -112,33 +109,55 @@ bool marker_cache::insert_svg(std::string const& name, std::string const& svg_st
return false;
}
-bool marker_cache::insert_marker(std::string const& uri, marker_ptr path)
+bool marker_cache::insert_marker(std::string const& uri, mapnik::marker && path)
{
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
- return marker_cache_.emplace(uri,path).second;
+ return marker_cache_.emplace(uri,std::make_shared<mapnik::marker const>(std::move(path))).second;
}
-boost::optional<marker_ptr> marker_cache::find(std::string const& uri,
- bool update_cache)
+namespace detail
{
- boost::optional<marker_ptr> result;
+struct visitor_create_marker
+{
+ marker operator() (image_rgba8 & data)
+ {
+ mapnik::premultiply_alpha(data);
+ return mapnik::marker(mapnik::marker_rgba8(data));
+ }
+
+ marker operator() (image_null & data)
+ {
+ throw std::runtime_error("Can not make marker from null image data type");
+ }
+
+ template <typename T>
+ marker operator() (T & data)
+ {
+ throw std::runtime_error("Can not make marker from this data type");
+ }
+};
+
+} // end detail ns
+
+std::shared_ptr<mapnik::marker const> marker_cache::find(std::string const& uri,
+ bool update_cache)
+{
if (uri.empty())
{
- return result;
+ return std::make_shared<mapnik::marker const>(mapnik::marker_null());
}
#ifdef MAPNIK_THREADSAFE
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
- using iterator_type = boost::unordered_map<std::string, marker_ptr>::const_iterator;
+ using iterator_type = boost::unordered_map<std::string, std::shared_ptr<mapnik::marker const> >::const_iterator;
iterator_type itr = marker_cache_.find(uri);
if (itr != marker_cache_.end())
{
- result.reset(itr->second);
- return result;
+ return itr->second;
}
try
@@ -150,7 +169,7 @@ boost::optional<marker_ptr> marker_cache::find(std::string const& uri,
if (mark_itr == svg_cache_.end())
{
MAPNIK_LOG_ERROR(marker_cache) << "Marker does not exist: " << uri;
- return result;
+ return std::make_shared<mapnik::marker const>(mapnik::marker_null());
}
std::string known_svg_string = mark_itr->second;
using namespace mapnik::svg;
@@ -165,11 +184,14 @@ boost::optional<marker_ptr> marker_cache::find(std::string const& uri,
svg.bounding_rect(&lox, &loy, &hix, &hiy);
marker_path->set_bounding_box(lox,loy,hix,hiy);
marker_path->set_dimensions(svg.width(),svg.height());
- marker_ptr mark(std::make_shared<marker>(marker_path));
- result.reset(mark);
if (update_cache)
{
- marker_cache_.emplace(uri,*result);
+ auto emplace_result = marker_cache_.emplace(uri,std::make_shared<mapnik::marker const>(std::move(mapnik::marker_svg(marker_path))));
+ return emplace_result.first->second;
+ }
+ else
+ {
+ return std::make_shared<mapnik::marker const>(std::move(mapnik::marker_svg(marker_path)));
}
}
// otherwise assume file-based
@@ -178,7 +200,7 @@ boost::optional<marker_ptr> marker_cache::find(std::string const& uri,
if (!mapnik::util::exists(uri))
{
MAPNIK_LOG_ERROR(marker_cache) << "Marker does not exist: " << uri;
- return result;
+ return std::make_shared<mapnik::marker const>(mapnik::marker_null());
}
if (is_svg(uri))
{
@@ -194,11 +216,14 @@ boost::optional<marker_ptr> marker_cache::find(std::string const& uri,
svg.bounding_rect(&lox, &loy, &hix, &hiy);
marker_path->set_bounding_box(lox,loy,hix,hiy);
marker_path->set_dimensions(svg.width(),svg.height());
- marker_ptr mark(std::make_shared<marker>(marker_path));
- result.reset(mark);
if (update_cache)
{
- marker_cache_.emplace(uri,*result);
+ auto emplace_result = marker_cache_.emplace(uri,std::make_shared<mapnik::marker const>(std::move(mapnik::marker_svg(marker_path))));
+ return emplace_result.first->second;
+ }
+ else
+ {
+ return std::make_shared<mapnik::marker const>(std::move(mapnik::marker_svg(marker_path)));
}
}
else
@@ -210,24 +235,26 @@ boost::optional<marker_ptr> marker_cache::find(std::string const& uri,
unsigned width = reader->width();
unsigned height = reader->height();
BOOST_ASSERT(width > 0 && height > 0);
- mapnik::image_ptr image(std::make_shared<mapnik::image_data_32>(width,height));
- reader->read(0,0,*image);
- if (!reader->premultiplied_alpha())
+ image_any im = reader->read(0,0,width,height);
+ if (update_cache)
{
- agg::rendering_buffer buffer(image->getBytes(),image->width(),image->height(),image->width() * 4);
- agg::pixfmt_rgba32 pixf(buffer);
- pixf.premultiply();
+ auto emplace_result = marker_cache_.emplace(uri,
+ std::make_shared<mapnik::marker const>(
+ std::move(util::apply_visitor(detail::visitor_create_marker(), im))
+ ));
+ return emplace_result.first->second;
}
- marker_ptr mark(std::make_shared<marker>(image));
- result.reset(mark);
- if (update_cache)
+ else
{
- marker_cache_.emplace(uri,*result);
+ return std::make_shared<mapnik::marker const>(
+ std::move(util::apply_visitor(detail::visitor_create_marker(), im))
+ );
}
}
else
{
MAPNIK_LOG_ERROR(marker_cache) << "could not intialize reader for: '" << uri << "'";
+ return std::make_shared<mapnik::marker const>(mapnik::marker_null());
}
}
}
@@ -236,7 +263,7 @@ boost::optional<marker_ptr> marker_cache::find(std::string const& uri,
{
MAPNIK_LOG_ERROR(marker_cache) << "Exception caught while loading: '" << uri << "' (" << ex.what() << ")";
}
- return result;
+ return std::make_shared<mapnik::marker const>(mapnik::marker_null());
}
}
diff --git a/src/marker_helpers.cpp b/src/marker_helpers.cpp
index e4aeeb4..bdc70fa 100644
--- a/src/marker_helpers.cpp
+++ b/src/marker_helpers.cpp
@@ -23,6 +23,9 @@
// mapnik
#include <mapnik/marker_helpers.hpp>
+#include "agg_ellipse.h"
+#include "agg_color_rgba.h"
+
namespace mapnik {
void build_ellipse(symbolizer_base const& sym, mapnik::feature_impl & feature, attributes const& vars, svg_storage_type & marker_ellipse, svg::svg_path_adapter & svg_path)
@@ -76,14 +79,18 @@ bool push_explicit_style(svg_attribute_type const& src,
bool success = false;
for(unsigned i = 0; i < src.size(); ++i)
{
- success = true;
dst.push_back(src[i]);
mapnik::svg::path_attributes & attr = dst.last();
- if (attr.stroke_flag)
+ if (!attr.visibility_flag)
+ continue;
+ success = true;
+
+ if (!attr.stroke_none)
{
if (stroke_width)
{
attr.stroke_width = *stroke_width;
+ attr.stroke_flag = true;
}
if (stroke_color)
{
@@ -92,13 +99,15 @@ bool push_explicit_style(svg_attribute_type const& src,
s_color.green()/255.0,
s_color.blue()/255.0,
s_color.alpha()/255.0);
+ attr.stroke_flag = true;
}
if (stroke_opacity)
{
attr.stroke_opacity = *stroke_opacity;
+ attr.stroke_flag = true;
}
}
- if (attr.fill_flag)
+ if (!attr.fill_none)
{
if (fill_color)
{
@@ -107,10 +116,12 @@ bool push_explicit_style(svg_attribute_type const& src,
f_color.green()/255.0,
f_color.blue()/255.0,
f_color.alpha()/255.0);
+ attr.fill_flag = true;
}
if (fill_opacity)
{
attr.fill_opacity = *fill_opacity;
+ attr.fill_flag = true;
}
}
}
diff --git a/src/math.cpp b/src/math.cpp
new file mode 100644
index 0000000..1fd2a4f
--- /dev/null
+++ b/src/math.cpp
@@ -0,0 +1,49 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// mapnik
+#include <mapnik/util/math.hpp>
+#include <mapnik/global.hpp>
+
+// stl
+#include <cmath>
+
+namespace mapnik {
+
+namespace util {
+
+ double normalize_angle(double angle)
+ {
+ while (angle >= M_PI)
+ {
+ angle -= 2.0 * M_PI;
+ }
+ while (angle < -M_PI)
+ {
+ angle += 2.0 * M_PI;
+ }
+ return angle;
+ }
+
+} // end namespace util
+
+} // end namespace mapnik
diff --git a/src/memory.cpp b/src/memory.cpp
index bb45b70..6f4351d 100644
--- a/src/memory.cpp
+++ b/src/memory.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/memory_datasource.cpp b/src/memory_datasource.cpp
index 7ffe12b..eb107d3 100644
--- a/src/memory_datasource.cpp
+++ b/src/memory_datasource.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,7 +27,7 @@
#include <mapnik/memory_datasource.hpp>
#include <mapnik/memory_featureset.hpp>
#include <mapnik/boolean.hpp>
-// boost
+#include <mapnik/geometry_envelope.hpp>
// stl
#include <algorithm>
@@ -44,20 +44,18 @@ struct accumulate_extent
accumulate_extent(box2d<double> & ext)
: ext_(ext),first_(true) {}
- void operator() (feature_ptr feat)
+ void operator() (feature_ptr const& feat)
{
- for (std::size_t i=0;i<feat->num_geometries();++i)
+ auto const& geom = feat->get_geometry();
+ auto bbox = geometry::envelope(geom);
+ if ( first_ )
{
- geometry_type & geom = feat->get_geometry(i);
- if ( first_ )
- {
- first_ = false;
- ext_ = geom.envelope();
- }
- else
- {
- ext_.expand_to_include(geom.envelope());
- }
+ first_ = false;
+ ext_ = bbox;
+ }
+ else
+ {
+ ext_.expand_to_include(bbox);
}
}
@@ -120,10 +118,10 @@ box2d<double> memory_datasource::envelope() const
return extent_;
}
-boost::optional<datasource::geometry_t> memory_datasource::get_geometry_type() const
+boost::optional<datasource_geometry_t> memory_datasource::get_geometry_type() const
{
// TODO - detect this?
- return datasource::Collection;
+ return datasource_geometry_t::Collection;
}
layer_descriptor memory_datasource::get_descriptor() const
diff --git a/src/miniz_png.cpp b/src/miniz_png.cpp
index 5426fb6..1837301 100644
--- a/src/miniz_png.cpp
+++ b/src/miniz_png.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,7 +23,7 @@
// mapnik
#include <mapnik/palette.hpp>
#include <mapnik/miniz_png.hpp>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
#include <mapnik/image_view.hpp>
// miniz
@@ -253,7 +253,7 @@ void PNGWriter::writeIDAT(T const& image)
}
// Write scanline
- status = tdefl_compress_buffer(compressor, (mz_uint8 *)image.getRow(y), stride, TDEFL_NO_FLUSH);
+ status = tdefl_compress_buffer(compressor, (mz_uint8 *)image.get_row(y), stride, TDEFL_NO_FLUSH);
if (status != TDEFL_STATUS_OKAY)
{
throw std::runtime_error("failed to compress image");
@@ -290,7 +290,7 @@ void PNGWriter::writeIDATStripAlpha(T const& image) {
}
// Strip alpha bytes from scanline
- mz_uint8 *row = (mz_uint8 *)image.getRow(y);
+ mz_uint8 *row = (mz_uint8 *)image.get_row(y);
for (i = 0, j = 0; j < stride; i += 4, j += 3) {
scanline[j] = row[i];
scanline[j+1] = row[i+1];
@@ -361,11 +361,11 @@ const mz_uint8 PNGWriter::IEND_tpl[] = {
'I', 'E', 'N', 'D' // "IEND"
};
-template void PNGWriter::writeIDAT<image_data_8>(image_data_8 const& image);
-template void PNGWriter::writeIDAT<image_view<image_data_8> >(image_view<image_data_8> const& image);
-template void PNGWriter::writeIDAT<image_data_32>(image_data_32 const& image);
-template void PNGWriter::writeIDAT<image_view<image_data_32> >(image_view<image_data_32> const& image);
-template void PNGWriter::writeIDATStripAlpha<image_data_32>(image_data_32 const& image);
-template void PNGWriter::writeIDATStripAlpha<image_view<image_data_32> >(image_view<image_data_32> const& image);
+template void PNGWriter::writeIDAT<image_gray8>(image_gray8 const& image);
+template void PNGWriter::writeIDAT<image_view_gray8>(image_view_gray8 const& image);
+template void PNGWriter::writeIDAT<image_rgba8>(image_rgba8 const& image);
+template void PNGWriter::writeIDAT<image_view_rgba8>(image_view_rgba8 const& image);
+template void PNGWriter::writeIDATStripAlpha<image_rgba8>(image_rgba8 const& image);
+template void PNGWriter::writeIDATStripAlpha<image_view_rgba8>(image_view_rgba8 const& image);
}}
diff --git a/src/palette.cpp b/src/palette.cpp
index 2823865..803e0ef 100644
--- a/src/palette.cpp
+++ b/src/palette.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/params.cpp b/src/params.cpp
index d45f419..014a5c2 100644
--- a/src/params.cpp
+++ b/src/params.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -34,6 +34,9 @@ template boost::optional<std::string> parameters::get(std::string const& key, st
template boost::optional<value_double> parameters::get(std::string const& key) const;
template boost::optional<value_double> parameters::get(std::string const& key, value_double const& default_opt_value) const;
+template boost::optional<value_bool> parameters::get(std::string const& key) const;
+template boost::optional<value_bool> parameters::get(std::string const& key, value_bool const& default_opt_value) const;
+
template boost::optional<boolean_type> parameters::get(std::string const& key) const;
template boost::optional<boolean_type> parameters::get(std::string const& key, boolean_type const& default_opt_value) const;
diff --git a/src/parse_path.cpp b/src/parse_path.cpp
index 643d48e..0064f3a 100644
--- a/src/parse_path.cpp
+++ b/src/parse_path.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -53,7 +53,7 @@ path_expression_ptr parse_path(std::string const& str)
namespace path_processor_detail
{
- struct path_visitor_ : util::static_visitor<void>
+ struct path_visitor_
{
path_visitor_ (std::string & filename, feature_impl const& f)
: filename_(filename),
@@ -75,7 +75,7 @@ namespace path_processor_detail
feature_impl const& feature_;
};
- struct to_string_ : util::static_visitor<void>
+ struct to_string_
{
to_string_ (std::string & str)
: str_(str) {}
@@ -95,7 +95,7 @@ namespace path_processor_detail
std::string & str_;
};
- struct collect_ : util::static_visitor<void>
+ struct collect_
{
collect_ (std::set<std::string> & cont)
: cont_(cont) {}
diff --git a/src/parse_transform.cpp b/src/parse_transform.cpp
index 9ea1537..c940301 100644
--- a/src/parse_transform.cpp
+++ b/src/parse_transform.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/plugin.cpp b/src/plugin.cpp
index fe6bb9d..b803a50 100644
--- a/src/plugin.cpp
+++ b/src/plugin.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -30,8 +30,12 @@
#define dlsym GetProcAddress
#define dlclose FreeLibrary
#define dlerror GetLastError
+ #define MAPNIK_SUPPORTS_DLOPEN
#else
- #include <dlfcn.h>
+ #ifdef MAPNIK_HAS_DLCFN
+ #include <dlfcn.h>
+ #define MAPNIK_SUPPORTS_DLOPEN
+ #endif
#define handle void *
#endif
@@ -52,21 +56,46 @@ PluginInfo::PluginInfo(std::string const& filename,
{
#ifdef _WINDOWS
if (module_) module_->dl = LoadLibraryA(filename.c_str());
+ if (module_ && module_->dl)
+ {
+ name_func name = reinterpret_cast<name_func>(dlsym(module_->dl, library_name.c_str()));
+ if (name) name_ = name();
+ }
#else
+ #ifdef MAPNIK_HAS_DLCFN
if (module_) module_->dl = dlopen(filename.c_str(),RTLD_LAZY);
-#endif
if (module_ && module_->dl)
{
name_func name = reinterpret_cast<name_func>(dlsym(module_->dl, library_name.c_str()));
if (name) name_ = name();
}
+ #else
+ throw std::runtime_error("no support for loading dynamic objects (Mapnik not compiled with -DMAPNIK_HAS_DLCFN)");
+ #endif
+#endif
}
PluginInfo::~PluginInfo()
{
if (module_)
{
- if (module_->dl) dlclose(module_->dl),module_->dl=0;
+#ifdef MAPNIK_SUPPORTS_DLOPEN
+ /*
+ We do not call dlclose for plugins that link libgdal.
+ This is a terrible hack, but necessary to prevent crashes
+ at exit when gdal attempts to shutdown. The problem arises
+ when Mapnik is used with another library that uses thread-local
+ storage (like libuv). In this case GDAL also tries to cleanup thread
+ local storage and leaves things in a state that causes libuv to crash.
+ This is partially fixed by http://trac.osgeo.org/gdal/ticket/5509 but only
+ in the case that gdal is linked as a shared library. This workaround therefore
+ prevents crashes with gdal 1.11.x and gdal 2.x when using a static libgdal.
+ */
+ if (module_->dl && name_ != "gdal" && name_ != "ogr")
+ {
+ dlclose(module_->dl),module_->dl=0;
+ }
+#endif
delete module_;
}
}
@@ -74,7 +103,11 @@ PluginInfo::~PluginInfo()
void * PluginInfo::get_symbol(std::string const& sym_name) const
{
+#ifdef MAPNIK_SUPPORTS_DLOPEN
return static_cast<void *>(dlsym(module_->dl, sym_name.c_str()));
+#else
+ return NULL;
+#endif
}
std::string const& PluginInfo::name() const
@@ -84,7 +117,9 @@ std::string const& PluginInfo::name() const
bool PluginInfo::valid() const
{
+#ifdef MAPNIK_SUPPORTS_DLOPEN
if (module_ && module_->dl && !name_.empty()) return true;
+#endif
return false;
}
diff --git a/src/png_reader.cpp b/src/png_reader.cpp
index 80a8ec9..08619ec 100644
--- a/src/png_reader.cpp
+++ b/src/png_reader.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -76,11 +76,12 @@ public:
explicit png_reader(std::string const& file_name);
png_reader(char const* data, std::size_t size);
~png_reader();
- unsigned width() const;
- unsigned height() const;
- inline bool has_alpha() const { return has_alpha_; }
- bool premultiplied_alpha() const { return false; } //http://www.libpng.org/pub/png/spec/1.1/PNG-Rationale.html
- void read(unsigned x,unsigned y,image_data_32& image);
+ unsigned width() const final;
+ unsigned height() const final;
+ boost::optional<box2d<double> > bounding_box() const final;
+ inline bool has_alpha() const final { return has_alpha_; }
+ void read(unsigned x,unsigned y,image_rgba8& image) final;
+ image_any read(unsigned x, unsigned y, unsigned width, unsigned height) final;
private:
void init();
static void png_read_data(png_structp png_ptr, png_bytep data, png_size_t length);
@@ -219,7 +220,13 @@ unsigned png_reader<T>::height() const
}
template <typename T>
-void png_reader<T>::read(unsigned x0, unsigned y0,image_data_32& image)
+boost::optional<box2d<double> > png_reader<T>::bounding_box() const
+{
+ return boost::optional<box2d<double> >();
+}
+
+template <typename T>
+void png_reader<T>::read(unsigned x0, unsigned y0,image_rgba8& image)
{
stream_.clear();
stream_.seekg(0, std::ios_base::beg);
@@ -277,7 +284,7 @@ void png_reader<T>::read(unsigned x0, unsigned y0,image_data_32& image)
// alloc row pointers
const std::unique_ptr<png_bytep[]> rows(new png_bytep[height_]);
for (unsigned i=0; i<height_; ++i)
- rows[i] = (png_bytep)image.getRow(i);
+ rows[i] = (png_bytep)image.get_row(i);
png_read_image(png_ptr, rows.get());
}
else
@@ -293,11 +300,21 @@ void png_reader<T>::read(unsigned x0, unsigned y0,image_data_32& image)
png_read_row(png_ptr,row.get(),0);
if (i >= y0 && i < (y0 + h))
{
- image.setRow(i-y0,reinterpret_cast<unsigned*>(&row[x0 * 4]),w);
+ image.set_row(i-y0,reinterpret_cast<unsigned*>(&row[x0 * 4]),w);
}
}
//END
}
png_read_end(png_ptr,0);
}
+
+
+template <typename T>
+image_any png_reader<T>::read(unsigned x, unsigned y, unsigned width, unsigned height)
+{
+ image_rgba8 data(width,height);
+ read(x, y, data);
+ return image_any(std::move(data));
+}
+
}
diff --git a/src/proj_transform.cpp b/src/proj_transform.cpp
index f3cd2e8..b2cb37d 100644
--- a/src/proj_transform.cpp
+++ b/src/proj_transform.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -87,12 +87,53 @@ bool proj_transform::equal() const
return is_source_equal_dest_;
}
+bool proj_transform::is_known() const
+{
+ return merc_to_wgs84_ || wgs84_to_merc_;
+}
+
bool proj_transform::forward (double & x, double & y , double & z) const
{
return forward(&x, &y, &z, 1);
}
-bool proj_transform::forward (double * x, double * y , double * z, int point_count) const
+bool proj_transform::forward (geometry::point<double> & p) const
+{
+ double z = 0;
+ return forward(&(p.x), &(p.y), &z, 1);
+}
+
+unsigned int proj_transform::forward (geometry::line_string<double> & ls) const
+{
+ std::size_t size = ls.size();
+ if (size == 0) return 0;
+
+ if (is_source_equal_dest_)
+ return 0;
+
+ if (wgs84_to_merc_)
+ {
+ lonlat2merc(ls);
+ return 0;
+ }
+ else if (merc_to_wgs84_)
+ {
+ merc2lonlat(ls);
+ return 0;
+ }
+
+ geometry::point<double> * ptr = ls.data();
+ double * x = reinterpret_cast<double*>(ptr);
+ double * y = x + 1;
+ double * z = NULL;
+ if(!forward(x, y, z, size, 2))
+ {
+ return size;
+ }
+ return 0;
+}
+
+bool proj_transform::forward (double * x, double * y , double * z, int point_count, int offset) const
{
if (is_source_equal_dest_)
@@ -112,13 +153,13 @@ bool proj_transform::forward (double * x, double * y , double * z, int point_cou
{
int i;
for(i=0; i<point_count; i++) {
- x[i] *= DEG_TO_RAD;
- y[i] *= DEG_TO_RAD;
+ x[i*offset] *= DEG_TO_RAD;
+ y[i*offset] *= DEG_TO_RAD;
}
}
if (pj_transform( source_.proj_, dest_.proj_, point_count,
- 0, x,y,z) != 0)
+ offset, x,y,z) != 0)
{
return false;
}
@@ -127,15 +168,15 @@ bool proj_transform::forward (double * x, double * y , double * z, int point_cou
{
int i;
for(i=0; i<point_count; i++) {
- x[i] *= RAD_TO_DEG;
- y[i] *= RAD_TO_DEG;
+ x[i*offset] *= RAD_TO_DEG;
+ y[i*offset] *= RAD_TO_DEG;
}
}
#endif
return true;
}
-bool proj_transform::backward (double * x, double * y , double * z, int point_count) const
+bool proj_transform::backward (double * x, double * y , double * z, int point_count, int offset) const
{
if (is_source_equal_dest_)
return true;
@@ -154,13 +195,13 @@ bool proj_transform::backward (double * x, double * y , double * z, int point_co
{
int i;
for(i=0; i<point_count; i++) {
- x[i] *= DEG_TO_RAD;
- y[i] *= DEG_TO_RAD;
+ x[i*offset] *= DEG_TO_RAD;
+ y[i*offset] *= DEG_TO_RAD;
}
}
if (pj_transform( dest_.proj_, source_.proj_, point_count,
- 0, x,y,z) != 0)
+ offset, x,y,z) != 0)
{
return false;
}
@@ -169,8 +210,8 @@ bool proj_transform::backward (double * x, double * y , double * z, int point_co
{
int i;
for(i=0; i<point_count; i++) {
- x[i] *= RAD_TO_DEG;
- y[i] *= RAD_TO_DEG;
+ x[i*offset] *= RAD_TO_DEG;
+ y[i*offset] *= RAD_TO_DEG;
}
}
#endif
@@ -182,22 +223,73 @@ bool proj_transform::backward (double & x, double & y , double & z) const
return backward(&x, &y, &z, 1);
}
+bool proj_transform::backward (geometry::point<double> & p) const
+{
+ double z = 0;
+ return backward(&(p.x), &(p.y), &z, 1);
+}
+
+unsigned int proj_transform::backward (geometry::line_string<double> & ls) const
+{
+ std::size_t size = ls.size();
+ if (size == 0) return 0;
+
+ if (is_source_equal_dest_)
+ return 0;
+
+ if (wgs84_to_merc_)
+ {
+ merc2lonlat(ls);
+ return 0;
+ }
+ else if (merc_to_wgs84_)
+ {
+ lonlat2merc(ls);
+ return 0;
+ }
+
+ geometry::point<double> * ptr = ls.data();
+ double * x = reinterpret_cast<double*>(ptr);
+ double * y = x + 1;
+ double * z = NULL;
+ if(!backward(x, y, z, size, 2))
+ {
+ return size;
+ }
+ return 0;
+}
bool proj_transform::forward (box2d<double> & box) const
{
if (is_source_equal_dest_)
return true;
- double minx = box.minx();
- double miny = box.miny();
- double maxx = box.maxx();
- double maxy = box.maxy();
+ double llx = box.minx();
+ double ulx = box.minx();
+ double lly = box.miny();
+ double lry = box.miny();
+ double lrx = box.maxx();
+ double urx = box.maxx();
+ double uly = box.maxy();
+ double ury = box.maxy();
double z = 0.0;
- if (!forward(minx,miny,z))
+ if (!forward(llx,lly,z))
+ return false;
+ if (!forward(lrx,lry,z))
return false;
- if (!forward(maxx,maxy,z))
+ if (!forward(ulx,uly,z))
return false;
- box.init(minx,miny,maxx,maxy);
+ if (!forward(urx,ury,z))
+ return false;
+
+ double minx = std::min(ulx, llx);
+ double miny = std::min(lly, lry);
+ double maxx = std::max(urx, lrx);
+ double maxy = std::max(ury, uly);
+ box.init(minx,
+ miny,
+ maxx,
+ maxy);
return true;
}
@@ -206,19 +298,36 @@ bool proj_transform::backward (box2d<double> & box) const
if (is_source_equal_dest_)
return true;
- double minx = box.minx();
- double miny = box.miny();
- double maxx = box.maxx();
- double maxy = box.maxy();
+ double llx = box.minx();
+ double ulx = box.minx();
+ double lly = box.miny();
+ double lry = box.miny();
+ double lrx = box.maxx();
+ double urx = box.maxx();
+ double uly = box.maxy();
+ double ury = box.maxy();
double z = 0.0;
- if (!backward(minx,miny,z))
+ if (!backward(llx,lly,z))
+ return false;
+ if (!backward(lrx,lry,z))
return false;
- if (!backward(maxx,maxy,z))
+ if (!backward(ulx,uly,z))
return false;
- box.init(minx,miny,maxx,maxy);
+ if (!backward(urx,ury,z))
+ return false;
+ double minx = std::min(ulx, llx);
+ double miny = std::min(lly, lry);
+ double maxx = std::max(urx, lrx);
+ double maxy = std::max(ury, uly);
+ box.init(minx,
+ miny,
+ maxx,
+ maxy);
return true;
}
+/* Returns points in clockwise order. This allows us to do anti-meridian checks.
+ */
void envelope_points(std::vector< coord<double,2> > & coords, box2d<double>& env, int points)
{
double width = env.width();
@@ -236,15 +345,32 @@ void envelope_points(std::vector< coord<double,2> > & coords, box2d<double>& env
double xstep = width / steps;
double ystep = height / steps;
- for (int i=0; i<=steps; i++) {
- coords.push_back(coord<double,2>(env.minx() + i * xstep, env.miny()));
- coords.push_back(coord<double,2>(env.minx() + i * xstep, env.maxy()));
-
+ coords.resize(points);
+ for (int i=0; i<steps; i++) {
+ // top: left>right
+ coords[i] = coord<double, 2>(env.minx() + i * xstep, env.maxy());
+ // right: top>bottom
+ coords[i + steps] = coord<double, 2>(env.maxx(), env.maxy() - i * ystep);
+ // bottom: right>left
+ coords[i + steps * 2] = coord<double, 2>(env.maxx() - i * xstep, env.miny());
+ // left: bottom>top
+ coords[i + steps * 3] = coord<double, 2>(env.minx(), env.miny() + i * ystep);
}
- for (int i=1; i<steps; i++) {
- coords.push_back(coord<double,2>(env.minx(), env.miny() + i * ystep));
- coords.push_back(coord<double,2>(env.maxx(), env.miny() + i * ystep));
+}
+
+/* determine if an ordered sequence of coordinates is in clockwise order */
+bool is_clockwise(const std::vector< coord<double,2> > & coords)
+{
+ int n = coords.size();
+ coord<double,2> c1, c2;
+ double a = 0.0;
+
+ for (int i=0; i<n; i++) {
+ c1 = coords[i];
+ c2 = coords[(i + 1) % n];
+ a += (c1.x * c2.y - c2.x * c1.y);
}
+ return a <= 0.0;
}
box2d<double> calculate_bbox(std::vector<coord<double,2> > & points) {
@@ -276,7 +402,7 @@ bool proj_transform::backward(box2d<double>& env, int points) const
}
std::vector<coord<double,2> > coords;
- envelope_points(coords, env, points);
+ envelope_points(coords, env, points); // this is always clockwise
double z;
for (std::vector<coord<double,2> >::iterator it = coords.begin(); it!=coords.end(); ++it) {
@@ -287,6 +413,16 @@ bool proj_transform::backward(box2d<double>& env, int points) const
}
box2d<double> result = calculate_bbox(coords);
+ if (is_source_longlat_ && !is_clockwise(coords)) {
+ /* we've gone to a geographic CS, and our clockwise envelope has
+ * changed into an anticlockwise one. This means we've crossed the antimeridian, and
+ * need to expand the X direction to +/-180 to include all the data. Once we can deal
+ * with multiple bboxes in queries we can improve.
+ */
+ double miny = result.miny();
+ result.expand_to_include(-180.0, miny);
+ result.expand_to_include(180.0, miny);
+ }
env.re_center(result.center().x, result.center().y);
env.height(result.height());
@@ -306,7 +442,7 @@ bool proj_transform::forward(box2d<double>& env, int points) const
}
std::vector<coord<double,2> > coords;
- envelope_points(coords, env, points);
+ envelope_points(coords, env, points); // this is always clockwise
double z;
for (std::vector<coord<double,2> >::iterator it = coords.begin(); it!=coords.end(); ++it) {
@@ -318,6 +454,17 @@ bool proj_transform::forward(box2d<double>& env, int points) const
box2d<double> result = calculate_bbox(coords);
+ if (is_dest_longlat_ && !is_clockwise(coords)) {
+ /* we've gone to a geographic CS, and our clockwise envelope has
+ * changed into an anticlockwise one. This means we've crossed the antimeridian, and
+ * need to expand the X direction to +/-180 to include all the data. Once we can deal
+ * with multiple bboxes in queries we can improve.
+ */
+ double miny = result.miny();
+ result.expand_to_include(-180.0, miny);
+ result.expand_to_include(180.0, miny);
+ }
+
env.re_center(result.center().x, result.center().y);
env.height(result.height());
env.width(result.width());
diff --git a/src/projection.cpp b/src/projection.cpp
index 06dc5e4..81e2427 100644
--- a/src/projection.cpp
+++ b/src/projection.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -82,8 +82,8 @@ projection& projection::operator=(projection const& rhs)
{
projection tmp(rhs);
swap(tmp);
- proj_ctx_ = 0;
- proj_ = 0;
+ proj_ctx_ = nullptr;
+ proj_ = nullptr;
if (!defer_proj_init_) init_proj4();
return *this;
}
@@ -106,17 +106,21 @@ void projection::init_proj4() const
#if PJ_VERSION >= 480
proj_ctx_ = pj_ctx_alloc();
proj_ = pj_init_plus_ctx(proj_ctx_, params_.c_str());
- if (!proj_)
+ if (!proj_ || !proj_ctx_)
{
if (proj_ctx_) {
pj_ctx_free(proj_ctx_);
- proj_ctx_ = 0;
+ proj_ctx_ = nullptr;
+ }
+ if (proj_) {
+ pj_free(proj_);
+ proj_ = nullptr;
}
throw proj_init_error(params_);
}
#else
#if defined(MAPNIK_THREADSAFE)
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
proj_ = pj_init_plus(params_.c_str());
if (!proj_) throw proj_init_error(params_);
@@ -154,7 +158,7 @@ void projection::forward(double & x, double &y ) const
throw std::runtime_error("projection::forward not supported unless proj4 is initialized");
}
#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
projUV p;
p.u = x * DEG_TO_RAD;
@@ -181,7 +185,7 @@ void projection::inverse(double & x,double & y) const
}
#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480
- mapnik::scoped_lock lock(mutex_);
+ std::lock_guard<std::mutex> lock(mutex_);
#endif
if (is_geographic_)
{
@@ -202,13 +206,21 @@ void projection::inverse(double & x,double & y) const
projection::~projection()
{
#ifdef MAPNIK_USE_PROJ4
- #if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480
- mapnik::scoped_lock lock(mutex_);
- #endif
- if (proj_) pj_free(proj_);
- #if PJ_VERSION >= 480
- if (proj_ctx_) pj_ctx_free(proj_ctx_);
- #endif
+ #if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480
+ std::lock_guard<std::mutex> lock(mutex_);
+ #endif
+ if (proj_)
+ {
+ pj_free(proj_);
+ proj_ = nullptr;
+ }
+ #if PJ_VERSION >= 480
+ if (proj_ctx_)
+ {
+ pj_ctx_free(proj_ctx_);
+ proj_ctx_ = nullptr;
+ }
+ #endif
#endif
}
diff --git a/src/rapidxml_loader.cpp b/src/rapidxml_loader.cpp
index ea24793..841fa9f 100644
--- a/src/rapidxml_loader.cpp
+++ b/src/rapidxml_loader.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -32,7 +32,7 @@
#include <boost/property_tree/detail/xml_parser_read_rapidxml.hpp>
#include <mapnik/xml_node.hpp>
#include <mapnik/util/trim.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
// stl
#include <iostream>
@@ -42,7 +42,7 @@ namespace rapidxml = boost::property_tree::detail::rapidxml;
namespace mapnik
{
-class rapidxml_loader : mapnik::noncopyable
+class rapidxml_loader : util::noncopyable
{
public:
rapidxml_loader() :
diff --git a/src/raster_colorizer.cpp b/src/raster_colorizer.cpp
index 6bc0c05..a48dbdf 100644
--- a/src/raster_colorizer.cpp
+++ b/src/raster_colorizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -122,23 +122,27 @@ bool raster_colorizer::add_stop(colorizer_stop const& stop)
return true;
}
-void raster_colorizer::colorize(raster_ptr const& raster, feature_impl const& f) const
+template <typename T>
+void raster_colorizer::colorize(image_rgba8 & out, T const& in,
+ boost::optional<double> const& nodata,
+ feature_impl const& f) const
{
- unsigned *imageData = raster->data_.getData();
-
- int len = raster->data_.width() * raster->data_.height();
- boost::optional<double> const& nodata = raster->nodata();
+ using image_type = T;
+ using pixel_type = typename image_type::pixel_type;
+ // TODO: assuming in/out have the same width/height for now
+ std::uint32_t * out_data = out.data();
+ pixel_type const* in_data = in.data();
+ int len = out.width() * out.height();
for (int i=0; i<len; ++i)
{
- // the GDAL plugin reads single bands as floats
- float value = *reinterpret_cast<float *> (&imageData[i]);
+ pixel_type value = in_data[i];
if (nodata && (std::fabs(value - *nodata) < epsilon_))
{
- imageData[i] = 0;
+ out_data[i] = 0; // rgba(0,0,0,0)
}
else
{
- imageData[i] = get_color(value);
+ out_data[i] = get_color(value);
}
}
}
@@ -153,7 +157,7 @@ unsigned raster_colorizer::get_color(float value) const
int stopCount = stops_.size();
//use default color if no stops
- if(stopCount == 0)
+ if (stopCount == 0)
{
return default_color_.rgba();
}
@@ -282,5 +286,35 @@ unsigned raster_colorizer::get_color(float value) const
}
-}
+template void raster_colorizer::colorize(image_rgba8 & out, image_gray8 const& in,
+ boost::optional<double>const& nodata,
+ feature_impl const& f) const;
+template void raster_colorizer::colorize(image_rgba8 & out, image_gray8s const& in,
+ boost::optional<double>const& nodata,
+ feature_impl const& f) const;
+template void raster_colorizer::colorize(image_rgba8 & out, image_gray16 const& in,
+ boost::optional<double>const& nodata,
+ feature_impl const& f) const;
+template void raster_colorizer::colorize(image_rgba8 & out, image_gray16s const& in,
+ boost::optional<double>const& nodata,
+ feature_impl const& f) const;
+template void raster_colorizer::colorize(image_rgba8 & out, image_gray32 const& in,
+ boost::optional<double>const& nodata,
+ feature_impl const& f) const;
+template void raster_colorizer::colorize(image_rgba8 & out, image_gray32s const& in,
+ boost::optional<double>const& nodata,
+ feature_impl const& f) const;
+template void raster_colorizer::colorize(image_rgba8 & out, image_gray32f const& in,
+ boost::optional<double>const& nodata,
+ feature_impl const& f) const;
+template void raster_colorizer::colorize(image_rgba8 & out, image_gray64 const& in,
+ boost::optional<double>const& nodata,
+ feature_impl const& f) const;
+template void raster_colorizer::colorize(image_rgba8 & out, image_gray64s const& in,
+ boost::optional<double>const& nodata,
+ feature_impl const& f) const;
+template void raster_colorizer::colorize(image_rgba8 & out, image_gray64f const& in,
+ boost::optional<double>const& nodata,
+ feature_impl const& f) const;
+}
diff --git a/src/renderer_common.cpp b/src/renderer_common.cpp
index 17111bb..ecba136 100644
--- a/src/renderer_common.cpp
+++ b/src/renderer_common.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/renderer_common/process_group_symbolizer.cpp b/src/renderer_common/process_group_symbolizer.cpp
index 516b9b0..bac2631 100644
--- a/src/renderer_common/process_group_symbolizer.cpp
+++ b/src/renderer_common/process_group_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,19 +22,29 @@
// mapnik
#include <mapnik/renderer_common/process_group_symbolizer.hpp>
-#include <mapnik/renderer_common/process_point_symbolizer.hpp>
-#include <mapnik/text/glyph_info.hpp>
+#include <mapnik/renderer_common/process_markers_symbolizer.hpp>
#include <mapnik/make_unique.hpp>
namespace mapnik {
-point_render_thunk::point_render_thunk(pixel_position const& pos, marker const& m,
- agg::trans_affine const& tr, double opacity,
- composite_mode_e comp_op)
- : pos_(pos), marker_(std::make_shared<marker>(m)),
- tr_(tr), opacity_(opacity), comp_op_(comp_op)
+vector_marker_render_thunk::vector_marker_render_thunk(svg_path_ptr const& src,
+ svg_attribute_type const& attrs,
+ agg::trans_affine const& marker_trans,
+ double opacity,
+ composite_mode_e comp_op,
+ bool snap_to_pixels)
+ : src_(src), attrs_(attrs), tr_(marker_trans), opacity_(opacity),
+ comp_op_(comp_op), snap_to_pixels_(snap_to_pixels)
{}
+raster_marker_render_thunk::raster_marker_render_thunk(image_rgba8 const& src,
+ agg::trans_affine const& marker_trans,
+ double opacity,
+ composite_mode_e comp_op,
+ bool snap_to_pixels)
+ : src_(src), tr_(marker_trans), opacity_(opacity), comp_op_(comp_op),
+ snap_to_pixels_(snap_to_pixels)
+{}
text_render_thunk::text_render_thunk(helper_ptr && helper,
double opacity, composite_mode_e comp_op,
@@ -43,7 +53,77 @@ text_render_thunk::text_render_thunk(helper_ptr && helper,
placements_(helper_->get()),
opacity_(opacity),
comp_op_(comp_op),
- halo_rasterizer_(halo_rasterizer) {}
+ halo_rasterizer_(halo_rasterizer)
+{}
+
+namespace detail {
+
+template <typename Detector, typename RendererContext>
+struct vector_marker_thunk_dispatch : public vector_markers_dispatch<Detector>
+{
+ vector_marker_thunk_dispatch(svg_path_ptr const& src,
+ svg_path_adapter & path,
+ svg_attribute_type const& attrs,
+ agg::trans_affine const& marker_trans,
+ symbolizer_base const& sym,
+ Detector & detector,
+ double scale_factor,
+ feature_impl & feature,
+ attributes const& vars,
+ bool snap_to_pixels,
+ RendererContext const& renderer_context)
+ : vector_markers_dispatch<Detector>(src, marker_trans, sym, detector, scale_factor, feature, vars),
+ attrs_(attrs), comp_op_(get<composite_mode_e, keys::comp_op>(sym, feature, vars)),
+ snap_to_pixels_(snap_to_pixels), thunks_(std::get<0>(renderer_context))
+ {}
+
+ ~vector_marker_thunk_dispatch() {}
+
+ void render_marker(agg::trans_affine const& marker_tr, double opacity)
+ {
+ vector_marker_render_thunk thunk(this->src_, this->attrs_, marker_tr, opacity, comp_op_, snap_to_pixels_);
+ thunks_.push_back(std::make_unique<render_thunk>(std::move(thunk)));
+ }
+
+private:
+ svg_attribute_type const& attrs_;
+ composite_mode_e comp_op_;
+ bool snap_to_pixels_;
+ render_thunk_list & thunks_;
+};
+
+template <typename Detector, typename RendererContext>
+struct raster_marker_thunk_dispatch : public raster_markers_dispatch<Detector>
+{
+ raster_marker_thunk_dispatch(image_rgba8 const& src,
+ agg::trans_affine const& marker_trans,
+ symbolizer_base const& sym,
+ Detector & detector,
+ double scale_factor,
+ feature_impl & feature,
+ attributes const& vars,
+ RendererContext const& renderer_context,
+ bool snap_to_pixels = false)
+ : raster_markers_dispatch<Detector>(src, marker_trans, sym, detector, scale_factor, feature, vars),
+ comp_op_(get<composite_mode_e, keys::comp_op>(sym, feature, vars)),
+ snap_to_pixels_(snap_to_pixels), thunks_(std::get<0>(renderer_context))
+ {}
+
+ ~raster_marker_thunk_dispatch() {}
+
+ void render_marker(agg::trans_affine const& marker_tr, double opacity)
+ {
+ raster_marker_render_thunk thunk(this->src_, marker_tr, opacity, comp_op_, snap_to_pixels_);
+ thunks_.push_back(std::make_unique<render_thunk>(std::move(thunk)));
+ }
+
+private:
+ composite_mode_e comp_op_;
+ bool snap_to_pixels_;
+ render_thunk_list & thunks_;
+};
+
+} // end detail ns
render_thunk_extractor::render_thunk_extractor(box2d<double> & box,
render_thunk_list & thunks,
@@ -56,17 +136,15 @@ render_thunk_extractor::render_thunk_extractor(box2d<double> & box,
common_(common), clipping_extent_(clipping_extent)
{}
-void render_thunk_extractor::operator()(point_symbolizer const& sym) const
+void render_thunk_extractor::operator()(markers_symbolizer const& sym) const
{
- composite_mode_e comp_op = get<composite_mode_e>(sym, keys::comp_op, feature_, common_.vars_, src_over);
+ auto renderer_context = std::tie(thunks_);
+ using context_type = decltype(renderer_context);
+ using vector_dispatch_type = detail::vector_marker_thunk_dispatch<label_collision_detector4, context_type>;
+ using raster_dispatch_type = detail::raster_marker_thunk_dispatch<label_collision_detector4, context_type>;
- render_point_symbolizer(
- sym, feature_, prj_trans_, common_,
- [&](pixel_position const& pos, marker const& marker,
- agg::trans_affine const& tr, double opacity) {
- point_render_thunk thunk(pos, marker, tr, opacity, comp_op);
- thunks_.push_back(std::make_unique<render_thunk>(std::move(thunk)));
- });
+ render_markers_symbolizer<vector_dispatch_type, raster_dispatch_type>(
+ sym, feature_, prj_trans_, common_, clipping_extent_, renderer_context);
update_box();
}
@@ -128,20 +206,4 @@ void render_thunk_extractor::update_box() const
detector.clear();
}
-
-geometry_type *origin_point(proj_transform const& prj_trans,
- renderer_common const& common)
-{
- // note that we choose a point in the middle of the screen to
- // try to ensure that we don't get edge artefacts due to any
- // symbolizers with avoid-edges set: only the avoid-edges of
- // the group symbolizer itself should matter.
- double x = common.width_ / 2.0, y = common.height_ / 2.0, z = 0.0;
- common.t_.backward(&x, &y);
- prj_trans.forward(x, y, z);
- geometry_type *geom = new geometry_type(geometry_type::Point);
- geom->move_to(x, y);
- return geom;
-}
-
} // namespace mapnik
diff --git a/src/renderer_common/render_pattern.cpp b/src/renderer_common/render_pattern.cpp
index f149c13..67ddbe5 100644
--- a/src/renderer_common/render_pattern.cpp
+++ b/src/renderer_common/render_pattern.cpp
@@ -30,42 +30,44 @@
#include "agg_rendering_buffer.h"
#include "agg_pixfmt_rgba.h"
+#include "agg_pixfmt_gray.h"
#include "agg_color_rgba.h"
+#include "agg_color_gray.h"
#include "agg_scanline_u.h"
namespace mapnik {
-std::shared_ptr<image_data_32> render_pattern(rasterizer & ras,
- marker const& marker,
- agg::trans_affine const& tr,
- double opacity)
+template <>
+void render_pattern<image_rgba8>(rasterizer & ras,
+ marker_svg const& marker,
+ agg::trans_affine const& tr,
+ double opacity,
+ image_rgba8 & image)
{
using pixfmt = agg::pixfmt_rgba32_pre;
using renderer_base = agg::renderer_base<pixfmt>;
using renderer_solid = agg::renderer_scanline_aa_solid<renderer_base>;
agg::scanline_u8 sl;
- mapnik::box2d<double> const& bbox = (*marker.get_vector_data())->bounding_box() * tr;
+ mapnik::box2d<double> const& bbox = marker.bounding_box() * tr;
mapnik::coord<double,2> c = bbox.center();
agg::trans_affine mtx = agg::trans_affine_translation(-c.x,-c.y);
mtx.translate(0.5 * bbox.width(), 0.5 * bbox.height());
mtx = tr * mtx;
- std::shared_ptr<mapnik::image_data_32> image = std::make_shared<mapnik::image_data_32>(bbox.width(), bbox.height());
- agg::rendering_buffer buf(image->getBytes(), image->width(), image->height(), image->width() * 4);
+ agg::rendering_buffer buf(image.bytes(), image.width(), image.height(), image.row_size());
pixfmt pixf(buf);
renderer_base renb(pixf);
- mapnik::svg::vertex_stl_adapter<mapnik::svg::svg_path_storage> stl_storage((*marker.get_vector_data())->source());
+ mapnik::svg::vertex_stl_adapter<mapnik::svg::svg_path_storage> stl_storage(marker.get_data()->source());
mapnik::svg::svg_path_adapter svg_path(stl_storage);
mapnik::svg::svg_renderer_agg<mapnik::svg::svg_path_adapter,
agg::pod_bvector<mapnik::svg::path_attributes>,
renderer_solid,
- agg::pixfmt_rgba32_pre > svg_renderer(svg_path,
- (*marker.get_vector_data())->attributes());
+ pixfmt > svg_renderer(svg_path,
+ marker.get_data()->attributes());
svg_renderer.render(ras, sl, renb, mtx, opacity, bbox);
- return image;
}
} // namespace mapnik
diff --git a/src/request.cpp b/src/request.cpp
index b99f533..46fc220 100644
--- a/src/request.cpp
+++ b/src/request.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/rule.cpp b/src/rule.cpp
index 3dfab55..55a1ba2 100644
--- a/src/rule.cpp
+++ b/src/rule.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/save_map.cpp b/src/save_map.cpp
index 27eb755..42314d0 100644
--- a/src/save_map.cpp
+++ b/src/save_map.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -46,6 +46,7 @@
#include <mapnik/group/group_layout.hpp>
#include <mapnik/group/group_symbolizer_properties.hpp>
#include <mapnik/util/variant.hpp>
+#include <mapnik/util/variant_io.hpp>
// boost
#pragma GCC diagnostic push
@@ -135,7 +136,7 @@ void serialize_group_symbolizer_properties(ptree & sym_node,
bool explicit_defaults);
template <typename Meta>
-class serialize_symbolizer_property : public util::static_visitor<>
+class serialize_symbolizer_property
{
public:
serialize_symbolizer_property(Meta const& meta,
@@ -225,7 +226,7 @@ private:
bool explicit_defaults_;
};
-class serialize_symbolizer : public util::static_visitor<>
+class serialize_symbolizer
{
public:
serialize_symbolizer( ptree & r , bool explicit_defaults)
@@ -255,7 +256,7 @@ private:
bool explicit_defaults_;
};
-class serialize_group_layout : public util::static_visitor<>
+class serialize_group_layout
{
public:
serialize_group_layout(ptree & parent_node, bool explicit_defaults)
@@ -488,36 +489,6 @@ void serialize_datasource( ptree & layer_node, datasource_ptr datasource)
}
}
-class serialize_type : public util::static_visitor<>
-{
-public:
- serialize_type( boost::property_tree::ptree & node):
- node_(node) {}
-
- void operator () ( mapnik::value_integer ) const
- {
- node_.put("<xmlattr>.type", "int" );
- }
-
- void operator () ( mapnik::value_double ) const
- {
- node_.put("<xmlattr>.type", "float" );
- }
-
- void operator () ( std::string const& ) const
- {
- node_.put("<xmlattr>.type", "string" );
- }
-
- void operator () ( mapnik::value_null ) const
- {
- node_.put("<xmlattr>.type", "string" );
- }
-
-private:
- boost::property_tree::ptree & node_;
-};
-
void serialize_parameters( ptree & map_node, mapnik::parameters const& params)
{
if (params.size()) {
@@ -531,7 +502,6 @@ void serialize_parameters( ptree & map_node, mapnik::parameters const& params)
boost::property_tree::ptree()))->second;
param_node.put("<xmlattr>.name", p.first );
param_node.put_value( p.second );
- util::apply_visitor(serialize_type(param_node),p.second);
}
}
}
@@ -561,14 +531,14 @@ void serialize_layer( ptree & map_node, const layer & layer, bool explicit_defau
set_attr/*<bool>*/( layer_node, "clear-label-cache", layer.clear_label_cache() );
}
- if ( layer.min_zoom() )
+ if ( layer.minimum_scale_denominator() )
{
- set_attr( layer_node, "minzoom", layer.min_zoom() );
+ set_attr( layer_node, "minimum_scale_denominator", layer.minimum_scale_denominator() );
}
- if ( layer.max_zoom() != std::numeric_limits<double>::max() )
+ if ( layer.maximum_scale_denominator() != std::numeric_limits<double>::max() )
{
- set_attr( layer_node, "maxzoom", layer.max_zoom() );
+ set_attr( layer_node, "maximum_scale_denominator", layer.maximum_scale_denominator() );
}
if ( layer.queryable() || explicit_defaults )
diff --git a/src/scale_denominator.cpp b/src/scale_denominator.cpp
index 35e8f94..f7a6220 100644
--- a/src/scale_denominator.cpp
+++ b/src/scale_denominator.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/svg/output/process_line_symbolizer.cpp b/src/svg/output/process_line_symbolizer.cpp
index e99bfbe..4640a37 100644
--- a/src/svg/output/process_line_symbolizer.cpp
+++ b/src/svg/output/process_line_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -54,4 +54,3 @@ template void svg_renderer<std::ostream_iterator<char> >::process(line_symbolize
}
#endif
-
diff --git a/src/svg/output/process_polygon_symbolizer.cpp b/src/svg/output/process_polygon_symbolizer.cpp
index 77d8d5e..18bfaae 100644
--- a/src/svg/output/process_polygon_symbolizer.cpp
+++ b/src/svg/output/process_polygon_symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/svg/output/process_symbolizers.cpp b/src/svg/output/process_symbolizers.cpp
index 765ec3f..a7ca1c0 100644
--- a/src/svg/output/process_symbolizers.cpp
+++ b/src/svg/output/process_symbolizers.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -31,13 +31,46 @@
#include <mapnik/svg/output/svg_output_grammars.hpp>
#include <mapnik/svg/output/svg_output_attributes.hpp>
#include <mapnik/symbolizer_dispatch.hpp>
+#include <mapnik/vertex_processor.hpp>
+#include <mapnik/geometry_transform.hpp>
+#include <mapnik/geometry_to_path.hpp>
+#include <mapnik/util/geometry_to_ds_type.hpp>
// boost
#include <boost/spirit/include/karma.hpp>
-namespace mapnik {
+namespace mapnik { namespace geometry {
-struct symbol_type_dispatch : public util::static_visitor<bool>
+template <typename CalculationType>
+struct coord_transformer
+{
+ using calc_type = CalculationType;
+
+ coord_transformer(view_transform const& tr, proj_transform const& prj_trans)
+ : tr_(tr), prj_trans_(prj_trans) {}
+
+
+ template <typename P1, typename P2>
+ inline bool apply(P1 const& p1, P2 & p2) const
+ {
+ using coordinate_type = typename boost::geometry::coordinate_type<P2>::type;
+ calc_type x = boost::geometry::get<0>(p1);
+ calc_type y = boost::geometry::get<1>(p1);
+ calc_type z = 0.0;
+ if (!prj_trans_.backward(x, y, z)) return false;
+ tr_.forward(&x,&y);
+ boost::geometry::set<0>(p2, boost::numeric_cast<coordinate_type>(x));
+ boost::geometry::set<1>(p2, boost::numeric_cast<coordinate_type>(y));
+ return true;
+ }
+
+ view_transform const& tr_;
+ proj_transform const& prj_trans_;
+};
+
+} // ns geometry
+
+struct symbol_type_dispatch
{
template <typename Symbolizer>
bool operator()(Symbolizer const&) const
@@ -60,7 +93,7 @@ bool is_path_based(symbolizer const& sym)
}
template <typename OutputIterator, typename PathType>
-void generate_path(OutputIterator & output_iterator, PathType const& path, svg::path_output_attributes const& path_attributes)
+void generate_path_impl(OutputIterator & output_iterator, PathType const& path, svg::path_output_attributes const& path_attributes)
{
using path_dash_array_grammar = svg::svg_path_dash_array_grammar<OutputIterator>;
using path_attributes_grammar = svg::svg_path_attributes_grammar<OutputIterator>;
@@ -79,7 +112,7 @@ bool svg_renderer<OutputIterator>::process(rule::symbolizers const& syms,
proj_transform const& prj_trans)
{
// svg renderer supports processing of multiple symbolizers.
- using path_type = transform_path_adapter<view_transform, geometry_type>;
+ using trans_path_type = transform_path_adapter<view_transform, vertex_adapter>;
bool process_path = false;
// process each symbolizer to collect its (path) information.
@@ -97,14 +130,13 @@ bool svg_renderer<OutputIterator>::process(rule::symbolizers const& syms,
if (process_path)
{
// generate path output for each geometry of the current feature.
- for (auto & geom : feature.paths())
- {
- if(geom.size() > 0)
- {
- path_type path(common_.t_, geom, prj_trans);
- generate_path(generator_.output_iterator_, path, path_attributes_);
- }
- }
+ auto const& geom = feature.get_geometry();
+ path_type path;
+ path.set_type(static_cast<path_type::types>(mapnik::util::to_ds_type(geom)));
+ geometry::to_path(geom, path);
+ vertex_adapter va(path);
+ trans_path_type trans_path(common_.t_, va, prj_trans);
+ generate_path_impl(generator_.output_iterator_, trans_path, path_attributes_);
// set the previously collected values back to their defaults
// for the feature that will be processed next.
path_attributes_.reset();
diff --git a/src/svg/output/svg_generator.cpp b/src/svg/output/svg_generator.cpp
index 422a936..d6556ea 100644
--- a/src/svg/output/svg_generator.cpp
+++ b/src/svg/output/svg_generator.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,6 @@
// mapnik
#include <mapnik/svg/output/svg_generator.hpp>
-#include <mapnik/geometry.hpp>
#include <mapnik/util/conversions.hpp>
#include <mapnik/svg/output/svg_output_grammars.hpp>
@@ -116,4 +115,3 @@ namespace mapnik { namespace svg {
}}
#endif
-
diff --git a/src/svg/output/svg_output_attributes.cpp b/src/svg/output/svg_output_attributes.cpp
index 972fbb7..fb0b6a7 100644
--- a/src/svg/output/svg_output_attributes.cpp
+++ b/src/svg/output/svg_output_attributes.cpp
@@ -1,9 +1,8 @@
-
/*****************************************************************************
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -292,4 +291,3 @@ namespace mapnik { namespace svg {
}}
#endif
-
diff --git a/src/svg/output/svg_output_grammars.cpp b/src/svg/output/svg_output_grammars.cpp
index 30ed5f9..cc0d514 100644
--- a/src/svg/output/svg_output_grammars.cpp
+++ b/src/svg/output/svg_output_grammars.cpp
@@ -28,4 +28,4 @@
template struct mapnik::svg::svg_path_attributes_grammar<std::ostream_iterator<char> >;
template struct mapnik::svg::svg_path_dash_array_grammar<std::ostream_iterator<char> >;
template struct mapnik::svg::svg_rect_attributes_grammar<std::ostream_iterator<char> >;
-template struct mapnik::svg::svg_root_attributes_grammar<std::ostream_iterator<char> >;
\ No newline at end of file
+template struct mapnik::svg::svg_root_attributes_grammar<std::ostream_iterator<char> >;
diff --git a/src/svg/output/svg_renderer.cpp b/src/svg/output/svg_renderer.cpp
index aeeace0..4525cae 100644
--- a/src/svg/output/svg_renderer.cpp
+++ b/src/svg/output/svg_renderer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/svg/svg_parser.cpp b/src/svg/svg_parser.cpp
index b1ec83b..a6fa1ee 100644
--- a/src/svg/svg_parser.cpp
+++ b/src/svg/svg_parser.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/svg/svg_path_parser.cpp b/src/svg/svg_path_parser.cpp
index 86684e6..d694734 100644
--- a/src/svg/svg_path_parser.cpp
+++ b/src/svg/svg_path_parser.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/svg/svg_points_parser.cpp b/src/svg/svg_points_parser.cpp
index af97c41..b02dafa 100644
--- a/src/svg/svg_points_parser.cpp
+++ b/src/svg/svg_points_parser.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/svg/svg_transform_parser.cpp b/src/svg/svg_transform_parser.cpp
index eee7a64..ed6e7f6 100644
--- a/src/svg/svg_transform_parser.cpp
+++ b/src/svg/svg_transform_parser.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/symbolizer.cpp b/src/symbolizer.cpp
index 7107fe7..bce44a1 100644
--- a/src/symbolizer.cpp
+++ b/src/symbolizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/symbolizer_enumerations.cpp b/src/symbolizer_enumerations.cpp
index 6f290f1..e17fa1b 100644
--- a/src/symbolizer_enumerations.cpp
+++ b/src/symbolizer_enumerations.cpp
@@ -35,7 +35,7 @@ IMPLEMENT_ENUM( line_cap_e, line_cap_strings )
static const char * line_join_strings[] = {
"miter",
- "miter_revert",
+ "miter-revert",
"round",
"bevel",
""
@@ -85,6 +85,7 @@ IMPLEMENT_ENUM( marker_multi_policy_e, marker_multi_policy_strings )
static const char * debug_symbolizer_mode_strings[] = {
"collision",
"vertex",
+ "rings",
""
};
@@ -160,6 +161,7 @@ static const char * text_transform_strings[] = {
"uppercase",
"lowercase",
"capitalize",
+ "reverse",
""
};
@@ -167,14 +169,28 @@ IMPLEMENT_ENUM( text_transform_e, text_transform_strings )
static const char * text_upright_strings[] = {
"auto",
+ "auto-down",
"left",
"right",
- "left_only",
- "right_only",
+ "left-only",
+ "right-only",
""
};
IMPLEMENT_ENUM(text_upright_e, text_upright_strings)
+static const char * direction_strings[] = {
+ "left",
+ "right",
+ "left-only",
+ "right-only",
+ "auto",
+ "auto-down",
+ "up",
+ "down",
+ ""
+};
+IMPLEMENT_ENUM(direction_e, direction_strings)
+
static const char * gamma_method_strings[] = {
"power", //agg::gamma_power
"linear", //agg::gamma_linear
diff --git a/src/symbolizer_keys.cpp b/src/symbolizer_keys.cpp
index bc81756..099832d 100644
--- a/src/symbolizer_keys.cpp
+++ b/src/symbolizer_keys.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,12 +24,8 @@
#include <mapnik/color.hpp>
#include <mapnik/simplify.hpp>
-// boost
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#include <boost/algorithm/string/replace.hpp> // for replace
-#pragma GCC diagnostic pop
+// stl
+#include <algorithm>
namespace mapnik {
@@ -157,6 +153,9 @@ static const property_meta_type key_meta[const_max_key] =
property_meta_type{ "upright", [](enumeration_wrapper e)
{return enumeration<text_upright_enum,text_upright_enum_MAX>(text_upright_enum(e.value)).as_string();},
property_types::target_upright},
+ property_meta_type{ "direction", [](enumeration_wrapper e)
+ {return enumeration<direction_enum,direction_enum_MAX>(direction_enum(e.value)).as_string();},
+ property_types::target_direction},
property_meta_type{ "avoid-edges",nullptr, property_types::target_bool },
property_meta_type{ "font-feature-settings", nullptr, property_types::target_font_feature_settings },
@@ -170,7 +169,7 @@ property_meta_type const& get_meta(mapnik::keys key)
mapnik::keys get_key(std::string const& name)
{
std::string name_copy(name);
- boost::algorithm::replace_all(name_copy,"_","-");
+ std::replace(name_copy.begin(), name_copy.end(), '_', '-');
for (unsigned i=0; i< const_max_key ; ++i)
{
property_meta_type const& item = key_meta[i];
diff --git a/src/text/face.cpp b/src/text/face.cpp
index dbe088f..3e14aa6 100644
--- a/src/text/face.cpp
+++ b/src/text/face.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/text/formatting/base.cpp b/src/text/formatting/base.cpp
index b1e9c2a..a1e16db 100644
--- a/src/text/formatting/base.cpp
+++ b/src/text/formatting/base.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/text/formatting/format.cpp b/src/text/formatting/format.cpp
index 524abcf..e8c14e1 100644
--- a/src/text/formatting/format.cpp
+++ b/src/text/formatting/format.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/text/formatting/layout.cpp b/src/text/formatting/layout.cpp
index d0372ef..a5b59a8 100644
--- a/src/text/formatting/layout.cpp
+++ b/src/text/formatting/layout.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/text/formatting/list.cpp b/src/text/formatting/list.cpp
index 1d6f7b9..c8f444f 100644
--- a/src/text/formatting/list.cpp
+++ b/src/text/formatting/list.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/text/formatting/registry.cpp b/src/text/formatting/registry.cpp
index 4d28dd0..bf49c56 100644
--- a/src/text/formatting/registry.cpp
+++ b/src/text/formatting/registry.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/text/formatting/text.cpp b/src/text/formatting/text.cpp
index 51c7086..8247bd2 100644
--- a/src/text/formatting/text.cpp
+++ b/src/text/formatting/text.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -28,6 +28,7 @@
#include <mapnik/text/text_properties.hpp>
#include <mapnik/xml_node.hpp>
#include <mapnik/text/text_layout.hpp>
+#include <mapnik/debug.hpp>
// boost
#include <boost/property_tree/ptree.hpp>
@@ -53,21 +54,28 @@ node_ptr text_node::from_xml(xml_node const& xml, fontset_map const& fontsets)
void text_node::apply(evaluated_format_properties_ptr const& p, feature_impl const& feature, attributes const& vars, text_layout &output) const
{
mapnik::value_unicode_string text_str = util::apply_visitor(evaluate<feature_impl,value_type,attributes>(feature,vars), *text_).to_unicode();
- if (p->text_transform == UPPERCASE)
+ switch (p->text_transform)
{
- text_str = text_str.toUpper();
- }
- else if (p->text_transform == LOWERCASE)
- {
- text_str = text_str.toLower();
- }
+ case UPPERCASE:
+ text_str.toUpper();
+ break;
+ case LOWERCASE:
+ text_str.toLower();
+ break;
+ case REVERSE:
+ text_str.reverse();
+ break;
+ case CAPITALIZE:
#if !UCONFIG_NO_BREAK_ITERATION
- else if (p->text_transform == CAPITALIZE)
- {
// note: requires BreakIterator support in ICU which is optional
- text_str = text_str.toTitle(nullptr);
- }
+ text_str.toTitle(nullptr);
+#else
+ MAPNIK_LOG_DEBUG(text_node) << "text capitalize (toTitle) disabled because ICU was built without UCONFIG_NO_BREAK_ITERATION";
#endif
+ break;
+ default:
+ break;
+ }
if (text_str.length() > 0) {
output.add_text(text_str, p);
}
diff --git a/src/text/glyph_positions.cpp b/src/text/glyph_positions.cpp
index 1f42ec6..e950f4e 100644
--- a/src/text/glyph_positions.cpp
+++ b/src/text/glyph_positions.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -34,7 +34,7 @@ namespace mapnik
glyph_positions::glyph_positions()
: data_(),
base_point_(),
- marker_(),
+ marker_info_(),
marker_pos_(),
bbox_() {}
@@ -68,15 +68,15 @@ void glyph_positions::set_base_point(pixel_position const& base_point)
base_point_ = base_point;
}
-void glyph_positions::set_marker(marker_info_ptr marker, pixel_position const& marker_pos)
+void glyph_positions::set_marker(marker_info_ptr mark, pixel_position const& marker_pos)
{
- marker_ = marker;
+ marker_info_ = mark;
marker_pos_ = marker_pos;
}
-marker_info_ptr glyph_positions::marker() const
+marker_info_ptr glyph_positions::get_marker() const
{
- return marker_;
+ return marker_info_;
}
pixel_position const& glyph_positions::marker_pos() const
diff --git a/src/text/itemizer.cpp b/src/text/itemizer.cpp
index 876c192..5058bfd 100644
--- a/src/text/itemizer.cpp
+++ b/src/text/itemizer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/text/placement_finder.cpp b/src/text/placement_finder.cpp
index f63d6db..ff44147 100644
--- a/src/text/placement_finder.cpp
+++ b/src/text/placement_finder.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -29,7 +29,8 @@
#include <mapnik/text/glyph_info.hpp>
#include <mapnik/text/text_properties.hpp>
#include <mapnik/text/glyph_positions.hpp>
-#include <mapnik/text/vertex_cache.hpp>
+#include <mapnik/vertex_cache.hpp>
+#include <mapnik/util/math.hpp>
// agg
#include "agg_conv_clip_polyline.h"
@@ -87,7 +88,6 @@ bool placement_finder::next_position()
horizontal_alignment_ = layout->horizontal_alignment();
return true;
}
- MAPNIK_LOG_WARN(placement_finder) << "next_position() called while last call already returned false!\n";
return false;
}
@@ -95,7 +95,11 @@ text_upright_e placement_finder::simplify_upright(text_upright_e upright, double
{
if (upright == UPRIGHT_AUTO)
{
- return (std::fabs(normalize_angle(angle)) > 0.5*M_PI) ? UPRIGHT_LEFT : UPRIGHT_RIGHT;
+ return (std::fabs(util::normalize_angle(angle)) > 0.5*M_PI) ? UPRIGHT_LEFT : UPRIGHT_RIGHT;
+ }
+ if (upright == UPRIGHT_AUTO_DOWN)
+ {
+ return (std::fabs(util::normalize_angle(angle)) < 0.5*M_PI) ? UPRIGHT_LEFT : UPRIGHT_RIGHT;
}
if (upright == UPRIGHT_LEFT_ONLY)
{
@@ -234,10 +238,9 @@ bool placement_finder::single_line_placement(vertex_cache &pp, text_upright_e or
double last_cluster_angle = 999;
int current_cluster = -1;
pixel_position cluster_offset;
- double angle;
+ double angle = 0;
rotation rot;
- double last_glyph_spacing = 0.;
-
+ double last_glyph_spacing = 0.0;
for (auto const& glyph : line)
{
if (current_cluster != static_cast<int>(glyph.char_index))
@@ -245,21 +248,27 @@ bool placement_finder::single_line_placement(vertex_cache &pp, text_upright_e or
if (adjust)
{
if (!off_pp.move(sign * (layout.cluster_width(current_cluster) + last_glyph_spacing)))
+ {
return false;
+ }
last_glyph_spacing = adjust_character_spacing;
}
else
{
if (!off_pp.move_to_distance(sign * (layout.cluster_width(current_cluster) + last_glyph_spacing)))
+ {
return false;
+ }
last_glyph_spacing = glyph.format->character_spacing * scale_factor_;
}
current_cluster = glyph.char_index;
// Only calculate new angle at the start of each cluster!
- angle = normalize_angle(off_pp.angle(sign * layout.cluster_width(current_cluster)));
+ // Y axis is inverted.
+ // See note about coordinate systems in placement_finder::find_point_placement().
+ angle = -util::normalize_angle(off_pp.angle(sign * layout.cluster_width(current_cluster)));
rot.init(angle);
if ((text_props_->max_char_angle_delta > 0) && (last_cluster_angle != 999) &&
- std::fabs(normalize_angle(angle-last_cluster_angle)) > text_props_->max_char_angle_delta)
+ std::fabs(util::normalize_angle(angle - last_cluster_angle)) > text_props_->max_char_angle_delta)
{
return false;
}
@@ -267,7 +276,10 @@ bool placement_finder::single_line_placement(vertex_cache &pp, text_upright_e or
last_cluster_angle = angle;
}
- if (std::abs(angle) > M_PI/2) ++upside_down_glyph_count;
+ if (std::abs(angle) > M_PI/2)
+ {
+ ++upside_down_glyph_count;
+ }
pixel_position pos = off_pp.current_position() + cluster_offset;
// Center the text on the line
@@ -296,12 +308,18 @@ bool placement_finder::single_line_placement(vertex_cache &pp, text_upright_e or
begin.restore();
return single_line_placement(pp, real_orientation == UPRIGHT_RIGHT ? UPRIGHT_LEFT : UPRIGHT_RIGHT);
}
- // upright==left_only or right_only and more than 50% of characters upside down => no placement
+ // upright==left-only or right-only and more than 50% of characters upside down => no placement
else if (orientation == UPRIGHT_LEFT_ONLY || orientation == UPRIGHT_RIGHT_ONLY)
{
return false;
}
}
+ else if (orientation == UPRIGHT_AUTO_DOWN)
+ {
+ // Try again with opposite orientation
+ begin.restore();
+ return single_line_placement(pp, real_orientation == UPRIGHT_RIGHT ? UPRIGHT_LEFT : UPRIGHT_RIGHT);
+ }
for (box2d<double> const& box : bboxes)
{
@@ -318,19 +336,6 @@ void placement_finder::path_move_dx(vertex_cache & pp, double dx)
if (!pp.move(dx)) pp.restore_state(state);
}
-double placement_finder::normalize_angle(double angle)
-{
- while (angle >= M_PI)
- {
- angle -= 2.0 * M_PI;
- }
- while (angle < -M_PI)
- {
- angle += 2.0 * M_PI;
- }
- return angle;
-}
-
double placement_finder::get_spacing(double path_length, double layout_width) const
{
int num_labels = 1;
diff --git a/src/text/placements/base.cpp b/src/text/placements/base.cpp
index 8b9c36b..0e70b1c 100644
--- a/src/text/placements/base.cpp
+++ b/src/text/placements/base.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/text/placements/dummy.cpp b/src/text/placements/dummy.cpp
index 59f1221..569b5df 100644
--- a/src/text/placements/dummy.cpp
+++ b/src/text/placements/dummy.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -33,7 +33,7 @@ bool text_placement_info_dummy::next() const
}
text_placement_info_ptr text_placements_dummy::get_placement_info(
- double scale_factor) const
+ double scale_factor, feature_impl const& feature, attributes const& vars) const
{
return std::make_shared<text_placement_info_dummy>(this, scale_factor);
}
diff --git a/src/text/placements/list.cpp b/src/text/placements/list.cpp
index 1fec71a..1c40b68 100644
--- a/src/text/placements/list.cpp
+++ b/src/text/placements/list.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -65,7 +65,7 @@ text_symbolizer_properties & text_placements_list::get(unsigned i)
}
-text_placement_info_ptr text_placements_list::get_placement_info(double scale_factor) const
+text_placement_info_ptr text_placements_list::get_placement_info(double scale_factor, feature_impl const& feature, attributes const& vars) const
{
return std::make_shared<text_placement_info_list>(this, scale_factor);
}
diff --git a/src/text/placements/registry.cpp b/src/text/placements/registry.cpp
index 535f842..c7a655b 100644
--- a/src/text/placements/registry.cpp
+++ b/src/text/placements/registry.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/text/placements/simple.cpp b/src/text/placements/simple.cpp
index edcdad2..693b0ba 100644
--- a/src/text/placements/simple.cpp
+++ b/src/text/placements/simple.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,6 +25,10 @@
#include <mapnik/text/placements/simple.hpp>
#include <mapnik/ptree_helpers.hpp>
#include <mapnik/xml_node.hpp>
+#include <mapnik/value.hpp>
+#include <mapnik/expression_evaluator.hpp>
+#include <mapnik/symbolizer.hpp>
+#include <mapnik/expression_string.hpp>
// boost
#pragma GCC diagnostic push
@@ -47,38 +51,24 @@ namespace phoenix = boost::phoenix;
using phoenix::push_back;
using phoenix::ref;
-bool text_placement_info_simple::next() const
+struct direction_name : qi::symbols<char, directions_e>
{
- while (true)
+ direction_name()
{
- if (state > 0)
- {
- if (state > parent_->text_sizes_.size()) return false;
- properties.format_defaults.text_size = value_double(parent_->text_sizes_[state-1]);
- }
- if (!next_position_only())
- {
- ++state;
- position_state = 0;
- }
- else break;
+ add
+ ("N" , NORTH)
+ ("E" , EAST)
+ ("S" , SOUTH)
+ ("W" , WEST)
+ ("NE", NORTHEAST)
+ ("SE", SOUTHEAST)
+ ("NW", NORTHWEST)
+ ("SW", SOUTHWEST)
+ ("X" , EXACT_POSITION)
+ ;
}
- return true;
-}
-
-bool text_placement_info_simple::next_position_only() const
-{
- if (position_state >= parent_->direction_.size()) return false;
- //directions_e dir = parent_->direction_[position_state];
- properties.layout_defaults.dir = parent_->direction_[position_state];
- ++position_state;
- return true;
-}
-text_placement_info_ptr text_placements_simple::get_placement_info(double scale_factor) const
-{
- return std::make_shared<text_placement_info_simple>(this, scale_factor);
-}
+};
// Position string: [POS][SIZE]
// [POS] is any combination of
@@ -91,67 +81,175 @@ text_placement_info_ptr text_placements_simple::get_placement_info(double scale_
// Example: N,S,15,10,8 (tries placement above, then below and if
// that fails it tries the additional font sizes 15, 10 and 8.
-void text_placements_simple::set_positions(std::string const& positions)
+bool parse_positions(std::string const& evaluated_positions,
+ std::vector<directions_e> & direction,
+ std::vector<int> & text_sizes)
{
- positions_ = positions;
- struct direction_name_ : qi::symbols<char, directions_e>
- {
- direction_name_()
- {
- add
- ("N" , NORTH)
- ("E" , EAST)
- ("S" , SOUTH)
- ("W" , WEST)
- ("NE", NORTHEAST)
- ("SE", SOUTHEAST)
- ("NW", NORTHWEST)
- ("SW", SOUTHWEST)
- ("X" , EXACT_POSITION)
- ;
- }
-
- } direction_name;
+ direction_name names;
boost::spirit::ascii::space_type space;
qi::_1_type _1;
qi::float_type float_;
-
- std::string::const_iterator first = positions.begin(), last = positions.end();
- qi::phrase_parse(first, last,
- (direction_name[push_back(phoenix::ref(direction_), _1)] % ',')
- >> *(',' >> float_[push_back(phoenix::ref(text_sizes_), _1)]),
+ std::string::const_iterator first = evaluated_positions.begin();
+ std::string::const_iterator last = evaluated_positions.end();
+ bool r = qi::phrase_parse(first, last,
+ (names[push_back(phoenix::ref(direction), _1)] % ',')
+ >> *(',' >> float_[push_back(phoenix::ref(text_sizes), _1)]),
space);
if (first != last)
{
- MAPNIK_LOG_WARN(text_placements) << "Could not parse text_placement_simple placement string ('" << positions << "')";
+ return false;
+ }
+ return r;
+}
+
+
+text_placement_info_simple::text_placement_info_simple(text_placements_simple const* parent,
+ std::string const& evaluated_positions,
+ double scale_factor)
+: text_placement_info(parent, scale_factor),
+ state(0),
+ position_state(0),
+ direction_(parent->direction_),
+ text_sizes_(parent->text_sizes_),
+ parent_(parent)
+{
+ if (direction_.empty() && !parse_positions(evaluated_positions,direction_,text_sizes_))
+ {
+ MAPNIK_LOG_ERROR(text_placements) << "Could not parse text_placement_simple placement string ('" << evaluated_positions << "')";
+ if (direction_.size() == 0)
+ {
+ MAPNIK_LOG_ERROR(text_placements) << "text_placements_simple with no valid placements! ('"<< evaluated_positions <<"')";
+ }
}
- if (direction_.size() == 0)
+}
+
+bool text_placement_info_simple::next() const
+{
+ while (true)
{
- MAPNIK_LOG_WARN(text_placements) << "text_placements_simple with no valid placements! ('"<< positions<<"')";
+ if (state > 0)
+ {
+ if (state > text_sizes_.size()) return false;
+ properties.format_defaults.text_size = value_double(text_sizes_[state-1]);
+ }
+ if (!next_position_only())
+ {
+ ++state;
+ position_state = 0;
+ }
+ else break;
}
+ return true;
}
-text_placements_simple::text_placements_simple()
+bool text_placement_info_simple::next_position_only() const
{
- set_positions("X");
+ if (position_state >= direction_.size()) return false;
+ properties.layout_defaults.dir = direction_[position_state];
+ ++position_state;
+ return true;
}
-text_placements_simple::text_placements_simple(std::string const& positions)
+text_placement_info_ptr text_placements_simple::get_placement_info(double scale_factor, feature_impl const& feature, attributes const& vars) const
{
- set_positions(positions);
+ std::string evaluated_positions = util::apply_visitor(extract_value<std::string>(feature,vars), positions_);
+ return std::make_shared<text_placement_info_simple>(this, evaluated_positions, scale_factor);
+}
+
+text_placements_simple::text_placements_simple(symbolizer_base::value_type const& positions)
+ : direction_(),
+ text_sizes_(),
+ positions_(positions) { }
+
+text_placements_simple::text_placements_simple(symbolizer_base::value_type const& positions,
+ std::vector<directions_e> && direction,
+ std::vector<int> && text_sizes)
+ : direction_(direction),
+ text_sizes_(text_sizes),
+ positions_(positions) { }
+
+namespace detail {
+ struct serialize_positions
+ {
+ serialize_positions() {}
+
+ std::string operator() (expression_ptr const& expr) const
+ {
+ if (expr) return to_expression_string(*expr);
+ return "";
+ }
+
+ std::string operator() (std::string const val) const
+ {
+ return val;
+ }
+
+ template <typename T>
+ std::string operator() (T const& val) const
+ {
+ return "";
+ }
+ };
}
-std::string text_placements_simple::get_positions()
+std::string text_placements_simple::get_positions() const
{
- return positions_; //TODO: Build string from data in direction_ and text_sizes_
+ return util::apply_visitor(detail::serialize_positions(), positions_);
}
text_placements_ptr text_placements_simple::from_xml(xml_node const& xml, fontset_map const& fontsets, bool is_shield)
{
- text_placements_ptr ptr = std::make_shared<text_placements_simple>(
- xml.get_attr<std::string>("placements", "X"));
- ptr->defaults.from_xml(xml, fontsets, is_shield);
- return ptr;
+ // TODO - handle X cleaner
+ std::string placements_string = xml.get_attr<std::string>("placements", "X");
+ // like set_property_from_xml in properties_util.hpp
+ if (!placements_string.empty())
+ {
+ if (placements_string == "X")
+ {
+ text_placements_ptr ptr = std::make_shared<text_placements_simple>(placements_string);
+ ptr->defaults.from_xml(xml, fontsets, is_shield);
+ return ptr;
+ }
+ else
+ {
+ try
+ {
+ // we don't use parse_expression(placements_string) directly here to benefit from the cache in the xml_node
+ boost::optional<expression_ptr> val = xml.get_opt_attr<expression_ptr>("placements");
+ if (val)
+ {
+ text_placements_ptr ptr = std::make_shared<text_placements_simple>(*val);
+ ptr->defaults.from_xml(xml, fontsets, is_shield);
+ return ptr;
+ }
+ }
+ catch (std::exception const& ex)
+ {
+ // otherwise ensure it is valid
+ std::vector<directions_e> direction;
+ std::vector<int> text_sizes;
+ if (!parse_positions(placements_string,direction,text_sizes))
+ {
+ MAPNIK_LOG_ERROR(text_placements) << "Could not parse text_placement_simple placement string ('" << placements_string << "')";
+ if (direction.size() == 0)
+ {
+ MAPNIK_LOG_ERROR(text_placements) << "text_placements_simple with no valid placements! ('"<< placements_string <<"')";
+ }
+ return text_placements_ptr();
+ }
+ else
+ {
+ text_placements_ptr ptr = std::make_shared<text_placements_simple>(placements_string,std::move(direction),std::move(text_sizes));
+ ptr->defaults.from_xml(xml, fontsets, is_shield);
+ return ptr;
+ }
+ }
+ text_placements_ptr ptr = std::make_shared<text_placements_simple>(placements_string);
+ ptr->defaults.from_xml(xml, fontsets, is_shield);
+ return ptr;
+ }
+ }
+ return text_placements_ptr();
}
} //ns mapnik
diff --git a/src/text/properties_util.cpp b/src/text/properties_util.cpp
index 873534f..ca76efd 100644
--- a/src/text/properties_util.cpp
+++ b/src/text/properties_util.cpp
@@ -28,7 +28,7 @@
namespace mapnik { namespace detail {
-struct property_serializer : public util::static_visitor<>
+struct property_serializer
{
property_serializer(std::string const& name, boost::property_tree::ptree & node)
: name_(name),
diff --git a/src/text/renderer.cpp b/src/text/renderer.cpp
index c582611..25566e9 100644
--- a/src/text/renderer.cpp
+++ b/src/text/renderer.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,11 +22,12 @@
// mapnik
#include <mapnik/text/renderer.hpp>
-#include <mapnik/graphics.hpp>
#include <mapnik/grid/grid.hpp>
#include <mapnik/text/text_properties.hpp>
#include <mapnik/font_engine_freetype.hpp>
#include <mapnik/text/face.hpp>
+#include <mapnik/image_util.hpp>
+#include <mapnik/image_any.hpp>
namespace mapnik
{
@@ -102,7 +103,7 @@ void composite_bitmap(T & pixmap, FT_Bitmap *bitmap, unsigned rgba, int x, int y
unsigned gray=bitmap->buffer[q*bitmap->width+p];
if (gray)
{
- pixmap.composite_pixel(comp_op, i, j, rgba, gray, opacity);
+ mapnik::composite_pixel(pixmap, comp_op, i, j, rgba, gray, opacity);
}
}
}
@@ -291,17 +292,17 @@ void agg_text_renderer<T>::render_halo(FT_Bitmap *bitmap,
int gray = bitmap->buffer[y*bitmap->width+x];
if (gray)
{
- pixmap_.composite_pixel(comp_op, x+x1-1, y+y1-1, rgba, gray*halo_radius*halo_radius, opacity);
- pixmap_.composite_pixel(comp_op, x+x1, y+y1-1, rgba, gray*halo_radius, opacity);
- pixmap_.composite_pixel(comp_op, x+x1+1, y+y1-1, rgba, gray*halo_radius*halo_radius, opacity);
+ mapnik::composite_pixel(pixmap_, comp_op, x+x1-1, y+y1-1, rgba, gray*halo_radius*halo_radius, opacity);
+ mapnik::composite_pixel(pixmap_, comp_op, x+x1, y+y1-1, rgba, gray*halo_radius, opacity);
+ mapnik::composite_pixel(pixmap_, comp_op, x+x1+1, y+y1-1, rgba, gray*halo_radius*halo_radius, opacity);
- pixmap_.composite_pixel(comp_op, x+x1-1, y+y1, rgba, gray*halo_radius, opacity);
- pixmap_.composite_pixel(comp_op, x+x1, y+y1, rgba, gray, opacity);
- pixmap_.composite_pixel(comp_op, x+x1+1, y+y1, rgba, gray*halo_radius, opacity);
+ mapnik::composite_pixel(pixmap_, comp_op, x+x1-1, y+y1, rgba, gray*halo_radius, opacity);
+ mapnik::composite_pixel(pixmap_, comp_op, x+x1, y+y1, rgba, gray, opacity);
+ mapnik::composite_pixel(pixmap_, comp_op, x+x1+1, y+y1, rgba, gray*halo_radius, opacity);
- pixmap_.composite_pixel(comp_op, x+x1-1, y+y1+1, rgba, gray*halo_radius*halo_radius, opacity);
- pixmap_.composite_pixel(comp_op, x+x1, y+y1+1, rgba, gray*halo_radius, opacity);
- pixmap_.composite_pixel(comp_op, x+x1+1, y+y1+1, rgba, gray*halo_radius*halo_radius, opacity);
+ mapnik::composite_pixel(pixmap_, comp_op, x+x1-1, y+y1+1, rgba, gray*halo_radius*halo_radius, opacity);
+ mapnik::composite_pixel(pixmap_, comp_op, x+x1, y+y1+1, rgba, gray*halo_radius, opacity);
+ mapnik::composite_pixel(pixmap_, comp_op, x+x1+1, y+y1+1, rgba, gray*halo_radius*halo_radius, opacity);
}
}
}
@@ -317,7 +318,7 @@ void agg_text_renderer<T>::render_halo(FT_Bitmap *bitmap,
{
for (int n=-halo_radius; n <=halo_radius; ++n)
for (int m=-halo_radius; m <= halo_radius; ++m)
- pixmap_.composite_pixel(comp_op, x+x1+m, y+y1+n, rgba, gray, opacity);
+ mapnik::composite_pixel(pixmap_, comp_op, x+x1+m, y+y1+n, rgba, gray, opacity);
}
}
}
@@ -357,7 +358,7 @@ grid_text_renderer<T>::grid_text_renderer(pixmap_type &pixmap,
: text_renderer(HALO_RASTERIZER_FAST, comp_op, src_over, scale_factor),
pixmap_(pixmap) {}
-template class agg_text_renderer<image_32>;
+template class agg_text_renderer<image_rgba8>;
template class grid_text_renderer<grid>;
} // namespace mapnik
diff --git a/src/text/symbolizer_helpers.cpp b/src/text/symbolizer_helpers.cpp
index 5d29bf0..7b15599 100644
--- a/src/text/symbolizer_helpers.cpp
+++ b/src/text/symbolizer_helpers.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -28,6 +28,10 @@
#include <mapnik/feature.hpp>
#include <mapnik/marker.hpp>
#include <mapnik/marker_cache.hpp>
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_type.hpp>
+#include <mapnik/geometry_centroid.hpp>
+#include <mapnik/vertex_processor.hpp>
#include <mapnik/geom_util.hpp>
#include <mapnik/parse_path.hpp>
#include <mapnik/debug.hpp>
@@ -40,7 +44,108 @@
//agg
#include "agg_conv_clip_polyline.h"
-namespace mapnik {
+namespace mapnik { namespace detail {
+
+template <typename Points>
+struct apply_vertex_placement
+{
+ apply_vertex_placement(Points & points, view_transform const& tr, proj_transform const& prj_trans)
+ : points_(points),
+ tr_(tr),
+ prj_trans_(prj_trans) {}
+
+ template <typename Adapter>
+ void operator() (Adapter const& va) const
+ {
+ double label_x, label_y, z = 0;
+ va.rewind(0);
+ for (auto cmd = va.vertex(&label_x, &label_y); cmd != SEG_END;)
+ {
+ if (cmd != SEG_CLOSE)
+ {
+ prj_trans_.backward(label_x, label_y, z);
+ tr_.forward(&label_x, &label_y);
+ points_.emplace_back(label_x, label_y);
+ }
+ }
+ }
+ Points & points_;
+ view_transform const& tr_;
+ proj_transform const& prj_trans_;
+};
+
+template <typename T>
+struct split_multi_geometries
+{
+ using container_type = T;
+ split_multi_geometries(container_type & cont, view_transform const& t,
+ proj_transform const& prj_trans, double minimum_path_length)
+ : cont_(cont),
+ t_(t),
+ prj_trans_(prj_trans),
+ minimum_path_length_(minimum_path_length) {}
+
+ void operator() (geometry::geometry_empty const&) const {}
+ void operator() (geometry::multi_point<double> const& multi_pt) const
+ {
+ for ( auto const& pt : multi_pt )
+ {
+ cont_.push_back(std::move(base_symbolizer_helper::geometry_cref(std::cref(pt))));
+ }
+ }
+ void operator() (geometry::multi_line_string<double> const& multi_line) const
+ {
+ for ( auto const& line : multi_line )
+ {
+ cont_.push_back(std::move(base_symbolizer_helper::geometry_cref(std::cref(line))));
+ }
+ }
+
+ void operator() (geometry::polygon<double> const& poly) const
+ {
+ if (minimum_path_length_ > 0)
+ {
+ box2d<double> bbox = t_.forward(geometry::envelope(poly), prj_trans_);
+ if (bbox.width() >= minimum_path_length_)
+ {
+ cont_.push_back(std::move(base_symbolizer_helper::geometry_cref(std::cref(poly))));
+ }
+ }
+ else
+ {
+ cont_.push_back(std::move(base_symbolizer_helper::geometry_cref(std::cref(poly))));
+ }
+ }
+
+ void operator() (geometry::multi_polygon<double> const& multi_poly) const
+ {
+ for ( auto const& poly : multi_poly )
+ {
+ (*this)(poly);
+ }
+ }
+
+ void operator() (geometry::geometry_collection<double> const& collection) const
+ {
+ for ( auto const& geom : collection)
+ {
+ util::apply_visitor(*this, geom);
+ }
+ }
+
+ template <typename Geometry>
+ void operator() (Geometry const& geom) const
+ {
+ cont_.push_back(std::move(base_symbolizer_helper::geometry_cref(std::cref(geom))));
+ }
+
+ container_type & cont_;
+ view_transform const& t_;
+ proj_transform const& prj_trans_;
+ double minimum_path_length_;
+};
+
+} // ns detail
base_symbolizer_helper::base_symbolizer_helper(
symbolizer_base const& sym,
@@ -58,7 +163,7 @@ base_symbolizer_helper::base_symbolizer_helper(
dims_(0, 0, width, height),
query_extent_(query_extent),
scale_factor_(scale_factor),
- info_ptr_(mapnik::get<text_placements_ptr>(sym_, keys::text_placements_)->get_placement_info(scale_factor)),
+ info_ptr_(mapnik::get<text_placements_ptr>(sym_, keys::text_placements_)->get_placement_info(scale_factor,feature_,vars_)),
text_props_(evaluate_text_properties(info_ptr_->properties,feature_,vars_))
{
initialize_geometries();
@@ -68,11 +173,18 @@ base_symbolizer_helper::base_symbolizer_helper(
struct largest_bbox_first
{
- bool operator() (geometry_type const* g0, geometry_type const* g1) const
+ bool operator() (geometry::geometry<double> const* g0, geometry::geometry<double> const* g1) const
+ {
+ box2d<double> b0 = geometry::envelope(*g0);
+ box2d<double> b1 = geometry::envelope(*g1);
+ return b0.width() * b0.height() > b1.width() * b1.height();
+ }
+ bool operator() (base_symbolizer_helper::geometry_cref const& g0,
+ base_symbolizer_helper::geometry_cref const& g1) const
{
- box2d<double> b0 = g0->envelope();
- box2d<double> b1 = g1->envelope();
- return b0.width()*b0.height() > b1.width()*b1.height();
+ box2d<double> b0 = geometry::envelope(g0);
+ box2d<double> b1 = geometry::envelope(g1);
+ return b0.width() * b0.height() > b1.width() * b1.height();
}
};
@@ -80,31 +192,14 @@ void base_symbolizer_helper::initialize_geometries() const
{
bool largest_box_only = text_props_->largest_bbox_only;
double minimum_path_length = text_props_->minimum_path_length;
- for ( auto const& geom : feature_.paths())
- {
- // don't bother with empty geometries
- if (geom.size() == 0) continue;
- mapnik::geometry_type::types type = geom.type();
- if (type == geometry_type::types::Polygon)
- {
- if (minimum_path_length > 0)
- {
- box2d<double> gbox = t_.forward(geom.envelope(), prj_trans_);
- if (gbox.width() < minimum_path_length)
- {
- continue;
- }
- }
- }
- // TODO - calculate length here as well
- geometries_to_process_.push_back(const_cast<geometry_type*>(&geom));
- }
-
+ util::apply_visitor(detail::split_multi_geometries<geometry_container_type>
+ (geometries_to_process_, t_, prj_trans_, minimum_path_length ), feature_.get_geometry());
+ // FIXME: return early if geometries_to_process_.empty() ?
if (largest_box_only)
{
geometries_to_process_.sort(largest_bbox_first());
geo_itr_ = geometries_to_process_.begin();
- geometries_to_process_.erase(++geo_itr_,geometries_to_process_.end());
+ geometries_to_process_.erase(++geo_itr_, geometries_to_process_.end());
}
geo_itr_ = geometries_to_process_.begin();
}
@@ -126,36 +221,44 @@ void base_symbolizer_helper::initialize_points() const
double label_y=0.0;
double z=0.0;
- for (auto * geom_ptr : geometries_to_process_)
+ for (auto const& geom : geometries_to_process_)
{
- geometry_type const& geom = *geom_ptr;
if (how_placed == VERTEX_PLACEMENT)
{
- geom.rewind(0);
- for(unsigned i = 0; i < geom.size(); ++i)
- {
- geom.vertex(&label_x, &label_y);
- prj_trans_.backward(label_x, label_y, z);
- t_.forward(&label_x, &label_y);
- points_.emplace_back(label_x, label_y);
- }
+ using apply_vertex_placement = detail::apply_vertex_placement<std::list<pixel_position> >;
+ apply_vertex_placement apply(points_, t_, prj_trans_);
+ util::apply_visitor(geometry::vertex_processor<apply_vertex_placement>(apply), geom);
}
else
{
// https://github.com/mapnik/mapnik/issues/1423
bool success = false;
// https://github.com/mapnik/mapnik/issues/1350
- if (geom.type() == geometry_type::types::LineString)
+ auto type = geometry::geometry_type(geom);
+
+ // FIXME: how to handle MultiLineString?
+ if (type == geometry::geometry_types::LineString)
{
- success = label::middle_point(geom, label_x,label_y);
+ auto const& line = mapnik::util::get<geometry::line_string<double> >(geom);
+ geometry::line_string_vertex_adapter<double> va(line);
+ success = label::middle_point(va, label_x,label_y);
}
else if (how_placed == POINT_PLACEMENT)
{
- success = label::centroid(geom, label_x, label_y);
+ geometry::point<double> pt;
+ geometry::centroid(geom, pt);
+ label_x = pt.x;
+ label_y = pt.y;
+ success = true;
}
- else if (how_placed == INTERIOR_PLACEMENT)
+ else if (how_placed == INTERIOR_PLACEMENT) // polygon
{
- success = label::interior_position(geom, label_x, label_y);
+ if (type == geometry::geometry_types::Polygon)
+ {
+ auto const& poly = mapnik::util::get<geometry::polygon<double> >(geom);
+ geometry::polygon_vertex_adapter<double> va(poly);
+ success = label::interior_position(va, label_x, label_y);
+ }
}
else
{
@@ -185,7 +288,7 @@ text_symbolizer_helper::text_symbolizer_helper(
: base_symbolizer_helper(sym, feature, vars, prj_trans, width, height, scale_factor, t, query_extent),
finder_(feature, vars, detector, dims_, *info_ptr_, font_manager, scale_factor),
adapter_(finder_,false),
- converter_(query_extent_, adapter_, sym_, t, prj_trans, affine_trans, feature, vars, scale_factor)
+ converter_(query_extent_, sym_, t, prj_trans, affine_trans, feature, vars, scale_factor)
{
// setup vertex converter
@@ -215,6 +318,40 @@ placements_list const& text_symbolizer_helper::get() const
return finder_.placements();
}
+class apply_line_placement_visitor
+{
+public:
+ apply_line_placement_visitor(vertex_converter_type & converter,
+ placement_finder_adapter<placement_finder> const & adapter)
+ : converter_(converter), adapter_(adapter)
+ {
+ }
+
+ bool operator()(geometry::line_string<double> const & geo) const
+ {
+ geometry::line_string_vertex_adapter<double> va(geo);
+ converter_.apply(va, adapter_);
+ return adapter_.status();
+ }
+
+ bool operator()(geometry::polygon<double> const & geo) const
+ {
+ geometry::polygon_vertex_adapter<double> va(geo);
+ converter_.apply(va, adapter_);
+ return adapter_.status();
+ }
+
+ template <typename T>
+ bool operator()(T const & geo) const
+ {
+ return false;
+ }
+
+private:
+ vertex_converter_type & converter_;
+ placement_finder_adapter<placement_finder> const & adapter_;
+};
+
bool text_symbolizer_helper::next_line_placement() const
{
while (!geometries_to_process_.empty())
@@ -228,13 +365,13 @@ bool text_symbolizer_helper::next_line_placement() const
continue; //Reexecute size check
}
- converter_.apply(**geo_itr_);
- if (adapter_.status())
+ if (mapnik::util::apply_visitor(apply_line_placement_visitor(converter_, adapter_), *geo_itr_))
{
//Found a placement
geo_itr_ = geometries_to_process_.erase(geo_itr_);
return true;
}
+
// No placement for this geometry. Keep it in geometries_to_process_ for next try.
++geo_itr_;
}
@@ -277,7 +414,7 @@ text_symbolizer_helper::text_symbolizer_helper(
: base_symbolizer_helper(sym, feature, vars, prj_trans, width, height, scale_factor, t, query_extent),
finder_(feature, vars, detector, dims_, *info_ptr_, font_manager, scale_factor),
adapter_(finder_,true),
- converter_(query_extent_, adapter_, sym_, t, prj_trans, affine_trans, feature, vars, scale_factor)
+ converter_(query_extent_, sym_, t, prj_trans, affine_trans, feature, vars, scale_factor)
{
// setup vertex converter
value_bool clip = mapnik::get<value_bool, keys::clip>(sym_, feature_, vars_);
@@ -301,13 +438,13 @@ void text_symbolizer_helper::init_marker() const
{
std::string filename = mapnik::get<std::string,keys::file>(sym_, feature_, vars_);
if (filename.empty()) return;
- boost::optional<mapnik::marker_ptr> marker = marker_cache::instance().find(filename, true);
- if (!marker) return;
+ std::shared_ptr<mapnik::marker const> marker = marker_cache::instance().find(filename, true);
+ if (marker->is<marker_null>()) return;
agg::trans_affine trans;
auto image_transform = get_optional<transform_type>(sym_, keys::image_transform);
if (image_transform) evaluate_transform(trans, feature_, vars_, *image_transform);
- double width = (*marker)->width();
- double height = (*marker)->height();
+ double width = marker->width();
+ double height = marker->height();
double px0 = - 0.5 * width;
double py0 = - 0.5 * height;
double px1 = 0.5 * width;
@@ -328,7 +465,7 @@ void text_symbolizer_helper::init_marker() const
value_double shield_dy = mapnik::get<value_double, keys::shield_dy>(sym_, feature_, vars_);
pixel_position marker_displacement;
marker_displacement.set(shield_dx,shield_dy);
- finder_.set_marker(std::make_shared<marker_info>(*marker, trans), bbox, unlock_image, marker_displacement);
+ finder_.set_marker(std::make_shared<marker_info>(marker, trans), bbox, unlock_image, marker_displacement);
}
diff --git a/src/text/text_layout.cpp b/src/text/text_layout.cpp
index 2250d97..fd2fdc5 100644
--- a/src/text/text_layout.cpp
+++ b/src/text/text_layout.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -224,7 +224,9 @@ void text_layout::break_line_icu(std::pair<unsigned, unsigned> && line_limits)
double wrap_at;
double string_width = line.width();
double string_height = line.line_height();
- for (double i = 1.0; ((wrap_at = string_width/i)/(string_height*i)) > text_ratio_ && (string_width/i) > scaled_wrap_width; i += 1.0) ;
+ for (double i = 1.0;
+ ((wrap_at = string_width/i)/(string_height*i)) > text_ratio_ && (string_width/i) > scaled_wrap_width;
+ i += 1.0) ;
scaled_wrap_width = wrap_at;
}
@@ -243,10 +245,9 @@ void text_layout::break_line_icu(std::pair<unsigned, unsigned> && line_limits)
}
breakitr->setText(text);
-
double current_line_length = 0;
int last_break_position = static_cast<int>(line.first_char());
- for (unsigned i=line.first_char(); i < line.last_char(); ++i)
+ for (unsigned i = line.first_char(); i < line.last_char(); ++i)
{
// TODO: character_spacing
std::map<unsigned, double>::const_iterator width_itr = width_map_.find(i);
@@ -256,7 +257,7 @@ void text_layout::break_line_icu(std::pair<unsigned, unsigned> && line_limits)
}
if (current_line_length <= scaled_wrap_width) continue;
- int break_position = wrap_before_ ? breakitr->preceding(i) : breakitr->following(i);
+ int break_position = wrap_before_ ? breakitr->preceding(i + 1) : breakitr->following(i);
// following() returns a break position after the last word. So DONE should only be returned
// when calling preceding.
if (break_position <= last_break_position || break_position == static_cast<int>(BreakIterator::DONE))
@@ -280,15 +281,18 @@ void text_layout::break_line_icu(std::pair<unsigned, unsigned> && line_limits)
{
break_position = line.last_char();
}
+ bool adjust_for_space_character = break_position > 0 && text[break_position - 1] == 0x0020;
- text_line new_line(last_break_position, break_position);
- clear_cluster_widths(last_break_position, break_position);
+ text_line new_line(last_break_position, adjust_for_space_character ? break_position - 1 : break_position);
+ clear_cluster_widths(last_break_position, adjust_for_space_character ? break_position - 1 : break_position);
shape_text(new_line);
add_line(std::move(new_line));
+
last_break_position = break_position;
i = break_position - 1;
current_line_length = 0;
}
+
if (last_break_position == static_cast<int>(line.first_char()))
{
// No line breaks => no reshaping required
@@ -303,7 +307,7 @@ void text_layout::break_line_icu(std::pair<unsigned, unsigned> && line_limits)
}
}
-struct line_breaker : mapnik::noncopyable
+struct line_breaker : util::noncopyable
{
line_breaker(value_unicode_string const& ustr, char wrap_char)
: ustr_(ustr),
@@ -365,7 +369,7 @@ void text_layout::break_line(std::pair<unsigned, unsigned> && line_limits)
}
if (current_line_length <= scaled_wrap_width) continue;
- int break_position = wrap_before_ ? breaker.preceding(i) : breaker.following(i);
+ int break_position = wrap_before_ ? breaker.preceding(i + 1) : breaker.following(i);
if (break_position <= last_break_position || break_position == static_cast<int>(BreakIterator::DONE))
{
break_position = breaker.following(i);
diff --git a/src/text/text_line.cpp b/src/text/text_line.cpp
index e14fd15..f66af1b 100644
--- a/src/text/text_line.cpp
+++ b/src/text/text_line.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/text/text_properties.cpp b/src/text/text_properties.cpp
index 2126b8e..b1e9dd7 100644
--- a/src/text/text_properties.cpp
+++ b/src/text/text_properties.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/text/vertex_cache.cpp b/src/text/vertex_cache.cpp
deleted file mode 100644
index 8a2fb2b..0000000
--- a/src/text/vertex_cache.cpp
+++ /dev/null
@@ -1,405 +0,0 @@
-/*****************************************************************************
- *
- * This file is part of Mapnik (c++ mapping toolkit)
- *
- * Copyright (C) 2013 Artem Pavlenko
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *****************************************************************************/
-// mapnik
-#include <mapnik/global.hpp>
-#include <mapnik/text/vertex_cache.hpp>
-#include <mapnik/offset_converter.hpp>
-#include <mapnik/make_unique.hpp>
-
-namespace mapnik
-{
-
-double vertex_cache::current_segment_angle()
-{
- return std::atan2(-(current_segment_->pos.y - segment_starting_point_.y),
- current_segment_->pos.x - segment_starting_point_.x);
-}
-
-double vertex_cache::angle(double width)
-{
- // IMPORTANT NOTE: See note about coordinate systems in placement_finder::find_point_placement()
- // for imformation about why the y axis is inverted!
- double tmp = width + position_in_segment_;
- if ((tmp <= current_segment_->length) && (tmp >= 0))
- {
- //Only calculate angle on request as it is expensive
- if (!angle_valid_)
- {
- angle_ = current_segment_angle();
- }
- }
- else
- {
- scoped_state s(*this);
- if (move(width))
- {
- pixel_position const& old_pos = s.get_state().position();
- return std::atan2(-(current_position_.y - old_pos.y),
- current_position_.x - old_pos.x);
- }
- else
- {
- s.restore();
- angle_ = current_segment_angle();
- }
- }
- return width >= 0 ? angle_ : angle_ + M_PI;
-}
-
-bool vertex_cache::next_subpath()
-{
- if (!initialized_)
- {
- current_subpath_ = subpaths_.begin();
- initialized_ = true;
- }
- else
- {
- current_subpath_++;
- }
- if (current_subpath_ == subpaths_.end()) return false;
- rewind_subpath(); //Initialize position values
- return true;
-}
-
-void vertex_cache::rewind_subpath()
-{
- current_segment_ = current_subpath_->vector.begin();
- //All subpaths contain at least one segment (i.e. the starting point)
- segment_starting_point_ = current_position_ = current_segment_->pos;
- position_in_segment_ = 0;
- angle_valid_ = false;
- position_ = 0;
-}
-
-void vertex_cache::reset()
-{
- initialized_ = false;
-}
-
-bool vertex_cache::next_segment()
-{
- segment_starting_point_ = current_segment_->pos; //Next segments starts at the end of the current one
- if (current_segment_ == current_subpath_->vector.end()) return false;
- current_segment_++;
- angle_valid_ = false;
- if (current_segment_ == current_subpath_->vector.end()) return false;
- return true;
-}
-
-bool vertex_cache::previous_segment()
-{
- if (current_segment_ == current_subpath_->vector.begin()) return false;
- current_segment_--;
- angle_valid_ = false;
- if (current_segment_ == current_subpath_->vector.begin())
- {
- //First segment is special
- segment_starting_point_ = current_segment_->pos;
- return true;
- }
- segment_starting_point_ = (current_segment_-1)->pos;
- return true;
-}
-
-vertex_cache & vertex_cache::get_offseted(double offset, double region_width)
-{
- if (std::fabs(offset) < 0.01)
- {
- return *this;
- }
-
- offseted_lines_map::iterator pos = offseted_lines_.find(offset);
- if (pos == offseted_lines_.end())
- {
- offset_converter<vertex_cache> converter(*this);
- converter.set_offset(offset);
- pos = offseted_lines_.emplace(offset, std::make_unique<vertex_cache>(converter)).first;
- }
- vertex_cache_ptr & offseted_line = pos->second;
-
- offseted_line->reset();
- offseted_line->next_subpath(); //TODO: Multiple subpath support
-
- // find the point on the offset line closest to the current position,
- // which we'll use to make the offset line aligned to this one.
- double seek = offseted_line->position_closest_to(current_position_);
- offseted_line->move(seek);
- return *offseted_line;
-}
-
-inline double dist_sq(pixel_position const &d)
-{
- return d.x*d.x + d.y*d.y;
-}
-
-double vertex_cache::position_closest_to(pixel_position const &target_pos)
-{
- bool first = true;
- pixel_position old_pos, new_pos;
- double lin_pos = 0.0, min_pos = 0.0, min_dist_sq = std::numeric_limits<double>::max();
-
- // find closest approach of each individual segment to the
- // target position. would be good if there were some kind
- // of prior, or fast test to avoid calculating on each
- // segment, but i can't think of one.
- for (segment const &seg : current_subpath_->vector)
- {
- if (first)
- {
- old_pos = seg.pos;
- min_pos = lin_pos;
- min_dist_sq = dist_sq(target_pos - old_pos);
- first = false;
-
- }
- else
- {
- new_pos = seg.pos;
-
- pixel_position d = new_pos - old_pos;
- if ((d.x != 0.0) || (d.y != 0))
- {
- pixel_position c = target_pos - old_pos;
- double t = (c.x * d.x + c.y * d.y) / dist_sq(d);
-
- if ((t >= 0.0) && (t <= 1.0))
- {
- pixel_position pt = (d * t) + old_pos;
- double pt_dist_sq = dist_sq(target_pos - pt);
-
- if (pt_dist_sq < min_dist_sq)
- {
- min_dist_sq = pt_dist_sq;
- min_pos = lin_pos + seg.length * t;
- }
- }
- }
-
- old_pos = new_pos;
- lin_pos += seg.length;
-
- double end_dist_sq = dist_sq(target_pos - old_pos);
- if (end_dist_sq < min_dist_sq)
- {
- min_dist_sq = end_dist_sq;
- min_pos = lin_pos;
- }
- }
- }
-
- return min_pos;
-}
-
-bool vertex_cache::forward(double length)
-{
- if (length < 0)
- {
- MAPNIK_LOG_ERROR(vertex_cache) << "vertex_cache::forward() called with negative argument!\n";
- return false;
- }
- return move(length);
-}
-
-bool vertex_cache::backward(double length)
-{
- if (length < 0)
- {
- MAPNIK_LOG_ERROR(vertex_cache) << "vertex_cache::backward() called with negative argument!\n";
- return false;
- }
- return move(-length);
-}
-
-bool vertex_cache::move(double length)
-{
- if (current_segment_ == current_subpath_->vector.end()) return false;
-
- position_ += length;
- length += position_in_segment_;
- while (length >= current_segment_->length)
- {
- length -= current_segment_->length;
- if (!next_segment()) return false; //Skip all complete segments
- }
- while (length < 0)
- {
- if (!previous_segment()) return false;
- length += current_segment_->length;
- }
- double factor = length / current_segment_->length;
- position_in_segment_ = length;
- current_position_ = segment_starting_point_ + (current_segment_->pos - segment_starting_point_) * factor;
- return true;
-}
-
-bool vertex_cache::move_to_distance(double distance)
-{
- if (current_segment_ == current_subpath_->vector.end()) return false;
-
- double position_in_segment = position_in_segment_ + distance;
- if (position_in_segment < .0 || position_in_segment >= current_segment_->length)
- {
- // If there isn't enough distance left on this segment
- // then we need to search until we find the line segment that ends further than distance away
- double abs_distance = std::abs(distance);
- double new_abs_distance = .0;
- pixel_position inner_pos; // Inside circle.
- pixel_position outer_pos; // Outside circle.
-
- position_ -= position_in_segment_;
-
- if (distance > .0)
- {
- do
- {
- position_ += current_segment_->length;
- if (!next_segment()) return false;
- new_abs_distance = (current_position_ - current_segment_->pos).length();
- }
- while (new_abs_distance < abs_distance);
-
- inner_pos = segment_starting_point_;
- outer_pos = current_segment_->pos;
- }
- else
- {
- do
- {
- if (!previous_segment()) return false;
- position_ -= current_segment_->length;
- new_abs_distance = (current_position_ - segment_starting_point_).length();
- }
- while (new_abs_distance < abs_distance);
-
- inner_pos = current_segment_->pos;
- outer_pos = segment_starting_point_;
- }
-
- find_line_circle_intersection(current_position_.x, current_position_.y, abs_distance,
- inner_pos.x, inner_pos.y, outer_pos.x, outer_pos.y,
- current_position_.x, current_position_.y);
-
- position_in_segment_ = (current_position_ - segment_starting_point_).length();
- position_ += position_in_segment_;
- }
- else
- {
- position_ += distance;
- distance += position_in_segment_;
- double factor = distance / current_segment_->length;
- position_in_segment_ = distance;
- current_position_ = segment_starting_point_ + (current_segment_->pos - segment_starting_point_) * factor;
- }
- return true;
-}
-
-void vertex_cache::rewind(unsigned)
-{
- vertex_subpath_ = subpaths_.begin();
- vertex_segment_ = vertex_subpath_->vector.begin();
-}
-
-unsigned vertex_cache::vertex(double *x, double *y)
-{
- if (vertex_segment_ == vertex_subpath_->vector.end())
- {
- vertex_subpath_++;
- if (vertex_subpath_ == subpaths_.end()) return agg::path_cmd_stop;
- vertex_segment_ = vertex_subpath_->vector.begin();
- }
- *x = vertex_segment_->pos.x;
- *y = vertex_segment_->pos.y;
- unsigned cmd = (vertex_segment_ == vertex_subpath_->vector.begin()) ? agg::path_cmd_move_to : agg::path_cmd_line_to;
- vertex_segment_++;
- return cmd;
-}
-
-
-vertex_cache::state vertex_cache::save_state() const
-{
- state s;
- s.current_segment = current_segment_;
- s.position_in_segment = position_in_segment_;
- s.current_position = current_position_;
- s.segment_starting_point = segment_starting_point_;
- s.position_ = position_;
- return s;
-}
-
-void vertex_cache::restore_state(state const& s)
-{
- current_segment_ = s.current_segment;
- position_in_segment_ = s.position_in_segment;
- current_position_ = s.current_position;
- segment_starting_point_ = s.segment_starting_point;
- position_ = s.position_;
- angle_valid_ = false;
-}
-
-void vertex_cache::find_line_circle_intersection(
- double cx, double cy, double radius,
- double x1, double y1, double x2, double y2,
- double & ix, double & iy) const
-{
- double dx = x2 - x1;
- double dy = y2 - y1;
-
- double A = dx * dx + dy * dy;
- double B = 2 * (dx * (x1 - cx) + dy * (y1 - cy));
- double C = (x1 - cx) * (x1 - cx) + (y1 - cy) * (y1 - cy) - radius * radius;
-
- double det = B * B - 4 * A * C;
- if (A <= 1.0e-7 || det < 0)
- {
- // Should never happen.
- // No real solutions.
- return;
- }
- else if (det == 0)
- {
- // Could potentially happen....
- // One solution.
- double t = -B / (2 * A);
- ix = x1 + t * dx;
- iy = y1 + t * dy;
- return;
- }
- else
- {
- // Two solutions.
-
- // Always use the 1st one
- // We only really have one solution here, as we know the line segment will start in the circle and end outside
- double t = (-B + std::sqrt(det)) / (2 * A);
- ix = x1 + t * dx;
- iy = y1 + t * dy;
-
- //t = (-B - std::sqrt(det)) / (2 * A);
- //ix = x1 + t * dx;
- //iy = y1 + t * dy;
-
- return;
- }
-}
-
-} //ns mapnik
diff --git a/src/tiff_reader.cpp b/src/tiff_reader.cpp
index bb73712..e257723 100644
--- a/src/tiff_reader.cpp
+++ b/src/tiff_reader.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -42,9 +42,9 @@ extern "C"
namespace mapnik { namespace impl {
-static toff_t tiff_seek_proc(thandle_t fd, toff_t off, int whence)
+static toff_t tiff_seek_proc(thandle_t handle, toff_t off, int whence)
{
- std::istream* in = reinterpret_cast<std::istream*>(fd);
+ std::istream* in = reinterpret_cast<std::istream*>(handle);
switch(whence)
{
@@ -66,9 +66,9 @@ static int tiff_close_proc(thandle_t)
return 0;
}
-static toff_t tiff_size_proc(thandle_t fd)
+static toff_t tiff_size_proc(thandle_t handle)
{
- std::istream* in = reinterpret_cast<std::istream*>(fd);
+ std::istream* in = reinterpret_cast<std::istream*>(handle);
std::ios::pos_type pos = in->tellg();
in->seekg(0, std::ios::end);
std::ios::pos_type len = in->tellg();
@@ -76,9 +76,9 @@ static toff_t tiff_size_proc(thandle_t fd)
return static_cast<toff_t>(len);
}
-static tsize_t tiff_read_proc(thandle_t fd, tdata_t buf, tsize_t size)
+static tsize_t tiff_read_proc(thandle_t handle, tdata_t buf, tsize_t size)
{
- std::istream * in = reinterpret_cast<std::istream*>(fd);
+ std::istream * in = reinterpret_cast<std::istream*>(handle);
std::streamsize request_size = size;
if (static_cast<tsize_t>(request_size) != size)
return static_cast<tsize_t>(-1);
@@ -123,15 +123,23 @@ class tiff_reader : public image_reader
private:
source_type source_;
input_stream stream_;
+ tiff_ptr tif_;
int read_method_;
- std::size_t width_;
- std::size_t height_;
int rows_per_strip_;
int tile_width_;
int tile_height_;
- tiff_ptr tif_;
- bool premultiplied_alpha_;
+ std::size_t width_;
+ std::size_t height_;
+ boost::optional<box2d<double> > bbox_;
+ unsigned bps_;
+ unsigned sample_format_;
+ unsigned photometric_;
+ unsigned bands_;
+ unsigned planar_config_;
+ unsigned compression_;
bool has_alpha_;
+ bool is_tiled_;
+
public:
enum TiffType {
generic=1,
@@ -141,18 +149,35 @@ public:
explicit tiff_reader(std::string const& file_name);
tiff_reader(char const* data, std::size_t size);
virtual ~tiff_reader();
- unsigned width() const;
- unsigned height() const;
- inline bool has_alpha() const { return has_alpha_; }
- bool premultiplied_alpha() const;
- void read(unsigned x,unsigned y,image_data_32& image);
+ unsigned width() const final;
+ unsigned height() const final;
+ boost::optional<box2d<double> > bounding_box() const final;
+ inline bool has_alpha() const final { return has_alpha_; }
+ void read(unsigned x,unsigned y,image_rgba8& image) final;
+ image_any read(unsigned x, unsigned y, unsigned width, unsigned height) final;
+ // methods specific to tiff reader
+ unsigned bits_per_sample() const { return bps_; }
+ unsigned sample_format() const { return sample_format_; }
+ unsigned photometric() const { return photometric_; }
+ bool is_tiled() const { return is_tiled_; }
+ unsigned tile_width() const { return tile_width_; }
+ unsigned tile_height() const { return tile_height_; }
+ unsigned rows_per_strip() const { return rows_per_strip_; }
+ unsigned planar_config() const { return planar_config_; }
+ unsigned compression() const { return compression_; }
private:
tiff_reader(const tiff_reader&);
tiff_reader& operator=(const tiff_reader&);
void init();
- void read_generic(unsigned x,unsigned y,image_data_32& image);
- void read_stripped(unsigned x,unsigned y,image_data_32& image);
- void read_tiled(unsigned x,unsigned y,image_data_32& image);
+ void read_generic(unsigned x,unsigned y,image_rgba8& image);
+ void read_stripped(unsigned x,unsigned y,image_rgba8& image);
+
+ template <typename ImageData>
+ void read_tiled(unsigned x,unsigned y, ImageData & image);
+
+ template <typename ImageData>
+ image_any read_any_gray(unsigned x, unsigned y, unsigned width, unsigned height);
+
TIFF* open(std::istream & input);
};
@@ -178,14 +203,21 @@ template <typename T>
tiff_reader<T>::tiff_reader(std::string const& file_name)
: source_(file_name, std::ios_base::in | std::ios_base::binary),
stream_(source_),
+ tif_(nullptr),
read_method_(generic),
- width_(0),
- height_(0),
rows_per_strip_(0),
tile_width_(0),
tile_height_(0),
- premultiplied_alpha_(false),
- has_alpha_(false)
+ width_(0),
+ height_(0),
+ bps_(0),
+ sample_format_(SAMPLEFORMAT_UINT),
+ photometric_(0),
+ bands_(1),
+ planar_config_(PLANARCONFIG_CONTIG),
+ compression_(COMPRESSION_NONE),
+ has_alpha_(false),
+ is_tiled_(false)
{
if (!stream_) throw image_reader_exception("TIFF reader: cannot open file "+ file_name);
init();
@@ -195,16 +227,24 @@ template <typename T>
tiff_reader<T>::tiff_reader(char const* data, std::size_t size)
: source_(data, size),
stream_(source_),
+ tif_(nullptr),
read_method_(generic),
- width_(0),
- height_(0),
rows_per_strip_(0),
tile_width_(0),
tile_height_(0),
- premultiplied_alpha_(false),
- has_alpha_(false)
+ width_(0),
+ height_(0),
+ bps_(0),
+ sample_format_(SAMPLEFORMAT_UINT),
+ photometric_(0),
+ bands_(1),
+ planar_config_(PLANARCONFIG_CONTIG),
+ compression_(COMPRESSION_NONE),
+ has_alpha_(false),
+ is_tiled_(false)
{
if (!stream_) throw image_reader_exception("TIFF reader: cannot open image stream ");
+ stream_.rdbuf()->pubsetbuf(0, 0);
stream_.seekg(0, std::ios::beg);
init();
}
@@ -220,40 +260,95 @@ void tiff_reader<T>::init()
if (!tif) throw image_reader_exception("Can't open tiff file");
- char msg[1024];
+ TIFFGetField(tif,TIFFTAG_BITSPERSAMPLE,&bps_);
+ TIFFGetField(tif,TIFFTAG_SAMPLEFORMAT,&sample_format_);
+ TIFFGetField(tif,TIFFTAG_PHOTOMETRIC,&photometric_);
+ TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &bands_);
+
+ MAPNIK_LOG_DEBUG(tiff_reader) << "bits per sample: " << bps_;
+ MAPNIK_LOG_DEBUG(tiff_reader) << "sample format: " << sample_format_;
+ MAPNIK_LOG_DEBUG(tiff_reader) << "photometric: " << photometric_;
+ MAPNIK_LOG_DEBUG(tiff_reader) << "bands: " << bands_;
+
+ TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width_);
+ TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height_);
- if (TIFFRGBAImageOK(tif,msg))
+ TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &planar_config_);
+ TIFFGetField(tif, TIFFTAG_COMPRESSION, &compression_ );
+ TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rows_per_strip_);
+
+ std::uint16_t orientation;
+ if (TIFFGetField(tif, TIFFTAG_ORIENTATION, &orientation) == 0)
+ {
+ orientation = 1;
+ }
+ MAPNIK_LOG_DEBUG(tiff_reader) << "orientation: " << orientation;
+
+ is_tiled_ = TIFFIsTiled(tif);
+
+ if (is_tiled_)
{
- TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width_);
- TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height_);
- if (TIFFIsTiled(tif))
+ TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tile_width_);
+ TIFFGetField(tif, TIFFTAG_TILELENGTH, &tile_height_);
+ MAPNIK_LOG_DEBUG(tiff_reader) << "tiff is tiled";
+ read_method_ = tiled;
+ }
+ else if (TIFFGetField(tif,TIFFTAG_ROWSPERSTRIP,&rows_per_strip_)!=0)
+ {
+ MAPNIK_LOG_DEBUG(tiff_reader) << "tiff is stripped";
+ read_method_ = stripped;
+ }
+ //TIFFTAG_EXTRASAMPLES
+ uint16 extrasamples = 0;
+ uint16* sampleinfo = nullptr;
+ if (TIFFGetField(tif, TIFFTAG_EXTRASAMPLES,
+ &extrasamples, &sampleinfo))
+ {
+ has_alpha_ = true;
+ if (extrasamples > 0 &&
+ sampleinfo[0] == EXTRASAMPLE_UNSPECIFIED)
{
- TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tile_width_);
- TIFFGetField(tif, TIFFTAG_TILELENGTH, &tile_height_);
- read_method_=tiled;
+ throw std::runtime_error("Unspecified provided for extra samples to tiff reader.");
}
- else if (TIFFGetField(tif,TIFFTAG_ROWSPERSTRIP,&rows_per_strip_)!=0)
+ }
+ // Try extracting bounding box from geoTIFF tags
+ {
+ uint16 count = 0;
+ double *pixelscale;
+ double *tilepoint;
+ if (TIFFGetField(tif, 33550, &count, &pixelscale) == 1 && count == 3
+ && TIFFGetField(tif, 33922 , &count, &tilepoint) == 1 && count == 6)
{
- read_method_=stripped;
+ MAPNIK_LOG_DEBUG(tiff_reader) << "PixelScale:" << pixelscale[0] << "," << pixelscale[1] << "," << pixelscale[2];
+ MAPNIK_LOG_DEBUG(tiff_reader) << "TilePoint:" << tilepoint[0] << "," << tilepoint[1] << "," << tilepoint[2];
+ MAPNIK_LOG_DEBUG(tiff_reader) << " " << tilepoint[3] << "," << tilepoint[4] << "," << tilepoint[5];
+
+ // assuming upper-left
+ double lox = tilepoint[3];
+ double loy = tilepoint[4];
+ double hix = lox + pixelscale[0] * width_;
+ double hiy = loy - pixelscale[1] * height_;
+ bbox_.reset(box2d<double>(lox, loy, hix, hiy));
+ MAPNIK_LOG_DEBUG(tiff_reader) << "Bounding Box:" << *bbox_;
}
- //TIFFTAG_EXTRASAMPLES
- uint16 extrasamples = 0;
- uint16* sampleinfo = nullptr;
- if (TIFFGetField(tif, TIFFTAG_EXTRASAMPLES,
- &extrasamples, &sampleinfo))
+
+ }
+ if (!is_tiled_ &&
+ compression_ == COMPRESSION_NONE &&
+ planar_config_ == PLANARCONFIG_CONTIG)
+ {
+ if (height_ > 128 * 1024 * 1024)
{
- has_alpha_ = true;
- if (extrasamples == 1 &&
- sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA)
+ std::size_t line_size = (bands_ * width_ * bps_ + 7) / 8;
+ std::size_t default_strip_height = 8192 / line_size;
+ if (default_strip_height == 0) default_strip_height = 1;
+ std::size_t num_strips = height_ / default_strip_height;
+ if (num_strips > 128 * 1024 * 1024)
{
- premultiplied_alpha_ = true;
+ throw image_reader_exception("Can't allocate tiff");
}
}
}
- else
- {
- throw image_reader_exception(msg);
- }
}
template <typename T>
@@ -274,13 +369,13 @@ unsigned tiff_reader<T>::height() const
}
template <typename T>
-bool tiff_reader<T>::premultiplied_alpha() const
+boost::optional<box2d<double> > tiff_reader<T>::bounding_box() const
{
- return premultiplied_alpha_;
+ return bbox_;
}
template <typename T>
-void tiff_reader<T>::read(unsigned x,unsigned y,image_data_32& image)
+void tiff_reader<T>::read(unsigned x,unsigned y,image_rgba8& image)
{
if (read_method_==stripped)
{
@@ -297,96 +392,298 @@ void tiff_reader<T>::read(unsigned x,unsigned y,image_data_32& image)
}
template <typename T>
-void tiff_reader<T>::read_generic(unsigned, unsigned, image_data_32&)
+template <typename ImageData>
+image_any tiff_reader<T>::read_any_gray(unsigned x0, unsigned y0, unsigned width, unsigned height)
{
- TIFF* tif = open(stream_);
- if (tif)
+ using image_type = ImageData;
+ using pixel_type = typename image_type::pixel_type;
+ if (read_method_ == tiled)
{
- MAPNIK_LOG_DEBUG(tiff_reader) << "tiff_reader: TODO - tiff is not stripped or tiled";
+ image_type data(width,height);
+ read_tiled<image_type>(x0, y0, data);
+ return image_any(std::move(data));
}
+ else
+ {
+ TIFF* tif = open(stream_);
+ if (tif)
+ {
+ image_type data(width, height);
+ std::size_t block_size = rows_per_strip_ > 0 ? rows_per_strip_ : tile_height_ ;
+ std::ptrdiff_t start_y = y0 - y0 % block_size;
+ std::ptrdiff_t end_y = std::min(y0 + height, static_cast<unsigned>(height_));
+ std::ptrdiff_t start_x = x0;
+ std::ptrdiff_t end_x = std::min(x0 + width, static_cast<unsigned>(width_));
+ std::size_t element_size = sizeof(pixel_type);
+ std::size_t size_to_allocate = (TIFFScanlineSize(tif) + element_size - 1)/element_size;
+ const std::unique_ptr<pixel_type[]> scanline(new pixel_type[size_to_allocate]);
+ for (std::size_t y = start_y; y < end_y; ++y)
+ {
+ if (-1 != TIFFReadScanline(tif, scanline.get(), y) && (y >= y0))
+ {
+ pixel_type * row = data.get_row(y - y0);
+ std::transform(scanline.get() + start_x, scanline.get() + end_x, row, [](pixel_type const& p) { return p;});
+ }
+ }
+ return image_any(std::move(data));
+ }
+ }
+ return image_any();
}
+
+namespace detail {
+
+struct rgb8
+{
+ std::uint8_t r;
+ std::uint8_t g;
+ std::uint8_t b;
+};
+
+struct rgb8_to_rgba8
+{
+ std::uint32_t operator() (rgb8 const& in) const
+ {
+ return ((255 << 24) | (in.r) | (in.g << 8) | (in.b << 16));
+ }
+};
+
template <typename T>
-void tiff_reader<T>::read_tiled(unsigned x0,unsigned y0,image_data_32& image)
+struct tiff_reader_traits
{
- TIFF* tif = open(stream_);
- if (tif)
+ using image_type = T;
+ using pixel_type = typename image_type::pixel_type;
+ static bool read_tile(TIFF * tif, unsigned x, unsigned y, pixel_type* buf, std::size_t tile_width, std::size_t tile_height)
{
- uint32* buf = (uint32*)_TIFFmalloc(tile_width_*tile_height_*sizeof(uint32));
- int width=image.width();
- int height=image.height();
+ return (TIFFReadEncodedTile(tif, TIFFComputeTile(tif, x,y,0,0), buf, tile_width * tile_height * sizeof(pixel_type)) != -1);
+ }
+};
- int start_y=(y0/tile_height_)*tile_height_;
- int end_y=((y0+height)/tile_height_+1)*tile_height_;
+// default specialization that expands into RGBA
+template <>
+struct tiff_reader_traits<image_rgba8>
+{
+ using pixel_type = std::uint32_t;
+ static bool read_tile(TIFF * tif, unsigned x0, unsigned y0, pixel_type* buf, std::size_t tile_width, std::size_t tile_height)
+ {
+ if (TIFFReadRGBATile(tif, x0, y0, buf) != -1)
+ {
+ for (unsigned y = 0; y < tile_height/2; ++y)
+ {
+ std::swap_ranges(buf + y * tile_width, buf + (y + 1) * tile_width, buf + (tile_height - y - 1) * tile_width);
+ }
+ return true;
+ }
+ return false;
+ }
+};
- int start_x=(x0/tile_width_)*tile_width_;
- int end_x=((x0+width)/tile_width_+1)*tile_width_;
- int row,tx0,tx1,ty0,ty1;
+}
- for (int y=start_y;y<end_y;y+=tile_height_)
+template <typename T>
+image_any tiff_reader<T>::read(unsigned x0, unsigned y0, unsigned width, unsigned height)
+{
+ if (width > 10000 || height > 10000)
+ {
+ throw image_reader_exception("Can't allocate tiff > 10000x10000");
+ }
+ switch (photometric_)
+ {
+ case PHOTOMETRIC_MINISBLACK:
+ case PHOTOMETRIC_MINISWHITE:
+ {
+ switch (bps_)
+ {
+ case 8:
+ {
+ switch (sample_format_)
+ {
+ case SAMPLEFORMAT_UINT:
+ {
+ return read_any_gray<image_gray8>(x0, y0, width, height);
+ }
+ case SAMPLEFORMAT_INT:
+ {
+ return read_any_gray<image_gray8s>(x0, y0, width, height);
+ }
+ default:
+ {
+ throw std::runtime_error("tiff_reader: This sample format is not supported for this bits per sample");
+ }
+ }
+ }
+ case 16:
+ {
+ switch (sample_format_)
+ {
+ case SAMPLEFORMAT_UINT:
+ {
+ return read_any_gray<image_gray16>(x0, y0, width, height);
+ }
+ case SAMPLEFORMAT_INT:
+ {
+ return read_any_gray<image_gray16s>(x0, y0, width, height);
+ }
+ default:
+ {
+ throw std::runtime_error("tiff_reader: This sample format is not supported for this bits per sample");
+ }
+ }
+ }
+ case 32:
{
- ty0 = std::max(y0,(unsigned)y) - y;
- ty1 = std::min(height+y0,(unsigned)(y+tile_height_)) - y;
+ switch (sample_format_)
+ {
+ case SAMPLEFORMAT_UINT:
+ {
+ return read_any_gray<image_gray32>(x0, y0, width, height);
+ }
+ case SAMPLEFORMAT_INT:
+ {
+ return read_any_gray<image_gray32s>(x0, y0, width, height);
+ }
+ case SAMPLEFORMAT_IEEEFP:
+ {
+ return read_any_gray<image_gray32f>(x0, y0, width, height);
+ }
+ default:
+ {
+ throw std::runtime_error("tiff_reader: This sample format is not supported for this bits per sample");
+ }
+ }
+ }
+ case 64:
+ {
+ switch (sample_format_)
+ {
+ case SAMPLEFORMAT_UINT:
+ {
+ return read_any_gray<image_gray64>(x0, y0, width, height);
+ }
+ case SAMPLEFORMAT_INT:
+ {
+ return read_any_gray<image_gray64s>(x0, y0, width, height);
+ }
+ case SAMPLEFORMAT_IEEEFP:
+ {
+ return read_any_gray<image_gray64f>(x0, y0, width, height);
+ }
+ default:
+ {
+ throw std::runtime_error("tiff_reader: This sample format is not supported for this bits per sample");
+ }
+ }
+ }
+ }
+ }
+ default:
+ {
+ //PHOTOMETRIC_PALETTE = 3;
+ //PHOTOMETRIC_MASK = 4;
+ //PHOTOMETRIC_SEPARATED = 5;
+ //PHOTOMETRIC_YCBCR = 6;
+ //PHOTOMETRIC_CIELAB = 8;
+ //PHOTOMETRIC_ICCLAB = 9;
+ //PHOTOMETRIC_ITULAB = 10;
+ //PHOTOMETRIC_LOGL = 32844;
+ //PHOTOMETRIC_LOGLUV = 32845;
+ image_rgba8 data(width,height, true, true);
+ read(x0, y0, data);
+ return image_any(std::move(data));
+ }
+ }
+ return image_any();
+}
- int n0=tile_height_-ty1;
- int n1=tile_height_-ty0-1;
+template <typename T>
+void tiff_reader<T>::read_generic(unsigned, unsigned, image_rgba8& image)
+{
+ TIFF* tif = open(stream_);
+ if (tif)
+ {
+ throw std::runtime_error("tiff_reader: TODO - tiff is not stripped or tiled");
+ }
+}
- for (int x=start_x;x<end_x;x+=tile_width_)
- {
+template <typename T>
+template <typename ImageData>
+void tiff_reader<T>::read_tiled(unsigned x0,unsigned y0, ImageData & image)
+{
+ using pixel_type = typename detail::tiff_reader_traits<ImageData>::pixel_type;
- if (!TIFFReadRGBATile(tif,x,y,buf)) break;
+ TIFF* tif = open(stream_);
+ if (tif)
+ {
+ std::unique_ptr<pixel_type[]> buf(new pixel_type[tile_width_*tile_height_]);
+ int width = image.width();
+ int height = image.height();
+ int start_y = (y0 / tile_height_) * tile_height_;
+ int end_y = ((y0 + height) / tile_height_ + 1) * tile_height_;
+ int start_x = (x0 / tile_width_) * tile_width_;
+ int end_x = ((x0 + width) / tile_width_ + 1) * tile_width_;
+ end_y = std::min(end_y, int(height_));
+ end_x = std::min(end_x, int(width_));
+
+ for (int y = start_y; y < end_y; y += tile_height_)
+ {
+ int ty0 = std::max(y0, static_cast<unsigned>(y)) - y;
+ int ty1 = std::min(height + y0, static_cast<unsigned>(y + tile_height_)) - y;
- tx0=std::max(x0,(unsigned)x);
- tx1=std::min(width+x0,(unsigned)(x+tile_width_));
- row=y+ty0-y0;
- for (int n=n1;n>=n0;--n)
+ for (int x = start_x; x < end_x; x += tile_width_)
+ {
+ if (!detail::tiff_reader_traits<ImageData>::read_tile(tif, x, y, buf.get(), tile_width_, tile_height_))
{
- image.setRow(row,tx0-x0,tx1-x0,(const unsigned*)&buf[n*tile_width_+tx0-x]);
- ++row;
+ MAPNIK_LOG_DEBUG(tiff_reader) << "read_tile(...) failed at " << x << "/" << y << " for " << width_ << "/" << height_ << "\n";
+ break;
+ }
+ int tx0 = std::max(x0, static_cast<unsigned>(x));
+ int tx1 = std::min(width + x0, static_cast<unsigned>(x + tile_width_));
+ int row = y + ty0 - y0;
+ for (int ty = ty0; ty < ty1; ++ty, ++row)
+ {
+ image.set_row(row, tx0 - x0, tx1 - x0, &buf[ty * tile_width_ + tx0 - x]);
}
}
}
- _TIFFfree(buf);
}
}
+
template <typename T>
-void tiff_reader<T>::read_stripped(unsigned x0,unsigned y0,image_data_32& image)
+void tiff_reader<T>::read_stripped(unsigned x0,unsigned y0,image_rgba8& image)
{
TIFF* tif = open(stream_);
if (tif)
{
- uint32* buf = (uint32*)_TIFFmalloc(width_*rows_per_strip_*sizeof(uint32));
-
+ image_rgba8 strip(width_,rows_per_strip_,false);
int width=image.width();
int height=image.height();
unsigned start_y=(y0/rows_per_strip_)*rows_per_strip_;
- unsigned end_y=((y0+height)/rows_per_strip_+1)*rows_per_strip_;
- bool laststrip=((unsigned)end_y > height_)?true:false;
- int row,tx0,tx1,ty0,ty1;
+ unsigned end_y=std::min(y0+height, static_cast<unsigned>(height_));
+ int tx0,tx1,ty0,ty1;
tx0=x0;
- tx1=std::min(width+x0,(unsigned)width_);
-
+ tx1=std::min(width+x0,static_cast<unsigned>(width_));
+ int row = 0;
for (unsigned y=start_y; y < end_y; y+=rows_per_strip_)
{
ty0 = std::max(y0,y)-y;
- ty1 = std::min(height+y0,y+rows_per_strip_)-y;
+ ty1 = std::min(end_y,y+rows_per_strip_)-y;
- if (!TIFFReadRGBAStrip(tif,y,buf)) break;
-
- row=y+ty0-y0;
-
- int n0=laststrip ? 0:(rows_per_strip_-ty1);
- int n1=laststrip ? (ty1-ty0-1):(rows_per_strip_-ty0-1);
- for (int n=n1;n>=n0;--n)
+ if (!TIFFReadRGBAStrip(tif,y,strip.data()))
+ {
+ MAPNIK_LOG_DEBUG(tiff_reader) << "TIFFReadRGBAStrip failed at " << y << " for " << width_ << "/" << height_ << "\n";
+ break;
+ }
+ // This is in reverse becauase the TIFFReadRGBAStrip reads inverted
+ for (unsigned ty = ty1; ty > ty0; --ty)
{
- image.setRow(row,tx0-x0,tx1-x0,(const unsigned*)&buf[n*width_+tx0]);
+ image.set_row(row,tx0-x0,tx1-x0,&strip.data()[(ty-1)*width_+tx0]);
++row;
}
}
- _TIFFfree(buf);
}
}
@@ -395,7 +692,7 @@ TIFF* tiff_reader<T>::open(std::istream & input)
{
if (!tif_)
{
- tif_ = tiff_ptr(TIFFClientOpen("tiff_input_stream", "rm",
+ tif_ = tiff_ptr(TIFFClientOpen("tiff_input_stream", "rcm",
reinterpret_cast<thandle_t>(&input),
impl::tiff_read_proc,
impl::tiff_write_proc,
diff --git a/src/transform_expression.cpp b/src/transform_expression.cpp
index eff6548..e065ddc 100644
--- a/src/transform_expression.cpp
+++ b/src/transform_expression.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -30,7 +30,7 @@
namespace mapnik {
struct transform_node_to_expression_string
- : public util::static_visitor<void>
+
{
std::ostringstream& os_;
diff --git a/src/unicode.cpp b/src/unicode.cpp
index 4c703a2..f6c059f 100644
--- a/src/unicode.cpp
+++ b/src/unicode.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,9 +24,8 @@
#include <mapnik/unicode.hpp>
#include <mapnik/value_types.hpp>
-// stl
-#include <cstdlib>
-#include <string>
+// std
+#include <stdexcept>
// icu
#include <unicode/ucnv.h>
@@ -34,13 +33,15 @@
namespace mapnik {
transcoder::transcoder (std::string const& encoding)
- : ok_(false),
- conv_(0)
+ : conv_(0)
{
UErrorCode err = U_ZERO_ERROR;
conv_ = ucnv_open(encoding.c_str(),&err);
- if (U_SUCCESS(err)) ok_ = true;
- // TODO ??
+ if (!U_SUCCESS(err))
+ {
+ // NOT: conv_ should be null on error so no need to call ucnv_close
+ throw std::runtime_error(std::string("could not create converter for ") + encoding);
+ }
}
mapnik::value_unicode_string transcoder::transcode(const char* data, std::int32_t length) const
diff --git a/src/utils.cpp b/src/utils.cpp
index 668a0bf..f694faa 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/vertex_cache.cpp b/src/vertex_cache.cpp
new file mode 100644
index 0000000..d5a18a3
--- /dev/null
+++ b/src/vertex_cache.cpp
@@ -0,0 +1,418 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2014 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+// mapnik
+#include <mapnik/global.hpp>
+#include <mapnik/vertex_cache.hpp>
+#include <mapnik/offset_converter.hpp>
+#include <mapnik/make_unique.hpp>
+
+namespace mapnik
+{
+
+vertex_cache::vertex_cache(vertex_cache && rhs)
+ : current_position_(std::move(rhs.current_position_)),
+ segment_starting_point_(std::move(rhs.segment_starting_point_)),
+ subpaths_(std::move(rhs.subpaths_)),
+ position_in_segment_(std::move(rhs.position_in_segment_)),
+ angle_(std::move(rhs.angle_)),
+ angle_valid_(std::move(rhs.angle_valid_)),
+ offseted_lines_(std::move(rhs.offseted_lines_)),
+ position_(std::move(rhs.position_))
+{
+ // The C++11 standard doesn't guarantee iterators are valid when container is moved.
+ // We can create them from indexes but we don't need to. Just let them uninitialized.
+ initialized_ = false;
+}
+
+double vertex_cache::current_segment_angle()
+{
+ return std::atan2(current_segment_->pos.y - segment_starting_point_.y,
+ current_segment_->pos.x - segment_starting_point_.x);
+}
+
+double vertex_cache::angle(double width)
+{
+ double tmp = width + position_in_segment_;
+ if ((tmp <= current_segment_->length) && (tmp >= 0))
+ {
+ //Only calculate angle on request as it is expensive
+ if (!angle_valid_)
+ {
+ angle_ = current_segment_angle();
+ }
+ }
+ else
+ {
+ scoped_state s(*this);
+ if (move(width))
+ {
+ pixel_position const& old_pos = s.get_state().position();
+ return std::atan2(current_position_.y - old_pos.y,
+ current_position_.x - old_pos.x);
+ }
+ else
+ {
+ s.restore();
+ angle_ = current_segment_angle();
+ }
+ }
+ return width >= 0 ? angle_ : angle_ + M_PI;
+}
+
+bool vertex_cache::next_subpath()
+{
+ if (!initialized_)
+ {
+ current_subpath_ = subpaths_.begin();
+ initialized_ = true;
+ }
+ else
+ {
+ current_subpath_++;
+ }
+ if (current_subpath_ == subpaths_.end()) return false;
+ rewind_subpath(); //Initialize position values
+ return true;
+}
+
+void vertex_cache::rewind_subpath()
+{
+ current_segment_ = current_subpath_->vector.begin();
+ //All subpaths contain at least one segment (i.e. the starting point)
+ segment_starting_point_ = current_position_ = current_segment_->pos;
+ position_in_segment_ = 0;
+ angle_valid_ = false;
+ position_ = 0;
+}
+
+void vertex_cache::reset()
+{
+ initialized_ = false;
+}
+
+bool vertex_cache::next_segment()
+{
+ segment_starting_point_ = current_segment_->pos; //Next segments starts at the end of the current one
+ if (current_segment_ == current_subpath_->vector.end()) return false;
+ current_segment_++;
+ angle_valid_ = false;
+ if (current_segment_ == current_subpath_->vector.end()) return false;
+ return true;
+}
+
+bool vertex_cache::previous_segment()
+{
+ if (current_segment_ == current_subpath_->vector.begin()) return false;
+ current_segment_--;
+ angle_valid_ = false;
+ if (current_segment_ == current_subpath_->vector.begin())
+ {
+ //First segment is special
+ segment_starting_point_ = current_segment_->pos;
+ return true;
+ }
+ segment_starting_point_ = (current_segment_-1)->pos;
+ return true;
+}
+
+vertex_cache & vertex_cache::get_offseted(double offset, double region_width)
+{
+ if (std::fabs(offset) < 0.01)
+ {
+ return *this;
+ }
+
+ offseted_lines_map::iterator pos = offseted_lines_.find(offset);
+ if (pos == offseted_lines_.end())
+ {
+ offset_converter<vertex_cache> converter(*this);
+ converter.set_offset(offset);
+ pos = offseted_lines_.emplace(offset, std::make_unique<vertex_cache>(converter)).first;
+ }
+ vertex_cache_ptr & offseted_line = pos->second;
+
+ offseted_line->reset();
+ offseted_line->next_subpath(); //TODO: Multiple subpath support
+
+ // find the point on the offset line closest to the current position,
+ // which we'll use to make the offset line aligned to this one.
+ double seek = offseted_line->position_closest_to(current_position_);
+ offseted_line->move(seek);
+ return *offseted_line;
+}
+
+inline double dist_sq(pixel_position const &d)
+{
+ return d.x*d.x + d.y*d.y;
+}
+
+double vertex_cache::position_closest_to(pixel_position const &target_pos)
+{
+ bool first = true;
+ pixel_position old_pos, new_pos;
+ double lin_pos = 0.0, min_pos = 0.0, min_dist_sq = std::numeric_limits<double>::max();
+
+ // find closest approach of each individual segment to the
+ // target position. would be good if there were some kind
+ // of prior, or fast test to avoid calculating on each
+ // segment, but i can't think of one.
+ for (segment const &seg : current_subpath_->vector)
+ {
+ if (first)
+ {
+ old_pos = seg.pos;
+ min_pos = lin_pos;
+ min_dist_sq = dist_sq(target_pos - old_pos);
+ first = false;
+
+ }
+ else
+ {
+ new_pos = seg.pos;
+
+ pixel_position d = new_pos - old_pos;
+ if ((d.x != 0.0) || (d.y != 0))
+ {
+ pixel_position c = target_pos - old_pos;
+ double t = (c.x * d.x + c.y * d.y) / dist_sq(d);
+
+ if ((t >= 0.0) && (t <= 1.0))
+ {
+ pixel_position pt = (d * t) + old_pos;
+ double pt_dist_sq = dist_sq(target_pos - pt);
+
+ if (pt_dist_sq < min_dist_sq)
+ {
+ min_dist_sq = pt_dist_sq;
+ min_pos = lin_pos + seg.length * t;
+ }
+ }
+ }
+
+ old_pos = new_pos;
+ lin_pos += seg.length;
+
+ double end_dist_sq = dist_sq(target_pos - old_pos);
+ if (end_dist_sq < min_dist_sq)
+ {
+ min_dist_sq = end_dist_sq;
+ min_pos = lin_pos;
+ }
+ }
+ }
+
+ return min_pos;
+}
+
+bool vertex_cache::forward(double length)
+{
+ if (length < 0)
+ {
+ MAPNIK_LOG_ERROR(vertex_cache) << "vertex_cache::forward() called with negative argument!\n";
+ return false;
+ }
+ return move(length);
+}
+
+bool vertex_cache::backward(double length)
+{
+ if (length < 0)
+ {
+ MAPNIK_LOG_ERROR(vertex_cache) << "vertex_cache::backward() called with negative argument!\n";
+ return false;
+ }
+ return move(-length);
+}
+
+bool vertex_cache::move(double length)
+{
+ if (current_segment_ == current_subpath_->vector.end()) return false;
+
+ position_ += length;
+ length += position_in_segment_;
+ while (length >= current_segment_->length)
+ {
+ length -= current_segment_->length;
+ if (!next_segment()) return false; //Skip all complete segments
+ }
+ while (length < 0)
+ {
+ if (!previous_segment()) return false;
+ length += current_segment_->length;
+ }
+ double factor = length / current_segment_->length;
+ position_in_segment_ = length;
+ current_position_ = segment_starting_point_ + (current_segment_->pos - segment_starting_point_) * factor;
+ return true;
+}
+
+bool vertex_cache::move_to_distance(double distance)
+{
+ if (current_segment_ == current_subpath_->vector.end()) return false;
+
+ double position_in_segment = position_in_segment_ + distance;
+ if (position_in_segment < .0 || position_in_segment >= current_segment_->length)
+ {
+ // If there isn't enough distance left on this segment
+ // then we need to search until we find the line segment that ends further than distance away
+ double abs_distance = std::abs(distance);
+ double new_abs_distance = .0;
+ pixel_position inner_pos; // Inside circle.
+ pixel_position outer_pos; // Outside circle.
+
+ position_ -= position_in_segment_;
+
+ if (distance > .0)
+ {
+ do
+ {
+ position_ += current_segment_->length;
+ if (!next_segment()) return false;
+ new_abs_distance = (current_position_ - current_segment_->pos).length();
+ }
+ while (new_abs_distance < abs_distance);
+
+ inner_pos = segment_starting_point_;
+ outer_pos = current_segment_->pos;
+ }
+ else
+ {
+ do
+ {
+ if (!previous_segment()) return false;
+ position_ -= current_segment_->length;
+ new_abs_distance = (current_position_ - segment_starting_point_).length();
+ }
+ while (new_abs_distance < abs_distance);
+
+ inner_pos = current_segment_->pos;
+ outer_pos = segment_starting_point_;
+ }
+
+ find_line_circle_intersection(current_position_.x, current_position_.y, abs_distance,
+ inner_pos.x, inner_pos.y, outer_pos.x, outer_pos.y,
+ current_position_.x, current_position_.y);
+
+ position_in_segment_ = (current_position_ - segment_starting_point_).length();
+ position_ += position_in_segment_;
+ }
+ else
+ {
+ position_ += distance;
+ distance += position_in_segment_;
+ double factor = distance / current_segment_->length;
+ position_in_segment_ = distance;
+ current_position_ = segment_starting_point_ + (current_segment_->pos - segment_starting_point_) * factor;
+ }
+ return true;
+}
+
+void vertex_cache::rewind(unsigned)
+{
+ vertex_subpath_ = subpaths_.begin();
+ vertex_segment_ = vertex_subpath_->vector.begin();
+}
+
+unsigned vertex_cache::vertex(double *x, double *y)
+{
+ if (vertex_segment_ == vertex_subpath_->vector.end())
+ {
+ vertex_subpath_++;
+ if (vertex_subpath_ == subpaths_.end()) return agg::path_cmd_stop;
+ vertex_segment_ = vertex_subpath_->vector.begin();
+ }
+ *x = vertex_segment_->pos.x;
+ *y = vertex_segment_->pos.y;
+ unsigned cmd = (vertex_segment_ == vertex_subpath_->vector.begin()) ? agg::path_cmd_move_to : agg::path_cmd_line_to;
+ vertex_segment_++;
+ return cmd;
+}
+
+
+vertex_cache::state vertex_cache::save_state() const
+{
+ state s;
+ s.current_segment = current_segment_;
+ s.position_in_segment = position_in_segment_;
+ s.current_position = current_position_;
+ s.segment_starting_point = segment_starting_point_;
+ s.position_ = position_;
+ return s;
+}
+
+void vertex_cache::restore_state(state const& s)
+{
+ current_segment_ = s.current_segment;
+ position_in_segment_ = s.position_in_segment;
+ current_position_ = s.current_position;
+ segment_starting_point_ = s.segment_starting_point;
+ position_ = s.position_;
+ angle_valid_ = false;
+}
+
+void vertex_cache::find_line_circle_intersection(
+ double cx, double cy, double radius,
+ double x1, double y1, double x2, double y2,
+ double & ix, double & iy) const
+{
+ double dx = x2 - x1;
+ double dy = y2 - y1;
+
+ double A = dx * dx + dy * dy;
+ double B = 2 * (dx * (x1 - cx) + dy * (y1 - cy));
+ double C = (x1 - cx) * (x1 - cx) + (y1 - cy) * (y1 - cy) - radius * radius;
+
+ double det = B * B - 4 * A * C;
+ if (A <= 1.0e-7 || det < 0)
+ {
+ // Should never happen.
+ // No real solutions.
+ return;
+ }
+ else if (det == 0)
+ {
+ // Could potentially happen....
+ // One solution.
+ double t = -B / (2 * A);
+ ix = x1 + t * dx;
+ iy = y1 + t * dy;
+ return;
+ }
+ else
+ {
+ // Two solutions.
+
+ // Always use the 1st one
+ // We only really have one solution here, as we know the line segment will start in the circle and end outside
+ double t = (-B + std::sqrt(det)) / (2 * A);
+ ix = x1 + t * dx;
+ iy = y1 + t * dy;
+
+ //t = (-B - std::sqrt(det)) / (2 * A);
+ //ix = x1 + t * dx;
+ //iy = y1 + t * dy;
+
+ return;
+ }
+}
+
+} //ns mapnik
diff --git a/src/warp.cpp b/src/warp.cpp
index a7bb21a..f3c168c 100644
--- a/src/warp.cpp
+++ b/src/warp.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,7 +23,8 @@
// mapnik
#include <mapnik/warp.hpp>
#include <mapnik/config.hpp>
-#include <mapnik/image_data.hpp>
+#include <mapnik/image.hpp>
+#include <mapnik/image_scaling_traits.hpp>
#include <mapnik/image_util.hpp>
#include <mapnik/box2d.hpp>
#include <mapnik/view_transform.hpp>
@@ -47,105 +48,68 @@
namespace mapnik {
-void reproject_and_scale_raster(raster & target, raster const& source,
- proj_transform const& prj_trans,
- double offset_x, double offset_y,
- unsigned mesh_size,
- scaling_method_e scaling_method)
+template <typename T>
+MAPNIK_DECL void warp_image (T & target, T const& source, proj_transform const& prj_trans,
+ box2d<double> const& target_ext, box2d<double> const& source_ext,
+ double offset_x, double offset_y, unsigned mesh_size, scaling_method_e scaling_method, double filter_factor)
{
- view_transform ts(source.data_.width(), source.data_.height(),
- source.ext_);
- view_transform tt(target.data_.width(), target.data_.height(),
- target.ext_, offset_x, offset_y);
+ using image_type = T;
+ using pixel_type = typename image_type::pixel_type;
+ using pixfmt_pre = typename detail::agg_scaling_traits<image_type>::pixfmt_pre;
+ using color_type = typename detail::agg_scaling_traits<image_type>::color_type;
+ using renderer_base = agg::renderer_base<pixfmt_pre>;
+ using interpolator_type = typename detail::agg_scaling_traits<image_type>::interpolator_type;
- unsigned mesh_nx = std::ceil(source.data_.width()/double(mesh_size) + 1);
- unsigned mesh_ny = std::ceil(source.data_.height()/double(mesh_size) + 1);
+ constexpr std::size_t pixel_size = sizeof(pixel_type);
- image_data<double> xs(mesh_nx, mesh_ny);
- image_data<double> ys(mesh_nx, mesh_ny);
+ view_transform ts(source.width(), source.height(),
+ source_ext);
+ view_transform tt(target.width(), target.height(),
+ target_ext, offset_x, offset_y);
+
+ std::size_t mesh_nx = std::ceil(source.width()/double(mesh_size) + 1);
+ std::size_t mesh_ny = std::ceil(source.height()/double(mesh_size) + 1);
+
+ image_gray64f xs(mesh_nx, mesh_ny, false);
+ image_gray64f ys(mesh_nx, mesh_ny, false);
// Precalculate reprojected mesh
- for(unsigned j=0; j<mesh_ny; ++j)
+ for(std::size_t j = 0; j < mesh_ny; ++j)
{
- for (unsigned i=0; i<mesh_nx; ++i)
+ for (std::size_t i=0; i<mesh_nx; ++i)
{
- xs(i,j) = std::min(i*mesh_size,source.data_.width());
- ys(i,j) = std::min(j*mesh_size,source.data_.height());
+ xs(i,j) = std::min(i*mesh_size,source.width());
+ ys(i,j) = std::min(j*mesh_size,source.height());
ts.backward(&xs(i,j), &ys(i,j));
}
}
- prj_trans.backward(xs.getData(), ys.getData(), nullptr, mesh_nx*mesh_ny);
-
- // Initialize AGG objects
- using pixfmt = agg::pixfmt_rgba32_pre;
- using color_type = pixfmt::color_type;
- using renderer_base = agg::renderer_base<pixfmt>;
+ prj_trans.backward(xs.data(), ys.data(), nullptr, mesh_nx*mesh_ny);
agg::rasterizer_scanline_aa<> rasterizer;
agg::scanline_bin scanline;
- agg::rendering_buffer buf((unsigned char*)target.data_.getData(),
- target.data_.width(),
- target.data_.height(),
- target.data_.width()*4);
- pixfmt pixf(buf);
+ agg::rendering_buffer buf(target.bytes(),
+ target.width(),
+ target.height(),
+ target.width() * pixel_size);
+ pixfmt_pre pixf(buf);
renderer_base rb(pixf);
- rasterizer.clip_box(0, 0, target.data_.width(), target.data_.height());
+ rasterizer.clip_box(0, 0, target.width(), target.height());
agg::rendering_buffer buf_tile(
- (unsigned char*)source.data_.getData(),
- source.data_.width(),
- source.data_.height(),
- source.data_.width() * 4);
+ const_cast<unsigned char*>(source.bytes()),
+ source.width(),
+ source.height(),
+ source.width() * pixel_size);
- pixfmt pixf_tile(buf_tile);
+ pixfmt_pre pixf_tile(buf_tile);
- using img_accessor_type = agg::image_accessor_clone<pixfmt>;
+ using img_accessor_type = agg::image_accessor_clone<pixfmt_pre>;
img_accessor_type ia(pixf_tile);
agg::span_allocator<color_type> sa;
-
- // Initialize filter
- agg::image_filter_lut filter;
- switch(scaling_method)
- {
- case SCALING_NEAR: break;
- case SCALING_BILINEAR:
- filter.calculate(agg::image_filter_bilinear(), true); break;
- case SCALING_BICUBIC:
- filter.calculate(agg::image_filter_bicubic(), true); break;
- case SCALING_SPLINE16:
- filter.calculate(agg::image_filter_spline16(), true); break;
- case SCALING_SPLINE36:
- filter.calculate(agg::image_filter_spline36(), true); break;
- case SCALING_HANNING:
- filter.calculate(agg::image_filter_hanning(), true); break;
- case SCALING_HAMMING:
- filter.calculate(agg::image_filter_hamming(), true); break;
- case SCALING_HERMITE:
- filter.calculate(agg::image_filter_hermite(), true); break;
- case SCALING_KAISER:
- filter.calculate(agg::image_filter_kaiser(), true); break;
- case SCALING_QUADRIC:
- filter.calculate(agg::image_filter_quadric(), true); break;
- case SCALING_CATROM:
- filter.calculate(agg::image_filter_catrom(), true); break;
- case SCALING_GAUSSIAN:
- filter.calculate(agg::image_filter_gaussian(), true); break;
- case SCALING_BESSEL:
- filter.calculate(agg::image_filter_bessel(), true); break;
- case SCALING_MITCHELL:
- filter.calculate(agg::image_filter_mitchell(), true); break;
- case SCALING_SINC:
- filter.calculate(agg::image_filter_sinc(source.get_filter_factor()), true); break;
- case SCALING_LANCZOS:
- filter.calculate(agg::image_filter_lanczos(source.get_filter_factor()), true); break;
- case SCALING_BLACKMAN:
- filter.calculate(agg::image_filter_blackman(source.get_filter_factor()), true); break;
- }
-
// Project mesh cells into target interpolating raster inside each one
- for(unsigned j=0; j<mesh_ny-1; ++j)
+ for (std::size_t j = 0; j < mesh_ny - 1; ++j)
{
- for (unsigned i=0; i<mesh_nx-1; ++i)
+ for (std::size_t i = 0; i < mesh_nx - 1; ++i)
{
double polygon[8] = {xs(i,j), ys(i,j),
xs(i+1,j), ys(i+1,j),
@@ -162,37 +126,101 @@ void reproject_and_scale_raster(raster & target, raster const& source,
rasterizer.line_to_d(std::floor(polygon[4]), std::floor(polygon[5]));
rasterizer.line_to_d(std::floor(polygon[6]), std::floor(polygon[7]));
- unsigned x0 = i * mesh_size;
- unsigned y0 = j * mesh_size;
- unsigned x1 = (i+1) * mesh_size;
- unsigned y1 = (j+1) * mesh_size;
- x1 = std::min(x1, source.data_.width());
- y1 = std::min(y1, source.data_.height());
+ std::size_t x0 = i * mesh_size;
+ std::size_t y0 = j * mesh_size;
+ std::size_t x1 = (i+1) * mesh_size;
+ std::size_t y1 = (j+1) * mesh_size;
+ x1 = std::min(x1, source.width());
+ y1 = std::min(y1, source.height());
agg::trans_affine tr(polygon, x0, y0, x1, y1);
if (tr.is_valid())
{
- using interpolator_type = agg::span_interpolator_linear<agg::trans_affine>;
interpolator_type interpolator(tr);
-
if (scaling_method == SCALING_NEAR)
{
- using span_gen_type = agg::span_image_filter_rgba_nn
- <img_accessor_type, interpolator_type>;
+ using span_gen_type = typename detail::agg_scaling_traits<image_type>::span_image_filter;
span_gen_type sg(ia, interpolator);
- agg::render_scanlines_bin(rasterizer, scanline, rb,
- sa, sg);
+ agg::render_scanlines_bin(rasterizer, scanline, rb, sa, sg);
}
else
{
- using span_gen_type = agg::span_image_resample_rgba_affine
- <img_accessor_type>;
+ using span_gen_type = typename detail::agg_scaling_traits<image_type>::span_image_resample_affine;
+ agg::image_filter_lut filter;
+ detail::set_scaling_method(filter, scaling_method, filter_factor);
span_gen_type sg(ia, interpolator, filter);
- agg::render_scanlines_bin(rasterizer, scanline, rb,
- sa, sg);
+ agg::render_scanlines_bin(rasterizer, scanline, rb, sa, sg);
}
}
}
}
}
+
+namespace detail {
+
+struct warp_image_visitor
+{
+ warp_image_visitor (raster & target_raster, proj_transform const& prj_trans, box2d<double> const& source_ext,
+ double offset_x, double offset_y, unsigned mesh_size,
+ scaling_method_e scaling_method, double filter_factor)
+ : target_raster_(target_raster),
+ prj_trans_(prj_trans),
+ source_ext_(source_ext),
+ offset_x_(offset_x),
+ offset_y_(offset_y),
+ mesh_size_(mesh_size),
+ scaling_method_(scaling_method),
+ filter_factor_(filter_factor) {}
+
+ void operator() (image_null const&) {}
+
+ template <typename T>
+ void operator() (T const& source)
+ {
+ using image_type = T;
+ //source and target image data types must match
+ if (target_raster_.data_.template is<image_type>())
+ {
+ image_type & target = util::get<image_type>(target_raster_.data_);
+ warp_image (target, source, prj_trans_, target_raster_.ext_, source_ext_,
+ offset_x_, offset_y_, mesh_size_, scaling_method_, filter_factor_);
+ }
+ }
+
+ raster & target_raster_;
+ proj_transform const& prj_trans_;
+ box2d<double> const& source_ext_;
+ double offset_x_;
+ double offset_y_;
+ unsigned mesh_size_;
+ scaling_method_e scaling_method_;
+ double filter_factor_;
+};
+
+}
+
+void reproject_and_scale_raster(raster & target, raster const& source,
+ proj_transform const& prj_trans,
+ double offset_x, double offset_y,
+ unsigned mesh_size,
+ scaling_method_e scaling_method)
+{
+ detail::warp_image_visitor warper(target, prj_trans, source.ext_, offset_x, offset_y, mesh_size,
+ scaling_method, source.get_filter_factor());
+ util::apply_visitor(warper, source.data_);
+}
+
+template MAPNIK_DECL void warp_image (image_rgba8&, image_rgba8 const&, proj_transform const&,
+ box2d<double> const&, box2d<double> const&, double, double, unsigned, scaling_method_e, double);
+
+template MAPNIK_DECL void warp_image (image_gray8&, image_gray8 const&, proj_transform const&,
+ box2d<double> const&, box2d<double> const&, double, double, unsigned, scaling_method_e, double);
+
+template MAPNIK_DECL void warp_image (image_gray16&, image_gray16 const&, proj_transform const&,
+ box2d<double> const&, box2d<double> const&, double, double, unsigned, scaling_method_e, double);
+
+template MAPNIK_DECL void warp_image (image_gray32f&, image_gray32f const&, proj_transform const&,
+ box2d<double> const&, box2d<double> const&, double, double, unsigned, scaling_method_e, double);
+
+
}// namespace mapnik
diff --git a/src/webp_reader.cpp b/src/webp_reader.cpp
index bd34d23..b13627e 100644
--- a/src/webp_reader.cpp
+++ b/src/webp_reader.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2013 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -120,11 +120,12 @@ public:
explicit webp_reader(char const* data, std::size_t size);
explicit webp_reader(std::string const& filename);
~webp_reader();
- unsigned width() const;
- unsigned height() const;
- inline bool has_alpha() const { return has_alpha_; }
- bool premultiplied_alpha() const { return false; }
- void read(unsigned x,unsigned y,image_data_32& image);
+ unsigned width() const final;
+ unsigned height() const final;
+ boost::optional<box2d<double> > bounding_box() const final;
+ inline bool has_alpha() const final { return has_alpha_; }
+ void read(unsigned x,unsigned y,image_rgba8& image) final;
+ image_any read(unsigned x, unsigned y, unsigned width, unsigned height) final;
private:
void init();
};
@@ -229,7 +230,13 @@ unsigned webp_reader<T>::height() const
}
template <typename T>
-void webp_reader<T>::read(unsigned x0, unsigned y0,image_data_32& image)
+boost::optional<box2d<double> > webp_reader<T>::bounding_box() const
+{
+ return boost::optional<box2d<double> >();
+}
+
+template <typename T>
+void webp_reader<T>::read(unsigned x0, unsigned y0,image_rgba8& image)
{
WebPDecoderConfig config;
config_guard guard(config);
@@ -241,8 +248,8 @@ void webp_reader<T>::read(unsigned x0, unsigned y0,image_data_32& image)
config.options.use_cropping = 1;
config.options.crop_left = x0;
config.options.crop_top = y0;
- config.options.crop_width = std::min(width_ - x0, image.width());
- config.options.crop_height = std::min(height_ - y0, image.height());
+ config.options.crop_width = std::min(static_cast<std::size_t>(width_ - x0), image.width());
+ config.options.crop_height = std::min(static_cast<std::size_t>(height_ - y0), image.height());
if (WebPGetFeatures(buffer_->data(), buffer_->size(), &config.input) != VP8_STATUS_OK)
{
@@ -250,7 +257,7 @@ void webp_reader<T>::read(unsigned x0, unsigned y0,image_data_32& image)
}
config.output.colorspace = MODE_RGBA;
- config.output.u.RGBA.rgba = (uint8_t *)image.getBytes();
+ config.output.u.RGBA.rgba = reinterpret_cast<uint8_t *>(image.bytes());
config.output.u.RGBA.stride = 4 * image.width();
config.output.u.RGBA.size = image.width() * image.height() * 4;
config.output.is_external_memory = 1;
@@ -260,4 +267,12 @@ void webp_reader<T>::read(unsigned x0, unsigned y0,image_data_32& image)
}
}
+template <typename T>
+image_any webp_reader<T>::read(unsigned x, unsigned y, unsigned width, unsigned height)
+{
+ image_rgba8 data(width,height);
+ read(x, y, data);
+ return image_any(std::move(data));
+}
+
}
diff --git a/src/well_known_srs.cpp b/src/well_known_srs.cpp
index c3163df..8aaf7ab 100644
--- a/src/well_known_srs.cpp
+++ b/src/well_known_srs.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/src/wkb.cpp b/src/wkb.cpp
index 1a31d7c..87cd305 100644
--- a/src/wkb.cpp
+++ b/src/wkb.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,24 +25,16 @@
#include <mapnik/debug.hpp>
#include <mapnik/global.hpp>
#include <mapnik/wkb.hpp>
-#include <mapnik/coord_array.hpp>
-#include <mapnik/geom_util.hpp>
#include <mapnik/feature.hpp>
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
+#include <mapnik/geometry_correct.hpp>
namespace mapnik
{
-using CoordinateArray = coord_array<coord2d>;
-
-struct wkb_reader : mapnik::noncopyable
+struct wkb_reader : util::noncopyable
{
private:
- enum wkbByteOrder {
- wkbXDR=0,
- wkbNDR=1
- };
-
const char* wkb_;
std::size_t size_;
std::size_t pos_;
@@ -84,7 +76,7 @@ public:
wkbMultiLineStringZM=3005,
wkbMultiPolygonZM=3006,
wkbGeometryCollectionZM=3007
- };
+ };
wkb_reader(const char* wkb, std::size_t size, wkbFormat format)
: wkb_(wkb),
@@ -125,83 +117,84 @@ public:
needSwap_ = byteOrder_ ? wkbXDR : wkbNDR;
}
- void read(geometry_container & paths)
+ mapnik::geometry::geometry<double> read()
{
+ mapnik::geometry::geometry<double> geom = mapnik::geometry::geometry_empty();
int type = read_integer();
-
switch (type)
{
case wkbPoint:
- read_point(paths);
+ geom = std::move(read_point());
break;
case wkbLineString:
- read_linestring(paths);
+ geom = std::move(read_linestring());
break;
case wkbPolygon:
- read_polygon(paths);
+ geom = std::move(read_polygon());
break;
case wkbMultiPoint:
- read_multipoint(paths);
+ geom = std::move(read_multipoint());
break;
case wkbMultiLineString:
- read_multilinestring(paths);
+ geom = std::move(read_multilinestring());
break;
case wkbMultiPolygon:
- read_multipolygon(paths);
+ geom = std::move(read_multipolygon());
break;
case wkbGeometryCollection:
- read_collection(paths);
+ geom = std::move(read_collection());
break;
case wkbPointZ:
case wkbPointM:
- read_point_xyz(paths);
+ geom = std::move(read_point<true>());
break;
case wkbPointZM:
- read_point_xyzm(paths);
+ geom = std::move(read_point<true,true>());
break;
case wkbLineStringZ:
case wkbLineStringM:
- read_linestring_xyz(paths);
+ geom = std::move(read_linestring<true>());
break;
case wkbLineStringZM:
- read_linestring_xyzm(paths);
+ geom = std::move(read_linestring<true,true>());
break;
case wkbPolygonZ:
case wkbPolygonM:
- read_polygon_xyz(paths);
+ geom = std::move(read_polygon<true>());
break;
case wkbPolygonZM:
- read_polygon_xyzm(paths);
+ geom = std::move(read_polygon<true,true>());
break;
case wkbMultiPointZ:
case wkbMultiPointM:
- read_multipoint_xyz(paths);
+ geom = std::move(read_multipoint<true>());
break;
case wkbMultiPointZM:
- read_multipoint_xyzm(paths);
+ geom = std::move(read_multipoint<true,true>());
break;
case wkbMultiLineStringZ:
case wkbMultiLineStringM:
- read_multilinestring_xyz(paths);
+ geom = std::move(read_multilinestring<true>());
break;
case wkbMultiLineStringZM:
- read_multilinestring_xyzm(paths);
+ geom = std::move(read_multilinestring<true,true>());
break;
case wkbMultiPolygonZ:
case wkbMultiPolygonM:
- read_multipolygon_xyz(paths);
+ geom = std::move(read_multipolygon<true>());
break;
case wkbMultiPolygonZM:
- read_multipolygon_xyzm(paths);
+ geom = std::move(read_multipolygon<true,true>());
break;
case wkbGeometryCollectionZ:
case wkbGeometryCollectionM:
case wkbGeometryCollectionZM:
- read_collection(paths);
+ geom = std::move(read_collection());
break;
default:
break;
}
+ return geom;
}
private:
@@ -238,329 +231,136 @@ private:
return d;
}
- void read_coords(CoordinateArray& ar)
+ template <typename Ring, bool Z = false, bool M = false>
+ void read_coords(Ring & ring, std::size_t num_points)
{
- if (! needSwap_)
+ double x,y;
+ if (!needSwap_)
{
- for (auto & coord : ar)
+ for (std::size_t i = 0; i < num_points; ++i)
{
- read_double_ndr(wkb_ + pos_, coord.x);
- read_double_ndr(wkb_ + pos_ + 8, coord.y);
+ read_double_ndr(wkb_ + pos_, x);
+ read_double_ndr(wkb_ + pos_ + 8, y);
+ ring.emplace_back(x,y);
pos_ += 16; // skip XY
+ if (Z) pos_ += 8;
+ if (M) pos_ += 8;
}
}
else
{
- for (auto & coord : ar)
+ for (std::size_t i = 0; i < num_points; ++i)
{
- read_double_xdr(wkb_ + pos_, coord.x);
- read_double_xdr(wkb_ + pos_ + 8, coord.y);
+ read_double_xdr(wkb_ + pos_, x);
+ read_double_xdr(wkb_ + pos_ + 8, y);
+ ring.emplace_back(x,y);
pos_ += 16; // skip XY
+ if (Z) pos_ += 8;
+ if (M) pos_ += 8;
}
}
}
- void read_coords_xyz(CoordinateArray& ar)
- {
- if (! needSwap_)
- {
- for (auto & coord : ar)
- {
- read_double_ndr(wkb_ + pos_, coord.x);
- read_double_ndr(wkb_ + pos_ + 8, coord.y);
- pos_ += 24; // skip XYZ
- }
- }
- else
- {
- for (auto & coord : ar)
- {
- read_double_xdr(wkb_ + pos_, coord.x);
- read_double_xdr(wkb_ + pos_ + 8, coord.y);
- pos_ += 24; // skip XYZ
- }
- }
- }
-
- void read_coords_xyzm(CoordinateArray& ar)
- {
- if (! needSwap_)
- {
- for (auto & coord : ar)
- {
- read_double_ndr(wkb_ + pos_, coord.x);
- read_double_ndr(wkb_ + pos_ + 8, coord.y);
- pos_ += 32; // skip XYZM
- }
- }
- else
- {
- for (auto & coord : ar)
- {
- read_double_xdr(wkb_ + pos_, coord.x);
- read_double_xdr(wkb_ + pos_ + 8, coord.y);
- pos_ += 32; // skip XYZM
- }
- }
- }
-
- void read_point(geometry_container & paths)
- {
- double x = read_double();
- double y = read_double();
- auto pt = std::make_unique<geometry_type>(geometry_type::types::Point);
- pt->move_to(x, y);
- paths.push_back(pt.release());
- }
-
- void read_multipoint(geometry_container & paths)
- {
- int num_points = read_integer();
- for (int i = 0; i < num_points; ++i)
- {
- pos_ += 5;
- read_point(paths);
- }
- }
-
- void read_point_xyz(geometry_container & paths)
- {
- double x = read_double();
- double y = read_double();
- auto pt = std::make_unique<geometry_type>(geometry_type::types::Point);
- pos_ += 8; // double z = read_double();
- pt->move_to(x, y);
- paths.push_back(pt.release());
- }
-
- void read_point_xyzm(geometry_container & paths)
+ template <bool Z = false, bool M = false>
+ mapnik::geometry::point<double> read_point()
{
double x = read_double();
double y = read_double();
- auto pt = std::make_unique<geometry_type>(geometry_type::types::Point);
- pos_ += 16;
- pt->move_to(x, y);
- paths.push_back(pt.release());
+ if (Z) pos_ += 8;
+ if (M) pos_ += 8;
+ return mapnik::geometry::point<double>(x, y);
}
- void read_multipoint_xyz(geometry_container & paths)
+ template <bool Z = false, bool M = false>
+ mapnik::geometry::multi_point<double> read_multipoint()
{
+ mapnik::geometry::multi_point<double> multi_point;
int num_points = read_integer();
+ multi_point.reserve(num_points);
for (int i = 0; i < num_points; ++i)
{
pos_ += 5;
- read_point_xyz(paths);
+ multi_point.emplace_back(read_point<Z,M>());
}
+ return multi_point;
}
- void read_multipoint_xyzm(geometry_container & paths)
- {
- int num_points = read_integer();
- for (int i = 0; i < num_points; ++i)
- {
- pos_ += 5;
- read_point_xyzm(paths);
- }
- }
-
- void read_linestring(geometry_container & paths)
+ template <bool M = false, bool Z = false>
+ mapnik::geometry::line_string<double> read_linestring()
{
+ mapnik::geometry::line_string<double> line;
int num_points = read_integer();
if (num_points > 0)
{
- CoordinateArray ar(num_points);
- read_coords(ar);
- auto line = std::make_unique<geometry_type>(geometry_type::types::LineString);
- line->move_to(ar[0].x, ar[0].y);
- for (int i = 1; i < num_points; ++i)
- {
- line->line_to(ar[i].x, ar[i].y);
- }
- paths.push_back(line.release());
+ line.reserve(num_points);
+ read_coords<mapnik::geometry::line_string<double>, M, Z>(line, num_points);
}
+ return line;
}
- void read_multilinestring(geometry_container & paths)
+ template <bool M = false, bool Z = false>
+ mapnik::geometry::multi_line_string<double> read_multilinestring()
{
int num_lines = read_integer();
+ mapnik::geometry::multi_line_string<double> multi_line;
+ multi_line.reserve(num_lines);
for (int i = 0; i < num_lines; ++i)
{
pos_ += 5;
- read_linestring(paths);
+ multi_line.push_back(std::move(read_linestring<M, Z>()));
}
+ return multi_line;
}
- void read_linestring_xyz(geometry_container & paths)
- {
- int num_points = read_integer();
- if (num_points > 0)
- {
- CoordinateArray ar(num_points);
- read_coords_xyz(ar);
- auto line = std::make_unique<geometry_type>(geometry_type::types::LineString);
- line->move_to(ar[0].x, ar[0].y);
- for (int i = 1; i < num_points; ++i)
- {
- line->line_to(ar[i].x, ar[i].y);
- }
- paths.push_back(line.release());
- }
- }
-
- void read_linestring_xyzm(geometry_container & paths)
- {
- int num_points = read_integer();
- if (num_points > 0)
- {
- CoordinateArray ar(num_points);
- read_coords_xyzm(ar);
- auto line = std::make_unique<geometry_type>(geometry_type::types::LineString);
- line->move_to(ar[0].x, ar[0].y);
- for (int i = 1; i < num_points; ++i)
- {
- line->line_to(ar[i].x, ar[i].y);
- }
- paths.push_back(line.release());
- }
- }
-
- void read_multilinestring_xyz(geometry_container & paths)
- {
- int num_lines = read_integer();
- for (int i = 0; i < num_lines; ++i)
- {
- pos_ += 5;
- read_linestring_xyz(paths);
- }
- }
-
- void read_multilinestring_xyzm(geometry_container & paths)
- {
- int num_lines = read_integer();
- for (int i = 0; i < num_lines; ++i)
- {
- pos_ += 5;
- read_linestring_xyzm(paths);
- }
- }
-
- void read_polygon(geometry_container & paths)
+ template <bool M = false, bool Z = false>
+ mapnik::geometry::polygon<double> read_polygon()
{
int num_rings = read_integer();
- if (num_rings > 0)
+ mapnik::geometry::polygon<double> poly;
+ if (num_rings > 1)
{
- auto poly = std::make_unique<geometry_type>(geometry_type::types::Polygon);
- for (int i = 0; i < num_rings; ++i)
- {
- int num_points = read_integer();
- if (num_points > 0)
- {
- CoordinateArray ar(num_points);
- read_coords(ar);
- poly->move_to(ar[0].x, ar[0].y);
- for (int j = 1; j < num_points ; ++j)
- {
- poly->line_to(ar[j].x, ar[j].y);
- }
- poly->close_path();
- }
- }
- if (poly->size() > 3) // ignore if polygon has less than (3 + close_path) vertices
- paths.push_back(poly.release());
+ poly.interior_rings.reserve(num_rings - 1);
}
- }
-
- void read_multipolygon(geometry_container & paths)
- {
- int num_polys = read_integer();
- for (int i = 0; i < num_polys; ++i)
- {
- pos_ += 5;
- read_polygon(paths);
- }
- }
-
- void read_polygon_xyz(geometry_container & paths)
- {
- int num_rings = read_integer();
- if (num_rings > 0)
- {
- auto poly = std::make_unique<geometry_type>(geometry_type::types::Polygon);
- for (int i = 0; i < num_rings; ++i)
- {
- int num_points = read_integer();
- if (num_points > 0)
- {
- CoordinateArray ar(num_points);
- read_coords_xyz(ar);
- poly->move_to(ar[0].x, ar[0].y);
- for (int j = 1; j < num_points; ++j)
- {
- poly->line_to(ar[j].x, ar[j].y);
- }
- poly->close_path();
- }
- }
- if (poly->size() > 2) // ignore if polygon has less than 3 vertices
- paths.push_back(poly.release());
- }
- }
- void read_polygon_xyzm(geometry_container & paths)
- {
- int num_rings = read_integer();
- if (num_rings > 0)
+ for (int i = 0; i < num_rings; ++i)
{
- auto poly = std::make_unique<geometry_type>(geometry_type::types::Polygon);
- for (int i = 0; i < num_rings; ++i)
+ mapnik::geometry::linear_ring<double> ring;
+ int num_points = read_integer();
+ if (num_points > 0)
{
- int num_points = read_integer();
- if (num_points > 0)
- {
- CoordinateArray ar(num_points);
- read_coords_xyzm(ar);
- poly->move_to(ar[0].x, ar[0].y);
- for (int j = 1; j < num_points; ++j)
- {
- poly->line_to(ar[j].x, ar[j].y);
- }
- poly->close_path();
- }
+ ring.reserve(num_points);
+ read_coords<mapnik::geometry::linear_ring<double>, M, Z>(ring, num_points);
}
- if (poly->size() > 2) // ignore if polygon has less than 3 vertices
- paths.push_back(poly.release());
+ if ( i == 0) poly.set_exterior_ring(std::move(ring));
+ else poly.add_hole(std::move(ring));
}
+ return poly;
}
- void read_multipolygon_xyz(geometry_container & paths)
+ template <bool M = false, bool Z = false>
+ mapnik::geometry::multi_polygon<double> read_multipolygon()
{
int num_polys = read_integer();
+ mapnik::geometry::multi_polygon<double> multi_poly;
for (int i = 0; i < num_polys; ++i)
{
pos_ += 5;
- read_polygon_xyz(paths);
+ multi_poly.push_back(std::move(read_polygon<M, Z>()));
}
+ return multi_poly;
}
- void read_multipolygon_xyzm(geometry_container & paths)
- {
- int num_polys = read_integer();
- for (int i = 0; i < num_polys; ++i)
- {
- pos_ += 5;
- read_polygon_xyzm(paths);
- }
- }
-
- void read_collection(geometry_container & paths)
+ mapnik::geometry::geometry_collection<double> read_collection()
{
int num_geometries = read_integer();
+ mapnik::geometry::geometry_collection<double> collection;
for (int i = 0; i < num_geometries; ++i)
{
pos_ += 1; // skip byte order
- read(paths);
- }
- }
+ collection.push_back(std::move(read()));
+ }
+ return collection;
+ }
std::string wkb_geometry_type_string(int type)
{
@@ -595,7 +395,7 @@ private:
case wkbGeometryCollection: s << "GeometryCollection"; break;
case wkbGeometryCollectionZ: s << "GeometryCollectionZ"; break;
case wkbGeometryCollectionM: s << "GeometryCollectionM"; break;
- case wkbGeometryCollectionZM: s << "GeometryCollectionZM"; break;
+ case wkbGeometryCollectionZM:s << "GeometryCollectionZM"; break;
default: s << "wkbUnknown(" << type << ")"; break;
}
@@ -604,17 +404,15 @@ private:
};
-bool geometry_utils::from_wkb(geometry_container& paths,
- const char* wkb,
- unsigned size,
- wkbFormat format)
+mapnik::geometry::geometry<double> geometry_utils::from_wkb(const char* wkb,
+ std::size_t size,
+ wkbFormat format)
{
- std::size_t geom_count = paths.size();
wkb_reader reader(wkb, size, format);
- reader.read(paths);
- if (paths.size() > geom_count)
- return true;
- return false;
+ mapnik::geometry::geometry<double> geom(reader.read());
+ // note: this will only be applied to polygons
+ mapnik::geometry::correct(geom);
+ return geom;
}
-}
+} // namespace mapnik
diff --git a/src/wkt/mapnik_wkt_generator_grammar.cpp b/src/wkt/mapnik_wkt_generator_grammar.cpp
index 52636b8..780c08a 100644
--- a/src/wkt/mapnik_wkt_generator_grammar.cpp
+++ b/src/wkt/mapnik_wkt_generator_grammar.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2014 Artem Pavlenko, Jean-Francois Doyon
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -21,14 +21,13 @@
*****************************************************************************/
#include <mapnik/geometry.hpp>
-#include <mapnik/geometry_container.hpp>
#include <mapnik/wkt/wkt_generator_grammar_impl.hpp>
#include <string>
namespace mapnik { namespace wkt {
using sink_type = std::back_insert_iterator<std::string>;
-template struct wkt_generator<sink_type, mapnik::geometry_type>;
-template struct wkt_multi_generator<sink_type, mapnik::geometry_container>;
+template struct wkt_generator_grammar<sink_type, mapnik::geometry::geometry<double>, double >;
+template struct wkt_generator_grammar_int<sink_type, mapnik::geometry::geometry<std::int64_t>, std::int64_t >;
}}
diff --git a/src/wkt/mapnik_wkt_grammar.cpp b/src/wkt/mapnik_wkt_grammar.cpp
index b5d2996..aea52a9 100644
--- a/src/wkt/mapnik_wkt_grammar.cpp
+++ b/src/wkt/mapnik_wkt_grammar.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2014 Artem Pavlenko, Jean-Francois Doyon
+ * Copyright (C) 2015 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,6 +24,8 @@
#include <string>
namespace mapnik { namespace wkt {
+
using iterator_type = std::string::const_iterator;
-template struct wkt_collection_grammar<iterator_type>;
+template struct wkt_grammar<iterator_type>;
+
}}
diff --git a/src/xml_tree.cpp b/src/xml_tree.cpp
index b03dd91..410a2bc 100644
--- a/src/xml_tree.cpp
+++ b/src/xml_tree.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2012 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -427,6 +427,7 @@ compile_get_opt_attr(vertical_alignment_e);
compile_get_opt_attr(horizontal_alignment_e);
compile_get_opt_attr(justify_alignment_e);
compile_get_opt_attr(text_upright_e);
+compile_get_opt_attr(direction_e);
compile_get_opt_attr(halo_rasterizer_e);
compile_get_opt_attr(expression_ptr);
compile_get_opt_attr(font_feature_settings);
diff --git a/test/build.py b/test/build.py
new file mode 100644
index 0000000..18cabcd
--- /dev/null
+++ b/test/build.py
@@ -0,0 +1,58 @@
+import os
+import glob
+from copy import copy
+
+Import ('env')
+
+test_env = env.Clone()
+
+if not env['CPP_TESTS']:
+ for cpp_test_bin in glob.glob('./*/*-bin'):
+ os.unlink(cpp_test_bin)
+else:
+ test_env['LIBS'] = [env['MAPNIK_NAME']]
+ test_env.AppendUnique(LIBS='mapnik-wkt')
+ test_env.AppendUnique(LIBS='mapnik-json')
+ test_env.AppendUnique(LIBS=copy(env['LIBMAPNIK_LIBS']))
+ if env['RUNTIME_LINK'] == 'static' and env['PLATFORM'] == 'Linux':
+ test_env.AppendUnique(LIBS='dl')
+ test_env.AppendUnique(CXXFLAGS='-g')
+ test_env['CXXFLAGS'] = copy(test_env['LIBMAPNIK_CXXFLAGS'])
+ test_env.Append(CPPDEFINES = env['LIBMAPNIK_DEFINES'])
+ if test_env['HAS_CAIRO']:
+ test_env.PrependUnique(CPPPATH=test_env['CAIRO_CPPPATHS'])
+ test_env.Append(CPPDEFINES = '-DHAVE_CAIRO')
+ test_env.PrependUnique(CPPPATH=['./'])
+ if test_env['PLATFORM'] == 'Linux':
+ test_env['LINKFLAGS'].append('-pthread')
+ test_env.AppendUnique(LIBS='boost_program_options%s' % env['BOOST_APPEND'])
+ test_env_local = test_env.Clone()
+
+
+ # unit tests
+ sources = glob.glob('./unit/*/*.cpp')
+ sources.extend(glob.glob('./unit/*.cpp'))
+ test_program = test_env_local.Program("./unit/run", source=sources)
+ Depends(test_program, env.subst('../src/%s' % env['MAPNIK_LIB_NAME']))
+ Depends(test_program, env.subst('../src/json/libmapnik-json${LIBSUFFIX}'))
+ Depends(test_program, env.subst('../src/wkt/libmapnik-wkt${LIBSUFFIX}'))
+
+ # standalone tests
+ for standalone in glob.glob('./standalone/*cpp'):
+ test_program = test_env_local.Program(standalone.replace('.cpp','-bin'), source=standalone)
+ Depends(test_program, env.subst('../src/%s' % env['MAPNIK_LIB_NAME']))
+
+ # visual tests
+ source = Split(
+ """
+ visual/report.cpp
+ visual/runner.cpp
+ visual/run.cpp
+ """
+ )
+ test_program = test_env_local.Program('visual/run', source=source)
+ Depends(test_program, env.subst('../src/%s' % env['MAPNIK_LIB_NAME']))
+
+ # build locally if installing
+ if 'install' in COMMAND_LINE_TARGETS:
+ env.Alias('install',test_program)
diff --git a/test/catch.hpp b/test/catch.hpp
new file mode 100644
index 0000000..5b616a2
--- /dev/null
+++ b/test/catch.hpp
@@ -0,0 +1,9427 @@
+/*
+ * CATCH v1.1 build 1 (master branch)
+ * Generated: 2015-03-27 18:00:16.346230
+ * ----------------------------------------------------------
+ * This file has been merged from multiple headers. Please don't edit it directly
+ * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved.
+ *
+ * Distributed under the Boost Software License, Version 1.0. (See accompanying
+ * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
+#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
+
+#define TWOBLUECUBES_CATCH_HPP_INCLUDED
+
+// #included from: internal/catch_suppress_warnings.h
+
+#define TWOBLUECUBES_CATCH_SUPPRESS_WARNINGS_H_INCLUDED
+
+#ifdef __clang__
+# ifdef __ICC // icpc defines the __clang__ macro
+# pragma warning(push)
+# pragma warning(disable: 161 1682)
+# else // __ICC
+# pragma clang diagnostic ignored "-Wglobal-constructors"
+# pragma clang diagnostic ignored "-Wvariadic-macros"
+# pragma clang diagnostic ignored "-Wc99-extensions"
+# pragma clang diagnostic ignored "-Wunused-variable"
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wpadded"
+# pragma clang diagnostic ignored "-Wc++98-compat"
+# pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
+# endif
+#elif defined __GNUC__
+# pragma GCC diagnostic ignored "-Wvariadic-macros"
+# pragma GCC diagnostic ignored "-Wunused-variable"
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wpadded"
+#endif
+
+#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER)
+# define CATCH_IMPL
+#endif
+
+#ifdef CATCH_IMPL
+# ifndef CLARA_CONFIG_MAIN
+# define CLARA_CONFIG_MAIN_NOT_DEFINED
+# define CLARA_CONFIG_MAIN
+# endif
+#endif
+
+// #included from: internal/catch_notimplemented_exception.h
+#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED
+
+// #included from: catch_common.h
+#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED
+
+#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line
+#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line )
+#define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ )
+
+#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr
+#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr )
+
+#include <sstream>
+#include <stdexcept>
+#include <algorithm>
+
+// #included from: catch_compiler_capabilities.h
+#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED
+
+// Much of the following code is based on Boost (1.53)
+
+#ifdef __clang__
+
+# if __has_feature(cxx_nullptr)
+# define CATCH_CONFIG_CPP11_NULLPTR
+# endif
+
+# if __has_feature(cxx_noexcept)
+# define CATCH_CONFIG_CPP11_NOEXCEPT
+# endif
+
+#endif // __clang__
+
+////////////////////////////////////////////////////////////////////////////////
+// Borland
+#ifdef __BORLANDC__
+
+#if (__BORLANDC__ > 0x582 )
+//#define CATCH_CONFIG_SFINAE // Not confirmed
+#endif
+
+#endif // __BORLANDC__
+
+////////////////////////////////////////////////////////////////////////////////
+// EDG
+#ifdef __EDG_VERSION__
+
+#if (__EDG_VERSION__ > 238 )
+//#define CATCH_CONFIG_SFINAE // Not confirmed
+#endif
+
+#endif // __EDG_VERSION__
+
+////////////////////////////////////////////////////////////////////////////////
+// Digital Mars
+#ifdef __DMC__
+
+#if (__DMC__ > 0x840 )
+//#define CATCH_CONFIG_SFINAE // Not confirmed
+#endif
+
+#endif // __DMC__
+
+////////////////////////////////////////////////////////////////////////////////
+// GCC
+#ifdef __GNUC__
+
+#if __GNUC__ < 3
+
+#if (__GNUC_MINOR__ >= 96 )
+//#define CATCH_CONFIG_SFINAE
+#endif
+
+#elif __GNUC__ >= 3
+
+// #define CATCH_CONFIG_SFINAE // Taking this out completely for now
+
+#endif // __GNUC__ < 3
+
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) )
+
+#define CATCH_CONFIG_CPP11_NULLPTR
+#endif
+
+#endif // __GNUC__
+
+////////////////////////////////////////////////////////////////////////////////
+// Visual C++
+#ifdef _MSC_VER
+
+#if (_MSC_VER >= 1600)
+#define CATCH_CONFIG_CPP11_NULLPTR
+#endif
+
+#if (_MSC_VER >= 1310 ) // (VC++ 7.0+)
+//#define CATCH_CONFIG_SFINAE // Not confirmed
+#endif
+
+#endif // _MSC_VER
+
+// Use variadic macros if the compiler supports them
+#if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \
+ ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \
+ ( defined __GNUC__ && __GNUC__ >= 3 ) || \
+ ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L )
+
+#ifndef CATCH_CONFIG_NO_VARIADIC_MACROS
+#define CATCH_CONFIG_VARIADIC_MACROS
+#endif
+
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+// C++ language feature support
+
+// detect language version:
+#if (__cplusplus == 201103L)
+# define CATCH_CPP11
+# define CATCH_CPP11_OR_GREATER
+#elif (__cplusplus >= 201103L)
+# define CATCH_CPP11_OR_GREATER
+#endif
+
+// noexcept support:
+#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT)
+# define CATCH_NOEXCEPT noexcept
+# define CATCH_NOEXCEPT_IS(x) noexcept(x)
+#else
+# define CATCH_NOEXCEPT throw()
+# define CATCH_NOEXCEPT_IS(x)
+#endif
+
+namespace Catch {
+
+ class NonCopyable {
+#ifdef CATCH_CPP11_OR_GREATER
+ NonCopyable( NonCopyable const& ) = delete;
+ NonCopyable( NonCopyable && ) = delete;
+ NonCopyable& operator = ( NonCopyable const& ) = delete;
+ NonCopyable& operator = ( NonCopyable && ) = delete;
+#else
+ NonCopyable( NonCopyable const& info );
+ NonCopyable& operator = ( NonCopyable const& );
+#endif
+
+ protected:
+ NonCopyable() {}
+ virtual ~NonCopyable();
+ };
+
+ class SafeBool {
+ public:
+ typedef void (SafeBool::*type)() const;
+
+ static type makeSafe( bool value ) {
+ return value ? &SafeBool::trueValue : 0;
+ }
+ private:
+ void trueValue() const {}
+ };
+
+ template<typename ContainerT>
+ inline void deleteAll( ContainerT& container ) {
+ typename ContainerT::const_iterator it = container.begin();
+ typename ContainerT::const_iterator itEnd = container.end();
+ for(; it != itEnd; ++it )
+ delete *it;
+ }
+ template<typename AssociativeContainerT>
+ inline void deleteAllValues( AssociativeContainerT& container ) {
+ typename AssociativeContainerT::const_iterator it = container.begin();
+ typename AssociativeContainerT::const_iterator itEnd = container.end();
+ for(; it != itEnd; ++it )
+ delete it->second;
+ }
+
+ bool startsWith( std::string const& s, std::string const& prefix );
+ bool endsWith( std::string const& s, std::string const& suffix );
+ bool contains( std::string const& s, std::string const& infix );
+ void toLowerInPlace( std::string& s );
+ std::string toLower( std::string const& s );
+ std::string trim( std::string const& str );
+ bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis );
+
+ struct pluralise {
+ pluralise( std::size_t count, std::string const& label );
+
+ friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser );
+
+ std::size_t m_count;
+ std::string m_label;
+ };
+
+ struct SourceLineInfo {
+
+ SourceLineInfo();
+ SourceLineInfo( char const* _file, std::size_t _line );
+ SourceLineInfo( SourceLineInfo const& other );
+# ifdef CATCH_CPP11_OR_GREATER
+ SourceLineInfo( SourceLineInfo && ) = default;
+ SourceLineInfo& operator = ( SourceLineInfo const& ) = default;
+ SourceLineInfo& operator = ( SourceLineInfo && ) = default;
+# endif
+ bool empty() const;
+ bool operator == ( SourceLineInfo const& other ) const;
+ bool operator < ( SourceLineInfo const& other ) const;
+
+ std::string file;
+ std::size_t line;
+ };
+
+ std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info );
+
+ // This is just here to avoid compiler warnings with macro constants and boolean literals
+ inline bool isTrue( bool value ){ return value; }
+ inline bool alwaysTrue() { return true; }
+ inline bool alwaysFalse() { return false; }
+
+ void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo );
+
+ // Use this in variadic streaming macros to allow
+ // >> +StreamEndStop
+ // as well as
+ // >> stuff +StreamEndStop
+ struct StreamEndStop {
+ std::string operator+() {
+ return std::string();
+ }
+ };
+ template<typename T>
+ T const& operator + ( T const& value, StreamEndStop ) {
+ return value;
+ }
+}
+
+#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) )
+#define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO );
+
+#include <ostream>
+
+namespace Catch {
+
+ class NotImplementedException : public std::exception
+ {
+ public:
+ NotImplementedException( SourceLineInfo const& lineInfo );
+ NotImplementedException( NotImplementedException const& ) {}
+
+ virtual ~NotImplementedException() CATCH_NOEXCEPT {}
+
+ virtual const char* what() const CATCH_NOEXCEPT;
+
+ private:
+ std::string m_what;
+ SourceLineInfo m_lineInfo;
+ };
+
+} // end namespace Catch
+
+///////////////////////////////////////////////////////////////////////////////
+#define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO )
+
+// #included from: internal/catch_context.h
+#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED
+
+// #included from: catch_interfaces_generators.h
+#define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED
+
+#include <string>
+
+namespace Catch {
+
+ struct IGeneratorInfo {
+ virtual ~IGeneratorInfo();
+ virtual bool moveNext() = 0;
+ virtual std::size_t getCurrentIndex() const = 0;
+ };
+
+ struct IGeneratorsForTest {
+ virtual ~IGeneratorsForTest();
+
+ virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0;
+ virtual bool moveNext() = 0;
+ };
+
+ IGeneratorsForTest* createGeneratorsForTest();
+
+} // end namespace Catch
+
+// #included from: catch_ptr.hpp
+#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpadded"
+#endif
+
+namespace Catch {
+
+ // An intrusive reference counting smart pointer.
+ // T must implement addRef() and release() methods
+ // typically implementing the IShared interface
+ template<typename T>
+ class Ptr {
+ public:
+ Ptr() : m_p( NULL ){}
+ Ptr( T* p ) : m_p( p ){
+ if( m_p )
+ m_p->addRef();
+ }
+ Ptr( Ptr const& other ) : m_p( other.m_p ){
+ if( m_p )
+ m_p->addRef();
+ }
+ ~Ptr(){
+ if( m_p )
+ m_p->release();
+ }
+ void reset() {
+ if( m_p )
+ m_p->release();
+ m_p = NULL;
+ }
+ Ptr& operator = ( T* p ){
+ Ptr temp( p );
+ swap( temp );
+ return *this;
+ }
+ Ptr& operator = ( Ptr const& other ){
+ Ptr temp( other );
+ swap( temp );
+ return *this;
+ }
+ void swap( Ptr& other ) { std::swap( m_p, other.m_p ); }
+ T* get() { return m_p; }
+ const T* get() const{ return m_p; }
+ T& operator*() const { return *m_p; }
+ T* operator->() const { return m_p; }
+ bool operator !() const { return m_p == NULL; }
+ operator SafeBool::type() const { return SafeBool::makeSafe( m_p != NULL ); }
+
+ private:
+ T* m_p;
+ };
+
+ struct IShared : NonCopyable {
+ virtual ~IShared();
+ virtual void addRef() const = 0;
+ virtual void release() const = 0;
+ };
+
+ template<typename T = IShared>
+ struct SharedImpl : T {
+
+ SharedImpl() : m_rc( 0 ){}
+
+ virtual void addRef() const {
+ ++m_rc;
+ }
+ virtual void release() const {
+ if( --m_rc == 0 )
+ delete this;
+ }
+
+ mutable unsigned int m_rc;
+ };
+
+} // end namespace Catch
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+#include <memory>
+#include <vector>
+#include <stdlib.h>
+
+namespace Catch {
+
+ class TestCase;
+ class Stream;
+ struct IResultCapture;
+ struct IRunner;
+ struct IGeneratorsForTest;
+ struct IConfig;
+
+ struct IContext
+ {
+ virtual ~IContext();
+
+ virtual IResultCapture* getResultCapture() = 0;
+ virtual IRunner* getRunner() = 0;
+ virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0;
+ virtual bool advanceGeneratorsForCurrentTest() = 0;
+ virtual Ptr<IConfig const> getConfig() const = 0;
+ };
+
+ struct IMutableContext : IContext
+ {
+ virtual ~IMutableContext();
+ virtual void setResultCapture( IResultCapture* resultCapture ) = 0;
+ virtual void setRunner( IRunner* runner ) = 0;
+ virtual void setConfig( Ptr<IConfig const> const& config ) = 0;
+ };
+
+ IContext& getCurrentContext();
+ IMutableContext& getCurrentMutableContext();
+ void cleanUpContext();
+ Stream createStream( std::string const& streamName );
+
+}
+
+// #included from: internal/catch_test_registry.hpp
+#define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED
+
+// #included from: catch_interfaces_testcase.h
+#define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED
+
+#include <vector>
+
+namespace Catch {
+
+ class TestSpec;
+
+ struct ITestCase : IShared {
+ virtual void invoke () const = 0;
+ protected:
+ virtual ~ITestCase();
+ };
+
+ class TestCase;
+ struct IConfig;
+
+ struct ITestCaseRegistry {
+ virtual ~ITestCaseRegistry();
+ virtual std::vector<TestCase> const& getAllTests() const = 0;
+ virtual void getFilteredTests( TestSpec const& testSpec, IConfig const& config, std::vector<TestCase>& matchingTestCases, bool negated = false ) const = 0;
+
+ };
+}
+
+namespace Catch {
+
+template<typename C>
+class MethodTestCase : public SharedImpl<ITestCase> {
+
+public:
+ MethodTestCase( void (C::*method)() ) : m_method( method ) {}
+
+ virtual void invoke() const {
+ C obj;
+ (obj.*m_method)();
+ }
+
+private:
+ virtual ~MethodTestCase() {}
+
+ void (C::*m_method)();
+};
+
+typedef void(*TestFunction)();
+
+struct NameAndDesc {
+ NameAndDesc( const char* _name = "", const char* _description= "" )
+ : name( _name ), description( _description )
+ {}
+
+ const char* name;
+ const char* description;
+};
+
+struct AutoReg {
+
+ AutoReg( TestFunction function,
+ SourceLineInfo const& lineInfo,
+ NameAndDesc const& nameAndDesc );
+
+ template<typename C>
+ AutoReg( void (C::*method)(),
+ char const* className,
+ NameAndDesc const& nameAndDesc,
+ SourceLineInfo const& lineInfo ) {
+ registerTestCase( new MethodTestCase<C>( method ),
+ className,
+ nameAndDesc,
+ lineInfo );
+ }
+
+ void registerTestCase( ITestCase* testCase,
+ char const* className,
+ NameAndDesc const& nameAndDesc,
+ SourceLineInfo const& lineInfo );
+
+ ~AutoReg();
+
+private:
+ AutoReg( AutoReg const& );
+ void operator= ( AutoReg const& );
+};
+
+} // end namespace Catch
+
+#ifdef CATCH_CONFIG_VARIADIC_MACROS
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_TESTCASE( ... ) \
+ static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \
+ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\
+ static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )()
+
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \
+ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); }
+
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... )\
+ namespace{ \
+ struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \
+ void test(); \
+ }; \
+ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \
+ } \
+ void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test()
+
+#else
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \
+ static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \
+ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\
+ static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )()
+
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \
+ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); }
+
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\
+ namespace{ \
+ struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \
+ void test(); \
+ }; \
+ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \
+ } \
+ void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test()
+
+#endif
+
+// #included from: internal/catch_capture.hpp
+#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED
+
+// #included from: catch_result_builder.h
+#define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED
+
+// #included from: catch_result_type.h
+#define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED
+
+namespace Catch {
+
+ // ResultWas::OfType enum
+ struct ResultWas { enum OfType {
+ Unknown = -1,
+ Ok = 0,
+ Info = 1,
+ Warning = 2,
+
+ FailureBit = 0x10,
+
+ ExpressionFailed = FailureBit | 1,
+ ExplicitFailure = FailureBit | 2,
+
+ Exception = 0x100 | FailureBit,
+
+ ThrewException = Exception | 1,
+ DidntThrowException = Exception | 2,
+
+ FatalErrorCondition = 0x200 | FailureBit
+
+ }; };
+
+ inline bool isOk( ResultWas::OfType resultType ) {
+ return ( resultType & ResultWas::FailureBit ) == 0;
+ }
+ inline bool isJustInfo( int flags ) {
+ return flags == ResultWas::Info;
+ }
+
+ // ResultDisposition::Flags enum
+ struct ResultDisposition { enum Flags {
+ Normal = 0x00,
+
+ ContinueOnFailure = 0x01, // Failures fail test, but execution continues
+ FalseTest = 0x02, // Prefix expression with !
+ SuppressFail = 0x04 // Failures are reported but do not fail the test
+ }; };
+
+ inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) {
+ return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) );
+ }
+
+ inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; }
+ inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; }
+ inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; }
+
+} // end namespace Catch
+
+// #included from: catch_assertionresult.h
+#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED
+
+#include <string>
+
+namespace Catch {
+
+ struct AssertionInfo
+ {
+ AssertionInfo() {}
+ AssertionInfo( std::string const& _macroName,
+ SourceLineInfo const& _lineInfo,
+ std::string const& _capturedExpression,
+ ResultDisposition::Flags _resultDisposition );
+
+ std::string macroName;
+ SourceLineInfo lineInfo;
+ std::string capturedExpression;
+ ResultDisposition::Flags resultDisposition;
+ };
+
+ struct AssertionResultData
+ {
+ AssertionResultData() : resultType( ResultWas::Unknown ) {}
+
+ std::string reconstructedExpression;
+ std::string message;
+ ResultWas::OfType resultType;
+ };
+
+ class AssertionResult {
+ public:
+ AssertionResult();
+ AssertionResult( AssertionInfo const& info, AssertionResultData const& data );
+ ~AssertionResult();
+# ifdef CATCH_CPP11_OR_GREATER
+ AssertionResult( AssertionResult const& ) = default;
+ AssertionResult( AssertionResult && ) = default;
+ AssertionResult& operator = ( AssertionResult const& ) = default;
+ AssertionResult& operator = ( AssertionResult && ) = default;
+# endif
+
+ bool isOk() const;
+ bool succeeded() const;
+ ResultWas::OfType getResultType() const;
+ bool hasExpression() const;
+ bool hasMessage() const;
+ std::string getExpression() const;
+ std::string getExpressionInMacro() const;
+ bool hasExpandedExpression() const;
+ std::string getExpandedExpression() const;
+ std::string getMessage() const;
+ SourceLineInfo getSourceInfo() const;
+ std::string getTestMacroName() const;
+
+ protected:
+ AssertionInfo m_info;
+ AssertionResultData m_resultData;
+ };
+
+} // end namespace Catch
+
+namespace Catch {
+
+ struct TestFailureException{};
+
+ template<typename T> class ExpressionLhs;
+
+ struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison;
+
+ struct CopyableStream {
+ CopyableStream() {}
+ CopyableStream( CopyableStream const& other ) {
+ oss << other.oss.str();
+ }
+ CopyableStream& operator=( CopyableStream const& other ) {
+ oss.str("");
+ oss << other.oss.str();
+ return *this;
+ }
+ std::ostringstream oss;
+ };
+
+ class ResultBuilder {
+ public:
+ ResultBuilder( char const* macroName,
+ SourceLineInfo const& lineInfo,
+ char const* capturedExpression,
+ ResultDisposition::Flags resultDisposition );
+
+ template<typename T>
+ ExpressionLhs<T const&> operator->* ( T const& operand );
+ ExpressionLhs<bool> operator->* ( bool value );
+
+ template<typename T>
+ ResultBuilder& operator << ( T const& value ) {
+ m_stream.oss << value;
+ return *this;
+ }
+
+ template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& );
+ template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& );
+
+ ResultBuilder& setResultType( ResultWas::OfType result );
+ ResultBuilder& setResultType( bool result );
+ ResultBuilder& setLhs( std::string const& lhs );
+ ResultBuilder& setRhs( std::string const& rhs );
+ ResultBuilder& setOp( std::string const& op );
+
+ void endExpression();
+
+ std::string reconstructExpression() const;
+ AssertionResult build() const;
+
+ void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal );
+ void captureResult( ResultWas::OfType resultType );
+ void captureExpression();
+ void react();
+ bool shouldDebugBreak() const;
+ bool allowThrows() const;
+
+ private:
+ AssertionInfo m_assertionInfo;
+ AssertionResultData m_data;
+ struct ExprComponents {
+ ExprComponents() : testFalse( false ) {}
+ bool testFalse;
+ std::string lhs, rhs, op;
+ } m_exprComponents;
+ CopyableStream m_stream;
+
+ bool m_shouldDebugBreak;
+ bool m_shouldThrow;
+ };
+
+} // namespace Catch
+
+// Include after due to circular dependency:
+// #included from: catch_expression_lhs.hpp
+#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED
+
+// #included from: catch_evaluate.hpp
+#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4389) // '==' : signed/unsigned mismatch
+#endif
+
+#include <cstddef>
+
+namespace Catch {
+namespace Internal {
+
+ enum Operator {
+ IsEqualTo,
+ IsNotEqualTo,
+ IsLessThan,
+ IsGreaterThan,
+ IsLessThanOrEqualTo,
+ IsGreaterThanOrEqualTo
+ };
+
+ template<Operator Op> struct OperatorTraits { static const char* getName(){ return "*error*"; } };
+ template<> struct OperatorTraits<IsEqualTo> { static const char* getName(){ return "=="; } };
+ template<> struct OperatorTraits<IsNotEqualTo> { static const char* getName(){ return "!="; } };
+ template<> struct OperatorTraits<IsLessThan> { static const char* getName(){ return "<"; } };
+ template<> struct OperatorTraits<IsGreaterThan> { static const char* getName(){ return ">"; } };
+ template<> struct OperatorTraits<IsLessThanOrEqualTo> { static const char* getName(){ return "<="; } };
+ template<> struct OperatorTraits<IsGreaterThanOrEqualTo>{ static const char* getName(){ return ">="; } };
+
+ template<typename T>
+ inline T& opCast(T const& t) { return const_cast<T&>(t); }
+
+// nullptr_t support based on pull request #154 from Konstantin Baumann
+#ifdef CATCH_CONFIG_CPP11_NULLPTR
+ inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; }
+#endif // CATCH_CONFIG_CPP11_NULLPTR
+
+ // So the compare overloads can be operator agnostic we convey the operator as a template
+ // enum, which is used to specialise an Evaluator for doing the comparison.
+ template<typename T1, typename T2, Operator Op>
+ class Evaluator{};
+
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsEqualTo> {
+ static bool evaluate( T1 const& lhs, T2 const& rhs) {
+ return opCast( lhs ) == opCast( rhs );
+ }
+ };
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsNotEqualTo> {
+ static bool evaluate( T1 const& lhs, T2 const& rhs ) {
+ return opCast( lhs ) != opCast( rhs );
+ }
+ };
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsLessThan> {
+ static bool evaluate( T1 const& lhs, T2 const& rhs ) {
+ return opCast( lhs ) < opCast( rhs );
+ }
+ };
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsGreaterThan> {
+ static bool evaluate( T1 const& lhs, T2 const& rhs ) {
+ return opCast( lhs ) > opCast( rhs );
+ }
+ };
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsGreaterThanOrEqualTo> {
+ static bool evaluate( T1 const& lhs, T2 const& rhs ) {
+ return opCast( lhs ) >= opCast( rhs );
+ }
+ };
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsLessThanOrEqualTo> {
+ static bool evaluate( T1 const& lhs, T2 const& rhs ) {
+ return opCast( lhs ) <= opCast( rhs );
+ }
+ };
+
+ template<Operator Op, typename T1, typename T2>
+ bool applyEvaluator( T1 const& lhs, T2 const& rhs ) {
+ return Evaluator<T1, T2, Op>::evaluate( lhs, rhs );
+ }
+
+ // This level of indirection allows us to specialise for integer types
+ // to avoid signed/ unsigned warnings
+
+ // "base" overload
+ template<Operator Op, typename T1, typename T2>
+ bool compare( T1 const& lhs, T2 const& rhs ) {
+ return Evaluator<T1, T2, Op>::evaluate( lhs, rhs );
+ }
+
+ // unsigned X to int
+ template<Operator Op> bool compare( unsigned int lhs, int rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) );
+ }
+ template<Operator Op> bool compare( unsigned long lhs, int rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) );
+ }
+ template<Operator Op> bool compare( unsigned char lhs, int rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) );
+ }
+
+ // unsigned X to long
+ template<Operator Op> bool compare( unsigned int lhs, long rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) );
+ }
+ template<Operator Op> bool compare( unsigned long lhs, long rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) );
+ }
+ template<Operator Op> bool compare( unsigned char lhs, long rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) );
+ }
+
+ // int to unsigned X
+ template<Operator Op> bool compare( int lhs, unsigned int rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( int lhs, unsigned long rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( int lhs, unsigned char rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs );
+ }
+
+ // long to unsigned X
+ template<Operator Op> bool compare( long lhs, unsigned int rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( long lhs, unsigned long rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( long lhs, unsigned char rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
+ }
+
+ // pointer to long (when comparing against NULL)
+ template<Operator Op, typename T> bool compare( long lhs, T* rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs );
+ }
+ template<Operator Op, typename T> bool compare( T* lhs, long rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) );
+ }
+
+ // pointer to int (when comparing against NULL)
+ template<Operator Op, typename T> bool compare( int lhs, T* rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs );
+ }
+ template<Operator Op, typename T> bool compare( T* lhs, int rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) );
+ }
+
+#ifdef CATCH_CONFIG_CPP11_NULLPTR
+ // pointer to nullptr_t (when comparing against nullptr)
+ template<Operator Op, typename T> bool compare( std::nullptr_t, T* rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( NULL, rhs );
+ }
+ template<Operator Op, typename T> bool compare( T* lhs, std::nullptr_t ) {
+ return Evaluator<T*, T*, Op>::evaluate( lhs, NULL );
+ }
+#endif // CATCH_CONFIG_CPP11_NULLPTR
+
+} // end of namespace Internal
+} // end of namespace Catch
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+// #included from: catch_tostring.h
+#define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED
+
+// #included from: catch_sfinae.hpp
+#define TWOBLUECUBES_CATCH_SFINAE_HPP_INCLUDED
+
+// Try to detect if the current compiler supports SFINAE
+
+namespace Catch {
+
+ struct TrueType {
+ static const bool value = true;
+ typedef void Enable;
+ char sizer[1];
+ };
+ struct FalseType {
+ static const bool value = false;
+ typedef void Disable;
+ char sizer[2];
+ };
+
+#ifdef CATCH_CONFIG_SFINAE
+
+ template<bool> struct NotABooleanExpression;
+
+ template<bool c> struct If : NotABooleanExpression<c> {};
+ template<> struct If<true> : TrueType {};
+ template<> struct If<false> : FalseType {};
+
+ template<int size> struct SizedIf;
+ template<> struct SizedIf<sizeof(TrueType)> : TrueType {};
+ template<> struct SizedIf<sizeof(FalseType)> : FalseType {};
+
+#endif // CATCH_CONFIG_SFINAE
+
+} // end namespace Catch
+
+#include <sstream>
+#include <iomanip>
+#include <limits>
+#include <vector>
+#include <cstddef>
+
+#ifdef __OBJC__
+// #included from: catch_objc_arc.hpp
+#define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED
+
+#import <Foundation/Foundation.h>
+
+#ifdef __has_feature
+#define CATCH_ARC_ENABLED __has_feature(objc_arc)
+#else
+#define CATCH_ARC_ENABLED 0
+#endif
+
+void arcSafeRelease( NSObject* obj );
+id performOptionalSelector( id obj, SEL sel );
+
+#if !CATCH_ARC_ENABLED
+inline void arcSafeRelease( NSObject* obj ) {
+ [obj release];
+}
+inline id performOptionalSelector( id obj, SEL sel ) {
+ if( [obj respondsToSelector: sel] )
+ return [obj performSelector: sel];
+ return nil;
+}
+#define CATCH_UNSAFE_UNRETAINED
+#define CATCH_ARC_STRONG
+#else
+inline void arcSafeRelease( NSObject* ){}
+inline id performOptionalSelector( id obj, SEL sel ) {
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
+#endif
+ if( [obj respondsToSelector: sel] )
+ return [obj performSelector: sel];
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+ return nil;
+}
+#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained
+#define CATCH_ARC_STRONG __strong
+#endif
+
+#endif
+
+#ifdef CATCH_CPP11_OR_GREATER
+#include <tuple>
+#include <type_traits>
+#endif
+
+namespace Catch {
+
+// Why we're here.
+template<typename T>
+std::string toString( T const& value );
+
+// Built in overloads
+
+std::string toString( std::string const& value );
+std::string toString( std::wstring const& value );
+std::string toString( const char* const value );
+std::string toString( char* const value );
+std::string toString( const wchar_t* const value );
+std::string toString( wchar_t* const value );
+std::string toString( int value );
+std::string toString( unsigned long value );
+std::string toString( unsigned int value );
+std::string toString( const double value );
+std::string toString( const float value );
+std::string toString( bool value );
+std::string toString( char value );
+std::string toString( signed char value );
+std::string toString( unsigned char value );
+
+#ifdef CATCH_CONFIG_CPP11_NULLPTR
+std::string toString( std::nullptr_t );
+#endif
+
+#ifdef __OBJC__
+ std::string toString( NSString const * const& nsstring );
+ std::string toString( NSString * CATCH_ARC_STRONG const& nsstring );
+ std::string toString( NSObject* const& nsObject );
+#endif
+
+namespace Detail {
+
+ extern std::string unprintableString;
+
+// SFINAE is currently disabled by default for all compilers.
+// If the non SFINAE version of IsStreamInsertable is ambiguous for you
+// and your compiler supports SFINAE, try #defining CATCH_CONFIG_SFINAE
+#ifdef CATCH_CONFIG_SFINAE
+
+ template<typename T>
+ class IsStreamInsertableHelper {
+ template<int N> struct TrueIfSizeable : TrueType {};
+
+ template<typename T2>
+ static TrueIfSizeable<sizeof((*(std::ostream*)0) << *((T2 const*)0))> dummy(T2*);
+ static FalseType dummy(...);
+
+ public:
+ typedef SizedIf<sizeof(dummy((T*)0))> type;
+ };
+
+ template<typename T>
+ struct IsStreamInsertable : IsStreamInsertableHelper<T>::type {};
+
+#else
+
+ struct BorgType {
+ template<typename T> BorgType( T const& );
+ };
+
+ TrueType& testStreamable( std::ostream& );
+ FalseType testStreamable( FalseType );
+
+ FalseType operator<<( std::ostream const&, BorgType const& );
+
+ template<typename T>
+ struct IsStreamInsertable {
+ static std::ostream &s;
+ static T const&t;
+ enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) };
+ };
+
+#endif
+
+#if defined(CATCH_CPP11_OR_GREATER)
+ template<typename T,
+ bool IsEnum = std::is_enum<T>::value
+ >
+ struct EnumStringMaker
+ {
+ static std::string convert( T const& ) { return unprintableString; }
+ };
+
+ template<typename T>
+ struct EnumStringMaker<T,true>
+ {
+ static std::string convert( T const& v )
+ {
+ return ::Catch::toString(
+ static_cast<typename std::underlying_type<T>::type>(v)
+ );
+ }
+ };
+#endif
+ template<bool C>
+ struct StringMakerBase {
+#if defined(CATCH_CPP11_OR_GREATER)
+ template<typename T>
+ static std::string convert( T const& v )
+ {
+ return EnumStringMaker<T>::convert( v );
+ }
+#else
+ template<typename T>
+ static std::string convert( T const& ) { return unprintableString; }
+#endif
+ };
+
+ template<>
+ struct StringMakerBase<true> {
+ template<typename T>
+ static std::string convert( T const& _value ) {
+ std::ostringstream oss;
+ oss << _value;
+ return oss.str();
+ }
+ };
+
+ std::string rawMemoryToString( const void *object, std::size_t size );
+
+ template<typename T>
+ inline std::string rawMemoryToString( const T& object ) {
+ return rawMemoryToString( &object, sizeof(object) );
+ }
+
+} // end namespace Detail
+
+template<typename T>
+struct StringMaker :
+ Detail::StringMakerBase<Detail::IsStreamInsertable<T>::value> {};
+
+template<typename T>
+struct StringMaker<T*> {
+ template<typename U>
+ static std::string convert( U* p ) {
+ if( !p )
+ return INTERNAL_CATCH_STRINGIFY( NULL );
+ else
+ return Detail::rawMemoryToString( p );
+ }
+};
+
+template<typename R, typename C>
+struct StringMaker<R C::*> {
+ static std::string convert( R C::* p ) {
+ if( !p )
+ return INTERNAL_CATCH_STRINGIFY( NULL );
+ else
+ return Detail::rawMemoryToString( p );
+ }
+};
+
+namespace Detail {
+ template<typename InputIterator>
+ std::string rangeToString( InputIterator first, InputIterator last );
+}
+
+//template<typename T, typename Allocator>
+//struct StringMaker<std::vector<T, Allocator> > {
+// static std::string convert( std::vector<T,Allocator> const& v ) {
+// return Detail::rangeToString( v.begin(), v.end() );
+// }
+//};
+
+template<typename T, typename Allocator>
+std::string toString( std::vector<T,Allocator> const& v ) {
+ return Detail::rangeToString( v.begin(), v.end() );
+}
+
+#ifdef CATCH_CPP11_OR_GREATER
+
+// toString for tuples
+namespace TupleDetail {
+ template<
+ typename Tuple,
+ std::size_t N = 0,
+ bool = (N < std::tuple_size<Tuple>::value)
+ >
+ struct ElementPrinter {
+ static void print( const Tuple& tuple, std::ostream& os )
+ {
+ os << ( N ? ", " : " " )
+ << Catch::toString(std::get<N>(tuple));
+ ElementPrinter<Tuple,N+1>::print(tuple,os);
+ }
+ };
+
+ template<
+ typename Tuple,
+ std::size_t N
+ >
+ struct ElementPrinter<Tuple,N,false> {
+ static void print( const Tuple&, std::ostream& ) {}
+ };
+
+}
+
+template<typename ...Types>
+struct StringMaker<std::tuple<Types...>> {
+
+ static std::string convert( const std::tuple<Types...>& tuple )
+ {
+ std::ostringstream os;
+ os << '{';
+ TupleDetail::ElementPrinter<std::tuple<Types...>>::print( tuple, os );
+ os << " }";
+ return os.str();
+ }
+};
+#endif
+
+namespace Detail {
+ template<typename T>
+ std::string makeString( T const& value ) {
+ return StringMaker<T>::convert( value );
+ }
+} // end namespace Detail
+
+/// \brief converts any type to a string
+///
+/// The default template forwards on to ostringstream - except when an
+/// ostringstream overload does not exist - in which case it attempts to detect
+/// that and writes {?}.
+/// Overload (not specialise) this template for custom typs that you don't want
+/// to provide an ostream overload for.
+template<typename T>
+std::string toString( T const& value ) {
+ return StringMaker<T>::convert( value );
+}
+
+ namespace Detail {
+ template<typename InputIterator>
+ std::string rangeToString( InputIterator first, InputIterator last ) {
+ std::ostringstream oss;
+ oss << "{ ";
+ if( first != last ) {
+ oss << Catch::toString( *first );
+ for( ++first ; first != last ; ++first )
+ oss << ", " << Catch::toString( *first );
+ }
+ oss << " }";
+ return oss.str();
+ }
+}
+
+} // end namespace Catch
+
+namespace Catch {
+
+// Wraps the LHS of an expression and captures the operator and RHS (if any) -
+// wrapping them all in a ResultBuilder object
+template<typename T>
+class ExpressionLhs {
+ ExpressionLhs& operator = ( ExpressionLhs const& );
+# ifdef CATCH_CPP11_OR_GREATER
+ ExpressionLhs& operator = ( ExpressionLhs && ) = delete;
+# endif
+
+public:
+ ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ) {}
+# ifdef CATCH_CPP11_OR_GREATER
+ ExpressionLhs( ExpressionLhs const& ) = default;
+ ExpressionLhs( ExpressionLhs && ) = default;
+# endif
+
+ template<typename RhsT>
+ ResultBuilder& operator == ( RhsT const& rhs ) {
+ return captureExpression<Internal::IsEqualTo>( rhs );
+ }
+
+ template<typename RhsT>
+ ResultBuilder& operator != ( RhsT const& rhs ) {
+ return captureExpression<Internal::IsNotEqualTo>( rhs );
+ }
+
+ template<typename RhsT>
+ ResultBuilder& operator < ( RhsT const& rhs ) {
+ return captureExpression<Internal::IsLessThan>( rhs );
+ }
+
+ template<typename RhsT>
+ ResultBuilder& operator > ( RhsT const& rhs ) {
+ return captureExpression<Internal::IsGreaterThan>( rhs );
+ }
+
+ template<typename RhsT>
+ ResultBuilder& operator <= ( RhsT const& rhs ) {
+ return captureExpression<Internal::IsLessThanOrEqualTo>( rhs );
+ }
+
+ template<typename RhsT>
+ ResultBuilder& operator >= ( RhsT const& rhs ) {
+ return captureExpression<Internal::IsGreaterThanOrEqualTo>( rhs );
+ }
+
+ ResultBuilder& operator == ( bool rhs ) {
+ return captureExpression<Internal::IsEqualTo>( rhs );
+ }
+
+ ResultBuilder& operator != ( bool rhs ) {
+ return captureExpression<Internal::IsNotEqualTo>( rhs );
+ }
+
+ void endExpression() {
+ bool value = m_lhs ? true : false;
+ m_rb
+ .setLhs( Catch::toString( value ) )
+ .setResultType( value )
+ .endExpression();
+ }
+
+ // Only simple binary expressions are allowed on the LHS.
+ // If more complex compositions are required then place the sub expression in parentheses
+ template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( RhsT const& );
+ template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( RhsT const& );
+ template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( RhsT const& );
+ template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( RhsT const& );
+ template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& );
+ template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& );
+
+private:
+ template<Internal::Operator Op, typename RhsT>
+ ResultBuilder& captureExpression( RhsT const& rhs ) {
+ return m_rb
+ .setResultType( Internal::compare<Op>( m_lhs, rhs ) )
+ .setLhs( Catch::toString( m_lhs ) )
+ .setRhs( Catch::toString( rhs ) )
+ .setOp( Internal::OperatorTraits<Op>::getName() );
+ }
+
+private:
+ ResultBuilder& m_rb;
+ T m_lhs;
+};
+
+} // end namespace Catch
+
+
+namespace Catch {
+
+ template<typename T>
+ inline ExpressionLhs<T const&> ResultBuilder::operator->* ( T const& operand ) {
+ return ExpressionLhs<T const&>( *this, operand );
+ }
+
+ inline ExpressionLhs<bool> ResultBuilder::operator->* ( bool value ) {
+ return ExpressionLhs<bool>( *this, value );
+ }
+
+} // namespace Catch
+
+// #included from: catch_message.h
+#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED
+
+#include <string>
+
+namespace Catch {
+
+ struct MessageInfo {
+ MessageInfo( std::string const& _macroName,
+ SourceLineInfo const& _lineInfo,
+ ResultWas::OfType _type );
+
+ std::string macroName;
+ SourceLineInfo lineInfo;
+ ResultWas::OfType type;
+ std::string message;
+ unsigned int sequence;
+
+ bool operator == ( MessageInfo const& other ) const {
+ return sequence == other.sequence;
+ }
+ bool operator < ( MessageInfo const& other ) const {
+ return sequence < other.sequence;
+ }
+ private:
+ static unsigned int globalCount;
+ };
+
+ struct MessageBuilder {
+ MessageBuilder( std::string const& macroName,
+ SourceLineInfo const& lineInfo,
+ ResultWas::OfType type )
+ : m_info( macroName, lineInfo, type )
+ {}
+
+ template<typename T>
+ MessageBuilder& operator << ( T const& value ) {
+ m_stream << value;
+ return *this;
+ }
+
+ MessageInfo m_info;
+ std::ostringstream m_stream;
+ };
+
+ class ScopedMessage {
+ public:
+ ScopedMessage( MessageBuilder const& builder );
+ ScopedMessage( ScopedMessage const& other );
+ ~ScopedMessage();
+
+ MessageInfo m_info;
+ };
+
+} // end namespace Catch
+
+// #included from: catch_interfaces_capture.h
+#define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED
+
+#include <string>
+
+namespace Catch {
+
+ class TestCase;
+ class AssertionResult;
+ struct AssertionInfo;
+ struct SectionInfo;
+ struct MessageInfo;
+ class ScopedMessageBuilder;
+ struct Counts;
+
+ struct IResultCapture {
+
+ virtual ~IResultCapture();
+
+ virtual void assertionEnded( AssertionResult const& result ) = 0;
+ virtual bool sectionStarted( SectionInfo const& sectionInfo,
+ Counts& assertions ) = 0;
+ virtual void sectionEnded( SectionInfo const& name, Counts const& assertions, double _durationInSeconds ) = 0;
+ virtual void pushScopedMessage( MessageInfo const& message ) = 0;
+ virtual void popScopedMessage( MessageInfo const& message ) = 0;
+
+ virtual std::string getCurrentTestName() const = 0;
+ virtual const AssertionResult* getLastResult() const = 0;
+
+ virtual void handleFatalErrorCondition( std::string const& message ) = 0;
+ };
+
+ IResultCapture& getResultCapture();
+}
+
+// #included from: catch_debugger.h
+#define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED
+
+// #included from: catch_platform.h
+#define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED
+
+#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
+#define CATCH_PLATFORM_MAC
+#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
+#define CATCH_PLATFORM_IPHONE
+#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER)
+#define CATCH_PLATFORM_WINDOWS
+#endif
+
+#include <string>
+
+namespace Catch{
+
+ bool isDebuggerActive();
+ void writeToDebugConsole( std::string const& text );
+}
+
+#ifdef CATCH_PLATFORM_MAC
+
+ // The following code snippet based on:
+ // http://cocoawithlove.com/2008/03/break-into-debugger.html
+ #ifdef DEBUG
+ #if defined(__ppc64__) || defined(__ppc__)
+ #define CATCH_BREAK_INTO_DEBUGGER() \
+ if( Catch::isDebuggerActive() ) { \
+ __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \
+ : : : "memory","r0","r3","r4" ); \
+ }
+ #else
+ #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) {__asm__("int $3\n" : : );}
+ #endif
+ #endif
+
+#elif defined(_MSC_VER)
+ #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { __debugbreak(); }
+#elif defined(__MINGW32__)
+ extern "C" __declspec(dllimport) void __stdcall DebugBreak();
+ #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { DebugBreak(); }
+#endif
+
+#ifndef CATCH_BREAK_INTO_DEBUGGER
+#define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue();
+#endif
+
+// #included from: catch_interfaces_runner.h
+#define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED
+
+namespace Catch {
+ class TestCase;
+
+ struct IRunner {
+ virtual ~IRunner();
+ virtual bool aborting() const = 0;
+ };
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// In the event of a failure works out if the debugger needs to be invoked
+// and/or an exception thrown and takes appropriate action.
+// This needs to be done as a macro so the debugger will stop in the user
+// source code rather than in Catch library code
+#define INTERNAL_CATCH_REACT( resultBuilder ) \
+ if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \
+ resultBuilder.react();
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
+ try { \
+ ( __catchResult->*expr ).endExpression(); \
+ } \
+ catch( ... ) { \
+ __catchResult.useActiveException( Catch::ResultDisposition::Normal ); \
+ } \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::isTrue( false && (expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \
+ INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \
+ if( Catch::getResultCapture().getLastResult()->succeeded() )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_ELSE( expr, resultDisposition, macroName ) \
+ INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \
+ if( !Catch::getResultCapture().getLastResult()->succeeded() )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
+ try { \
+ expr; \
+ __catchResult.captureResult( Catch::ResultWas::Ok ); \
+ } \
+ catch( ... ) { \
+ __catchResult.useActiveException( resultDisposition ); \
+ } \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::alwaysFalse() )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_THROWS( expr, resultDisposition, macroName ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
+ if( __catchResult.allowThrows() ) \
+ try { \
+ expr; \
+ __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \
+ } \
+ catch( ... ) { \
+ __catchResult.captureResult( Catch::ResultWas::Ok ); \
+ } \
+ else \
+ __catchResult.captureResult( Catch::ResultWas::Ok ); \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::alwaysFalse() )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
+ if( __catchResult.allowThrows() ) \
+ try { \
+ expr; \
+ __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \
+ } \
+ catch( exceptionType ) { \
+ __catchResult.captureResult( Catch::ResultWas::Ok ); \
+ } \
+ catch( ... ) { \
+ __catchResult.useActiveException( resultDisposition ); \
+ } \
+ else \
+ __catchResult.captureResult( Catch::ResultWas::Ok ); \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::alwaysFalse() )
+
+///////////////////////////////////////////////////////////////////////////////
+#ifdef CATCH_CONFIG_VARIADIC_MACROS
+ #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, ... ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \
+ __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \
+ __catchResult.captureResult( messageType ); \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::alwaysFalse() )
+#else
+ #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, log ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \
+ __catchResult << log + ::Catch::StreamEndStop(); \
+ __catchResult.captureResult( messageType ); \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::alwaysFalse() )
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_INFO( log, macroName ) \
+ Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log;
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg " " #matcher, resultDisposition ); \
+ try { \
+ std::string matcherAsString = ::Catch::Matchers::matcher.toString(); \
+ __catchResult \
+ .setLhs( Catch::toString( arg ) ) \
+ .setRhs( matcherAsString == Catch::Detail::unprintableString ? #matcher : matcherAsString ) \
+ .setOp( "matches" ) \
+ .setResultType( ::Catch::Matchers::matcher.match( arg ) ); \
+ __catchResult.captureExpression(); \
+ } catch( ... ) { \
+ __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \
+ } \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::alwaysFalse() )
+
+// #included from: internal/catch_section.h
+#define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED
+
+// #included from: catch_section_info.h
+#define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED
+
+namespace Catch {
+
+ struct SectionInfo {
+ SectionInfo
+ ( SourceLineInfo const& _lineInfo,
+ std::string const& _name,
+ std::string const& _description = std::string() );
+
+ std::string name;
+ std::string description;
+ SourceLineInfo lineInfo;
+ };
+
+} // end namespace Catch
+
+// #included from: catch_totals.hpp
+#define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED
+
+#include <cstddef>
+
+namespace Catch {
+
+ struct Counts {
+ Counts() : passed( 0 ), failed( 0 ), failedButOk( 0 ) {}
+
+ Counts operator - ( Counts const& other ) const {
+ Counts diff;
+ diff.passed = passed - other.passed;
+ diff.failed = failed - other.failed;
+ diff.failedButOk = failedButOk - other.failedButOk;
+ return diff;
+ }
+ Counts& operator += ( Counts const& other ) {
+ passed += other.passed;
+ failed += other.failed;
+ failedButOk += other.failedButOk;
+ return *this;
+ }
+
+ std::size_t total() const {
+ return passed + failed + failedButOk;
+ }
+ bool allPassed() const {
+ return failed == 0 && failedButOk == 0;
+ }
+ bool allOk() const {
+ return failed == 0;
+ }
+
+ std::size_t passed;
+ std::size_t failed;
+ std::size_t failedButOk;
+ };
+
+ struct Totals {
+
+ Totals operator - ( Totals const& other ) const {
+ Totals diff;
+ diff.assertions = assertions - other.assertions;
+ diff.testCases = testCases - other.testCases;
+ return diff;
+ }
+
+ Totals delta( Totals const& prevTotals ) const {
+ Totals diff = *this - prevTotals;
+ if( diff.assertions.failed > 0 )
+ ++diff.testCases.failed;
+ else if( diff.assertions.failedButOk > 0 )
+ ++diff.testCases.failedButOk;
+ else
+ ++diff.testCases.passed;
+ return diff;
+ }
+
+ Totals& operator += ( Totals const& other ) {
+ assertions += other.assertions;
+ testCases += other.testCases;
+ return *this;
+ }
+
+ Counts assertions;
+ Counts testCases;
+ };
+}
+
+// #included from: catch_timer.h
+#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED
+
+#ifdef CATCH_PLATFORM_WINDOWS
+typedef unsigned long long uint64_t;
+#else
+#include <stdint.h>
+#endif
+
+namespace Catch {
+
+ class Timer {
+ public:
+ Timer() : m_ticks( 0 ) {}
+ void start();
+ unsigned int getElapsedMicroseconds() const;
+ unsigned int getElapsedMilliseconds() const;
+ double getElapsedSeconds() const;
+
+ private:
+ uint64_t m_ticks;
+ };
+
+} // namespace Catch
+
+#include <string>
+
+namespace Catch {
+
+ class Section : NonCopyable {
+ public:
+ Section( SectionInfo const& info );
+ ~Section();
+
+ // This indicates whether the section should be executed or not
+ operator bool() const;
+
+ private:
+ SectionInfo m_info;
+
+ std::string m_name;
+ Counts m_assertions;
+ bool m_sectionIncluded;
+ Timer m_timer;
+ };
+
+} // end namespace Catch
+
+#ifdef CATCH_CONFIG_VARIADIC_MACROS
+ #define INTERNAL_CATCH_SECTION( ... ) \
+ if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) )
+#else
+ #define INTERNAL_CATCH_SECTION( name, desc ) \
+ if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, name, desc ) )
+#endif
+
+// #included from: internal/catch_generators.hpp
+#define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED
+
+#include <iterator>
+#include <vector>
+#include <string>
+#include <stdlib.h>
+
+namespace Catch {
+
+template<typename T>
+struct IGenerator {
+ virtual ~IGenerator() {}
+ virtual T getValue( std::size_t index ) const = 0;
+ virtual std::size_t size () const = 0;
+};
+
+template<typename T>
+class BetweenGenerator : public IGenerator<T> {
+public:
+ BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){}
+
+ virtual T getValue( std::size_t index ) const {
+ return m_from+static_cast<int>( index );
+ }
+
+ virtual std::size_t size() const {
+ return static_cast<std::size_t>( 1+m_to-m_from );
+ }
+
+private:
+
+ T m_from;
+ T m_to;
+};
+
+template<typename T>
+class ValuesGenerator : public IGenerator<T> {
+public:
+ ValuesGenerator(){}
+
+ void add( T value ) {
+ m_values.push_back( value );
+ }
+
+ virtual T getValue( std::size_t index ) const {
+ return m_values[index];
+ }
+
+ virtual std::size_t size() const {
+ return m_values.size();
+ }
+
+private:
+ std::vector<T> m_values;
+};
+
+template<typename T>
+class CompositeGenerator {
+public:
+ CompositeGenerator() : m_totalSize( 0 ) {}
+
+ // *** Move semantics, similar to auto_ptr ***
+ CompositeGenerator( CompositeGenerator& other )
+ : m_fileInfo( other.m_fileInfo ),
+ m_totalSize( 0 )
+ {
+ move( other );
+ }
+
+ CompositeGenerator& setFileInfo( const char* fileInfo ) {
+ m_fileInfo = fileInfo;
+ return *this;
+ }
+
+ ~CompositeGenerator() {
+ deleteAll( m_composed );
+ }
+
+ operator T () const {
+ size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize );
+
+ typename std::vector<const IGenerator<T>*>::const_iterator it = m_composed.begin();
+ typename std::vector<const IGenerator<T>*>::const_iterator itEnd = m_composed.end();
+ for( size_t index = 0; it != itEnd; ++it )
+ {
+ const IGenerator<T>* generator = *it;
+ if( overallIndex >= index && overallIndex < index + generator->size() )
+ {
+ return generator->getValue( overallIndex-index );
+ }
+ index += generator->size();
+ }
+ CATCH_INTERNAL_ERROR( "Indexed past end of generated range" );
+ return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so
+ }
+
+ void add( const IGenerator<T>* generator ) {
+ m_totalSize += generator->size();
+ m_composed.push_back( generator );
+ }
+
+ CompositeGenerator& then( CompositeGenerator& other ) {
+ move( other );
+ return *this;
+ }
+
+ CompositeGenerator& then( T value ) {
+ ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
+ valuesGen->add( value );
+ add( valuesGen );
+ return *this;
+ }
+
+private:
+
+ void move( CompositeGenerator& other ) {
+ std::copy( other.m_composed.begin(), other.m_composed.end(), std::back_inserter( m_composed ) );
+ m_totalSize += other.m_totalSize;
+ other.m_composed.clear();
+ }
+
+ std::vector<const IGenerator<T>*> m_composed;
+ std::string m_fileInfo;
+ size_t m_totalSize;
+};
+
+namespace Generators
+{
+ template<typename T>
+ CompositeGenerator<T> between( T from, T to ) {
+ CompositeGenerator<T> generators;
+ generators.add( new BetweenGenerator<T>( from, to ) );
+ return generators;
+ }
+
+ template<typename T>
+ CompositeGenerator<T> values( T val1, T val2 ) {
+ CompositeGenerator<T> generators;
+ ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
+ valuesGen->add( val1 );
+ valuesGen->add( val2 );
+ generators.add( valuesGen );
+ return generators;
+ }
+
+ template<typename T>
+ CompositeGenerator<T> values( T val1, T val2, T val3 ){
+ CompositeGenerator<T> generators;
+ ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
+ valuesGen->add( val1 );
+ valuesGen->add( val2 );
+ valuesGen->add( val3 );
+ generators.add( valuesGen );
+ return generators;
+ }
+
+ template<typename T>
+ CompositeGenerator<T> values( T val1, T val2, T val3, T val4 ) {
+ CompositeGenerator<T> generators;
+ ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
+ valuesGen->add( val1 );
+ valuesGen->add( val2 );
+ valuesGen->add( val3 );
+ valuesGen->add( val4 );
+ generators.add( valuesGen );
+ return generators;
+ }
+
+} // end namespace Generators
+
+using namespace Generators;
+
+} // end namespace Catch
+
+#define INTERNAL_CATCH_LINESTR2( line ) #line
+#define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line )
+
+#define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" )
+
+// #included from: internal/catch_interfaces_exception.h
+#define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED
+
+#include <string>
+// #included from: catch_interfaces_registry_hub.h
+#define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED
+
+#include <string>
+
+namespace Catch {
+
+ class TestCase;
+ struct ITestCaseRegistry;
+ struct IExceptionTranslatorRegistry;
+ struct IExceptionTranslator;
+ struct IReporterRegistry;
+ struct IReporterFactory;
+
+ struct IRegistryHub {
+ virtual ~IRegistryHub();
+
+ virtual IReporterRegistry const& getReporterRegistry() const = 0;
+ virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0;
+ virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0;
+ };
+
+ struct IMutableRegistryHub {
+ virtual ~IMutableRegistryHub();
+ virtual void registerReporter( std::string const& name, IReporterFactory* factory ) = 0;
+ virtual void registerTest( TestCase const& testInfo ) = 0;
+ virtual void registerTranslator( const IExceptionTranslator* translator ) = 0;
+ };
+
+ IRegistryHub& getRegistryHub();
+ IMutableRegistryHub& getMutableRegistryHub();
+ void cleanUp();
+ std::string translateActiveException();
+
+}
+
+
+namespace Catch {
+
+ typedef std::string(*exceptionTranslateFunction)();
+
+ struct IExceptionTranslator {
+ virtual ~IExceptionTranslator();
+ virtual std::string translate() const = 0;
+ };
+
+ struct IExceptionTranslatorRegistry {
+ virtual ~IExceptionTranslatorRegistry();
+
+ virtual std::string translateActiveException() const = 0;
+ };
+
+ class ExceptionTranslatorRegistrar {
+ template<typename T>
+ class ExceptionTranslator : public IExceptionTranslator {
+ public:
+
+ ExceptionTranslator( std::string(*translateFunction)( T& ) )
+ : m_translateFunction( translateFunction )
+ {}
+
+ virtual std::string translate() const {
+ try {
+ throw;
+ }
+ catch( T& ex ) {
+ return m_translateFunction( ex );
+ }
+ }
+
+ protected:
+ std::string(*m_translateFunction)( T& );
+ };
+
+ public:
+ template<typename T>
+ ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) {
+ getMutableRegistryHub().registerTranslator
+ ( new ExceptionTranslator<T>( translateFunction ) );
+ }
+ };
+}
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) \
+ static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ); \
+ namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ) ); }\
+ static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature )
+
+// #included from: internal/catch_approx.hpp
+#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED
+
+#include <cmath>
+#include <limits>
+
+namespace Catch {
+namespace Detail {
+
+ class Approx {
+ public:
+ explicit Approx ( double value )
+ : m_epsilon( std::numeric_limits<float>::epsilon()*100 ),
+ m_scale( 1.0 ),
+ m_value( value )
+ {}
+
+ Approx( Approx const& other )
+ : m_epsilon( other.m_epsilon ),
+ m_scale( other.m_scale ),
+ m_value( other.m_value )
+ {}
+
+ static Approx custom() {
+ return Approx( 0 );
+ }
+
+ Approx operator()( double value ) {
+ Approx approx( value );
+ approx.epsilon( m_epsilon );
+ approx.scale( m_scale );
+ return approx;
+ }
+
+ friend bool operator == ( double lhs, Approx const& rhs ) {
+ // Thanks to Richard Harris for his help refining this formula
+ return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) );
+ }
+
+ friend bool operator == ( Approx const& lhs, double rhs ) {
+ return operator==( rhs, lhs );
+ }
+
+ friend bool operator != ( double lhs, Approx const& rhs ) {
+ return !operator==( lhs, rhs );
+ }
+
+ friend bool operator != ( Approx const& lhs, double rhs ) {
+ return !operator==( rhs, lhs );
+ }
+
+ Approx& epsilon( double newEpsilon ) {
+ m_epsilon = newEpsilon;
+ return *this;
+ }
+
+ Approx& scale( double newScale ) {
+ m_scale = newScale;
+ return *this;
+ }
+
+ std::string toString() const {
+ std::ostringstream oss;
+ oss << "Approx( " << Catch::toString( m_value ) << " )";
+ return oss.str();
+ }
+
+ private:
+ double m_epsilon;
+ double m_scale;
+ double m_value;
+ };
+}
+
+template<>
+inline std::string toString<Detail::Approx>( Detail::Approx const& value ) {
+ return value.toString();
+}
+
+} // end namespace Catch
+
+// #included from: internal/catch_matchers.hpp
+#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED
+
+namespace Catch {
+namespace Matchers {
+ namespace Impl {
+
+ template<typename ExpressionT>
+ struct Matcher : SharedImpl<IShared>
+ {
+ typedef ExpressionT ExpressionType;
+
+ virtual ~Matcher() {}
+ virtual Ptr<Matcher> clone() const = 0;
+ virtual bool match( ExpressionT const& expr ) const = 0;
+ virtual std::string toString() const = 0;
+ };
+
+ template<typename DerivedT, typename ExpressionT>
+ struct MatcherImpl : Matcher<ExpressionT> {
+
+ virtual Ptr<Matcher<ExpressionT> > clone() const {
+ return Ptr<Matcher<ExpressionT> >( new DerivedT( static_cast<DerivedT const&>( *this ) ) );
+ }
+ };
+
+ namespace Generic {
+
+ template<typename ExpressionT>
+ class AllOf : public MatcherImpl<AllOf<ExpressionT>, ExpressionT> {
+ public:
+
+ AllOf() {}
+ AllOf( AllOf const& other ) : m_matchers( other.m_matchers ) {}
+
+ AllOf& add( Matcher<ExpressionT> const& matcher ) {
+ m_matchers.push_back( matcher.clone() );
+ return *this;
+ }
+ virtual bool match( ExpressionT const& expr ) const
+ {
+ for( std::size_t i = 0; i < m_matchers.size(); ++i )
+ if( !m_matchers[i]->match( expr ) )
+ return false;
+ return true;
+ }
+ virtual std::string toString() const {
+ std::ostringstream oss;
+ oss << "( ";
+ for( std::size_t i = 0; i < m_matchers.size(); ++i ) {
+ if( i != 0 )
+ oss << " and ";
+ oss << m_matchers[i]->toString();
+ }
+ oss << " )";
+ return oss.str();
+ }
+
+ private:
+ std::vector<Ptr<Matcher<ExpressionT> > > m_matchers;
+ };
+
+ template<typename ExpressionT>
+ class AnyOf : public MatcherImpl<AnyOf<ExpressionT>, ExpressionT> {
+ public:
+
+ AnyOf() {}
+ AnyOf( AnyOf const& other ) : m_matchers( other.m_matchers ) {}
+
+ AnyOf& add( Matcher<ExpressionT> const& matcher ) {
+ m_matchers.push_back( matcher.clone() );
+ return *this;
+ }
+ virtual bool match( ExpressionT const& expr ) const
+ {
+ for( std::size_t i = 0; i < m_matchers.size(); ++i )
+ if( m_matchers[i]->match( expr ) )
+ return true;
+ return false;
+ }
+ virtual std::string toString() const {
+ std::ostringstream oss;
+ oss << "( ";
+ for( std::size_t i = 0; i < m_matchers.size(); ++i ) {
+ if( i != 0 )
+ oss << " or ";
+ oss << m_matchers[i]->toString();
+ }
+ oss << " )";
+ return oss.str();
+ }
+
+ private:
+ std::vector<Ptr<Matcher<ExpressionT> > > m_matchers;
+ };
+
+ }
+
+ namespace StdString {
+
+ inline std::string makeString( std::string const& str ) { return str; }
+ inline std::string makeString( const char* str ) { return str ? std::string( str ) : std::string(); }
+
+ struct Equals : MatcherImpl<Equals, std::string> {
+ Equals( std::string const& str ) : m_str( str ){}
+ Equals( Equals const& other ) : m_str( other.m_str ){}
+
+ virtual ~Equals();
+
+ virtual bool match( std::string const& expr ) const {
+ return m_str == expr;
+ }
+ virtual std::string toString() const {
+ return "equals: \"" + m_str + "\"";
+ }
+
+ std::string m_str;
+ };
+
+ struct Contains : MatcherImpl<Contains, std::string> {
+ Contains( std::string const& substr ) : m_substr( substr ){}
+ Contains( Contains const& other ) : m_substr( other.m_substr ){}
+
+ virtual ~Contains();
+
+ virtual bool match( std::string const& expr ) const {
+ return expr.find( m_substr ) != std::string::npos;
+ }
+ virtual std::string toString() const {
+ return "contains: \"" + m_substr + "\"";
+ }
+
+ std::string m_substr;
+ };
+
+ struct StartsWith : MatcherImpl<StartsWith, std::string> {
+ StartsWith( std::string const& substr ) : m_substr( substr ){}
+ StartsWith( StartsWith const& other ) : m_substr( other.m_substr ){}
+
+ virtual ~StartsWith();
+
+ virtual bool match( std::string const& expr ) const {
+ return expr.find( m_substr ) == 0;
+ }
+ virtual std::string toString() const {
+ return "starts with: \"" + m_substr + "\"";
+ }
+
+ std::string m_substr;
+ };
+
+ struct EndsWith : MatcherImpl<EndsWith, std::string> {
+ EndsWith( std::string const& substr ) : m_substr( substr ){}
+ EndsWith( EndsWith const& other ) : m_substr( other.m_substr ){}
+
+ virtual ~EndsWith();
+
+ virtual bool match( std::string const& expr ) const {
+ return expr.find( m_substr ) == expr.size() - m_substr.size();
+ }
+ virtual std::string toString() const {
+ return "ends with: \"" + m_substr + "\"";
+ }
+
+ std::string m_substr;
+ };
+ } // namespace StdString
+ } // namespace Impl
+
+ // The following functions create the actual matcher objects.
+ // This allows the types to be inferred
+ template<typename ExpressionT>
+ inline Impl::Generic::AllOf<ExpressionT> AllOf( Impl::Matcher<ExpressionT> const& m1,
+ Impl::Matcher<ExpressionT> const& m2 ) {
+ return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 );
+ }
+ template<typename ExpressionT>
+ inline Impl::Generic::AllOf<ExpressionT> AllOf( Impl::Matcher<ExpressionT> const& m1,
+ Impl::Matcher<ExpressionT> const& m2,
+ Impl::Matcher<ExpressionT> const& m3 ) {
+ return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 );
+ }
+ template<typename ExpressionT>
+ inline Impl::Generic::AnyOf<ExpressionT> AnyOf( Impl::Matcher<ExpressionT> const& m1,
+ Impl::Matcher<ExpressionT> const& m2 ) {
+ return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 );
+ }
+ template<typename ExpressionT>
+ inline Impl::Generic::AnyOf<ExpressionT> AnyOf( Impl::Matcher<ExpressionT> const& m1,
+ Impl::Matcher<ExpressionT> const& m2,
+ Impl::Matcher<ExpressionT> const& m3 ) {
+ return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 );
+ }
+
+ inline Impl::StdString::Equals Equals( std::string const& str ) {
+ return Impl::StdString::Equals( str );
+ }
+ inline Impl::StdString::Equals Equals( const char* str ) {
+ return Impl::StdString::Equals( Impl::StdString::makeString( str ) );
+ }
+ inline Impl::StdString::Contains Contains( std::string const& substr ) {
+ return Impl::StdString::Contains( substr );
+ }
+ inline Impl::StdString::Contains Contains( const char* substr ) {
+ return Impl::StdString::Contains( Impl::StdString::makeString( substr ) );
+ }
+ inline Impl::StdString::StartsWith StartsWith( std::string const& substr ) {
+ return Impl::StdString::StartsWith( substr );
+ }
+ inline Impl::StdString::StartsWith StartsWith( const char* substr ) {
+ return Impl::StdString::StartsWith( Impl::StdString::makeString( substr ) );
+ }
+ inline Impl::StdString::EndsWith EndsWith( std::string const& substr ) {
+ return Impl::StdString::EndsWith( substr );
+ }
+ inline Impl::StdString::EndsWith EndsWith( const char* substr ) {
+ return Impl::StdString::EndsWith( Impl::StdString::makeString( substr ) );
+ }
+
+} // namespace Matchers
+
+using namespace Matchers;
+
+} // namespace Catch
+
+// #included from: internal/catch_interfaces_tag_alias_registry.h
+#define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED
+
+// #included from: catch_tag_alias.h
+#define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED
+
+#include <string>
+
+namespace Catch {
+
+ struct TagAlias {
+ TagAlias( std::string _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {}
+
+ std::string tag;
+ SourceLineInfo lineInfo;
+ };
+
+ struct RegistrarForTagAliases {
+ RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo );
+ };
+
+} // end namespace Catch
+
+#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); }
+// #included from: catch_option.hpp
+#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED
+
+namespace Catch {
+
+ // An optional type
+ template<typename T>
+ class Option {
+ public:
+ Option() : nullableValue( NULL ) {}
+ Option( T const& _value )
+ : nullableValue( new( storage ) T( _value ) )
+ {}
+ Option( Option const& _other )
+ : nullableValue( _other ? new( storage ) T( *_other ) : NULL )
+ {}
+
+ ~Option() {
+ reset();
+ }
+
+ Option& operator= ( Option const& _other ) {
+ if( &_other != this ) {
+ reset();
+ if( _other )
+ nullableValue = new( storage ) T( *_other );
+ }
+ return *this;
+ }
+ Option& operator = ( T const& _value ) {
+ reset();
+ nullableValue = new( storage ) T( _value );
+ return *this;
+ }
+
+ void reset() {
+ if( nullableValue )
+ nullableValue->~T();
+ nullableValue = NULL;
+ }
+
+ T& operator*() { return *nullableValue; }
+ T const& operator*() const { return *nullableValue; }
+ T* operator->() { return nullableValue; }
+ const T* operator->() const { return nullableValue; }
+
+ T valueOr( T const& defaultValue ) const {
+ return nullableValue ? *nullableValue : defaultValue;
+ }
+
+ bool some() const { return nullableValue != NULL; }
+ bool none() const { return nullableValue == NULL; }
+
+ bool operator !() const { return nullableValue == NULL; }
+ operator SafeBool::type() const {
+ return SafeBool::makeSafe( some() );
+ }
+
+ private:
+ T* nullableValue;
+ char storage[sizeof(T)];
+ };
+
+} // end namespace Catch
+
+namespace Catch {
+
+ struct ITagAliasRegistry {
+ virtual ~ITagAliasRegistry();
+ virtual Option<TagAlias> find( std::string const& alias ) const = 0;
+ virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0;
+
+ static ITagAliasRegistry const& get();
+ };
+
+} // end namespace Catch
+
+// These files are included here so the single_include script doesn't put them
+// in the conditionally compiled sections
+// #included from: internal/catch_test_case_info.h
+#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED
+
+#include <string>
+#include <set>
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpadded"
+#endif
+
+namespace Catch {
+
+ struct ITestCase;
+
+ struct TestCaseInfo {
+ enum SpecialProperties{
+ None = 0,
+ IsHidden = 1 << 1,
+ ShouldFail = 1 << 2,
+ MayFail = 1 << 3,
+ Throws = 1 << 4
+ };
+
+ TestCaseInfo( std::string const& _name,
+ std::string const& _className,
+ std::string const& _description,
+ std::set<std::string> const& _tags,
+ SourceLineInfo const& _lineInfo );
+
+ TestCaseInfo( TestCaseInfo const& other );
+
+ bool isHidden() const;
+ bool throws() const;
+ bool okToFail() const;
+ bool expectedToFail() const;
+
+ std::string name;
+ std::string className;
+ std::string description;
+ std::set<std::string> tags;
+ std::set<std::string> lcaseTags;
+ std::string tagsAsString;
+ SourceLineInfo lineInfo;
+ SpecialProperties properties;
+ };
+
+ class TestCase : public TestCaseInfo {
+ public:
+
+ TestCase( ITestCase* testCase, TestCaseInfo const& info );
+ TestCase( TestCase const& other );
+
+ TestCase withName( std::string const& _newName ) const;
+
+ void invoke() const;
+
+ TestCaseInfo const& getTestCaseInfo() const;
+
+ void swap( TestCase& other );
+ bool operator == ( TestCase const& other ) const;
+ bool operator < ( TestCase const& other ) const;
+ TestCase& operator = ( TestCase const& other );
+
+ private:
+ Ptr<ITestCase> test;
+ };
+
+ TestCase makeTestCase( ITestCase* testCase,
+ std::string const& className,
+ std::string const& name,
+ std::string const& description,
+ SourceLineInfo const& lineInfo );
+}
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+
+#ifdef __OBJC__
+// #included from: internal/catch_objc.hpp
+#define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED
+
+#import <objc/runtime.h>
+
+#include <string>
+
+// NB. Any general catch headers included here must be included
+// in catch.hpp first to make sure they are included by the single
+// header for non obj-usage
+
+///////////////////////////////////////////////////////////////////////////////
+// This protocol is really only here for (self) documenting purposes, since
+// all its methods are optional.
+ at protocol OcFixture
+
+ at optional
+
+-(void) setUp;
+-(void) tearDown;
+
+ at end
+
+namespace Catch {
+
+ class OcMethod : public SharedImpl<ITestCase> {
+
+ public:
+ OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {}
+
+ virtual void invoke() const {
+ id obj = [[m_cls alloc] init];
+
+ performOptionalSelector( obj, @selector(setUp) );
+ performOptionalSelector( obj, m_sel );
+ performOptionalSelector( obj, @selector(tearDown) );
+
+ arcSafeRelease( obj );
+ }
+ private:
+ virtual ~OcMethod() {}
+
+ Class m_cls;
+ SEL m_sel;
+ };
+
+ namespace Detail{
+
+ inline std::string getAnnotation( Class cls,
+ std::string const& annotationName,
+ std::string const& testCaseName ) {
+ NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()];
+ SEL sel = NSSelectorFromString( selStr );
+ arcSafeRelease( selStr );
+ id value = performOptionalSelector( cls, sel );
+ if( value )
+ return [(NSString*)value UTF8String];
+ return "";
+ }
+ }
+
+ inline size_t registerTestMethods() {
+ size_t noTestMethods = 0;
+ int noClasses = objc_getClassList( NULL, 0 );
+
+ Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses);
+ objc_getClassList( classes, noClasses );
+
+ for( int c = 0; c < noClasses; c++ ) {
+ Class cls = classes[c];
+ {
+ u_int count;
+ Method* methods = class_copyMethodList( cls, &count );
+ for( u_int m = 0; m < count ; m++ ) {
+ SEL selector = method_getName(methods[m]);
+ std::string methodName = sel_getName(selector);
+ if( startsWith( methodName, "Catch_TestCase_" ) ) {
+ std::string testCaseName = methodName.substr( 15 );
+ std::string name = Detail::getAnnotation( cls, "Name", testCaseName );
+ std::string desc = Detail::getAnnotation( cls, "Description", testCaseName );
+ const char* className = class_getName( cls );
+
+ getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) );
+ noTestMethods++;
+ }
+ }
+ free(methods);
+ }
+ }
+ return noTestMethods;
+ }
+
+ namespace Matchers {
+ namespace Impl {
+ namespace NSStringMatchers {
+
+ template<typename MatcherT>
+ struct StringHolder : MatcherImpl<MatcherT, NSString*>{
+ StringHolder( NSString* substr ) : m_substr( [substr copy] ){}
+ StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){}
+ StringHolder() {
+ arcSafeRelease( m_substr );
+ }
+
+ NSString* m_substr;
+ };
+
+ struct Equals : StringHolder<Equals> {
+ Equals( NSString* substr ) : StringHolder( substr ){}
+
+ virtual bool match( ExpressionType const& str ) const {
+ return (str != nil || m_substr == nil ) &&
+ [str isEqualToString:m_substr];
+ }
+
+ virtual std::string toString() const {
+ return "equals string: " + Catch::toString( m_substr );
+ }
+ };
+
+ struct Contains : StringHolder<Contains> {
+ Contains( NSString* substr ) : StringHolder( substr ){}
+
+ virtual bool match( ExpressionType const& str ) const {
+ return (str != nil || m_substr == nil ) &&
+ [str rangeOfString:m_substr].location != NSNotFound;
+ }
+
+ virtual std::string toString() const {
+ return "contains string: " + Catch::toString( m_substr );
+ }
+ };
+
+ struct StartsWith : StringHolder<StartsWith> {
+ StartsWith( NSString* substr ) : StringHolder( substr ){}
+
+ virtual bool match( ExpressionType const& str ) const {
+ return (str != nil || m_substr == nil ) &&
+ [str rangeOfString:m_substr].location == 0;
+ }
+
+ virtual std::string toString() const {
+ return "starts with: " + Catch::toString( m_substr );
+ }
+ };
+ struct EndsWith : StringHolder<EndsWith> {
+ EndsWith( NSString* substr ) : StringHolder( substr ){}
+
+ virtual bool match( ExpressionType const& str ) const {
+ return (str != nil || m_substr == nil ) &&
+ [str rangeOfString:m_substr].location == [str length] - [m_substr length];
+ }
+
+ virtual std::string toString() const {
+ return "ends with: " + Catch::toString( m_substr );
+ }
+ };
+
+ } // namespace NSStringMatchers
+ } // namespace Impl
+
+ inline Impl::NSStringMatchers::Equals
+ Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); }
+
+ inline Impl::NSStringMatchers::Contains
+ Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); }
+
+ inline Impl::NSStringMatchers::StartsWith
+ StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); }
+
+ inline Impl::NSStringMatchers::EndsWith
+ EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); }
+
+ } // namespace Matchers
+
+ using namespace Matchers;
+
+} // namespace Catch
+
+///////////////////////////////////////////////////////////////////////////////
+#define OC_TEST_CASE( name, desc )\
++(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \
+{\
+return @ name; \
+}\
++(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \
+{ \
+return @ desc; \
+} \
+-(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test )
+
+#endif
+
+#ifdef CATCH_IMPL
+// #included from: internal/catch_impl.hpp
+#define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED
+
+// Collect all the implementation files together here
+// These are the equivalent of what would usually be cpp files
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wweak-vtables"
+#endif
+
+// #included from: ../catch_runner.hpp
+#define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED
+
+// #included from: internal/catch_commandline.hpp
+#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED
+
+// #included from: catch_config.hpp
+#define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED
+
+// #included from: catch_test_spec_parser.hpp
+#define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpadded"
+#endif
+
+// #included from: catch_test_spec.hpp
+#define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpadded"
+#endif
+
+#include <string>
+#include <vector>
+
+namespace Catch {
+
+ class TestSpec {
+ struct Pattern : SharedImpl<> {
+ virtual ~Pattern();
+ virtual bool matches( TestCaseInfo const& testCase ) const = 0;
+ };
+ class NamePattern : public Pattern {
+ enum WildcardPosition {
+ NoWildcard = 0,
+ WildcardAtStart = 1,
+ WildcardAtEnd = 2,
+ WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd
+ };
+
+ public:
+ NamePattern( std::string const& name ) : m_name( toLower( name ) ), m_wildcard( NoWildcard ) {
+ if( startsWith( m_name, "*" ) ) {
+ m_name = m_name.substr( 1 );
+ m_wildcard = WildcardAtStart;
+ }
+ if( endsWith( m_name, "*" ) ) {
+ m_name = m_name.substr( 0, m_name.size()-1 );
+ m_wildcard = static_cast<WildcardPosition>( m_wildcard | WildcardAtEnd );
+ }
+ }
+ virtual ~NamePattern();
+ virtual bool matches( TestCaseInfo const& testCase ) const {
+ switch( m_wildcard ) {
+ case NoWildcard:
+ return m_name == toLower( testCase.name );
+ case WildcardAtStart:
+ return endsWith( toLower( testCase.name ), m_name );
+ case WildcardAtEnd:
+ return startsWith( toLower( testCase.name ), m_name );
+ case WildcardAtBothEnds:
+ return contains( toLower( testCase.name ), m_name );
+ }
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunreachable-code"
+#endif
+ throw std::logic_error( "Unknown enum" );
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+ }
+ private:
+ std::string m_name;
+ WildcardPosition m_wildcard;
+ };
+ class TagPattern : public Pattern {
+ public:
+ TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {}
+ virtual ~TagPattern();
+ virtual bool matches( TestCaseInfo const& testCase ) const {
+ return testCase.lcaseTags.find( m_tag ) != testCase.lcaseTags.end();
+ }
+ private:
+ std::string m_tag;
+ };
+ class ExcludedPattern : public Pattern {
+ public:
+ ExcludedPattern( Ptr<Pattern> const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {}
+ virtual ~ExcludedPattern();
+ virtual bool matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); }
+ private:
+ Ptr<Pattern> m_underlyingPattern;
+ };
+
+ struct Filter {
+ std::vector<Ptr<Pattern> > m_patterns;
+
+ bool matches( TestCaseInfo const& testCase ) const {
+ // All patterns in a filter must match for the filter to be a match
+ for( std::vector<Ptr<Pattern> >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it )
+ if( !(*it)->matches( testCase ) )
+ return false;
+ return true;
+ }
+ };
+
+ public:
+ bool hasFilters() const {
+ return !m_filters.empty();
+ }
+ bool matches( TestCaseInfo const& testCase ) const {
+ // A TestSpec matches if any filter matches
+ for( std::vector<Filter>::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it )
+ if( it->matches( testCase ) )
+ return true;
+ return false;
+ }
+
+ private:
+ std::vector<Filter> m_filters;
+
+ friend class TestSpecParser;
+ };
+}
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+namespace Catch {
+
+ class TestSpecParser {
+ enum Mode{ None, Name, QuotedName, Tag };
+ Mode m_mode;
+ bool m_exclusion;
+ std::size_t m_start, m_pos;
+ std::string m_arg;
+ TestSpec::Filter m_currentFilter;
+ TestSpec m_testSpec;
+ ITagAliasRegistry const* m_tagAliases;
+
+ public:
+ TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {}
+
+ TestSpecParser& parse( std::string const& arg ) {
+ m_mode = None;
+ m_exclusion = false;
+ m_start = std::string::npos;
+ m_arg = m_tagAliases->expandAliases( arg );
+ for( m_pos = 0; m_pos < m_arg.size(); ++m_pos )
+ visitChar( m_arg[m_pos] );
+ if( m_mode == Name )
+ addPattern<TestSpec::NamePattern>();
+ return *this;
+ }
+ TestSpec testSpec() {
+ addFilter();
+ return m_testSpec;
+ }
+ private:
+ void visitChar( char c ) {
+ if( m_mode == None ) {
+ switch( c ) {
+ case ' ': return;
+ case '~': m_exclusion = true; return;
+ case '[': return startNewMode( Tag, ++m_pos );
+ case '"': return startNewMode( QuotedName, ++m_pos );
+ default: startNewMode( Name, m_pos ); break;
+ }
+ }
+ if( m_mode == Name ) {
+ if( c == ',' ) {
+ addPattern<TestSpec::NamePattern>();
+ addFilter();
+ }
+ else if( c == '[' ) {
+ if( subString() == "exclude:" )
+ m_exclusion = true;
+ else
+ addPattern<TestSpec::NamePattern>();
+ startNewMode( Tag, ++m_pos );
+ }
+ }
+ else if( m_mode == QuotedName && c == '"' )
+ addPattern<TestSpec::NamePattern>();
+ else if( m_mode == Tag && c == ']' )
+ addPattern<TestSpec::TagPattern>();
+ }
+ void startNewMode( Mode mode, std::size_t start ) {
+ m_mode = mode;
+ m_start = start;
+ }
+ std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); }
+ template<typename T>
+ void addPattern() {
+ std::string token = subString();
+ if( startsWith( token, "exclude:" ) ) {
+ m_exclusion = true;
+ token = token.substr( 8 );
+ }
+ if( !token.empty() ) {
+ Ptr<TestSpec::Pattern> pattern = new T( token );
+ if( m_exclusion )
+ pattern = new TestSpec::ExcludedPattern( pattern );
+ m_currentFilter.m_patterns.push_back( pattern );
+ }
+ m_exclusion = false;
+ m_mode = None;
+ }
+ void addFilter() {
+ if( !m_currentFilter.m_patterns.empty() ) {
+ m_testSpec.m_filters.push_back( m_currentFilter );
+ m_currentFilter = TestSpec::Filter();
+ }
+ }
+ };
+ inline TestSpec parseTestSpec( std::string const& arg ) {
+ return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec();
+ }
+
+} // namespace Catch
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+// #included from: catch_interfaces_config.h
+#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+namespace Catch {
+
+ struct Verbosity { enum Level {
+ NoOutput = 0,
+ Quiet,
+ Normal
+ }; };
+
+ struct WarnAbout { enum What {
+ Nothing = 0x00,
+ NoAssertions = 0x01
+ }; };
+
+ struct ShowDurations { enum OrNot {
+ DefaultForReporter,
+ Always,
+ Never
+ }; };
+ struct RunTests { enum InWhatOrder {
+ InDeclarationOrder,
+ InLexicographicalOrder,
+ InRandomOrder
+ }; };
+
+ class TestSpec;
+
+ struct IConfig : IShared {
+
+ virtual ~IConfig();
+
+ virtual bool allowThrows() const = 0;
+ virtual std::ostream& stream() const = 0;
+ virtual std::string name() const = 0;
+ virtual bool includeSuccessfulResults() const = 0;
+ virtual bool shouldDebugBreak() const = 0;
+ virtual bool warnAboutMissingAssertions() const = 0;
+ virtual int abortAfter() const = 0;
+ virtual bool showInvisibles() const = 0;
+ virtual ShowDurations::OrNot showDurations() const = 0;
+ virtual TestSpec const& testSpec() const = 0;
+ virtual RunTests::InWhatOrder runOrder() const = 0;
+ virtual unsigned int rngSeed() const = 0;
+ virtual bool forceColour() const = 0;
+ };
+}
+
+// #included from: catch_stream.h
+#define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED
+
+#include <streambuf>
+
+#ifdef __clang__
+#pragma clang diagnostic ignored "-Wpadded"
+#endif
+
+namespace Catch {
+
+ class Stream {
+ public:
+ Stream();
+ Stream( std::streambuf* _streamBuf, bool _isOwned );
+ void release();
+
+ std::streambuf* streamBuf;
+
+ private:
+ bool isOwned;
+ };
+
+ std::ostream& cout();
+ std::ostream& cerr();
+}
+
+#include <memory>
+#include <vector>
+#include <string>
+#include <iostream>
+#include <ctime>
+
+#ifndef CATCH_CONFIG_CONSOLE_WIDTH
+#define CATCH_CONFIG_CONSOLE_WIDTH 80
+#endif
+
+namespace Catch {
+
+ struct ConfigData {
+
+ ConfigData()
+ : listTests( false ),
+ listTags( false ),
+ listReporters( false ),
+ listTestNamesOnly( false ),
+ showSuccessfulTests( false ),
+ shouldDebugBreak( false ),
+ noThrow( false ),
+ showHelp( false ),
+ showInvisibles( false ),
+ forceColour( false ),
+ abortAfter( -1 ),
+ rngSeed( 0 ),
+ verbosity( Verbosity::Normal ),
+ warnings( WarnAbout::Nothing ),
+ showDurations( ShowDurations::DefaultForReporter ),
+ runOrder( RunTests::InDeclarationOrder )
+ {}
+
+ bool listTests;
+ bool listTags;
+ bool listReporters;
+ bool listTestNamesOnly;
+
+ bool showSuccessfulTests;
+ bool shouldDebugBreak;
+ bool noThrow;
+ bool showHelp;
+ bool showInvisibles;
+ bool forceColour;
+
+ int abortAfter;
+ unsigned int rngSeed;
+
+ Verbosity::Level verbosity;
+ WarnAbout::What warnings;
+ ShowDurations::OrNot showDurations;
+ RunTests::InWhatOrder runOrder;
+
+ std::string reporterName;
+ std::string outputFilename;
+ std::string name;
+ std::string processName;
+
+ std::vector<std::string> testsOrTags;
+ };
+
+ class Config : public SharedImpl<IConfig> {
+ private:
+ Config( Config const& other );
+ Config& operator = ( Config const& other );
+ virtual void dummy();
+ public:
+
+ Config()
+ : m_os( Catch::cout().rdbuf() )
+ {}
+
+ Config( ConfigData const& data )
+ : m_data( data ),
+ m_os( Catch::cout().rdbuf() )
+ {
+ if( !data.testsOrTags.empty() ) {
+ TestSpecParser parser( ITagAliasRegistry::get() );
+ for( std::size_t i = 0; i < data.testsOrTags.size(); ++i )
+ parser.parse( data.testsOrTags[i] );
+ m_testSpec = parser.testSpec();
+ }
+ }
+
+ virtual ~Config() {
+ m_os.rdbuf( Catch::cout().rdbuf() );
+ m_stream.release();
+ }
+
+ void setFilename( std::string const& filename ) {
+ m_data.outputFilename = filename;
+ }
+
+ std::string const& getFilename() const {
+ return m_data.outputFilename ;
+ }
+
+ bool listTests() const { return m_data.listTests; }
+ bool listTestNamesOnly() const { return m_data.listTestNamesOnly; }
+ bool listTags() const { return m_data.listTags; }
+ bool listReporters() const { return m_data.listReporters; }
+
+ std::string getProcessName() const { return m_data.processName; }
+
+ bool shouldDebugBreak() const { return m_data.shouldDebugBreak; }
+
+ void setStreamBuf( std::streambuf* buf ) {
+ m_os.rdbuf( buf ? buf : Catch::cout().rdbuf() );
+ }
+
+ void useStream( std::string const& streamName ) {
+ Stream stream = createStream( streamName );
+ setStreamBuf( stream.streamBuf );
+ m_stream.release();
+ m_stream = stream;
+ }
+
+ std::string getReporterName() const { return m_data.reporterName; }
+
+ int abortAfter() const { return m_data.abortAfter; }
+
+ TestSpec const& testSpec() const { return m_testSpec; }
+
+ bool showHelp() const { return m_data.showHelp; }
+ bool showInvisibles() const { return m_data.showInvisibles; }
+
+ // IConfig interface
+ virtual bool allowThrows() const { return !m_data.noThrow; }
+ virtual std::ostream& stream() const { return m_os; }
+ virtual std::string name() const { return m_data.name.empty() ? m_data.processName : m_data.name; }
+ virtual bool includeSuccessfulResults() const { return m_data.showSuccessfulTests; }
+ virtual bool warnAboutMissingAssertions() const { return m_data.warnings & WarnAbout::NoAssertions; }
+ virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; }
+ virtual RunTests::InWhatOrder runOrder() const { return m_data.runOrder; }
+ virtual unsigned int rngSeed() const { return m_data.rngSeed; }
+ virtual bool forceColour() const { return m_data.forceColour; }
+
+ private:
+ ConfigData m_data;
+
+ Stream m_stream;
+ mutable std::ostream m_os;
+ TestSpec m_testSpec;
+ };
+
+} // end namespace Catch
+
+// #included from: catch_clara.h
+#define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED
+
+// Use Catch's value for console width (store Clara's off to the side, if present)
+#ifdef CLARA_CONFIG_CONSOLE_WIDTH
+#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH
+#undef CLARA_CONFIG_CONSOLE_WIDTH
+#endif
+#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH
+
+// Declare Clara inside the Catch namespace
+#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch {
+// #included from: ../external/clara.h
+
+// Only use header guard if we are not using an outer namespace
+#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE)
+
+#ifndef STITCH_CLARA_OPEN_NAMESPACE
+#define TWOBLUECUBES_CLARA_H_INCLUDED
+#define STITCH_CLARA_OPEN_NAMESPACE
+#define STITCH_CLARA_CLOSE_NAMESPACE
+#else
+#define STITCH_CLARA_CLOSE_NAMESPACE }
+#endif
+
+#define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE
+
+// ----------- #included from tbc_text_format.h -----------
+
+// Only use header guard if we are not using an outer namespace
+#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE)
+#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE
+#define TBC_TEXT_FORMAT_H_INCLUDED
+#endif
+
+#include <string>
+#include <vector>
+#include <sstream>
+
+// Use optional outer namespace
+#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE
+namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE {
+#endif
+
+namespace Tbc {
+
+#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH
+ const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH;
+#else
+ const unsigned int consoleWidth = 80;
+#endif
+
+ struct TextAttributes {
+ TextAttributes()
+ : initialIndent( std::string::npos ),
+ indent( 0 ),
+ width( consoleWidth-1 ),
+ tabChar( '\t' )
+ {}
+
+ TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; }
+ TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; }
+ TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; }
+ TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; }
+
+ std::size_t initialIndent; // indent of first line, or npos
+ std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos
+ std::size_t width; // maximum width of text, including indent. Longer text will wrap
+ char tabChar; // If this char is seen the indent is changed to current pos
+ };
+
+ class Text {
+ public:
+ Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() )
+ : attr( _attr )
+ {
+ std::string wrappableChars = " [({.,/|\\-";
+ std::size_t indent = _attr.initialIndent != std::string::npos
+ ? _attr.initialIndent
+ : _attr.indent;
+ std::string remainder = _str;
+
+ while( !remainder.empty() ) {
+ if( lines.size() >= 1000 ) {
+ lines.push_back( "... message truncated due to excessive size" );
+ return;
+ }
+ std::size_t tabPos = std::string::npos;
+ std::size_t width = (std::min)( remainder.size(), _attr.width - indent );
+ std::size_t pos = remainder.find_first_of( '\n' );
+ if( pos <= width ) {
+ width = pos;
+ }
+ pos = remainder.find_last_of( _attr.tabChar, width );
+ if( pos != std::string::npos ) {
+ tabPos = pos;
+ if( remainder[width] == '\n' )
+ width--;
+ remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 );
+ }
+
+ if( width == remainder.size() ) {
+ spliceLine( indent, remainder, width );
+ }
+ else if( remainder[width] == '\n' ) {
+ spliceLine( indent, remainder, width );
+ if( width <= 1 || remainder.size() != 1 )
+ remainder = remainder.substr( 1 );
+ indent = _attr.indent;
+ }
+ else {
+ pos = remainder.find_last_of( wrappableChars, width );
+ if( pos != std::string::npos && pos > 0 ) {
+ spliceLine( indent, remainder, pos );
+ if( remainder[0] == ' ' )
+ remainder = remainder.substr( 1 );
+ }
+ else {
+ spliceLine( indent, remainder, width-1 );
+ lines.back() += "-";
+ }
+ if( lines.size() == 1 )
+ indent = _attr.indent;
+ if( tabPos != std::string::npos )
+ indent += tabPos;
+ }
+ }
+ }
+
+ void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) {
+ lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) );
+ _remainder = _remainder.substr( _pos );
+ }
+
+ typedef std::vector<std::string>::const_iterator const_iterator;
+
+ const_iterator begin() const { return lines.begin(); }
+ const_iterator end() const { return lines.end(); }
+ std::string const& last() const { return lines.back(); }
+ std::size_t size() const { return lines.size(); }
+ std::string const& operator[]( std::size_t _index ) const { return lines[_index]; }
+ std::string toString() const {
+ std::ostringstream oss;
+ oss << *this;
+ return oss.str();
+ }
+
+ inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) {
+ for( Text::const_iterator it = _text.begin(), itEnd = _text.end();
+ it != itEnd; ++it ) {
+ if( it != _text.begin() )
+ _stream << "\n";
+ _stream << *it;
+ }
+ return _stream;
+ }
+
+ private:
+ std::string str;
+ TextAttributes attr;
+ std::vector<std::string> lines;
+ };
+
+} // end namespace Tbc
+
+#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE
+} // end outer namespace
+#endif
+
+#endif // TBC_TEXT_FORMAT_H_INCLUDED
+
+// ----------- end of #include from tbc_text_format.h -----------
+// ........... back in /Users/philnash/Dev/OSS/Clara/srcs/clara.h
+
+#undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE
+
+#include <map>
+#include <algorithm>
+#include <stdexcept>
+#include <memory>
+
+// Use optional outer namespace
+#ifdef STITCH_CLARA_OPEN_NAMESPACE
+STITCH_CLARA_OPEN_NAMESPACE
+#endif
+
+namespace Clara {
+
+ struct UnpositionalTag {};
+
+ extern UnpositionalTag _;
+
+#ifdef CLARA_CONFIG_MAIN
+ UnpositionalTag _;
+#endif
+
+ namespace Detail {
+
+#ifdef CLARA_CONSOLE_WIDTH
+ const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH;
+#else
+ const unsigned int consoleWidth = 80;
+#endif
+
+ using namespace Tbc;
+
+ inline bool startsWith( std::string const& str, std::string const& prefix ) {
+ return str.size() >= prefix.size() && str.substr( 0, prefix.size() ) == prefix;
+ }
+
+ template<typename T> struct RemoveConstRef{ typedef T type; };
+ template<typename T> struct RemoveConstRef<T&>{ typedef T type; };
+ template<typename T> struct RemoveConstRef<T const&>{ typedef T type; };
+ template<typename T> struct RemoveConstRef<T const>{ typedef T type; };
+
+ template<typename T> struct IsBool { static const bool value = false; };
+ template<> struct IsBool<bool> { static const bool value = true; };
+
+ template<typename T>
+ void convertInto( std::string const& _source, T& _dest ) {
+ std::stringstream ss;
+ ss << _source;
+ ss >> _dest;
+ if( ss.fail() )
+ throw std::runtime_error( "Unable to convert " + _source + " to destination type" );
+ }
+ inline void convertInto( std::string const& _source, std::string& _dest ) {
+ _dest = _source;
+ }
+ inline void convertInto( std::string const& _source, bool& _dest ) {
+ std::string sourceLC = _source;
+ std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), ::tolower );
+ if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" )
+ _dest = true;
+ else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" )
+ _dest = false;
+ else
+ throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" );
+ }
+ inline void convertInto( bool _source, bool& _dest ) {
+ _dest = _source;
+ }
+ template<typename T>
+ inline void convertInto( bool, T& ) {
+ throw std::runtime_error( "Invalid conversion" );
+ }
+
+ template<typename ConfigT>
+ struct IArgFunction {
+ virtual ~IArgFunction() {}
+# ifdef CATCH_CPP11_OR_GREATER
+ IArgFunction() = default;
+ IArgFunction( IArgFunction const& ) = default;
+# endif
+ virtual void set( ConfigT& config, std::string const& value ) const = 0;
+ virtual void setFlag( ConfigT& config ) const = 0;
+ virtual bool takesArg() const = 0;
+ virtual IArgFunction* clone() const = 0;
+ };
+
+ template<typename ConfigT>
+ class BoundArgFunction {
+ public:
+ BoundArgFunction() : functionObj( NULL ) {}
+ BoundArgFunction( IArgFunction<ConfigT>* _functionObj ) : functionObj( _functionObj ) {}
+ BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : NULL ) {}
+ BoundArgFunction& operator = ( BoundArgFunction const& other ) {
+ IArgFunction<ConfigT>* newFunctionObj = other.functionObj ? other.functionObj->clone() : NULL;
+ delete functionObj;
+ functionObj = newFunctionObj;
+ return *this;
+ }
+ ~BoundArgFunction() { delete functionObj; }
+
+ void set( ConfigT& config, std::string const& value ) const {
+ functionObj->set( config, value );
+ }
+ void setFlag( ConfigT& config ) const {
+ functionObj->setFlag( config );
+ }
+ bool takesArg() const { return functionObj->takesArg(); }
+
+ bool isSet() const {
+ return functionObj != NULL;
+ }
+ private:
+ IArgFunction<ConfigT>* functionObj;
+ };
+
+ template<typename C>
+ struct NullBinder : IArgFunction<C>{
+ virtual void set( C&, std::string const& ) const {}
+ virtual void setFlag( C& ) const {}
+ virtual bool takesArg() const { return true; }
+ virtual IArgFunction<C>* clone() const { return new NullBinder( *this ); }
+ };
+
+ template<typename C, typename M>
+ struct BoundDataMember : IArgFunction<C>{
+ BoundDataMember( M C::* _member ) : member( _member ) {}
+ virtual void set( C& p, std::string const& stringValue ) const {
+ convertInto( stringValue, p.*member );
+ }
+ virtual void setFlag( C& p ) const {
+ convertInto( true, p.*member );
+ }
+ virtual bool takesArg() const { return !IsBool<M>::value; }
+ virtual IArgFunction<C>* clone() const { return new BoundDataMember( *this ); }
+ M C::* member;
+ };
+ template<typename C, typename M>
+ struct BoundUnaryMethod : IArgFunction<C>{
+ BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {}
+ virtual void set( C& p, std::string const& stringValue ) const {
+ typename RemoveConstRef<M>::type value;
+ convertInto( stringValue, value );
+ (p.*member)( value );
+ }
+ virtual void setFlag( C& p ) const {
+ typename RemoveConstRef<M>::type value;
+ convertInto( true, value );
+ (p.*member)( value );
+ }
+ virtual bool takesArg() const { return !IsBool<M>::value; }
+ virtual IArgFunction<C>* clone() const { return new BoundUnaryMethod( *this ); }
+ void (C::*member)( M );
+ };
+ template<typename C>
+ struct BoundNullaryMethod : IArgFunction<C>{
+ BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {}
+ virtual void set( C& p, std::string const& stringValue ) const {
+ bool value;
+ convertInto( stringValue, value );
+ if( value )
+ (p.*member)();
+ }
+ virtual void setFlag( C& p ) const {
+ (p.*member)();
+ }
+ virtual bool takesArg() const { return false; }
+ virtual IArgFunction<C>* clone() const { return new BoundNullaryMethod( *this ); }
+ void (C::*member)();
+ };
+
+ template<typename C>
+ struct BoundUnaryFunction : IArgFunction<C>{
+ BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {}
+ virtual void set( C& obj, std::string const& stringValue ) const {
+ bool value;
+ convertInto( stringValue, value );
+ if( value )
+ function( obj );
+ }
+ virtual void setFlag( C& p ) const {
+ function( p );
+ }
+ virtual bool takesArg() const { return false; }
+ virtual IArgFunction<C>* clone() const { return new BoundUnaryFunction( *this ); }
+ void (*function)( C& );
+ };
+
+ template<typename C, typename T>
+ struct BoundBinaryFunction : IArgFunction<C>{
+ BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {}
+ virtual void set( C& obj, std::string const& stringValue ) const {
+ typename RemoveConstRef<T>::type value;
+ convertInto( stringValue, value );
+ function( obj, value );
+ }
+ virtual void setFlag( C& obj ) const {
+ typename RemoveConstRef<T>::type value;
+ convertInto( true, value );
+ function( obj, value );
+ }
+ virtual bool takesArg() const { return !IsBool<T>::value; }
+ virtual IArgFunction<C>* clone() const { return new BoundBinaryFunction( *this ); }
+ void (*function)( C&, T );
+ };
+
+ } // namespace Detail
+
+ struct Parser {
+ Parser() : separators( " \t=:" ) {}
+
+ struct Token {
+ enum Type { Positional, ShortOpt, LongOpt };
+ Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {}
+ Type type;
+ std::string data;
+ };
+
+ void parseIntoTokens( int argc, char const * const * argv, std::vector<Parser::Token>& tokens ) const {
+ const std::string doubleDash = "--";
+ for( int i = 1; i < argc && argv[i] != doubleDash; ++i )
+ parseIntoTokens( argv[i] , tokens);
+ }
+ void parseIntoTokens( std::string arg, std::vector<Parser::Token>& tokens ) const {
+ while( !arg.empty() ) {
+ Parser::Token token( Parser::Token::Positional, arg );
+ arg = "";
+ if( token.data[0] == '-' ) {
+ if( token.data.size() > 1 && token.data[1] == '-' ) {
+ token = Parser::Token( Parser::Token::LongOpt, token.data.substr( 2 ) );
+ }
+ else {
+ token = Parser::Token( Parser::Token::ShortOpt, token.data.substr( 1 ) );
+ if( token.data.size() > 1 && separators.find( token.data[1] ) == std::string::npos ) {
+ arg = "-" + token.data.substr( 1 );
+ token.data = token.data.substr( 0, 1 );
+ }
+ }
+ }
+ if( token.type != Parser::Token::Positional ) {
+ std::size_t pos = token.data.find_first_of( separators );
+ if( pos != std::string::npos ) {
+ arg = token.data.substr( pos+1 );
+ token.data = token.data.substr( 0, pos );
+ }
+ }
+ tokens.push_back( token );
+ }
+ }
+ std::string separators;
+ };
+
+ template<typename ConfigT>
+ struct CommonArgProperties {
+ CommonArgProperties() {}
+ CommonArgProperties( Detail::BoundArgFunction<ConfigT> const& _boundField ) : boundField( _boundField ) {}
+
+ Detail::BoundArgFunction<ConfigT> boundField;
+ std::string description;
+ std::string detail;
+ std::string placeholder; // Only value if boundField takes an arg
+
+ bool takesArg() const {
+ return !placeholder.empty();
+ }
+ void validate() const {
+ if( !boundField.isSet() )
+ throw std::logic_error( "option not bound" );
+ }
+ };
+ struct OptionArgProperties {
+ std::vector<std::string> shortNames;
+ std::string longName;
+
+ bool hasShortName( std::string const& shortName ) const {
+ return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end();
+ }
+ bool hasLongName( std::string const& _longName ) const {
+ return _longName == longName;
+ }
+ };
+ struct PositionalArgProperties {
+ PositionalArgProperties() : position( -1 ) {}
+ int position; // -1 means non-positional (floating)
+
+ bool isFixedPositional() const {
+ return position != -1;
+ }
+ };
+
+ template<typename ConfigT>
+ class CommandLine {
+
+ struct Arg : CommonArgProperties<ConfigT>, OptionArgProperties, PositionalArgProperties {
+ Arg() {}
+ Arg( Detail::BoundArgFunction<ConfigT> const& _boundField ) : CommonArgProperties<ConfigT>( _boundField ) {}
+
+ using CommonArgProperties<ConfigT>::placeholder; // !TBD
+
+ std::string dbgName() const {
+ if( !longName.empty() )
+ return "--" + longName;
+ if( !shortNames.empty() )
+ return "-" + shortNames[0];
+ return "positional args";
+ }
+ std::string commands() const {
+ std::ostringstream oss;
+ bool first = true;
+ std::vector<std::string>::const_iterator it = shortNames.begin(), itEnd = shortNames.end();
+ for(; it != itEnd; ++it ) {
+ if( first )
+ first = false;
+ else
+ oss << ", ";
+ oss << "-" << *it;
+ }
+ if( !longName.empty() ) {
+ if( !first )
+ oss << ", ";
+ oss << "--" << longName;
+ }
+ if( !placeholder.empty() )
+ oss << " <" << placeholder << ">";
+ return oss.str();
+ }
+ };
+
+ // NOTE: std::auto_ptr is deprecated in c++11/c++0x
+#if defined(__cplusplus) && __cplusplus > 199711L
+ typedef std::unique_ptr<Arg> ArgAutoPtr;
+#else
+ typedef std::auto_ptr<Arg> ArgAutoPtr;
+#endif
+
+ friend void addOptName( Arg& arg, std::string const& optName )
+ {
+ if( optName.empty() )
+ return;
+ if( Detail::startsWith( optName, "--" ) ) {
+ if( !arg.longName.empty() )
+ throw std::logic_error( "Only one long opt may be specified. '"
+ + arg.longName
+ + "' already specified, now attempting to add '"
+ + optName + "'" );
+ arg.longName = optName.substr( 2 );
+ }
+ else if( Detail::startsWith( optName, "-" ) )
+ arg.shortNames.push_back( optName.substr( 1 ) );
+ else
+ throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" );
+ }
+ friend void setPositionalArg( Arg& arg, int position )
+ {
+ arg.position = position;
+ }
+
+ class ArgBuilder {
+ public:
+ ArgBuilder( Arg* arg ) : m_arg( arg ) {}
+
+ // Bind a non-boolean data member (requires placeholder string)
+ template<typename C, typename M>
+ void bind( M C::* field, std::string const& placeholder ) {
+ m_arg->boundField = new Detail::BoundDataMember<C,M>( field );
+ m_arg->placeholder = placeholder;
+ }
+ // Bind a boolean data member (no placeholder required)
+ template<typename C>
+ void bind( bool C::* field ) {
+ m_arg->boundField = new Detail::BoundDataMember<C,bool>( field );
+ }
+
+ // Bind a method taking a single, non-boolean argument (requires a placeholder string)
+ template<typename C, typename M>
+ void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) {
+ m_arg->boundField = new Detail::BoundUnaryMethod<C,M>( unaryMethod );
+ m_arg->placeholder = placeholder;
+ }
+
+ // Bind a method taking a single, boolean argument (no placeholder string required)
+ template<typename C>
+ void bind( void (C::* unaryMethod)( bool ) ) {
+ m_arg->boundField = new Detail::BoundUnaryMethod<C,bool>( unaryMethod );
+ }
+
+ // Bind a method that takes no arguments (will be called if opt is present)
+ template<typename C>
+ void bind( void (C::* nullaryMethod)() ) {
+ m_arg->boundField = new Detail::BoundNullaryMethod<C>( nullaryMethod );
+ }
+
+ // Bind a free function taking a single argument - the object to operate on (no placeholder string required)
+ template<typename C>
+ void bind( void (* unaryFunction)( C& ) ) {
+ m_arg->boundField = new Detail::BoundUnaryFunction<C>( unaryFunction );
+ }
+
+ // Bind a free function taking a single argument - the object to operate on (requires a placeholder string)
+ template<typename C, typename T>
+ void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) {
+ m_arg->boundField = new Detail::BoundBinaryFunction<C, T>( binaryFunction );
+ m_arg->placeholder = placeholder;
+ }
+
+ ArgBuilder& describe( std::string const& description ) {
+ m_arg->description = description;
+ return *this;
+ }
+ ArgBuilder& detail( std::string const& detail ) {
+ m_arg->detail = detail;
+ return *this;
+ }
+
+ protected:
+ Arg* m_arg;
+ };
+
+ class OptBuilder : public ArgBuilder {
+ public:
+ OptBuilder( Arg* arg ) : ArgBuilder( arg ) {}
+ OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {}
+
+ OptBuilder& operator[]( std::string const& optName ) {
+ addOptName( *ArgBuilder::m_arg, optName );
+ return *this;
+ }
+ };
+
+ public:
+
+ CommandLine()
+ : m_boundProcessName( new Detail::NullBinder<ConfigT>() ),
+ m_highestSpecifiedArgPosition( 0 ),
+ m_throwOnUnrecognisedTokens( false )
+ {}
+ CommandLine( CommandLine const& other )
+ : m_boundProcessName( other.m_boundProcessName ),
+ m_options ( other.m_options ),
+ m_positionalArgs( other.m_positionalArgs ),
+ m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ),
+ m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens )
+ {
+ if( other.m_floatingArg.get() )
+ m_floatingArg.reset( new Arg( *other.m_floatingArg ) );
+ }
+
+ CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) {
+ m_throwOnUnrecognisedTokens = shouldThrow;
+ return *this;
+ }
+
+ OptBuilder operator[]( std::string const& optName ) {
+ m_options.push_back( Arg() );
+ addOptName( m_options.back(), optName );
+ OptBuilder builder( &m_options.back() );
+ return builder;
+ }
+
+ ArgBuilder operator[]( int position ) {
+ m_positionalArgs.insert( std::make_pair( position, Arg() ) );
+ if( position > m_highestSpecifiedArgPosition )
+ m_highestSpecifiedArgPosition = position;
+ setPositionalArg( m_positionalArgs[position], position );
+ ArgBuilder builder( &m_positionalArgs[position] );
+ return builder;
+ }
+
+ // Invoke this with the _ instance
+ ArgBuilder operator[]( UnpositionalTag ) {
+ if( m_floatingArg.get() )
+ throw std::logic_error( "Only one unpositional argument can be added" );
+ m_floatingArg.reset( new Arg() );
+ ArgBuilder builder( m_floatingArg.get() );
+ return builder;
+ }
+
+ template<typename C, typename M>
+ void bindProcessName( M C::* field ) {
+ m_boundProcessName = new Detail::BoundDataMember<C,M>( field );
+ }
+ template<typename C, typename M>
+ void bindProcessName( void (C::*_unaryMethod)( M ) ) {
+ m_boundProcessName = new Detail::BoundUnaryMethod<C,M>( _unaryMethod );
+ }
+
+ void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const {
+ typename std::vector<Arg>::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it;
+ std::size_t maxWidth = 0;
+ for( it = itBegin; it != itEnd; ++it )
+ maxWidth = (std::max)( maxWidth, it->commands().size() );
+
+ for( it = itBegin; it != itEnd; ++it ) {
+ Detail::Text usage( it->commands(), Detail::TextAttributes()
+ .setWidth( maxWidth+indent )
+ .setIndent( indent ) );
+ Detail::Text desc( it->description, Detail::TextAttributes()
+ .setWidth( width - maxWidth - 3 ) );
+
+ for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) {
+ std::string usageCol = i < usage.size() ? usage[i] : "";
+ os << usageCol;
+
+ if( i < desc.size() && !desc[i].empty() )
+ os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' )
+ << desc[i];
+ os << "\n";
+ }
+ }
+ }
+ std::string optUsage() const {
+ std::ostringstream oss;
+ optUsage( oss );
+ return oss.str();
+ }
+
+ void argSynopsis( std::ostream& os ) const {
+ for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) {
+ if( i > 1 )
+ os << " ";
+ typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find( i );
+ if( it != m_positionalArgs.end() )
+ os << "<" << it->second.placeholder << ">";
+ else if( m_floatingArg.get() )
+ os << "<" << m_floatingArg->placeholder << ">";
+ else
+ throw std::logic_error( "non consecutive positional arguments with no floating args" );
+ }
+ // !TBD No indication of mandatory args
+ if( m_floatingArg.get() ) {
+ if( m_highestSpecifiedArgPosition > 1 )
+ os << " ";
+ os << "[<" << m_floatingArg->placeholder << "> ...]";
+ }
+ }
+ std::string argSynopsis() const {
+ std::ostringstream oss;
+ argSynopsis( oss );
+ return oss.str();
+ }
+
+ void usage( std::ostream& os, std::string const& procName ) const {
+ validate();
+ os << "usage:\n " << procName << " ";
+ argSynopsis( os );
+ if( !m_options.empty() ) {
+ os << " [options]\n\nwhere options are: \n";
+ optUsage( os, 2 );
+ }
+ os << "\n";
+ }
+ std::string usage( std::string const& procName ) const {
+ std::ostringstream oss;
+ usage( oss, procName );
+ return oss.str();
+ }
+
+ ConfigT parse( int argc, char const * const * argv ) const {
+ ConfigT config;
+ parseInto( argc, argv, config );
+ return config;
+ }
+
+ std::vector<Parser::Token> parseInto( int argc, char const * const * argv, ConfigT& config ) const {
+ std::string processName = argv[0];
+ std::size_t lastSlash = processName.find_last_of( "/\\" );
+ if( lastSlash != std::string::npos )
+ processName = processName.substr( lastSlash+1 );
+ m_boundProcessName.set( config, processName );
+ std::vector<Parser::Token> tokens;
+ Parser parser;
+ parser.parseIntoTokens( argc, argv, tokens );
+ return populate( tokens, config );
+ }
+
+ std::vector<Parser::Token> populate( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
+ validate();
+ std::vector<Parser::Token> unusedTokens = populateOptions( tokens, config );
+ unusedTokens = populateFixedArgs( unusedTokens, config );
+ unusedTokens = populateFloatingArgs( unusedTokens, config );
+ return unusedTokens;
+ }
+
+ std::vector<Parser::Token> populateOptions( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
+ std::vector<Parser::Token> unusedTokens;
+ std::vector<std::string> errors;
+ for( std::size_t i = 0; i < tokens.size(); ++i ) {
+ Parser::Token const& token = tokens[i];
+ typename std::vector<Arg>::const_iterator it = m_options.begin(), itEnd = m_options.end();
+ for(; it != itEnd; ++it ) {
+ Arg const& arg = *it;
+
+ try {
+ if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) ||
+ ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) {
+ if( arg.takesArg() ) {
+ if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional )
+ errors.push_back( "Expected argument to option: " + token.data );
+ else
+ arg.boundField.set( config, tokens[++i].data );
+ }
+ else {
+ arg.boundField.setFlag( config );
+ }
+ break;
+ }
+ }
+ catch( std::exception& ex ) {
+ errors.push_back( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" );
+ }
+ }
+ if( it == itEnd ) {
+ if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens )
+ unusedTokens.push_back( token );
+ else if( errors.empty() && m_throwOnUnrecognisedTokens )
+ errors.push_back( "unrecognised option: " + token.data );
+ }
+ }
+ if( !errors.empty() ) {
+ std::ostringstream oss;
+ for( std::vector<std::string>::const_iterator it = errors.begin(), itEnd = errors.end();
+ it != itEnd;
+ ++it ) {
+ if( it != errors.begin() )
+ oss << "\n";
+ oss << *it;
+ }
+ throw std::runtime_error( oss.str() );
+ }
+ return unusedTokens;
+ }
+ std::vector<Parser::Token> populateFixedArgs( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
+ std::vector<Parser::Token> unusedTokens;
+ int position = 1;
+ for( std::size_t i = 0; i < tokens.size(); ++i ) {
+ Parser::Token const& token = tokens[i];
+ typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find( position );
+ if( it != m_positionalArgs.end() )
+ it->second.boundField.set( config, token.data );
+ else
+ unusedTokens.push_back( token );
+ if( token.type == Parser::Token::Positional )
+ position++;
+ }
+ return unusedTokens;
+ }
+ std::vector<Parser::Token> populateFloatingArgs( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
+ if( !m_floatingArg.get() )
+ return tokens;
+ std::vector<Parser::Token> unusedTokens;
+ for( std::size_t i = 0; i < tokens.size(); ++i ) {
+ Parser::Token const& token = tokens[i];
+ if( token.type == Parser::Token::Positional )
+ m_floatingArg->boundField.set( config, token.data );
+ else
+ unusedTokens.push_back( token );
+ }
+ return unusedTokens;
+ }
+
+ void validate() const
+ {
+ if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() )
+ throw std::logic_error( "No options or arguments specified" );
+
+ for( typename std::vector<Arg>::const_iterator it = m_options.begin(),
+ itEnd = m_options.end();
+ it != itEnd; ++it )
+ it->validate();
+ }
+
+ private:
+ Detail::BoundArgFunction<ConfigT> m_boundProcessName;
+ std::vector<Arg> m_options;
+ std::map<int, Arg> m_positionalArgs;
+ ArgAutoPtr m_floatingArg;
+ int m_highestSpecifiedArgPosition;
+ bool m_throwOnUnrecognisedTokens;
+ };
+
+} // end namespace Clara
+
+STITCH_CLARA_CLOSE_NAMESPACE
+#undef STITCH_CLARA_OPEN_NAMESPACE
+#undef STITCH_CLARA_CLOSE_NAMESPACE
+
+#endif // TWOBLUECUBES_CLARA_H_INCLUDED
+#undef STITCH_CLARA_OPEN_NAMESPACE
+
+// Restore Clara's value for console width, if present
+#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
+#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
+#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
+#endif
+
+#include <fstream>
+
+namespace Catch {
+
+ inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; }
+ inline void abortAfterX( ConfigData& config, int x ) {
+ if( x < 1 )
+ throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" );
+ config.abortAfter = x;
+ }
+ inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); }
+
+ inline void addWarning( ConfigData& config, std::string const& _warning ) {
+ if( _warning == "NoAssertions" )
+ config.warnings = static_cast<WarnAbout::What>( config.warnings | WarnAbout::NoAssertions );
+ else
+ throw std::runtime_error( "Unrecognised warning: '" + _warning + "'" );
+ }
+ inline void setOrder( ConfigData& config, std::string const& order ) {
+ if( startsWith( "declared", order ) )
+ config.runOrder = RunTests::InDeclarationOrder;
+ else if( startsWith( "lexical", order ) )
+ config.runOrder = RunTests::InLexicographicalOrder;
+ else if( startsWith( "random", order ) )
+ config.runOrder = RunTests::InRandomOrder;
+ else
+ throw std::runtime_error( "Unrecognised ordering: '" + order + "'" );
+ }
+ inline void setRngSeed( ConfigData& config, std::string const& seed ) {
+ if( seed == "time" ) {
+ config.rngSeed = static_cast<unsigned int>( std::time(0) );
+ }
+ else {
+ std::stringstream ss;
+ ss << seed;
+ ss >> config.rngSeed;
+ if( ss.fail() )
+ throw std::runtime_error( "Argment to --rng-seed should be the word 'time' or a number" );
+ }
+ }
+ inline void setVerbosity( ConfigData& config, int level ) {
+ // !TBD: accept strings?
+ config.verbosity = static_cast<Verbosity::Level>( level );
+ }
+ inline void setShowDurations( ConfigData& config, bool _showDurations ) {
+ config.showDurations = _showDurations
+ ? ShowDurations::Always
+ : ShowDurations::Never;
+ }
+ inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) {
+ std::ifstream f( _filename.c_str() );
+ if( !f.is_open() )
+ throw std::domain_error( "Unable to load input file: " + _filename );
+
+ std::string line;
+ while( std::getline( f, line ) ) {
+ line = trim(line);
+ if( !line.empty() && !startsWith( line, "#" ) )
+ addTestOrTags( config, "\"" + line + "\"," );
+ }
+ }
+
+ inline Clara::CommandLine<ConfigData> makeCommandLineParser() {
+
+ using namespace Clara;
+ CommandLine<ConfigData> cli;
+
+ cli.bindProcessName( &ConfigData::processName );
+
+ cli["-?"]["-h"]["--help"]
+ .describe( "display usage information" )
+ .bind( &ConfigData::showHelp );
+
+ cli["-l"]["--list-tests"]
+ .describe( "list all/matching test cases" )
+ .bind( &ConfigData::listTests );
+
+ cli["-t"]["--list-tags"]
+ .describe( "list all/matching tags" )
+ .bind( &ConfigData::listTags );
+
+ cli["-s"]["--success"]
+ .describe( "include successful tests in output" )
+ .bind( &ConfigData::showSuccessfulTests );
+
+ cli["-b"]["--break"]
+ .describe( "break into debugger on failure" )
+ .bind( &ConfigData::shouldDebugBreak );
+
+ cli["-e"]["--nothrow"]
+ .describe( "skip exception tests" )
+ .bind( &ConfigData::noThrow );
+
+ cli["-i"]["--invisibles"]
+ .describe( "show invisibles (tabs, newlines)" )
+ .bind( &ConfigData::showInvisibles );
+
+ cli["-o"]["--out"]
+ .describe( "output filename" )
+ .bind( &ConfigData::outputFilename, "filename" );
+
+ cli["-r"]["--reporter"]
+// .placeholder( "name[:filename]" )
+ .describe( "reporter to use (defaults to console)" )
+ .bind( &ConfigData::reporterName, "name" );
+
+ cli["-n"]["--name"]
+ .describe( "suite name" )
+ .bind( &ConfigData::name, "name" );
+
+ cli["-a"]["--abort"]
+ .describe( "abort at first failure" )
+ .bind( &abortAfterFirst );
+
+ cli["-x"]["--abortx"]
+ .describe( "abort after x failures" )
+ .bind( &abortAfterX, "no. failures" );
+
+ cli["-w"]["--warn"]
+ .describe( "enable warnings" )
+ .bind( &addWarning, "warning name" );
+
+// - needs updating if reinstated
+// cli.into( &setVerbosity )
+// .describe( "level of verbosity (0=no output)" )
+// .shortOpt( "v")
+// .longOpt( "verbosity" )
+// .placeholder( "level" );
+
+ cli[_]
+ .describe( "which test or tests to use" )
+ .bind( &addTestOrTags, "test name, pattern or tags" );
+
+ cli["-d"]["--durations"]
+ .describe( "show test durations" )
+ .bind( &setShowDurations, "yes/no" );
+
+ cli["-f"]["--input-file"]
+ .describe( "load test names to run from a file" )
+ .bind( &loadTestNamesFromFile, "filename" );
+
+ // Less common commands which don't have a short form
+ cli["--list-test-names-only"]
+ .describe( "list all/matching test cases names only" )
+ .bind( &ConfigData::listTestNamesOnly );
+
+ cli["--list-reporters"]
+ .describe( "list all reporters" )
+ .bind( &ConfigData::listReporters );
+
+ cli["--order"]
+ .describe( "test case order (defaults to decl)" )
+ .bind( &setOrder, "decl|lex|rand" );
+
+ cli["--rng-seed"]
+ .describe( "set a specific seed for random numbers" )
+ .bind( &setRngSeed, "'time'|number" );
+
+ cli["--force-colour"]
+ .describe( "force colourised output" )
+ .bind( &ConfigData::forceColour );
+
+ return cli;
+ }
+
+} // end namespace Catch
+
+// #included from: internal/catch_list.hpp
+#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED
+
+// #included from: catch_text.h
+#define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED
+
+#define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH
+
+#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch
+// #included from: ../external/tbc_text_format.h
+// Only use header guard if we are not using an outer namespace
+#ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
+# ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED
+# ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
+# define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
+# endif
+# else
+# define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED
+# endif
+#endif
+#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
+#include <string>
+#include <vector>
+#include <sstream>
+
+// Use optional outer namespace
+#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
+namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE {
+#endif
+
+namespace Tbc {
+
+#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH
+ const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH;
+#else
+ const unsigned int consoleWidth = 80;
+#endif
+
+ struct TextAttributes {
+ TextAttributes()
+ : initialIndent( std::string::npos ),
+ indent( 0 ),
+ width( consoleWidth-1 ),
+ tabChar( '\t' )
+ {}
+
+ TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; }
+ TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; }
+ TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; }
+ TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; }
+
+ std::size_t initialIndent; // indent of first line, or npos
+ std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos
+ std::size_t width; // maximum width of text, including indent. Longer text will wrap
+ char tabChar; // If this char is seen the indent is changed to current pos
+ };
+
+ class Text {
+ public:
+ Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() )
+ : attr( _attr )
+ {
+ std::string wrappableChars = " [({.,/|\\-";
+ std::size_t indent = _attr.initialIndent != std::string::npos
+ ? _attr.initialIndent
+ : _attr.indent;
+ std::string remainder = _str;
+
+ while( !remainder.empty() ) {
+ if( lines.size() >= 1000 ) {
+ lines.push_back( "... message truncated due to excessive size" );
+ return;
+ }
+ std::size_t tabPos = std::string::npos;
+ std::size_t width = (std::min)( remainder.size(), _attr.width - indent );
+ std::size_t pos = remainder.find_first_of( '\n' );
+ if( pos <= width ) {
+ width = pos;
+ }
+ pos = remainder.find_last_of( _attr.tabChar, width );
+ if( pos != std::string::npos ) {
+ tabPos = pos;
+ if( remainder[width] == '\n' )
+ width--;
+ remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 );
+ }
+
+ if( width == remainder.size() ) {
+ spliceLine( indent, remainder, width );
+ }
+ else if( remainder[width] == '\n' ) {
+ spliceLine( indent, remainder, width );
+ if( width <= 1 || remainder.size() != 1 )
+ remainder = remainder.substr( 1 );
+ indent = _attr.indent;
+ }
+ else {
+ pos = remainder.find_last_of( wrappableChars, width );
+ if( pos != std::string::npos && pos > 0 ) {
+ spliceLine( indent, remainder, pos );
+ if( remainder[0] == ' ' )
+ remainder = remainder.substr( 1 );
+ }
+ else {
+ spliceLine( indent, remainder, width-1 );
+ lines.back() += "-";
+ }
+ if( lines.size() == 1 )
+ indent = _attr.indent;
+ if( tabPos != std::string::npos )
+ indent += tabPos;
+ }
+ }
+ }
+
+ void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) {
+ lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) );
+ _remainder = _remainder.substr( _pos );
+ }
+
+ typedef std::vector<std::string>::const_iterator const_iterator;
+
+ const_iterator begin() const { return lines.begin(); }
+ const_iterator end() const { return lines.end(); }
+ std::string const& last() const { return lines.back(); }
+ std::size_t size() const { return lines.size(); }
+ std::string const& operator[]( std::size_t _index ) const { return lines[_index]; }
+ std::string toString() const {
+ std::ostringstream oss;
+ oss << *this;
+ return oss.str();
+ }
+
+ inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) {
+ for( Text::const_iterator it = _text.begin(), itEnd = _text.end();
+ it != itEnd; ++it ) {
+ if( it != _text.begin() )
+ _stream << "\n";
+ _stream << *it;
+ }
+ return _stream;
+ }
+
+ private:
+ std::string str;
+ TextAttributes attr;
+ std::vector<std::string> lines;
+ };
+
+} // end namespace Tbc
+
+#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
+} // end outer namespace
+#endif
+
+#endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
+#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
+
+namespace Catch {
+ using Tbc::Text;
+ using Tbc::TextAttributes;
+}
+
+// #included from: catch_console_colour.hpp
+#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED
+
+namespace Catch {
+
+ struct Colour {
+ enum Code {
+ None = 0,
+
+ White,
+ Red,
+ Green,
+ Blue,
+ Cyan,
+ Yellow,
+ Grey,
+
+ Bright = 0x10,
+
+ BrightRed = Bright | Red,
+ BrightGreen = Bright | Green,
+ LightGrey = Bright | Grey,
+ BrightWhite = Bright | White,
+
+ // By intention
+ FileName = LightGrey,
+ Warning = Yellow,
+ ResultError = BrightRed,
+ ResultSuccess = BrightGreen,
+ ResultExpectedFailure = Warning,
+
+ Error = BrightRed,
+ Success = Green,
+
+ OriginalExpression = Cyan,
+ ReconstructedExpression = Yellow,
+
+ SecondaryText = LightGrey,
+ Headers = White
+ };
+
+ // Use constructed object for RAII guard
+ Colour( Code _colourCode );
+ Colour( Colour const& other );
+ ~Colour();
+
+ // Use static method for one-shot changes
+ static void use( Code _colourCode );
+
+ private:
+ bool m_moved;
+ };
+
+ inline std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; }
+
+} // end namespace Catch
+
+// #included from: catch_interfaces_reporter.h
+#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED
+
+#include <string>
+#include <ostream>
+#include <map>
+#include <assert.h>
+
+namespace Catch
+{
+ struct ReporterConfig {
+ explicit ReporterConfig( Ptr<IConfig> const& _fullConfig )
+ : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {}
+
+ ReporterConfig( Ptr<IConfig> const& _fullConfig, std::ostream& _stream )
+ : m_stream( &_stream ), m_fullConfig( _fullConfig ) {}
+
+ std::ostream& stream() const { return *m_stream; }
+ Ptr<IConfig> fullConfig() const { return m_fullConfig; }
+
+ private:
+ std::ostream* m_stream;
+ Ptr<IConfig> m_fullConfig;
+ };
+
+ struct ReporterPreferences {
+ ReporterPreferences()
+ : shouldRedirectStdOut( false )
+ {}
+
+ bool shouldRedirectStdOut;
+ };
+
+ template<typename T>
+ struct LazyStat : Option<T> {
+ LazyStat() : used( false ) {}
+ LazyStat& operator=( T const& _value ) {
+ Option<T>::operator=( _value );
+ used = false;
+ return *this;
+ }
+ void reset() {
+ Option<T>::reset();
+ used = false;
+ }
+ bool used;
+ };
+
+ struct TestRunInfo {
+ TestRunInfo( std::string const& _name ) : name( _name ) {}
+ std::string name;
+ };
+ struct GroupInfo {
+ GroupInfo( std::string const& _name,
+ std::size_t _groupIndex,
+ std::size_t _groupsCount )
+ : name( _name ),
+ groupIndex( _groupIndex ),
+ groupsCounts( _groupsCount )
+ {}
+
+ std::string name;
+ std::size_t groupIndex;
+ std::size_t groupsCounts;
+ };
+
+ struct AssertionStats {
+ AssertionStats( AssertionResult const& _assertionResult,
+ std::vector<MessageInfo> const& _infoMessages,
+ Totals const& _totals )
+ : assertionResult( _assertionResult ),
+ infoMessages( _infoMessages ),
+ totals( _totals )
+ {
+ if( assertionResult.hasMessage() ) {
+ // Copy message into messages list.
+ // !TBD This should have been done earlier, somewhere
+ MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() );
+ builder << assertionResult.getMessage();
+ builder.m_info.message = builder.m_stream.str();
+
+ infoMessages.push_back( builder.m_info );
+ }
+ }
+ virtual ~AssertionStats();
+
+# ifdef CATCH_CPP11_OR_GREATER
+ AssertionStats( AssertionStats const& ) = default;
+ AssertionStats( AssertionStats && ) = default;
+ AssertionStats& operator = ( AssertionStats const& ) = default;
+ AssertionStats& operator = ( AssertionStats && ) = default;
+# endif
+
+ AssertionResult assertionResult;
+ std::vector<MessageInfo> infoMessages;
+ Totals totals;
+ };
+
+ struct SectionStats {
+ SectionStats( SectionInfo const& _sectionInfo,
+ Counts const& _assertions,
+ double _durationInSeconds,
+ bool _missingAssertions )
+ : sectionInfo( _sectionInfo ),
+ assertions( _assertions ),
+ durationInSeconds( _durationInSeconds ),
+ missingAssertions( _missingAssertions )
+ {}
+ virtual ~SectionStats();
+# ifdef CATCH_CPP11_OR_GREATER
+ SectionStats( SectionStats const& ) = default;
+ SectionStats( SectionStats && ) = default;
+ SectionStats& operator = ( SectionStats const& ) = default;
+ SectionStats& operator = ( SectionStats && ) = default;
+# endif
+
+ SectionInfo sectionInfo;
+ Counts assertions;
+ double durationInSeconds;
+ bool missingAssertions;
+ };
+
+ struct TestCaseStats {
+ TestCaseStats( TestCaseInfo const& _testInfo,
+ Totals const& _totals,
+ std::string const& _stdOut,
+ std::string const& _stdErr,
+ bool _aborting )
+ : testInfo( _testInfo ),
+ totals( _totals ),
+ stdOut( _stdOut ),
+ stdErr( _stdErr ),
+ aborting( _aborting )
+ {}
+ virtual ~TestCaseStats();
+
+# ifdef CATCH_CPP11_OR_GREATER
+ TestCaseStats( TestCaseStats const& ) = default;
+ TestCaseStats( TestCaseStats && ) = default;
+ TestCaseStats& operator = ( TestCaseStats const& ) = default;
+ TestCaseStats& operator = ( TestCaseStats && ) = default;
+# endif
+
+ TestCaseInfo testInfo;
+ Totals totals;
+ std::string stdOut;
+ std::string stdErr;
+ bool aborting;
+ };
+
+ struct TestGroupStats {
+ TestGroupStats( GroupInfo const& _groupInfo,
+ Totals const& _totals,
+ bool _aborting )
+ : groupInfo( _groupInfo ),
+ totals( _totals ),
+ aborting( _aborting )
+ {}
+ TestGroupStats( GroupInfo const& _groupInfo )
+ : groupInfo( _groupInfo ),
+ aborting( false )
+ {}
+ virtual ~TestGroupStats();
+
+# ifdef CATCH_CPP11_OR_GREATER
+ TestGroupStats( TestGroupStats const& ) = default;
+ TestGroupStats( TestGroupStats && ) = default;
+ TestGroupStats& operator = ( TestGroupStats const& ) = default;
+ TestGroupStats& operator = ( TestGroupStats && ) = default;
+# endif
+
+ GroupInfo groupInfo;
+ Totals totals;
+ bool aborting;
+ };
+
+ struct TestRunStats {
+ TestRunStats( TestRunInfo const& _runInfo,
+ Totals const& _totals,
+ bool _aborting )
+ : runInfo( _runInfo ),
+ totals( _totals ),
+ aborting( _aborting )
+ {}
+ virtual ~TestRunStats();
+
+# ifndef CATCH_CPP11_OR_GREATER
+ TestRunStats( TestRunStats const& _other )
+ : runInfo( _other.runInfo ),
+ totals( _other.totals ),
+ aborting( _other.aborting )
+ {}
+# else
+ TestRunStats( TestRunStats const& ) = default;
+ TestRunStats( TestRunStats && ) = default;
+ TestRunStats& operator = ( TestRunStats const& ) = default;
+ TestRunStats& operator = ( TestRunStats && ) = default;
+# endif
+
+ TestRunInfo runInfo;
+ Totals totals;
+ bool aborting;
+ };
+
+ struct IStreamingReporter : IShared {
+ virtual ~IStreamingReporter();
+
+ // Implementing class must also provide the following static method:
+ // static std::string getDescription();
+
+ virtual ReporterPreferences getPreferences() const = 0;
+
+ virtual void noMatchingTestCases( std::string const& spec ) = 0;
+
+ virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0;
+ virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0;
+
+ virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0;
+ virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0;
+
+ virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0;
+
+ // The return value indicates if the messages buffer should be cleared:
+ virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0;
+ virtual void sectionEnded( SectionStats const& sectionStats ) = 0;
+ virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0;
+ virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0;
+ virtual void testRunEnded( TestRunStats const& testRunStats ) = 0;
+
+ virtual void skipTest( TestCaseInfo const& testInfo ) = 0;
+ };
+
+ struct IReporterFactory {
+ virtual ~IReporterFactory();
+ virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0;
+ virtual std::string getDescription() const = 0;
+ };
+
+ struct IReporterRegistry {
+ typedef std::map<std::string, IReporterFactory*> FactoryMap;
+
+ virtual ~IReporterRegistry();
+ virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig> const& config ) const = 0;
+ virtual FactoryMap const& getFactories() const = 0;
+ };
+
+}
+
+#include <limits>
+#include <algorithm>
+
+namespace Catch {
+
+ inline std::size_t listTests( Config const& config ) {
+
+ TestSpec testSpec = config.testSpec();
+ if( config.testSpec().hasFilters() )
+ Catch::cout() << "Matching test cases:\n";
+ else {
+ Catch::cout() << "All available test cases:\n";
+ testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec();
+ }
+
+ std::size_t matchedTests = 0;
+ TextAttributes nameAttr, tagsAttr;
+ nameAttr.setInitialIndent( 2 ).setIndent( 4 );
+ tagsAttr.setIndent( 6 );
+
+ std::vector<TestCase> matchedTestCases;
+ getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases );
+ for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
+ it != itEnd;
+ ++it ) {
+ matchedTests++;
+ TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
+ Colour::Code colour = testCaseInfo.isHidden()
+ ? Colour::SecondaryText
+ : Colour::None;
+ Colour colourGuard( colour );
+
+ Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl;
+ if( !testCaseInfo.tags.empty() )
+ Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl;
+ }
+
+ if( !config.testSpec().hasFilters() )
+ Catch::cout() << pluralise( matchedTests, "test case" ) << "\n" << std::endl;
+ else
+ Catch::cout() << pluralise( matchedTests, "matching test case" ) << "\n" << std::endl;
+ return matchedTests;
+ }
+
+ inline std::size_t listTestsNamesOnly( Config const& config ) {
+ TestSpec testSpec = config.testSpec();
+ if( !config.testSpec().hasFilters() )
+ testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec();
+ std::size_t matchedTests = 0;
+ std::vector<TestCase> matchedTestCases;
+ getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases );
+ for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
+ it != itEnd;
+ ++it ) {
+ matchedTests++;
+ TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
+ Catch::cout() << testCaseInfo.name << std::endl;
+ }
+ return matchedTests;
+ }
+
+ struct TagInfo {
+ TagInfo() : count ( 0 ) {}
+ void add( std::string const& spelling ) {
+ ++count;
+ spellings.insert( spelling );
+ }
+ std::string all() const {
+ std::string out;
+ for( std::set<std::string>::const_iterator it = spellings.begin(), itEnd = spellings.end();
+ it != itEnd;
+ ++it )
+ out += "[" + *it + "]";
+ return out;
+ }
+ std::set<std::string> spellings;
+ std::size_t count;
+ };
+
+ inline std::size_t listTags( Config const& config ) {
+ TestSpec testSpec = config.testSpec();
+ if( config.testSpec().hasFilters() )
+ Catch::cout() << "Tags for matching test cases:\n";
+ else {
+ Catch::cout() << "All available tags:\n";
+ testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec();
+ }
+
+ std::map<std::string, TagInfo> tagCounts;
+
+ std::vector<TestCase> matchedTestCases;
+ getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases );
+ for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
+ it != itEnd;
+ ++it ) {
+ for( std::set<std::string>::const_iterator tagIt = it->getTestCaseInfo().tags.begin(),
+ tagItEnd = it->getTestCaseInfo().tags.end();
+ tagIt != tagItEnd;
+ ++tagIt ) {
+ std::string tagName = *tagIt;
+ std::string lcaseTagName = toLower( tagName );
+ std::map<std::string, TagInfo>::iterator countIt = tagCounts.find( lcaseTagName );
+ if( countIt == tagCounts.end() )
+ countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first;
+ countIt->second.add( tagName );
+ }
+ }
+
+ for( std::map<std::string, TagInfo>::const_iterator countIt = tagCounts.begin(),
+ countItEnd = tagCounts.end();
+ countIt != countItEnd;
+ ++countIt ) {
+ std::ostringstream oss;
+ oss << " " << std::setw(2) << countIt->second.count << " ";
+ Text wrapper( countIt->second.all(), TextAttributes()
+ .setInitialIndent( 0 )
+ .setIndent( oss.str().size() )
+ .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) );
+ Catch::cout() << oss.str() << wrapper << "\n";
+ }
+ Catch::cout() << pluralise( tagCounts.size(), "tag" ) << "\n" << std::endl;
+ return tagCounts.size();
+ }
+
+ inline std::size_t listReporters( Config const& /*config*/ ) {
+ Catch::cout() << "Available reporters:\n";
+ IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories();
+ IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it;
+ std::size_t maxNameLen = 0;
+ for(it = itBegin; it != itEnd; ++it )
+ maxNameLen = (std::max)( maxNameLen, it->first.size() );
+
+ for(it = itBegin; it != itEnd; ++it ) {
+ Text wrapper( it->second->getDescription(), TextAttributes()
+ .setInitialIndent( 0 )
+ .setIndent( 7+maxNameLen )
+ .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) );
+ Catch::cout() << " "
+ << it->first
+ << ":"
+ << std::string( maxNameLen - it->first.size() + 2, ' ' )
+ << wrapper << "\n";
+ }
+ Catch::cout() << std::endl;
+ return factories.size();
+ }
+
+ inline Option<std::size_t> list( Config const& config ) {
+ Option<std::size_t> listedCount;
+ if( config.listTests() )
+ listedCount = listedCount.valueOr(0) + listTests( config );
+ if( config.listTestNamesOnly() )
+ listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config );
+ if( config.listTags() )
+ listedCount = listedCount.valueOr(0) + listTags( config );
+ if( config.listReporters() )
+ listedCount = listedCount.valueOr(0) + listReporters( config );
+ return listedCount;
+ }
+
+} // end namespace Catch
+
+// #included from: internal/catch_runner_impl.hpp
+#define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED
+
+// #included from: catch_test_case_tracker.hpp
+#define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED
+
+#include <map>
+#include <string>
+#include <assert.h>
+
+namespace Catch {
+namespace SectionTracking {
+
+ class TrackedSection {
+
+ typedef std::map<std::string, TrackedSection> TrackedSections;
+
+ public:
+ enum RunState {
+ NotStarted,
+ Executing,
+ ExecutingChildren,
+ Completed
+ };
+
+ TrackedSection( std::string const& name, TrackedSection* parent )
+ : m_name( name ), m_runState( NotStarted ), m_parent( parent )
+ {}
+
+ RunState runState() const { return m_runState; }
+
+ TrackedSection* findChild( std::string const& childName ) {
+ TrackedSections::iterator it = m_children.find( childName );
+ return it != m_children.end()
+ ? &it->second
+ : NULL;
+ }
+ TrackedSection* acquireChild( std::string const& childName ) {
+ if( TrackedSection* child = findChild( childName ) )
+ return child;
+ m_children.insert( std::make_pair( childName, TrackedSection( childName, this ) ) );
+ return findChild( childName );
+ }
+ void enter() {
+ if( m_runState == NotStarted )
+ m_runState = Executing;
+ }
+ void leave() {
+ for( TrackedSections::const_iterator it = m_children.begin(), itEnd = m_children.end();
+ it != itEnd;
+ ++it )
+ if( it->second.runState() != Completed ) {
+ m_runState = ExecutingChildren;
+ return;
+ }
+ m_runState = Completed;
+ }
+ TrackedSection* getParent() {
+ return m_parent;
+ }
+ bool hasChildren() const {
+ return !m_children.empty();
+ }
+
+ private:
+ std::string m_name;
+ RunState m_runState;
+ TrackedSections m_children;
+ TrackedSection* m_parent;
+
+ };
+
+ class TestCaseTracker {
+ public:
+ TestCaseTracker( std::string const& testCaseName )
+ : m_testCase( testCaseName, NULL ),
+ m_currentSection( &m_testCase ),
+ m_completedASectionThisRun( false )
+ {}
+
+ bool enterSection( std::string const& name ) {
+ TrackedSection* child = m_currentSection->acquireChild( name );
+ if( m_completedASectionThisRun || child->runState() == TrackedSection::Completed )
+ return false;
+
+ m_currentSection = child;
+ m_currentSection->enter();
+ return true;
+ }
+ void leaveSection() {
+ m_currentSection->leave();
+ m_currentSection = m_currentSection->getParent();
+ assert( m_currentSection != NULL );
+ m_completedASectionThisRun = true;
+ }
+
+ bool currentSectionHasChildren() const {
+ return m_currentSection->hasChildren();
+ }
+ bool isCompleted() const {
+ return m_testCase.runState() == TrackedSection::Completed;
+ }
+
+ class Guard {
+ public:
+ Guard( TestCaseTracker& tracker ) : m_tracker( tracker ) {
+ m_tracker.enterTestCase();
+ }
+ ~Guard() {
+ m_tracker.leaveTestCase();
+ }
+ private:
+ Guard( Guard const& );
+ void operator = ( Guard const& );
+ TestCaseTracker& m_tracker;
+ };
+
+ private:
+ void enterTestCase() {
+ m_currentSection = &m_testCase;
+ m_completedASectionThisRun = false;
+ m_testCase.enter();
+ }
+ void leaveTestCase() {
+ m_testCase.leave();
+ }
+
+ TrackedSection m_testCase;
+ TrackedSection* m_currentSection;
+ bool m_completedASectionThisRun;
+ };
+
+} // namespace SectionTracking
+
+using SectionTracking::TestCaseTracker;
+
+} // namespace Catch
+
+// #included from: catch_fatal_condition.hpp
+#define TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED
+
+namespace Catch {
+
+ // Report the error condition then exit the process
+ inline void fatal( std::string const& message, int exitCode ) {
+ IContext& context = Catch::getCurrentContext();
+ IResultCapture* resultCapture = context.getResultCapture();
+ resultCapture->handleFatalErrorCondition( message );
+
+ if( Catch::alwaysTrue() ) // avoids "no return" warnings
+ exit( exitCode );
+ }
+
+} // namespace Catch
+
+#if defined ( CATCH_PLATFORM_WINDOWS ) /////////////////////////////////////////
+
+namespace Catch {
+
+ struct FatalConditionHandler {
+ void reset() {}
+ };
+
+} // namespace Catch
+
+#else // Not Windows - assumed to be POSIX compatible //////////////////////////
+
+#include <signal.h>
+
+namespace Catch {
+
+ struct SignalDefs { int id; const char* name; };
+ extern SignalDefs signalDefs[];
+ SignalDefs signalDefs[] = {
+ { SIGINT, "SIGINT - Terminal interrupt signal" },
+ { SIGILL, "SIGILL - Illegal instruction signal" },
+ { SIGFPE, "SIGFPE - Floating point error signal" },
+ { SIGSEGV, "SIGSEGV - Segmentation violation signal" },
+ { SIGTERM, "SIGTERM - Termination request signal" },
+ { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" }
+ };
+
+ struct FatalConditionHandler {
+
+ static void handleSignal( int sig ) {
+ for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i )
+ if( sig == signalDefs[i].id )
+ fatal( signalDefs[i].name, -sig );
+ fatal( "<unknown signal>", -sig );
+ }
+
+ FatalConditionHandler() : m_isSet( true ) {
+ for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i )
+ signal( signalDefs[i].id, handleSignal );
+ }
+ ~FatalConditionHandler() {
+ reset();
+ }
+ void reset() {
+ if( m_isSet ) {
+ for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i )
+ signal( signalDefs[i].id, SIG_DFL );
+ m_isSet = false;
+ }
+ }
+
+ bool m_isSet;
+ };
+
+} // namespace Catch
+
+#endif // not Windows
+
+#include <set>
+#include <string>
+
+namespace Catch {
+
+ class StreamRedirect {
+
+ public:
+ StreamRedirect( std::ostream& stream, std::string& targetString )
+ : m_stream( stream ),
+ m_prevBuf( stream.rdbuf() ),
+ m_targetString( targetString )
+ {
+ stream.rdbuf( m_oss.rdbuf() );
+ }
+
+ ~StreamRedirect() {
+ m_targetString += m_oss.str();
+ m_stream.rdbuf( m_prevBuf );
+ }
+
+ private:
+ std::ostream& m_stream;
+ std::streambuf* m_prevBuf;
+ std::ostringstream m_oss;
+ std::string& m_targetString;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ class RunContext : public IResultCapture, public IRunner {
+
+ RunContext( RunContext const& );
+ void operator =( RunContext const& );
+
+ public:
+
+ explicit RunContext( Ptr<IConfig const> const& config, Ptr<IStreamingReporter> const& reporter )
+ : m_runInfo( config->name() ),
+ m_context( getCurrentMutableContext() ),
+ m_activeTestCase( NULL ),
+ m_config( config ),
+ m_reporter( reporter ),
+ m_prevRunner( m_context.getRunner() ),
+ m_prevResultCapture( m_context.getResultCapture() ),
+ m_prevConfig( m_context.getConfig() )
+ {
+ m_context.setRunner( this );
+ m_context.setConfig( m_config );
+ m_context.setResultCapture( this );
+ m_reporter->testRunStarting( m_runInfo );
+ }
+
+ virtual ~RunContext() {
+ m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) );
+ m_context.setRunner( m_prevRunner );
+ m_context.setConfig( NULL );
+ m_context.setResultCapture( m_prevResultCapture );
+ m_context.setConfig( m_prevConfig );
+ }
+
+ void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) {
+ m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) );
+ }
+ void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) {
+ m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) );
+ }
+
+ Totals runTest( TestCase const& testCase ) {
+ Totals prevTotals = m_totals;
+
+ std::string redirectedCout;
+ std::string redirectedCerr;
+
+ TestCaseInfo testInfo = testCase.getTestCaseInfo();
+
+ m_reporter->testCaseStarting( testInfo );
+
+ m_activeTestCase = &testCase;
+ m_testCaseTracker = TestCaseTracker( testInfo.name );
+
+ do {
+ do {
+ runCurrentTest( redirectedCout, redirectedCerr );
+ }
+ while( !m_testCaseTracker->isCompleted() && !aborting() );
+ }
+ while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() );
+
+ Totals deltaTotals = m_totals.delta( prevTotals );
+ m_totals.testCases += deltaTotals.testCases;
+ m_reporter->testCaseEnded( TestCaseStats( testInfo,
+ deltaTotals,
+ redirectedCout,
+ redirectedCerr,
+ aborting() ) );
+
+ m_activeTestCase = NULL;
+ m_testCaseTracker.reset();
+
+ return deltaTotals;
+ }
+
+ Ptr<IConfig const> config() const {
+ return m_config;
+ }
+
+ private: // IResultCapture
+
+ virtual void assertionEnded( AssertionResult const& result ) {
+ if( result.getResultType() == ResultWas::Ok ) {
+ m_totals.assertions.passed++;
+ }
+ else if( !result.isOk() ) {
+ m_totals.assertions.failed++;
+ }
+
+ if( m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) ) )
+ m_messages.clear();
+
+ // Reset working state
+ m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition );
+ m_lastResult = result;
+ }
+
+ virtual bool sectionStarted (
+ SectionInfo const& sectionInfo,
+ Counts& assertions
+ )
+ {
+ std::ostringstream oss;
+ oss << sectionInfo.name << "@" << sectionInfo.lineInfo;
+
+ if( !m_testCaseTracker->enterSection( oss.str() ) )
+ return false;
+
+ m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo;
+
+ m_reporter->sectionStarting( sectionInfo );
+
+ assertions = m_totals.assertions;
+
+ return true;
+ }
+ bool testForMissingAssertions( Counts& assertions ) {
+ if( assertions.total() != 0 ||
+ !m_config->warnAboutMissingAssertions() ||
+ m_testCaseTracker->currentSectionHasChildren() )
+ return false;
+ m_totals.assertions.failed++;
+ assertions.failed++;
+ return true;
+ }
+
+ virtual void sectionEnded( SectionInfo const& info, Counts const& prevAssertions, double _durationInSeconds ) {
+ if( std::uncaught_exception() ) {
+ m_unfinishedSections.push_back( UnfinishedSections( info, prevAssertions, _durationInSeconds ) );
+ return;
+ }
+
+ Counts assertions = m_totals.assertions - prevAssertions;
+ bool missingAssertions = testForMissingAssertions( assertions );
+
+ m_testCaseTracker->leaveSection();
+
+ m_reporter->sectionEnded( SectionStats( info, assertions, _durationInSeconds, missingAssertions ) );
+ m_messages.clear();
+ }
+
+ virtual void pushScopedMessage( MessageInfo const& message ) {
+ m_messages.push_back( message );
+ }
+
+ virtual void popScopedMessage( MessageInfo const& message ) {
+ m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() );
+ }
+
+ virtual std::string getCurrentTestName() const {
+ return m_activeTestCase
+ ? m_activeTestCase->getTestCaseInfo().name
+ : "";
+ }
+
+ virtual const AssertionResult* getLastResult() const {
+ return &m_lastResult;
+ }
+
+ virtual void handleFatalErrorCondition( std::string const& message ) {
+ ResultBuilder resultBuilder = makeUnexpectedResultBuilder();
+ resultBuilder.setResultType( ResultWas::FatalErrorCondition );
+ resultBuilder << message;
+ resultBuilder.captureExpression();
+
+ handleUnfinishedSections();
+
+ // Recreate section for test case (as we will lose the one that was in scope)
+ TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo();
+ SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description );
+
+ Counts assertions;
+ assertions.failed = 1;
+ SectionStats testCaseSectionStats( testCaseSection, assertions, 0, false );
+ m_reporter->sectionEnded( testCaseSectionStats );
+
+ TestCaseInfo testInfo = m_activeTestCase->getTestCaseInfo();
+
+ Totals deltaTotals;
+ deltaTotals.testCases.failed = 1;
+ m_reporter->testCaseEnded( TestCaseStats( testInfo,
+ deltaTotals,
+ "",
+ "",
+ false ) );
+ m_totals.testCases.failed++;
+ testGroupEnded( "", m_totals, 1, 1 );
+ m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, false ) );
+ }
+
+ public:
+ // !TBD We need to do this another way!
+ bool aborting() const {
+ return m_totals.assertions.failed == static_cast<std::size_t>( m_config->abortAfter() );
+ }
+
+ private:
+
+ void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) {
+ TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo();
+ SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description );
+ m_reporter->sectionStarting( testCaseSection );
+ Counts prevAssertions = m_totals.assertions;
+ double duration = 0;
+ try {
+ m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal );
+ TestCaseTracker::Guard guard( *m_testCaseTracker );
+
+ Timer timer;
+ timer.start();
+ if( m_reporter->getPreferences().shouldRedirectStdOut ) {
+ StreamRedirect coutRedir( Catch::cout(), redirectedCout );
+ StreamRedirect cerrRedir( Catch::cerr(), redirectedCerr );
+ invokeActiveTestCase();
+ }
+ else {
+ invokeActiveTestCase();
+ }
+ duration = timer.getElapsedSeconds();
+ }
+ catch( TestFailureException& ) {
+ // This just means the test was aborted due to failure
+ }
+ catch(...) {
+ makeUnexpectedResultBuilder().useActiveException();
+ }
+ handleUnfinishedSections();
+ m_messages.clear();
+
+ Counts assertions = m_totals.assertions - prevAssertions;
+ bool missingAssertions = testForMissingAssertions( assertions );
+
+ if( testCaseInfo.okToFail() ) {
+ std::swap( assertions.failedButOk, assertions.failed );
+ m_totals.assertions.failed -= assertions.failedButOk;
+ m_totals.assertions.failedButOk += assertions.failedButOk;
+ }
+
+ SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions );
+ m_reporter->sectionEnded( testCaseSectionStats );
+ }
+
+ void invokeActiveTestCase() {
+ FatalConditionHandler fatalConditionHandler; // Handle signals
+ m_activeTestCase->invoke();
+ fatalConditionHandler.reset();
+ }
+
+ private:
+
+ ResultBuilder makeUnexpectedResultBuilder() const {
+ return ResultBuilder( m_lastAssertionInfo.macroName.c_str(),
+ m_lastAssertionInfo.lineInfo,
+ m_lastAssertionInfo.capturedExpression.c_str(),
+ m_lastAssertionInfo.resultDisposition );
+ }
+
+ void handleUnfinishedSections() {
+ // If sections ended prematurely due to an exception we stored their
+ // infos here so we can tear them down outside the unwind process.
+ for( std::vector<UnfinishedSections>::const_reverse_iterator it = m_unfinishedSections.rbegin(),
+ itEnd = m_unfinishedSections.rend();
+ it != itEnd;
+ ++it )
+ sectionEnded( it->info, it->prevAssertions, it->durationInSeconds );
+ m_unfinishedSections.clear();
+ }
+
+ struct UnfinishedSections {
+ UnfinishedSections( SectionInfo const& _info, Counts const& _prevAssertions, double _durationInSeconds )
+ : info( _info ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds )
+ {}
+
+ SectionInfo info;
+ Counts prevAssertions;
+ double durationInSeconds;
+ };
+
+ TestRunInfo m_runInfo;
+ IMutableContext& m_context;
+ TestCase const* m_activeTestCase;
+ Option<TestCaseTracker> m_testCaseTracker;
+ AssertionResult m_lastResult;
+
+ Ptr<IConfig const> m_config;
+ Totals m_totals;
+ Ptr<IStreamingReporter> m_reporter;
+ std::vector<MessageInfo> m_messages;
+ IRunner* m_prevRunner;
+ IResultCapture* m_prevResultCapture;
+ Ptr<IConfig const> m_prevConfig;
+ AssertionInfo m_lastAssertionInfo;
+ std::vector<UnfinishedSections> m_unfinishedSections;
+ };
+
+ IResultCapture& getResultCapture() {
+ if( IResultCapture* capture = getCurrentContext().getResultCapture() )
+ return *capture;
+ else
+ throw std::logic_error( "No result capture instance" );
+ }
+
+} // end namespace Catch
+
+// #included from: internal/catch_version.h
+#define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED
+
+namespace Catch {
+
+ // Versioning information
+ struct Version {
+ Version( unsigned int _majorVersion,
+ unsigned int _minorVersion,
+ unsigned int _buildNumber,
+ char const* const _branchName )
+ : majorVersion( _majorVersion ),
+ minorVersion( _minorVersion ),
+ buildNumber( _buildNumber ),
+ branchName( _branchName )
+ {}
+
+ unsigned int const majorVersion;
+ unsigned int const minorVersion;
+ unsigned int const buildNumber;
+ char const* const branchName;
+
+ private:
+ void operator=( Version const& );
+ };
+
+ extern Version libraryVersion;
+}
+
+#include <fstream>
+#include <stdlib.h>
+#include <limits>
+
+namespace Catch {
+
+ class Runner {
+
+ public:
+ Runner( Ptr<Config> const& config )
+ : m_config( config )
+ {
+ openStream();
+ makeReporter();
+ }
+
+ Totals runTests() {
+
+ RunContext context( m_config.get(), m_reporter );
+
+ Totals totals;
+
+ context.testGroupStarting( "all tests", 1, 1 ); // deprecated?
+
+ TestSpec testSpec = m_config->testSpec();
+ if( !testSpec.hasFilters() )
+ testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests
+
+ std::vector<TestCase> testCases;
+ getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, *m_config, testCases );
+
+ int testsRunForGroup = 0;
+ for( std::vector<TestCase>::const_iterator it = testCases.begin(), itEnd = testCases.end();
+ it != itEnd;
+ ++it ) {
+ testsRunForGroup++;
+ if( m_testsAlreadyRun.find( *it ) == m_testsAlreadyRun.end() ) {
+
+ if( context.aborting() )
+ break;
+
+ totals += context.runTest( *it );
+ m_testsAlreadyRun.insert( *it );
+ }
+ }
+ std::vector<TestCase> skippedTestCases;
+ getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, *m_config, skippedTestCases, true );
+
+ for( std::vector<TestCase>::const_iterator it = skippedTestCases.begin(), itEnd = skippedTestCases.end();
+ it != itEnd;
+ ++it )
+ m_reporter->skipTest( *it );
+
+ context.testGroupEnded( "all tests", totals, 1, 1 );
+ return totals;
+ }
+
+ private:
+ void openStream() {
+ // Open output file, if specified
+ if( !m_config->getFilename().empty() ) {
+ m_ofs.open( m_config->getFilename().c_str() );
+ if( m_ofs.fail() ) {
+ std::ostringstream oss;
+ oss << "Unable to open file: '" << m_config->getFilename() << "'";
+ throw std::domain_error( oss.str() );
+ }
+ m_config->setStreamBuf( m_ofs.rdbuf() );
+ }
+ }
+ void makeReporter() {
+ std::string reporterName = m_config->getReporterName().empty()
+ ? "console"
+ : m_config->getReporterName();
+
+ m_reporter = getRegistryHub().getReporterRegistry().create( reporterName, m_config.get() );
+ if( !m_reporter ) {
+ std::ostringstream oss;
+ oss << "No reporter registered with name: '" << reporterName << "'";
+ throw std::domain_error( oss.str() );
+ }
+ }
+
+ private:
+ Ptr<Config> m_config;
+ std::ofstream m_ofs;
+ Ptr<IStreamingReporter> m_reporter;
+ std::set<TestCase> m_testsAlreadyRun;
+ };
+
+ class Session : NonCopyable {
+ static bool alreadyInstantiated;
+
+ public:
+
+ struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; };
+
+ Session()
+ : m_cli( makeCommandLineParser() ) {
+ if( alreadyInstantiated ) {
+ std::string msg = "Only one instance of Catch::Session can ever be used";
+ Catch::cerr() << msg << std::endl;
+ throw std::logic_error( msg );
+ }
+ alreadyInstantiated = true;
+ }
+ ~Session() {
+ Catch::cleanUp();
+ }
+
+ void showHelp( std::string const& processName ) {
+ Catch::cout() << "\nCatch v" << libraryVersion.majorVersion << "."
+ << libraryVersion.minorVersion << " build "
+ << libraryVersion.buildNumber;
+ if( libraryVersion.branchName != std::string( "master" ) )
+ Catch::cout() << " (" << libraryVersion.branchName << " branch)";
+ Catch::cout() << "\n";
+
+ m_cli.usage( Catch::cout(), processName );
+ Catch::cout() << "For more detail usage please see the project docs\n" << std::endl;
+ }
+
+ int applyCommandLine( int argc, char* const argv[], OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) {
+ try {
+ m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail );
+ m_unusedTokens = m_cli.parseInto( argc, argv, m_configData );
+ if( m_configData.showHelp )
+ showHelp( m_configData.processName );
+ m_config.reset();
+ }
+ catch( std::exception& ex ) {
+ {
+ Colour colourGuard( Colour::Red );
+ Catch::cerr() << "\nError(s) in input:\n"
+ << Text( ex.what(), TextAttributes().setIndent(2) )
+ << "\n\n";
+ }
+ m_cli.usage( Catch::cout(), m_configData.processName );
+ return (std::numeric_limits<int>::max)();
+ }
+ return 0;
+ }
+
+ void useConfigData( ConfigData const& _configData ) {
+ m_configData = _configData;
+ m_config.reset();
+ }
+
+ int run( int argc, char* const argv[] ) {
+
+ int returnCode = applyCommandLine( argc, argv );
+ if( returnCode == 0 )
+ returnCode = run();
+ return returnCode;
+ }
+
+ int run() {
+ if( m_configData.showHelp )
+ return 0;
+
+ try
+ {
+ config(); // Force config to be constructed
+
+ std::srand( m_configData.rngSeed );
+
+ Runner runner( m_config );
+
+ // Handle list request
+ if( Option<std::size_t> listed = list( config() ) )
+ return static_cast<int>( *listed );
+
+ return static_cast<int>( runner.runTests().assertions.failed );
+ }
+ catch( std::exception& ex ) {
+ Catch::cerr() << ex.what() << std::endl;
+ return (std::numeric_limits<int>::max)();
+ }
+ }
+
+ Clara::CommandLine<ConfigData> const& cli() const {
+ return m_cli;
+ }
+ std::vector<Clara::Parser::Token> const& unusedTokens() const {
+ return m_unusedTokens;
+ }
+ ConfigData& configData() {
+ return m_configData;
+ }
+ Config& config() {
+ if( !m_config )
+ m_config = new Config( m_configData );
+ return *m_config;
+ }
+
+ private:
+ Clara::CommandLine<ConfigData> m_cli;
+ std::vector<Clara::Parser::Token> m_unusedTokens;
+ ConfigData m_configData;
+ Ptr<Config> m_config;
+ };
+
+ bool Session::alreadyInstantiated = false;
+
+} // end namespace Catch
+
+// #included from: catch_registry_hub.hpp
+#define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED
+
+// #included from: catch_test_case_registry_impl.hpp
+#define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED
+
+#include <vector>
+#include <set>
+#include <sstream>
+#include <iostream>
+#include <algorithm>
+
+namespace Catch {
+
+ class TestRegistry : public ITestCaseRegistry {
+ struct LexSort {
+ bool operator() (TestCase i,TestCase j) const { return (i<j);}
+ };
+ struct RandomNumberGenerator {
+ int operator()( int n ) const { return std::rand() % n; }
+ };
+
+ public:
+ TestRegistry() : m_unnamedCount( 0 ) {}
+ virtual ~TestRegistry();
+
+ virtual void registerTest( TestCase const& testCase ) {
+ std::string name = testCase.getTestCaseInfo().name;
+ if( name == "" ) {
+ std::ostringstream oss;
+ oss << "Anonymous test case " << ++m_unnamedCount;
+ return registerTest( testCase.withName( oss.str() ) );
+ }
+
+ if( m_functions.find( testCase ) == m_functions.end() ) {
+ m_functions.insert( testCase );
+ m_functionsInOrder.push_back( testCase );
+ if( !testCase.isHidden() )
+ m_nonHiddenFunctions.push_back( testCase );
+ }
+ else {
+ TestCase const& prev = *m_functions.find( testCase );
+ {
+ Colour colourGuard( Colour::Red );
+ Catch::cerr() << "error: TEST_CASE( \"" << name << "\" ) already defined.\n"
+ << "\tFirst seen at " << prev.getTestCaseInfo().lineInfo << "\n"
+ << "\tRedefined at " << testCase.getTestCaseInfo().lineInfo << std::endl;
+ }
+ exit(1);
+ }
+ }
+
+ virtual std::vector<TestCase> const& getAllTests() const {
+ return m_functionsInOrder;
+ }
+
+ virtual std::vector<TestCase> const& getAllNonHiddenTests() const {
+ return m_nonHiddenFunctions;
+ }
+
+ virtual void getFilteredTests( TestSpec const& testSpec, IConfig const& config, std::vector<TestCase>& matchingTestCases, bool negated = false ) const {
+
+ for( std::vector<TestCase>::const_iterator it = m_functionsInOrder.begin(),
+ itEnd = m_functionsInOrder.end();
+ it != itEnd;
+ ++it ) {
+ bool includeTest = testSpec.matches( *it ) && ( config.allowThrows() || !it->throws() );
+ if( includeTest != negated )
+ matchingTestCases.push_back( *it );
+ }
+ sortTests( config, matchingTestCases );
+ }
+
+ private:
+
+ static void sortTests( IConfig const& config, std::vector<TestCase>& matchingTestCases ) {
+
+ switch( config.runOrder() ) {
+ case RunTests::InLexicographicalOrder:
+ std::sort( matchingTestCases.begin(), matchingTestCases.end(), LexSort() );
+ break;
+ case RunTests::InRandomOrder:
+ {
+ RandomNumberGenerator rng;
+ std::random_shuffle( matchingTestCases.begin(), matchingTestCases.end(), rng );
+ }
+ break;
+ case RunTests::InDeclarationOrder:
+ // already in declaration order
+ break;
+ }
+ }
+ std::set<TestCase> m_functions;
+ std::vector<TestCase> m_functionsInOrder;
+ std::vector<TestCase> m_nonHiddenFunctions;
+ size_t m_unnamedCount;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ class FreeFunctionTestCase : public SharedImpl<ITestCase> {
+ public:
+
+ FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {}
+
+ virtual void invoke() const {
+ m_fun();
+ }
+
+ private:
+ virtual ~FreeFunctionTestCase();
+
+ TestFunction m_fun;
+ };
+
+ inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) {
+ std::string className = classOrQualifiedMethodName;
+ if( startsWith( className, "&" ) )
+ {
+ std::size_t lastColons = className.rfind( "::" );
+ std::size_t penultimateColons = className.rfind( "::", lastColons-1 );
+ if( penultimateColons == std::string::npos )
+ penultimateColons = 1;
+ className = className.substr( penultimateColons, lastColons-penultimateColons );
+ }
+ return className;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ AutoReg::AutoReg( TestFunction function,
+ SourceLineInfo const& lineInfo,
+ NameAndDesc const& nameAndDesc ) {
+ registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo );
+ }
+
+ AutoReg::~AutoReg() {}
+
+ void AutoReg::registerTestCase( ITestCase* testCase,
+ char const* classOrQualifiedMethodName,
+ NameAndDesc const& nameAndDesc,
+ SourceLineInfo const& lineInfo ) {
+
+ getMutableRegistryHub().registerTest
+ ( makeTestCase( testCase,
+ extractClassName( classOrQualifiedMethodName ),
+ nameAndDesc.name,
+ nameAndDesc.description,
+ lineInfo ) );
+ }
+
+} // end namespace Catch
+
+// #included from: catch_reporter_registry.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED
+
+#include <map>
+
+namespace Catch {
+
+ class ReporterRegistry : public IReporterRegistry {
+
+ public:
+
+ virtual ~ReporterRegistry() {
+ deleteAllValues( m_factories );
+ }
+
+ virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig> const& config ) const {
+ FactoryMap::const_iterator it = m_factories.find( name );
+ if( it == m_factories.end() )
+ return NULL;
+ return it->second->create( ReporterConfig( config ) );
+ }
+
+ void registerReporter( std::string const& name, IReporterFactory* factory ) {
+ m_factories.insert( std::make_pair( name, factory ) );
+ }
+
+ FactoryMap const& getFactories() const {
+ return m_factories;
+ }
+
+ private:
+ FactoryMap m_factories;
+ };
+}
+
+// #included from: catch_exception_translator_registry.hpp
+#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED
+
+#ifdef __OBJC__
+#import "Foundation/Foundation.h"
+#endif
+
+namespace Catch {
+
+ class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry {
+ public:
+ ~ExceptionTranslatorRegistry() {
+ deleteAll( m_translators );
+ }
+
+ virtual void registerTranslator( const IExceptionTranslator* translator ) {
+ m_translators.push_back( translator );
+ }
+
+ virtual std::string translateActiveException() const {
+ try {
+#ifdef __OBJC__
+ // In Objective-C try objective-c exceptions first
+ @try {
+ throw;
+ }
+ @catch (NSException *exception) {
+ return Catch::toString( [exception description] );
+ }
+#else
+ throw;
+#endif
+ }
+ catch( TestFailureException& ) {
+ throw;
+ }
+ catch( std::exception& ex ) {
+ return ex.what();
+ }
+ catch( std::string& msg ) {
+ return msg;
+ }
+ catch( const char* msg ) {
+ return msg;
+ }
+ catch(...) {
+ return tryTranslators( m_translators.begin() );
+ }
+ }
+
+ std::string tryTranslators( std::vector<const IExceptionTranslator*>::const_iterator it ) const {
+ if( it == m_translators.end() )
+ return "Unknown exception";
+
+ try {
+ return (*it)->translate();
+ }
+ catch(...) {
+ return tryTranslators( it+1 );
+ }
+ }
+
+ private:
+ std::vector<const IExceptionTranslator*> m_translators;
+ };
+}
+
+namespace Catch {
+
+ namespace {
+
+ class RegistryHub : public IRegistryHub, public IMutableRegistryHub {
+
+ RegistryHub( RegistryHub const& );
+ void operator=( RegistryHub const& );
+
+ public: // IRegistryHub
+ RegistryHub() {
+ }
+ virtual IReporterRegistry const& getReporterRegistry() const {
+ return m_reporterRegistry;
+ }
+ virtual ITestCaseRegistry const& getTestCaseRegistry() const {
+ return m_testCaseRegistry;
+ }
+ virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() {
+ return m_exceptionTranslatorRegistry;
+ }
+
+ public: // IMutableRegistryHub
+ virtual void registerReporter( std::string const& name, IReporterFactory* factory ) {
+ m_reporterRegistry.registerReporter( name, factory );
+ }
+ virtual void registerTest( TestCase const& testInfo ) {
+ m_testCaseRegistry.registerTest( testInfo );
+ }
+ virtual void registerTranslator( const IExceptionTranslator* translator ) {
+ m_exceptionTranslatorRegistry.registerTranslator( translator );
+ }
+
+ private:
+ TestRegistry m_testCaseRegistry;
+ ReporterRegistry m_reporterRegistry;
+ ExceptionTranslatorRegistry m_exceptionTranslatorRegistry;
+ };
+
+ // Single, global, instance
+ inline RegistryHub*& getTheRegistryHub() {
+ static RegistryHub* theRegistryHub = NULL;
+ if( !theRegistryHub )
+ theRegistryHub = new RegistryHub();
+ return theRegistryHub;
+ }
+ }
+
+ IRegistryHub& getRegistryHub() {
+ return *getTheRegistryHub();
+ }
+ IMutableRegistryHub& getMutableRegistryHub() {
+ return *getTheRegistryHub();
+ }
+ void cleanUp() {
+ delete getTheRegistryHub();
+ getTheRegistryHub() = NULL;
+ cleanUpContext();
+ }
+ std::string translateActiveException() {
+ return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException();
+ }
+
+} // end namespace Catch
+
+// #included from: catch_notimplemented_exception.hpp
+#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED
+
+#include <ostream>
+
+namespace Catch {
+
+ NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo )
+ : m_lineInfo( lineInfo ) {
+ std::ostringstream oss;
+ oss << lineInfo << ": function ";
+ oss << "not implemented";
+ m_what = oss.str();
+ }
+
+ const char* NotImplementedException::what() const CATCH_NOEXCEPT {
+ return m_what.c_str();
+ }
+
+} // end namespace Catch
+
+// #included from: catch_context_impl.hpp
+#define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED
+
+// #included from: catch_stream.hpp
+#define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED
+
+// #included from: catch_streambuf.h
+#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED
+
+#include <streambuf>
+
+namespace Catch {
+
+ class StreamBufBase : public std::streambuf {
+ public:
+ virtual ~StreamBufBase() CATCH_NOEXCEPT;
+ };
+}
+
+#include <stdexcept>
+#include <cstdio>
+#include <iostream>
+
+namespace Catch {
+
+ template<typename WriterF, size_t bufferSize=256>
+ class StreamBufImpl : public StreamBufBase {
+ char data[bufferSize];
+ WriterF m_writer;
+
+ public:
+ StreamBufImpl() {
+ setp( data, data + sizeof(data) );
+ }
+
+ ~StreamBufImpl() CATCH_NOEXCEPT {
+ sync();
+ }
+
+ private:
+ int overflow( int c ) {
+ sync();
+
+ if( c != EOF ) {
+ if( pbase() == epptr() )
+ m_writer( std::string( 1, static_cast<char>( c ) ) );
+ else
+ sputc( static_cast<char>( c ) );
+ }
+ return 0;
+ }
+
+ int sync() {
+ if( pbase() != pptr() ) {
+ m_writer( std::string( pbase(), static_cast<std::string::size_type>( pptr() - pbase() ) ) );
+ setp( pbase(), epptr() );
+ }
+ return 0;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ struct OutputDebugWriter {
+
+ void operator()( std::string const&str ) {
+ writeToDebugConsole( str );
+ }
+ };
+
+ Stream::Stream()
+ : streamBuf( NULL ), isOwned( false )
+ {}
+
+ Stream::Stream( std::streambuf* _streamBuf, bool _isOwned )
+ : streamBuf( _streamBuf ), isOwned( _isOwned )
+ {}
+
+ void Stream::release() {
+ if( isOwned ) {
+ delete streamBuf;
+ streamBuf = NULL;
+ isOwned = false;
+ }
+ }
+
+#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement this functions
+ std::ostream& cout() {
+ return std::cout;
+ }
+ std::ostream& cerr() {
+ return std::cerr;
+ }
+#endif
+}
+
+namespace Catch {
+
+ class Context : public IMutableContext {
+
+ Context() : m_config( NULL ), m_runner( NULL ), m_resultCapture( NULL ) {}
+ Context( Context const& );
+ void operator=( Context const& );
+
+ public: // IContext
+ virtual IResultCapture* getResultCapture() {
+ return m_resultCapture;
+ }
+ virtual IRunner* getRunner() {
+ return m_runner;
+ }
+ virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) {
+ return getGeneratorsForCurrentTest()
+ .getGeneratorInfo( fileInfo, totalSize )
+ .getCurrentIndex();
+ }
+ virtual bool advanceGeneratorsForCurrentTest() {
+ IGeneratorsForTest* generators = findGeneratorsForCurrentTest();
+ return generators && generators->moveNext();
+ }
+
+ virtual Ptr<IConfig const> getConfig() const {
+ return m_config;
+ }
+
+ public: // IMutableContext
+ virtual void setResultCapture( IResultCapture* resultCapture ) {
+ m_resultCapture = resultCapture;
+ }
+ virtual void setRunner( IRunner* runner ) {
+ m_runner = runner;
+ }
+ virtual void setConfig( Ptr<IConfig const> const& config ) {
+ m_config = config;
+ }
+
+ friend IMutableContext& getCurrentMutableContext();
+
+ private:
+ IGeneratorsForTest* findGeneratorsForCurrentTest() {
+ std::string testName = getResultCapture()->getCurrentTestName();
+
+ std::map<std::string, IGeneratorsForTest*>::const_iterator it =
+ m_generatorsByTestName.find( testName );
+ return it != m_generatorsByTestName.end()
+ ? it->second
+ : NULL;
+ }
+
+ IGeneratorsForTest& getGeneratorsForCurrentTest() {
+ IGeneratorsForTest* generators = findGeneratorsForCurrentTest();
+ if( !generators ) {
+ std::string testName = getResultCapture()->getCurrentTestName();
+ generators = createGeneratorsForTest();
+ m_generatorsByTestName.insert( std::make_pair( testName, generators ) );
+ }
+ return *generators;
+ }
+
+ private:
+ Ptr<IConfig const> m_config;
+ IRunner* m_runner;
+ IResultCapture* m_resultCapture;
+ std::map<std::string, IGeneratorsForTest*> m_generatorsByTestName;
+ };
+
+ namespace {
+ Context* currentContext = NULL;
+ }
+ IMutableContext& getCurrentMutableContext() {
+ if( !currentContext )
+ currentContext = new Context();
+ return *currentContext;
+ }
+ IContext& getCurrentContext() {
+ return getCurrentMutableContext();
+ }
+
+ Stream createStream( std::string const& streamName ) {
+ if( streamName == "stdout" ) return Stream( Catch::cout().rdbuf(), false );
+ if( streamName == "stderr" ) return Stream( Catch::cerr().rdbuf(), false );
+ if( streamName == "debug" ) return Stream( new StreamBufImpl<OutputDebugWriter>, true );
+
+ throw std::domain_error( "Unknown stream: " + streamName );
+ }
+
+ void cleanUpContext() {
+ delete currentContext;
+ currentContext = NULL;
+ }
+}
+
+// #included from: catch_console_colour_impl.hpp
+#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED
+
+namespace Catch {
+ namespace {
+
+ struct IColourImpl {
+ virtual ~IColourImpl() {}
+ virtual void use( Colour::Code _colourCode ) = 0;
+ };
+
+ struct NoColourImpl : IColourImpl {
+ void use( Colour::Code ) {}
+
+ static IColourImpl* instance() {
+ static NoColourImpl s_instance;
+ return &s_instance;
+ }
+ };
+
+ } // anon namespace
+} // namespace Catch
+
+#if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI )
+# ifdef CATCH_PLATFORM_WINDOWS
+# define CATCH_CONFIG_COLOUR_WINDOWS
+# else
+# define CATCH_CONFIG_COLOUR_ANSI
+# endif
+#endif
+
+#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) /////////////////////////////////////////
+
+#ifndef NOMINMAX
+#define NOMINMAX
+#endif
+
+#ifdef __AFXDLL
+#include <AfxWin.h>
+#else
+#include <windows.h>
+#endif
+
+namespace Catch {
+namespace {
+
+ class Win32ColourImpl : public IColourImpl {
+ public:
+ Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) )
+ {
+ CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
+ GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo );
+ originalAttributes = csbiInfo.wAttributes;
+ }
+
+ virtual void use( Colour::Code _colourCode ) {
+ switch( _colourCode ) {
+ case Colour::None: return setTextAttribute( originalAttributes );
+ case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );
+ case Colour::Red: return setTextAttribute( FOREGROUND_RED );
+ case Colour::Green: return setTextAttribute( FOREGROUND_GREEN );
+ case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE );
+ case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN );
+ case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN );
+ case Colour::Grey: return setTextAttribute( 0 );
+
+ case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY );
+ case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED );
+ case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN );
+ case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );
+
+ case Colour::Bright: throw std::logic_error( "not a colour" );
+ }
+ }
+
+ private:
+ void setTextAttribute( WORD _textAttribute ) {
+ SetConsoleTextAttribute( stdoutHandle, _textAttribute );
+ }
+ HANDLE stdoutHandle;
+ WORD originalAttributes;
+ };
+
+ IColourImpl* platformColourInstance() {
+ static Win32ColourImpl s_instance;
+ return &s_instance;
+ }
+
+} // end anon namespace
+} // end namespace Catch
+
+#elif defined( CATCH_CONFIG_COLOUR_ANSI ) //////////////////////////////////////
+
+#include <unistd.h>
+
+namespace Catch {
+namespace {
+
+ // use POSIX/ ANSI console terminal codes
+ // Thanks to Adam Strzelecki for original contribution
+ // (http://github.com/nanoant)
+ // https://github.com/philsquared/Catch/pull/131
+ class PosixColourImpl : public IColourImpl {
+ public:
+ virtual void use( Colour::Code _colourCode ) {
+ switch( _colourCode ) {
+ case Colour::None:
+ case Colour::White: return setColour( "[0m" );
+ case Colour::Red: return setColour( "[0;31m" );
+ case Colour::Green: return setColour( "[0;32m" );
+ case Colour::Blue: return setColour( "[0:34m" );
+ case Colour::Cyan: return setColour( "[0;36m" );
+ case Colour::Yellow: return setColour( "[0;33m" );
+ case Colour::Grey: return setColour( "[1;30m" );
+
+ case Colour::LightGrey: return setColour( "[0;37m" );
+ case Colour::BrightRed: return setColour( "[1;31m" );
+ case Colour::BrightGreen: return setColour( "[1;32m" );
+ case Colour::BrightWhite: return setColour( "[1;37m" );
+
+ case Colour::Bright: throw std::logic_error( "not a colour" );
+ }
+ }
+ static IColourImpl* instance() {
+ static PosixColourImpl s_instance;
+ return &s_instance;
+ }
+
+ private:
+ void setColour( const char* _escapeCode ) {
+ Catch::cout() << '\033' << _escapeCode;
+ }
+ };
+
+ IColourImpl* platformColourInstance() {
+ Ptr<IConfig const> config = getCurrentContext().getConfig();
+ return (config && config->forceColour()) || isatty(STDOUT_FILENO)
+ ? PosixColourImpl::instance()
+ : NoColourImpl::instance();
+ }
+
+} // end anon namespace
+} // end namespace Catch
+
+#else // not Windows or ANSI ///////////////////////////////////////////////
+
+namespace Catch {
+
+ static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); }
+
+} // end namespace Catch
+
+#endif // Windows/ ANSI/ None
+
+namespace Catch {
+
+ Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); }
+ Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast<Colour&>( _other ).m_moved = true; }
+ Colour::~Colour(){ if( !m_moved ) use( None ); }
+
+ void Colour::use( Code _colourCode ) {
+ static IColourImpl* impl = isDebuggerActive()
+ ? NoColourImpl::instance()
+ : platformColourInstance();
+ impl->use( _colourCode );
+ }
+
+} // end namespace Catch
+
+// #included from: catch_generators_impl.hpp
+#define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED
+
+#include <vector>
+#include <string>
+#include <map>
+
+namespace Catch {
+
+ struct GeneratorInfo : IGeneratorInfo {
+
+ GeneratorInfo( std::size_t size )
+ : m_size( size ),
+ m_currentIndex( 0 )
+ {}
+
+ bool moveNext() {
+ if( ++m_currentIndex == m_size ) {
+ m_currentIndex = 0;
+ return false;
+ }
+ return true;
+ }
+
+ std::size_t getCurrentIndex() const {
+ return m_currentIndex;
+ }
+
+ std::size_t m_size;
+ std::size_t m_currentIndex;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ class GeneratorsForTest : public IGeneratorsForTest {
+
+ public:
+ ~GeneratorsForTest() {
+ deleteAll( m_generatorsInOrder );
+ }
+
+ IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) {
+ std::map<std::string, IGeneratorInfo*>::const_iterator it = m_generatorsByName.find( fileInfo );
+ if( it == m_generatorsByName.end() ) {
+ IGeneratorInfo* info = new GeneratorInfo( size );
+ m_generatorsByName.insert( std::make_pair( fileInfo, info ) );
+ m_generatorsInOrder.push_back( info );
+ return *info;
+ }
+ return *it->second;
+ }
+
+ bool moveNext() {
+ std::vector<IGeneratorInfo*>::const_iterator it = m_generatorsInOrder.begin();
+ std::vector<IGeneratorInfo*>::const_iterator itEnd = m_generatorsInOrder.end();
+ for(; it != itEnd; ++it ) {
+ if( (*it)->moveNext() )
+ return true;
+ }
+ return false;
+ }
+
+ private:
+ std::map<std::string, IGeneratorInfo*> m_generatorsByName;
+ std::vector<IGeneratorInfo*> m_generatorsInOrder;
+ };
+
+ IGeneratorsForTest* createGeneratorsForTest()
+ {
+ return new GeneratorsForTest();
+ }
+
+} // end namespace Catch
+
+// #included from: catch_assertionresult.hpp
+#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED
+
+namespace Catch {
+
+ AssertionInfo::AssertionInfo( std::string const& _macroName,
+ SourceLineInfo const& _lineInfo,
+ std::string const& _capturedExpression,
+ ResultDisposition::Flags _resultDisposition )
+ : macroName( _macroName ),
+ lineInfo( _lineInfo ),
+ capturedExpression( _capturedExpression ),
+ resultDisposition( _resultDisposition )
+ {}
+
+ AssertionResult::AssertionResult() {}
+
+ AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data )
+ : m_info( info ),
+ m_resultData( data )
+ {}
+
+ AssertionResult::~AssertionResult() {}
+
+ // Result was a success
+ bool AssertionResult::succeeded() const {
+ return Catch::isOk( m_resultData.resultType );
+ }
+
+ // Result was a success, or failure is suppressed
+ bool AssertionResult::isOk() const {
+ return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition );
+ }
+
+ ResultWas::OfType AssertionResult::getResultType() const {
+ return m_resultData.resultType;
+ }
+
+ bool AssertionResult::hasExpression() const {
+ return !m_info.capturedExpression.empty();
+ }
+
+ bool AssertionResult::hasMessage() const {
+ return !m_resultData.message.empty();
+ }
+
+ std::string AssertionResult::getExpression() const {
+ if( isFalseTest( m_info.resultDisposition ) )
+ return "!" + m_info.capturedExpression;
+ else
+ return m_info.capturedExpression;
+ }
+ std::string AssertionResult::getExpressionInMacro() const {
+ if( m_info.macroName.empty() )
+ return m_info.capturedExpression;
+ else
+ return m_info.macroName + "( " + m_info.capturedExpression + " )";
+ }
+
+ bool AssertionResult::hasExpandedExpression() const {
+ return hasExpression() && getExpandedExpression() != getExpression();
+ }
+
+ std::string AssertionResult::getExpandedExpression() const {
+ return m_resultData.reconstructedExpression;
+ }
+
+ std::string AssertionResult::getMessage() const {
+ return m_resultData.message;
+ }
+ SourceLineInfo AssertionResult::getSourceInfo() const {
+ return m_info.lineInfo;
+ }
+
+ std::string AssertionResult::getTestMacroName() const {
+ return m_info.macroName;
+ }
+
+} // end namespace Catch
+
+// #included from: catch_test_case_info.hpp
+#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED
+
+namespace Catch {
+
+ inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) {
+ if( startsWith( tag, "." ) ||
+ tag == "hide" ||
+ tag == "!hide" )
+ return TestCaseInfo::IsHidden;
+ else if( tag == "!throws" )
+ return TestCaseInfo::Throws;
+ else if( tag == "!shouldfail" )
+ return TestCaseInfo::ShouldFail;
+ else if( tag == "!mayfail" )
+ return TestCaseInfo::MayFail;
+ else
+ return TestCaseInfo::None;
+ }
+ inline bool isReservedTag( std::string const& tag ) {
+ return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !isalnum( tag[0] );
+ }
+ inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) {
+ if( isReservedTag( tag ) ) {
+ {
+ Colour colourGuard( Colour::Red );
+ Catch::cerr()
+ << "Tag name [" << tag << "] not allowed.\n"
+ << "Tag names starting with non alpha-numeric characters are reserved\n";
+ }
+ {
+ Colour colourGuard( Colour::FileName );
+ Catch::cerr() << _lineInfo << std::endl;
+ }
+ exit(1);
+ }
+ }
+
+ TestCase makeTestCase( ITestCase* _testCase,
+ std::string const& _className,
+ std::string const& _name,
+ std::string const& _descOrTags,
+ SourceLineInfo const& _lineInfo )
+ {
+ bool isHidden( startsWith( _name, "./" ) ); // Legacy support
+
+ // Parse out tags
+ std::set<std::string> tags;
+ std::string desc, tag;
+ bool inTag = false;
+ for( std::size_t i = 0; i < _descOrTags.size(); ++i ) {
+ char c = _descOrTags[i];
+ if( !inTag ) {
+ if( c == '[' )
+ inTag = true;
+ else
+ desc += c;
+ }
+ else {
+ if( c == ']' ) {
+ TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag );
+ if( prop == TestCaseInfo::IsHidden )
+ isHidden = true;
+ else if( prop == TestCaseInfo::None )
+ enforceNotReservedTag( tag, _lineInfo );
+
+ tags.insert( tag );
+ tag.clear();
+ inTag = false;
+ }
+ else
+ tag += c;
+ }
+ }
+ if( isHidden ) {
+ tags.insert( "hide" );
+ tags.insert( "." );
+ }
+
+ TestCaseInfo info( _name, _className, desc, tags, _lineInfo );
+ return TestCase( _testCase, info );
+ }
+
+ TestCaseInfo::TestCaseInfo( std::string const& _name,
+ std::string const& _className,
+ std::string const& _description,
+ std::set<std::string> const& _tags,
+ SourceLineInfo const& _lineInfo )
+ : name( _name ),
+ className( _className ),
+ description( _description ),
+ tags( _tags ),
+ lineInfo( _lineInfo ),
+ properties( None )
+ {
+ std::ostringstream oss;
+ for( std::set<std::string>::const_iterator it = _tags.begin(), itEnd = _tags.end(); it != itEnd; ++it ) {
+ oss << "[" << *it << "]";
+ std::string lcaseTag = toLower( *it );
+ properties = static_cast<SpecialProperties>( properties | parseSpecialTag( lcaseTag ) );
+ lcaseTags.insert( lcaseTag );
+ }
+ tagsAsString = oss.str();
+ }
+
+ TestCaseInfo::TestCaseInfo( TestCaseInfo const& other )
+ : name( other.name ),
+ className( other.className ),
+ description( other.description ),
+ tags( other.tags ),
+ lcaseTags( other.lcaseTags ),
+ tagsAsString( other.tagsAsString ),
+ lineInfo( other.lineInfo ),
+ properties( other.properties )
+ {}
+
+ bool TestCaseInfo::isHidden() const {
+ return ( properties & IsHidden ) != 0;
+ }
+ bool TestCaseInfo::throws() const {
+ return ( properties & Throws ) != 0;
+ }
+ bool TestCaseInfo::okToFail() const {
+ return ( properties & (ShouldFail | MayFail ) ) != 0;
+ }
+ bool TestCaseInfo::expectedToFail() const {
+ return ( properties & (ShouldFail ) ) != 0;
+ }
+
+ TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {}
+
+ TestCase::TestCase( TestCase const& other )
+ : TestCaseInfo( other ),
+ test( other.test )
+ {}
+
+ TestCase TestCase::withName( std::string const& _newName ) const {
+ TestCase other( *this );
+ other.name = _newName;
+ return other;
+ }
+
+ void TestCase::swap( TestCase& other ) {
+ test.swap( other.test );
+ name.swap( other.name );
+ className.swap( other.className );
+ description.swap( other.description );
+ tags.swap( other.tags );
+ lcaseTags.swap( other.lcaseTags );
+ tagsAsString.swap( other.tagsAsString );
+ std::swap( TestCaseInfo::properties, static_cast<TestCaseInfo&>( other ).properties );
+ std::swap( lineInfo, other.lineInfo );
+ }
+
+ void TestCase::invoke() const {
+ test->invoke();
+ }
+
+ bool TestCase::operator == ( TestCase const& other ) const {
+ return test.get() == other.test.get() &&
+ name == other.name &&
+ className == other.className;
+ }
+
+ bool TestCase::operator < ( TestCase const& other ) const {
+ return name < other.name;
+ }
+ TestCase& TestCase::operator = ( TestCase const& other ) {
+ TestCase temp( other );
+ swap( temp );
+ return *this;
+ }
+
+ TestCaseInfo const& TestCase::getTestCaseInfo() const
+ {
+ return *this;
+ }
+
+} // end namespace Catch
+
+// #included from: catch_version.hpp
+#define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED
+
+namespace Catch {
+
+ // These numbers are maintained by a script
+ Version libraryVersion( 1, 1, 1, "master" );
+}
+
+// #included from: catch_message.hpp
+#define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED
+
+namespace Catch {
+
+ MessageInfo::MessageInfo( std::string const& _macroName,
+ SourceLineInfo const& _lineInfo,
+ ResultWas::OfType _type )
+ : macroName( _macroName ),
+ lineInfo( _lineInfo ),
+ type( _type ),
+ sequence( ++globalCount )
+ {}
+
+ // This may need protecting if threading support is added
+ unsigned int MessageInfo::globalCount = 0;
+
+ ////////////////////////////////////////////////////////////////////////////
+
+ ScopedMessage::ScopedMessage( MessageBuilder const& builder )
+ : m_info( builder.m_info )
+ {
+ m_info.message = builder.m_stream.str();
+ getResultCapture().pushScopedMessage( m_info );
+ }
+ ScopedMessage::ScopedMessage( ScopedMessage const& other )
+ : m_info( other.m_info )
+ {}
+
+ ScopedMessage::~ScopedMessage() {
+ getResultCapture().popScopedMessage( m_info );
+ }
+
+} // end namespace Catch
+
+// #included from: catch_legacy_reporter_adapter.hpp
+#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED
+
+// #included from: catch_legacy_reporter_adapter.h
+#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED
+
+namespace Catch
+{
+ // Deprecated
+ struct IReporter : IShared {
+ virtual ~IReporter();
+
+ virtual bool shouldRedirectStdout() const = 0;
+
+ virtual void StartTesting() = 0;
+ virtual void EndTesting( Totals const& totals ) = 0;
+ virtual void StartGroup( std::string const& groupName ) = 0;
+ virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0;
+ virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0;
+ virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0;
+ virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0;
+ virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0;
+ virtual void NoAssertionsInSection( std::string const& sectionName ) = 0;
+ virtual void NoAssertionsInTestCase( std::string const& testName ) = 0;
+ virtual void Aborted() = 0;
+ virtual void Result( AssertionResult const& result ) = 0;
+ };
+
+ class LegacyReporterAdapter : public SharedImpl<IStreamingReporter>
+ {
+ public:
+ LegacyReporterAdapter( Ptr<IReporter> const& legacyReporter );
+ virtual ~LegacyReporterAdapter();
+
+ virtual ReporterPreferences getPreferences() const;
+ virtual void noMatchingTestCases( std::string const& );
+ virtual void testRunStarting( TestRunInfo const& );
+ virtual void testGroupStarting( GroupInfo const& groupInfo );
+ virtual void testCaseStarting( TestCaseInfo const& testInfo );
+ virtual void sectionStarting( SectionInfo const& sectionInfo );
+ virtual void assertionStarting( AssertionInfo const& );
+ virtual bool assertionEnded( AssertionStats const& assertionStats );
+ virtual void sectionEnded( SectionStats const& sectionStats );
+ virtual void testCaseEnded( TestCaseStats const& testCaseStats );
+ virtual void testGroupEnded( TestGroupStats const& testGroupStats );
+ virtual void testRunEnded( TestRunStats const& testRunStats );
+ virtual void skipTest( TestCaseInfo const& );
+
+ private:
+ Ptr<IReporter> m_legacyReporter;
+ };
+}
+
+namespace Catch
+{
+ LegacyReporterAdapter::LegacyReporterAdapter( Ptr<IReporter> const& legacyReporter )
+ : m_legacyReporter( legacyReporter )
+ {}
+ LegacyReporterAdapter::~LegacyReporterAdapter() {}
+
+ ReporterPreferences LegacyReporterAdapter::getPreferences() const {
+ ReporterPreferences prefs;
+ prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout();
+ return prefs;
+ }
+
+ void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {}
+ void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) {
+ m_legacyReporter->StartTesting();
+ }
+ void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) {
+ m_legacyReporter->StartGroup( groupInfo.name );
+ }
+ void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) {
+ m_legacyReporter->StartTestCase( testInfo );
+ }
+ void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) {
+ m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description );
+ }
+ void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) {
+ // Not on legacy interface
+ }
+
+ bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) {
+ if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) {
+ for( std::vector<MessageInfo>::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end();
+ it != itEnd;
+ ++it ) {
+ if( it->type == ResultWas::Info ) {
+ ResultBuilder rb( it->macroName.c_str(), it->lineInfo, "", ResultDisposition::Normal );
+ rb << it->message;
+ rb.setResultType( ResultWas::Info );
+ AssertionResult result = rb.build();
+ m_legacyReporter->Result( result );
+ }
+ }
+ }
+ m_legacyReporter->Result( assertionStats.assertionResult );
+ return true;
+ }
+ void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) {
+ if( sectionStats.missingAssertions )
+ m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name );
+ m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions );
+ }
+ void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) {
+ m_legacyReporter->EndTestCase
+ ( testCaseStats.testInfo,
+ testCaseStats.totals,
+ testCaseStats.stdOut,
+ testCaseStats.stdErr );
+ }
+ void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) {
+ if( testGroupStats.aborting )
+ m_legacyReporter->Aborted();
+ m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals );
+ }
+ void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) {
+ m_legacyReporter->EndTesting( testRunStats.totals );
+ }
+ void LegacyReporterAdapter::skipTest( TestCaseInfo const& ) {
+ }
+}
+
+// #included from: catch_timer.hpp
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wc++11-long-long"
+#endif
+
+#ifdef CATCH_PLATFORM_WINDOWS
+#include <windows.h>
+#else
+#include <sys/time.h>
+#endif
+
+namespace Catch {
+
+ namespace {
+#ifdef CATCH_PLATFORM_WINDOWS
+ uint64_t getCurrentTicks() {
+ static uint64_t hz=0, hzo=0;
+ if (!hz) {
+ QueryPerformanceFrequency( reinterpret_cast<LARGE_INTEGER*>( &hz ) );
+ QueryPerformanceCounter( reinterpret_cast<LARGE_INTEGER*>( &hzo ) );
+ }
+ uint64_t t;
+ QueryPerformanceCounter( reinterpret_cast<LARGE_INTEGER*>( &t ) );
+ return ((t-hzo)*1000000)/hz;
+ }
+#else
+ uint64_t getCurrentTicks() {
+ timeval t;
+ gettimeofday(&t,NULL);
+ return static_cast<uint64_t>( t.tv_sec ) * 1000000ull + static_cast<uint64_t>( t.tv_usec );
+ }
+#endif
+ }
+
+ void Timer::start() {
+ m_ticks = getCurrentTicks();
+ }
+ unsigned int Timer::getElapsedMicroseconds() const {
+ return static_cast<unsigned int>(getCurrentTicks() - m_ticks);
+ }
+ unsigned int Timer::getElapsedMilliseconds() const {
+ return static_cast<unsigned int>(getElapsedMicroseconds()/1000);
+ }
+ double Timer::getElapsedSeconds() const {
+ return getElapsedMicroseconds()/1000000.0;
+ }
+
+} // namespace Catch
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+// #included from: catch_common.hpp
+#define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED
+
+namespace Catch {
+
+ bool startsWith( std::string const& s, std::string const& prefix ) {
+ return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix;
+ }
+ bool endsWith( std::string const& s, std::string const& suffix ) {
+ return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix;
+ }
+ bool contains( std::string const& s, std::string const& infix ) {
+ return s.find( infix ) != std::string::npos;
+ }
+ void toLowerInPlace( std::string& s ) {
+ std::transform( s.begin(), s.end(), s.begin(), ::tolower );
+ }
+ std::string toLower( std::string const& s ) {
+ std::string lc = s;
+ toLowerInPlace( lc );
+ return lc;
+ }
+ std::string trim( std::string const& str ) {
+ static char const* whitespaceChars = "\n\r\t ";
+ std::string::size_type start = str.find_first_not_of( whitespaceChars );
+ std::string::size_type end = str.find_last_not_of( whitespaceChars );
+
+ return start != std::string::npos ? str.substr( start, 1+end-start ) : "";
+ }
+
+ bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) {
+ bool replaced = false;
+ std::size_t i = str.find( replaceThis );
+ while( i != std::string::npos ) {
+ replaced = true;
+ str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() );
+ if( i < str.size()-withThis.size() )
+ i = str.find( replaceThis, i+withThis.size() );
+ else
+ i = std::string::npos;
+ }
+ return replaced;
+ }
+
+ pluralise::pluralise( std::size_t count, std::string const& label )
+ : m_count( count ),
+ m_label( label )
+ {}
+
+ std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) {
+ os << pluraliser.m_count << " " << pluraliser.m_label;
+ if( pluraliser.m_count != 1 )
+ os << "s";
+ return os;
+ }
+
+ SourceLineInfo::SourceLineInfo() : line( 0 ){}
+ SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line )
+ : file( _file ),
+ line( _line )
+ {}
+ SourceLineInfo::SourceLineInfo( SourceLineInfo const& other )
+ : file( other.file ),
+ line( other.line )
+ {}
+ bool SourceLineInfo::empty() const {
+ return file.empty();
+ }
+ bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const {
+ return line == other.line && file == other.file;
+ }
+ bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const {
+ return line < other.line || ( line == other.line && file < other.file );
+ }
+
+ std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) {
+#ifndef __GNUG__
+ os << info.file << "(" << info.line << ")";
+#else
+ os << info.file << ":" << info.line;
+#endif
+ return os;
+ }
+
+ void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) {
+ std::ostringstream oss;
+ oss << locationInfo << ": Internal Catch error: '" << message << "'";
+ if( alwaysTrue() )
+ throw std::logic_error( oss.str() );
+ }
+}
+
+// #included from: catch_section.hpp
+#define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED
+
+namespace Catch {
+
+ SectionInfo::SectionInfo
+ ( SourceLineInfo const& _lineInfo,
+ std::string const& _name,
+ std::string const& _description )
+ : name( _name ),
+ description( _description ),
+ lineInfo( _lineInfo )
+ {}
+
+ Section::Section( SectionInfo const& info )
+ : m_info( info ),
+ m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) )
+ {
+ m_timer.start();
+ }
+
+ Section::~Section() {
+ if( m_sectionIncluded )
+ getResultCapture().sectionEnded( m_info, m_assertions, m_timer.getElapsedSeconds() );
+ }
+
+ // This indicates whether the section should be executed or not
+ Section::operator bool() const {
+ return m_sectionIncluded;
+ }
+
+} // end namespace Catch
+
+// #included from: catch_debugger.hpp
+#define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED
+
+#include <iostream>
+
+#ifdef CATCH_PLATFORM_MAC
+
+ #include <assert.h>
+ #include <stdbool.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+ #include <sys/sysctl.h>
+
+ namespace Catch{
+
+ // The following function is taken directly from the following technical note:
+ // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html
+
+ // Returns true if the current process is being debugged (either
+ // running under the debugger or has a debugger attached post facto).
+ bool isDebuggerActive(){
+
+ int mib[4];
+ struct kinfo_proc info;
+ size_t size;
+
+ // Initialize the flags so that, if sysctl fails for some bizarre
+ // reason, we get a predictable result.
+
+ info.kp_proc.p_flag = 0;
+
+ // Initialize mib, which tells sysctl the info we want, in this case
+ // we're looking for information about a specific process ID.
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_PID;
+ mib[3] = getpid();
+
+ // Call sysctl.
+
+ size = sizeof(info);
+ if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0) != 0 ) {
+ Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl;
+ return false;
+ }
+
+ // We're being debugged if the P_TRACED flag is set.
+
+ return ( (info.kp_proc.p_flag & P_TRACED) != 0 );
+ }
+ } // namespace Catch
+
+#elif defined(_MSC_VER)
+ extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
+ namespace Catch {
+ bool isDebuggerActive() {
+ return IsDebuggerPresent() != 0;
+ }
+ }
+#elif defined(__MINGW32__)
+ extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
+ namespace Catch {
+ bool isDebuggerActive() {
+ return IsDebuggerPresent() != 0;
+ }
+ }
+#else
+ namespace Catch {
+ inline bool isDebuggerActive() { return false; }
+ }
+#endif // Platform
+
+#ifdef CATCH_PLATFORM_WINDOWS
+ extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* );
+ namespace Catch {
+ void writeToDebugConsole( std::string const& text ) {
+ ::OutputDebugStringA( text.c_str() );
+ }
+ }
+#else
+ namespace Catch {
+ void writeToDebugConsole( std::string const& text ) {
+ // !TBD: Need a version for Mac/ XCode and other IDEs
+ Catch::cout() << text;
+ }
+ }
+#endif // Platform
+
+// #included from: catch_tostring.hpp
+#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED
+
+namespace Catch {
+
+namespace Detail {
+
+ std::string unprintableString = "{?}";
+
+ namespace {
+ struct Endianness {
+ enum Arch { Big, Little };
+
+ static Arch which() {
+ union _{
+ int asInt;
+ char asChar[sizeof (int)];
+ } u;
+
+ u.asInt = 1;
+ return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little;
+ }
+ };
+ }
+
+ std::string rawMemoryToString( const void *object, std::size_t size )
+ {
+ // Reverse order for little endian architectures
+ int i = 0, end = static_cast<int>( size ), inc = 1;
+ if( Endianness::which() == Endianness::Little ) {
+ i = end-1;
+ end = inc = -1;
+ }
+
+ unsigned char const *bytes = static_cast<unsigned char const *>(object);
+ std::ostringstream os;
+ os << "0x" << std::setfill('0') << std::hex;
+ for( ; i != end; i += inc )
+ os << std::setw(2) << static_cast<unsigned>(bytes[i]);
+ return os.str();
+ }
+}
+
+std::string toString( std::string const& value ) {
+ std::string s = value;
+ if( getCurrentContext().getConfig()->showInvisibles() ) {
+ for(size_t i = 0; i < s.size(); ++i ) {
+ std::string subs;
+ switch( s[i] ) {
+ case '\n': subs = "\\n"; break;
+ case '\t': subs = "\\t"; break;
+ default: break;
+ }
+ if( !subs.empty() ) {
+ s = s.substr( 0, i ) + subs + s.substr( i+1 );
+ ++i;
+ }
+ }
+ }
+ return "\"" + s + "\"";
+}
+std::string toString( std::wstring const& value ) {
+
+ std::string s;
+ s.reserve( value.size() );
+ for(size_t i = 0; i < value.size(); ++i )
+ s += value[i] <= 0xff ? static_cast<char>( value[i] ) : '?';
+ return Catch::toString( s );
+}
+
+std::string toString( const char* const value ) {
+ return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" );
+}
+
+std::string toString( char* const value ) {
+ return Catch::toString( static_cast<const char*>( value ) );
+}
+
+std::string toString( const wchar_t* const value )
+{
+ return value ? Catch::toString( std::wstring(value) ) : std::string( "{null string}" );
+}
+
+std::string toString( wchar_t* const value )
+{
+ return Catch::toString( static_cast<const wchar_t*>( value ) );
+}
+
+std::string toString( int value ) {
+ std::ostringstream oss;
+ if( value > 8192 )
+ oss << "0x" << std::hex << value;
+ else
+ oss << value;
+ return oss.str();
+}
+
+std::string toString( unsigned long value ) {
+ std::ostringstream oss;
+ if( value > 8192 )
+ oss << "0x" << std::hex << value;
+ else
+ oss << value;
+ return oss.str();
+}
+
+std::string toString( unsigned int value ) {
+ return Catch::toString( static_cast<unsigned long>( value ) );
+}
+
+template<typename T>
+std::string fpToString( T value, int precision ) {
+ std::ostringstream oss;
+ oss << std::setprecision( precision )
+ << std::fixed
+ << value;
+ std::string d = oss.str();
+ std::size_t i = d.find_last_not_of( '0' );
+ if( i != std::string::npos && i != d.size()-1 ) {
+ if( d[i] == '.' )
+ i++;
+ d = d.substr( 0, i+1 );
+ }
+ return d;
+}
+
+std::string toString( const double value ) {
+ return fpToString( value, 10 );
+}
+std::string toString( const float value ) {
+ return fpToString( value, 5 ) + "f";
+}
+
+std::string toString( bool value ) {
+ return value ? "true" : "false";
+}
+
+std::string toString( char value ) {
+ return value < ' '
+ ? toString( static_cast<unsigned int>( value ) )
+ : Detail::makeString( value );
+}
+
+std::string toString( signed char value ) {
+ return toString( static_cast<char>( value ) );
+}
+
+std::string toString( unsigned char value ) {
+ return toString( static_cast<char>( value ) );
+}
+
+#ifdef CATCH_CONFIG_CPP11_NULLPTR
+std::string toString( std::nullptr_t ) {
+ return "nullptr";
+}
+#endif
+
+#ifdef __OBJC__
+ std::string toString( NSString const * const& nsstring ) {
+ if( !nsstring )
+ return "nil";
+ return "@" + toString([nsstring UTF8String]);
+ }
+ std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) {
+ if( !nsstring )
+ return "nil";
+ return "@" + toString([nsstring UTF8String]);
+ }
+ std::string toString( NSObject* const& nsObject ) {
+ return toString( [nsObject description] );
+ }
+#endif
+
+} // end namespace Catch
+
+// #included from: catch_result_builder.hpp
+#define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED
+
+namespace Catch {
+
+ ResultBuilder::ResultBuilder( char const* macroName,
+ SourceLineInfo const& lineInfo,
+ char const* capturedExpression,
+ ResultDisposition::Flags resultDisposition )
+ : m_assertionInfo( macroName, lineInfo, capturedExpression, resultDisposition ),
+ m_shouldDebugBreak( false ),
+ m_shouldThrow( false )
+ {}
+
+ ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) {
+ m_data.resultType = result;
+ return *this;
+ }
+ ResultBuilder& ResultBuilder::setResultType( bool result ) {
+ m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed;
+ return *this;
+ }
+ ResultBuilder& ResultBuilder::setLhs( std::string const& lhs ) {
+ m_exprComponents.lhs = lhs;
+ return *this;
+ }
+ ResultBuilder& ResultBuilder::setRhs( std::string const& rhs ) {
+ m_exprComponents.rhs = rhs;
+ return *this;
+ }
+ ResultBuilder& ResultBuilder::setOp( std::string const& op ) {
+ m_exprComponents.op = op;
+ return *this;
+ }
+
+ void ResultBuilder::endExpression() {
+ m_exprComponents.testFalse = isFalseTest( m_assertionInfo.resultDisposition );
+ captureExpression();
+ }
+
+ void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) {
+ m_assertionInfo.resultDisposition = resultDisposition;
+ m_stream.oss << Catch::translateActiveException();
+ captureResult( ResultWas::ThrewException );
+ }
+
+ void ResultBuilder::captureResult( ResultWas::OfType resultType ) {
+ setResultType( resultType );
+ captureExpression();
+ }
+
+ void ResultBuilder::captureExpression() {
+ AssertionResult result = build();
+ getResultCapture().assertionEnded( result );
+
+ if( !result.isOk() ) {
+ if( getCurrentContext().getConfig()->shouldDebugBreak() )
+ m_shouldDebugBreak = true;
+ if( getCurrentContext().getRunner()->aborting() || m_assertionInfo.resultDisposition == ResultDisposition::Normal )
+ m_shouldThrow = true;
+ }
+ }
+ void ResultBuilder::react() {
+ if( m_shouldThrow )
+ throw Catch::TestFailureException();
+ }
+
+ bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; }
+ bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); }
+
+ AssertionResult ResultBuilder::build() const
+ {
+ assert( m_data.resultType != ResultWas::Unknown );
+
+ AssertionResultData data = m_data;
+
+ // Flip bool results if testFalse is set
+ if( m_exprComponents.testFalse ) {
+ if( data.resultType == ResultWas::Ok )
+ data.resultType = ResultWas::ExpressionFailed;
+ else if( data.resultType == ResultWas::ExpressionFailed )
+ data.resultType = ResultWas::Ok;
+ }
+
+ data.message = m_stream.oss.str();
+ data.reconstructedExpression = reconstructExpression();
+ if( m_exprComponents.testFalse ) {
+ if( m_exprComponents.op == "" )
+ data.reconstructedExpression = "!" + data.reconstructedExpression;
+ else
+ data.reconstructedExpression = "!(" + data.reconstructedExpression + ")";
+ }
+ return AssertionResult( m_assertionInfo, data );
+ }
+ std::string ResultBuilder::reconstructExpression() const {
+ if( m_exprComponents.op == "" )
+ return m_exprComponents.lhs.empty() ? m_assertionInfo.capturedExpression : m_exprComponents.op + m_exprComponents.lhs;
+ else if( m_exprComponents.op == "matches" )
+ return m_exprComponents.lhs + " " + m_exprComponents.rhs;
+ else if( m_exprComponents.op != "!" ) {
+ if( m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 40 &&
+ m_exprComponents.lhs.find("\n") == std::string::npos &&
+ m_exprComponents.rhs.find("\n") == std::string::npos )
+ return m_exprComponents.lhs + " " + m_exprComponents.op + " " + m_exprComponents.rhs;
+ else
+ return m_exprComponents.lhs + "\n" + m_exprComponents.op + "\n" + m_exprComponents.rhs;
+ }
+ else
+ return "{can't expand - use " + m_assertionInfo.macroName + "_FALSE( " + m_assertionInfo.capturedExpression.substr(1) + " ) instead of " + m_assertionInfo.macroName + "( " + m_assertionInfo.capturedExpression + " ) for better diagnostics}";
+ }
+
+} // end namespace Catch
+
+// #included from: catch_tag_alias_registry.hpp
+#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED
+
+// #included from: catch_tag_alias_registry.h
+#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED
+
+#include <map>
+
+namespace Catch {
+
+ class TagAliasRegistry : public ITagAliasRegistry {
+ public:
+ virtual ~TagAliasRegistry();
+ virtual Option<TagAlias> find( std::string const& alias ) const;
+ virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const;
+ void add( char const* alias, char const* tag, SourceLineInfo const& lineInfo );
+ static TagAliasRegistry& get();
+
+ private:
+ std::map<std::string, TagAlias> m_registry;
+ };
+
+} // end namespace Catch
+
+#include <map>
+#include <iostream>
+
+namespace Catch {
+
+ TagAliasRegistry::~TagAliasRegistry() {}
+
+ Option<TagAlias> TagAliasRegistry::find( std::string const& alias ) const {
+ std::map<std::string, TagAlias>::const_iterator it = m_registry.find( alias );
+ if( it != m_registry.end() )
+ return it->second;
+ else
+ return Option<TagAlias>();
+ }
+
+ std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const {
+ std::string expandedTestSpec = unexpandedTestSpec;
+ for( std::map<std::string, TagAlias>::const_iterator it = m_registry.begin(), itEnd = m_registry.end();
+ it != itEnd;
+ ++it ) {
+ std::size_t pos = expandedTestSpec.find( it->first );
+ if( pos != std::string::npos ) {
+ expandedTestSpec = expandedTestSpec.substr( 0, pos ) +
+ it->second.tag +
+ expandedTestSpec.substr( pos + it->first.size() );
+ }
+ }
+ return expandedTestSpec;
+ }
+
+ void TagAliasRegistry::add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) {
+
+ if( !startsWith( alias, "[@" ) || !endsWith( alias, "]" ) ) {
+ std::ostringstream oss;
+ oss << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n" << lineInfo;
+ throw std::domain_error( oss.str().c_str() );
+ }
+ if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) {
+ std::ostringstream oss;
+ oss << "error: tag alias, \"" << alias << "\" already registered.\n"
+ << "\tFirst seen at " << find(alias)->lineInfo << "\n"
+ << "\tRedefined at " << lineInfo;
+ throw std::domain_error( oss.str().c_str() );
+ }
+ }
+
+ TagAliasRegistry& TagAliasRegistry::get() {
+ static TagAliasRegistry instance;
+ return instance;
+
+ }
+
+ ITagAliasRegistry::~ITagAliasRegistry() {}
+ ITagAliasRegistry const& ITagAliasRegistry::get() { return TagAliasRegistry::get(); }
+
+ RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) {
+ try {
+ TagAliasRegistry::get().add( alias, tag, lineInfo );
+ }
+ catch( std::exception& ex ) {
+ Colour colourGuard( Colour::Red );
+ Catch::cerr() << ex.what() << std::endl;
+ exit(1);
+ }
+ }
+
+} // end namespace Catch
+
+// #included from: ../reporters/catch_reporter_xml.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED
+
+// #included from: catch_reporter_bases.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED
+
+#include <cstring>
+
+namespace Catch {
+
+ struct StreamingReporterBase : SharedImpl<IStreamingReporter> {
+
+ StreamingReporterBase( ReporterConfig const& _config )
+ : m_config( _config.fullConfig() ),
+ stream( _config.stream() )
+ {}
+
+ virtual ~StreamingReporterBase();
+
+ virtual void noMatchingTestCases( std::string const& ) {}
+
+ virtual void testRunStarting( TestRunInfo const& _testRunInfo ) {
+ currentTestRunInfo = _testRunInfo;
+ }
+ virtual void testGroupStarting( GroupInfo const& _groupInfo ) {
+ currentGroupInfo = _groupInfo;
+ }
+
+ virtual void testCaseStarting( TestCaseInfo const& _testInfo ) {
+ currentTestCaseInfo = _testInfo;
+ }
+ virtual void sectionStarting( SectionInfo const& _sectionInfo ) {
+ m_sectionStack.push_back( _sectionInfo );
+ }
+
+ virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) {
+ m_sectionStack.pop_back();
+ }
+ virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) {
+ currentTestCaseInfo.reset();
+ }
+ virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) {
+ currentGroupInfo.reset();
+ }
+ virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) {
+ currentTestCaseInfo.reset();
+ currentGroupInfo.reset();
+ currentTestRunInfo.reset();
+ }
+
+ virtual void skipTest( TestCaseInfo const& ) {
+ // Don't do anything with this by default.
+ // It can optionally be overridden in the derived class.
+ }
+
+ Ptr<IConfig> m_config;
+ std::ostream& stream;
+
+ LazyStat<TestRunInfo> currentTestRunInfo;
+ LazyStat<GroupInfo> currentGroupInfo;
+ LazyStat<TestCaseInfo> currentTestCaseInfo;
+
+ std::vector<SectionInfo> m_sectionStack;
+ };
+
+ struct CumulativeReporterBase : SharedImpl<IStreamingReporter> {
+ template<typename T, typename ChildNodeT>
+ struct Node : SharedImpl<> {
+ explicit Node( T const& _value ) : value( _value ) {}
+ virtual ~Node() {}
+
+ typedef std::vector<Ptr<ChildNodeT> > ChildNodes;
+ T value;
+ ChildNodes children;
+ };
+ struct SectionNode : SharedImpl<> {
+ explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {}
+ virtual ~SectionNode();
+
+ bool operator == ( SectionNode const& other ) const {
+ return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo;
+ }
+ bool operator == ( Ptr<SectionNode> const& other ) const {
+ return operator==( *other );
+ }
+
+ SectionStats stats;
+ typedef std::vector<Ptr<SectionNode> > ChildSections;
+ typedef std::vector<AssertionStats> Assertions;
+ ChildSections childSections;
+ Assertions assertions;
+ std::string stdOut;
+ std::string stdErr;
+ };
+
+ struct BySectionInfo {
+ BySectionInfo( SectionInfo const& other ) : m_other( other ) {}
+ BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {}
+ bool operator() ( Ptr<SectionNode> const& node ) const {
+ return node->stats.sectionInfo.lineInfo == m_other.lineInfo;
+ }
+ private:
+ void operator=( BySectionInfo const& );
+ SectionInfo const& m_other;
+ };
+
+ typedef Node<TestCaseStats, SectionNode> TestCaseNode;
+ typedef Node<TestGroupStats, TestCaseNode> TestGroupNode;
+ typedef Node<TestRunStats, TestGroupNode> TestRunNode;
+
+ CumulativeReporterBase( ReporterConfig const& _config )
+ : m_config( _config.fullConfig() ),
+ stream( _config.stream() )
+ {}
+ ~CumulativeReporterBase();
+
+ virtual void testRunStarting( TestRunInfo const& ) {}
+ virtual void testGroupStarting( GroupInfo const& ) {}
+
+ virtual void testCaseStarting( TestCaseInfo const& ) {}
+
+ virtual void sectionStarting( SectionInfo const& sectionInfo ) {
+ SectionStats incompleteStats( sectionInfo, Counts(), 0, false );
+ Ptr<SectionNode> node;
+ if( m_sectionStack.empty() ) {
+ if( !m_rootSection )
+ m_rootSection = new SectionNode( incompleteStats );
+ node = m_rootSection;
+ }
+ else {
+ SectionNode& parentNode = *m_sectionStack.back();
+ SectionNode::ChildSections::const_iterator it =
+ std::find_if( parentNode.childSections.begin(),
+ parentNode.childSections.end(),
+ BySectionInfo( sectionInfo ) );
+ if( it == parentNode.childSections.end() ) {
+ node = new SectionNode( incompleteStats );
+ parentNode.childSections.push_back( node );
+ }
+ else
+ node = *it;
+ }
+ m_sectionStack.push_back( node );
+ m_deepestSection = node;
+ }
+
+ virtual void assertionStarting( AssertionInfo const& ) {}
+
+ virtual bool assertionEnded( AssertionStats const& assertionStats ) {
+ assert( !m_sectionStack.empty() );
+ SectionNode& sectionNode = *m_sectionStack.back();
+ sectionNode.assertions.push_back( assertionStats );
+ return true;
+ }
+ virtual void sectionEnded( SectionStats const& sectionStats ) {
+ assert( !m_sectionStack.empty() );
+ SectionNode& node = *m_sectionStack.back();
+ node.stats = sectionStats;
+ m_sectionStack.pop_back();
+ }
+ virtual void testCaseEnded( TestCaseStats const& testCaseStats ) {
+ Ptr<TestCaseNode> node = new TestCaseNode( testCaseStats );
+ assert( m_sectionStack.size() == 0 );
+ node->children.push_back( m_rootSection );
+ m_testCases.push_back( node );
+ m_rootSection.reset();
+
+ assert( m_deepestSection );
+ m_deepestSection->stdOut = testCaseStats.stdOut;
+ m_deepestSection->stdErr = testCaseStats.stdErr;
+ }
+ virtual void testGroupEnded( TestGroupStats const& testGroupStats ) {
+ Ptr<TestGroupNode> node = new TestGroupNode( testGroupStats );
+ node->children.swap( m_testCases );
+ m_testGroups.push_back( node );
+ }
+ virtual void testRunEnded( TestRunStats const& testRunStats ) {
+ Ptr<TestRunNode> node = new TestRunNode( testRunStats );
+ node->children.swap( m_testGroups );
+ m_testRuns.push_back( node );
+ testRunEndedCumulative();
+ }
+ virtual void testRunEndedCumulative() = 0;
+
+ virtual void skipTest( TestCaseInfo const& ) {}
+
+ Ptr<IConfig> m_config;
+ std::ostream& stream;
+ std::vector<AssertionStats> m_assertions;
+ std::vector<std::vector<Ptr<SectionNode> > > m_sections;
+ std::vector<Ptr<TestCaseNode> > m_testCases;
+ std::vector<Ptr<TestGroupNode> > m_testGroups;
+
+ std::vector<Ptr<TestRunNode> > m_testRuns;
+
+ Ptr<SectionNode> m_rootSection;
+ Ptr<SectionNode> m_deepestSection;
+ std::vector<Ptr<SectionNode> > m_sectionStack;
+
+ };
+
+ template<char C>
+ char const* getLineOfChars() {
+ static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0};
+ if( !*line ) {
+ memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 );
+ line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0;
+ }
+ return line;
+ }
+
+} // end namespace Catch
+
+// #included from: ../internal/catch_reporter_registrars.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED
+
+namespace Catch {
+
+ template<typename T>
+ class LegacyReporterRegistrar {
+
+ class ReporterFactory : public IReporterFactory {
+ virtual IStreamingReporter* create( ReporterConfig const& config ) const {
+ return new LegacyReporterAdapter( new T( config ) );
+ }
+
+ virtual std::string getDescription() const {
+ return T::getDescription();
+ }
+ };
+
+ public:
+
+ LegacyReporterRegistrar( std::string const& name ) {
+ getMutableRegistryHub().registerReporter( name, new ReporterFactory() );
+ }
+ };
+
+ template<typename T>
+ class ReporterRegistrar {
+
+ class ReporterFactory : public IReporterFactory {
+
+ // *** Please Note ***:
+ // - If you end up here looking at a compiler error because it's trying to register
+ // your custom reporter class be aware that the native reporter interface has changed
+ // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via
+ // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter.
+ // However please consider updating to the new interface as the old one is now
+ // deprecated and will probably be removed quite soon!
+ // Please contact me via github if you have any questions at all about this.
+ // In fact, ideally, please contact me anyway to let me know you've hit this - as I have
+ // no idea who is actually using custom reporters at all (possibly no-one!).
+ // The new interface is designed to minimise exposure to interface changes in the future.
+ virtual IStreamingReporter* create( ReporterConfig const& config ) const {
+ return new T( config );
+ }
+
+ virtual std::string getDescription() const {
+ return T::getDescription();
+ }
+ };
+
+ public:
+
+ ReporterRegistrar( std::string const& name ) {
+ getMutableRegistryHub().registerReporter( name, new ReporterFactory() );
+ }
+ };
+}
+
+#define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \
+ namespace{ Catch::LegacyReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); }
+#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \
+ namespace{ Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); }
+
+// #included from: ../internal/catch_xmlwriter.hpp
+#define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED
+
+#include <sstream>
+#include <string>
+#include <vector>
+
+namespace Catch {
+
+ class XmlWriter {
+ public:
+
+ class ScopedElement {
+ public:
+ ScopedElement( XmlWriter* writer )
+ : m_writer( writer )
+ {}
+
+ ScopedElement( ScopedElement const& other )
+ : m_writer( other.m_writer ){
+ other.m_writer = NULL;
+ }
+
+ ~ScopedElement() {
+ if( m_writer )
+ m_writer->endElement();
+ }
+
+ ScopedElement& writeText( std::string const& text, bool indent = true ) {
+ m_writer->writeText( text, indent );
+ return *this;
+ }
+
+ template<typename T>
+ ScopedElement& writeAttribute( std::string const& name, T const& attribute ) {
+ m_writer->writeAttribute( name, attribute );
+ return *this;
+ }
+
+ private:
+ mutable XmlWriter* m_writer;
+ };
+
+ XmlWriter()
+ : m_tagIsOpen( false ),
+ m_needsNewline( false ),
+ m_os( &Catch::cout() )
+ {}
+
+ XmlWriter( std::ostream& os )
+ : m_tagIsOpen( false ),
+ m_needsNewline( false ),
+ m_os( &os )
+ {}
+
+ ~XmlWriter() {
+ while( !m_tags.empty() )
+ endElement();
+ }
+
+//# ifndef CATCH_CPP11_OR_GREATER
+// XmlWriter& operator = ( XmlWriter const& other ) {
+// XmlWriter temp( other );
+// swap( temp );
+// return *this;
+// }
+//# else
+// XmlWriter( XmlWriter const& ) = default;
+// XmlWriter( XmlWriter && ) = default;
+// XmlWriter& operator = ( XmlWriter const& ) = default;
+// XmlWriter& operator = ( XmlWriter && ) = default;
+//# endif
+//
+// void swap( XmlWriter& other ) {
+// std::swap( m_tagIsOpen, other.m_tagIsOpen );
+// std::swap( m_needsNewline, other.m_needsNewline );
+// std::swap( m_tags, other.m_tags );
+// std::swap( m_indent, other.m_indent );
+// std::swap( m_os, other.m_os );
+// }
+
+ XmlWriter& startElement( std::string const& name ) {
+ ensureTagClosed();
+ newlineIfNecessary();
+ stream() << m_indent << "<" << name;
+ m_tags.push_back( name );
+ m_indent += " ";
+ m_tagIsOpen = true;
+ return *this;
+ }
+
+ ScopedElement scopedElement( std::string const& name ) {
+ ScopedElement scoped( this );
+ startElement( name );
+ return scoped;
+ }
+
+ XmlWriter& endElement() {
+ newlineIfNecessary();
+ m_indent = m_indent.substr( 0, m_indent.size()-2 );
+ if( m_tagIsOpen ) {
+ stream() << "/>\n";
+ m_tagIsOpen = false;
+ }
+ else {
+ stream() << m_indent << "</" << m_tags.back() << ">\n";
+ }
+ m_tags.pop_back();
+ return *this;
+ }
+
+ XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) {
+ if( !name.empty() && !attribute.empty() ) {
+ stream() << " " << name << "=\"";
+ writeEncodedText( attribute );
+ stream() << "\"";
+ }
+ return *this;
+ }
+
+ XmlWriter& writeAttribute( std::string const& name, bool attribute ) {
+ stream() << " " << name << "=\"" << ( attribute ? "true" : "false" ) << "\"";
+ return *this;
+ }
+
+ template<typename T>
+ XmlWriter& writeAttribute( std::string const& name, T const& attribute ) {
+ if( !name.empty() )
+ stream() << " " << name << "=\"" << attribute << "\"";
+ return *this;
+ }
+
+ XmlWriter& writeText( std::string const& text, bool indent = true ) {
+ if( !text.empty() ){
+ bool tagWasOpen = m_tagIsOpen;
+ ensureTagClosed();
+ if( tagWasOpen && indent )
+ stream() << m_indent;
+ writeEncodedText( text );
+ m_needsNewline = true;
+ }
+ return *this;
+ }
+
+ XmlWriter& writeComment( std::string const& text ) {
+ ensureTagClosed();
+ stream() << m_indent << "<!--" << text << "-->";
+ m_needsNewline = true;
+ return *this;
+ }
+
+ XmlWriter& writeBlankLine() {
+ ensureTagClosed();
+ stream() << "\n";
+ return *this;
+ }
+
+ void setStream( std::ostream& os ) {
+ m_os = &os;
+ }
+
+ private:
+ XmlWriter( XmlWriter const& );
+ void operator=( XmlWriter const& );
+
+ std::ostream& stream() {
+ return *m_os;
+ }
+
+ void ensureTagClosed() {
+ if( m_tagIsOpen ) {
+ stream() << ">\n";
+ m_tagIsOpen = false;
+ }
+ }
+
+ void newlineIfNecessary() {
+ if( m_needsNewline ) {
+ stream() << "\n";
+ m_needsNewline = false;
+ }
+ }
+
+ void writeEncodedText( std::string const& text ) {
+ static const char* charsToEncode = "<&\"";
+ std::string mtext = text;
+ std::string::size_type pos = mtext.find_first_of( charsToEncode );
+ while( pos != std::string::npos ) {
+ stream() << mtext.substr( 0, pos );
+
+ switch( mtext[pos] ) {
+ case '<':
+ stream() << "<";
+ break;
+ case '&':
+ stream() << "&";
+ break;
+ case '\"':
+ stream() << """;
+ break;
+ }
+ mtext = mtext.substr( pos+1 );
+ pos = mtext.find_first_of( charsToEncode );
+ }
+ stream() << mtext;
+ }
+
+ bool m_tagIsOpen;
+ bool m_needsNewline;
+ std::vector<std::string> m_tags;
+ std::string m_indent;
+ std::ostream* m_os;
+ };
+
+}
+namespace Catch {
+ class XmlReporter : public StreamingReporterBase {
+ public:
+ XmlReporter( ReporterConfig const& _config )
+ : StreamingReporterBase( _config ),
+ m_sectionDepth( 0 )
+ {}
+
+ virtual ~XmlReporter();
+
+ static std::string getDescription() {
+ return "Reports test results as an XML document";
+ }
+
+ public: // StreamingReporterBase
+ virtual ReporterPreferences getPreferences() const {
+ ReporterPreferences prefs;
+ prefs.shouldRedirectStdOut = true;
+ return prefs;
+ }
+
+ virtual void noMatchingTestCases( std::string const& s ) {
+ StreamingReporterBase::noMatchingTestCases( s );
+ }
+
+ virtual void testRunStarting( TestRunInfo const& testInfo ) {
+ StreamingReporterBase::testRunStarting( testInfo );
+ m_xml.setStream( stream );
+ m_xml.startElement( "Catch" );
+ if( !m_config->name().empty() )
+ m_xml.writeAttribute( "name", m_config->name() );
+ }
+
+ virtual void testGroupStarting( GroupInfo const& groupInfo ) {
+ StreamingReporterBase::testGroupStarting( groupInfo );
+ m_xml.startElement( "Group" )
+ .writeAttribute( "name", groupInfo.name );
+ }
+
+ virtual void testCaseStarting( TestCaseInfo const& testInfo ) {
+ StreamingReporterBase::testCaseStarting(testInfo);
+ m_xml.startElement( "TestCase" ).writeAttribute( "name", trim( testInfo.name ) );
+
+ if ( m_config->showDurations() == ShowDurations::Always )
+ m_testCaseTimer.start();
+ }
+
+ virtual void sectionStarting( SectionInfo const& sectionInfo ) {
+ StreamingReporterBase::sectionStarting( sectionInfo );
+ if( m_sectionDepth++ > 0 ) {
+ m_xml.startElement( "Section" )
+ .writeAttribute( "name", trim( sectionInfo.name ) )
+ .writeAttribute( "description", sectionInfo.description );
+ }
+ }
+
+ virtual void assertionStarting( AssertionInfo const& ) { }
+
+ virtual bool assertionEnded( AssertionStats const& assertionStats ) {
+ const AssertionResult& assertionResult = assertionStats.assertionResult;
+
+ // Print any info messages in <Info> tags.
+ if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) {
+ for( std::vector<MessageInfo>::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end();
+ it != itEnd;
+ ++it ) {
+ if( it->type == ResultWas::Info ) {
+ m_xml.scopedElement( "Info" )
+ .writeText( it->message );
+ } else if ( it->type == ResultWas::Warning ) {
+ m_xml.scopedElement( "Warning" )
+ .writeText( it->message );
+ }
+ }
+ }
+
+ // Drop out if result was successful but we're not printing them.
+ if( !m_config->includeSuccessfulResults() && isOk(assertionResult.getResultType()) )
+ return true;
+
+ // Print the expression if there is one.
+ if( assertionResult.hasExpression() ) {
+ m_xml.startElement( "Expression" )
+ .writeAttribute( "success", assertionResult.succeeded() )
+ .writeAttribute( "type", assertionResult.getTestMacroName() )
+ .writeAttribute( "filename", assertionResult.getSourceInfo().file )
+ .writeAttribute( "line", assertionResult.getSourceInfo().line );
+
+ m_xml.scopedElement( "Original" )
+ .writeText( assertionResult.getExpression() );
+ m_xml.scopedElement( "Expanded" )
+ .writeText( assertionResult.getExpandedExpression() );
+ }
+
+ // And... Print a result applicable to each result type.
+ switch( assertionResult.getResultType() ) {
+ case ResultWas::ThrewException:
+ m_xml.scopedElement( "Exception" )
+ .writeAttribute( "filename", assertionResult.getSourceInfo().file )
+ .writeAttribute( "line", assertionResult.getSourceInfo().line )
+ .writeText( assertionResult.getMessage() );
+ break;
+ case ResultWas::FatalErrorCondition:
+ m_xml.scopedElement( "Fatal Error Condition" )
+ .writeAttribute( "filename", assertionResult.getSourceInfo().file )
+ .writeAttribute( "line", assertionResult.getSourceInfo().line )
+ .writeText( assertionResult.getMessage() );
+ break;
+ case ResultWas::Info:
+ m_xml.scopedElement( "Info" )
+ .writeText( assertionResult.getMessage() );
+ break;
+ case ResultWas::Warning:
+ // Warning will already have been written
+ break;
+ case ResultWas::ExplicitFailure:
+ m_xml.scopedElement( "Failure" )
+ .writeText( assertionResult.getMessage() );
+ break;
+ default:
+ break;
+ }
+
+ if( assertionResult.hasExpression() )
+ m_xml.endElement();
+
+ return true;
+ }
+
+ virtual void sectionEnded( SectionStats const& sectionStats ) {
+ StreamingReporterBase::sectionEnded( sectionStats );
+ if( --m_sectionDepth > 0 ) {
+ XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" );
+ e.writeAttribute( "successes", sectionStats.assertions.passed );
+ e.writeAttribute( "failures", sectionStats.assertions.failed );
+ e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk );
+
+ if ( m_config->showDurations() == ShowDurations::Always )
+ e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds );
+
+ m_xml.endElement();
+ }
+ }
+
+ virtual void testCaseEnded( TestCaseStats const& testCaseStats ) {
+ StreamingReporterBase::testCaseEnded( testCaseStats );
+ XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" );
+ e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() );
+
+ if ( m_config->showDurations() == ShowDurations::Always )
+ e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() );
+
+ m_xml.endElement();
+ }
+
+ virtual void testGroupEnded( TestGroupStats const& testGroupStats ) {
+ StreamingReporterBase::testGroupEnded( testGroupStats );
+ // TODO: Check testGroupStats.aborting and act accordingly.
+ m_xml.scopedElement( "OverallResults" )
+ .writeAttribute( "successes", testGroupStats.totals.assertions.passed )
+ .writeAttribute( "failures", testGroupStats.totals.assertions.failed )
+ .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk );
+ m_xml.endElement();
+ }
+
+ virtual void testRunEnded( TestRunStats const& testRunStats ) {
+ StreamingReporterBase::testRunEnded( testRunStats );
+ m_xml.scopedElement( "OverallResults" )
+ .writeAttribute( "successes", testRunStats.totals.assertions.passed )
+ .writeAttribute( "failures", testRunStats.totals.assertions.failed )
+ .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk );
+ m_xml.endElement();
+ }
+
+ private:
+ Timer m_testCaseTimer;
+ XmlWriter m_xml;
+ int m_sectionDepth;
+ };
+
+ INTERNAL_CATCH_REGISTER_REPORTER( "xml", XmlReporter )
+
+} // end namespace Catch
+
+// #included from: ../reporters/catch_reporter_junit.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED
+
+#include <assert.h>
+
+namespace Catch {
+
+ class JunitReporter : public CumulativeReporterBase {
+ public:
+ JunitReporter( ReporterConfig const& _config )
+ : CumulativeReporterBase( _config ),
+ xml( _config.stream() )
+ {}
+
+ ~JunitReporter();
+
+ static std::string getDescription() {
+ return "Reports test results in an XML format that looks like Ant's junitreport target";
+ }
+
+ virtual void noMatchingTestCases( std::string const& /*spec*/ ) {}
+
+ virtual ReporterPreferences getPreferences() const {
+ ReporterPreferences prefs;
+ prefs.shouldRedirectStdOut = true;
+ return prefs;
+ }
+
+ virtual void testRunStarting( TestRunInfo const& runInfo ) {
+ CumulativeReporterBase::testRunStarting( runInfo );
+ xml.startElement( "testsuites" );
+ }
+
+ virtual void testGroupStarting( GroupInfo const& groupInfo ) {
+ suiteTimer.start();
+ stdOutForSuite.str("");
+ stdErrForSuite.str("");
+ unexpectedExceptions = 0;
+ CumulativeReporterBase::testGroupStarting( groupInfo );
+ }
+
+ virtual bool assertionEnded( AssertionStats const& assertionStats ) {
+ if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException )
+ unexpectedExceptions++;
+ return CumulativeReporterBase::assertionEnded( assertionStats );
+ }
+
+ virtual void testCaseEnded( TestCaseStats const& testCaseStats ) {
+ stdOutForSuite << testCaseStats.stdOut;
+ stdErrForSuite << testCaseStats.stdErr;
+ CumulativeReporterBase::testCaseEnded( testCaseStats );
+ }
+
+ virtual void testGroupEnded( TestGroupStats const& testGroupStats ) {
+ double suiteTime = suiteTimer.getElapsedSeconds();
+ CumulativeReporterBase::testGroupEnded( testGroupStats );
+ writeGroup( *m_testGroups.back(), suiteTime );
+ }
+
+ virtual void testRunEndedCumulative() {
+ xml.endElement();
+ }
+
+ void writeGroup( TestGroupNode const& groupNode, double suiteTime ) {
+ XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" );
+ TestGroupStats const& stats = groupNode.value;
+ xml.writeAttribute( "name", stats.groupInfo.name );
+ xml.writeAttribute( "errors", unexpectedExceptions );
+ xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions );
+ xml.writeAttribute( "tests", stats.totals.assertions.total() );
+ xml.writeAttribute( "hostname", "tbd" ); // !TBD
+ if( m_config->showDurations() == ShowDurations::Never )
+ xml.writeAttribute( "time", "" );
+ else
+ xml.writeAttribute( "time", suiteTime );
+ xml.writeAttribute( "timestamp", "tbd" ); // !TBD
+
+ // Write test cases
+ for( TestGroupNode::ChildNodes::const_iterator
+ it = groupNode.children.begin(), itEnd = groupNode.children.end();
+ it != itEnd;
+ ++it )
+ writeTestCase( **it );
+
+ xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false );
+ xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false );
+ }
+
+ void writeTestCase( TestCaseNode const& testCaseNode ) {
+ TestCaseStats const& stats = testCaseNode.value;
+
+ // All test cases have exactly one section - which represents the
+ // test case itself. That section may have 0-n nested sections
+ assert( testCaseNode.children.size() == 1 );
+ SectionNode const& rootSection = *testCaseNode.children.front();
+
+ std::string className = stats.testInfo.className;
+
+ if( className.empty() ) {
+ if( rootSection.childSections.empty() )
+ className = "global";
+ }
+ writeSection( className, "", rootSection );
+ }
+
+ void writeSection( std::string const& className,
+ std::string const& rootName,
+ SectionNode const& sectionNode ) {
+ std::string name = trim( sectionNode.stats.sectionInfo.name );
+ if( !rootName.empty() )
+ name = rootName + "/" + name;
+
+ if( !sectionNode.assertions.empty() ||
+ !sectionNode.stdOut.empty() ||
+ !sectionNode.stdErr.empty() ) {
+ XmlWriter::ScopedElement e = xml.scopedElement( "testcase" );
+ if( className.empty() ) {
+ xml.writeAttribute( "classname", name );
+ xml.writeAttribute( "name", "root" );
+ }
+ else {
+ xml.writeAttribute( "classname", className );
+ xml.writeAttribute( "name", name );
+ }
+ xml.writeAttribute( "time", Catch::toString( sectionNode.stats.durationInSeconds ) );
+
+ writeAssertions( sectionNode );
+
+ if( !sectionNode.stdOut.empty() )
+ xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false );
+ if( !sectionNode.stdErr.empty() )
+ xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false );
+ }
+ for( SectionNode::ChildSections::const_iterator
+ it = sectionNode.childSections.begin(),
+ itEnd = sectionNode.childSections.end();
+ it != itEnd;
+ ++it )
+ if( className.empty() )
+ writeSection( name, "", **it );
+ else
+ writeSection( className, name, **it );
+ }
+
+ void writeAssertions( SectionNode const& sectionNode ) {
+ for( SectionNode::Assertions::const_iterator
+ it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end();
+ it != itEnd;
+ ++it )
+ writeAssertion( *it );
+ }
+ void writeAssertion( AssertionStats const& stats ) {
+ AssertionResult const& result = stats.assertionResult;
+ if( !result.isOk() ) {
+ std::string elementName;
+ switch( result.getResultType() ) {
+ case ResultWas::ThrewException:
+ case ResultWas::FatalErrorCondition:
+ elementName = "error";
+ break;
+ case ResultWas::ExplicitFailure:
+ elementName = "failure";
+ break;
+ case ResultWas::ExpressionFailed:
+ elementName = "failure";
+ break;
+ case ResultWas::DidntThrowException:
+ elementName = "failure";
+ break;
+
+ // We should never see these here:
+ case ResultWas::Info:
+ case ResultWas::Warning:
+ case ResultWas::Ok:
+ case ResultWas::Unknown:
+ case ResultWas::FailureBit:
+ case ResultWas::Exception:
+ elementName = "internalError";
+ break;
+ }
+
+ XmlWriter::ScopedElement e = xml.scopedElement( elementName );
+
+ xml.writeAttribute( "message", result.getExpandedExpression() );
+ xml.writeAttribute( "type", result.getTestMacroName() );
+
+ std::ostringstream oss;
+ if( !result.getMessage().empty() )
+ oss << result.getMessage() << "\n";
+ for( std::vector<MessageInfo>::const_iterator
+ it = stats.infoMessages.begin(),
+ itEnd = stats.infoMessages.end();
+ it != itEnd;
+ ++it )
+ if( it->type == ResultWas::Info )
+ oss << it->message << "\n";
+
+ oss << "at " << result.getSourceInfo();
+ xml.writeText( oss.str(), false );
+ }
+ }
+
+ XmlWriter xml;
+ Timer suiteTimer;
+ std::ostringstream stdOutForSuite;
+ std::ostringstream stdErrForSuite;
+ unsigned int unexpectedExceptions;
+ };
+
+ INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter )
+
+} // end namespace Catch
+
+// #included from: ../reporters/catch_reporter_console.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED
+
+namespace Catch {
+
+ struct ConsoleReporter : StreamingReporterBase {
+ ConsoleReporter( ReporterConfig const& _config )
+ : StreamingReporterBase( _config ),
+ m_headerPrinted( false )
+ {}
+
+ virtual ~ConsoleReporter();
+ static std::string getDescription() {
+ return "Reports test results as plain lines of text";
+ }
+ virtual ReporterPreferences getPreferences() const {
+ ReporterPreferences prefs;
+ prefs.shouldRedirectStdOut = false;
+ return prefs;
+ }
+
+ virtual void noMatchingTestCases( std::string const& spec ) {
+ stream << "No test cases matched '" << spec << "'" << std::endl;
+ }
+
+ virtual void assertionStarting( AssertionInfo const& ) {
+ }
+
+ virtual bool assertionEnded( AssertionStats const& _assertionStats ) {
+ AssertionResult const& result = _assertionStats.assertionResult;
+
+ bool printInfoMessages = true;
+
+ // Drop out if result was successful and we're not printing those
+ if( !m_config->includeSuccessfulResults() && result.isOk() ) {
+ if( result.getResultType() != ResultWas::Warning )
+ return false;
+ printInfoMessages = false;
+ }
+
+ lazyPrint();
+
+ AssertionPrinter printer( stream, _assertionStats, printInfoMessages );
+ printer.print();
+ stream << std::endl;
+ return true;
+ }
+
+ virtual void sectionStarting( SectionInfo const& _sectionInfo ) {
+ m_headerPrinted = false;
+ StreamingReporterBase::sectionStarting( _sectionInfo );
+ }
+ virtual void sectionEnded( SectionStats const& _sectionStats ) {
+ if( _sectionStats.missingAssertions ) {
+ lazyPrint();
+ Colour colour( Colour::ResultError );
+ if( m_sectionStack.size() > 1 )
+ stream << "\nNo assertions in section";
+ else
+ stream << "\nNo assertions in test case";
+ stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl;
+ }
+ if( m_headerPrinted ) {
+ if( m_config->showDurations() == ShowDurations::Always )
+ stream << "Completed in " << _sectionStats.durationInSeconds << "s" << std::endl;
+ m_headerPrinted = false;
+ }
+ else {
+ if( m_config->showDurations() == ShowDurations::Always )
+ stream << _sectionStats.sectionInfo.name << " completed in " << _sectionStats.durationInSeconds << "s" << std::endl;
+ }
+ StreamingReporterBase::sectionEnded( _sectionStats );
+ }
+
+ virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) {
+ StreamingReporterBase::testCaseEnded( _testCaseStats );
+ m_headerPrinted = false;
+ }
+ virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) {
+ if( currentGroupInfo.used ) {
+ printSummaryDivider();
+ stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n";
+ printTotals( _testGroupStats.totals );
+ stream << "\n" << std::endl;
+ }
+ StreamingReporterBase::testGroupEnded( _testGroupStats );
+ }
+ virtual void testRunEnded( TestRunStats const& _testRunStats ) {
+ printTotalsDivider( _testRunStats.totals );
+ printTotals( _testRunStats.totals );
+ stream << std::endl;
+ StreamingReporterBase::testRunEnded( _testRunStats );
+ }
+
+ private:
+
+ class AssertionPrinter {
+ void operator= ( AssertionPrinter const& );
+ public:
+ AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages )
+ : stream( _stream ),
+ stats( _stats ),
+ result( _stats.assertionResult ),
+ colour( Colour::None ),
+ message( result.getMessage() ),
+ messages( _stats.infoMessages ),
+ printInfoMessages( _printInfoMessages )
+ {
+ switch( result.getResultType() ) {
+ case ResultWas::Ok:
+ colour = Colour::Success;
+ passOrFail = "PASSED";
+ //if( result.hasMessage() )
+ if( _stats.infoMessages.size() == 1 )
+ messageLabel = "with message";
+ if( _stats.infoMessages.size() > 1 )
+ messageLabel = "with messages";
+ break;
+ case ResultWas::ExpressionFailed:
+ if( result.isOk() ) {
+ colour = Colour::Success;
+ passOrFail = "FAILED - but was ok";
+ }
+ else {
+ colour = Colour::Error;
+ passOrFail = "FAILED";
+ }
+ if( _stats.infoMessages.size() == 1 )
+ messageLabel = "with message";
+ if( _stats.infoMessages.size() > 1 )
+ messageLabel = "with messages";
+ break;
+ case ResultWas::ThrewException:
+ colour = Colour::Error;
+ passOrFail = "FAILED";
+ messageLabel = "due to unexpected exception with message";
+ break;
+ case ResultWas::FatalErrorCondition:
+ colour = Colour::Error;
+ passOrFail = "FAILED";
+ messageLabel = "due to a fatal error condition";
+ break;
+ case ResultWas::DidntThrowException:
+ colour = Colour::Error;
+ passOrFail = "FAILED";
+ messageLabel = "because no exception was thrown where one was expected";
+ break;
+ case ResultWas::Info:
+ messageLabel = "info";
+ break;
+ case ResultWas::Warning:
+ messageLabel = "warning";
+ break;
+ case ResultWas::ExplicitFailure:
+ passOrFail = "FAILED";
+ colour = Colour::Error;
+ if( _stats.infoMessages.size() == 1 )
+ messageLabel = "explicitly with message";
+ if( _stats.infoMessages.size() > 1 )
+ messageLabel = "explicitly with messages";
+ break;
+ // These cases are here to prevent compiler warnings
+ case ResultWas::Unknown:
+ case ResultWas::FailureBit:
+ case ResultWas::Exception:
+ passOrFail = "** internal error **";
+ colour = Colour::Error;
+ break;
+ }
+ }
+
+ void print() const {
+ printSourceInfo();
+ if( stats.totals.assertions.total() > 0 ) {
+ if( result.isOk() )
+ stream << "\n";
+ printResultType();
+ printOriginalExpression();
+ printReconstructedExpression();
+ }
+ else {
+ stream << "\n";
+ }
+ printMessage();
+ }
+
+ private:
+ void printResultType() const {
+ if( !passOrFail.empty() ) {
+ Colour colourGuard( colour );
+ stream << passOrFail << ":\n";
+ }
+ }
+ void printOriginalExpression() const {
+ if( result.hasExpression() ) {
+ Colour colourGuard( Colour::OriginalExpression );
+ stream << " ";
+ stream << result.getExpressionInMacro();
+ stream << "\n";
+ }
+ }
+ void printReconstructedExpression() const {
+ if( result.hasExpandedExpression() ) {
+ stream << "with expansion:\n";
+ Colour colourGuard( Colour::ReconstructedExpression );
+ stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << "\n";
+ }
+ }
+ void printMessage() const {
+ if( !messageLabel.empty() )
+ stream << messageLabel << ":" << "\n";
+ for( std::vector<MessageInfo>::const_iterator it = messages.begin(), itEnd = messages.end();
+ it != itEnd;
+ ++it ) {
+ // If this assertion is a warning ignore any INFO messages
+ if( printInfoMessages || it->type != ResultWas::Info )
+ stream << Text( it->message, TextAttributes().setIndent(2) ) << "\n";
+ }
+ }
+ void printSourceInfo() const {
+ Colour colourGuard( Colour::FileName );
+ stream << result.getSourceInfo() << ": ";
+ }
+
+ std::ostream& stream;
+ AssertionStats const& stats;
+ AssertionResult const& result;
+ Colour::Code colour;
+ std::string passOrFail;
+ std::string messageLabel;
+ std::string message;
+ std::vector<MessageInfo> messages;
+ bool printInfoMessages;
+ };
+
+ void lazyPrint() {
+
+ if( !currentTestRunInfo.used )
+ lazyPrintRunInfo();
+ if( !currentGroupInfo.used )
+ lazyPrintGroupInfo();
+
+ if( !m_headerPrinted ) {
+ printTestCaseAndSectionHeader();
+ m_headerPrinted = true;
+ }
+ }
+ void lazyPrintRunInfo() {
+ stream << "\n" << getLineOfChars<'~'>() << "\n";
+ Colour colour( Colour::SecondaryText );
+ stream << currentTestRunInfo->name
+ << " is a Catch v" << libraryVersion.majorVersion << "."
+ << libraryVersion.minorVersion << " b"
+ << libraryVersion.buildNumber;
+ if( libraryVersion.branchName != std::string( "master" ) )
+ stream << " (" << libraryVersion.branchName << ")";
+ stream << " host application.\n"
+ << "Run with -? for options\n\n";
+
+ if( m_config->rngSeed() != 0 )
+ stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n";
+
+ currentTestRunInfo.used = true;
+ }
+ void lazyPrintGroupInfo() {
+ if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) {
+ printClosedHeader( "Group: " + currentGroupInfo->name );
+ currentGroupInfo.used = true;
+ }
+ }
+ void printTestCaseAndSectionHeader() {
+ assert( !m_sectionStack.empty() );
+ printOpenHeader( currentTestCaseInfo->name );
+
+ if( m_sectionStack.size() > 1 ) {
+ Colour colourGuard( Colour::Headers );
+
+ std::vector<SectionInfo>::const_iterator
+ it = m_sectionStack.begin()+1, // Skip first section (test case)
+ itEnd = m_sectionStack.end();
+ for( ; it != itEnd; ++it )
+ printHeaderString( it->name, 2 );
+ }
+
+ SourceLineInfo lineInfo = m_sectionStack.front().lineInfo;
+
+ if( !lineInfo.empty() ){
+ stream << getLineOfChars<'-'>() << "\n";
+ Colour colourGuard( Colour::FileName );
+ stream << lineInfo << "\n";
+ }
+ stream << getLineOfChars<'.'>() << "\n" << std::endl;
+ }
+
+ void printClosedHeader( std::string const& _name ) {
+ printOpenHeader( _name );
+ stream << getLineOfChars<'.'>() << "\n";
+ }
+ void printOpenHeader( std::string const& _name ) {
+ stream << getLineOfChars<'-'>() << "\n";
+ {
+ Colour colourGuard( Colour::Headers );
+ printHeaderString( _name );
+ }
+ }
+
+ // if string has a : in first line will set indent to follow it on
+ // subsequent lines
+ void printHeaderString( std::string const& _string, std::size_t indent = 0 ) {
+ std::size_t i = _string.find( ": " );
+ if( i != std::string::npos )
+ i+=2;
+ else
+ i = 0;
+ stream << Text( _string, TextAttributes()
+ .setIndent( indent+i)
+ .setInitialIndent( indent ) ) << "\n";
+ }
+
+ struct SummaryColumn {
+
+ SummaryColumn( std::string const& _label, Colour::Code _colour )
+ : label( _label ),
+ colour( _colour )
+ {}
+ SummaryColumn addRow( std::size_t count ) {
+ std::ostringstream oss;
+ oss << count;
+ std::string row = oss.str();
+ for( std::vector<std::string>::iterator it = rows.begin(); it != rows.end(); ++it ) {
+ while( it->size() < row.size() )
+ *it = " " + *it;
+ while( it->size() > row.size() )
+ row = " " + row;
+ }
+ rows.push_back( row );
+ return *this;
+ }
+
+ std::string label;
+ Colour::Code colour;
+ std::vector<std::string> rows;
+
+ };
+
+ void printTotals( Totals const& totals ) {
+ if( totals.testCases.total() == 0 ) {
+ stream << Colour( Colour::Warning ) << "No tests ran\n";
+ }
+ else if( totals.assertions.total() > 0 && totals.assertions.allPassed() ) {
+ stream << Colour( Colour::ResultSuccess ) << "All tests passed";
+ stream << " ("
+ << pluralise( totals.assertions.passed, "assertion" ) << " in "
+ << pluralise( totals.testCases.passed, "test case" ) << ")"
+ << "\n";
+ }
+ else {
+
+ std::vector<SummaryColumn> columns;
+ columns.push_back( SummaryColumn( "", Colour::None )
+ .addRow( totals.testCases.total() )
+ .addRow( totals.assertions.total() ) );
+ columns.push_back( SummaryColumn( "passed", Colour::Success )
+ .addRow( totals.testCases.passed )
+ .addRow( totals.assertions.passed ) );
+ columns.push_back( SummaryColumn( "failed", Colour::ResultError )
+ .addRow( totals.testCases.failed )
+ .addRow( totals.assertions.failed ) );
+ columns.push_back( SummaryColumn( "failed as expected", Colour::ResultExpectedFailure )
+ .addRow( totals.testCases.failedButOk )
+ .addRow( totals.assertions.failedButOk ) );
+
+ printSummaryRow( "test cases", columns, 0 );
+ printSummaryRow( "assertions", columns, 1 );
+ }
+ }
+ void printSummaryRow( std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row ) {
+ for( std::vector<SummaryColumn>::const_iterator it = cols.begin(); it != cols.end(); ++it ) {
+ std::string value = it->rows[row];
+ if( it->label.empty() ) {
+ stream << label << ": ";
+ if( value != "0" )
+ stream << value;
+ else
+ stream << Colour( Colour::Warning ) << "- none -";
+ }
+ else if( value != "0" ) {
+ stream << Colour( Colour::LightGrey ) << " | ";
+ stream << Colour( it->colour )
+ << value << " " << it->label;
+ }
+ }
+ stream << "\n";
+ }
+
+ static std::size_t makeRatio( std::size_t number, std::size_t total ) {
+ std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number/ total : 0;
+ return ( ratio == 0 && number > 0 ) ? 1 : ratio;
+ }
+ static std::size_t& findMax( std::size_t& i, std::size_t& j, std::size_t& k ) {
+ if( i > j && i > k )
+ return i;
+ else if( j > k )
+ return j;
+ else
+ return k;
+ }
+
+ void printTotalsDivider( Totals const& totals ) {
+ if( totals.testCases.total() > 0 ) {
+ std::size_t failedRatio = makeRatio( totals.testCases.failed, totals.testCases.total() );
+ std::size_t failedButOkRatio = makeRatio( totals.testCases.failedButOk, totals.testCases.total() );
+ std::size_t passedRatio = makeRatio( totals.testCases.passed, totals.testCases.total() );
+ while( failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH-1 )
+ findMax( failedRatio, failedButOkRatio, passedRatio )++;
+ while( failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH-1 )
+ findMax( failedRatio, failedButOkRatio, passedRatio )--;
+
+ stream << Colour( Colour::Error ) << std::string( failedRatio, '=' );
+ stream << Colour( Colour::ResultExpectedFailure ) << std::string( failedButOkRatio, '=' );
+ if( totals.testCases.allPassed() )
+ stream << Colour( Colour::ResultSuccess ) << std::string( passedRatio, '=' );
+ else
+ stream << Colour( Colour::Success ) << std::string( passedRatio, '=' );
+ }
+ else {
+ stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' );
+ }
+ stream << "\n";
+ }
+ void printSummaryDivider() {
+ stream << getLineOfChars<'-'>() << "\n";
+ }
+
+ private:
+ bool m_headerPrinted;
+ };
+
+ INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter )
+
+} // end namespace Catch
+
+// #included from: ../reporters/catch_reporter_compact.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED
+
+namespace Catch {
+
+ struct CompactReporter : StreamingReporterBase {
+
+ CompactReporter( ReporterConfig const& _config )
+ : StreamingReporterBase( _config )
+ {}
+
+ virtual ~CompactReporter();
+
+ static std::string getDescription() {
+ return "Reports test results on a single line, suitable for IDEs";
+ }
+
+ virtual ReporterPreferences getPreferences() const {
+ ReporterPreferences prefs;
+ prefs.shouldRedirectStdOut = false;
+ return prefs;
+ }
+
+ virtual void noMatchingTestCases( std::string const& spec ) {
+ stream << "No test cases matched '" << spec << "'" << std::endl;
+ }
+
+ virtual void assertionStarting( AssertionInfo const& ) {
+ }
+
+ virtual bool assertionEnded( AssertionStats const& _assertionStats ) {
+ AssertionResult const& result = _assertionStats.assertionResult;
+
+ bool printInfoMessages = true;
+
+ // Drop out if result was successful and we're not printing those
+ if( !m_config->includeSuccessfulResults() && result.isOk() ) {
+ if( result.getResultType() != ResultWas::Warning )
+ return false;
+ printInfoMessages = false;
+ }
+
+ AssertionPrinter printer( stream, _assertionStats, printInfoMessages );
+ printer.print();
+
+ stream << std::endl;
+ return true;
+ }
+
+ virtual void testRunEnded( TestRunStats const& _testRunStats ) {
+ printTotals( _testRunStats.totals );
+ stream << "\n" << std::endl;
+ StreamingReporterBase::testRunEnded( _testRunStats );
+ }
+
+ private:
+ class AssertionPrinter {
+ void operator= ( AssertionPrinter const& );
+ public:
+ AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages )
+ : stream( _stream )
+ , stats( _stats )
+ , result( _stats.assertionResult )
+ , messages( _stats.infoMessages )
+ , itMessage( _stats.infoMessages.begin() )
+ , printInfoMessages( _printInfoMessages )
+ {}
+
+ void print() {
+ printSourceInfo();
+
+ itMessage = messages.begin();
+
+ switch( result.getResultType() ) {
+ case ResultWas::Ok:
+ printResultType( Colour::ResultSuccess, passedString() );
+ printOriginalExpression();
+ printReconstructedExpression();
+ if ( ! result.hasExpression() )
+ printRemainingMessages( Colour::None );
+ else
+ printRemainingMessages();
+ break;
+ case ResultWas::ExpressionFailed:
+ if( result.isOk() )
+ printResultType( Colour::ResultSuccess, failedString() + std::string( " - but was ok" ) );
+ else
+ printResultType( Colour::Error, failedString() );
+ printOriginalExpression();
+ printReconstructedExpression();
+ printRemainingMessages();
+ break;
+ case ResultWas::ThrewException:
+ printResultType( Colour::Error, failedString() );
+ printIssue( "unexpected exception with message:" );
+ printMessage();
+ printExpressionWas();
+ printRemainingMessages();
+ break;
+ case ResultWas::FatalErrorCondition:
+ printResultType( Colour::Error, failedString() );
+ printIssue( "fatal error condition with message:" );
+ printMessage();
+ printExpressionWas();
+ printRemainingMessages();
+ break;
+ case ResultWas::DidntThrowException:
+ printResultType( Colour::Error, failedString() );
+ printIssue( "expected exception, got none" );
+ printExpressionWas();
+ printRemainingMessages();
+ break;
+ case ResultWas::Info:
+ printResultType( Colour::None, "info" );
+ printMessage();
+ printRemainingMessages();
+ break;
+ case ResultWas::Warning:
+ printResultType( Colour::None, "warning" );
+ printMessage();
+ printRemainingMessages();
+ break;
+ case ResultWas::ExplicitFailure:
+ printResultType( Colour::Error, failedString() );
+ printIssue( "explicitly" );
+ printRemainingMessages( Colour::None );
+ break;
+ // These cases are here to prevent compiler warnings
+ case ResultWas::Unknown:
+ case ResultWas::FailureBit:
+ case ResultWas::Exception:
+ printResultType( Colour::Error, "** internal error **" );
+ break;
+ }
+ }
+
+ private:
+ // Colour::LightGrey
+
+ static Colour::Code dimColour() { return Colour::FileName; }
+
+#ifdef CATCH_PLATFORM_MAC
+ static const char* failedString() { return "FAILED"; }
+ static const char* passedString() { return "PASSED"; }
+#else
+ static const char* failedString() { return "failed"; }
+ static const char* passedString() { return "passed"; }
+#endif
+
+ void printSourceInfo() const {
+ Colour colourGuard( Colour::FileName );
+ stream << result.getSourceInfo() << ":";
+ }
+
+ void printResultType( Colour::Code colour, std::string passOrFail ) const {
+ if( !passOrFail.empty() ) {
+ {
+ Colour colourGuard( colour );
+ stream << " " << passOrFail;
+ }
+ stream << ":";
+ }
+ }
+
+ void printIssue( std::string issue ) const {
+ stream << " " << issue;
+ }
+
+ void printExpressionWas() {
+ if( result.hasExpression() ) {
+ stream << ";";
+ {
+ Colour colour( dimColour() );
+ stream << " expression was:";
+ }
+ printOriginalExpression();
+ }
+ }
+
+ void printOriginalExpression() const {
+ if( result.hasExpression() ) {
+ stream << " " << result.getExpression();
+ }
+ }
+
+ void printReconstructedExpression() const {
+ if( result.hasExpandedExpression() ) {
+ {
+ Colour colour( dimColour() );
+ stream << " for: ";
+ }
+ stream << result.getExpandedExpression();
+ }
+ }
+
+ void printMessage() {
+ if ( itMessage != messages.end() ) {
+ stream << " '" << itMessage->message << "'";
+ ++itMessage;
+ }
+ }
+
+ void printRemainingMessages( Colour::Code colour = dimColour() ) {
+ if ( itMessage == messages.end() )
+ return;
+
+ // using messages.end() directly yields compilation error:
+ std::vector<MessageInfo>::const_iterator itEnd = messages.end();
+ const std::size_t N = static_cast<std::size_t>( std::distance( itMessage, itEnd ) );
+
+ {
+ Colour colourGuard( colour );
+ stream << " with " << pluralise( N, "message" ) << ":";
+ }
+
+ for(; itMessage != itEnd; ) {
+ // If this assertion is a warning ignore any INFO messages
+ if( printInfoMessages || itMessage->type != ResultWas::Info ) {
+ stream << " '" << itMessage->message << "'";
+ if ( ++itMessage != itEnd ) {
+ Colour colourGuard( dimColour() );
+ stream << " and";
+ }
+ }
+ }
+ }
+
+ private:
+ std::ostream& stream;
+ AssertionStats const& stats;
+ AssertionResult const& result;
+ std::vector<MessageInfo> messages;
+ std::vector<MessageInfo>::const_iterator itMessage;
+ bool printInfoMessages;
+ };
+
+ // Colour, message variants:
+ // - white: No tests ran.
+ // - red: Failed [both/all] N test cases, failed [both/all] M assertions.
+ // - white: Passed [both/all] N test cases (no assertions).
+ // - red: Failed N tests cases, failed M assertions.
+ // - green: Passed [both/all] N tests cases with M assertions.
+
+ std::string bothOrAll( std::size_t count ) const {
+ return count == 1 ? "" : count == 2 ? "both " : "all " ;
+ }
+
+ void printTotals( const Totals& totals ) const {
+ if( totals.testCases.total() == 0 ) {
+ stream << "No tests ran.";
+ }
+ else if( totals.testCases.failed == totals.testCases.total() ) {
+ Colour colour( Colour::ResultError );
+ const std::string qualify_assertions_failed =
+ totals.assertions.failed == totals.assertions.total() ?
+ bothOrAll( totals.assertions.failed ) : "";
+ stream <<
+ "Failed " << bothOrAll( totals.testCases.failed )
+ << pluralise( totals.testCases.failed, "test case" ) << ", "
+ "failed " << qualify_assertions_failed <<
+ pluralise( totals.assertions.failed, "assertion" ) << ".";
+ }
+ else if( totals.assertions.total() == 0 ) {
+ stream <<
+ "Passed " << bothOrAll( totals.testCases.total() )
+ << pluralise( totals.testCases.total(), "test case" )
+ << " (no assertions).";
+ }
+ else if( totals.assertions.failed ) {
+ Colour colour( Colour::ResultError );
+ stream <<
+ "Failed " << pluralise( totals.testCases.failed, "test case" ) << ", "
+ "failed " << pluralise( totals.assertions.failed, "assertion" ) << ".";
+ }
+ else {
+ Colour colour( Colour::ResultSuccess );
+ stream <<
+ "Passed " << bothOrAll( totals.testCases.passed )
+ << pluralise( totals.testCases.passed, "test case" ) <<
+ " with " << pluralise( totals.assertions.passed, "assertion" ) << ".";
+ }
+ }
+ };
+
+ INTERNAL_CATCH_REGISTER_REPORTER( "compact", CompactReporter )
+
+} // end namespace Catch
+
+namespace Catch {
+ NonCopyable::~NonCopyable() {}
+ IShared::~IShared() {}
+ StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {}
+ IContext::~IContext() {}
+ IResultCapture::~IResultCapture() {}
+ ITestCase::~ITestCase() {}
+ ITestCaseRegistry::~ITestCaseRegistry() {}
+ IRegistryHub::~IRegistryHub() {}
+ IMutableRegistryHub::~IMutableRegistryHub() {}
+ IExceptionTranslator::~IExceptionTranslator() {}
+ IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {}
+ IReporter::~IReporter() {}
+ IReporterFactory::~IReporterFactory() {}
+ IReporterRegistry::~IReporterRegistry() {}
+ IStreamingReporter::~IStreamingReporter() {}
+ AssertionStats::~AssertionStats() {}
+ SectionStats::~SectionStats() {}
+ TestCaseStats::~TestCaseStats() {}
+ TestGroupStats::~TestGroupStats() {}
+ TestRunStats::~TestRunStats() {}
+ CumulativeReporterBase::SectionNode::~SectionNode() {}
+ CumulativeReporterBase::~CumulativeReporterBase() {}
+
+ StreamingReporterBase::~StreamingReporterBase() {}
+ ConsoleReporter::~ConsoleReporter() {}
+ CompactReporter::~CompactReporter() {}
+ IRunner::~IRunner() {}
+ IMutableContext::~IMutableContext() {}
+ IConfig::~IConfig() {}
+ XmlReporter::~XmlReporter() {}
+ JunitReporter::~JunitReporter() {}
+ TestRegistry::~TestRegistry() {}
+ FreeFunctionTestCase::~FreeFunctionTestCase() {}
+ IGeneratorInfo::~IGeneratorInfo() {}
+ IGeneratorsForTest::~IGeneratorsForTest() {}
+ TestSpec::Pattern::~Pattern() {}
+ TestSpec::NamePattern::~NamePattern() {}
+ TestSpec::TagPattern::~TagPattern() {}
+ TestSpec::ExcludedPattern::~ExcludedPattern() {}
+
+ Matchers::Impl::StdString::Equals::~Equals() {}
+ Matchers::Impl::StdString::Contains::~Contains() {}
+ Matchers::Impl::StdString::StartsWith::~StartsWith() {}
+ Matchers::Impl::StdString::EndsWith::~EndsWith() {}
+
+ void Config::dummy() {}
+}
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+#endif
+
+#ifdef CATCH_CONFIG_MAIN
+// #included from: internal/catch_default_main.hpp
+#define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED
+
+#ifndef __OBJC__
+
+// Standard C/C++ main entry point
+int main (int argc, char * const argv[]) {
+ return Catch::Session().run( argc, argv );
+}
+
+#else // __OBJC__
+
+// Objective-C entry point
+int main (int argc, char * const argv[]) {
+#if !CATCH_ARC_ENABLED
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+#endif
+
+ Catch::registerTestMethods();
+ int result = Catch::Session().run( argc, (char* const*)argv );
+
+#if !CATCH_ARC_ENABLED
+ [pool drain];
+#endif
+
+ return result;
+}
+
+#endif // __OBJC__
+
+#endif
+
+#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED
+# undef CLARA_CONFIG_MAIN
+#endif
+
+//////
+
+// If this config identifier is defined then all CATCH macros are prefixed with CATCH_
+#ifdef CATCH_CONFIG_PREFIX_ALL
+
+#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE" )
+#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "CATCH_REQUIRE_FALSE" )
+
+#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS" )
+#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS_AS" )
+#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_NOTHROW" )
+
+#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK" )
+#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CATCH_CHECK_FALSE" )
+#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_IF" )
+#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_ELSE" )
+#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CATCH_CHECK_NOFAIL" )
+
+#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS" )
+#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS_AS" )
+#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" )
+
+#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" )
+#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" )
+
+#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" )
+#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN", msg )
+#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" )
+#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" )
+#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" )
+
+#ifdef CATCH_CONFIG_VARIADIC_MACROS
+ #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
+ #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
+ #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )
+ #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
+ #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", __VA_ARGS__ )
+ #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", __VA_ARGS__ )
+#else
+ #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
+ #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description )
+ #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
+ #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
+ #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", msg )
+ #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", msg )
+#endif
+#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" )
+
+#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
+#define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType )
+
+#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
+
+// "BDD-style" convenience wrappers
+#ifdef CATCH_CONFIG_VARIADIC_MACROS
+#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ )
+#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ )
+#else
+#define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags )
+#define CATCH_SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags )
+#endif
+#define CATCH_GIVEN( desc ) CATCH_SECTION( "Given: " desc, "" )
+#define CATCH_WHEN( desc ) CATCH_SECTION( " When: " desc, "" )
+#define CATCH_AND_WHEN( desc ) CATCH_SECTION( " And: " desc, "" )
+#define CATCH_THEN( desc ) CATCH_SECTION( " Then: " desc, "" )
+#define CATCH_AND_THEN( desc ) CATCH_SECTION( " And: " desc, "" )
+
+// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required
+#else
+
+#define REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "REQUIRE" )
+#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "REQUIRE_FALSE" )
+
+#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "REQUIRE_THROWS" )
+#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "REQUIRE_THROWS_AS" )
+#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "REQUIRE_NOTHROW" )
+
+#define CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK" )
+#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CHECK_FALSE" )
+#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_IF" )
+#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_ELSE" )
+#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CHECK_NOFAIL" )
+
+#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS" )
+#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS_AS" )
+#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_NOTHROW" )
+
+#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" )
+#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" )
+
+#define INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" )
+#define WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN", msg )
+#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" )
+#define CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" )
+#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" )
+
+#ifdef CATCH_CONFIG_VARIADIC_MACROS
+ #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
+ #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
+ #define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )
+ #define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
+ #define FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", __VA_ARGS__ )
+ #define SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", __VA_ARGS__ )
+#else
+ #define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
+ #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description )
+ #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
+ #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
+ #define FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", msg )
+ #define SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", msg )
+#endif
+#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" )
+
+#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
+#define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType )
+
+#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
+
+#endif
+
+#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature )
+
+// "BDD-style" convenience wrappers
+#ifdef CATCH_CONFIG_VARIADIC_MACROS
+#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ )
+#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ )
+#else
+#define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags )
+#define SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags )
+#endif
+#define GIVEN( desc ) SECTION( " Given: " desc, "" )
+#define WHEN( desc ) SECTION( " When: " desc, "" )
+#define AND_WHEN( desc ) SECTION( "And when: " desc, "" )
+#define THEN( desc ) SECTION( " Then: " desc, "" )
+#define AND_THEN( desc ) SECTION( " And: " desc, "" )
+
+using Catch::Detail::Approx;
+
+// #included from: internal/catch_reenable_warnings.h
+
+#define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED
+
+#ifdef __clang__
+# ifdef __ICC // icpc defines the __clang__ macro
+# pragma warning(pop)
+# else
+# pragma clang diagnostic pop
+# endif
+#elif defined __GNUC__
+# pragma GCC diagnostic pop
+#endif
+
+#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
+
diff --git a/test/run b/test/run
new file mode 100755
index 0000000..43f5ced
--- /dev/null
+++ b/test/run
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+failures=0
+
+cd "$( dirname "${BASH_SOURCE[0]}" )"
+cd ../
+source ./localize.sh
+
+function run_step { >&2 echo -e "\033[1m\033[34m* $1\033[0m"; }
+function run_substep { >&2 echo -e "\033[1m\033[36m* $1\033[0m"; }
+function run_success { >&2 echo -e "\033[1m\033[32m* $1\033[0m"; }
+
+run_step "Starting Mapnik tests"
+
+run_substep "Running C++ Unit tests..."
+./test/unit/run
+failures=$((failures+$?))
+
+run_substep "Running standalone C++ tests..."
+if [ -n "$(find test/standalone/ -maxdepth 1 -name '*-bin' -print -quit)" ]; then
+ for FILE in test/standalone/*-bin; do
+ ${FILE};
+ failures=$((failures+$?))
+ done
+fi
+
+run_substep "Running visual tests..."
+if [ -z "$JOBS" ]; then
+ JOBS=1
+fi
+./test/visual/run -j $JOBS
+failures=$((failures+$?))
+
+exit $failures
diff --git a/test/standalone/agg_rasterizer_integer_overflow_test.cpp b/test/standalone/agg_rasterizer_integer_overflow_test.cpp
new file mode 100644
index 0000000..101596b
--- /dev/null
+++ b/test/standalone/agg_rasterizer_integer_overflow_test.cpp
@@ -0,0 +1,64 @@
+#define CATCH_CONFIG_MAIN
+#include "catch.hpp"
+
+#include <mapnik/map.hpp>
+#include <mapnik/memory_datasource.hpp>
+#include <mapnik/json/feature_parser.hpp>
+#include <mapnik/feature_type_style.hpp>
+#include <mapnik/rule.hpp>
+#include <mapnik/symbolizer.hpp>
+#include <mapnik/layer.hpp>
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/debug.hpp>
+
+#include <iostream>
+
+// geojson box of the world
+const std::string geojson("{ \"type\": \"Feature\", \"properties\": { }, \"geometry\": { \"type\": \"Polygon\", \"coordinates\": [ [ [ -17963313.143242701888084, -6300857.11560364998877 ], [ -17963313.143242701888084, 13071343.332991421222687 ], [ 7396658.353099936619401, 13071343.332991421222687 ], [ 7396658.353099936619401, -6300857.11560364998877 ], [ -17963313.143242701888084, -6300857.11560364998877 ] ] ] } }");
+
+TEST_CASE("agg_rasterizer_integer_overflow") {
+
+SECTION("coordinates_do_not_overflow_and_polygon_is_rendered") {
+ auto expected_color = mapnik::color("white");
+
+ mapnik::Map m(256,256);
+ m.set_background(mapnik::color("black"));
+
+ mapnik::feature_type_style s;
+ {
+ mapnik::rule r;
+ mapnik::polygon_symbolizer sym;
+ mapnik::put(sym, mapnik::keys::fill, expected_color);
+ mapnik::put(sym, mapnik::keys::clip, false);
+ r.append(std::move(sym));
+ s.add_rule(std::move(r));
+ }
+ m.insert_style("style",std::move(s));
+
+ mapnik::layer lyr("Layer");
+ lyr.styles().emplace_back("style");
+ {
+ auto ds = std::make_shared<mapnik::memory_datasource>(mapnik::parameters());
+ auto context = std::make_shared<mapnik::context_type>();
+ auto f = std::make_shared<mapnik::feature_impl>(context, 0);
+ REQUIRE(mapnik::json::from_geojson(geojson, *f));
+ ds->push(f);
+ lyr.set_datasource(ds);
+ }
+ m.add_layer(std::move(lyr));
+
+ // 17/20864/45265.png
+ m.zoom_to_box(mapnik::box2d<double>(-13658379.710221574,6197514.253362091,-13657768.213995293,6198125.749588372));
+
+ // works 15/5216/11316.png
+ //m.zoom_to_box(mapnik::box2d<double>(-13658379.710221574,6195679.764683247,-13655933.72531645,6198125.749588372));
+
+ mapnik::image_rgba8 im(256, 256);
+ {
+ mapnik::agg_renderer<mapnik::image_rgba8> ren(m, im);
+ ren.apply();
+ }
+
+ REQUIRE(im(128,128) == expected_color.rgba());
+} // SECTION
+} // TEST_CASE
diff --git a/test/standalone/csv_test.cpp b/test/standalone/csv_test.cpp
new file mode 100644
index 0000000..242bb10
--- /dev/null
+++ b/test/standalone/csv_test.cpp
@@ -0,0 +1,684 @@
+#define CATCH_CONFIG_MAIN
+#include "catch.hpp"
+
+#include <mapnik/map.hpp>
+#include <mapnik/datasource.hpp>
+#include <mapnik/datasource_cache.hpp>
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_types.hpp>
+#include <mapnik/geometry_type.hpp>
+#include <mapnik/expression.hpp>
+#include <mapnik/expression_evaluator.hpp>
+#include <mapnik/debug.hpp>
+
+#include <boost/filesystem.hpp>
+#include <boost/range/iterator_range_core.hpp>
+#include <boost/format.hpp>
+#include <boost/optional/optional_io.hpp>
+
+#include <iostream>
+
+namespace bfs = boost::filesystem;
+
+namespace {
+void add_csv_files(bfs::path dir, std::vector<bfs::path> &csv_files) {
+ for (auto const &entry : boost::make_iterator_range(
+ bfs::directory_iterator(dir), bfs::directory_iterator())) {
+ auto path = entry.path();
+ if (path.extension().native() == ".csv") {
+ csv_files.emplace_back(path);
+ }
+ }
+}
+
+bool operator==(mapnik::attribute_descriptor const &a,
+ mapnik::attribute_descriptor const &b) {
+ return ((a.get_name() == b.get_name()) &&
+ (a.get_type() == b.get_type()) &&
+ (a.is_primary_key() == b.is_primary_key()) &
+ (a.get_size() == b.get_size()) &&
+ (a.get_precision() == b.get_precision()));
+}
+
+mapnik::datasource_ptr get_csv_ds(std::string const &file_name, bool strict = true) {
+ mapnik::parameters params;
+ params["type"] = std::string("csv");
+ params["file"] = file_name;
+ params["strict"] = mapnik::value_bool(strict);
+ auto ds = mapnik::datasource_cache::instance().create(params);
+ // require a non-null pointer returned
+ REQUIRE(bool(ds));
+ return ds;
+}
+
+void require_field_names(std::vector<mapnik::attribute_descriptor> const &fields,
+ std::initializer_list<std::string> const &names) {
+ REQUIRE(fields.size() == names.size());
+ auto itr_a = fields.begin();
+ auto const end_a = fields.end();
+ auto itr_b = names.begin();
+ for (; itr_a != end_a; ++itr_a, ++itr_b) {
+ CHECK(itr_a->get_name() == *itr_b);
+ }
+}
+
+void require_field_types(std::vector<mapnik::attribute_descriptor> const &fields,
+ std::initializer_list<mapnik::eAttributeType> const &types) {
+ REQUIRE(fields.size() == types.size());
+ auto itr_a = fields.begin();
+ auto const end_a = fields.end();
+ auto itr_b = types.begin();
+ for (; itr_a != end_a; ++itr_a, ++itr_b) {
+ CHECK(itr_a->get_type() == *itr_b);
+ }
+}
+
+mapnik::featureset_ptr all_features(mapnik::datasource_ptr ds) {
+ auto fields = ds->get_descriptor().get_descriptors();
+ mapnik::query query(ds->envelope());
+ for (auto const &field : fields) {
+ query.add_property_name(field.get_name());
+ }
+ return ds->features(query);
+}
+
+std::size_t count_features(mapnik::featureset_ptr features) {
+ std::size_t count = 0;
+ while (features->next()) {
+ ++count;
+ }
+ return count;
+}
+
+using attr = std::tuple<std::string, mapnik::value>;
+void require_attributes(mapnik::feature_ptr feature,
+ std::initializer_list<attr> const &attrs) {
+ REQUIRE(bool(feature));
+ for (auto const &kv : attrs) {
+ REQUIRE(feature->has_key(std::get<0>(kv)));
+ CHECK(feature->get(std::get<0>(kv)) == std::get<1>(kv));
+ }
+}
+
+namespace detail {
+struct feature_count {
+ template <typename T>
+ std::size_t operator()(T const &geom) const {
+ return mapnik::util::apply_visitor(*this, geom);
+ }
+
+ std::size_t operator()(mapnik::geometry::geometry_empty const &) const {
+ return 0;
+ }
+
+ template <typename T>
+ std::size_t operator()(mapnik::geometry::point<T> const &) const {
+ return 1;
+ }
+
+ template <typename T>
+ std::size_t operator()(mapnik::geometry::line_string<T> const &) const {
+ return 1;
+ }
+
+ template <typename T>
+ std::size_t operator()(mapnik::geometry::polygon<T> const &) const {
+ return 1;
+ }
+
+ template <typename T>
+ std::size_t operator()(mapnik::geometry::multi_point<T> const &mp) const {
+ return mp.size();
+ }
+
+ template <typename T>
+ std::size_t operator()(mapnik::geometry::multi_line_string<T> const &mls) const {
+ return mls.size();
+ }
+
+ template <typename T>
+ std::size_t operator()(mapnik::geometry::multi_polygon<T> const &mp) const {
+ return mp.size();
+ }
+
+ template <typename T>
+ std::size_t operator()(mapnik::geometry::geometry_collection<T> const &col) const {
+ std::size_t sum = 0;
+ for (auto const &geom : col) {
+ sum += operator()(geom);
+ }
+ return sum;
+ }
+};
+} // namespace detail
+
+template <typename T>
+std::size_t feature_count(mapnik::geometry::geometry<T> const &g) {
+ return detail::feature_count()(g);
+}
+
+void require_geometry(mapnik::feature_ptr feature,
+ std::size_t num_parts,
+ mapnik::geometry::geometry_types type) {
+ REQUIRE(bool(feature));
+ CHECK(mapnik::geometry::geometry_type(feature->get_geometry()) == type);
+ CHECK(feature_count(feature->get_geometry()) == num_parts);
+}
+} // anonymous namespace
+
+const bool registered = mapnik::datasource_cache::instance().register_datasources("./plugins/input/");
+
+TEST_CASE("csv") {
+ REQUIRE(registered);
+
+ // make the tests silent since we intentially test error conditions that are noisy
+ auto const severity = mapnik::logger::instance().get_severity();
+ mapnik::logger::instance().set_severity(mapnik::logger::none);
+
+ // check the CSV datasource is loaded
+ const std::vector<std::string> plugin_names =
+ mapnik::datasource_cache::instance().plugin_names();
+ const bool have_csv_plugin =
+ std::find(plugin_names.begin(), plugin_names.end(), "csv") != plugin_names.end();
+
+ SECTION("broken files") {
+ if (have_csv_plugin) {
+ std::vector<bfs::path> broken;
+ add_csv_files("test/data/csv/fails", broken);
+ add_csv_files("test/data/csv/warns", broken);
+ broken.emplace_back("test/data/csv/fails/does_not_exist.csv");
+
+ for (auto const &path : broken) {
+ REQUIRE_THROWS(get_csv_ds(path.native()));
+ }
+ }
+ } // END SECTION
+
+ SECTION("good files") {
+ if (have_csv_plugin) {
+ std::vector<bfs::path> good;
+ add_csv_files("test/data/csv", good);
+ add_csv_files("test/data/csv/warns", good);
+
+ for (auto const &path : good) {
+ auto ds = get_csv_ds(path.native(), false);
+ // require a non-null pointer returned
+ REQUIRE(bool(ds));
+ }
+ }
+ } // END SECTION
+
+ SECTION("lon/lat detection") {
+ for (auto const &lon_name : {std::string("lon"), std::string("lng")}) {
+ auto ds = get_csv_ds((boost::format("test/data/csv/%1%_lat.csv") % lon_name).str());
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {lon_name, "lat"});
+ require_field_types(fields, {mapnik::Integer, mapnik::Integer});
+
+ CHECK(ds->get_geometry_type() == mapnik::datasource_geometry_t::Point);
+
+ mapnik::query query(ds->envelope());
+ for (auto const &field : fields) {
+ query.add_property_name(field.get_name());
+ }
+ auto features = ds->features(query);
+ auto feature = features->next();
+
+ require_attributes(feature, {
+ attr { lon_name, mapnik::value_integer(0) },
+ attr { "lat", mapnik::value_integer(0) }
+ });
+ }
+ } // END SECTION
+
+ SECTION("type detection") {
+ auto ds = get_csv_ds("test/data/csv/nypd.csv");
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"Precinct", "Phone", "Address", "City", "geo_longitude", "geo_latitude", "geo_accuracy"});
+ require_field_types(fields, {mapnik::String, mapnik::String, mapnik::String, mapnik::String, mapnik::Double, mapnik::Double, mapnik::String});
+
+ CHECK(ds->get_geometry_type() == mapnik::datasource_geometry_t::Point);
+ CHECK(count_features(all_features(ds)) == 2);
+
+ auto feature = all_features(ds)->next();
+ require_attributes(feature, {
+ attr { "City", mapnik::value_unicode_string("New York, NY") }
+ , attr { "geo_accuracy", mapnik::value_unicode_string("house") }
+ , attr { "Phone", mapnik::value_unicode_string("(212) 334-0711") }
+ , attr { "Address", mapnik::value_unicode_string("19 Elizabeth Street") }
+ , attr { "Precinct", mapnik::value_unicode_string("5th Precinct") }
+ , attr { "geo_longitude", mapnik::value_integer(-70) }
+ , attr { "geo_latitude", mapnik::value_integer(40) }
+ });
+ } // END SECTION
+
+ SECTION("skipping blank rows") {
+ auto ds = get_csv_ds("test/data/csv/blank_rows.csv");
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"x", "y", "name"});
+ require_field_types(fields, {mapnik::Integer, mapnik::Integer, mapnik::String});
+
+ CHECK(ds->get_geometry_type() == mapnik::datasource_geometry_t::Point);
+ CHECK(count_features(all_features(ds)) == 2);
+ } // END SECTION
+
+ SECTION("empty rows") {
+ auto ds = get_csv_ds("test/data/csv/empty_rows.csv");
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"x", "y", "text", "date", "integer", "boolean", "float", "time", "datetime", "empty_column"});
+ require_field_types(fields, {mapnik::Integer, mapnik::Integer, mapnik::String, mapnik::String, mapnik::Integer, mapnik::Boolean, mapnik::Double, mapnik::String, mapnik::String, mapnik::String});
+
+ CHECK(ds->get_geometry_type() == mapnik::datasource_geometry_t::Point);
+ CHECK(count_features(all_features(ds)) == 4);
+
+ auto featureset = all_features(ds);
+ auto feature = featureset->next();
+ require_attributes(feature, {
+ attr { "x", mapnik::value_integer(0) }
+ , attr { "empty_column", mapnik::value_unicode_string("") }
+ , attr { "text", mapnik::value_unicode_string("a b") }
+ , attr { "float", mapnik::value_double(1.0) }
+ , attr { "datetime", mapnik::value_unicode_string("1971-01-01T04:14:00") }
+ , attr { "y", mapnik::value_integer(0) }
+ , attr { "boolean", mapnik::value_bool(true) }
+ , attr { "time", mapnik::value_unicode_string("04:14:00") }
+ , attr { "date", mapnik::value_unicode_string("1971-01-01") }
+ , attr { "integer", mapnik::value_integer(40) }
+ });
+
+ while (bool(feature = featureset->next())) {
+ CHECK(feature->size() == 10);
+ CHECK(feature->get("empty_column") == mapnik::value_unicode_string(""));
+ }
+ } // END SECTION
+
+ SECTION("slashes") {
+ auto ds = get_csv_ds("test/data/csv/has_attributes_with_slashes.csv");
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"x", "y", "name"});
+ // NOTE: y column is integer, even though a double value is used below in the test?
+ require_field_types(fields, {mapnik::Integer, mapnik::Integer, mapnik::String});
+
+ auto featureset = all_features(ds);
+ require_attributes(featureset->next(), {
+ attr{"x", 0}
+ , attr{"y", 0}
+ , attr{"name", mapnik::value_unicode_string("a/a") } });
+ require_attributes(featureset->next(), {
+ attr{"x", 1}
+ , attr{"y", 4}
+ , attr{"name", mapnik::value_unicode_string("b/b") } });
+ require_attributes(featureset->next(), {
+ attr{"x", 10}
+ , attr{"y", 2.5}
+ , attr{"name", mapnik::value_unicode_string("c/c") } });
+ } // END SECTION
+
+ SECTION("wkt field") {
+ using mapnik::geometry::geometry_types;
+
+ auto ds = get_csv_ds("test/data/csv/wkt.csv");
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"type"});
+ require_field_types(fields, {mapnik::String});
+
+ auto featureset = all_features(ds);
+ require_geometry(featureset->next(), 1, geometry_types::Point);
+ require_geometry(featureset->next(), 1, geometry_types::LineString);
+ require_geometry(featureset->next(), 1, geometry_types::Polygon);
+ require_geometry(featureset->next(), 1, geometry_types::Polygon);
+ require_geometry(featureset->next(), 4, geometry_types::MultiPoint);
+ require_geometry(featureset->next(), 2, geometry_types::MultiLineString);
+ require_geometry(featureset->next(), 2, geometry_types::MultiPolygon);
+ require_geometry(featureset->next(), 2, geometry_types::MultiPolygon);
+ } // END SECTION
+
+ SECTION("handling of missing header") {
+ // TODO: does this mean 'missing_header.csv' should be in the warnings
+ // subdirectory, since it doesn't work in strict mode?
+ auto ds = get_csv_ds("test/data/csv/missing_header.csv", false);
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"one", "two", "x", "y", "_4", "aftermissing"});
+ auto feature = all_features(ds)->next();
+ REQUIRE(feature);
+ REQUIRE(feature->has_key("_4"));
+ CHECK(feature->get("_4") == mapnik::value_unicode_string("missing"));
+ } // END SECTION
+
+ SECTION("handling of headers that are numbers") {
+ auto ds = get_csv_ds("test/data/csv/numbers_for_headers.csv");
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"x", "y", "1990", "1991", "1992"});
+ auto feature = all_features(ds)->next();
+ require_attributes(feature, {
+ attr{"x", 0}
+ , attr{"y", 0}
+ , attr{"1990", 1}
+ , attr{"1991", 2}
+ , attr{"1992", 3}
+ });
+ auto expression = mapnik::parse_expression("[1991]=2");
+ REQUIRE(bool(expression));
+ auto value = mapnik::util::apply_visitor(
+ mapnik::evaluate<mapnik::feature_impl, mapnik::value_type, mapnik::attributes>(
+ *feature, mapnik::attributes()), *expression);
+ CHECK(value == true);
+ } // END SECTION
+
+ SECTION("quoted numbers") {
+ using ustring = mapnik::value_unicode_string;
+
+ auto ds = get_csv_ds("test/data/csv/quoted_numbers.csv");
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"x", "y", "label"});
+ auto featureset = all_features(ds);
+
+ require_attributes(featureset->next(), {
+ attr{"x", 0}, attr{"y", 0}, attr{"label", ustring("0,0") } });
+ require_attributes(featureset->next(), {
+ attr{"x", 5}, attr{"y", 5}, attr{"label", ustring("5,5") } });
+ require_attributes(featureset->next(), {
+ attr{"x", 0}, attr{"y", 5}, attr{"label", ustring("0,5") } });
+ require_attributes(featureset->next(), {
+ attr{"x", 5}, attr{"y", 0}, attr{"label", ustring("5,0") } });
+ require_attributes(featureset->next(), {
+ attr{"x", 2.5}, attr{"y", 2.5}, attr{"label", ustring("2.5,2.5") } });
+
+ } // END SECTION
+
+ SECTION("reading newlines") {
+ for (auto const &platform : {std::string("windows"), std::string("mac")}) {
+ std::string file_name = (boost::format("test/data/csv/%1%_newlines.csv") % platform).str();
+ auto ds = get_csv_ds(file_name);
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"x", "y", "z"});
+ require_attributes(all_features(ds)->next(), {
+ attr{"x", 1}, attr{"y", 10}, attr{"z", 9999.9999} });
+ }
+ } // END SECTION
+
+ SECTION("mixed newlines") {
+ using ustring = mapnik::value_unicode_string;
+
+ for (auto const &file : {
+ std::string("test/data/csv/mac_newlines_with_unix_inline.csv")
+ , std::string("test/data/csv/mac_newlines_with_unix_inline_escaped.csv")
+ , std::string("test/data/csv/windows_newlines_with_unix_inline.csv")
+ , std::string("test/data/csv/windows_newlines_with_unix_inline_escaped.csv")
+ }) {
+ auto ds = get_csv_ds(file);
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"x", "y", "line"});
+ require_attributes(all_features(ds)->next(), {
+ attr{"x", 0}, attr{"y", 0}
+ , attr{"line", ustring("many\n lines\n of text\n with unix newlines")} });
+ }
+ } // END SECTION
+
+ SECTION("tabs") {
+ auto ds = get_csv_ds("test/data/csv/tabs_in_csv.csv");
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"x", "y", "z"});
+ require_attributes(all_features(ds)->next(), {
+ attr{"x", -122}, attr{"y", 48}, attr{"z", 0} });
+ } // END SECTION
+
+ SECTION("separators") {
+ using ustring = mapnik::value_unicode_string;
+
+ for (auto const &file : {
+ std::string("test/data/csv/pipe_delimiters.csv")
+ , std::string("test/data/csv/semicolon_delimiters.csv")
+ }) {
+ auto ds = get_csv_ds(file);
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"x", "y", "z"});
+ require_attributes(all_features(ds)->next(), {
+ attr{"x", 0}, attr{"y", 0}, attr{"z", ustring("hello")} });
+ }
+ } // END SECTION
+
+ SECTION("null and bool keywords are empty strings") {
+ using ustring = mapnik::value_unicode_string;
+
+ auto ds = get_csv_ds("test/data/csv/nulls_and_booleans_as_strings.csv");
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"x", "y", "null", "boolean"});
+ require_field_types(fields, {mapnik::Integer, mapnik::Integer, mapnik::String, mapnik::Boolean});
+
+ auto featureset = all_features(ds);
+ require_attributes(featureset->next(), {
+ attr{"x", 0}, attr{"y", 0}, attr{"null", ustring("null")}, attr{"boolean", true}});
+ require_attributes(featureset->next(), {
+ attr{"x", 0}, attr{"y", 0}, attr{"null", ustring("")}, attr{"boolean", false}});
+ } // END SECTION
+
+ SECTION("nonexistent query fields throw") {
+ auto ds = get_csv_ds("test/data/csv/lon_lat.csv");
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"lon", "lat"});
+ require_field_types(fields, {mapnik::Integer, mapnik::Integer});
+
+ mapnik::query query(ds->envelope());
+ for (auto const &field : fields) {
+ query.add_property_name(field.get_name());
+ }
+ // also add an invalid one, triggering throw
+ query.add_property_name("bogus");
+
+ REQUIRE_THROWS(ds->features(query));
+ } // END SECTION
+
+ SECTION("leading zeros mean strings") {
+ using ustring = mapnik::value_unicode_string;
+
+ auto ds = get_csv_ds("test/data/csv/leading_zeros.csv");
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"x", "y", "fips"});
+ require_field_types(fields, {mapnik::Integer, mapnik::Integer, mapnik::String});
+
+ auto featureset = all_features(ds);
+ require_attributes(featureset->next(), {
+ attr{"x", 0}, attr{"y", 0}, attr{"fips", ustring("001")}});
+ require_attributes(featureset->next(), {
+ attr{"x", 0}, attr{"y", 0}, attr{"fips", ustring("003")}});
+ require_attributes(featureset->next(), {
+ attr{"x", 0}, attr{"y", 0}, attr{"fips", ustring("005")}});
+ } // END SECTION
+
+ SECTION("advanced geometry detection") {
+ using row = std::pair<std::string, mapnik::datasource_geometry_t>;
+
+ for (row r : {
+ row{"point", mapnik::datasource_geometry_t::Point}
+ , row{"poly", mapnik::datasource_geometry_t::Polygon}
+ , row{"multi_poly", mapnik::datasource_geometry_t::Polygon}
+ , row{"line", mapnik::datasource_geometry_t::LineString}
+ }) {
+ std::string file_name = (boost::format("test/data/csv/%1%_wkt.csv") % r.first).str();
+ auto ds = get_csv_ds(file_name);
+ CHECK(ds->get_geometry_type() == r.second);
+ }
+ } // END SECTION
+
+ SECTION("creation of CSV from in-memory strings") {
+ using ustring = mapnik::value_unicode_string;
+
+ for (auto const &name : {std::string("Winthrop, WA"), std::string(u8"Qu\u00e9bec")}) {
+ std::string csv_string =
+ (boost::format(
+ "wkt,Name\n"
+ "\"POINT (120.15 48.47)\",\"%1%\"\n"
+ ) % name).str();
+
+ mapnik::parameters params;
+ params["type"] = std::string("csv");
+ params["inline"] = csv_string;
+ auto ds = mapnik::datasource_cache::instance().create(params);
+ REQUIRE(bool(ds));
+
+ auto feature = all_features(ds)->next();
+ REQUIRE(bool(feature));
+ REQUIRE(feature->has_key("Name"));
+ CHECK(feature->get("Name") == ustring(name.c_str()));
+ }
+ } // END SECTION
+
+ SECTION("geojson quoting") {
+ using mapnik::geometry::geometry_types;
+
+ for (auto const &file : {
+ std::string("test/data/csv/geojson_double_quote_escape.csv")
+ , std::string("test/data/csv/geojson_single_quote.csv")
+ , std::string("test/data/csv/geojson_2x_double_quote_filebakery_style.csv")
+ }) {
+ auto ds = get_csv_ds(file);
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"type"});
+ require_field_types(fields, {mapnik::String});
+
+ auto featureset = all_features(ds);
+ require_geometry(featureset->next(), 1, geometry_types::Point);
+ require_geometry(featureset->next(), 1, geometry_types::LineString);
+ require_geometry(featureset->next(), 1, geometry_types::Polygon);
+ require_geometry(featureset->next(), 1, geometry_types::Polygon);
+ require_geometry(featureset->next(), 4, geometry_types::MultiPoint);
+ require_geometry(featureset->next(), 2, geometry_types::MultiLineString);
+ require_geometry(featureset->next(), 2, geometry_types::MultiPolygon);
+ require_geometry(featureset->next(), 2, geometry_types::MultiPolygon);
+ }
+ } // END SECTION
+
+ SECTION("blank undelimited rows are still parsed") {
+ using ustring = mapnik::value_unicode_string;
+
+ // TODO: does this mean this CSV file should be in the warnings
+ // subdirectory, since it doesn't work in strict mode?
+ auto ds = get_csv_ds("test/data/csv/more_headers_than_column_values.csv", false);
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"x", "y", "one", "two", "three"});
+ require_field_types(fields, {mapnik::Integer, mapnik::Integer, mapnik::String, mapnik::String, mapnik::String});
+
+ require_attributes(all_features(ds)->next(), {
+ attr{"x", 0}, attr{"y", 0}, attr{"one", ustring("")}, attr{"two", ustring("")}, attr{"three", ustring("")} });
+ } // END SECTION
+
+ SECTION("fewer headers than rows throws") {
+ REQUIRE_THROWS(get_csv_ds("test/data/csv/more_column_values_than_headers.csv"));
+ } // END SECTION
+
+ SECTION("feature ID only incremented for valid rows") {
+ auto ds = get_csv_ds("test/data/csv/warns/feature_id_counting.csv", false);
+ auto fs = all_features(ds);
+
+ // first
+ auto feature = fs->next();
+ REQUIRE(bool(feature));
+ CHECK(feature->id() == 1);
+
+ // second, should have skipped bogus one
+ feature = fs->next();
+ REQUIRE(bool(feature));
+ CHECK(feature->id() == 2);
+
+ feature = fs->next();
+ CHECK(!feature);
+ } // END SECTION
+
+ SECTION("dynamically defining headers") {
+ using ustring = mapnik::value_unicode_string;
+ using row = std::pair<std::string, std::size_t>;
+
+ for (auto const &r : {
+ row{"test/data/csv/fails/needs_headers_two_lines.csv", 2}
+ , row{"test/data/csv/fails/needs_headers_one_line.csv", 1}
+ , row{"test/data/csv/fails/needs_headers_one_line_no_newline.csv", 1}
+ }) {
+ mapnik::parameters params;
+ params["type"] = std::string("csv");
+ params["file"] = r.first;
+ params["headers"] = "x,y,name";
+ auto ds = mapnik::datasource_cache::instance().create(params);
+ REQUIRE(bool(ds));
+
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"x", "y", "name"});
+ require_field_types(fields, {mapnik::Integer, mapnik::Integer, mapnik::String});
+ require_attributes(all_features(ds)->next(), {
+ attr{"x", 0}, attr{"y", 0}, attr{"name", ustring("data_name")} });
+ REQUIRE(count_features(all_features(ds)) == r.second);
+ }
+ } // END SECTION
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wlong-long"
+ SECTION("64bit int fields work") {
+ auto ds = get_csv_ds("test/data/csv/64bit_int.csv");
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"x", "y", "bigint"});
+ require_field_types(fields, {mapnik::Integer, mapnik::Integer, mapnik::Integer});
+
+ auto fs = all_features(ds);
+ auto feature = fs->next();
+ require_attributes(feature, {
+ attr{"x", 0}, attr{"y", 0}, attr{"bigint", 2147483648} });
+
+ feature = fs->next();
+ require_attributes(feature, {
+ attr{"x", 0}, attr{"y", 0}, attr{"bigint", 9223372036854775807ll} });
+ require_attributes(feature, {
+ attr{"x", 0}, attr{"y", 0}, attr{"bigint", 0x7FFFFFFFFFFFFFFFll} });
+ } // END SECTION
+#pragma GCC diagnostic pop
+
+ SECTION("various number types") {
+ auto ds = get_csv_ds("test/data/csv/number_types.csv");
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {"x", "y", "floats"});
+ require_field_types(fields, {mapnik::Integer, mapnik::Integer, mapnik::Double});
+
+ auto fs = all_features(ds);
+ for (double d : { .0, +.0, 1e-06, -1e-06, 0.000001, 1.234e+16, 1.234e+16 }) {
+ auto feature = fs->next();
+ REQUIRE(bool(feature));
+ CHECK(feature->get("floats").get<mapnik::value_double>() == Approx(d));
+ }
+ } // END SECTION
+
+ SECTION("manually supplied extent") {
+ std::string csv_string("wkt,Name\n");
+ mapnik::parameters params;
+ params["type"] = std::string("csv");
+ params["inline"] = csv_string;
+ params["extent"] = "-180,-90,180,90";
+ auto ds = mapnik::datasource_cache::instance().create(params);
+ REQUIRE(bool(ds));
+
+ auto box = ds->envelope();
+ CHECK(box.minx() == -180);
+ CHECK(box.miny() == -90);
+ CHECK(box.maxx() == 180);
+ CHECK(box.maxy() == 90);
+ } // END SECTION
+
+ SECTION("inline geojson") {
+ std::string csv_string = "geojson\n'{\"coordinates\":[-92.22568,38.59553],\"type\":\"Point\"}'";
+ mapnik::parameters params;
+ params["type"] = std::string("csv");
+ params["inline"] = csv_string;
+ auto ds = mapnik::datasource_cache::instance().create(params);
+ REQUIRE(bool(ds));
+
+ auto fields = ds->get_descriptor().get_descriptors();
+ require_field_names(fields, {});
+
+ // TODO: this originally had the following comment:
+ // - re-enable after https://github.com/mapnik/mapnik/issues/2319 is fixed
+ // but that seems to have been merged and tested separately?
+ auto fs = all_features(ds);
+ auto feat = fs->next();
+ CHECK(feature_count(feat->get_geometry()) == 1);
+ } // END SECTION
+
+ mapnik::logger::instance().set_severity(severity);
+} // END TEST CASE
diff --git a/test/standalone/font_registration_test.cpp b/test/standalone/font_registration_test.cpp
new file mode 100644
index 0000000..fda605f
--- /dev/null
+++ b/test/standalone/font_registration_test.cpp
@@ -0,0 +1,191 @@
+#define CATCH_CONFIG_MAIN
+#include "catch.hpp"
+
+#include <mapnik/font_engine_freetype.hpp>
+#include <mapnik/util/fs.hpp>
+#include <mapnik/map.hpp>
+#include <mapnik/load_map.hpp>
+#include <mapnik/debug.hpp>
+
+#include <iostream>
+#include <vector>
+#include <algorithm>
+
+TEST_CASE("font") {
+
+SECTION("registration") {
+ try
+ {
+ mapnik::logger logger;
+ mapnik::logger::severity_type original_severity = logger.get_severity();
+
+ // grab references to global statics of registered/cached fonts
+ auto const& global_mapping = mapnik::freetype_engine::get_mapping();
+ auto const& global_cache = mapnik::freetype_engine::get_cache();
+
+ // mapnik.Map object has parallel structure for localized fonts
+ mapnik::Map m(1,1);
+ auto const& local_mapping = m.get_font_file_mapping();
+ auto const& local_cache = m.get_font_memory_cache();
+
+ // should be empty to start
+ REQUIRE( global_mapping.empty() );
+ REQUIRE( global_cache.empty() );
+ REQUIRE( local_mapping.empty() );
+ REQUIRE( local_cache.empty() );
+
+ std::string fontdir("fonts/");
+
+ REQUIRE( mapnik::util::exists( fontdir ) );
+ REQUIRE( mapnik::util::is_directory( fontdir ) );
+
+ // test map cached fonts
+ REQUIRE( m.register_fonts(fontdir , false ) );
+ REQUIRE( m.get_font_memory_cache().size() == 0 );
+ REQUIRE( m.get_font_file_mapping().size() == 1 );
+ REQUIRE( m.load_fonts() );
+ REQUIRE( m.get_font_memory_cache().size() == 1 );
+ REQUIRE( m.register_fonts(fontdir , true ) );
+ REQUIRE( m.get_font_file_mapping().size() == 22 );
+ REQUIRE( m.load_fonts() );
+ REQUIRE( m.get_font_memory_cache().size() == 22 );
+
+ // copy discards memory cache but not file mapping
+ mapnik::Map m2(m);
+ REQUIRE( m2.get_font_memory_cache().size() == 0 );
+ REQUIRE( m2.get_font_file_mapping().size() == 22 );
+ REQUIRE( m2.load_fonts() );
+ REQUIRE( m2.get_font_memory_cache().size() == 22 );
+
+ // test font-directory from XML
+ mapnik::Map m3(1,1);
+ mapnik::load_map_string(m3,"<Map font-directory=\"fonts/\"></Map>");
+ REQUIRE( m3.get_font_memory_cache().size() == 0 );
+ REQUIRE( m3.load_fonts() );
+ REQUIRE( m3.get_font_memory_cache().size() == 1 );
+
+ std::vector<std::string> face_names;
+ std::string foo("foo");
+ // fake directories
+ REQUIRE( !mapnik::freetype_engine::register_fonts(foo , true ) );
+ face_names = mapnik::freetype_engine::face_names();
+ REQUIRE( face_names.size() == 0 );
+ REQUIRE( !mapnik::freetype_engine::register_fonts(foo) );
+ face_names = mapnik::freetype_engine::face_names();
+ REQUIRE( face_names.size() == 0 );
+
+ // directories without fonts
+ // silence warnings here by altering the logging severity
+ logger.set_severity(mapnik::logger::none);
+ std::string src("src");
+ // an empty directory will not return true
+ // we need to register at least one font and not fail on any
+ // to return true
+ REQUIRE( mapnik::freetype_engine::register_font(src) == false );
+ REQUIRE( mapnik::freetype_engine::register_fonts(src, true) == false );
+ REQUIRE( mapnik::freetype_engine::face_names().size() == 0 );
+
+ // bogus, emtpy file that looks like font
+ REQUIRE( mapnik::freetype_engine::register_font("test/data/fonts/fake.ttf") == false );
+ REQUIRE( mapnik::freetype_engine::register_fonts("test/data/fonts/fake.ttf") == false );
+ REQUIRE( mapnik::freetype_engine::face_names().size() == 0 );
+
+ REQUIRE( mapnik::freetype_engine::register_font("test/data/fonts/intentionally-broken.ttf") == false );
+ REQUIRE( mapnik::freetype_engine::register_fonts("test/data/fonts/intentionally-broken.ttf") == false );
+ REQUIRE( mapnik::freetype_engine::face_names().size() == 0 );
+
+ // now restore the original severity
+ logger.set_severity(original_severity);
+
+ // register unifont, since we know it sits in the root fonts/ dir
+ REQUIRE( mapnik::freetype_engine::register_fonts(fontdir) );
+ face_names = mapnik::freetype_engine::face_names();
+ REQUIRE( face_names.size() > 0 );
+ REQUIRE( face_names.size() == 1 );
+
+ // re-register unifont, should not have any affect
+ REQUIRE( mapnik::freetype_engine::register_fonts(fontdir, false) );
+ face_names = mapnik::freetype_engine::face_names();
+ REQUIRE( face_names.size() == 1 );
+
+ // single dejavu font in separate location
+ std::string dejavu_bold_oblique("test/data/fonts/DejaVuSansMono-BoldOblique.ttf");
+ REQUIRE( mapnik::freetype_engine::register_font(dejavu_bold_oblique) );
+ face_names = mapnik::freetype_engine::face_names();
+ REQUIRE( face_names.size() == 2 );
+
+ // now, inspect font mapping and confirm the correct 'DejaVu Sans Mono Bold Oblique' is registered
+ using font_file_mapping = std::map<std::string, std::pair<int,std::string> >;
+ font_file_mapping const& name2file = mapnik::freetype_engine::get_mapping();
+ bool found_dejavu = false;
+ for (auto const& item : name2file)
+ {
+ if (item.first == "DejaVu Sans Mono Bold Oblique")
+ {
+ found_dejavu = true;
+ REQUIRE( item.second.first == 0 );
+ REQUIRE( item.second.second == dejavu_bold_oblique );
+ }
+ }
+ REQUIRE( found_dejavu );
+
+ // recurse to find all dejavu fonts
+ REQUIRE( mapnik::freetype_engine::register_fonts(fontdir, true) );
+ face_names = mapnik::freetype_engine::face_names();
+ REQUIRE( face_names.size() == 22 );
+
+ // we should have re-registered 'DejaVu Sans Mono Bold Oblique' again,
+ // but now at a new path
+ bool found_dejavu2 = false;
+ for (auto const& item : name2file)
+ {
+ if (item.first == "DejaVu Sans Mono Bold Oblique")
+ {
+ found_dejavu2 = true;
+ REQUIRE( item.second.first == 0 );
+ // path should be different
+ REQUIRE( item.second.second != dejavu_bold_oblique );
+ }
+ }
+ REQUIRE( found_dejavu2 );
+
+ // now that global registry is populated
+ // now test that a map only loads new fonts
+ mapnik::Map m4(1,1);
+ REQUIRE( m4.register_fonts(fontdir , true ) );
+ REQUIRE( m4.get_font_memory_cache().size() == 0 );
+ REQUIRE( m4.get_font_file_mapping().size() == 22 );
+ REQUIRE( !m4.load_fonts() );
+ REQUIRE( m4.get_font_memory_cache().size() == 0 );
+ REQUIRE( m4.register_fonts(dejavu_bold_oblique, false) );
+ REQUIRE( m4.load_fonts() );
+ REQUIRE( m4.get_font_memory_cache().size() == 1 );
+
+ // check that we can correctly read a .ttc containing
+ // multiple valid faces
+ // https://github.com/mapnik/mapnik/issues/2274
+ REQUIRE( mapnik::freetype_engine::register_font("test/data/fonts/NotoSans-Regular.ttc") );
+ face_names = mapnik::freetype_engine::face_names();
+ REQUIRE( face_names.size() == 24 );
+
+ // now blindly register as many system fonts as possible
+ // the goal here to make sure we don't crash
+ // linux
+ mapnik::freetype_engine::register_fonts("/usr/share/fonts/", true);
+ mapnik::freetype_engine::register_fonts("/usr/local/share/fonts/", true);
+ // osx
+ mapnik::freetype_engine::register_fonts("/Library/Fonts/", true);
+ mapnik::freetype_engine::register_fonts("/System/Library/Fonts/", true);
+ // windows
+ mapnik::freetype_engine::register_fonts("C:\\Windows\\Fonts", true);
+ face_names = mapnik::freetype_engine::face_names();
+ REQUIRE( face_names.size() > 22 );
+ }
+ catch (std::exception const & ex)
+ {
+ std::clog << ex.what() << "\n";
+ REQUIRE(false);
+ }
+
+}
+}
\ No newline at end of file
diff --git a/test/unit/README.md b/test/unit/README.md
new file mode 100644
index 0000000..d446ede
--- /dev/null
+++ b/test/unit/README.md
@@ -0,0 +1,11 @@
+
+## C++ unit tests
+
+### Building
+
+ python scons/scons.py test/unit/run
+
+
+### Running
+
+ ./test/unit/run
\ No newline at end of file
diff --git a/test/unit/core/box2d_test.cpp b/test/unit/core/box2d_test.cpp
new file mode 100644
index 0000000..0ed32f8
--- /dev/null
+++ b/test/unit/core/box2d_test.cpp
@@ -0,0 +1,163 @@
+#include "catch.hpp"
+
+#include <iostream>
+#include <mapnik/coord.hpp>
+#include <mapnik/box2d.hpp>
+
+TEST_CASE("box2d") {
+SECTION("coord init") {
+ auto c = mapnik::coord2d(100, 100);
+
+ REQUIRE(c.x == 100);
+ REQUIRE(c.y == 100);
+}
+
+SECTION("coord multiplication") {
+ auto c = mapnik::coord2d(100, 100);
+ c *= 2;
+
+ REQUIRE(c.x == 200);
+ REQUIRE(c.y == 200);
+}
+
+SECTION("envelope init") {
+ auto e = mapnik::box2d<double>(100, 100, 200, 200);
+
+ REQUIRE(e.contains(100, 100));
+ REQUIRE(e.contains(100, 200));
+ REQUIRE(e.contains(200, 200));
+ REQUIRE(e.contains(200, 100));
+
+ REQUIRE(e.contains(e.center()));
+
+ REQUIRE(!e.contains(99.9, 99.9));
+ REQUIRE(!e.contains(99.9, 200.1));
+ REQUIRE(!e.contains(200.1, 200.1));
+ REQUIRE(!e.contains(200.1, 99.9));
+
+ REQUIRE(e.width() == 100);
+ REQUIRE(e.height() == 100);
+
+ REQUIRE(e.minx() == 100);
+ REQUIRE(e.miny() == 100);
+
+ REQUIRE(e.maxx() == 200);
+ REQUIRE(e.maxy() == 200);
+
+ REQUIRE(e[0] == 100);
+ REQUIRE(e[1] == 100);
+ REQUIRE(e[2] == 200);
+ REQUIRE(e[3] == 200);
+ REQUIRE(e[0] == e[-4]);
+ REQUIRE(e[1] == e[-3]);
+ REQUIRE(e[2] == e[-2]);
+ REQUIRE(e[3] == e[-1]);
+
+ auto c = e.center();
+
+ REQUIRE(c.x == 150);
+ REQUIRE(c.y == 150);
+}
+
+SECTION("envelope static init") {
+ auto e = mapnik::box2d<double>(100, 100, 200, 200);
+
+ mapnik::box2d<double> e1, e2, e3;
+ REQUIRE(e1.from_string("100 100 200 200"));
+ REQUIRE(e2.from_string("100,100,200,200"));
+ REQUIRE(e3.from_string("100 , 100 , 200 , 200"));
+
+ REQUIRE(e == e1);
+ REQUIRE(e == e2);
+ REQUIRE(e == e3);
+}
+
+SECTION("envelope multiplication") {
+ // no width then no impact of multiplication
+ {
+ auto a = mapnik::box2d<int>(100, 100, 100, 100);
+ a *= 5;
+
+ REQUIRE(a.minx() == 100);
+ REQUIRE(a.miny() == 100);
+ REQUIRE(a.maxx() == 100);
+ REQUIRE(a.maxy() == 100);
+ }
+
+ {
+ auto a = mapnik::box2d<double>(100.0, 100.0, 100.0, 100.0);
+ a *= 5;
+
+ REQUIRE(a.minx() == 100);
+ REQUIRE(a.miny() == 100);
+ REQUIRE(a.maxx() == 100);
+ REQUIRE(a.maxy() == 100);
+ }
+
+ {
+ auto a = mapnik::box2d<double>(100.0, 100.0, 100.001, 100.001);
+ a *= 5;
+
+ REQUIRE(a.minx() == Approx( 99.9980));
+ REQUIRE(a.miny() == Approx( 99.9980));
+ REQUIRE(a.maxx() == Approx(100.0030));
+ REQUIRE(a.maxy() == Approx(100.0030));
+ }
+
+ {
+ auto e = mapnik::box2d<double>(100, 100, 200, 200);
+ e *= 2;
+
+ REQUIRE(e.minx() == 50);
+ REQUIRE(e.miny() == 50);
+ REQUIRE(e.maxx() == 250);
+ REQUIRE(e.maxy() == 250);
+
+ REQUIRE(e.contains(50, 50));
+ REQUIRE(e.contains(50, 250));
+ REQUIRE(e.contains(250, 250));
+ REQUIRE(e.contains(250, 50));
+
+ REQUIRE(!e.contains(49.9, 49.9));
+ REQUIRE(!e.contains(49.9, 250.1));
+ REQUIRE(!e.contains(250.1, 250.1));
+ REQUIRE(!e.contains(250.1, 49.9));
+
+ REQUIRE(e.contains(e.center()));
+
+ REQUIRE(e.width() == 200);
+ REQUIRE(e.height() == 200);
+
+ REQUIRE(e.minx() == 50);
+ REQUIRE(e.miny() == 50);
+
+ REQUIRE(e.maxx() == 250);
+ REQUIRE(e.maxy() == 250);
+
+ auto c = e.center();
+
+ REQUIRE(c.x == 150);
+ REQUIRE(c.y == 150);
+ }
+}
+
+SECTION("envelope clipping") {
+ auto e1 = mapnik::box2d<double>(-180,-90,180,90);
+ auto e2 = mapnik::box2d<double>(-120,40,-110,48);
+ e1.clip(e2);
+ REQUIRE(e1 == e2);
+
+ // madagascar in merc
+ e1 = mapnik::box2d<double>(4772116.5490, -2744395.0631, 5765186.4203, -1609458.0673);
+ e2 = mapnik::box2d<double>(5124338.3753, -2240522.1727, 5207501.8621, -2130452.8520);
+ e1.clip(e2);
+ REQUIRE(e1 == e2);
+
+ // nz in lon/lat
+ e1 = mapnik::box2d<double>(163.8062, -47.1897, 179.3628, -33.9069);
+ e2 = mapnik::box2d<double>(173.7378, -39.6395, 174.4849, -38.9252);
+ e1.clip(e2);
+ REQUIRE(e1 == e2);
+}
+
+} // TEST_CASE
diff --git a/test/unit/core/conversions_test.cpp b/test/unit/core/conversions_test.cpp
new file mode 100644
index 0000000..08819b2
--- /dev/null
+++ b/test/unit/core/conversions_test.cpp
@@ -0,0 +1,300 @@
+#include "catch.hpp"
+
+#include <mapnik/value_types.hpp>
+#include <mapnik/value.hpp>
+#include <mapnik/util/conversions.hpp>
+#include <iostream>
+#include <vector>
+#include <algorithm>
+#include <boost/unordered_map.hpp>
+
+#if defined(_MSC_VER) && _MSC_VER < 1900
+#include <cstdio>
+#endif
+
+TEST_CASE("conversions") {
+
+SECTION("to string") {
+
+ #if defined(_MSC_VER) && _MSC_VER < 1900
+ unsigned int old = _set_output_format(_TWO_DIGIT_EXPONENT);
+ #endif
+
+ using mapnik::util::to_string;
+ using mapnik::util::string2bool;
+
+ try
+ {
+ std::string out;
+
+ // Test double
+ to_string(out, double(0));
+ REQUIRE( out == "0" );
+ out.clear();
+
+ to_string(out, double(1));
+ REQUIRE( out == "1" );
+ out.clear();
+
+ to_string(out, double(-1));
+ REQUIRE( out == "-1" );
+ out.clear();
+
+ to_string(out, double(0.1));
+ REQUIRE( out == "0.1" );
+ out.clear();
+
+ to_string(out, double(-0.1));
+ REQUIRE( out == "-0.1" );
+ out.clear();
+
+ to_string(out, double(0.123));
+ REQUIRE( out == "0.123" );
+ out.clear();
+
+ to_string(out, double(-0.123));
+ REQUIRE( out == "-0.123" );
+ out.clear();
+
+ to_string(out, double(1e-06));
+ REQUIRE( out == "1e-06" );
+ out.clear();
+
+ to_string(out, double(-1e-06));
+ REQUIRE( out == "-1e-06" );
+ out.clear();
+
+ to_string(out, double(1e-05));
+ REQUIRE( out == "1e-05" );
+ out.clear();
+
+ to_string(out, double(-1e-05));
+ REQUIRE( out == "-1e-05" );
+ out.clear();
+
+ to_string(out, double(0.0001));
+ REQUIRE( out == "0.0001" );
+ out.clear();
+
+ to_string(out, double(-0.0001));
+ REQUIRE( out == "-0.0001" );
+ out.clear();
+
+ to_string(out, double(0.0001));
+ REQUIRE( out == "0.0001" );
+ out.clear();
+
+ to_string(out, double(0.00001));
+ REQUIRE( out == "1e-05" );
+ out.clear();
+
+ to_string(out, double(0.000001));
+ REQUIRE( out == "1e-06" );
+ out.clear();
+
+ to_string(out, double(0.0000001));
+ REQUIRE( out == "1e-07" );
+ out.clear();
+
+ to_string(out, double(0.00000001));
+ REQUIRE( out == "1e-08" );
+ out.clear();
+
+ to_string(out, double(0.000000001));
+ REQUIRE( out == "1e-09" );
+ out.clear();
+
+ to_string(out, double(0.0000000001));
+ REQUIRE( out == "1e-10" );
+ out.clear();
+
+ to_string(out, double(-1.234e+16));
+ REQUIRE( 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));
+ REQUIRE( 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
+ REQUIRE( out == "0.000123457" );
+ out.clear();
+
+ to_string(out, double(0.00000000001));
+ REQUIRE( out == "1e-11" );
+ out.clear();
+
+ to_string(out, double(0.000000000001));
+ REQUIRE( out == "1e-12" );
+ out.clear();
+
+ to_string(out, double(0.0000000000001));
+ REQUIRE( out == "1e-13" );
+ out.clear();
+
+ to_string(out, double(0.00000000000001));
+ REQUIRE( out == "1e-14" );
+ out.clear();
+
+ to_string(out, double(0.000000000000001));
+ REQUIRE( out == "1e-15" );
+ out.clear();
+
+ to_string(out, double(100000));
+ REQUIRE( out == "100000" );
+ out.clear();
+
+ to_string(out, double(1000000));
+ REQUIRE( out == "1e+06" );
+ out.clear();
+
+ to_string(out, double(10000000));
+ REQUIRE( out == "1e+07" );
+ out.clear();
+
+ to_string(out, double(100000000));
+ REQUIRE( out == "1e+08" );
+ out.clear();
+
+ to_string(out, double(1000000000));
+ REQUIRE( out == "1e+09" );
+ out.clear();
+
+ to_string(out, double(10000000000));
+ REQUIRE( out == "1e+10" );
+ out.clear();
+
+ to_string(out, double(100000000000));
+ REQUIRE( out == "1e+11" );
+ out.clear();
+
+ to_string(out, double(1000000000000));
+ REQUIRE( out == "1e+12" );
+ out.clear();
+
+ to_string(out, double(10000000000000));
+ REQUIRE( out == "1e+13" );
+ out.clear();
+
+ to_string(out, double(100000000000000));
+ REQUIRE( out == "1e+14" );
+ out.clear();
+
+ to_string(out, double(1000000000000005));
+ REQUIRE( out == "1e+15" );
+ out.clear();
+
+ to_string(out, double(-1000000000000000));
+ REQUIRE( out == "-1e+15" );
+ out.clear();
+
+ to_string(out, double(100000000000000.1));
+ REQUIRE( out == "1e+14" );
+ out.clear();
+
+ to_string(out, double(1.00001));
+ REQUIRE( out == "1.00001" );
+ out.clear();
+
+ to_string(out, double(67.65));
+ REQUIRE( out == "67.65" );
+ out.clear();
+
+ to_string(out, double(67.35));
+ REQUIRE( out == "67.35" );
+ out.clear();
+
+ to_string(out, double(1234000000000000));
+ REQUIRE( out == "1.234e+15" );
+ out.clear();
+
+ to_string(out, double(1e+16));
+ REQUIRE( out == "1e+16" );
+ out.clear();
+
+ to_string(out, double(1.234e+16));
+ REQUIRE( out == "1.234e+16" );
+ out.clear();
+
+ // int
+ to_string(out, int(2));
+ REQUIRE( out == "2" );
+ out.clear();
+
+ to_string(out, int(0));
+ REQUIRE( out == "0" );
+ out.clear();
+
+ to_string(out, int(-2));
+ REQUIRE( out == "-2" );
+ out.clear();
+
+ to_string(out, int(2147483647));
+ REQUIRE( out == "2147483647" );
+ out.clear();
+
+ to_string(out, int(-2147483648));
+ REQUIRE( out == "-2147483648" );
+ out.clear();
+
+ // unsigned
+ to_string(out, unsigned(4294967295));
+ REQUIRE( out == "4294967295" );
+ out.clear();
+
+#ifdef BIGINT
+ // long long
+ to_string(out,mapnik::value_integer(-0));
+ REQUIRE( out == "0" );
+ out.clear();
+
+ to_string(out,mapnik::value_integer(-2));
+ REQUIRE( out == "-2" );
+ out.clear();
+
+ to_string(out,mapnik::value_integer(9223372036854775807));
+ REQUIRE( out == "9223372036854775807" );
+ out.clear();
+#else
+ #ifdef _MSC_VER
+ #pragma NOTE("BIGINT not defined so skipping large number conversion tests")
+ #else
+ #warning BIGINT not defined so skipping large number conversion tests
+ #endif
+#endif
+ // bool
+ to_string(out, true);
+ REQUIRE( out == "true" );
+ out.clear();
+
+ to_string(out, false);
+ REQUIRE( out == "false" );
+ out.clear();
+
+ bool val = false;
+ REQUIRE( !string2bool("this is invalid",val) );
+ REQUIRE( val == false );
+ REQUIRE( string2bool("true",val) );
+ REQUIRE( val == true );
+
+ // mapnik::value hashability
+ using values_container = boost::unordered_map<mapnik::value, unsigned>;
+ values_container vc;
+ mapnik::value val2(1);
+ vc[val2] = 1;
+ REQUIRE( vc[1] == static_cast<int>(1) );
+
+ }
+ catch (std::exception const & ex)
+ {
+ std::clog << ex.what() << "\n";
+ REQUIRE(false);
+ }
+}
+
+}
\ No newline at end of file
diff --git a/test/unit/core/copy_move_test.cpp b/test/unit/core/copy_move_test.cpp
new file mode 100644
index 0000000..3b38ae7
--- /dev/null
+++ b/test/unit/core/copy_move_test.cpp
@@ -0,0 +1,78 @@
+
+#include <mapnik/layer.hpp>
+#include <mapnik/map.hpp>
+#include <mapnik/color.hpp>
+#include <mapnik/datasource.hpp>
+#include <mapnik/datasource_cache.hpp>
+
+#include <vector>
+#include <algorithm>
+
+#include "catch.hpp"
+
+
+TEST_CASE("copy") {
+
+SECTION("layers") {
+
+ try
+ {
+ mapnik::Map m0(100,100);
+ mapnik::Map m2(200,100);
+ mapnik::datasource_cache::instance().register_datasources("plugins/input/shape.input");
+ mapnik::parameters p;
+ p["type"]="shape";
+ p["file"]="demo/data/boundaries";
+ p["encoding"]="latin1";
+ auto ds0 = mapnik::datasource_cache::instance().create(p);
+
+ auto ds1 = ds0; // shared ptr copy
+ REQUIRE( (ds1 == ds0) );
+ REQUIRE( !(*ds1 != *ds0) );
+ REQUIRE( (ds1.get() == ds0.get()) );
+ ds1 = mapnik::datasource_cache::instance().create(p); // new with the same parameters
+ REQUIRE( (ds1 != ds0) );
+ REQUIRE( (*ds1 == *ds0) );
+ auto ds2 = std::move(ds1);
+ REQUIRE( (ds2 != ds0) );
+ REQUIRE( (*ds2 == *ds0) );
+
+ // mapnik::layer
+ mapnik::layer l0("test-layer");
+ l0.set_datasource(ds0);
+
+ mapnik::layer l1 = l0; // copy assignment
+ REQUIRE( (l1 == l0) );
+ mapnik::layer l2(l0); // copy ctor
+ REQUIRE( (l2 == l0) );
+ mapnik::layer l3(mapnik::layer("test-layer")); // move ctor
+ l3.set_datasource(ds2);
+
+ REQUIRE( (l3 == l0) );
+ mapnik::layer l4 = std::move(l3);
+ REQUIRE( (l4 == l0) ); // move assignment
+
+ m0.add_layer(l4);
+ m0.set_background(mapnik::color("skyblue"));
+ m2.set_background(mapnik::color("skyblue"));
+
+ auto m1 = m0; //copy
+
+ REQUIRE( (m0 == m1) );
+ REQUIRE( (m0 != m2) );
+
+ m2 = m1; // copy
+ REQUIRE( (m2 == m1) );
+ m2 = std::move(m1);
+ REQUIRE( (m2 == m0) );
+ REQUIRE( (m1 != m0) );
+
+ REQUIRE( (m0 == m2) );
+ }
+ catch (std::exception const & ex)
+ {
+ std::clog << ex.what() << "\n";
+ REQUIRE(false);
+ }
+}
+}
\ No newline at end of file
diff --git a/test/unit/core/exceptions_test.cpp b/test/unit/core/exceptions_test.cpp
new file mode 100644
index 0000000..b3492d1
--- /dev/null
+++ b/test/unit/core/exceptions_test.cpp
@@ -0,0 +1,103 @@
+#include "catch.hpp"
+
+#include <iostream>
+#include <mapnik/projection.hpp>
+#include <mapnik/unicode.hpp>
+#include <mapnik/map.hpp>
+#include <mapnik/save_map.hpp>
+#include <mapnik/feature.hpp>
+#include <mapnik/memory_datasource.hpp>
+#include <mapnik/feature_type_style.hpp>
+#include <mapnik/feature_factory.hpp>
+#include <mapnik/rule.hpp>
+#include <mapnik/expression.hpp>
+#include <mapnik/layer.hpp>
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/config_error.hpp>
+#include <mapnik/datasource_cache.hpp>
+#include <mapnik/params.hpp>
+#include <mapnik/util/fs.hpp>
+#include <vector>
+#include <algorithm>
+
+TEST_CASE("exceptions") {
+
+SECTION("handling") {
+ try {
+ mapnik::projection srs("foo");
+ // to avoid unused variable warning
+ srs.params();
+ REQUIRE(false);
+ } catch (...) {
+ REQUIRE(true);
+ }
+
+ // https://github.com/mapnik/mapnik/issues/2170
+ try {
+ mapnik::projection srs("+proj=longlat foo",true);
+ REQUIRE(srs.is_geographic());
+ REQUIRE(true);
+ srs.init_proj4();
+ // oddly init_proj4 does not throw with old proj/ubuntu precise
+ //REQUIRE(false);
+ } catch (...) {
+ REQUIRE(true);
+ }
+
+ try {
+ mapnik::transcoder tr("bogus encoding");
+ REQUIRE(false);
+ } catch (...) {
+ REQUIRE(true);
+ }
+
+ mapnik::Map map(256,256);
+ mapnik::rule r;
+ r.set_filter(mapnik::parse_expression("[foo]='bar'"));
+ r.append(std::move(mapnik::markers_symbolizer()));
+ mapnik::feature_type_style style;
+ style.add_rule(std::move(r));
+ map.insert_style("style", std::move(style));
+
+ std::string csv_plugin("./plugins/input/csv.input");
+ if (mapnik::util::exists(csv_plugin)) {
+ try {
+ mapnik::datasource_cache::instance().register_datasource(csv_plugin);
+ mapnik::parameters p;
+ p["type"]="csv";
+ p["inline"]="x,y\n0,0";
+ mapnik::datasource_ptr ds = mapnik::datasource_cache::instance().create(p);
+ mapnik::layer l("layer");
+ l.set_datasource(ds);
+ l.add_style("style");
+ mapnik::Map m = map;
+ m.add_layer(l);
+ m.zoom_all();
+ mapnik::image_rgba8 im(m.width(),m.height());
+ mapnik::agg_renderer<mapnik::image_rgba8> ren(m,im);
+ //std::clog << mapnik::save_map_to_string(m) << "\n";
+ REQUIRE(true);
+ // should throw here with "CSV Plugin: no attribute 'foo'. Valid attributes are: x,y."
+ ren.apply();
+ REQUIRE(false);
+ } catch (...) {
+ REQUIRE(true);
+ }
+ }
+
+ std::string shape_plugin("./plugins/input/shape.input");
+ if (mapnik::util::exists(shape_plugin)) {
+ try {
+ mapnik::datasource_cache::instance().register_datasource(shape_plugin);
+ mapnik::parameters p2;
+ p2["type"]="shape";
+ p2["file"]="foo";
+ mapnik::datasource_cache::instance().create(p2);
+ REQUIRE(false);
+ } catch (...) {
+ REQUIRE(true);
+ }
+ }
+
+}
+}
diff --git a/test/unit/core/params_test.cpp b/test/unit/core/params_test.cpp
new file mode 100644
index 0000000..879b861
--- /dev/null
+++ b/test/unit/core/params_test.cpp
@@ -0,0 +1,115 @@
+#include "catch.hpp"
+
+#include <iostream>
+#include <mapnik/value_types.hpp>
+#include <mapnik/params.hpp>
+#include <mapnik/boolean.hpp>
+#include <vector>
+#include <algorithm>
+
+#include <ostream>
+
+namespace detail {
+
+class string_holder {
+ public:
+ string_holder() :
+ member_("member") {}
+ std::string const& get_string() const
+ {
+ return member_;
+ }
+ private:
+ std::string member_;
+};
+
+}
+
+TEST_CASE("parameters") {
+
+SECTION("get/set") {
+
+ try
+ {
+ mapnik::parameters params;
+
+ // true
+ params["bool"] = mapnik::value_integer(true);
+ REQUIRE( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == true));
+
+ params["bool"] = "true";
+ REQUIRE( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == true));
+
+ params["bool"] = mapnik::value_integer(1);
+ REQUIRE( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == true));
+
+ params["bool"] = "1";
+ REQUIRE( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == true));
+
+ params["bool"] = "True";
+ REQUIRE( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == true));
+
+ params["bool"] = "on";
+ REQUIRE( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == true));
+
+ params["bool"] = "yes";
+ REQUIRE( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == true));
+
+ // false
+ params["bool"] = mapnik::value_integer(false);
+ REQUIRE( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == false) );
+
+ params["bool"] = "false";
+ REQUIRE( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == false) );
+
+ params["bool"] = mapnik::value_integer(0);
+ REQUIRE( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == false));
+
+ params["bool"] = "0";
+ REQUIRE( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == false));
+
+ params["bool"] = "False";
+ REQUIRE( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == false));
+
+ params["bool"] = "off";
+ REQUIRE( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == false));
+
+ params["bool"] = "no";
+ REQUIRE( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == false));
+
+ // strings
+ params["string"] = "hello";
+ REQUIRE( (params.get<std::string>("string") && *params.get<std::string>("string") == "hello") );
+
+ // int
+ params["int"] = mapnik::value_integer(1);
+ REQUIRE( (params.get<mapnik::value_integer>("int") && *params.get<mapnik::value_integer>("int") == 1) );
+
+ // double
+ params["double"] = 1.5;
+ REQUIRE( (params.get<double>("double") && *params.get<double>("double") == 1.5) );
+ // value_null
+ params["null"] = mapnik::value_null();
+ // https://github.com/mapnik/mapnik/issues/2471
+ //REQUIRE( (params.get<mapnik::value_null>("null") && *params.get<mapnik::value_null>("null") == mapnik::value_null()) );
+
+ std::string value("value");
+ params["value"] = value;
+ REQUIRE( (params.get<std::string>("value") == std::string("value")) ) ;
+ REQUIRE(value == std::string("value"));
+
+ // ensure that const member is not moved incorrectly when added to params
+ detail::string_holder holder;
+ std::string const& holder_member = holder.get_string();
+ params["member"] = holder_member;
+ REQUIRE( (params.get<std::string>("member") == std::string("member")) );
+ REQUIRE( (holder_member == std::string("member")) );
+ }
+ catch (std::exception const& ex)
+ {
+ std::cerr << ex.what() << "\n";
+ REQUIRE(false);
+ }
+
+}
+}
diff --git a/tests/cpp_tests/data/cases.txt b/test/unit/data/cases.txt
similarity index 100%
rename from tests/cpp_tests/data/cases.txt
rename to test/unit/data/cases.txt
diff --git a/test/unit/font/fontset_runtime_test.cpp b/test/unit/font/fontset_runtime_test.cpp
new file mode 100644
index 0000000..72305b1
--- /dev/null
+++ b/test/unit/font/fontset_runtime_test.cpp
@@ -0,0 +1,85 @@
+#include "catch.hpp"
+
+#include <iostream>
+#include <mapnik/memory_datasource.hpp>
+#include <mapnik/datasource_cache.hpp>
+#include <mapnik/feature.hpp>
+#include <mapnik/feature_factory.hpp>
+#include <mapnik/unicode.hpp>
+#include <mapnik/map.hpp>
+#include <mapnik/params.hpp>
+#include <mapnik/expression.hpp>
+#include <mapnik/layer.hpp>
+#include <mapnik/rule.hpp>
+#include <mapnik/feature_type_style.hpp>
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/image_util.hpp>
+#include <mapnik/color_factory.hpp>
+#include <mapnik/save_map.hpp>
+#include <mapnik/value_types.hpp>
+#include <mapnik/symbolizer.hpp>
+#include <mapnik/text/placements/dummy.hpp>
+#include <mapnik/text/formatting/text.hpp>
+#include <vector>
+#include <algorithm>
+#include <mapnik/make_unique.hpp>
+
+// icu - for memory cleanup (to make valgrind happy)
+#include "unicode/uclean.h"
+
+TEST_CASE("fontset") {
+
+SECTION("error") {
+
+ try {
+
+ // create a renderable map with a fontset and a text symbolizer
+ // and do not register any fonts, to ensure the error thrown is reasonable
+ mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>();
+ ctx->push("name");
+ mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx,1));
+ mapnik::transcoder tr("utf-8");
+ mapnik::value_unicode_string ustr = tr.transcode("hello world!");
+ feature->put("name",ustr);
+ //auto pt = std::make_unique<mapnik::geometry_type>(mapnik::geometry::geometry_types::Point);
+ //pt->move_to(128,128);
+ mapnik::geometry::point<double> pt(128,128);
+ feature->set_geometry(std::move(pt));
+
+ mapnik::parameters params;
+ params["type"]="memory";
+ auto ds = std::make_shared<mapnik::memory_datasource>(params);
+ ds->push(feature);
+ mapnik::Map m(256,256);
+ mapnik::font_set fontset("fontset");
+ // NOTE: this is a valid font, but will fail because none are registered
+ fontset.add_face_name("DejaVu Sans Book");
+ m.insert_fontset("fontset", fontset);
+ mapnik::layer lyr("layer");
+ lyr.set_datasource(ds);
+ lyr.add_style("style");
+ m.add_layer(lyr);
+ mapnik::feature_type_style the_style;
+ mapnik::rule r;
+ mapnik::text_symbolizer text_sym;
+ mapnik::text_placements_ptr placement_finder = std::make_shared<mapnik::text_placements_dummy>();
+ placement_finder->defaults.format_defaults.face_name = "DejaVu Sans Book";
+ placement_finder->defaults.format_defaults.text_size = 10.0;
+ placement_finder->defaults.format_defaults.fill = mapnik::color(0,0,0);
+ placement_finder->defaults.format_defaults.fontset = fontset;
+ placement_finder->defaults.set_format_tree(std::make_shared<mapnik::formatting::text_node>(mapnik::parse_expression("[name]")));
+ mapnik::put<mapnik::text_placements_ptr>(text_sym, mapnik::keys::text_placements_, placement_finder);
+ r.append(std::move(text_sym));
+ the_style.add_rule(std::move(r));
+ m.insert_style("style", std::move(the_style) );
+ m.zoom_to_box(mapnik::box2d<double>(-256,-256,
+ 256,256));
+ mapnik::image_rgba8 buf(m.width(),m.height());
+ mapnik::agg_renderer<mapnik::image_rgba8> ren(m,buf);
+ ren.apply();
+ } catch (std::exception const& ex) {
+ REQUIRE(std::string(ex.what()) == std::string("Unable to find specified font face 'DejaVu Sans Book' in font set: 'fontset'"));
+ }
+ u_cleanup();
+}
+}
\ No newline at end of file
diff --git a/test/unit/geometry/geometry.cpp b/test/unit/geometry/geometry.cpp
new file mode 100644
index 0000000..b3e01cc
--- /dev/null
+++ b/test/unit/geometry/geometry.cpp
@@ -0,0 +1,39 @@
+#include "catch.hpp"
+
+#include <mapnik/geometry.hpp>
+#include <mapnik/util/fs.hpp>
+#include <mapnik/util/file_io.hpp>
+#include <mapnik/json/geometry_parser.hpp>
+#include <mapnik/util/geometry_to_geojson.hpp>
+
+TEST_CASE("geometry") {
+
+SECTION("json point") {
+ mapnik::util::file input("./test/data/json/point1.json");
+ REQUIRE( input.open() );
+ auto json = input.data();
+ mapnik::geometry::geometry<double> geom;
+ std::string json_string(json.get());
+ REQUIRE( mapnik::json::from_geojson(json_string, geom) );
+ REQUIRE( geom.is<mapnik::geometry::point<double> >() );
+ auto const& point = mapnik::util::get<mapnik::geometry::point<double> >(geom);
+ REQUIRE( point.x == 30 );
+ REQUIRE( point.y == 10 );
+ std::string new_json;
+ REQUIRE( mapnik::util::to_geojson(new_json, geom) );
+}
+
+SECTION("json point reversed") {
+ mapnik::util::file input("./test/data/json/point2.json");
+ REQUIRE( input.open() );
+ auto json = input.data();
+ mapnik::geometry::geometry<double> geom;
+ std::string json_string(json.get());
+ REQUIRE( mapnik::json::from_geojson(json_string,geom) );
+ REQUIRE( geom.is<mapnik::geometry::point<double> >() );
+ auto const& point = mapnik::util::get<mapnik::geometry::point<double> >(geom);
+ REQUIRE( point.x == 30 );
+ REQUIRE( point.y == 10 );
+}
+
+}
diff --git a/test/unit/geometry/geometry_converters_test.cpp b/test/unit/geometry/geometry_converters_test.cpp
new file mode 100644
index 0000000..3689051
--- /dev/null
+++ b/test/unit/geometry/geometry_converters_test.cpp
@@ -0,0 +1,192 @@
+#include "catch.hpp"
+
+#include <iostream>
+#include <vector>
+#include <algorithm>
+
+#include <mapnik/layer.hpp>
+#include <mapnik/feature_type_style.hpp>
+#include <mapnik/rule.hpp>
+#include <mapnik/debug.hpp>
+#include <mapnik/view_transform.hpp>
+#include <mapnik/feature.hpp>
+#include <mapnik/vertex_converters.hpp>
+#include <mapnik/wkt/wkt_factory.hpp>
+#include <mapnik/well_known_srs.hpp>
+#include <mapnik/wkt/wkt_generator_grammar.hpp>
+#include <mapnik/projection.hpp>
+#include <mapnik/proj_transform.hpp>
+
+// stl
+#include <stdexcept>
+#if 0 // FIXME
+struct output_geometry_backend
+{
+ output_geometry_backend(mapnik::geometry_container & paths, mapnik::geometry_type::types type)
+ : paths_(paths),
+ type_(type) {}
+
+ template <typename T>
+ void add_path(T & path)
+ {
+ mapnik::vertex2d vtx(mapnik::vertex2d::no_init);
+ path.rewind(0);
+ std::unique_ptr<mapnik::geometry_type> geom_ptr(new mapnik::geometry_type(type_));
+
+ while ((vtx.cmd = path.vertex(&vtx.x, &vtx.y)) != mapnik::SEG_END)
+ {
+ //std::cerr << vtx.x << "," << vtx.y << " cmd=" << vtx.cmd << std::endl;
+ geom_ptr->push_vertex(vtx.x, vtx.y, (mapnik::CommandType)vtx.cmd);
+ }
+ paths_.push_back(geom_ptr.release());
+ }
+ mapnik::geometry_container & paths_;
+ mapnik::geometry_type::types type_;
+};
+
+boost::optional<std::string> linestring_bbox_clipping(mapnik::box2d<double> bbox,
+ std::string wkt_in)
+{
+ using namespace mapnik;
+ agg::trans_affine tr;
+ projection src(MAPNIK_LONGLAT_PROJ);
+ projection dst(MAPNIK_LONGLAT_PROJ);
+ proj_transform prj_trans(src,dst);
+ line_symbolizer sym;
+ view_transform t(bbox.width(),bbox.height(), bbox);
+ mapnik::geometry_container output_paths;
+ output_geometry_backend backend(output_paths, mapnik::geometry::geometry_types::LineString);
+
+ mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>();
+ mapnik::feature_impl f(ctx,0);
+ vertex_converter<output_geometry_backend,clip_line_tag>
+ converter(bbox, backend, sym, t, prj_trans, tr, f, attributes(), 1.0);
+
+ converter.set<clip_line_tag>();
+
+ mapnik::geometry_container p;
+ if (!mapnik::from_wkt(wkt_in , p))
+ {
+ throw std::runtime_error("Failed to parse WKT");
+ }
+
+ for (geometry_type const& geom : p)
+ {
+ vertex_adapter va(geom);
+ converter.apply(va);
+ }
+
+ using sink_type = std::back_insert_iterator<std::string>;
+ std::string wkt;
+ sink_type sink(wkt);
+ static const mapnik::wkt::wkt_multi_generator<sink_type, mapnik::geometry_container> generator;
+ if (boost::spirit::karma::generate(sink, generator, output_paths))
+ {
+ return boost::optional<std::string>(wkt);
+ }
+ return boost::optional<std::string>();
+}
+
+boost::optional<std::string> polygon_bbox_clipping(mapnik::box2d<double> bbox,
+ std::string wkt_in)
+{
+ using namespace mapnik;
+ agg::trans_affine tr;
+ projection src(MAPNIK_LONGLAT_PROJ);
+ projection dst(MAPNIK_LONGLAT_PROJ);
+ proj_transform prj_trans(src,dst);
+ polygon_symbolizer sym;
+ view_transform t(bbox.width(),bbox.height(), bbox);
+ mapnik::geometry_container output_paths;
+ output_geometry_backend backend(output_paths, mapnik::geometry::geometry_types::Polygon);
+
+ mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>();
+ mapnik::feature_impl f(ctx,0);
+ vertex_converter<output_geometry_backend, clip_poly_tag>
+ converter(bbox, backend, sym, t, prj_trans, tr, f, attributes(), 1.0);
+
+ converter.set<clip_poly_tag>();
+
+ mapnik::geometry_container p;
+ if (!mapnik::from_wkt(wkt_in , p))
+ {
+ throw std::runtime_error("Failed to parse WKT");
+ }
+
+ for (geometry_type const& geom : p)
+ {
+ vertex_adapter va(geom);
+ converter.apply(va);
+ }
+
+ using sink_type = std::back_insert_iterator<std::string>;
+ std::string wkt; // Use Python String directly ?
+ sink_type sink(wkt);
+ static const mapnik::wkt::wkt_multi_generator<sink_type, mapnik::geometry_container> generator;
+ if (boost::spirit::karma::generate(sink, generator, output_paths))
+ {
+ return boost::optional<std::string>(wkt);
+ }
+
+ return boost::optional<std::string>();
+}
+
+#endif
+
+TEST_CASE("geometry converters") {
+
+SECTION("TODO") {
+
+ try
+ {
+#if 0
+ // LineString/bbox clipping
+ {
+ std::string wkt_in("LineString(0 0,200 200)");
+ boost::optional<std::string> result = linestring_bbox_clipping(mapnik::box2d<double>(50,50,150,150),wkt_in);
+ REQUIRE(result);
+ REQUIRE(*result == std::string("LineString(50 50,150 150)"));
+ }
+ // Polygon/bbox clipping
+ {
+ std::string wkt_in("Polygon((50 50,150 50,150 150,50 150,50 50))");
+ boost::optional<std::string> result = polygon_bbox_clipping(mapnik::box2d<double>(50,50,150,150),wkt_in);
+ REQUIRE(result);
+ // TODO - the extra 50 50 is not ideal, but we enforce this result for now to prevent
+ // regressions and because we don't have actionable solution to drop extra 50 50
+ REQUIRE(*result == std::string("Polygon((50 50,150 50,150 150,50 150,50 50,50 50))"));
+ // below is ideal, but not current result
+ //REQUIRE(*result == std::string("Polygon((50 50,150 50,150 150,50 150,50 50))"));
+ }
+
+ {
+ std::string wkt_in("Polygon((60 60,140 60,140 160,60 140,60 60))");
+ boost::optional<std::string> result = polygon_bbox_clipping(mapnik::box2d<double>(50,50,150,150),wkt_in);
+ REQUIRE(result);
+ REQUIRE(*result == std::string("Polygon((60 60,140 60,140 150,100 150,60 140,60 60,60 60))"));
+ //REQUIRE(*result == std::string("Polygon((60 60,140 60,140 160,60 140,60 60))"));
+ }
+
+ {
+ std::string wkt_in("Polygon((0 0,10 0,10 10,0 10,0 0))");
+ boost::optional<std::string> result = polygon_bbox_clipping(mapnik::box2d<double>(50,50,150,150),wkt_in);
+ REQUIRE(result);
+ // TODO - this is completely wrong: should not have )) and ideally should be EMPTY
+ REQUIRE(*result == std::string("Polygon())"));
+ }
+ {
+ std::string wkt_in("Polygon((0 0,100 200,200 0,0 0 ))");
+ boost::optional<std::string> result = polygon_bbox_clipping(mapnik::box2d<double>(50,50,150,150),wkt_in);
+ REQUIRE(result);
+ REQUIRE(*result == std::string("Polygon((50 50,50 100,75 150,125 150,150 100,150 50))"));
+ //REQUIRE(*result == std::string("Polygon((50 50,50 100,75 150,125 150,150 100,150 50,50 50))"));
+ }
+#endif
+ }
+ catch (std::exception const & ex)
+ {
+ std::clog << ex.what() << "\n";
+ REQUIRE(false);
+ }
+}
+}
diff --git a/test/unit/geometry/geometry_envelope_test.cpp b/test/unit/geometry/geometry_envelope_test.cpp
new file mode 100644
index 0000000..1898f0a
--- /dev/null
+++ b/test/unit/geometry/geometry_envelope_test.cpp
@@ -0,0 +1,153 @@
+#include "catch.hpp"
+
+#include <mapnik/config.hpp>
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_adapters.hpp>
+#include <mapnik/geometry_envelope.hpp>
+#include <mapnik/geometry_correct.hpp>
+
+TEST_CASE("geometry ops - envelope") {
+
+SECTION("envelope_test - double") {
+ using namespace mapnik::geometry;
+ {
+ geometry<double> geom(point<double>(1,2));
+ mapnik::box2d<double> bbox = mapnik::geometry::envelope(geom);
+ REQUIRE( bbox.minx() == 1 );
+ REQUIRE( bbox.miny() == 2 );
+ REQUIRE( bbox.maxx() == 1 );
+ REQUIRE( bbox.maxy() == 2 );
+ }
+ {
+ // Test empty geom
+ geometry<double> geom(std::move(mapnik::geometry::geometry_empty()));
+ mapnik::box2d<double> bbox = mapnik::geometry::envelope(geom);
+ REQUIRE_FALSE( bbox.valid() );
+ }
+ {
+ line_string<double> line;
+ line.add_coord(0,0);
+ line.add_coord(1,1);
+ line.add_coord(2,2);
+ geometry<double> geom(line);
+ mapnik::box2d<double> bbox = mapnik::geometry::envelope(geom);
+ REQUIRE( bbox.minx() == 0 );
+ REQUIRE( bbox.miny() == 0 );
+ REQUIRE( bbox.maxx() == 2 );
+ REQUIRE( bbox.maxy() == 2 );
+ }
+ {
+ line_string<double> line;
+ line.add_coord(0,0);
+ line.add_coord(1,1);
+ line.add_coord(2,2);
+ line_string<double> line2;
+ line2.add_coord(0,0);
+ line2.add_coord(-1,-1);
+ line2.add_coord(-2,-2);
+ multi_line_string<double> multi_line;
+ multi_line.emplace_back(std::move(line));
+ multi_line.emplace_back(std::move(line2));
+ geometry<double> geom(multi_line);
+ mapnik::box2d<double> bbox = mapnik::geometry::envelope(geom);
+ REQUIRE( bbox.minx() == -2 );
+ REQUIRE( bbox.miny() == -2 );
+ REQUIRE( bbox.maxx() == 2 );
+ REQUIRE( bbox.maxy() == 2 );
+ }
+ {
+ polygon<double> poly;
+ linear_ring<double> ring;
+ ring.add_coord(0,0);
+ ring.add_coord(-10,0);
+ ring.add_coord(-10,10);
+ ring.add_coord(0,10);
+ ring.add_coord(0,0);
+ poly.set_exterior_ring(std::move(ring));
+ geometry<double> geom(poly);
+ mapnik::box2d<double> bbox = mapnik::geometry::envelope(geom);
+ REQUIRE( bbox.minx() == -10 );
+ REQUIRE( bbox.miny() == 0 );
+ REQUIRE( bbox.maxx() == 0 );
+ REQUIRE( bbox.maxy() == 10 );
+
+ multi_polygon<double> mp;
+ mp.push_back(poly);
+ geometry<double> geom_mp(mp);
+ bbox = mapnik::geometry::envelope(geom_mp);
+ REQUIRE( bbox.minx() == -10 );
+ REQUIRE( bbox.miny() == 0 );
+ REQUIRE( bbox.maxx() == 0 );
+ REQUIRE( bbox.maxy() == 10 );
+
+ correct(geom);
+ bbox = mapnik::geometry::envelope(geom);
+ REQUIRE( bbox.minx() == -10 );
+ REQUIRE( bbox.miny() == 0 );
+ REQUIRE( bbox.maxx() == 0 );
+ REQUIRE( bbox.maxy() == 10 );
+ correct(geom_mp);
+ bbox = mapnik::geometry::envelope(geom_mp);
+ REQUIRE( bbox.minx() == -10 );
+ REQUIRE( bbox.miny() == 0 );
+ REQUIRE( bbox.maxx() == 0 );
+ REQUIRE( bbox.maxy() == 10 );
+
+ geometry_collection<double> gc;
+ bbox = mapnik::geometry::envelope(gc);
+ REQUIRE_FALSE( bbox.valid() );
+ gc.push_back(geom_mp);
+ bbox = mapnik::geometry::envelope(gc);
+ REQUIRE( bbox.minx() == -10 );
+ REQUIRE( bbox.miny() == 0 );
+ REQUIRE( bbox.maxx() == 0 );
+ REQUIRE( bbox.maxy() == 10 );
+ gc.emplace_back(point<double>(-50,-50));
+ bbox = mapnik::geometry::envelope(gc);
+ REQUIRE( bbox.minx() == -50 );
+ REQUIRE( bbox.miny() == -50 );
+ REQUIRE( bbox.maxx() == 0 );
+ REQUIRE( bbox.maxy() == 10 );
+ }
+
+ {
+ // polygon with hole
+ polygon<double> poly;
+ linear_ring<double> ring;
+ ring.add_coord(0,0);
+ ring.add_coord(-10,0);
+ ring.add_coord(-10,10);
+ ring.add_coord(0,10);
+ ring.add_coord(0,0);
+ poly.set_exterior_ring(std::move(ring));
+ linear_ring<double> hole;
+ hole.add_coord(-7,7);
+ hole.add_coord(-7,3);
+ hole.add_coord(-3,3);
+ hole.add_coord(-3,7);
+ hole.add_coord(-7,7);
+ poly.add_hole(std::move(hole));
+ geometry<double> geom(poly);
+ mapnik::box2d<double> bbox = mapnik::geometry::envelope(poly);
+ REQUIRE( bbox.minx() == -10 );
+ REQUIRE( bbox.miny() == 0 );
+ REQUIRE( bbox.maxx() == 0 );
+ REQUIRE( bbox.maxy() == 10 );
+ // add another hole inside the first hole
+ // which should be considered a hit
+ linear_ring<double> fill;
+ fill.add_coord(-6,4);
+ fill.add_coord(-6,6);
+ fill.add_coord(-4,6);
+ fill.add_coord(-4,4);
+ fill.add_coord(-6,4);
+ poly.add_hole(std::move(fill));
+ bbox = mapnik::geometry::envelope(poly);
+ REQUIRE( bbox.minx() == -10 );
+ REQUIRE( bbox.miny() == 0 );
+ REQUIRE( bbox.maxx() == 0 );
+ REQUIRE( bbox.maxy() == 10 );
+ }
+}
+
+}
diff --git a/test/unit/geometry/geometry_equal.hpp b/test/unit/geometry/geometry_equal.hpp
new file mode 100644
index 0000000..6b5dc68
--- /dev/null
+++ b/test/unit/geometry/geometry_equal.hpp
@@ -0,0 +1,217 @@
+#include "catch.hpp"
+
+// boost
+#include <type_traits>
+#include <iterator>
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wunused-local-typedef"
+#include <boost/tuple/tuple.hpp>
+#include <boost/iterator/zip_iterator.hpp>
+#include <boost/range/iterator_range.hpp>
+#pragma GCC diagnostic pop
+
+// helper namespace to ensure correct functionality
+namespace aux{
+namespace adl{
+using std::begin;
+using std::end;
+
+template<class T>
+auto do_begin(T& v) -> decltype(begin(v));
+template<class T>
+auto do_end(T& v) -> decltype(end(v));
+} // adl::
+
+template<class... Its>
+using zipper_it = boost::zip_iterator<boost::tuple<Its...>>;
+
+template<class T>
+T const& as_const(T const& v){ return v; }
+} // aux::
+
+template<class... Conts>
+auto zip_begin(Conts&... conts)
+ -> aux::zipper_it<decltype(aux::adl::do_begin(conts))...>
+{
+ using std::begin;
+ return {boost::make_tuple(begin(conts)...)};
+}
+
+template<class... Conts>
+auto zip_end(Conts&... conts)
+ -> aux::zipper_it<decltype(aux::adl::do_end(conts))...>
+{
+ using std::end;
+ return {boost::make_tuple(end(conts)...)};
+}
+
+template<class... Conts>
+auto zip_range(Conts&... conts)
+ -> boost::iterator_range<decltype(zip_begin(conts...))>
+{
+ return {zip_begin(conts...), zip_end(conts...)};
+}
+
+// for const access
+template<class... Conts>
+auto zip_cbegin(Conts&... conts)
+ -> decltype(zip_begin(aux::as_const(conts)...))
+{
+ using std::begin;
+ return zip_begin(aux::as_const(conts)...);
+}
+
+template<class... Conts>
+auto zip_cend(Conts&... conts)
+ -> decltype(zip_end(aux::as_const(conts)...))
+{
+ using std::end;
+ return zip_end(aux::as_const(conts)...);
+}
+
+template<class... Conts>
+auto zip_crange(Conts&... conts)
+ -> decltype(zip_range(aux::as_const(conts)...))
+{
+ return zip_range(aux::as_const(conts)...);
+}
+
+// mapnik
+#include <mapnik/geometry.hpp>
+#include <mapnik/util/variant.hpp>
+
+using namespace mapnik::geometry;
+
+template <typename T>
+void assert_g_equal(geometry<T> const& g1, geometry<T> const& g2);
+
+struct geometry_equal_visitor
+{
+ template <typename T1, typename T2>
+ void operator() (T1 const&, T2 const&)
+ {
+ // comparing two different types!
+ REQUIRE(false);
+ }
+
+ void operator() (geometry_empty const&, geometry_empty const&)
+ {
+ REQUIRE(true);
+ }
+
+ template <typename T>
+ void operator() (point<T> const& p1, point<T> const& p2)
+ {
+ REQUIRE(p1.x == Approx(p2.x));
+ REQUIRE(p1.y == Approx(p2.y));
+ }
+
+ template <typename T>
+ void operator() (line_string<T> const& ls1, line_string<T> const& ls2)
+ {
+ if (ls1.size() != ls2.size())
+ {
+ REQUIRE(false);
+ }
+
+ for(auto const& p : zip_crange(ls1, ls2))
+ {
+ REQUIRE(p.template get<0>().x == Approx(p.template get<1>().x));
+ REQUIRE(p.template get<0>().y == Approx(p.template get<1>().y));
+ }
+ }
+
+ template <typename T>
+ void operator() (polygon<T> const& p1, polygon<T> const& p2)
+ {
+ (*this)(static_cast<line_string<T> const&>(p1.exterior_ring), static_cast<line_string<T> const&>(p2.exterior_ring));
+
+ if (p1.interior_rings.size() != p2.interior_rings.size())
+ {
+ REQUIRE(false);
+ }
+
+ for (auto const& p : zip_crange(p1.interior_rings, p2.interior_rings))
+ {
+ (*this)(static_cast<line_string<T> const&>(p.template get<0>()),static_cast<line_string<T> const&>(p.template get<1>()));
+ }
+ }
+
+ template <typename T>
+ void operator() (multi_point<T> const& mp1, multi_point<T> const& mp2)
+ {
+ (*this)(static_cast<line_string<T> const&>(mp1), static_cast<line_string<T> const&>(mp2));
+ }
+
+ template <typename T>
+ void operator() (multi_line_string<T> const& mls1, multi_line_string<T> const& mls2)
+ {
+ if (mls1.size() != mls2.size())
+ {
+ REQUIRE(false);
+ }
+
+ for (auto const& ls : zip_crange(mls1, mls2))
+ {
+ (*this)(ls.template get<0>(),ls.template get<1>());
+ }
+ }
+
+ template <typename T>
+ void operator() (multi_polygon<T> const& mpoly1, multi_polygon<T> const& mpoly2)
+ {
+ if (mpoly1.size() != mpoly2.size())
+ {
+ REQUIRE(false);
+ }
+
+ for (auto const& poly : zip_crange(mpoly1, mpoly2))
+ {
+ (*this)(poly.template get<0>(),poly.template get<1>());
+ }
+ }
+
+ template <typename T>
+ void operator() (mapnik::util::recursive_wrapper<geometry_collection<T> > const& c1_, mapnik::util::recursive_wrapper<geometry_collection<T> > const& c2_)
+ {
+ geometry_collection<T> const& c1 = static_cast<geometry_collection<T> const&>(c1_);
+ geometry_collection<T> const& c2 = static_cast<geometry_collection<T> const&>(c2_);
+ if (c1.size() != c2.size())
+ {
+ REQUIRE(false);
+ }
+
+ for (auto const& g : zip_crange(c1, c2))
+ {
+ assert_g_equal(g.template get<0>(),g.template get<1>());
+ }
+ }
+
+ template <typename T>
+ void operator() (geometry_collection<T> const& c1, geometry_collection<T> const& c2)
+ {
+ if (c1.size() != c2.size())
+ {
+ REQUIRE(false);
+ }
+
+ for (auto const& g : zip_crange(c1, c2))
+ {
+ assert_g_equal(g.template get<0>(),g.template get<1>());
+ }
+ }
+};
+
+template <typename T>
+void assert_g_equal(geometry<T> const& g1, geometry<T> const& g2)
+{
+ return mapnik::util::apply_visitor(geometry_equal_visitor(), g1, g2);
+}
+
+template <typename T>
+void assert_g_equal(T const& g1, T const& g2)
+{
+ return geometry_equal_visitor()(g1,g2);
+}
diff --git a/test/unit/geometry/geometry_hit_test.cpp b/test/unit/geometry/geometry_hit_test.cpp
new file mode 100644
index 0000000..7552d01
--- /dev/null
+++ b/test/unit/geometry/geometry_hit_test.cpp
@@ -0,0 +1,108 @@
+#include "catch.hpp"
+
+#include <mapnik/geometry.hpp>
+#include <mapnik/hit_test_filter.hpp>
+#include <mapnik/geometry_correct.hpp>
+
+TEST_CASE("geometry ops") {
+
+SECTION("hit_test_filter - double") {
+ using namespace mapnik::geometry;
+ {
+ geometry<double> geom(point<double>(0,0));
+ REQUIRE( mapnik::hit_test(geom,0,0,0) );
+ }
+ {
+ geometry<double> geom(point<double>(0,0));
+ REQUIRE( mapnik::hit_test(geom,1,0,1) );
+ }
+ {
+ geometry<double> geom(point<double>(0,0));
+ REQUIRE( mapnik::hit_test(geom,0,1,1) );
+ }
+ {
+ geometry<double> geom(point<double>(0,0));
+ REQUIRE( mapnik::hit_test(geom,1,1,1.5) );
+ }
+ {
+ line_string<double> line;
+ line.add_coord(0,0);
+ line.add_coord(1,1);
+ line.add_coord(2,2);
+ geometry<double> geom(line);
+ REQUIRE( mapnik::hit_test(geom,0,0,1.5) );
+ }
+ {
+ line_string<double> line;
+ line.add_coord(0,0);
+ line.add_coord(1,1);
+ line.add_coord(2,2);
+ multi_line_string<double> multi_line;
+ multi_line.emplace_back(std::move(line));
+ geometry<double> geom(multi_line);
+ REQUIRE( mapnik::hit_test(geom,0,0,1.5) );
+ }
+ {
+ polygon<double> poly;
+ linear_ring<double> ring;
+ ring.add_coord(0,0);
+ ring.add_coord(-10,0);
+ ring.add_coord(-10,10);
+ ring.add_coord(0,10);
+ ring.add_coord(0,0);
+ poly.set_exterior_ring(std::move(ring));
+ geometry<double> geom(poly);
+ REQUIRE( mapnik::hit_test(geom,-5,5,0) );
+
+ multi_polygon<double> mp;
+ mp.push_back(poly);
+ geometry<double> geom_mp(mp);
+ REQUIRE( mapnik::hit_test(geom_mp,-5,5,0) );
+
+ correct(geom);
+ REQUIRE( mapnik::hit_test(geom,-5,5,0) );
+ correct(geom_mp);
+ REQUIRE( mapnik::hit_test(geom_mp,-5,5,0) );
+
+ geometry_collection<double> gc;
+ REQUIRE( !mapnik::hit_test(geometry<double>(gc),-5,5,0) );
+ gc.push_back(geom_mp);
+ REQUIRE( mapnik::hit_test(geometry<double>(gc),-5,5,0) );
+ REQUIRE( !mapnik::hit_test(geometry<double>(gc),-50,-50,0) );
+ gc.emplace_back(point<double>(-50,-50));
+ REQUIRE( mapnik::hit_test(geometry<double>(gc),-50,-50,0) );
+ }
+
+ {
+ // polygon with hole
+ polygon<double> poly;
+ linear_ring<double> ring;
+ ring.add_coord(0,0);
+ ring.add_coord(-10,0);
+ ring.add_coord(-10,10);
+ ring.add_coord(0,10);
+ ring.add_coord(0,0);
+ poly.set_exterior_ring(std::move(ring));
+ linear_ring<double> hole;
+ hole.add_coord(-7,7);
+ hole.add_coord(-7,3);
+ hole.add_coord(-3,3);
+ hole.add_coord(-3,7);
+ hole.add_coord(-7,7);
+ poly.add_hole(std::move(hole));
+ geometry<double> geom(poly);
+ REQUIRE( !mapnik::hit_test(geom,-5,5,0) );
+ // add another hole inside the first hole
+ // which should be considered a hit
+ linear_ring<double> fill;
+ fill.add_coord(-6,4);
+ fill.add_coord(-6,6);
+ fill.add_coord(-4,6);
+ fill.add_coord(-4,4);
+ fill.add_coord(-6,4);
+ poly.add_hole(std::move(fill));
+ REQUIRE( mapnik::hit_test(geometry<double>(poly),-5,5,0) );
+ }
+}
+
+}
diff --git a/test/unit/geometry/geometry_is_valid.cpp b/test/unit/geometry/geometry_is_valid.cpp
new file mode 100644
index 0000000..5f4f862
--- /dev/null
+++ b/test/unit/geometry/geometry_is_valid.cpp
@@ -0,0 +1,31 @@
+#include "catch.hpp"
+
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_adapters.hpp>
+#include <mapnik/geometry_is_valid.hpp>
+
+TEST_CASE("geometry is_valid") {
+
+// only Boost >= 1.56 has the is_valid function
+#if BOOST_VERSION >= 105600
+
+SECTION("point") {
+ mapnik::geometry::point<double> pt(0,0);
+ REQUIRE( mapnik::geometry::is_valid(pt) );
+
+ // uninitialized: should likely not be considered valid
+ mapnik::geometry::point<double> pt2;
+ REQUIRE( mapnik::geometry::is_valid(pt2) );
+}
+
+SECTION("line_string") {
+ mapnik::geometry::line_string<double> line;
+ line.add_coord(0,0);
+ line.add_coord(1,1);
+ REQUIRE( mapnik::geometry::is_valid(line) );
+
+}
+
+#endif // BOOST_VERSION >= 1.56
+
+}
diff --git a/test/unit/geometry/geometry_reprojection.cpp b/test/unit/geometry/geometry_reprojection.cpp
new file mode 100644
index 0000000..1c604d2
--- /dev/null
+++ b/test/unit/geometry/geometry_reprojection.cpp
@@ -0,0 +1,1274 @@
+#include "catch.hpp"
+#include "geometry_equal.hpp"
+
+// mapnik
+#include <mapnik/geometry.hpp>
+#include <mapnik/projection.hpp>
+#include <mapnik/proj_transform.hpp>
+#include <mapnik/geometry_reprojection.hpp>
+#include <mapnik/geometry_correct.hpp>
+
+// std
+#include <iostream>
+
+TEST_CASE("geometry reprojection") {
+
+SECTION("test_projection_4326_3857 - Empty Geometry Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans(source, dest);
+ {
+ geometry_empty geom;
+ unsigned int err = 0;
+ // Test Standard Transform
+ geometry_empty new_geom = reproject_copy(geom, proj_trans, err);
+ REQUIRE(err == 0);
+ // Transform providing projections not transfrom
+ new_geom = reproject_copy(geom, source, dest, err);
+ REQUIRE(err == 0);
+ // Transform providing projections in reverse
+ new_geom = reproject_copy(geom, dest, source, err);
+ REQUIRE(err == 0);
+ // Transform in place
+ REQUIRE(reproject(new_geom, proj_trans));
+ // Transform in place providing projections
+ REQUIRE(reproject(new_geom, source, dest));
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(new_geom, dest, source));
+ }
+} // End Section
+
+SECTION("test_projection_4326_3857 - Empty Geometry in Geometry Variant") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans(source, dest);
+ {
+ geometry<double> geom(std::move(geometry_empty()));
+ unsigned int err = 0;
+ // Test Standard Transform
+ geometry<double> new_geom = reproject_copy(geom, proj_trans, err);
+ REQUIRE(err == 0);
+ REQUIRE(new_geom.is<geometry_empty>());
+ // Transform providing projections not transfrom
+ new_geom = reproject_copy(geom, source, dest, err);
+ REQUIRE(err == 0);
+ REQUIRE(new_geom.is<geometry_empty>());
+ // Transform providing projections in reverse
+ new_geom = reproject_copy(geom, dest, source, err);
+ REQUIRE(err == 0);
+ REQUIRE(new_geom.is<geometry_empty>());
+ // Transform in place
+ REQUIRE(reproject(new_geom, proj_trans));
+ // Transform in place providing projections
+ REQUIRE(reproject(new_geom, source, dest));
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(new_geom, dest, source));
+ }
+} // End Section
+
+SECTION("test_projection_4326_3857 - Point Geometry Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ point<double> geom1(-97.552175, 35.522895);
+ point<double> geom2(-10859458.446776, 4235169.496066);
+ unsigned int err = 0;
+ {
+ // Test Standard Transform
+ point<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform in reverse
+ point<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ point<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ point<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform in place
+ point<double> geom3(-97.552175, 35.522895);
+ REQUIRE(reproject(geom3, proj_trans1));
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse - back
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ // Transform in place providing projections
+ point<double> geom3(-97.552175, 35.522895);
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // End Section
+
+SECTION("test_projection_4326_3857 - Point Geometry Variant Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ double x1 = -97.552175;
+ double y1 = 35.522895;
+ double x2 = -10859458.446776;
+ double y2 = 4235169.496066;
+ geometry<double> geom1(point<double>(x1, y1));
+ geometry<double> geom2(point<double>(x2, y2));
+ unsigned int err = 0;
+ {
+ // Test Standard Transform
+ geometry<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform in reverse
+ geometry<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ geometry<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ geometry<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ geometry<double> geom3(point<double>(-97.552175, 35.522895));
+ // Transform in place
+ REQUIRE(reproject(geom3, proj_trans1));
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse - back
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ geometry<double> geom3(point<double>(-97.552175, 35.522895));
+ // Transform in place providing projections
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // End Section */
+
+SECTION("test_projection_4326_3857 - Line_String Geometry Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ line_string<double> geom1;
+ geom1.emplace_back(point<double>(-97.48872756958008, 35.360286150765084));
+ geom1.emplace_back(point<double>(-97.48065948486328, 35.34894577151337));
+ geom1.emplace_back(point<double>(-97.47267723083496, 35.36224605490395));
+ geom1.emplace_back(point<double>(-97.46323585510252, 35.34523530173256));
+ geom1.emplace_back(point<double>(-97.45963096618651, 35.36329598397908));
+ geom1.emplace_back(point<double>(-97.47550964355469, 35.369245324153866));
+ line_string<double> geom2;
+ geom2.emplace_back(point<double>(-10852395.511130, 4212951.024108));
+ geom2.emplace_back(point<double>(-10851497.376047, 4211403.174286));
+ geom2.emplace_back(point<double>(-10850608.795594, 4213218.553707));
+ geom2.emplace_back(point<double>(-10849557.786455, 4210896.778973));
+ geom2.emplace_back(point<double>(-10849156.492056, 4213361.873135));
+ geom2.emplace_back(point<double>(-10850924.098335, 4214174.016561));
+ unsigned int err = 0;
+ {
+ // Test Standard Transform
+ line_string<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform in reverse
+ line_string<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ line_string<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ line_string<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform in place
+ line_string<double> geom3(geom1);
+ REQUIRE(reproject(geom3, proj_trans1));
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ // Transform in place providing projections
+ line_string<double> geom3(geom1);
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // End Section
+
+SECTION("test_projection_4326_3857 - Line_String Geometry Variant Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ line_string<double> geom1_;
+ geom1_.emplace_back(point<double>(-97.48872756958008, 35.360286150765084));
+ geom1_.emplace_back(point<double>(-97.48065948486328, 35.34894577151337));
+ geom1_.emplace_back(point<double>(-97.47267723083496, 35.36224605490395));
+ geom1_.emplace_back(point<double>(-97.46323585510252, 35.34523530173256));
+ geom1_.emplace_back(point<double>(-97.45963096618651, 35.36329598397908));
+ geom1_.emplace_back(point<double>(-97.47550964355469, 35.369245324153866));
+ line_string<double> geom2_;
+ geom2_.emplace_back(point<double>(-10852395.511130, 4212951.024108));
+ geom2_.emplace_back(point<double>(-10851497.376047, 4211403.174286));
+ geom2_.emplace_back(point<double>(-10850608.795594, 4213218.553707));
+ geom2_.emplace_back(point<double>(-10849557.786455, 4210896.778973));
+ geom2_.emplace_back(point<double>(-10849156.492056, 4213361.873135));
+ geom2_.emplace_back(point<double>(-10850924.098335, 4214174.016561));
+ line_string<double> geom0_;
+ geometry<double> geom0(geom0_);
+ geometry<double> geom1(geom1_);
+ geometry<double> geom2(geom2_);
+ unsigned int err = 0;
+ {
+ // Reprojecting empty line string will return a geometry_empty
+ geometry<double> new_geom = reproject_copy(geom0, proj_trans1, err);
+ REQUIRE(err == 0);
+ REQUIRE(new_geom.is<geometry_empty>());
+ }
+ {
+ // Test Standard Transform
+ geometry<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform in reverse
+ geometry<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ geometry<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ geometry<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform in place
+ geometry<double> geom3(geom1);
+ REQUIRE(reproject(geom3, proj_trans1));
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ // Transform in place providing projections
+ geometry<double> geom3(geom1);
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // End Section
+
+SECTION("test_projection_4326_3857 - Polygon Geometry Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ polygon<double> geom1;
+ geom1.exterior_ring.emplace_back(point<double>(-97.62588500976562, 35.62939577711732));
+ geom1.exterior_ring.emplace_back(point<double>(-97.79067993164062, 35.43941441533686));
+ geom1.exterior_ring.emplace_back(point<double>(-97.60391235351562, 35.34425514918409));
+ geom1.exterior_ring.emplace_back(point<double>(-97.42813110351562, 35.48191987272801));
+ geom1.exterior_ring.emplace_back(point<double>(-97.62588500976562, 35.62939577711732));
+ geom1.interior_rings.emplace_back();
+ geom1.interior_rings.back().emplace_back(point<double>(-97.66571044921875, 35.46849952318069));
+ geom1.interior_rings.back().emplace_back(point<double>(-97.61489868164062, 35.54116627999813));
+ geom1.interior_rings.back().emplace_back(point<double>(-97.53799438476562, 35.459551379037606));
+ geom1.interior_rings.back().emplace_back(point<double>(-97.62451171875, 35.42598697382711));
+ geom1.interior_rings.back().emplace_back(point<double>(-97.66571044921875, 35.46849952318069));
+ polygon<double> geom2;
+ geom2.exterior_ring.emplace_back(point<double>(-10867663.807530, 4249745.898599));
+ geom2.exterior_ring.emplace_back(point<double>(-10886008.694318, 4223757.308982));
+ geom2.exterior_ring.emplace_back(point<double>(-10865217.822625, 4210763.014174));
+ geom2.exterior_ring.emplace_back(point<double>(-10845649.943384, 4229566.523132));
+ geom2.exterior_ring.emplace_back(point<double>(-10867663.807530, 4249745.898599));
+ geom2.interior_rings.emplace_back();
+ geom2.interior_rings.back().emplace_back(point<double>(-10872097.155170, 4227732.034453));
+ geom2.interior_rings.back().emplace_back(point<double>(-10866440.815077, 4237668.848130));
+ geom2.interior_rings.back().emplace_back(point<double>(-10857879.867909, 4226509.042001));
+ geom2.interior_rings.back().emplace_back(point<double>(-10867510.933473, 4221922.820303));
+ geom2.interior_rings.back().emplace_back(point<double>(-10872097.155170, 4227732.034453));
+ unsigned int err = 0;
+ {
+ // Test Standard Transform
+ // Add extra vector to outer ring.
+ geom1.interior_rings.emplace_back();
+ REQUIRE(geom1.interior_rings.size() == 2);
+ polygon<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ // Should remove the empty ring added to back of geom1
+ REQUIRE(new_geom.interior_rings.size() == 1);
+ assert_g_equal(new_geom, geom2);
+ // Remove extra ring for future validity tests.
+ geom1.interior_rings.pop_back();
+ REQUIRE(geom1.interior_rings.size() == 1);
+ }
+ {
+ // Transform in reverse
+ polygon<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ polygon<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ polygon<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform in place
+ polygon<double> geom3(geom1);
+ geom3.interior_rings.emplace_back();
+ REQUIRE(reproject(geom3, proj_trans1));
+ // Should NOT remove the empty ring added to back of geom1
+ REQUIRE(geom3.interior_rings.size() == 2);
+ // Remove so asserts that geometries are the same
+ geom3.interior_rings.pop_back();
+ REQUIRE(geom3.interior_rings.size() == 1);
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ // Transform in place providing projections
+ polygon<double> geom3(geom1);
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // End Section
+
+SECTION("test_projection_4326_3857 - Polygon Geometry Variant Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ polygon<double> geom1_;
+ geom1_.exterior_ring.emplace_back(point<double>(-97.62588500976562, 35.62939577711732));
+ geom1_.exterior_ring.emplace_back(point<double>(-97.79067993164062, 35.43941441533686));
+ geom1_.exterior_ring.emplace_back(point<double>(-97.60391235351562, 35.34425514918409));
+ geom1_.exterior_ring.emplace_back(point<double>(-97.42813110351562, 35.48191987272801));
+ geom1_.exterior_ring.emplace_back(point<double>(-97.62588500976562, 35.62939577711732));
+ geom1_.interior_rings.emplace_back();
+ geom1_.interior_rings.back().emplace_back(point<double>(-97.66571044921875, 35.46849952318069));
+ geom1_.interior_rings.back().emplace_back(point<double>(-97.61489868164062, 35.54116627999813));
+ geom1_.interior_rings.back().emplace_back(point<double>(-97.53799438476562, 35.459551379037606));
+ geom1_.interior_rings.back().emplace_back(point<double>(-97.62451171875, 35.42598697382711));
+ geom1_.interior_rings.back().emplace_back(point<double>(-97.66571044921875, 35.46849952318069));
+ polygon<double> geom2_;
+ geom2_.exterior_ring.emplace_back(point<double>(-10867663.807530, 4249745.898599));
+ geom2_.exterior_ring.emplace_back(point<double>(-10886008.694318, 4223757.308982));
+ geom2_.exterior_ring.emplace_back(point<double>(-10865217.822625, 4210763.014174));
+ geom2_.exterior_ring.emplace_back(point<double>(-10845649.943384, 4229566.523132));
+ geom2_.exterior_ring.emplace_back(point<double>(-10867663.807530, 4249745.898599));
+ geom2_.interior_rings.emplace_back();
+ geom2_.interior_rings.back().emplace_back(point<double>(-10872097.155170, 4227732.034453));
+ geom2_.interior_rings.back().emplace_back(point<double>(-10866440.815077, 4237668.848130));
+ geom2_.interior_rings.back().emplace_back(point<double>(-10857879.867909, 4226509.042001));
+ geom2_.interior_rings.back().emplace_back(point<double>(-10867510.933473, 4221922.820303));
+ geom2_.interior_rings.back().emplace_back(point<double>(-10872097.155170, 4227732.034453));
+ polygon<double> geom0_;
+ geometry<double> geom0(geom0_);
+ geometry<double> geom1(geom1_);
+ geometry<double> geom2(geom2_);
+ unsigned int err = 0;
+ {
+ // Reprojecting empty poly will return a geometry_empty
+ geometry<double> new_geom = reproject_copy(geom0, proj_trans1, err);
+ REQUIRE(err == 0);
+ REQUIRE(new_geom.is<geometry_empty>());
+ }
+ {
+ // Test Standard Transform
+ geometry<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform in reverse
+ geometry<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ geometry<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ geometry<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform in place
+ geometry<double> geom3(geom1);
+ REQUIRE(reproject(geom3, proj_trans1));
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ // Transform in place providing projections
+ geometry<double> geom3(geom1);
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // END SECTION
+
+SECTION("test_projection_4326_3857 - Multi_Point Geometry Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ multi_point<double> geom1;
+ geom1.emplace_back(point<double>(-97.48872756958008, 35.360286150765084));
+ geom1.emplace_back(point<double>(-97.48065948486328, 35.34894577151337));
+ geom1.emplace_back(point<double>(-97.47267723083496, 35.36224605490395));
+ geom1.emplace_back(point<double>(-97.46323585510252, 35.34523530173256));
+ geom1.emplace_back(point<double>(-97.45963096618651, 35.36329598397908));
+ geom1.emplace_back(point<double>(-97.47550964355469, 35.369245324153866));
+ multi_point<double> geom2;
+ geom2.emplace_back(point<double>(-10852395.511130, 4212951.024108));
+ geom2.emplace_back(point<double>(-10851497.376047, 4211403.174286));
+ geom2.emplace_back(point<double>(-10850608.795594, 4213218.553707));
+ geom2.emplace_back(point<double>(-10849557.786455, 4210896.778973));
+ geom2.emplace_back(point<double>(-10849156.492056, 4213361.873135));
+ geom2.emplace_back(point<double>(-10850924.098335, 4214174.016561));
+ unsigned int err = 0;
+ {
+ // Test Standard Transform
+ multi_point<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform in reverse
+ multi_point<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ multi_point<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ multi_point<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform in place
+ multi_point<double> geom3(geom1);
+ REQUIRE(reproject(geom3, proj_trans1));
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ // Transform in place providing projections
+ multi_point<double> geom3(geom1);
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // End Section
+
+SECTION("test_projection_4326_3857 - Multi_Point Geometry Variant Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ multi_point<double> geom1_;
+ geom1_.emplace_back(point<double>(-97.48872756958008, 35.360286150765084));
+ geom1_.emplace_back(point<double>(-97.48065948486328, 35.34894577151337));
+ geom1_.emplace_back(point<double>(-97.47267723083496, 35.36224605490395));
+ geom1_.emplace_back(point<double>(-97.46323585510252, 35.34523530173256));
+ geom1_.emplace_back(point<double>(-97.45963096618651, 35.36329598397908));
+ geom1_.emplace_back(point<double>(-97.47550964355469, 35.369245324153866));
+ multi_point<double> geom2_;
+ geom2_.emplace_back(point<double>(-10852395.511130, 4212951.024108));
+ geom2_.emplace_back(point<double>(-10851497.376047, 4211403.174286));
+ geom2_.emplace_back(point<double>(-10850608.795594, 4213218.553707));
+ geom2_.emplace_back(point<double>(-10849557.786455, 4210896.778973));
+ geom2_.emplace_back(point<double>(-10849156.492056, 4213361.873135));
+ geom2_.emplace_back(point<double>(-10850924.098335, 4214174.016561));
+ multi_point<double> geom0_;
+ geometry<double> geom0(geom0_);
+ geometry<double> geom1(geom1_);
+ geometry<double> geom2(geom2_);
+ unsigned int err = 0;
+ {
+ // Reprojecting empty multi point will return a geometry_empty
+ geometry<double> new_geom = reproject_copy(geom0, proj_trans1, err);
+ REQUIRE(err == 0);
+ REQUIRE(new_geom.is<geometry_empty>());
+ }
+ {
+ // Test Standard Transform
+ geometry<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform in reverse
+ geometry<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ geometry<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ geometry<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform in place
+ geometry<double> geom3(geom1);
+ REQUIRE(reproject(geom3, proj_trans1));
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ // Transform in place providing projections
+ geometry<double> geom3(geom1);
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // End Section
+
+SECTION("test_projection_4326_3857 - Multi_Line_String Geometry Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ line_string<double> geom1a;
+ geom1a.emplace_back(point<double>(-97.48872756958008, 35.360286150765084));
+ geom1a.emplace_back(point<double>(-97.48065948486328, 35.34894577151337));
+ geom1a.emplace_back(point<double>(-97.47267723083496, 35.36224605490395));
+ geom1a.emplace_back(point<double>(-97.46323585510252, 35.34523530173256));
+ geom1a.emplace_back(point<double>(-97.45963096618651, 35.36329598397908));
+ geom1a.emplace_back(point<double>(-97.47550964355469, 35.369245324153866));
+ multi_line_string<double> geom1;
+ geom1.emplace_back(geom1a);
+ line_string<double> geom2a;
+ geom2a.emplace_back(point<double>(-10852395.511130, 4212951.024108));
+ geom2a.emplace_back(point<double>(-10851497.376047, 4211403.174286));
+ geom2a.emplace_back(point<double>(-10850608.795594, 4213218.553707));
+ geom2a.emplace_back(point<double>(-10849557.786455, 4210896.778973));
+ geom2a.emplace_back(point<double>(-10849156.492056, 4213361.873135));
+ geom2a.emplace_back(point<double>(-10850924.098335, 4214174.016561));
+ multi_line_string<double> geom2;
+ geom2.emplace_back(geom2a);
+ unsigned int err = 0;
+ {
+ // Prior to test add an empty line_string to the the multi_line_string
+ // this should be removed.
+ geom1.emplace_back();
+ REQUIRE(geom1.size() == 2);
+ // Test Standard Transform
+ multi_line_string<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ REQUIRE(new_geom.size() == 1);
+ // Restore geom1 removing empty for later tests.
+ geom1.pop_back();
+ REQUIRE(geom1.size() == 1);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform in reverse
+ multi_line_string<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ multi_line_string<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ multi_line_string<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform in place
+ multi_line_string<double> geom3(geom1);
+ REQUIRE(reproject(geom3, proj_trans1));
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ // Transform in place providing projections
+ multi_line_string<double> geom3(geom1);
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // End Section
+
+SECTION("test_projection_4326_3857 - Multi_Line_String Geometry Variant Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ line_string<double> geom1a_;
+ geom1a_.emplace_back(point<double>(-97.48872756958008, 35.360286150765084));
+ geom1a_.emplace_back(point<double>(-97.48065948486328, 35.34894577151337));
+ geom1a_.emplace_back(point<double>(-97.47267723083496, 35.36224605490395));
+ geom1a_.emplace_back(point<double>(-97.46323585510252, 35.34523530173256));
+ geom1a_.emplace_back(point<double>(-97.45963096618651, 35.36329598397908));
+ geom1a_.emplace_back(point<double>(-97.47550964355469, 35.369245324153866));
+ multi_line_string<double> geom1_;
+ geom1_.emplace_back(geom1a_);
+ line_string<double> geom2a_;
+ geom2a_.emplace_back(point<double>(-10852395.511130, 4212951.024108));
+ geom2a_.emplace_back(point<double>(-10851497.376047, 4211403.174286));
+ geom2a_.emplace_back(point<double>(-10850608.795594, 4213218.553707));
+ geom2a_.emplace_back(point<double>(-10849557.786455, 4210896.778973));
+ geom2a_.emplace_back(point<double>(-10849156.492056, 4213361.873135));
+ geom2a_.emplace_back(point<double>(-10850924.098335, 4214174.016561));
+ multi_line_string<double> geom2_;
+ geom2_.emplace_back(geom2a_);
+ multi_line_string<double> geom0_;
+ geometry<double> geom0(geom0_);
+ geometry<double> geom1(geom1_);
+ geometry<double> geom2(geom2_);
+ unsigned int err = 0;
+ {
+ // Reprojecting empty line string will return a geometry_empty
+ geometry<double> new_geom = reproject_copy(geom0, proj_trans1, err);
+ REQUIRE(err == 0);
+ REQUIRE(new_geom.is<geometry_empty>());
+ }
+ {
+ // Test Standard Transform
+ geometry<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform in reverse
+ geometry<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ geometry<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ geometry<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform in place
+ geometry<double> geom3(geom1);
+ REQUIRE(reproject(geom3, proj_trans1));
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ // Transform in place providing projections
+ geometry<double> geom3(geom1);
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // End Section
+
+SECTION("test_projection_4326_3857 - Multi_Polygon Geometry Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ polygon<double> geom1a;
+ geom1a.exterior_ring.emplace_back(point<double>(-97.62588500976562, 35.62939577711732));
+ geom1a.exterior_ring.emplace_back(point<double>(-97.79067993164062, 35.43941441533686));
+ geom1a.exterior_ring.emplace_back(point<double>(-97.60391235351562, 35.34425514918409));
+ geom1a.exterior_ring.emplace_back(point<double>(-97.42813110351562, 35.48191987272801));
+ geom1a.exterior_ring.emplace_back(point<double>(-97.62588500976562, 35.62939577711732));
+ geom1a.interior_rings.emplace_back();
+ geom1a.interior_rings.back().emplace_back(point<double>(-97.66571044921875, 35.46849952318069));
+ geom1a.interior_rings.back().emplace_back(point<double>(-97.61489868164062, 35.54116627999813));
+ geom1a.interior_rings.back().emplace_back(point<double>(-97.53799438476562, 35.459551379037606));
+ geom1a.interior_rings.back().emplace_back(point<double>(-97.62451171875, 35.42598697382711));
+ geom1a.interior_rings.back().emplace_back(point<double>(-97.66571044921875, 35.46849952318069));
+ multi_polygon<double> geom1;
+ geom1.emplace_back(geom1a);
+ polygon<double> geom2a;
+ geom2a.exterior_ring.emplace_back(point<double>(-10867663.807530, 4249745.898599));
+ geom2a.exterior_ring.emplace_back(point<double>(-10886008.694318, 4223757.308982));
+ geom2a.exterior_ring.emplace_back(point<double>(-10865217.822625, 4210763.014174));
+ geom2a.exterior_ring.emplace_back(point<double>(-10845649.943384, 4229566.523132));
+ geom2a.exterior_ring.emplace_back(point<double>(-10867663.807530, 4249745.898599));
+ geom2a.interior_rings.emplace_back();
+ geom2a.interior_rings.back().emplace_back(point<double>(-10872097.155170, 4227732.034453));
+ geom2a.interior_rings.back().emplace_back(point<double>(-10866440.815077, 4237668.848130));
+ geom2a.interior_rings.back().emplace_back(point<double>(-10857879.867909, 4226509.042001));
+ geom2a.interior_rings.back().emplace_back(point<double>(-10867510.933473, 4221922.820303));
+ geom2a.interior_rings.back().emplace_back(point<double>(-10872097.155170, 4227732.034453));
+ multi_polygon<double> geom2;
+ geom2.emplace_back(geom2a);
+ unsigned int err = 0;
+ {
+ // Test Standard Transform
+ // Add extra polygon to outer ring.
+ geom1.emplace_back();
+ REQUIRE(geom1.size() == 2);
+ multi_polygon<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ // Should remove the empty polygon added to back of geom1
+ REQUIRE(new_geom.size() == 1);
+ assert_g_equal(new_geom, geom2);
+ // Remove extra ring for future validity tests.
+ geom1.pop_back();
+ REQUIRE(geom1.size() == 1);
+ }
+ {
+ // Transform in reverse
+ multi_polygon<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ multi_polygon<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ multi_polygon<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform in place
+ multi_polygon<double> geom3(geom1);
+ geom3.emplace_back();
+ REQUIRE(reproject(geom3, proj_trans1));
+ // Should NOT remove the empty ring added to back of geom1
+ REQUIRE(geom3.size() == 2);
+ // Remove so asserts that geometries are the same
+ geom3.pop_back();
+ REQUIRE(geom3.size() == 1);
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ // Transform in place providing projections
+ multi_polygon<double> geom3(geom1);
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // End Section
+
+SECTION("test_projection_4326_3857 - Multi_Polygon Geometry Variant Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ polygon<double> geom1a_;
+ geom1a_.exterior_ring.emplace_back(point<double>(-97.62588500976562, 35.62939577711732));
+ geom1a_.exterior_ring.emplace_back(point<double>(-97.79067993164062, 35.43941441533686));
+ geom1a_.exterior_ring.emplace_back(point<double>(-97.60391235351562, 35.34425514918409));
+ geom1a_.exterior_ring.emplace_back(point<double>(-97.42813110351562, 35.48191987272801));
+ geom1a_.exterior_ring.emplace_back(point<double>(-97.62588500976562, 35.62939577711732));
+ geom1a_.interior_rings.emplace_back();
+ geom1a_.interior_rings.back().emplace_back(point<double>(-97.66571044921875, 35.46849952318069));
+ geom1a_.interior_rings.back().emplace_back(point<double>(-97.61489868164062, 35.54116627999813));
+ geom1a_.interior_rings.back().emplace_back(point<double>(-97.53799438476562, 35.459551379037606));
+ geom1a_.interior_rings.back().emplace_back(point<double>(-97.62451171875, 35.42598697382711));
+ geom1a_.interior_rings.back().emplace_back(point<double>(-97.66571044921875, 35.46849952318069));
+ multi_polygon<double> geom1_;
+ geom1_.emplace_back(geom1a_);
+ polygon<double> geom2a_;
+ geom2a_.exterior_ring.emplace_back(point<double>(-10867663.807530, 4249745.898599));
+ geom2a_.exterior_ring.emplace_back(point<double>(-10886008.694318, 4223757.308982));
+ geom2a_.exterior_ring.emplace_back(point<double>(-10865217.822625, 4210763.014174));
+ geom2a_.exterior_ring.emplace_back(point<double>(-10845649.943384, 4229566.523132));
+ geom2a_.exterior_ring.emplace_back(point<double>(-10867663.807530, 4249745.898599));
+ geom2a_.interior_rings.emplace_back();
+ geom2a_.interior_rings.back().emplace_back(point<double>(-10872097.155170, 4227732.034453));
+ geom2a_.interior_rings.back().emplace_back(point<double>(-10866440.815077, 4237668.848130));
+ geom2a_.interior_rings.back().emplace_back(point<double>(-10857879.867909, 4226509.042001));
+ geom2a_.interior_rings.back().emplace_back(point<double>(-10867510.933473, 4221922.820303));
+ geom2a_.interior_rings.back().emplace_back(point<double>(-10872097.155170, 4227732.034453));
+ multi_polygon<double> geom2_;
+ geom2_.emplace_back(geom2a_);
+ multi_polygon<double> geom0_;
+ geometry<double> geom0(geom0_);
+ geometry<double> geom1(geom1_);
+ geometry<double> geom2(geom2_);
+ unsigned int err = 0;
+ {
+ // Reprojecting empty poly will return a geometry_empty
+ geometry<double> new_geom = reproject_copy(geom0, proj_trans1, err);
+ REQUIRE(err == 0);
+ REQUIRE(new_geom.is<geometry_empty>());
+ }
+ {
+ // Test Standard Transform
+ geometry<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform in reverse
+ geometry<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ geometry<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ geometry<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform in place
+ geometry<double> geom3(geom1);
+ REQUIRE(reproject(geom3, proj_trans1));
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ // Transform in place providing projections
+ geometry<double> geom3(geom1);
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // END SECTION
+
+SECTION("test_projection_4326_3857 - Geometry Collection Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ polygon<double> geom1a;
+ geom1a.exterior_ring.emplace_back(point<double>(-97.62588500976562, 35.62939577711732));
+ geom1a.exterior_ring.emplace_back(point<double>(-97.79067993164062, 35.43941441533686));
+ geom1a.exterior_ring.emplace_back(point<double>(-97.60391235351562, 35.34425514918409));
+ geom1a.exterior_ring.emplace_back(point<double>(-97.42813110351562, 35.48191987272801));
+ geom1a.exterior_ring.emplace_back(point<double>(-97.62588500976562, 35.62939577711732));
+ geom1a.interior_rings.emplace_back();
+ geom1a.interior_rings.back().emplace_back(point<double>(-97.66571044921875, 35.46849952318069));
+ geom1a.interior_rings.back().emplace_back(point<double>(-97.61489868164062, 35.54116627999813));
+ geom1a.interior_rings.back().emplace_back(point<double>(-97.53799438476562, 35.459551379037606));
+ geom1a.interior_rings.back().emplace_back(point<double>(-97.62451171875, 35.42598697382711));
+ geom1a.interior_rings.back().emplace_back(point<double>(-97.66571044921875, 35.46849952318069));
+ geometry_collection<double> geom1;
+ geom1.emplace_back(geometry<double>(geom1a));
+ polygon<double> geom2a;
+ geom2a.exterior_ring.emplace_back(point<double>(-10867663.807530, 4249745.898599));
+ geom2a.exterior_ring.emplace_back(point<double>(-10886008.694318, 4223757.308982));
+ geom2a.exterior_ring.emplace_back(point<double>(-10865217.822625, 4210763.014174));
+ geom2a.exterior_ring.emplace_back(point<double>(-10845649.943384, 4229566.523132));
+ geom2a.exterior_ring.emplace_back(point<double>(-10867663.807530, 4249745.898599));
+ geom2a.interior_rings.emplace_back();
+ geom2a.interior_rings.back().emplace_back(point<double>(-10872097.155170, 4227732.034453));
+ geom2a.interior_rings.back().emplace_back(point<double>(-10866440.815077, 4237668.848130));
+ geom2a.interior_rings.back().emplace_back(point<double>(-10857879.867909, 4226509.042001));
+ geom2a.interior_rings.back().emplace_back(point<double>(-10867510.933473, 4221922.820303));
+ geom2a.interior_rings.back().emplace_back(point<double>(-10872097.155170, 4227732.034453));
+ geometry_collection<double> geom2;
+ geom2.emplace_back(geometry<double>(geom2a));
+ unsigned int err = 0;
+ {
+ // Test Standard Transform
+ // Add extra geometry to outer ring.
+ geom1.emplace_back();
+ REQUIRE(geom1.size() == 2);
+ geometry_collection<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ // Should remove the empty geometry added to back of geom1
+ REQUIRE(new_geom.size() == 1);
+ assert_g_equal(new_geom, geom2);
+ // Remove extra ring for future validity tests.
+ geom1.pop_back();
+ REQUIRE(geom1.size() == 1);
+ }
+ {
+ // Transform in reverse
+ geometry_collection<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ geometry_collection<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ geometry_collection<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform in place
+ geometry_collection<double> geom3(geom1);
+ geom3.emplace_back();
+ REQUIRE(reproject(geom3, proj_trans1));
+ // Should NOT remove the empty ring added to back of geom1
+ REQUIRE(geom3.size() == 2);
+ // Remove so asserts that geometries are the same
+ geom3.pop_back();
+ REQUIRE(geom3.size() == 1);
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ // Transform in place providing projections
+ geometry_collection<double> geom3(geom1);
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // End Section
+
+SECTION("test_projection_4326_3857 - Geometry Collection Variant Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ polygon<double> geom1a_;
+ geom1a_.exterior_ring.emplace_back(point<double>(-97.62588500976562, 35.62939577711732));
+ geom1a_.exterior_ring.emplace_back(point<double>(-97.79067993164062, 35.43941441533686));
+ geom1a_.exterior_ring.emplace_back(point<double>(-97.60391235351562, 35.34425514918409));
+ geom1a_.exterior_ring.emplace_back(point<double>(-97.42813110351562, 35.48191987272801));
+ geom1a_.exterior_ring.emplace_back(point<double>(-97.62588500976562, 35.62939577711732));
+ geom1a_.interior_rings.emplace_back();
+ geom1a_.interior_rings.back().emplace_back(point<double>(-97.66571044921875, 35.46849952318069));
+ geom1a_.interior_rings.back().emplace_back(point<double>(-97.61489868164062, 35.54116627999813));
+ geom1a_.interior_rings.back().emplace_back(point<double>(-97.53799438476562, 35.459551379037606));
+ geom1a_.interior_rings.back().emplace_back(point<double>(-97.62451171875, 35.42598697382711));
+ geom1a_.interior_rings.back().emplace_back(point<double>(-97.66571044921875, 35.46849952318069));
+ geometry_collection<double> geom1_;
+ geom1_.emplace_back(geometry<double>(geom1a_));
+ polygon<double> geom2a_;
+ geom2a_.exterior_ring.emplace_back(point<double>(-10867663.807530, 4249745.898599));
+ geom2a_.exterior_ring.emplace_back(point<double>(-10886008.694318, 4223757.308982));
+ geom2a_.exterior_ring.emplace_back(point<double>(-10865217.822625, 4210763.014174));
+ geom2a_.exterior_ring.emplace_back(point<double>(-10845649.943384, 4229566.523132));
+ geom2a_.exterior_ring.emplace_back(point<double>(-10867663.807530, 4249745.898599));
+ geom2a_.interior_rings.emplace_back();
+ geom2a_.interior_rings.back().emplace_back(point<double>(-10872097.155170, 4227732.034453));
+ geom2a_.interior_rings.back().emplace_back(point<double>(-10866440.815077, 4237668.848130));
+ geom2a_.interior_rings.back().emplace_back(point<double>(-10857879.867909, 4226509.042001));
+ geom2a_.interior_rings.back().emplace_back(point<double>(-10867510.933473, 4221922.820303));
+ geom2a_.interior_rings.back().emplace_back(point<double>(-10872097.155170, 4227732.034453));
+ geometry_collection<double> geom2_;
+ geom2_.emplace_back(geometry<double>(geom2a_));
+ multi_polygon<double> geom0_;
+ geometry<double> geom0(geom0_);
+ geometry<double> geom1(geom1_);
+ geometry<double> geom2(geom2_);
+ unsigned int err = 0;
+ {
+ // Reprojecting empty poly will return a geometry_empty
+ geometry<double> new_geom = reproject_copy(geom0, proj_trans1, err);
+ REQUIRE(err == 0);
+ REQUIRE(new_geom.is<geometry_empty>());
+ }
+ {
+ // Test Standard Transform
+ geometry<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform in reverse
+ geometry<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ geometry<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ geometry<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform in place
+ geometry<double> geom3(geom1);
+ REQUIRE(reproject(geom3, proj_trans1));
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ // Transform in place providing projections
+ geometry<double> geom3(geom1);
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // END SECTION
+
+SECTION("test_projection_4269_3857 - Line_String Geometry Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4269");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ line_string<double> geom1;
+ geom1.emplace_back(point<double>(-97.48872756958008, 35.360286150765084));
+ geom1.emplace_back(point<double>(-97.48065948486328, 35.34894577151337));
+ geom1.emplace_back(point<double>(-97.47267723083496, 35.36224605490395));
+ geom1.emplace_back(point<double>(-97.46323585510252, 35.34523530173256));
+ geom1.emplace_back(point<double>(-97.45963096618651, 35.36329598397908));
+ geom1.emplace_back(point<double>(-97.47550964355469, 35.369245324153866));
+ line_string<double> geom2;
+ geom2.emplace_back(point<double>(-10852395.511130, 4212951.024108));
+ geom2.emplace_back(point<double>(-10851497.376047, 4211403.174286));
+ geom2.emplace_back(point<double>(-10850608.795594, 4213218.553707));
+ geom2.emplace_back(point<double>(-10849557.786455, 4210896.778973));
+ geom2.emplace_back(point<double>(-10849156.492056, 4213361.873135));
+ geom2.emplace_back(point<double>(-10850924.098335, 4214174.016561));
+ unsigned int err = 0;
+ {
+ // Test Standard Transform
+ line_string<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform in reverse
+ line_string<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ line_string<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ line_string<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform in place
+ line_string<double> geom3(geom1);
+ REQUIRE(reproject(geom3, proj_trans1));
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ // Transform in place providing projections
+ line_string<double> geom3(geom1);
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // End Section
+
+SECTION("test_projection_4269_3857 - Point Geometry Object") {
+ using namespace mapnik::geometry;
+ mapnik::projection source("+init=epsg:4269");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans1(source, dest);
+ mapnik::proj_transform proj_trans2(dest, source);
+ point<double> geom1(-97.552175, 35.522895);
+ point<double> geom2(-10859458.446776, 4235169.496066);
+ unsigned int err = 0;
+ {
+ // Test Standard Transform
+ point<double> new_geom = reproject_copy(geom1, proj_trans1, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform in reverse
+ point<double> new_geom = reproject_copy(geom2, proj_trans2, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform providing projections not transfrom
+ point<double> new_geom = reproject_copy(geom1, source, dest, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom2);
+ }
+ {
+ // Transform providing projections in reverse
+ point<double> new_geom = reproject_copy(geom2, dest, source, err);
+ REQUIRE(err == 0);
+ assert_g_equal(new_geom, geom1);
+ }
+ {
+ // Transform in place
+ point<double> geom3(-97.552175, 35.522895);
+ REQUIRE(reproject(geom3, proj_trans1));
+ assert_g_equal(geom3, geom2);
+ // Transform in place reverse - back
+ REQUIRE(reproject(geom3, proj_trans2));
+ assert_g_equal(geom3, geom1);
+ }
+ {
+ // Transform in place providing projections
+ point<double> geom3(-97.552175, 35.522895);
+ REQUIRE(reproject(geom3, source, dest));
+ assert_g_equal(geom3, geom2);
+ // Transform in place provoding projections reversed
+ REQUIRE(reproject(geom3, dest, source));
+ assert_g_equal(geom3, geom1);
+ }
+} // End Section
+
+
+} // End Testcase
diff --git a/test/unit/geometry/geometry_strategy_test.cpp b/test/unit/geometry/geometry_strategy_test.cpp
new file mode 100644
index 0000000..124b343
--- /dev/null
+++ b/test/unit/geometry/geometry_strategy_test.cpp
@@ -0,0 +1,241 @@
+#include "catch.hpp"
+#include "geometry_equal.hpp"
+
+#include <mapnik/geometry.hpp>
+#include <mapnik/projection.hpp>
+#include <mapnik/proj_transform.hpp>
+#include <mapnik/view_transform.hpp>
+#include <mapnik/geometry_transform.hpp>
+#include <mapnik/geometry_strategy.hpp>
+#include <mapnik/proj_strategy.hpp>
+#include <mapnik/view_strategy.hpp>
+
+TEST_CASE("geometry strategy tests") {
+
+SECTION("proj and view strategy") {
+ using namespace mapnik::geometry;
+ mapnik::box2d<double> e(-20037508.342789,-20037508.342789,20037508.342789,20037508.342789);
+ mapnik::view_transform vt(256, 256, e);
+ mapnik::view_strategy vs(vt);
+ mapnik::unview_strategy uvs(vt);
+ mapnik::projection source("+init=epsg:4326");
+ mapnik::projection dest("+init=epsg:3857");
+ mapnik::proj_transform proj_trans(source, dest);
+ mapnik::proj_transform proj_trans_rev(dest, source);
+ mapnik::proj_strategy ps(proj_trans);
+ mapnik::proj_strategy ps_rev(proj_trans_rev);
+ {
+ // Test first that proj strategy works properly
+ point<double> p1(-97.553098,35.523105);
+ point<double> r1(-1.08596e+07, 4.2352e+06);
+ point<double> p3 = transform<double>(p1, ps);
+ //std::cout << p3.x << " , " << p3.y << std::endl;
+ assert_g_equal(r1, p3);
+ }
+ {
+ // Test next that view_strategy works
+ point<double> p1(-1.08596e+07, 4.2352e+06);
+ point<double> r1(58.6287 , 100.945);
+ point<double> p3 = transform<double>(p1, vs);
+ //std::cout << p3.x << " , " << p3.y << std::endl;
+ assert_g_equal(r1, p3);
+
+ }
+ {
+ // Test next that view_strategy works as single process in strategy group
+ point<double> p1(-1.08596e+07, 4.2352e+06);
+ point<double> r1(58.6287 , 100.945);
+ using sg_type = strategy_group<mapnik::view_strategy>;
+ sg_type sg(vs);
+ point<double> p3 = transform<double>(p1, sg);
+ //std::cout << p3.x << " , " << p3.y << std::endl;
+ assert_g_equal(r1, p3);
+
+ }
+ {
+ // Test that both work grouped together in strategy group
+ using sg_type = strategy_group<mapnik::proj_strategy, mapnik::view_strategy >;
+ sg_type sg(ps, vs);
+ point<double> p1(-97.553098,35.523105);
+ point<double> r1(58.6287 , 100.945);
+ point<double> p3 = transform<double>(p1, sg);
+ //std::cout << p3.x << " , " << p3.y << std::endl;
+ assert_g_equal(r1, p3);
+ }
+ {
+ // Test that both work grouped together passing in geometry
+ using sg_type = strategy_group<mapnik::proj_strategy, mapnik::view_strategy >;
+ sg_type sg(ps, vs);
+ geometry<double> p1(std::move(point<double>(-97.553098,35.523105)));
+ point<double> r1(58.6287 , 100.945);
+ geometry<double> p2 = transform<double>(p1, sg);
+ REQUIRE(p2.is<point<double> >());
+ point<double> p3 = mapnik::util::get<point<double> >(p2);
+ //std::cout << p3.x << " , " << p3.y << std::endl;
+ assert_g_equal(r1, p3);
+ }
+ {
+ // Test that it works pulling back int
+ using sg_type = strategy_group<mapnik::proj_strategy, mapnik::view_strategy >;
+ sg_type sg(ps, vs);
+ geometry<double> p1(std::move(point<double>(-97.553098,35.523105)));
+ point<std::int64_t> r1(58 , 100);
+ geometry<std::int64_t> p2 = transform<std::int64_t>(p1, sg);
+ REQUIRE(p2.is<point<std::int64_t> >());
+ point<std::int64_t> p3 = mapnik::util::get<point<std::int64_t> >(p2);
+ //std::cout << p3.x << " , " << p3.y << std::endl;
+ assert_g_equal(r1, p3);
+ }
+ {
+ // Test with scaling as well. This would be like projection from 4326 to a vector tile.
+ mapnik::geometry::scale_rounding_strategy ss(16);
+ using sg_type = strategy_group<mapnik::proj_strategy, mapnik::view_strategy, mapnik::geometry::scale_rounding_strategy >;
+ sg_type sg(ps, vs, ss);
+ geometry<double> p1(std::move(point<double>(-97.553098,35.523105)));
+ point<std::int64_t> r1(938 , 1615);
+ geometry<std::int64_t> p2 = transform<std::int64_t>(p1, sg);
+ REQUIRE(p2.is<point<std::int64_t> >());
+ point<std::int64_t> p3 = mapnik::util::get<point<std::int64_t> >(p2);
+ //std::cout << p3.x << " , " << p3.y << std::endl;
+ assert_g_equal(r1, p3);
+ }
+ {
+ // Test the entire process in reverse! This would be like converting a vector tile coordinate to 4326.
+ mapnik::geometry::scale_strategy ss(1.0/16.0);
+ using sg_type = strategy_group_first<mapnik::geometry::scale_strategy, mapnik::unview_strategy, mapnik::proj_strategy >;
+ sg_type sg(ss, uvs, ps_rev);
+ geometry<std::int64_t> p1(std::move(point<std::int64_t>(938 , 1615)));
+ point<double> r1(-97.5586 , 35.5322);
+ geometry<double> p2 = transform<double>(p1, sg);
+ REQUIRE(p2.is<point<double> >());
+ point<double> p3 = mapnik::util::get<point<double> >(p2);
+ //std::cout << p3.x << " , " << p3.y << std::endl;
+ assert_g_equal(r1, p3);
+ }
+ {
+ // Test with scaling + offset as well. This would be like projection from 4326 to a vector tile.
+ mapnik::geometry::scale_rounding_strategy ss(16, 20);
+ using sg_type = strategy_group<mapnik::proj_strategy, mapnik::view_strategy, mapnik::geometry::scale_rounding_strategy >;
+ sg_type sg(ps, vs, ss);
+ geometry<double> p1(std::move(point<double>(-97.553098,35.523105)));
+ point<std::int64_t> r1(958 , 1635);
+ geometry<std::int64_t> p2 = transform<std::int64_t>(p1, sg);
+ REQUIRE(p2.is<point<std::int64_t> >());
+ point<std::int64_t> p3 = mapnik::util::get<point<std::int64_t> >(p2);
+ //std::cout << p3.x << " , " << p3.y << std::endl;
+ assert_g_equal(r1, p3);
+ }
+ {
+ // Test the entire scaling plus offset in reverse process in reverse! This would be like converting a vector tile coordinate to 4326.
+ mapnik::geometry::scale_strategy ss(1.0/16.0, -20.0/16.0);
+ using sg_type = strategy_group_first<mapnik::geometry::scale_strategy, mapnik::unview_strategy, mapnik::proj_strategy >;
+ sg_type sg(ss, uvs, ps_rev);
+ geometry<std::int64_t> p1(std::move(point<std::int64_t>(958 , 1635)));
+ point<double> r1(-97.5586 , 35.5322);
+ geometry<double> p2 = transform<double>(p1, sg);
+ REQUIRE(p2.is<point<double> >());
+ point<double> p3 = mapnik::util::get<point<double> >(p2);
+ //std::cout << p3.x << " , " << p3.y << std::endl;
+ assert_g_equal(r1, p3);
+ }
+
+} // END SECTION
+
+SECTION("scaling strategies - double to double") {
+ using namespace mapnik::geometry;
+
+ {
+ scale_strategy ss(10.0);
+ point<double> p(-90.3, 35.5);
+ point<double> r(-903.0, 355.0);
+ point<double> o = transform<double>(p, ss);
+ assert_g_equal(r, o);
+ }
+ {
+ scale_strategy ss(0.5, -2.0);
+ point<double> p(-90.3, 35.5);
+ point<double> r(-47.15, 15.75);
+ point<double> o = transform<double>(p, ss);
+ assert_g_equal(r, o);
+ }
+ {
+ // Not the rounding doesn't apply because not casting to ints
+ scale_rounding_strategy ss(0.5, -2.0);
+ point<double> p(-90.3, 35.5);
+ point<double> r(-47.15, 15.75);
+ point<double> o = transform<double>(p, ss);
+ assert_g_equal(r, o);
+ }
+
+} // END SECTION
+
+SECTION("scaling strategies - double to int64") {
+ using namespace mapnik::geometry;
+
+ {
+ scale_strategy ss(10.0);
+ point<double> p(-90.31, 35.58);
+ point<std::int64_t> r(-903, 355);
+ point<std::int64_t> o = transform<std::int64_t>(p, ss);
+ assert_g_equal(r, o);
+ }
+ {
+ scale_strategy ss(0.5, -2.0);
+ point<double> p(-90.3, 35.5);
+ point<std::int64_t> r(-47, 15);
+ point<std::int64_t> o = transform<std::int64_t>(p, ss);
+ assert_g_equal(r, o);
+ }
+ {
+ scale_rounding_strategy ss(0.5, -2.0);
+ point<double> p(-90.3, 35.5);
+ point<std::int64_t> r(-47, 16);
+ point<std::int64_t> o = transform<std::int64_t>(p, ss);
+ assert_g_equal(r, o);
+ }
+ {
+ // Test underflow and overflow
+ std::int64_t min = std::numeric_limits<std::int64_t>::min();
+ std::int64_t max = std::numeric_limits<std::int64_t>::max();
+ scale_strategy ss(1.0E100);
+ point<double> p(-90.3, 35.5);
+ point<std::int64_t> r(min, max);
+ point<std::int64_t> o = transform<std::int64_t>(p, ss);
+ assert_g_equal(r, o);
+ }
+ {
+ // Test underflow and overflow
+ std::int64_t min = std::numeric_limits<std::int64_t>::min();
+ std::int64_t max = std::numeric_limits<std::int64_t>::max();
+ scale_rounding_strategy ss(1.0E100);
+ point<double> p(-90.3, 35.5);
+ point<std::int64_t> r(min, max);
+ point<std::int64_t> o = transform<std::int64_t>(p, ss);
+ assert_g_equal(r, o);
+ }
+ {
+ // Test overrflow and underflow
+ std::int64_t min = std::numeric_limits<std::int64_t>::min();
+ std::int64_t max = std::numeric_limits<std::int64_t>::max();
+ scale_strategy ss(1.0E100);
+ point<double> p(90.3, -35.5);
+ point<std::int64_t> r(max, min);
+ point<std::int64_t> o = transform<std::int64_t>(p, ss);
+ assert_g_equal(r, o);
+ }
+ {
+ // Test overflow and underflow
+ std::int64_t min = std::numeric_limits<std::int64_t>::min();
+ std::int64_t max = std::numeric_limits<std::int64_t>::max();
+ scale_rounding_strategy ss(1.0E100);
+ point<double> p(90.3, -35.5);
+ point<std::int64_t> r(max, min);
+ point<std::int64_t> o = transform<std::int64_t>(p, ss);
+ assert_g_equal(r, o);
+ }
+
+} // END SECTION
+
+} // END TEST CASE
+
+
diff --git a/test/unit/geometry/label_algo_test.cpp b/test/unit/geometry/label_algo_test.cpp
new file mode 100644
index 0000000..851db33
--- /dev/null
+++ b/test/unit/geometry/label_algo_test.cpp
@@ -0,0 +1,65 @@
+#include "catch.hpp"
+
+#include <iostream>
+#include <mapnik/geometry.hpp>
+#include <mapnik/geometry_adapters.hpp>
+#include <mapnik/geometry_centroid.hpp>
+#include <vector>
+#include <algorithm>
+
+TEST_CASE("labeling") {
+
+SECTION("algorithms") {
+
+ try
+ {
+ // reused these for simplicity
+ mapnik::geometry::point<double> centroid;
+ {
+ // single point
+ mapnik::geometry::point<double> pt(10,10);
+ REQUIRE( mapnik::geometry::centroid(pt, centroid));
+ REQUIRE( pt.x == centroid.x);
+ REQUIRE( pt.y == centroid.y);
+ }
+
+ // linestring with three consecutive verticies
+ {
+ mapnik::geometry::line_string<double> line;
+ line.add_coord(0, 0);
+ line.add_coord(25, 25);
+ line.add_coord(50, 50);
+ REQUIRE(mapnik::geometry::centroid(line, centroid));
+ REQUIRE( centroid.x == 25 );
+ REQUIRE( centroid.y == 25 );
+ }
+ // TODO - centroid and interior should be equal but they appear not to be (check largest)
+ // MULTIPOLYGON(((-52 40,-60 32,-68 40,-60 48,-52 40)),((-60 50,-80 30,-100 49.9999999999999,-80.0000000000001 70,-60 50)),((-52 60,-60 52,-68 60,-60 68,-52 60)))
+#if 0
+ // hit tests
+ {
+ mapnik::geometry_type pt_hit(mapnik::geometry::geometry_types::Point);
+ pt_hit.move_to(10,10);
+ mapnik::vertex_adapter va(pt_hit);
+ REQUIRE( mapnik::label::hit_test(va, 10, 10, 0.1) );
+ REQUIRE( !mapnik::label::hit_test(va, 9, 9, 0) );
+ REQUIRE( mapnik::label::hit_test(va, 9, 9, 1.5) );
+ }
+ {
+ mapnik::geometry_type line_hit(mapnik::geometry::geometry_types::LineString);
+ line_hit.move_to(0,0);
+ line_hit.line_to(50,50);
+ mapnik::vertex_adapter va(line_hit);
+ REQUIRE( mapnik::label::hit_test(va, 0, 0, 0.001) );
+ REQUIRE( !mapnik::label::hit_test(va, 1, 1, 0) );
+ REQUIRE( mapnik::label::hit_test(va, 1, 1, 1.001) );
+ }
+#endif
+ }
+ catch (std::exception const & ex)
+ {
+ std::clog << ex.what() << "\n";
+ REQUIRE(false);
+ }
+}
+}
diff --git a/test/unit/imaging/image.cpp b/test/unit/imaging/image.cpp
new file mode 100644
index 0000000..d2c908e
--- /dev/null
+++ b/test/unit/imaging/image.cpp
@@ -0,0 +1,292 @@
+#include "catch.hpp"
+
+// mapnik
+#include <mapnik/image_any.hpp>
+#include <mapnik/color.hpp>
+#include <mapnik/image_view_any.hpp>
+#include <mapnik/image_util.hpp>
+
+TEST_CASE("image class") {
+
+SECTION("test gray16") {
+
+ const mapnik::image_gray16 im(4,4);
+ mapnik::image_gray16 im2(im);
+ mapnik::image_gray16 im3(5,5);
+
+ CHECK(im == im);
+ CHECK_FALSE(im == im2);
+ CHECK_FALSE(im2 == im3);
+ CHECK(im < im3);
+ CHECK_FALSE(im < im2);
+
+ // Check that width is correct
+ CHECK(im.width() == 4);
+ CHECK(im2.width() == 4);
+
+ // Check that height is correct
+ CHECK(im.height() == 4);
+ CHECK(im2.height() == 4);
+
+ CHECK(im(0,0) == 0);
+ CHECK(im2(0,0) == 0);
+ im2(0,0) = 1;
+ CHECK(im2(0,0) == 1);
+ im2.set(514);
+ CHECK(im2(0,0) == 514);
+ CHECK(im2(1,1) == 514);
+
+ // Check that size is correct
+ CHECK(im.size() == 32);
+ CHECK(im2.size() == 32);
+
+ // Check that row_size is correct
+ CHECK(im.row_size() == 8);
+ CHECK(im2.row_size() == 8);
+
+ // Check that get_premultiplied is correct
+ CHECK_FALSE(im.get_premultiplied());
+ CHECK_FALSE(im2.get_premultiplied());
+
+ // Check that set premultiplied works
+ im2.set_premultiplied(true);
+ CHECK(im2.get_premultiplied());
+
+ // Check that painted is correct
+ CHECK_FALSE(im.painted());
+ CHECK_FALSE(im2.painted());
+
+ // Check that set premultiplied works
+ im2.painted(true);
+ CHECK(im2.painted());
+
+ // Check that offset is correct
+ CHECK(im.get_offset() == 0.0);
+ CHECK(im2.get_offset() == 0.0);
+
+ // Check that set offset works
+ im2.set_offset(2.3);
+ CHECK(im2.get_offset() == 2.3);
+
+ // Check that scaling is correct
+ CHECK(im.get_scaling() == 1.0);
+ CHECK(im2.get_scaling() == 1.0);
+
+ // Check that set scaling works
+ im2.set_scaling(1.1);
+ CHECK(im2.get_scaling() == 1.1);
+
+ // CHECK that image dtype is correct
+ CHECK(im.get_dtype() == mapnik::image_dtype_gray16);
+ CHECK(im2.get_dtype() == mapnik::image_dtype_gray16);
+
+ using pixel_type = mapnik::image_view_gray16::pixel_type;
+ pixel_type expected_val;
+ // Check that all data in the view is correct
+ // IM
+ expected_val = 0;
+ pixel_type const* data_im = im.data();
+ CHECK(*data_im == expected_val);
+ unsigned char const* data_b = im.bytes();
+ CHECK(*data_b == 0);
+ for (std::size_t y = 0; y < im.height(); ++y)
+ {
+ std::size_t width = im.width();
+ pixel_type const* data_1 = im.get_row(y);
+ pixel_type const* data_2 = im.get_row(y, 1);
+ for (std::size_t x = 0; x < width; ++x)
+ {
+ CHECK(*data_1 == expected_val);
+ ++data_1;
+ }
+ for (std::size_t x = 1; x < width; ++x)
+ {
+ CHECK(*data_2 == expected_val);
+ ++data_2;
+ }
+ }
+ // IM2
+ expected_val = 514;
+ pixel_type * data_im2 = im2.data();
+ CHECK(*data_im2 == expected_val);
+ unsigned char * data_b2 = im2.bytes();
+ CHECK(*data_b2 == 2);
+ ++data_b;
+ CHECK(*data_b2 == 2);
+ for (std::size_t y = 0; y < im2.height(); ++y)
+ {
+ std::size_t width = im2.width();
+ pixel_type const* data_1 = im2.get_row(y);
+ pixel_type const* data_2 = im2.get_row(y, 1);
+ for (std::size_t x = 0; x < width; ++x)
+ {
+ CHECK(*data_1 == expected_val);
+ ++data_1;
+ }
+ for (std::size_t x = 1; x < width; ++x)
+ {
+ CHECK(*data_2 == expected_val);
+ ++data_2;
+ }
+ }
+
+ // Test set row
+ std::vector<pixel_type> v1(im2.width(), 30);
+ std::vector<pixel_type> v2(im2.width()-1, 50);
+ im2.set_row(0, v1.data(), v1.size());
+ im2.set_row(1, 1, v2.size(), v2.data());
+
+ CHECK(im2(0,0) == 30);
+ CHECK(im2(0,1) == 514);
+ CHECK(im2(1,1) == 50);
+
+} // END SECTION
+
+SECTION("image_null")
+{
+ mapnik::image_null im_null;
+ const mapnik::image_null im_null2(2,2); // Actually doesn't really set any size
+ mapnik::image_null im_null3(im_null2);
+ mapnik::image_null im_null4(std::move(im_null3));
+
+ // All nulls are equal
+ CHECK(im_null == im_null4);
+ CHECK(im_null == im_null2);
+
+ // No null is greater
+ CHECK_FALSE(im_null < im_null4);
+ CHECK_FALSE(im_null < im_null2);
+
+ // Check defaults
+ CHECK(im_null.width() == 0);
+ CHECK(im_null.height() == 0);
+ CHECK(im_null.size() == 0);
+ CHECK(im_null.row_size() == 0);
+ // Setting offset does nothing
+ im_null.set_offset(10000000.0);
+ CHECK(im_null.get_offset() == 0.0);
+ // Setting scaling does nothing
+ im_null.set_scaling(123123123.0);
+ CHECK(im_null.get_scaling() == 1.0);
+ CHECK(im_null.get_dtype() == mapnik::image_dtype_null);
+ // Setting premultiplied does nothing
+ im_null.set_premultiplied(true);
+ CHECK_FALSE(im_null.get_premultiplied());
+ // Setting painted does nothing
+ im_null.painted(true);
+ CHECK_FALSE(im_null.painted());
+
+ // Should throw if we try to access or setdata.
+ REQUIRE_THROWS(im_null(0,0));
+ REQUIRE_THROWS(im_null2(0,0));
+ REQUIRE_THROWS(im_null(0,0) = 1);
+
+ unsigned char const* e1 = im_null.bytes();
+ unsigned char * e2 = im_null.bytes();
+ CHECK(e1 == nullptr);
+ CHECK(e2 == nullptr);
+
+} // END SECTION
+
+SECTION("image any")
+{
+ mapnik::image_null null_im;
+ const mapnik::image_any im_any_null(null_im);
+ CHECK(im_any_null.get_dtype() == mapnik::image_dtype_null);
+ CHECK(im_any_null.bytes() == nullptr);
+
+ mapnik::image_gray16 im(4,4);
+ mapnik::fill(im, 514);
+ mapnik::image_any im_any(im);
+
+ CHECK(im_any.get_dtype() == mapnik::image_dtype_gray16);
+ unsigned char * foo = im_any.bytes();
+ CHECK(*foo == 2);
+ ++foo;
+ CHECK(*foo == 2);
+ CHECK(im_any.width() == 4);
+ CHECK(im_any.height() == 4);
+ CHECK(im_any.size() == 32);
+ CHECK(im_any.row_size() == 8);
+ CHECK_FALSE(im_any.get_premultiplied());
+ im_any.set_offset(10.0);
+ CHECK(im_any.get_offset() == 10.0);
+ im_any.set_scaling(2.1);
+ CHECK(im_any.get_scaling() == 2.1);
+ CHECK_FALSE(im_any.painted());
+
+} // END SECTION
+
+
+SECTION("test image_any initialization")
+{
+ {
+ mapnik::image_any im(4,4);
+ CHECK(im.get_dtype() == mapnik::image_dtype_rgba8);
+ }
+ {
+ mapnik::image_any im(4, 4, mapnik::image_dtype_null);
+ CHECK(im.get_dtype() == mapnik::image_dtype_null);
+ }
+ {
+ mapnik::image_any im(4, 4, mapnik::image_dtype_gray8);
+ CHECK(im.get_dtype() == mapnik::image_dtype_gray8);
+ }
+ {
+ mapnik::image_any im(4, 4, mapnik::image_dtype_gray8s);
+ CHECK(im.get_dtype() == mapnik::image_dtype_gray8s);
+ }
+ {
+ mapnik::image_any im(4, 4, mapnik::image_dtype_gray16);
+ CHECK(im.get_dtype() == mapnik::image_dtype_gray16);
+ }
+ {
+ mapnik::image_any im(4, 4, mapnik::image_dtype_gray16s);
+ CHECK(im.get_dtype() == mapnik::image_dtype_gray16s);
+ }
+ {
+ mapnik::image_any im(4, 4, mapnik::image_dtype_gray32);
+ CHECK(im.get_dtype() == mapnik::image_dtype_gray32);
+ }
+ {
+ mapnik::image_any im(4, 4, mapnik::image_dtype_gray32s);
+ CHECK(im.get_dtype() == mapnik::image_dtype_gray32s);
+ }
+ {
+ mapnik::image_any im(4, 4, mapnik::image_dtype_gray32f);
+ CHECK(im.get_dtype() == mapnik::image_dtype_gray32f);
+ }
+ {
+ mapnik::image_any im(4, 4, mapnik::image_dtype_gray64);
+ CHECK(im.get_dtype() == mapnik::image_dtype_gray64);
+ }
+ {
+ mapnik::image_any im(4, 4, mapnik::image_dtype_gray64s);
+ CHECK(im.get_dtype() == mapnik::image_dtype_gray64s);
+ }
+ {
+ mapnik::image_any im(4, 4, mapnik::image_dtype_gray64f);
+ CHECK(im.get_dtype() == mapnik::image_dtype_gray64f);
+ }
+
+} // END SECTION
+
+SECTION("Image Buffer")
+{
+ mapnik::detail::buffer buf_zero(0);
+ CHECK(buf_zero.size() == 0);
+ CHECK(!buf_zero);
+ mapnik::detail::buffer buf(10);
+ CHECK(buf.size() == 10);
+ CHECK_FALSE(!buf);
+ unsigned char * d = buf.data();
+ *d = 9;
+ const mapnik::detail::buffer buf2 = buf;
+ CHECK(buf2.size() == 10);
+ unsigned char const* d2 = buf2.data();
+ CHECK(*d2 == 9);
+
+} // END SECTION
+
+} // END TEST CASE
+
diff --git a/test/unit/imaging/image_apply_opacity.cpp b/test/unit/imaging/image_apply_opacity.cpp
new file mode 100644
index 0000000..09f8dd1
--- /dev/null
+++ b/test/unit/imaging/image_apply_opacity.cpp
@@ -0,0 +1,104 @@
+#include "catch.hpp"
+
+// mapnik
+#include <mapnik/image_any.hpp>
+#include <mapnik/color.hpp>
+#include <mapnik/image_util.hpp>
+
+TEST_CASE("image apply_opacity") {
+
+SECTION("test rgba8") {
+
+ mapnik::image_rgba8 im(4,4);
+ mapnik::image_rgba8 im2(4,4,true,true); // Initialize as already premultiplied
+ mapnik::image_any im_any(mapnik::image_rgba8(4,4));
+ mapnik::image_any im2_any(mapnik::image_rgba8(4,4,true,true));
+
+ // Fill the images with meaningfull values
+ mapnik::color c1(57,70,128,128); // This color is not premultiplied
+ mapnik::color c2(57,70,128,128, true); // This color is premultiplied
+ mapnik::fill(im, c1); // Because c1 is not premultiplied it will make the image not premultiplied
+ mapnik::fill(im_any, c1); // Because c1 is not premultiplied it will make the image not premultiplied
+ mapnik::fill(im2, c2); // Because c1 is premultiplied it will make the image premultiplied
+ mapnik::fill(im2_any, c2); // Because c1 is premultiplied it will make the image premultiplied
+
+ mapnik::apply_opacity(im, 0.75);
+ mapnik::apply_opacity(im_any, 0.75);
+ mapnik::apply_opacity(im2, 0.75);
+ mapnik::apply_opacity(im2_any, 0.75);
+
+ mapnik::color out;
+ // This should have only changed the alpha, as it was not premultipleid
+ out = mapnik::get_pixel<mapnik::color>(im, 0, 0);
+ CHECK(static_cast<int>(out.red()) == 57);
+ CHECK(static_cast<int>(out.green()) == 70);
+ CHECK(static_cast<int>(out.blue()) == 128);
+ CHECK(static_cast<int>(out.alpha()) == 96);
+ out = mapnik::get_pixel<mapnik::color>(im_any, 0, 0);
+ CHECK(static_cast<int>(out.red()) == 57);
+ CHECK(static_cast<int>(out.green()) == 70);
+ CHECK(static_cast<int>(out.blue()) == 128);
+ CHECK(static_cast<int>(out.alpha()) == 96);
+ // This will be different because it is demultiplied then premultiplied again after setting alpha
+ out = mapnik::get_pixel<mapnik::color>(im2, 0, 0);
+ CHECK(static_cast<int>(out.red()) == 43);
+ CHECK(static_cast<int>(out.green()) == 53);
+ CHECK(static_cast<int>(out.blue()) == 96);
+ CHECK(static_cast<int>(out.alpha()) == 96);
+ out = mapnik::get_pixel<mapnik::color>(im2_any, 0, 0);
+ CHECK(static_cast<int>(out.red()) == 43);
+ CHECK(static_cast<int>(out.green()) == 53);
+ CHECK(static_cast<int>(out.blue()) == 96);
+ CHECK(static_cast<int>(out.alpha()) == 96);
+
+} // END SECTION
+
+SECTION("test rgba8 overflow") {
+
+ mapnik::image_rgba8 im(4,4);
+ mapnik::color c(128,128,128,128); // This color is premultiplied
+ mapnik::fill(im, c); // Because c1 is not premultiplied it will make the image not premultiplied
+ mapnik::color out;
+ out = mapnik::get_pixel<mapnik::color>(im, 0, 0);
+ CHECK(static_cast<int>(out.red()) == 128);
+ CHECK(static_cast<int>(out.green()) == 128);
+ CHECK(static_cast<int>(out.blue()) == 128);
+ CHECK(static_cast<int>(out.alpha()) == 128);
+
+ mapnik::apply_opacity(im, 2.5);
+
+ out = mapnik::get_pixel<mapnik::color>(im, 0, 0);
+ CHECK(static_cast<int>(out.red()) == 128);
+ CHECK(static_cast<int>(out.green()) == 128);
+ CHECK(static_cast<int>(out.blue()) == 128);
+ CHECK(static_cast<int>(out.alpha()) == 128);
+
+} // END SECTION
+
+SECTION("test rgba8 underflow") {
+
+ mapnik::image_rgba8 im(4,4);
+ mapnik::color c(128,128,128,128); // This color is premultiplied
+ mapnik::fill(im, c); // Because c1 is not premultiplied it will make the image not premultiplied
+
+ mapnik::apply_opacity(im, -2.5);
+
+ mapnik::color out;
+ out = mapnik::get_pixel<mapnik::color>(im, 0, 0);
+ CHECK(static_cast<int>(out.red()) == 128);
+ CHECK(static_cast<int>(out.green()) == 128);
+ CHECK(static_cast<int>(out.blue()) == 128);
+ CHECK(static_cast<int>(out.alpha()) == 0);
+
+} // END SECTION
+
+SECTION("test gray8") {
+
+ mapnik::image_gray8 im(4,4);
+ mapnik::image_any im_any(mapnik::image_gray8(4,4));
+
+ CHECK_THROWS(mapnik::apply_opacity(im, 0.25));
+ CHECK_THROWS(mapnik::apply_opacity(im_any, 0.25));
+
+} // END SECTION
+} // END TEST_CASE
diff --git a/test/unit/imaging/image_io_test.cpp b/test/unit/imaging/image_io_test.cpp
new file mode 100644
index 0000000..8772ef3
--- /dev/null
+++ b/test/unit/imaging/image_io_test.cpp
@@ -0,0 +1,84 @@
+#include "catch.hpp"
+
+#include <iostream>
+#include <mapnik/image.hpp>
+#include <mapnik/image_reader.hpp>
+#include <mapnik/image_util.hpp>
+#include <mapnik/util/fs.hpp>
+#include <vector>
+#include <algorithm>
+#if defined(HAVE_CAIRO)
+#include <mapnik/cairo/cairo_context.hpp>
+#include <mapnik/cairo/cairo_image_util.hpp>
+#endif
+
+TEST_CASE("image io") {
+
+SECTION("readers") {
+
+ std::string should_throw;
+ boost::optional<std::string> type;
+ try
+ {
+#if defined(HAVE_JPEG)
+ should_throw = "./test/data/images/blank.jpg";
+ REQUIRE( mapnik::util::exists( should_throw ) );
+ type = mapnik::type_from_filename(should_throw);
+ REQUIRE( type );
+ REQUIRE_THROWS(std::unique_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(should_throw,*type)));
+#endif
+
+ REQUIRE_THROWS(mapnik::image_rgba8 im(-10,-10)); // should throw rather than overflow
+
+#if defined(HAVE_CAIRO)
+ mapnik::cairo_surface_ptr image_surface(
+ cairo_image_surface_create(CAIRO_FORMAT_ARGB32,256,257),
+ mapnik::cairo_surface_closer());
+ mapnik::image_rgba8 im_data(cairo_image_surface_get_width(&*image_surface), cairo_image_surface_get_height(&*image_surface));
+ im_data.set(1);
+ REQUIRE( (unsigned)im_data(0,0) == unsigned(1) );
+ // Should set back to fully transparent
+ mapnik::cairo_image_to_rgba8(im_data, image_surface);
+ REQUIRE( (unsigned)im_data(0,0) == unsigned(0) );
+#endif
+
+#if defined(HAVE_PNG)
+ should_throw = "./test/data/images/blank.png";
+ REQUIRE( mapnik::util::exists( should_throw ) );
+ type = mapnik::type_from_filename(should_throw);
+ REQUIRE( type );
+ REQUIRE_THROWS(std::unique_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(should_throw,*type)));
+
+ should_throw = "./test/data/images/xcode-CgBI.png";
+ REQUIRE( mapnik::util::exists( should_throw ) );
+ type = mapnik::type_from_filename(should_throw);
+ REQUIRE( type );
+ REQUIRE_THROWS(std::unique_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(should_throw,*type)));
+#endif
+
+#if defined(HAVE_TIFF)
+ should_throw = "./test/data/images/blank.tiff";
+ REQUIRE( mapnik::util::exists( should_throw ) );
+ type = mapnik::type_from_filename(should_throw);
+ REQUIRE( type );
+ REQUIRE_THROWS(std::unique_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(should_throw,*type)));
+#endif
+
+#if defined(HAVE_WEBP)
+ should_throw = "./test/data/images/blank.webp";
+ REQUIRE( mapnik::util::exists( should_throw ) );
+ type = mapnik::type_from_filename(should_throw);
+ REQUIRE( type );
+ REQUIRE_THROWS(std::unique_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(should_throw,*type)));
+#endif
+ }
+ catch (std::exception const & ex)
+ {
+ std::clog << ex.what() << "\n";
+ REQUIRE(false);
+ }
+
+} // END SECTION
+
+
+} // END TEST_CASE
diff --git a/test/unit/imaging/image_is_solid.cpp b/test/unit/imaging/image_is_solid.cpp
new file mode 100644
index 0000000..5bc8217
--- /dev/null
+++ b/test/unit/imaging/image_is_solid.cpp
@@ -0,0 +1,94 @@
+#include "catch.hpp"
+
+// mapnik
+#include <mapnik/image_any.hpp>
+#include <mapnik/image_view_any.hpp>
+#include <mapnik/color.hpp>
+#include <mapnik/image_util.hpp>
+
+
+TEST_CASE("image is_solid") {
+
+SECTION("test rgba8") {
+
+ mapnik::image_rgba8 im(4,4);
+ mapnik::image_any im_any(mapnik::image_rgba8(4,4));
+
+ CHECK(mapnik::is_solid(im));
+ CHECK(mapnik::is_solid(im_any));
+
+ mapnik::image_view_rgba8 im_view(0,0,4,4,im);
+ mapnik::image_view_any im_view_any(mapnik::image_view_rgba8(0,0,4,4,im));
+
+ CHECK(mapnik::is_solid(im_view));
+ CHECK(mapnik::is_solid(im_view_any));
+
+ mapnik::color c1("green");
+ mapnik::color c2("blue");
+ mapnik::fill(im, c1);
+ mapnik::fill(im_any, c1);
+
+ CHECK(mapnik::is_solid(im));
+ CHECK(mapnik::is_solid(im_any));
+ CHECK(mapnik::is_solid(im_view));
+ CHECK(mapnik::is_solid(im_view_any));
+
+ mapnik::set_pixel(im, 0, 0, c2);
+ mapnik::set_pixel(im_any, 0, 0, c2);
+
+ CHECK_FALSE(mapnik::is_solid(im));
+ CHECK_FALSE(mapnik::is_solid(im_any));
+ CHECK_FALSE(mapnik::is_solid(im_view));
+ CHECK_FALSE(mapnik::is_solid(im_view_any));
+
+} // END SECTION
+
+SECTION("test gray8") {
+
+ mapnik::image_gray8 im(4,4);
+ mapnik::image_any im_any(mapnik::image_gray8(4,4));
+
+ CHECK(mapnik::is_solid(im));
+ CHECK(mapnik::is_solid(im_any));
+
+ mapnik::image_view_gray8 im_view(0,0,4,4,im);
+ mapnik::image_view_any im_view_any(mapnik::image_view_gray8(0,0,4,4,im));
+
+ CHECK(mapnik::is_solid(im_view));
+ CHECK(mapnik::is_solid(im_view_any));
+
+ mapnik::fill(im, 1);
+ mapnik::fill(im_any, 1);
+
+ CHECK(mapnik::is_solid(im));
+ CHECK(mapnik::is_solid(im_any));
+ CHECK(mapnik::is_solid(im_view));
+ CHECK(mapnik::is_solid(im_view_any));
+
+ mapnik::set_pixel(im, 0, 0, 2);
+ mapnik::set_pixel(im_any, 0, 0, 2);
+
+ CHECK_FALSE(mapnik::is_solid(im));
+ CHECK_FALSE(mapnik::is_solid(im_any));
+ CHECK_FALSE(mapnik::is_solid(im_view));
+ CHECK_FALSE(mapnik::is_solid(im_view_any));
+
+} // END SECTION
+
+SECTION("test image null") {
+
+ mapnik::image_null im;
+ mapnik::image_any im_any;
+
+ CHECK(mapnik::is_solid(im));
+ CHECK(mapnik::is_solid(im_any));
+
+ mapnik::image_view_null im_view;
+ mapnik::image_view_any im_view_any;
+
+ CHECK(mapnik::is_solid(im_view));
+ CHECK(mapnik::is_solid(im_view_any));
+
+} // END SECTION
+
+} // END TEST CASE
diff --git a/test/unit/imaging/image_painted_test.cpp b/test/unit/imaging/image_painted_test.cpp
new file mode 100644
index 0000000..b567d5e
--- /dev/null
+++ b/test/unit/imaging/image_painted_test.cpp
@@ -0,0 +1,69 @@
+#include "catch.hpp"
+
+#include <iostream>
+#include <mapnik/map.hpp>
+#include <mapnik/layer.hpp>
+#include <mapnik/rule.hpp>
+#include <mapnik/feature_type_style.hpp>
+#include <mapnik/datasource_cache.hpp>
+#include <mapnik/agg_renderer.hpp>
+#include <mapnik/expression.hpp>
+
+TEST_CASE("image") {
+
+SECTION("painting") {
+
+ using namespace mapnik;
+
+ try
+ {
+ datasource_cache::instance().register_datasources("plugins/input/csv.input");
+
+ Map m(256, 256);
+
+ feature_type_style lines_style;
+ {
+ rule r;
+ line_symbolizer line_sym;
+ r.append(std::move(line_sym));
+ lines_style.add_rule(std::move(r));
+ }
+ m.insert_style("lines", std::move(lines_style));
+
+ feature_type_style markers_style;
+ {
+ rule r;
+ r.set_filter(parse_expression("False"));
+ markers_symbolizer mark_sym;
+ r.append(std::move(mark_sym));
+ markers_style.add_rule(std::move(r));
+ }
+ m.insert_style("markers", std::move(markers_style));
+
+ parameters p;
+ p["type"] = "csv";
+ p["separator"] = "|";
+ p["inline"] = "wkt\nLINESTRING(-10 0, 0 20, 10 0, 15 5)";
+
+ layer lyr("layer");
+ lyr.set_datasource(datasource_cache::instance().create(p));
+ lyr.add_style("lines");
+ lyr.add_style("markers");
+ m.add_layer(lyr);
+
+ m.zoom_all();
+
+ image_rgba8 image(m.width(), m.height());
+ agg_renderer<image_rgba8> ren(m, image);
+ ren.apply();
+
+ REQUIRE(image.painted() == true);
+ }
+ catch (std::exception const & ex)
+ {
+ std::clog << ex.what() << std::endl;
+ REQUIRE(false);
+ }
+
+}
+}
\ No newline at end of file
diff --git a/test/unit/imaging/image_premultiply.cpp b/test/unit/imaging/image_premultiply.cpp
new file mode 100644
index 0000000..3a5e2a1
--- /dev/null
+++ b/test/unit/imaging/image_premultiply.cpp
@@ -0,0 +1,146 @@
+#include "catch.hpp"
+
+// mapnik
+#include <mapnik/image_any.hpp>
+#include <mapnik/color.hpp>
+#include <mapnik/image_util.hpp>
+
+TEST_CASE("image premultiply") {
+
+SECTION("test rgba8") {
+
+ mapnik::image_rgba8 im(4,4);
+ mapnik::image_rgba8 im2(4,4,true,true); // Initialize as already premultiplied
+ mapnik::image_any im_any(mapnik::image_rgba8(4,4));
+ mapnik::image_any im2_any(mapnik::image_rgba8(4,4,true,true));
+
+ // First test that the default state is correct for each
+ CHECK_FALSE(im.get_premultiplied());
+ CHECK_FALSE(im_any.get_premultiplied());
+ CHECK(im2.get_premultiplied());
+ CHECK(im2_any.get_premultiplied());
+
+ // Set the image to premultiplied
+ im.set_premultiplied(true);
+ CHECK(im.get_premultiplied());
+ // Set back to not premultiplied
+ im.set_premultiplied(false);
+ CHECK_FALSE(im.get_premultiplied());
+
+ mapnik::set_premultiplied_alpha(im, true);
+ CHECK(im.get_premultiplied());
+ mapnik::set_premultiplied_alpha(im, false);
+ CHECK_FALSE(im.get_premultiplied());
+
+ // Fill the images with meaningfull values
+ mapnik::color c1(57,70,128,128); // This color is not premultiplied
+ mapnik::color c2(57,70,128,128, true); // This color is premultiplied
+ mapnik::fill(im, c2); // Because c2 is premultiplied it will make the image premultiplied
+ mapnik::fill(im_any, c2); // Because c2 is premultiplied it will make the image premultiplied
+ mapnik::fill(im2, c1); // Because c1 is not premultiplied it will make the image not premultiplied
+ mapnik::fill(im2_any, c1); // Because c1 is not premultiplied it will make the image not premultiplied
+
+ // Demultipled via image_util
+ CHECK(mapnik::demultiply_alpha(im)); // Should return true as was premultiplied
+ CHECK(mapnik::demultiply_alpha(im_any)); // Should return true as was premultiplied
+ CHECK_FALSE(mapnik::demultiply_alpha(im2)); // Should return false as was demultiplied
+ CHECK_FALSE(mapnik::demultiply_alpha(im2_any)); // Should return false as was demultiplied
+
+ mapnik::color out;
+ // This will be higher because it became demultiplied!
+ out = mapnik::get_pixel<mapnik::color>(im, 0, 0);
+ CHECK(static_cast<int>(out.red()) == 113);
+ CHECK(static_cast<int>(out.green()) == 139);
+ CHECK(static_cast<int>(out.blue()) == 255);
+ CHECK(static_cast<int>(out.alpha()) == 128);
+ out = mapnik::get_pixel<mapnik::color>(im_any, 0, 0);
+ CHECK(static_cast<int>(out.red()) == 113);
+ CHECK(static_cast<int>(out.green()) == 139);
+ CHECK(static_cast<int>(out.blue()) == 255);
+ CHECK(static_cast<int>(out.alpha()) == 128);
+ // This will be the same because it was already demultiplied
+ out = mapnik::get_pixel<mapnik::color>(im2, 0, 0);
+ CHECK(static_cast<int>(out.red()) == 57);
+ CHECK(static_cast<int>(out.green()) == 70);
+ CHECK(static_cast<int>(out.blue()) == 128);
+ CHECK(static_cast<int>(out.alpha()) == 128);
+ out = mapnik::get_pixel<mapnik::color>(im2_any, 0, 0);
+ CHECK(static_cast<int>(out.red()) == 57);
+ CHECK(static_cast<int>(out.green()) == 70);
+ CHECK(static_cast<int>(out.blue()) == 128);
+ CHECK(static_cast<int>(out.alpha()) == 128);
+
+ // Set back to im2s to "premultiplied" with out changing underlying values
+ mapnik::set_premultiplied_alpha(im2, true);
+ mapnik::set_premultiplied_alpha(im2_any, true);
+
+ // Demultipled via image_util
+ CHECK(mapnik::premultiply_alpha(im)); // Should return true as was demultiplied
+ CHECK(mapnik::premultiply_alpha(im_any)); // Should return true as was demultiplied
+ CHECK_FALSE(mapnik::premultiply_alpha(im2)); // Should return false as was premultiplied
+ CHECK_FALSE(mapnik::premultiply_alpha(im2_any)); // Should return false as was premultiplied
+
+ // This will be the same because it was already demultiplied
+ out = mapnik::get_pixel<mapnik::color>(im, 0, 0);
+ CHECK(static_cast<int>(out.red()) == 57);
+ CHECK(static_cast<int>(out.green()) == 70);
+ CHECK(static_cast<int>(out.blue()) == 128);
+ CHECK(static_cast<int>(out.alpha()) == 128);
+ out = mapnik::get_pixel<mapnik::color>(im_any, 0, 0);
+ CHECK(static_cast<int>(out.red()) == 57);
+ CHECK(static_cast<int>(out.green()) == 70);
+ CHECK(static_cast<int>(out.blue()) == 128);
+ CHECK(static_cast<int>(out.alpha()) == 128);
+ // This will be the same because it was already demultiplied
+ out = mapnik::get_pixel<mapnik::color>(im2, 0, 0);
+ CHECK(static_cast<int>(out.red()) == 57);
+ CHECK(static_cast<int>(out.green()) == 70);
+ CHECK(static_cast<int>(out.blue()) == 128);
+ CHECK(static_cast<int>(out.alpha()) == 128);
+ out = mapnik::get_pixel<mapnik::color>(im2_any, 0, 0);
+ CHECK(static_cast<int>(out.red()) == 57);
+ CHECK(static_cast<int>(out.green()) == 70);
+ CHECK(static_cast<int>(out.blue()) == 128);
+ CHECK(static_cast<int>(out.alpha()) == 128);
+
+} // END SECTION
+
+SECTION("test gray8") {
+
+ mapnik::image_gray8 im(4,4);
+ mapnik::image_gray8 im2(4,4,true,true); // Initialize as already premultiplied
+ mapnik::image_any im_any(mapnik::image_gray8(4,4));
+ mapnik::image_any im2_any(mapnik::image_gray8(4,4,true,true));
+
+ // First test that the default state is correct for each
+ CHECK_FALSE(im.get_premultiplied());
+ CHECK_FALSE(im_any.get_premultiplied());
+ CHECK(im2.get_premultiplied());
+ CHECK(im2_any.get_premultiplied());
+
+ // Set the image to premultiplied
+ im.set_premultiplied(true);
+ CHECK(im.get_premultiplied());
+ // Set back to not premultiplied
+ im.set_premultiplied(false);
+ CHECK_FALSE(im.get_premultiplied());
+
+ mapnik::set_premultiplied_alpha(im, true);
+ CHECK(im.get_premultiplied());
+ mapnik::set_premultiplied_alpha(im, false);
+ CHECK_FALSE(im.get_premultiplied());
+
+ // Always fails on demultiply since its gray8
+ CHECK_FALSE(mapnik::demultiply_alpha(im));
+ CHECK_FALSE(mapnik::demultiply_alpha(im_any));
+ CHECK_FALSE(mapnik::demultiply_alpha(im2));
+ CHECK_FALSE(mapnik::demultiply_alpha(im2_any));
+
+ // Always fails on premultiply since its gray8
+ CHECK_FALSE(mapnik::premultiply_alpha(im));
+ CHECK_FALSE(mapnik::premultiply_alpha(im_any));
+ CHECK_FALSE(mapnik::premultiply_alpha(im2));
+ CHECK_FALSE(mapnik::premultiply_alpha(im2_any));
+
+} // END SECTION
+} // END TEST_CASE
diff --git a/test/unit/imaging/image_view.cpp b/test/unit/imaging/image_view.cpp
new file mode 100644
index 0000000..dac7644
--- /dev/null
+++ b/test/unit/imaging/image_view.cpp
@@ -0,0 +1,281 @@
+#include "catch.hpp"
+
+// mapnik
+#include <mapnik/image_any.hpp>
+#include <mapnik/color.hpp>
+#include <mapnik/image_view_any.hpp>
+#include <mapnik/image_util.hpp>
+
+TEST_CASE("image view") {
+
+SECTION("test rgba8") {
+
+ mapnik::image_rgba8 im(4,4);
+ mapnik::color c_red("red");
+ mapnik::color c_blue("blue");
+ mapnik::color c_green("green");
+ mapnik::color c_yellow("yellow");
+ mapnik::fill(im, c_red);
+ // Upper Left 2x2 is blue
+ mapnik::set_pixel(im, 0, 0, c_blue);
+ mapnik::set_pixel(im, 0, 1, c_blue);
+ mapnik::set_pixel(im, 1, 0, c_blue);
+ mapnik::set_pixel(im, 1, 1, c_blue);
+ // Upper Right 2x2 is green
+ mapnik::set_pixel(im, 2, 0, c_green);
+ mapnik::set_pixel(im, 2, 1, c_green);
+ mapnik::set_pixel(im, 3, 0, c_green);
+ mapnik::set_pixel(im, 3, 1, c_green);
+ // Lower Left 2x2 is yellow
+ mapnik::set_pixel(im, 0, 2, c_yellow);
+ mapnik::set_pixel(im, 0, 3, c_yellow);
+ mapnik::set_pixel(im, 1, 2, c_yellow);
+ mapnik::set_pixel(im, 1, 3, c_yellow);
+
+ mapnik::image_rgba8 im2(5,5);
+ mapnik::fill(im2, c_red);
+
+ // Now that we have test data run tests
+ mapnik::image_view_rgba8 view_all(0,0,4,4,im);
+ mapnik::image_view_rgba8 view_blue(0,0,2,2,im);
+ mapnik::image_view_rgba8 view_green(2,0,2,2,im);
+ mapnik::image_view_rgba8 view_yellow(0,2,2,2,im);
+ mapnik::image_view_rgba8 view_red(2,2,2,2,im);
+ mapnik::image_view_rgba8 view_bad(99,99,99,99,im);
+ const mapnik::image_view_rgba8 view_all_2(0,0,4,4,im2);
+
+ // Check that image_views all have the same underlying data
+ CHECK(view_all == view_blue);
+ CHECK(view_all == view_green);
+ CHECK(view_all == view_yellow);
+ CHECK(view_all == view_red);
+
+ CHECK(view_all.data() == im);
+
+ // Check that view_all and view_all_2 are not the same underlying data
+ CHECK_FALSE(view_all == view_all_2);
+ CHECK(view_all < view_all_2);
+
+ // Check that copy constructor works
+ mapnik::image_view_rgba8 view_all_3(view_all_2);
+ CHECK(view_all_2 == view_all_3);
+
+ // Check other constructor
+ mapnik::image_view_rgba8 view_all_4(std::move(view_all_3));
+ CHECK(view_all_2 == view_all_4);
+
+ // Check that x offset is correct
+ CHECK(view_all.x() == 0);
+ CHECK(view_blue.x() == 0);
+ CHECK(view_green.x() == 2);
+ CHECK(view_yellow.x() == 0);
+ CHECK(view_red.x() == 2);
+ CHECK(view_bad.x() == 3);
+
+ // Check that y offset is correct
+ CHECK(view_all.y() == 0);
+ CHECK(view_blue.y() == 0);
+ CHECK(view_green.y() == 0);
+ CHECK(view_yellow.y() == 2);
+ CHECK(view_red.y() == 2);
+ CHECK(view_bad.y() == 3);
+
+ // Check that width is correct
+ CHECK(view_all.width() == 4);
+ CHECK(view_blue.width() == 2);
+ CHECK(view_green.width() == 2);
+ CHECK(view_yellow.width() == 2);
+ CHECK(view_red.width() == 2);
+ CHECK(view_bad.width() == 1);
+
+ // Check that height is correct
+ CHECK(view_all.height() == 4);
+ CHECK(view_blue.height() == 2);
+ CHECK(view_green.height() == 2);
+ CHECK(view_yellow.height() == 2);
+ CHECK(view_red.height() == 2);
+ CHECK(view_bad.height() == 1);
+
+ // Check that size is correct
+ CHECK(view_all.size() == 64);
+ CHECK(view_blue.size() == 16);
+ CHECK(view_green.size() == 16);
+ CHECK(view_yellow.size() == 16);
+ CHECK(view_red.size() == 16);
+
+ // Check that row_size is correct
+ CHECK(view_all.row_size() == 16);
+ CHECK(view_blue.row_size() == 8);
+ CHECK(view_green.row_size() == 8);
+ CHECK(view_yellow.row_size() == 8);
+ CHECK(view_red.row_size() == 8);
+
+ // Check that get_premultiplied is correct
+ CHECK_FALSE(view_all.get_premultiplied());
+ CHECK_FALSE(view_blue.get_premultiplied());
+ CHECK_FALSE(view_green.get_premultiplied());
+ CHECK_FALSE(view_yellow.get_premultiplied());
+ CHECK_FALSE(view_red.get_premultiplied());
+
+ // Check that operator to retrieve value works properly
+ CHECK(view_all(0,0) == c_blue.rgba());
+ CHECK(view_blue(0,0) == c_blue.rgba());
+ CHECK(view_green(0,0) == c_green.rgba());
+ CHECK(view_yellow(0,0) == c_yellow.rgba());
+ CHECK(view_red.row_size() == 8);
+
+ // Check that offset is correct
+ CHECK(view_all.get_offset() == 0.0);
+ CHECK(view_blue.get_offset() == 0.0);
+ CHECK(view_green.get_offset() == 0.0);
+ CHECK(view_yellow.get_offset() == 0.0);
+ CHECK(view_red.get_offset() == 0.0);
+
+ // Check that scaling is correct
+ CHECK(view_all.get_scaling() == 1.0);
+ CHECK(view_blue.get_scaling() == 1.0);
+ CHECK(view_green.get_scaling() == 1.0);
+ CHECK(view_yellow.get_scaling() == 1.0);
+ CHECK(view_red.get_scaling() == 1.0);
+
+ // CHECK that image dtype is correct
+ CHECK(view_all.get_dtype() == mapnik::image_dtype_rgba8);
+ CHECK(view_blue.get_dtype() == mapnik::image_dtype_rgba8);
+ CHECK(view_green.get_dtype() == mapnik::image_dtype_rgba8);
+ CHECK(view_yellow.get_dtype() == mapnik::image_dtype_rgba8);
+ CHECK(view_red.get_dtype() == mapnik::image_dtype_rgba8);
+
+ unsigned expected_val;
+ using pixel_type = mapnik::image_view_rgba8::pixel_type;
+ // Check that all data in the view is correct
+ // Blue
+ expected_val = c_blue.rgba();
+ for (std::size_t y = 0; y < view_blue.height(); ++y)
+ {
+ std::size_t width = view_blue.width();
+ pixel_type const* data_1 = view_blue.get_row(y);
+ pixel_type const* data_2 = view_blue.get_row(y, 1);
+ for (std::size_t x = 0; x < width; ++x)
+ {
+ CHECK(*data_1 == expected_val);
+ ++data_1;
+ }
+ for (std::size_t x = 1; x < width; ++x)
+ {
+ CHECK(*data_2 == expected_val);
+ ++data_2;
+ }
+ }
+ // Green
+ expected_val = c_green.rgba();
+ for (std::size_t y = 0; y < view_green.height(); ++y)
+ {
+ std::size_t width = view_green.width();
+ pixel_type const* data_1 = view_green.get_row(y);
+ pixel_type const* data_2 = view_green.get_row(y, 1);
+ for (std::size_t x = 0; x < width; ++x)
+ {
+ CHECK(*data_1 == expected_val);
+ ++data_1;
+ }
+ for (std::size_t x = 1; x < width; ++x)
+ {
+ CHECK(*data_2 == expected_val);
+ ++data_2;
+ }
+ }
+ // Yellow
+ expected_val = c_yellow.rgba();
+ for (std::size_t y = 0; y < view_yellow.height(); ++y)
+ {
+ std::size_t width = view_yellow.width();
+ pixel_type const* data_1 = view_yellow.get_row(y);
+ pixel_type const* data_2 = view_yellow.get_row(y, 1);
+ for (std::size_t x = 0; x < width; ++x)
+ {
+ CHECK(*data_1 == expected_val);
+ ++data_1;
+ }
+ for (std::size_t x = 1; x < width; ++x)
+ {
+ CHECK(*data_2 == expected_val);
+ ++data_2;
+ }
+ }
+ // Red
+ expected_val = c_red.rgba();
+ for (std::size_t y = 0; y < view_red.height(); ++y)
+ {
+ std::size_t width = view_red.width();
+ pixel_type const* data_1 = view_red.get_row(y);
+ pixel_type const* data_2 = view_red.get_row(y, 1);
+ for (std::size_t x = 0; x < width; ++x)
+ {
+ CHECK(*data_1 == expected_val);
+ ++data_1;
+ }
+ for (std::size_t x = 1; x < width; ++x)
+ {
+ CHECK(*data_2 == expected_val);
+ ++data_2;
+ }
+ }
+
+} // END SECTION
+
+SECTION("image_view_null")
+{
+ mapnik::image_view_null view_null;
+ const mapnik::image_view_null view_null2;
+ mapnik::image_view_null view_null3(view_null2);
+ mapnik::image_view_null & view_null4 = view_null3;
+
+ // All nulls are equal
+ CHECK(view_null == view_null4);
+ CHECK(view_null == view_null2);
+
+ // No null is greater
+ CHECK_FALSE(view_null < view_null4);
+ CHECK_FALSE(view_null < view_null2);
+
+ // Check defaults
+ CHECK(view_null.x() == 0);
+ CHECK(view_null.y() == 0);
+ CHECK(view_null.width() == 0);
+ CHECK(view_null.height() == 0);
+ CHECK(view_null.size() == 0);
+ CHECK(view_null.row_size() == 0);
+ CHECK(view_null.get_offset() == 0.0);
+ CHECK(view_null.get_scaling() == 1.0);
+ CHECK(view_null.get_dtype() == mapnik::image_dtype_null);
+ CHECK_FALSE(view_null.get_premultiplied());
+
+ // Should throw if we try to access data.
+ REQUIRE_THROWS(view_null(0,0));
+
+ CHECK(view_null.get_row(0) == nullptr);
+ CHECK(view_null.get_row(0,0) == nullptr);
+
+} // END SECTION
+
+SECTION("image view any")
+{
+ mapnik::image_view_any im_any_null;
+ CHECK(im_any_null.get_dtype() == mapnik::image_dtype_null);
+
+ mapnik::image_gray8 im(4,4);
+ mapnik::image_view_gray8 im_view(0,0,4,4,im);
+ mapnik::image_view_any im_view_any(im_view);
+
+ CHECK(im_view_any.get_dtype() == mapnik::image_dtype_gray8);
+ CHECK(im_view_any.width() == 4);
+ CHECK(im_view_any.height() == 4);
+ CHECK(im_view_any.size() == 16);
+ CHECK(im_view_any.row_size() == 4);
+ CHECK_FALSE(im_view_any.get_premultiplied());
+ CHECK(im_view_any.get_offset() == 0.0);
+ CHECK(im_view_any.get_scaling() == 1.0);
+
+} // END SECTION
+
+} // END TEST CASE
diff --git a/test/unit/imaging/tiff_io.cpp b/test/unit/imaging/tiff_io.cpp
new file mode 100644
index 0000000..badf830
--- /dev/null
+++ b/test/unit/imaging/tiff_io.cpp
@@ -0,0 +1,283 @@
+
+#if defined(HAVE_TIFF)
+
+#include "catch.hpp"
+
+#include <mapnik/image_reader.hpp>
+#include <mapnik/image_util.hpp>
+#include <mapnik/util/file_io.hpp>
+
+#include <mapnik/tiff_io.hpp>
+#include "../../../src/tiff_reader.cpp"
+
+#define TIFF_ASSERT(filename) \
+ mapnik::tiff_reader<boost::iostreams::file_source> tiff_reader(filename); \
+ REQUIRE( tiff_reader.width() == 256 ); \
+ REQUIRE( tiff_reader.height() == 256 ); \
+ REQUIRE( tiff_reader.planar_config() == PLANARCONFIG_CONTIG ); \
+ std::unique_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(filename,"tiff")); \
+ REQUIRE( reader->width() == 256 ); \
+ REQUIRE( reader->height() == 256 ); \
+ mapnik::util::file file(filename); \
+ mapnik::tiff_reader<boost::iostreams::array_source> tiff_reader2(file.data().get(),file.size()); \
+ REQUIRE( tiff_reader2.width() == 256 ); \
+ REQUIRE( tiff_reader2.height() == 256 ); \
+ std::unique_ptr<mapnik::image_reader> reader2(mapnik::get_image_reader(file.data().get(),file.size())); \
+ REQUIRE( reader2->width() == 256 ); \
+ REQUIRE( reader2->height() == 256 ); \
+
+#define TIFF_ASSERT_ALPHA( data ) \
+ REQUIRE( tiff_reader.has_alpha() == true ); \
+ REQUIRE( reader->has_alpha() == true ); \
+ REQUIRE( tiff_reader2.has_alpha() == true ); \
+ REQUIRE( reader2->has_alpha() == true ); \
+ REQUIRE( data.get_premultiplied() == true ); \
+
+#define TIFF_ASSERT_NO_ALPHA_RGB( data ) \
+ REQUIRE( tiff_reader.has_alpha() == false ); \
+ REQUIRE( reader->has_alpha() == false ); \
+ REQUIRE( tiff_reader2.has_alpha() == false ); \
+ REQUIRE( reader2->has_alpha() == false ); \
+ REQUIRE( data.get_premultiplied() == true ); \
+
+#define TIFF_ASSERT_NO_ALPHA_GRAY( data ) \
+ REQUIRE( tiff_reader.has_alpha() == false ); \
+ REQUIRE( reader->has_alpha() == false ); \
+ REQUIRE( tiff_reader2.has_alpha() == false ); \
+ REQUIRE( reader2->has_alpha() == false ); \
+ REQUIRE( data.get_premultiplied() == false ); \
+
+#define TIFF_ASSERT_SIZE( data,reader ) \
+ REQUIRE( data.width() == reader->width() ); \
+ REQUIRE( data.height() == reader->height() ); \
+
+#define TIFF_READ_ONE_PIXEL \
+ mapnik::image_any subimage = reader->read(1, 1, 1, 1); \
+ REQUIRE( subimage.width() == 1 ); \
+ REQUIRE( subimage.height() == 1 ); \
+
+TEST_CASE("tiff io") {
+
+SECTION("scan rgb8 striped") {
+ std::string filename("./test/data/tiff/scan_512x512_rgb8_striped.tif");
+ mapnik::tiff_reader<boost::iostreams::file_source> tiff_reader(filename);
+ REQUIRE( tiff_reader.width() == 512 );
+ REQUIRE( tiff_reader.height() == 512 );
+ REQUIRE( tiff_reader.planar_config() == PLANARCONFIG_CONTIG );
+ REQUIRE( tiff_reader.rows_per_strip() == 16 );
+ REQUIRE( tiff_reader.bits_per_sample() == 8 );
+ REQUIRE( tiff_reader.is_tiled() == false );
+ REQUIRE( tiff_reader.tile_width() == 0 );
+ REQUIRE( tiff_reader.tile_height() == 0 );
+ REQUIRE( tiff_reader.photometric() == PHOTOMETRIC_PALETTE );
+ REQUIRE( tiff_reader.compression() == COMPRESSION_NONE );
+ std::unique_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(filename,"tiff"));
+ REQUIRE( reader->width() == 512 );
+ REQUIRE( reader->height() == 512 );
+ mapnik::util::file file(filename);
+ mapnik::tiff_reader<boost::iostreams::array_source> tiff_reader2(file.data().get(),file.size());
+ REQUIRE( tiff_reader2.width() == 512 );
+ REQUIRE( tiff_reader2.height() == 512 );
+ std::unique_ptr<mapnik::image_reader> reader2(mapnik::get_image_reader(file.data().get(),file.size()));
+ REQUIRE( reader2->width() == 512 );
+ REQUIRE( reader2->height() == 512 );
+ mapnik::image_any data = reader->read(0, 0, reader->width(), reader->height());
+ REQUIRE( data.is<mapnik::image_rgba8>() == true );
+ TIFF_ASSERT_SIZE( data,reader );
+ TIFF_ASSERT_NO_ALPHA_RGB( data );
+ TIFF_READ_ONE_PIXEL
+}
+
+SECTION("scan rgb8 tiled") {
+ std::string filename("./test/data/tiff/scan_512x512_rgb8_tiled.tif");
+ mapnik::tiff_reader<boost::iostreams::file_source> tiff_reader(filename);
+ REQUIRE( tiff_reader.width() == 512 );
+ REQUIRE( tiff_reader.height() == 512 );
+ REQUIRE( tiff_reader.planar_config() == PLANARCONFIG_CONTIG );
+ REQUIRE( tiff_reader.rows_per_strip() == 0 );
+ REQUIRE( tiff_reader.bits_per_sample() == 8 );
+ REQUIRE( tiff_reader.is_tiled() == true );
+ REQUIRE( tiff_reader.tile_width() == 256 );
+ REQUIRE( tiff_reader.tile_height() == 256 );
+ REQUIRE( tiff_reader.photometric() == PHOTOMETRIC_PALETTE );
+ REQUIRE( tiff_reader.compression() == COMPRESSION_LZW );
+ std::unique_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(filename,"tiff"));
+ REQUIRE( reader->width() == 512 );
+ REQUIRE( reader->height() == 512 );
+ mapnik::util::file file(filename);
+ mapnik::tiff_reader<boost::iostreams::array_source> tiff_reader2(file.data().get(),file.size());
+ REQUIRE( tiff_reader2.width() == 512 );
+ REQUIRE( tiff_reader2.height() == 512 );
+ std::unique_ptr<mapnik::image_reader> reader2(mapnik::get_image_reader(file.data().get(),file.size()));
+ REQUIRE( reader2->width() == 512 );
+ REQUIRE( reader2->height() == 512 );
+ mapnik::image_any data = reader->read(0, 0, reader->width(), reader->height());
+ REQUIRE( data.is<mapnik::image_rgba8>() == true );
+ TIFF_ASSERT_SIZE( data,reader );
+ TIFF_ASSERT_NO_ALPHA_RGB( data );
+ TIFF_READ_ONE_PIXEL
+}
+
+SECTION("rgba8 striped") {
+ TIFF_ASSERT("./test/data/tiff/ndvi_256x256_rgba8_striped.tif")
+ REQUIRE( tiff_reader.rows_per_strip() == 1 );
+ REQUIRE( tiff_reader.bits_per_sample() == 8 );
+ REQUIRE( tiff_reader.is_tiled() == false );
+ REQUIRE( tiff_reader.tile_width() == 0 );
+ REQUIRE( tiff_reader.tile_height() == 0 );
+ REQUIRE( tiff_reader.photometric() == PHOTOMETRIC_RGB );
+ REQUIRE( tiff_reader.compression() == COMPRESSION_ADOBE_DEFLATE );
+ mapnik::image_any data = reader->read(0, 0, reader->width(), reader->height());
+ REQUIRE( data.is<mapnik::image_rgba8>() == true );
+ TIFF_ASSERT_SIZE( data,reader );
+ TIFF_ASSERT_ALPHA( data );
+ TIFF_READ_ONE_PIXEL
+}
+
+SECTION("rgba8 tiled") {
+ TIFF_ASSERT("./test/data/tiff/ndvi_256x256_rgba8_tiled.tif")
+ REQUIRE( tiff_reader.rows_per_strip() == 0 );
+ REQUIRE( tiff_reader.bits_per_sample() == 8 );
+ REQUIRE( tiff_reader.is_tiled() == true );
+ REQUIRE( tiff_reader.tile_width() == 256 );
+ REQUIRE( tiff_reader.tile_height() == 256 );
+ REQUIRE( tiff_reader.photometric() == PHOTOMETRIC_RGB );
+ REQUIRE( tiff_reader.compression() == COMPRESSION_LZW );
+ mapnik::image_any data = reader->read(0, 0, reader->width(), reader->height());
+ REQUIRE( data.is<mapnik::image_rgba8>() == true );
+ TIFF_ASSERT_SIZE( data,reader );
+ TIFF_ASSERT_ALPHA( data );
+ TIFF_READ_ONE_PIXEL
+}
+
+SECTION("rgb8 striped") {
+ TIFF_ASSERT("./test/data/tiff/ndvi_256x256_rgb8_striped.tif")
+ REQUIRE( tiff_reader.rows_per_strip() == 10 );
+ REQUIRE( tiff_reader.bits_per_sample() == 8 );
+ REQUIRE( tiff_reader.is_tiled() == false );
+ REQUIRE( tiff_reader.tile_width() == 0 );
+ REQUIRE( tiff_reader.tile_height() == 0 );
+ REQUIRE( tiff_reader.photometric() == PHOTOMETRIC_RGB );
+ REQUIRE( tiff_reader.compression() == COMPRESSION_NONE );
+ mapnik::image_any data = reader->read(0, 0, reader->width(), reader->height());
+ REQUIRE( data.is<mapnik::image_rgba8>() == true );
+ TIFF_ASSERT_SIZE( data,reader );
+ TIFF_ASSERT_NO_ALPHA_RGB( data );
+ TIFF_READ_ONE_PIXEL
+}
+
+SECTION("rgb8 tiled") {
+ TIFF_ASSERT("./test/data/tiff/ndvi_256x256_rgb8_tiled.tif")
+ REQUIRE( tiff_reader.rows_per_strip() == 0 );
+ REQUIRE( tiff_reader.bits_per_sample() == 8 );
+ REQUIRE( tiff_reader.is_tiled() == true );
+ REQUIRE( tiff_reader.tile_width() == 256 );
+ REQUIRE( tiff_reader.tile_height() == 256 );
+ REQUIRE( tiff_reader.photometric() == PHOTOMETRIC_RGB );
+ REQUIRE( tiff_reader.compression() == COMPRESSION_LZW );
+ mapnik::image_any data = reader->read(0, 0, reader->width(), reader->height());
+ REQUIRE( data.is<mapnik::image_rgba8>() == true );
+ TIFF_ASSERT_SIZE( data,reader );
+ TIFF_ASSERT_NO_ALPHA_RGB( data );
+ TIFF_READ_ONE_PIXEL
+}
+
+SECTION("gray8 striped") {
+ TIFF_ASSERT("./test/data/tiff/ndvi_256x256_gray8_striped.tif")
+ REQUIRE( tiff_reader.rows_per_strip() == 32 );
+ REQUIRE( tiff_reader.bits_per_sample() == 8 );
+ REQUIRE( tiff_reader.is_tiled() == false );
+ REQUIRE( tiff_reader.tile_width() == 0 );
+ REQUIRE( tiff_reader.tile_height() == 0 );
+ REQUIRE( tiff_reader.photometric() == PHOTOMETRIC_MINISBLACK );
+ REQUIRE( tiff_reader.compression() == COMPRESSION_NONE );
+ mapnik::image_any data = reader->read(0, 0, reader->width(), reader->height());
+ REQUIRE( data.is<mapnik::image_gray8>() == true );
+ TIFF_ASSERT_SIZE( data,reader );
+ TIFF_ASSERT_NO_ALPHA_GRAY( data );
+ TIFF_READ_ONE_PIXEL
+}
+
+SECTION("gray8 tiled") {
+ TIFF_ASSERT("./test/data/tiff/ndvi_256x256_gray8_tiled.tif")
+ REQUIRE( tiff_reader.rows_per_strip() == 0 );
+ REQUIRE( tiff_reader.bits_per_sample() == 8 );
+ REQUIRE( tiff_reader.is_tiled() == true );
+ REQUIRE( tiff_reader.tile_width() == 256 );
+ REQUIRE( tiff_reader.tile_height() == 256 );
+ REQUIRE( tiff_reader.photometric() == PHOTOMETRIC_MINISBLACK );
+ REQUIRE( tiff_reader.compression() == COMPRESSION_LZW );
+ mapnik::image_any data = reader->read(0, 0, reader->width(), reader->height());
+ REQUIRE( data.is<mapnik::image_gray8>() == true );
+ TIFF_ASSERT_SIZE( data,reader );
+ TIFF_ASSERT_NO_ALPHA_GRAY( data );
+ TIFF_READ_ONE_PIXEL
+}
+
+SECTION("gray16 striped") {
+ TIFF_ASSERT("./test/data/tiff/ndvi_256x256_gray16_striped.tif")
+ REQUIRE( tiff_reader.rows_per_strip() == 16 );
+ REQUIRE( tiff_reader.bits_per_sample() == 16 );
+ REQUIRE( tiff_reader.is_tiled() == false );
+ REQUIRE( tiff_reader.tile_width() == 0 );
+ REQUIRE( tiff_reader.tile_height() == 0 );
+ REQUIRE( tiff_reader.photometric() == PHOTOMETRIC_MINISBLACK );
+ REQUIRE( tiff_reader.compression() == COMPRESSION_NONE );
+ mapnik::image_any data = reader->read(0, 0, reader->width(), reader->height());
+ REQUIRE( data.is<mapnik::image_gray16>() == true );
+ TIFF_ASSERT_SIZE( data,reader );
+ TIFF_ASSERT_NO_ALPHA_GRAY( data );
+ TIFF_READ_ONE_PIXEL
+}
+
+SECTION("gray16 tiled") {
+ TIFF_ASSERT("./test/data/tiff/ndvi_256x256_gray16_tiled.tif")
+ REQUIRE( tiff_reader.rows_per_strip() == 0 );
+ REQUIRE( tiff_reader.bits_per_sample() == 16 );
+ REQUIRE( tiff_reader.is_tiled() == true );
+ REQUIRE( tiff_reader.tile_width() == 256 );
+ REQUIRE( tiff_reader.tile_height() == 256 );
+ REQUIRE( tiff_reader.photometric() == PHOTOMETRIC_MINISBLACK );
+ REQUIRE( tiff_reader.compression() == COMPRESSION_LZW );
+ mapnik::image_any data = reader->read(0, 0, reader->width(), reader->height());
+ REQUIRE( data.is<mapnik::image_gray16>() == true );
+ TIFF_ASSERT_SIZE( data,reader );
+ TIFF_ASSERT_NO_ALPHA_GRAY( data );
+ TIFF_READ_ONE_PIXEL
+}
+
+SECTION("gray32f striped") {
+ TIFF_ASSERT("./test/data/tiff/ndvi_256x256_gray32f_striped.tif")
+ REQUIRE( tiff_reader.rows_per_strip() == 8 );
+ REQUIRE( tiff_reader.bits_per_sample() == 32 );
+ REQUIRE( tiff_reader.is_tiled() == false );
+ REQUIRE( tiff_reader.tile_width() == 0 );
+ REQUIRE( tiff_reader.tile_height() == 0 );
+ REQUIRE( tiff_reader.photometric() == PHOTOMETRIC_MINISBLACK );
+ REQUIRE( tiff_reader.compression() == COMPRESSION_NONE );
+ mapnik::image_any data = reader->read(0, 0, reader->width(), reader->height());
+ REQUIRE( data.is<mapnik::image_gray32f>() == true );
+ TIFF_ASSERT_SIZE( data,reader );
+ TIFF_ASSERT_NO_ALPHA_GRAY( data );
+ TIFF_READ_ONE_PIXEL
+}
+
+SECTION("gray32f tiled") {
+ TIFF_ASSERT("./test/data/tiff/ndvi_256x256_gray32f_tiled.tif")
+ REQUIRE( tiff_reader.rows_per_strip() == 0 );
+ REQUIRE( tiff_reader.bits_per_sample() == 32 );
+ REQUIRE( tiff_reader.is_tiled() == true );
+ REQUIRE( tiff_reader.tile_width() == 256 );
+ REQUIRE( tiff_reader.tile_height() == 256 );
+ REQUIRE( tiff_reader.photometric() == PHOTOMETRIC_MINISBLACK );
+ REQUIRE( tiff_reader.compression() == COMPRESSION_LZW );
+ mapnik::image_any data = reader->read(0, 0, reader->width(), reader->height());
+ REQUIRE( data.is<mapnik::image_gray32f>() == true );
+ TIFF_ASSERT_SIZE( data,reader );
+ TIFF_ASSERT_NO_ALPHA_GRAY( data );
+ TIFF_READ_ONE_PIXEL
+}
+
+}
+
+#endif
diff --git a/test/unit/pixel/agg_blend_src_over_test.cpp b/test/unit/pixel/agg_blend_src_over_test.cpp
new file mode 100644
index 0000000..235a230
--- /dev/null
+++ b/test/unit/pixel/agg_blend_src_over_test.cpp
@@ -0,0 +1,209 @@
+#include "catch.hpp"
+
+#include <iostream>
+#include <cstdio>
+#include <cstring>
+#include <sstream>
+#include <string>
+#include <vector>
+#include <algorithm>
+#include "agg_color_rgba.h"
+#include "agg_pixfmt_rgba.h"
+#include "agg_rendering_buffer.h"
+#include "agg_renderer_base.h"
+
+using color = agg::rgba8;
+using order = agg::order_rgba;
+
+std::string to_string(color const& c)
+{
+ std::ostringstream s;
+ s << "rgba(" << (unsigned)c.r << "," << (unsigned)c.g << "," << (unsigned)c.b << "," << (unsigned)c.a << ")";
+ return s.str();
+}
+
+template<typename blender>
+color blend(color const& source, color const& dest, unsigned cover=255)
+{
+ unsigned stride = 4;
+ unsigned size = 1;
+
+ color source_pre = source;
+ source_pre.premultiply();
+ color dest_pre = dest;
+ dest_pre.premultiply();
+
+ unsigned char* buffer = new unsigned char[size*size*stride];
+ std::memset(buffer, 0, size*size*stride);
+ buffer[0] = dest_pre.r;
+ buffer[1] = dest_pre.g;
+ buffer[2] = dest_pre.b;
+ buffer[3] = dest_pre.a;
+ // http://www.antigrain.com/doc/basic_renderers/basic_renderers.agdoc.html
+ agg::rendering_buffer rbuf(buffer,
+ size,
+ size,
+ size * stride);
+ color::value_type* psource = (color::value_type*)rbuf.row_ptr(0,0,1);
+ blender::blend_pix(psource,source_pre.r,source_pre.g,source_pre.b,source_pre.a,cover);
+ color color_result(psource[0],psource[1],psource[2],psource[3]);
+ color_result.demultiply();
+ delete [] buffer;
+ return color_result;
+}
+
+// agg::pixfmt_alpha_blend_rgba
+color normal_blend(color const& source, color const& dest, unsigned cover=255)
+{
+ using renderer_type = agg::renderer_base<agg::pixfmt_rgba32_pre>;
+ unsigned stride = 4;
+ unsigned size = 1;
+ color source_pre = source;
+ source_pre.premultiply();
+ color dest_pre = dest;
+ dest_pre.premultiply();
+ // source buffer
+ unsigned char* source_buffer = new unsigned char[size*size*stride];
+ std::memset(source_buffer, 0, size*size*stride);
+ source_buffer[0] = source_pre.r;
+ source_buffer[1] = source_pre.g;
+ source_buffer[2] = source_pre.b;
+ source_buffer[3] = source_pre.a;
+ agg::rendering_buffer source_rbuffer(source_buffer,size,size,size * 4);
+ agg::pixfmt_rgba32_pre pixf_source(source_rbuffer);
+
+ // destination buffer
+ unsigned char* dest_buffer = new unsigned char[size*size*stride];
+ std::memset(dest_buffer, 0, size*size*stride);
+ dest_buffer[0] = dest_pre.r;
+ dest_buffer[1] = dest_pre.g;
+ dest_buffer[2] = dest_pre.b;
+ dest_buffer[3] = dest_pre.a;
+ agg::rendering_buffer dest_rbuffer(dest_buffer,size,size,size * 4);
+ agg::pixfmt_rgba32_pre pixf_dest(dest_rbuffer);
+
+ // renderer: blends source into destination
+ renderer_type ren(pixf_dest);
+ ren.blend_from(pixf_source,0,0,0,cover);
+ color color_result(dest_buffer[0],dest_buffer[1],dest_buffer[2],dest_buffer[3]);
+ color_result.demultiply();
+ delete [] source_buffer;
+ delete [] dest_buffer;
+ return color_result;
+}
+
+
+
+namespace agg {
+
+// the original agg template code for src_over
+// before we changed A as per https://github.com/mapnik/mapnik/issues/1452
+template<class ColorT, class Order> struct comp_op_rgba_src_over2
+{
+ using color_type = ColorT;
+ using order_type = Order;
+ using value_type = typename color_type::value_type;
+ using calc_type = typename color_type::calc_type;
+ enum base_scale_e
+ {
+ base_shift = color_type::base_shift,
+ base_mask = color_type::base_mask
+ };
+
+ // Dca' = Sca + Dca.(1 - Sa)
+ // Da' = Sa + Da - Sa.Da
+ static void blend_pix(value_type* p,
+ unsigned sr, unsigned sg, unsigned sb,
+ unsigned sa, unsigned cover)
+ {
+ if(cover < 255)
+ {
+ sr = (sr * cover + 255) >> 8;
+ sg = (sg * cover + 255) >> 8;
+ sb = (sb * cover + 255) >> 8;
+ sa = (sa * cover + 255) >> 8;
+ }
+ calc_type s1a = base_mask - sa;
+ p[Order::R] = (value_type)(sr + ((p[Order::R] * s1a + base_mask) >> base_shift));
+ p[Order::G] = (value_type)(sg + ((p[Order::G] * s1a + base_mask) >> base_shift));
+ p[Order::B] = (value_type)(sb + ((p[Order::B] * s1a + base_mask) >> base_shift));
+ p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift));
+ }
+};
+
+}
+
+TEST_CASE("blending") {
+
+SECTION("src over") {
+
+ using source_over_old_agg = agg::comp_op_rgba_src_over2<color, agg::order_rgba>;
+ using source_over = agg::comp_op_rgba_src_over<color, agg::order_rgba>;
+
+ try
+ {
+ color white(255,255,255,255);
+ color black(0,0,0,255);
+
+ REQUIRE( to_string(blend<source_over>(white,white)) == to_string(white) );
+ REQUIRE( to_string(blend<source_over>(white,black)) == to_string(white) );
+ REQUIRE( to_string(blend<source_over>(black,white)) == to_string(black) );
+
+ color near_white(254,254,254,254); // Source
+ color near_trans(1,1,1,1); // Dest
+ color expected_color(253,253,253,255); // expected result
+ REQUIRE( to_string(blend<source_over_old_agg>(near_white,near_trans)) == to_string(color(253,253,253,254)) );
+ REQUIRE( to_string(blend<source_over>(near_white,near_trans)) == to_string(expected_color) );
+ REQUIRE( to_string(normal_blend(near_white,near_trans)) == to_string(expected_color) );
+
+ // using normal_blend as expected, compare a variety of other colors
+
+ {
+ color source(128,128,128,255);
+ color dest(128,128,128,255);
+ unsigned cover = 128;
+ std::string expected_str = to_string(normal_blend(source,dest,cover));
+ REQUIRE( to_string(blend<source_over>(source,dest,cover)) == expected_str );
+ REQUIRE( to_string(blend<source_over_old_agg>(source,dest,cover)) == expected_str );
+ }
+
+ {
+ color source(128,128,128,255);
+ color dest(128,128,128,255);
+ unsigned cover = 245;
+ std::string expected_str = to_string(normal_blend(source,dest,cover));
+ REQUIRE( to_string(blend<source_over>(source,dest,cover)) == expected_str );
+ REQUIRE( to_string(blend<source_over_old_agg>(source,dest,cover)) == expected_str );
+ }
+
+ // commenting until I study these failures more (dane)
+ /*
+ {
+ // fails, why?
+ color source(127,127,127,127);
+ color dest(127,127,127,127);
+ unsigned cover = 255;
+ std::string expected_str = to_string(normal_blend(source,dest,cover));
+ REQUIRE( to_string(blend<source_over>(source,dest,cover)) == expected_str );
+ REQUIRE( to_string(blend<source_over_old_agg>(source,dest,cover)) == expected_str );
+ }
+
+ {
+ // fails, why?
+ color source(128,128,128,128);
+ color dest(128,128,128,128);
+ unsigned cover = 128;
+ std::string expected_str = to_string(normal_blend(source,dest,cover));
+ REQUIRE( to_string(blend<source_over>(source,dest,cover)) == expected_str );
+ REQUIRE( to_string(blend<source_over_old_agg>(source,dest,cover)) == expected_str );
+ }
+ */
+ }
+ catch (std::exception const & ex)
+ {
+ std::clog << ex.what() << "\n";
+ REQUIRE(false);
+ }
+}
+
+}
diff --git a/test/unit/pixel/palette.cpp b/test/unit/pixel/palette.cpp
new file mode 100644
index 0000000..c45d068
--- /dev/null
+++ b/test/unit/pixel/palette.cpp
@@ -0,0 +1,89 @@
+#include "catch.hpp"
+
+#include <mapnik/palette.hpp>
+#include <fstream>
+#include <sstream>
+#include <string>
+#include <cerrno>
+
+std::string get_file_contents(std::string const& filename)
+{
+ std::ifstream in(filename.c_str(), std::ios::in | std::ios::binary);
+ if (in)
+ {
+ std::ostringstream contents;
+ contents << in.rdbuf();
+ in.close();
+ return(contents.str());
+ }
+ throw(errno);
+}
+
+TEST_CASE("palette")
+{
+
+SECTION("rgb")
+{
+ mapnik::rgb a(1,2,3);
+ mapnik::rgba b_(1,2,3,4);
+ mapnik::rgb b(b_);
+ mapnik::rgb c(3,4,5);
+ CHECK(a == b);
+ CHECK_FALSE(a == c);
+
+} // END SECTION
+
+
+SECTION("rgba")
+{
+ mapnik::rgba a(1,2,3,4);
+ mapnik::rgba a_copy(1,2,3,4);
+ mapnik::rgba b(255,255,255,255);
+ mapnik::rgba c(4,3,2,1);
+ mapnik::rgb d_(1,2,3);
+ mapnik::rgba d(d_);
+
+ mapnik::rgba e(16909060);
+
+ CHECK(e.r == 4);
+ CHECK(e.g == 3);
+ CHECK(e.b == 2);
+ CHECK(e.a == 1);
+
+ CHECK(a == a_copy);
+ CHECK_FALSE(a == c);
+ CHECK(c == e);
+
+ mapnik::rgba::mean_sort_cmp msc;
+
+ CHECK_FALSE(msc(a,a_copy));
+ CHECK(msc(a,b));
+ CHECK_FALSE(msc(a,c));
+ CHECK(msc(a,d));
+
+} // END SECTION
+
+SECTION("rgba palette - exceptions and bad palettes")
+{
+ REQUIRE_THROWS(mapnik::rgba_palette("foo"));
+ REQUIRE_THROWS(mapnik::rgba_palette("fooo", mapnik::rgba_palette::PALETTE_RGB));
+ REQUIRE_THROWS(mapnik::rgba_palette("foo", mapnik::rgba_palette::PALETTE_ACT));
+} // END SECTION
+
+SECTION("rgba palette - act pal_64")
+{
+ std::string pal_64 = get_file_contents("./test/data/palettes/palette64.act");
+ mapnik::rgba_palette rgba_pal(pal_64, mapnik::rgba_palette::PALETTE_ACT);
+ CHECK(rgba_pal.to_string() == "[Palette 64 colors #494746 #c37631 #89827c #d1955c #7397b9 #fc9237 #a09f9c #fbc147 #9bb3ce #b7c9a1 #b5d29c #c4b9aa #cdc4a5 #d5c8a3 #c1d7aa #ccc4b6 #dbd19c #b2c4d5 #eae487 #c9c8c6 #e4db99 #c9dcb5 #dfd3ac #cbd2c2 #d6cdbc #dbd2b6 #c0ceda #ece597 #f7ef86 #d7d3c3 #dfcbc3 #d1d0cd #d1e2bf #d3dec1 #dbd3c4 #e6d8b6 #f4ef91 #d3d3cf #cad5de #ded7c9 #dfdbce #fcf993 #ffff8a #dbd9d7 #dbe7cd #d4dce2 #e4ded3 #ebe3c9 #e0e2e2 #f4edc3 #fdfcae #e9e5dc #f4edda #eeebe4 #fefdc [...]
+
+} // END SECTION
+
+SECTION("rgba palette - act pal_256")
+{
+ std::string pal_ = get_file_contents("./test/data/palettes/palette256.act");
+ mapnik::rgba_palette rgba_pal(pal_, mapnik::rgba_palette::PALETTE_ACT);
+ CHECK(rgba_pal.to_string() == "[Palette 256 colors #272727 #3c3c3c #484847 #564b41 #605243 #6a523e #555555 #785941 #5d5d5d #746856 #676767 #956740 #ba712e #787777 #cb752a #c27c3d #b68049 #dc8030 #df9e10 #878685 #e1a214 #928b82 #a88a70 #ea8834 #e7a81d #cb8d55 #909090 #94938c #e18f48 #f68d36 #6f94b7 #e1ab2e #8e959b #c79666 #999897 #ff9238 #ef9447 #a99a88 #f1b32c #919ca6 #a1a09f #f0b04b #8aa4bf #f8bc39 #b3ac8f #d1a67a #e3b857 #a8a8a7 #ffc345 #a2adb9 #afaeab #f9ab69 #afbba4 #c4c48a #b4b2 [...]
+
+} // END SECTION
+
+} // END TEST CASE
diff --git a/test/unit/projection/proj_transform.cpp b/test/unit/projection/proj_transform.cpp
new file mode 100644
index 0000000..618b57d
--- /dev/null
+++ b/test/unit/projection/proj_transform.cpp
@@ -0,0 +1,38 @@
+#include "catch.hpp"
+
+#include <mapnik/projection.hpp>
+#include <mapnik/proj_transform.hpp>
+#include <mapnik/box2d.hpp>
+
+TEST_CASE("projection transform")
+{
+
+SECTION("Test bounding box transforms - 4326 to 3857")
+{
+ mapnik::projection proj_4326("+init=epsg:4326");
+ mapnik::projection proj_3857("+init=epsg:3857");
+ mapnik::proj_transform prj_trans(proj_4326, proj_3857);
+
+ double minx = -45.0;
+ double miny = 55.0;
+ double maxx = -40.0;
+ double maxy = 75.0;
+
+ mapnik::box2d<double> bbox(minx, miny, maxx, maxy);
+
+ prj_trans.forward(bbox);
+ INFO(bbox.to_string());
+ CHECK(bbox.minx() == Approx(-5009377.085697311));
+ CHECK(bbox.miny() == Approx(7361866.1130511891));
+ CHECK(bbox.maxx() == Approx(-4452779.631730943));
+ CHECK(bbox.maxy() == Approx(12932243.1119920239));
+
+ prj_trans.backward(bbox);
+ CHECK(bbox.minx() == Approx(minx));
+ CHECK(bbox.miny() == Approx(miny));
+ CHECK(bbox.maxx() == Approx(maxx));
+ CHECK(bbox.maxy() == Approx(maxy));
+
+} // END SECTION
+
+} // END TEST CASE
diff --git a/test/unit/run.cpp b/test/unit/run.cpp
new file mode 100644
index 0000000..74b0715
--- /dev/null
+++ b/test/unit/run.cpp
@@ -0,0 +1,36 @@
+#define CATCH_CONFIG_RUNNER
+#include "catch.hpp"
+
+#include <libxml/parser.h> // for xmlInitParser(), xmlCleanupParser()
+#include <cairo.h>
+#include <unicode/uclean.h>
+
+#ifdef MAPNIK_USE_PROJ4
+#include <proj_api.h>
+#endif
+
+int main (int argc, char* const argv[])
+{
+ int result = Catch::Session().run( argc, argv );
+ // only call this once, on exit
+ // to make sure valgrind output is clean
+ // http://xmlsoft.org/xmlmem.html
+ xmlCleanupParser();
+
+ // http://cairographics.org/manual/cairo-Error-handling.html#cairo-debug-reset-static-data
+ cairo_debug_reset_static_data();
+
+ // http://icu-project.org/apiref/icu4c/uclean_8h.html#a93f27d0ddc7c196a1da864763f2d8920
+ u_cleanup();
+
+#ifdef MAPNIK_USE_PROJ4
+ // http://trac.osgeo.org/proj/ticket/149
+ #if PJ_VERSION >= 480
+ pj_clear_initcache();
+ #endif
+ // https://trac.osgeo.org/proj/wiki/ProjAPI#EnvironmentFunctions
+ pj_deallocate_grids();
+#endif
+
+ return result;
+}
diff --git a/test/unit/serialization/wkb_formats_test.cpp b/test/unit/serialization/wkb_formats_test.cpp
new file mode 100644
index 0000000..9e18b28
--- /dev/null
+++ b/test/unit/serialization/wkb_formats_test.cpp
@@ -0,0 +1,121 @@
+#include "catch.hpp"
+
+#include <iostream>
+#include <mapnik/params.hpp>
+#include <mapnik/wkb.hpp>
+#include <mapnik/feature.hpp>
+#include <mapnik/geometry_is_valid.hpp>
+#include <mapnik/geometry_is_simple.hpp>
+#include <mapnik/geometry_correct.hpp>
+#include <mapnik/feature_factory.hpp>
+#include <vector>
+#include <algorithm>
+#include <boost/version.hpp>
+
+TEST_CASE("geometry formats") {
+
+SECTION("wkb") {
+
+ unsigned char sp_valid_blob[] = {
+ 0x0, 0x1, 0xBC, 0xB, 0x0, 0x0, 0x1F, 0x12, 0xDB, 0xCF, 0xC3, 0xA2, 0x41, 0x41, 0x9D, 0x74, 0xB0, 0x31, 0xE6, 0x34, 0x53, 0x41, 0xDB,
+ 0x1B, 0xB6, 0x7C, 0xD9, 0xA2, 0x41, 0x41, 0x67, 0xA7, 0xB6, 0xF, 0xF6, 0x34, 0x53, 0x41, 0x7C, 0x6, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0,
+ 0x0, 0x69, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0xBB, 0x4B, 0x9C, 0x59, 0xD2, 0xA2, 0x41, 0x41, 0x3A, 0xAA,
+ 0x3F, 0xAE, 0xEB, 0x34, 0x53, 0x41, 0xA2, 0xC2, 0xE4, 0xC6, 0xD1, 0xA2, 0x41, 0x41, 0x4C, 0xFE, 0x6, 0x2B, 0xEC, 0x34, 0x53, 0x41,
+ 0xEC, 0x65, 0x5F, 0x6, 0xCE, 0xA2, 0x41, 0x41, 0xDD, 0x33, 0x7F, 0x24, 0xEF, 0x34, 0x53, 0x41, 0x2D, 0x35, 0x2D, 0x30, 0xCB, 0xA2,
+ 0x41, 0x41, 0x4E, 0xA7, 0x88, 0x9, 0xF1, 0x34, 0x53, 0x41, 0x58, 0x2F, 0x12, 0x96, 0xCA, 0xA2, 0x41, 0x41, 0x52, 0xD1, 0xBD, 0xDC,
+ 0xF0, 0x34, 0x53, 0x41, 0x1F, 0x12, 0xDB, 0xCF, 0xC3, 0xA2, 0x41, 0x41, 0xB9, 0x31, 0xA4, 0xE1, 0xF5, 0x34, 0x53, 0x41, 0x21, 0xBB,
+ 0x20, 0x6D, 0xC4, 0xA2, 0x41, 0x41, 0x67, 0xA7, 0xB6, 0xF, 0xF6, 0x34, 0x53, 0x41, 0x5A, 0x82, 0x4A, 0xD3, 0xCA, 0xA2, 0x41, 0x41,
+ 0xA7, 0x85, 0x3D, 0x58, 0xF1, 0x34, 0x53, 0x41, 0x22, 0xB8, 0x3A, 0x7D, 0xCB, 0xA2, 0x41, 0x41, 0x7D, 0x89, 0xA1, 0x8E, 0xF1, 0x34,
+ 0x53, 0x41, 0xD0, 0x77, 0x3F, 0x80, 0xCF, 0xA2, 0x41, 0x41, 0x57, 0x69, 0x83, 0xC4, 0xEE, 0x34, 0x53, 0x41, 0xA7, 0xF5, 0x8E, 0xF9,
+ 0xD1, 0xA2, 0x41, 0x41, 0x9A, 0xA2, 0x31, 0xEE, 0xEC, 0x34, 0x53, 0x41, 0x2A, 0xCD, 0xDE, 0x4C, 0xD4, 0xA2, 0x41, 0x41, 0x11, 0x43,
+ 0xE1, 0xF7, 0xEA, 0x34, 0x53, 0x41, 0xF, 0x89, 0xB1, 0x66, 0xD5, 0xA2, 0x41, 0x41, 0xC8, 0x5D, 0x86, 0xF1, 0xE9, 0x34, 0x53, 0x41,
+ 0x19, 0xF4, 0x73, 0x63, 0xD7, 0xA2, 0x41, 0x41, 0x7, 0xB1, 0x14, 0x36, 0xE8, 0x34, 0x53, 0x41, 0xDB, 0x1B, 0xB6, 0x7C, 0xD9, 0xA2,
+ 0x41, 0x41, 0x98, 0xB5, 0xE0, 0x74, 0xE6, 0x34, 0x53, 0x41, 0xC0, 0x3F, 0xC6, 0xAC, 0xD8, 0xA2, 0x41, 0x41, 0x9D, 0x74, 0xB0, 0x31,
+ 0xE6, 0x34, 0x53, 0x41, 0xF0, 0xB5, 0xB1, 0x53, 0xD5, 0xA2, 0x41, 0x41, 0x97, 0x47, 0xAD, 0x36, 0xE9, 0x34, 0x53, 0x41, 0xBB, 0x4B,
+ 0x9C, 0x59, 0xD2, 0xA2, 0x41, 0x41, 0x3A, 0xAA, 0x3F, 0xAE, 0xEB, 0x34, 0x53, 0x41, 0xFE };
+
+ unsigned char sp_invalid_blob[] = {
+ 0x0, 0x1, 0xBC, 0xB, 0x0, 0x0, 0x1F, 0x12, 0xDB, 0xCF, 0xC3, 0xA2, 0x41, 0x41, 0x9D, 0x74, 0xB0, 0x31, 0xE6, 0x34, 0x53, 0x41, 0xDB,
+ 0x1B, 0xB6, 0x7C, 0xD9, 0xA2, 0x41, 0x41, 0x67, 0xA7, 0xB6, 0xF, 0xF6, 0x34, 0x53, 0x41, 0x7C, 0x6, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0,
+ 0x0, 0x69, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0xBB, 0x4B, 0x9C, 0x59, 0xD2, 0xA2, 0x41, 0x41, 0x3A, 0xAA,
+ 0x3F, 0xAE, 0xEB, 0x34, 0x53, 0x41, 0xA2, 0xC2, 0xE4, 0xC6, 0xD1, 0xA2, 0x41, 0x41, 0x4C, 0xFE, 0x6, 0x2B, 0xEC, 0x34, 0x53, 0x41,
+ 0xEC, 0x65, 0x5F, 0x6, 0xCE, 0xA2, 0x41, 0x41, 0xDD, 0x33, 0x7F, 0x24, 0xEF, 0x34, 0x53, 0x41, 0x2D, 0x35, 0x2D, 0x30, 0xCB, 0xA2,
+ 0x41, 0x41, 0x4E, 0xA7, 0x88, 0x9, 0xF1, 0x34, 0x53, 0x41, 0x58, 0x2F, 0x12, 0x96, 0xCA, 0xA2, 0x41, 0x41, 0x52, 0xD1, 0xBD, 0xDC,
+ 0xF0, 0x34, 0x53, 0x41, 0x1F, 0x12, 0xDB, 0xCF, 0xC3, 0xA2, 0x41, 0x41, 0xB9, 0x31, 0xA4, 0xE1, 0xF5, 0x34, 0x53, 0x41, 0x21, 0xBB,
+ 0x20, 0x6D, 0xC4, 0xA2, 0x41, 0x41, 0x67, 0xA7, 0xB6, 0xF, 0xF6, 0x34, 0x53, 0x41, 0x5A, 0x82, 0x4A, 0xD3, 0xCA, 0xA2, 0x41, 0x41,
+ 0xA7, 0x85, 0x3D, 0x58, 0xF1, 0x34, 0x53, 0x41, 0x22, 0xB8, 0x3A, 0x7D, 0xCB, 0xA2, 0x41, 0x41, 0x7D, 0x89, 0xA1, 0x8E, 0xF1, 0x34,
+ 0x53, 0x41, 0xD0, 0x77, 0x3F, 0x80, 0xCF, 0xA2, 0x41, 0x41, 0x57, 0x69, 0x83, 0xC4, 0xEE, 0x34, 0x53, 0x41, 0xA7, 0xF5, 0x8E, 0xF9,
+ 0xD1, 0xA2, 0x41, 0x41, 0x9A, 0xA2, 0x31, 0xEE, 0xEC, 0x34, 0x53, 0x41, 0x2A, 0xCD, 0xDE, 0x4C, 0xD4, 0xA2, 0x41, 0x41, 0x11, 0x43,
+ 0xE1, 0xF7, 0xEA, 0x34, 0x53, 0x41, 0xF, 0x89, 0xB1, 0x66, 0xD5, 0xA2, 0x41, 0x41, 0xC8, 0x5D, 0x86, 0xF1, 0xE9, 0x34, 0x53, 0x41,
+ 0x19, 0xF4, 0x73, 0x63, 0xD7, 0xA2, 0x41, 0x41, 0x7, 0xB1, 0x14, 0x36, 0xE8, 0x34, 0x53, 0x41, 0xDB, 0x1B, 0xB6, 0x7C, 0xD9, 0xA2,
+ 0x41, 0x41, 0x98, 0xB5, 0xE0, 0x74, 0xE6, 0x34, 0x53, 0x41, 0xC0, 0x3F, 0xC6, 0xAC, 0xD8, 0xA2, 0x41, 0x41, 0x9D, 0x74, 0xB0, 0x31,
+ 0xE6, 0x34, 0x53, 0x41, 0xF0, 0xB5, 0xB1, 0x53, 0xD5, 0xA2, 0x41, 0x41, 0x97, 0x47, 0xAD, 0x36, 0xE9, 0x34, 0x53, 0x41, 0xBB, 0x4B,
+ 0x9C, 0x59, 0xD2, 0xA2, 0x41, 0x41, 0x3A, 0xAA, 0x3F, 0xAE, 0xEB, 0x34, 0x53, 0x41 };
+
+ unsigned char sq_valid_blob[] = {
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x40 };
+
+ unsigned char sq_invalid_blob[] = {
+ 0x23, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x40, 0x23 };
+
+ mapnik::context_ptr ctx(new mapnik::context_type);
+ mapnik::feature_ptr feature = mapnik::feature_factory::create(ctx, 1);
+
+ // test of parsing wkb geometries
+ try {
+
+ // spatialite blob
+ mapnik::geometry::geometry<double> geom = mapnik::geometry_utils::from_wkb((const char*)sp_valid_blob,
+ sizeof(sp_valid_blob) / sizeof(sp_valid_blob[0]),
+ mapnik::wkbSpatiaLite);
+ // winding order is not correct per OGC so we'll fix it
+ mapnik::geometry::correct(geom);
+#if BOOST_VERSION >= 105600
+ REQUIRE(mapnik::geometry::is_valid(geom));
+ REQUIRE(mapnik::geometry::is_simple(geom));
+#endif
+
+ geom = mapnik::geometry_utils::from_wkb((const char*)sp_valid_blob,
+ sizeof(sp_valid_blob) / sizeof(sp_valid_blob[0]),
+ mapnik::wkbAuto);
+ mapnik::geometry::correct(geom);
+#if BOOST_VERSION >= 105600
+ REQUIRE(mapnik::geometry::is_valid(geom));
+ REQUIRE(mapnik::geometry::is_simple(geom));
+#endif
+
+ geom = mapnik::geometry_utils::from_wkb((const char*)sp_invalid_blob,
+ sizeof(sp_invalid_blob) / sizeof(sp_invalid_blob[0]),
+ mapnik::wkbAuto);
+ REQUIRE(geom.is<mapnik::geometry::geometry_empty>()); // returns geometry_empty
+
+ // sqlite generic wkb blob
+
+ geom = mapnik::geometry_utils::from_wkb((const char*)sq_valid_blob,
+ sizeof(sq_valid_blob) / sizeof(sq_valid_blob[0]),
+ mapnik::wkbGeneric);
+#if BOOST_VERSION >= 105600
+ REQUIRE(mapnik::geometry::is_valid(geom));
+ REQUIRE(mapnik::geometry::is_simple(geom));
+#endif
+
+ geom = mapnik::geometry_utils::from_wkb( (const char*)sq_valid_blob,
+ sizeof(sq_valid_blob) / sizeof(sq_valid_blob[0]),
+ mapnik::wkbAuto);
+
+#if BOOST_VERSION >= 105600
+ REQUIRE(mapnik::geometry::is_valid(geom));
+ REQUIRE(mapnik::geometry::is_simple(geom));
+#endif
+
+ geom = mapnik::geometry_utils::from_wkb((const char*)sq_invalid_blob,
+ sizeof(sq_invalid_blob) / sizeof(sq_invalid_blob[0]),
+ mapnik::wkbGeneric);
+ REQUIRE(geom.is<mapnik::geometry::geometry_empty>()); // returns geometry_empty
+
+ } catch (std::exception const& ex) {
+ REQUIRE(false);
+ std::clog << "threw: " << ex.what() << "\n";
+ }
+}
+}
diff --git a/test/unit/sql/sql_parse.cpp b/test/unit/sql/sql_parse.cpp
new file mode 100644
index 0000000..43a6eb2
--- /dev/null
+++ b/test/unit/sql/sql_parse.cpp
@@ -0,0 +1,33 @@
+
+#include "catch.hpp"
+
+#include <mapnik/sql_utils.hpp>
+
+TEST_CASE("sql parse") {
+
+SECTION("table") {
+ std::string subquery("table");
+ REQUIRE( subquery == mapnik::sql_utils::table_from_sql(subquery) );
+}
+
+SECTION("complex sql 1") {
+ std::string subquery("(select * FROM table1, table2) AS data");
+ REQUIRE( "table1" == mapnik::sql_utils::table_from_sql(subquery) );
+}
+
+SECTION("complex sql 2") {
+ std::string subquery("(select * FROM table1 , table2) AS data");
+ REQUIRE( "table1" == mapnik::sql_utils::table_from_sql(subquery) );
+}
+
+SECTION("complex sql 3") {
+ std::string subquery("(select * FROM table1,table2) AS data");
+ REQUIRE( "table1" == mapnik::sql_utils::table_from_sql(subquery) );
+}
+
+SECTION("complex sql 4") {
+ std::string subquery("(select * FROM table1) AS data");
+ REQUIRE( "table1" == mapnik::sql_utils::table_from_sql(subquery) );
+}
+
+}
diff --git a/test/unit/symbolizer/symbolizer_test.cpp b/test/unit/symbolizer/symbolizer_test.cpp
new file mode 100644
index 0000000..582613d
--- /dev/null
+++ b/test/unit/symbolizer/symbolizer_test.cpp
@@ -0,0 +1,30 @@
+#include "catch.hpp"
+
+#include <iostream>
+#include <mapnik/symbolizer.hpp>
+#include <vector>
+#include <algorithm>
+
+using namespace mapnik;
+
+TEST_CASE("symbolizer") {
+
+SECTION("enums") {
+
+ try {
+ marker_multi_policy_enum policy_in = MARKER_WHOLE_MULTI;
+ REQUIRE(policy_in == MARKER_WHOLE_MULTI);
+ markers_symbolizer sym;
+ put(sym, keys::markers_multipolicy, policy_in);
+ REQUIRE(sym.properties.count(keys::markers_multipolicy) == static_cast<unsigned long>(1));
+ marker_multi_policy_enum policy_out = get<mapnik::marker_multi_policy_enum>(sym, keys::markers_multipolicy);
+ REQUIRE(policy_out == MARKER_WHOLE_MULTI);
+ }
+ catch (std::exception const & ex)
+ {
+ std::clog << ex.what() << std::endl;
+ REQUIRE(false);
+ }
+
+}
+}
diff --git a/test/unit/valgrind.supp b/test/unit/valgrind.supp
new file mode 100644
index 0000000..51abafc
--- /dev/null
+++ b/test/unit/valgrind.supp
@@ -0,0 +1,77 @@
+{
+ catch1
+ Memcheck:Addr1
+ fun:strlen
+ fun:_ZL29____C_A_T_C_H____T_E_S_T____9v
+ fun:_ZN5Catch10RunContext20invokeActiveTestCaseEv
+ fun:_ZN5Catch10RunContext14runCurrentTestERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES8_
+ fun:_ZN5Catch10RunContext7runTestERKNS_8TestCaseE
+ fun:_ZN5Catch6Runner8runTestsEv
+ fun:_ZN5Catch7Session3runEv
+ fun:main
+}
+{
+ catch2
+ Memcheck:Cond
+ fun:_platform_memchr$VARIANT$Haswell
+ fun:__sfvwrite
+ fun:fwrite
+ fun:_ZNSt3__111__stdoutbufIcE8overflowEi
+ fun:_ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl
+ fun:_ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_
+ fun:_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
+ fun:_ZN5Catch15ConsoleReporter11printTotalsERKNS_6TotalsE
+ fun:_ZN5Catch15ConsoleReporter12testRunEndedERKNS_12TestRunStatsE
+ fun:_ZN5Catch10RunContextD2Ev
+ fun:_ZN5Catch6Runner8runTestsEv
+ fun:_ZN5Catch7Session3runEv
+}
+{
+ catch3
+ Memcheck:Cond
+ fun:_platform_memchr$VARIANT$Haswell
+ fun:__sfvwrite
+ fun:fwrite
+ fun:_ZNSt3__111__stdoutbufIcE8overflowEi
+ fun:_ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl
+ fun:_ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_
+ fun:_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
+ fun:_ZN5Catch12_GLOBAL__N_115PosixColourImpl3useENS_6Colour4CodeE
+ fun:_ZN5Catch6Colour3useENS0_4CodeE
+ fun:_ZN5Catch15ConsoleReporter18printTotalsDividerERKNS_6TotalsE
+ fun:_ZN5Catch15ConsoleReporter12testRunEndedERKNS_12TestRunStatsE
+ fun:_ZN5Catch10RunContextD2Ev
+}
+{
+ catch4
+ Memcheck:Cond
+ fun:_platform_memchr$VARIANT$Haswell
+ fun:__sfvwrite
+ fun:fwrite
+ fun:_ZNSt3__111__stdoutbufIcE8overflowEi
+ fun:_ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl
+ fun:_ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_
+ fun:_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
+ fun:_ZN5Catch15ConsoleReporter18printTotalsDividerERKNS_6TotalsE
+ fun:_ZN5Catch15ConsoleReporter12testRunEndedERKNS_12TestRunStatsE
+ fun:_ZN5Catch10RunContextD2Ev
+ fun:_ZN5Catch6Runner8runTestsEv
+ fun:_ZN5Catch7Session3runEv
+}
+{
+ pixman
+ Memcheck:Leak
+ match-leak-kinds: definite
+ fun:malloc
+ fun:_pixman_implementation_create
+ fun:_pixman_implementation_create_general
+ fun:_pixman_choose_implementation
+ fun:pixman_constructor
+ fun:_ZN16ImageLoaderMachO18doModInitFunctionsERKN11ImageLoader11LinkContextE
+ fun:_ZN16ImageLoaderMachO16doInitializationERKN11ImageLoader11LinkContextE
+ fun:_ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEjRNS_21InitializerTimingListERNS_15UninitedUpwardsE
+ fun:_ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEjRNS_21InitializerTimingListERNS_15UninitedUpwardsE
+ fun:_ZN11ImageLoader19processInitializersERKNS_11LinkContextEjRNS_21InitializerTimingListERNS_15UninitedUpwardsE
+ fun:_ZN11ImageLoader15runInitializersERKNS_11LinkContextERNS_21InitializerTimingListE
+ fun:_ZN4dyld24initializeMainExecutableEv
+}
diff --git a/test/unit/vertex_adapter/clipping_test.cpp b/test/unit/vertex_adapter/clipping_test.cpp
new file mode 100644
index 0000000..14dd06a
--- /dev/null
+++ b/test/unit/vertex_adapter/clipping_test.cpp
@@ -0,0 +1,120 @@
+#include "catch.hpp"
+
+// mapnik
+#include <mapnik/util/conversions.hpp>
+#include <mapnik/util/trim.hpp>
+#include <mapnik/path.hpp>
+// boost
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wunused-local-typedef"
+#include <boost/algorithm/string.hpp>
+#pragma GCC diagnostic pop
+
+// stl
+#include <stdexcept>
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <vector>
+#include <algorithm>
+
+// agg
+#include "agg_conv_clip_polygon.h"
+#include "agg_conv_clip_polyline.h"
+
+template <typename T>
+std::string dump_path(T & path)
+{
+ unsigned cmd = 1;
+ double x = 0;
+ double y = 0;
+ unsigned idx = 0;
+ std::ostringstream s;
+ path.rewind(0);
+ while ((cmd = path.vertex(&x, &y)) != mapnik::SEG_END)
+ {
+ if (idx > 0) s << ",";
+ s << x << " " << y << " " << cmd;
+ idx++;
+ }
+ return s.str();
+}
+
+std::string clip_line(mapnik::box2d<double> const& bbox,
+ mapnik::path_type const& path)
+{
+ using line_clipper = agg::conv_clip_polyline<mapnik::vertex_adapter>;
+ mapnik::vertex_adapter va(path);
+ line_clipper clipped(va);
+ clipped.clip_box(bbox.minx(),bbox.miny(),bbox.maxx(),bbox.maxy());
+ return dump_path(clipped);
+}
+
+void parse_geom(mapnik::path_type & path,
+ std::string const& geom_string) {
+ std::vector<std::string> vertices;
+ boost::split(vertices, geom_string, boost::is_any_of(","));
+ for (std::string const& vert : vertices)
+ {
+ std::vector<std::string> commands;
+ boost::split(commands, vert, boost::is_any_of(" "));
+ if (commands.size() != 3)
+ {
+ throw std::runtime_error(std::string("could not parse geometry '") + geom_string + "'");
+ }
+ double x = 0;
+ double y = 0;
+ int c = 0;
+ if (mapnik::util::string2double(commands[0],x)
+ && mapnik::util::string2double(commands[1],y)
+ && mapnik::util::string2int(commands[2],c))
+ {
+ path.push_vertex(x,y,(mapnik::CommandType)c);
+ }
+ else
+ {
+ throw std::runtime_error(std::string("could not parse geometry '") + geom_string + "'");
+ }
+ }
+}
+
+TEST_CASE("clipping") {
+
+SECTION("lines") {
+
+ try {
+
+ std::string filename("test/unit/data/cases.txt");
+ std::ifstream stream(filename.c_str(),std::ios_base::in | std::ios_base::binary);
+ if (!stream.is_open())
+ throw std::runtime_error("could not open: '" + filename + "'");
+
+ std::string csv_line;
+ while(std::getline(stream,csv_line,'\n'))
+ {
+ if (csv_line.empty() || csv_line[0] == '#') continue;
+ std::vector<std::string> parts;
+ boost::split(parts, csv_line, boost::is_any_of(";"));
+ // first part is clipping box
+ mapnik::box2d<double> bbox;
+ if (!bbox.from_string(parts[0])) {
+ throw std::runtime_error(std::string("could not parse bbox '") + parts[0] + "'");
+ }
+ // second part is input geometry
+ mapnik::path_type path;
+ parse_geom(path, parts[1]);
+ //std::clog << dump_path(path) << "\n";
+ // third part is expected, clipped geometry
+ REQUIRE(clip_line(bbox, path) == mapnik::util::trim_copy(parts[2]));
+ }
+ stream.close();
+ }
+ catch (std::exception const& ex)
+ {
+ std::cerr << ex.what() << "\n";
+ }
+
+}
+
+}
\ No newline at end of file
diff --git a/test/unit/vertex_adapter/line_offset_test.cpp b/test/unit/vertex_adapter/line_offset_test.cpp
new file mode 100644
index 0000000..8d02502
--- /dev/null
+++ b/test/unit/vertex_adapter/line_offset_test.cpp
@@ -0,0 +1,196 @@
+#include "catch.hpp"
+
+// mapnik
+#include <mapnik/global.hpp>
+#include <mapnik/coord.hpp>
+#include <mapnik/vertex_cache.hpp>
+
+// stl
+#include <stdexcept>
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <tuple>
+#include <algorithm>
+
+struct fake_path
+{
+ using coord_type = std::tuple<double, double, unsigned>;
+ using cont_type = std::vector<coord_type>;
+ cont_type vertices_;
+ cont_type::iterator itr_;
+
+ fake_path(std::initializer_list<double> l)
+ : fake_path(l.begin(), l.size()) {
+ }
+
+ fake_path(std::vector<double> const &v)
+ : fake_path(v.begin(), v.size()) {
+ }
+
+ template <typename Itr>
+ fake_path(Itr itr, size_t sz) {
+ size_t num_coords = sz >> 1;
+ vertices_.reserve(num_coords);
+
+ for (size_t i = 0; i < num_coords; ++i) {
+ double x = *itr++;
+ double y = *itr++;
+ unsigned cmd = (i == 0) ? agg::path_cmd_move_to : agg::path_cmd_line_to;
+ vertices_.push_back(std::make_tuple(x, y, cmd));
+ }
+ itr_ = vertices_.begin();
+ }
+
+ unsigned vertex(double *x, double *y) {
+ if (itr_ == vertices_.end()) {
+ return agg::path_cmd_stop;
+ }
+ *x = std::get<0>(*itr_);
+ *y = std::get<1>(*itr_);
+ unsigned cmd = std::get<2>(*itr_);
+ ++itr_;
+ return cmd;
+ }
+
+ void rewind(unsigned) {
+ itr_ = vertices_.begin();
+ }
+};
+
+double dist(mapnik::pixel_position const &a,
+ mapnik::pixel_position const &b)
+{
+ mapnik::pixel_position d = a - b;
+ return std::sqrt(d.x*d.x + d.y*d.y);
+}
+
+void test_simple_segment(double const &offset)
+{
+ const double dx = 0.01;
+ fake_path path = {0, 0, 1, 0}, off_path = {0, offset, 1, offset};
+ mapnik::vertex_cache vc(path), off_vc(off_path);
+
+ vc.reset(); vc.next_subpath();
+ off_vc.reset(); off_vc.next_subpath();
+
+ while (vc.move(dx)) {
+ double pos = vc.linear_position();
+ double off_pos = off_vc.position_closest_to(vc.current_position());
+ REQUIRE(std::abs(pos - off_pos) < 1.0e-6);
+ }
+}
+
+void test_straight_line(double const &offset) {
+ const double dx = 0.01;
+ fake_path path = {0, 0, 0.1, 0, 0.9, 0, 1, 0},
+ off_path = {0, offset, 0.4, offset, 0.6, offset, 1, offset};
+ mapnik::vertex_cache vc(path), off_vc(off_path);
+
+ vc.reset(); vc.next_subpath();
+ off_vc.reset(); off_vc.next_subpath();
+
+ while (vc.move(dx)) {
+ double pos = vc.linear_position();
+ double off_pos = off_vc.position_closest_to(vc.current_position());
+ REQUIRE(std::abs(pos - off_pos) < 1.0e-6);
+ }
+}
+
+void test_offset_curve(double const &offset) {
+ const double dx = 0.01;
+ const double r = (1.0 + offset);
+
+ std::vector<double> pos, off_pos;
+ const size_t max_i = 1000;
+ for (size_t i = 0; i <= max_i; ++i) {
+ double x = M_PI * double(i) / max_i;
+ pos.push_back(-std::cos(x)); pos.push_back(std::sin(x));
+ off_pos.push_back(-r * std::cos(x)); off_pos.push_back(r * std::sin(x));
+ }
+
+ fake_path path(pos), off_path(off_pos);
+ mapnik::vertex_cache vc(path), off_vc(off_path);
+
+ vc.reset(); vc.next_subpath();
+ off_vc.reset(); off_vc.next_subpath();
+
+ while (vc.move(dx)) {
+ double pos = vc.linear_position();
+ double off_pos = off_vc.position_closest_to(vc.current_position());
+ {
+ mapnik::vertex_cache::scoped_state s(off_vc);
+ off_vc.move(off_pos);
+ auto eps = (1.001 * offset);
+ auto actual = dist(vc.current_position(), off_vc.current_position());
+ REQUIRE(actual < eps);
+ }
+ REQUIRE(std::abs((pos / vc.length()) - (off_pos / off_vc.length())) < 1.0e-3);
+ }
+}
+
+void test_s_shaped_curve(double const &offset) {
+ const double dx = 0.01;
+ const double r = (1.0 + offset);
+ const double r2 = (1.0 - offset);
+
+ std::vector<double> pos, off_pos;
+ const size_t max_i = 1000;
+ for (size_t i = 0; i <= max_i; ++i) {
+ double x = M_PI * double(i) / max_i;
+ pos.push_back(-std::cos(x) - 1); pos.push_back(std::sin(x));
+ off_pos.push_back(-r * std::cos(x) - 1); off_pos.push_back(r * std::sin(x));
+ }
+ for (size_t i = 0; i <= max_i; ++i) {
+ double x = M_PI * double(i) / max_i;
+ pos.push_back(-std::cos(x) + 1); pos.push_back(-std::sin(x));
+ off_pos.push_back(-r2 * std::cos(x) + 1); off_pos.push_back(-r2 * std::sin(x));
+ }
+
+ fake_path path(pos), off_path(off_pos);
+ mapnik::vertex_cache vc(path), off_vc(off_path);
+
+ vc.reset(); vc.next_subpath();
+ off_vc.reset(); off_vc.next_subpath();
+
+ while (vc.move(dx)) {
+ double off_pos = off_vc.position_closest_to(vc.current_position());
+ {
+ mapnik::vertex_cache::scoped_state s(off_vc);
+ off_vc.move(off_pos);
+ REQUIRE(dist(vc.current_position(), off_vc.current_position()) < (1.002 * offset));
+ }
+ }
+}
+
+TEST_CASE("offsets") {
+
+SECTION("line") {
+ try {
+
+ std::vector<double> offsets = { 0.01, 0.02, 0.1, 0.2 };
+ for (double offset : offsets) {
+ // test simple straight line segment - should be easy to
+ // find the correspondance here.
+ test_simple_segment(offset);
+
+ // test straight line consisting of more than one segment.
+ test_straight_line(offset);
+
+ // test an offset outer curve
+ test_offset_curve(offset);
+
+ // test an offset along an S-shaped curve, which is harder
+ // because the positions along the offset are no longer
+ // linearly related to the positions along the original
+ // curve.
+ test_s_shaped_curve(offset);
+ }
+ }
+ catch (std::exception const& ex)
+ {
+ std::cerr << ex.what() << "\n";
+ REQUIRE(false);
+ }
+}
+}
diff --git a/test/unit/vertex_adapter/simplify_converters_test.cpp b/test/unit/vertex_adapter/simplify_converters_test.cpp
new file mode 100644
index 0000000..a5f99b2
--- /dev/null
+++ b/test/unit/vertex_adapter/simplify_converters_test.cpp
@@ -0,0 +1,82 @@
+#include "catch.hpp"
+
+#include <iostream>
+#include <vector>
+#include <string>
+#include <algorithm>
+
+#include <mapnik/layer.hpp>
+#include <mapnik/wkt/wkt_factory.hpp>
+#include <mapnik/wkt/wkt_generator_grammar.hpp>
+#include <mapnik/simplify.hpp>
+#include <mapnik/simplify_converter.hpp>
+
+// stl
+#include <stdexcept>
+
+// Convenience method for test cases
+void simplify(std::string const& wkt_in, double tolerance, std::string const& method, std::string const& expected)
+{
+#if 0 // FIXME
+ //grab the geom
+ mapnik::geometry_container multi_input;
+ if (!mapnik::from_wkt(wkt_in , multi_input))
+ {
+ throw std::runtime_error("Failed to parse WKT");
+ }
+ //setup the generalization
+ mapnik::vertex_adapter va(multi_input.front());
+ mapnik::simplify_converter<mapnik::vertex_adapter> generalizer(va);
+ generalizer.set_simplify_algorithm(mapnik::simplify_algorithm_from_string(method).get());
+ generalizer.set_simplify_tolerance(tolerance);
+ //suck the vertices back out of it
+ mapnik::geometry_type* output = new mapnik::geometry_type(multi_input.front().type());
+ mapnik::CommandType cmd;
+ double x, y;
+ while ((cmd = (mapnik::CommandType)generalizer.vertex(&x, &y)) != mapnik::SEG_END)
+ {
+ output->push_vertex(x, y, cmd);
+ }
+ //construct the answer
+ mapnik::geometry_container multi_out;
+ multi_out.push_back(output);
+ std::string wkt_out;
+ REQUIRE(mapnik::to_wkt(multi_out, wkt_out));
+ REQUIRE(wkt_out == expected);
+#endif
+}
+
+TEST_CASE("converters") {
+
+SECTION("simplify") {
+
+ simplify( std::string("LineString(0 0,2 2,3 5,4 1,5 0,6 7,7 0)"),
+ 4, "douglas-peucker",
+ std::string("LineString(0 0,6 7,7 0)"));
+
+ simplify( std::string("LineString(0 0,2 2,3 5,4 1,5 0,6 7,7 0)"),
+ 2, "douglas-peucker",
+ std::string("LineString(0 0,3 5,5 0,6 7,7 0)"));
+
+ simplify( std::string("LineString(10 0,9 -4,7 -7,4 -9,0 -10,-4 -9,-7 -7,-9 -4,-10 0,-9 4,-7 7,-4 9,0 10,4 9,7 7,9 4)"),
+ 4, "douglas-peucker",
+ std::string("LineString(10 0,0 -10,-10 0,0 10,9 4)"));
+
+ simplify( std::string("LineString(0 0,1 1,2 2,0 10,0 0)"),
+ 10, "douglas-peucker",
+ std::string("LineString(0 0,0 0)"));
+
+ simplify( std::string("LineString(0 0,1 1,2 2,0 10,0 0)"),
+ 8, "douglas-peucker",
+ std::string("LineString(0 0,0 10,0 0)"));
+
+ simplify( std::string("LineString(0 0,1 1,2 2,0 10,0 0)"),
+ 1, "douglas-peucker",
+ std::string("LineString(0 0,2 2,0 10,0 0)"));
+
+ simplify( std::string("LineString(0 0, 1 -1, 2 2, 0 -10, 0 0, -5 7, 4 6)"),
+ 3, "douglas-peucker",
+ std::string("LineString(0 0,0 -10,-5 7,4 6)"));
+
+}
+}
\ No newline at end of file
diff --git a/test/unit/vertex_adapter/vertex_adapter.cpp b/test/unit/vertex_adapter/vertex_adapter.cpp
new file mode 100644
index 0000000..4505faa
--- /dev/null
+++ b/test/unit/vertex_adapter/vertex_adapter.cpp
@@ -0,0 +1,269 @@
+#include "catch.hpp"
+
+#include <mapnik/vertex_adapters.hpp>
+#include <mapnik/geometry_correct.hpp>
+
+TEST_CASE("vertex_adapters") {
+
+SECTION("polygon") {
+ mapnik::geometry::polygon<double> g;
+ g.exterior_ring.add_coord(1,1);
+ g.exterior_ring.add_coord(2,2);
+ g.exterior_ring.add_coord(100,100);
+ g.exterior_ring.add_coord(1,1);
+
+ mapnik::geometry::polygon_vertex_adapter<double> va(g);
+ double x,y;
+ unsigned cmd;
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_MOVETO );
+ REQUIRE( x == 1 );
+ REQUIRE( y == 1 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == 2 );
+ REQUIRE( y == 2 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == 100 );
+ REQUIRE( y == 100 );
+
+ // close
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_CLOSE );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 0 );
+
+ // end
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_END );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 0 );
+}
+
+SECTION("polygon with hole") {
+ mapnik::geometry::polygon<double> g;
+ g.exterior_ring.add_coord(0,0);
+ g.exterior_ring.add_coord(-10,0);
+ g.exterior_ring.add_coord(-10,10);
+ g.exterior_ring.add_coord(0,10);
+ g.exterior_ring.add_coord(0,0);
+ std::vector<mapnik::geometry::linear_ring<double> > interior_rings;
+ mapnik::geometry::linear_ring<double> hole;
+ hole.add_coord(-7,7);
+ hole.add_coord(-7,3);
+ hole.add_coord(-3,3);
+ hole.add_coord(-3,7);
+ hole.add_coord(-7,7);
+ g.add_hole(std::move(hole));
+
+ mapnik::geometry::linear_ring<double> hole_in_hole;
+ hole_in_hole.add_coord(-6,4);
+ hole_in_hole.add_coord(-6,6);
+ hole_in_hole.add_coord(-4,6);
+ hole_in_hole.add_coord(-4,4);
+ hole_in_hole.add_coord(-6,4);
+ g.add_hole(std::move(hole_in_hole));
+
+ mapnik::geometry::polygon_vertex_adapter<double> va(g);
+ double x,y;
+ unsigned cmd;
+
+ // exterior ring
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_MOVETO );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 0 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -10 );
+ REQUIRE( y == 0 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -10 );
+ REQUIRE( y == 10 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 10 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_CLOSE );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 0 );
+
+ // exterior ring via ring_vertex_adapter
+ mapnik::geometry::ring_vertex_adapter<double> va2(g.exterior_ring);
+ cmd = va2.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_MOVETO );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 0 );
+
+ cmd = va2.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -10 );
+ REQUIRE( y == 0 );
+
+ cmd = va2.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -10 );
+ REQUIRE( y == 10 );
+
+ cmd = va2.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 10 );
+
+ cmd = va2.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_CLOSE );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 0 );
+
+ // since ring adapter is only for exterior, next should be END
+ cmd = va2.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_END );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 0 );
+
+ // first hole for polygon_adapter
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_MOVETO );
+ REQUIRE( x == -7 );
+ REQUIRE( y == 7 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -7 );
+ REQUIRE( y == 3 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -3 );
+ REQUIRE( y == 3 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -3 );
+ REQUIRE( y == 7 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_CLOSE );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 0 );
+
+ // second hole
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_MOVETO );
+ REQUIRE( x == -6 );
+ REQUIRE( y == 4 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -6 );
+ REQUIRE( y == 6 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -4 );
+ REQUIRE( y == 6 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -4 );
+ REQUIRE( y == 4 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_CLOSE );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 0 );
+
+ mapnik::geometry::correct(g);
+
+ va.rewind(0);
+
+ // exterior ring: flipped winding order from correct
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_MOVETO );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 0 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 10 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -10 );
+ REQUIRE( y == 10 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -10 );
+ REQUIRE( y == 0 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_CLOSE );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 0 );
+
+ // first hole: flipped winding order from correct
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_MOVETO );
+ REQUIRE( x == -7 );
+ REQUIRE( y == 7 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -3 );
+ REQUIRE( y == 7 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -3 );
+ REQUIRE( y == 3 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -7 );
+ REQUIRE( y == 3 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_CLOSE );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 0 );
+
+ // second hole: correct appears not to have changed winding order
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_MOVETO );
+ REQUIRE( x == -6 );
+ REQUIRE( y == 4 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -6 );
+ REQUIRE( y == 6 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -4 );
+ REQUIRE( y == 6 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_LINETO );
+ REQUIRE( x == -4 );
+ REQUIRE( y == 4 );
+
+ cmd = va.vertex(&x,&y);
+ REQUIRE( cmd == mapnik::SEG_CLOSE );
+ REQUIRE( x == 0 );
+ REQUIRE( y == 0 );
+}
+
+}
diff --git a/test/visual/compare_images.hpp b/test/visual/compare_images.hpp
new file mode 100644
index 0000000..d227d78
--- /dev/null
+++ b/test/visual/compare_images.hpp
@@ -0,0 +1,53 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef COMPARE_IMAGES_HPP
+#define COMPARE_IMAGES_HPP
+
+// stl
+#include <memory>
+
+// mapnik
+#include <mapnik/image_util.hpp>
+#include <mapnik/image_reader.hpp>
+
+namespace visual_tests
+{
+
+template <typename Image>
+unsigned compare_images(Image const & actual, std::string const & reference)
+{
+ std::unique_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(reference, "png"));
+ if (!reader.get())
+ {
+ throw mapnik::image_reader_exception("Failed to load: " + reference);
+ }
+
+ mapnik::image_any ref_image_any = reader->read(0, 0, reader->width(), reader->height());
+ Image const & reference_image = mapnik::util::get<Image>(ref_image_any);
+
+ return mapnik::compare(actual, reference_image, 0, true);
+}
+
+}
+
+#endif
diff --git a/test/visual/config.hpp b/test/visual/config.hpp
new file mode 100644
index 0000000..48e6359
--- /dev/null
+++ b/test/visual/config.hpp
@@ -0,0 +1,80 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef CONFIG_HPP
+#define CONFIG_HPP
+
+// stl
+#include <vector>
+#include <string>
+
+// boost
+#include <boost/filesystem.hpp>
+
+namespace visual_tests
+{
+
+struct map_size
+{
+ map_size(int width, int height) : width(width), height(height) { }
+ map_size() { }
+ unsigned width;
+ unsigned height;
+};
+
+struct config
+{
+ config() : status(true),
+ scales({ 1.0, 2.0 }),
+ sizes({ { 500, 100 } }) { }
+
+ bool status;
+ std::vector<double> scales;
+ std::vector<map_size> sizes;
+};
+
+enum result_state : std::uint8_t
+{
+ STATE_OK,
+ STATE_FAIL,
+ STATE_ERROR,
+ STATE_OVERWRITE
+};
+
+struct result
+{
+ std::string name;
+ result_state state;
+ std::string renderer_name;
+ map_size size;
+ double scale_factor;
+ boost::filesystem::path actual_image_path;
+ boost::filesystem::path reference_image_path;
+ std::string error_message;
+ unsigned diff;
+};
+
+using result_list = std::vector<result>;
+
+}
+
+#endif
diff --git a/test/visual/map_sizes_grammar.hpp b/test/visual/map_sizes_grammar.hpp
new file mode 100644
index 0000000..2946422
--- /dev/null
+++ b/test/visual/map_sizes_grammar.hpp
@@ -0,0 +1,62 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef MAP_SIZES_GRAMMAR_HPP
+#define MAP_SIZES_GRAMMAR_HPP
+
+// boost
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wunused-local-typedef"
+#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/phoenix.hpp>
+#pragma GCC diagnostic pop
+
+namespace visual_tests
+{
+
+namespace qi = boost::spirit::qi;
+namespace ascii = boost::spirit::ascii;
+
+template <typename Iterator>
+struct map_sizes_grammar : qi::grammar<Iterator, std::vector<map_size>(), ascii::space_type>
+{
+ map_sizes_grammar() : map_sizes_grammar::base_type(start)
+ {
+ using namespace boost::spirit::qi;
+ using namespace boost::phoenix;
+
+ int_type int_;
+ _1_type _1;
+ _2_type _2;
+ _val_type _val;
+
+ start = (int_ >> ',' >> int_)[push_back(_val, construct<map_size>(_1, _2))] % ';';
+ }
+
+ qi::rule<Iterator, std::vector<map_size>(), ascii::space_type> start;
+};
+
+}
+
+#endif
diff --git a/test/visual/renderer.hpp b/test/visual/renderer.hpp
new file mode 100644
index 0000000..58cb4cd
--- /dev/null
+++ b/test/visual/renderer.hpp
@@ -0,0 +1,171 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef RENDERER_HPP
+#define RENDERER_HPP
+
+#include "compare_images.hpp"
+
+// stl
+#include <sstream>
+#include <iomanip>
+
+// mapnik
+#include <mapnik/map.hpp>
+#include <mapnik/agg_renderer.hpp>
+#if defined(HAVE_CAIRO)
+#include <mapnik/cairo/cairo_renderer.hpp>
+#include <mapnik/cairo/cairo_image_util.hpp>
+#endif
+
+// boost
+#include <boost/filesystem.hpp>
+
+namespace visual_tests
+{
+
+template <typename ImageType>
+struct renderer_base
+{
+ using image_type = ImageType;
+
+ unsigned compare(image_type const & actual, boost::filesystem::path const& reference) const
+ {
+ return compare_images(actual, reference.string());
+ }
+
+ void save(image_type const & image, boost::filesystem::path const& path) const
+ {
+ mapnik::save_to_file(image, path.string(), "png32");
+ }
+};
+
+struct agg_renderer : renderer_base<mapnik::image_rgba8>
+{
+ static constexpr const char * name = "agg";
+
+ image_type render(mapnik::Map const & map, double scale_factor) const
+ {
+ image_type image(map.width(), map.height());
+ mapnik::agg_renderer<image_type> ren(map, image, scale_factor);
+ ren.apply();
+ return image;
+ }
+};
+
+#if defined(HAVE_CAIRO)
+struct cairo_renderer : renderer_base<mapnik::image_rgba8>
+{
+ static constexpr const char * name = "cairo";
+
+ image_type render(mapnik::Map const & map, double scale_factor) const
+ {
+ mapnik::cairo_surface_ptr image_surface(
+ cairo_image_surface_create(CAIRO_FORMAT_ARGB32, map.width(), map.height()),
+ mapnik::cairo_surface_closer());
+ mapnik::cairo_ptr image_context(mapnik::create_context(image_surface));
+ mapnik::cairo_renderer<mapnik::cairo_ptr> ren(map, image_context, scale_factor);
+ ren.apply();
+ image_type image(map.width(), map.height());
+ mapnik::cairo_image_to_rgba8(image, image_surface);
+ return image;
+ }
+};
+#endif
+
+struct grid_renderer : renderer_base<mapnik::image_gray8>
+{
+ static constexpr const char * name = "grid";
+
+ image_type render(mapnik::Map const & map, double scale_factor) const
+ {
+ image_type image(map.width(), map.height());
+ // TODO: Render grid here.
+ return image;
+ }
+};
+
+template <typename Renderer>
+class renderer
+{
+public:
+ renderer(boost::filesystem::path const & output_dir, boost::filesystem::path const & reference_dir, bool overwrite)
+ : output_dir(output_dir), reference_dir(reference_dir), overwrite(overwrite)
+ {
+ }
+
+ result test(std::string const & name, mapnik::Map const & map, double scale_factor) const
+ {
+ typename Renderer::image_type image(ren.render(map, scale_factor));
+ boost::filesystem::path reference = reference_dir / image_file_name(name, map.width(), map.height(), scale_factor, true);
+ bool reference_exists = boost::filesystem::exists(reference);
+ result res;
+
+ res.state = reference_exists ? STATE_OK : STATE_OVERWRITE;
+ res.name = name;
+ res.renderer_name = Renderer::name;
+ res.scale_factor = scale_factor;
+ res.size = map_size(map.width(), map.height());
+ res.reference_image_path = reference;
+ res.diff = reference_exists ? ren.compare(image, reference) : 0;
+
+ if (res.diff)
+ {
+ boost::filesystem::create_directories(output_dir);
+ boost::filesystem::path path = output_dir / image_file_name(name, map.width(), map.height(), scale_factor);
+ res.actual_image_path = path;
+ res.state = STATE_FAIL;
+ ren.save(image, path);
+ }
+
+ if ((res.diff && overwrite) || !reference_exists)
+ {
+ ren.save(image, reference);
+ res.state = STATE_OVERWRITE;
+ }
+
+ return res;
+ }
+
+private:
+ std::string image_file_name(std::string const & test_name,
+ double width,
+ double height,
+ double scale_factor,
+ bool reference=false) const
+ {
+ std::stringstream s;
+ s << test_name << '-' << width << '-' << height << '-'
+ << std::fixed << std::setprecision(1) << scale_factor
+ << '-' << Renderer::name << (reference ? "-reference" : "") << ".png";
+ return s.str();
+ }
+
+ Renderer ren;
+ boost::filesystem::path const & output_dir;
+ boost::filesystem::path const & reference_dir;
+ const bool overwrite;
+};
+
+}
+
+#endif
diff --git a/test/visual/report.cpp b/test/visual/report.cpp
new file mode 100644
index 0000000..aeca371
--- /dev/null
+++ b/test/visual/report.cpp
@@ -0,0 +1,200 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// stl
+#include <iomanip>
+#include <fstream>
+#include <numeric>
+
+#include "report.hpp"
+
+namespace visual_tests
+{
+
+void console_report::report(result const & r)
+{
+ s << '"' << r.name << '-' << r.size.width << '-' << r.size.height << '-' << std::fixed <<
+ std::setprecision(1) << r.scale_factor << "\" with " << r.renderer_name << "... ";
+
+ switch (r.state)
+ {
+ case STATE_OK:
+ s << "OK";
+ break;
+ case STATE_FAIL:
+ s << "FAILED (" << r.diff << " different pixels)";
+ break;
+ case STATE_OVERWRITE:
+ s << "OVERWRITTEN (" << r.diff << " different pixels)";
+ break;
+ case STATE_ERROR:
+ s << "ERROR (" << r.error_message << ")";
+ break;
+ }
+
+ s << std::endl;
+}
+
+unsigned console_report::summary(result_list const & results)
+{
+ unsigned ok = 0;
+ unsigned error = 0;
+ unsigned fail = 0;
+ unsigned overwrite = 0;
+
+ for (auto const & r : results)
+ {
+ switch (r.state)
+ {
+ case STATE_OK: ok++; break;
+ case STATE_FAIL: fail++; break;
+ case STATE_ERROR: error++; break;
+ case STATE_OVERWRITE: overwrite++; break;
+ }
+ }
+
+ s << std::endl;
+ s << "Visual rendering: " << fail << " failed / " << ok << " passed / "
+ << overwrite << " overwritten / " << error << " errors" << std::endl;
+
+ return fail + error;
+}
+
+void console_short_report::report(result const & r)
+{
+ switch (r.state)
+ {
+ case STATE_OK:
+ s << ".";
+ break;
+ case STATE_FAIL:
+ s << "✘";
+ break;
+ case STATE_OVERWRITE:
+ s << "✓";
+ break;
+ case STATE_ERROR:
+ s << "ERROR (" << r.error_message << ")\n";
+ break;
+ }
+}
+
+void html_report::report(result const & r, boost::filesystem::path const & output_dir)
+{
+ if (r.state == STATE_ERROR)
+ {
+ s << "<div class=\"text\">Failed to render: " << r.name << "<br><em>" << r.error_message << "</em></div>\n";
+ }
+ else if (r.state == STATE_FAIL)
+ {
+ using namespace boost::filesystem;
+
+ path reference = output_dir / r.reference_image_path.filename();
+ path actual = output_dir / r.actual_image_path.filename();
+
+ if (exists(reference))
+ {
+ remove(reference);
+ }
+ if (exists(actual))
+ {
+ remove(actual);
+ }
+ copy_file(r.reference_image_path, reference);
+ copy_file(r.actual_image_path, actual);
+
+ s << "<div class=\"expected\">\n"
+ " <a href=" << reference.filename() << ">\n"
+ " <img src=" << reference.filename() << " width=\"100\%\">\n"
+ " </a>\n"
+ "</div>\n"
+ "<div class=\"text\">" << r.diff << "</div>\n"
+ "<div class=\"actual\">\n"
+ " <a href=" << actual.filename() << ">\n"
+ " <img src=" << actual.filename() << " width=\"100\%\">\n"
+ " </a>\n"
+ "</div>\n";
+ }
+}
+
+constexpr const char * html_header = R"template(<!DOCTYPE html>
+<html>
+<head>
+ <style>
+ body { margin:10; padding:10; }
+ .expected {
+ float:left;
+ border-width:1px;
+ border-style:solid;
+ width:45%;
+ }
+ .actual {
+ float:right;
+ border-width:1px;
+ border-style:solid;
+ width:45%;
+ }
+ .text {
+ float:left;
+ }
+ </style>
+</head>
+<body>
+<script>
+</script>
+<div id='results'>
+ <div class="expected">expected</div>
+ <div class="text">% difference</div>
+ <div class="actual">actual</div>
+)template";
+
+constexpr const char * html_footer = R"template(</div>
+</body>
+</html>)template";
+
+void html_report::summary(result_list const & results, boost::filesystem::path const & output_dir)
+{
+ s << html_header;
+
+ for (auto const & r : results)
+ {
+ if (r.state != STATE_OK)
+ {
+ report(r, output_dir);
+ }
+ }
+
+ s << html_footer;
+}
+
+void html_summary(result_list const & results, boost::filesystem::path output_dir)
+{
+ boost::filesystem::path html_root = output_dir / "visual-test-results";
+ boost::filesystem::create_directories(html_root);
+ boost::filesystem::path html_report_path = html_root / "index.html";
+ std::clog << "View failure report at " << html_report_path << "\n";
+ std::ofstream output_file(html_report_path.string());
+ html_report report(output_file);
+ report.summary(results, html_root);
+}
+
+}
diff --git a/test/visual/report.hpp b/test/visual/report.hpp
new file mode 100644
index 0000000..cdccad2
--- /dev/null
+++ b/test/visual/report.hpp
@@ -0,0 +1,124 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef CONSOLE_REPORT_HPP
+#define CONSOLE_REPORT_HPP
+
+// stl
+#include <iostream>
+
+#include <mapnik/util/variant.hpp>
+
+#include "config.hpp"
+
+namespace visual_tests
+{
+
+class console_report
+{
+public:
+ console_report() : s(std::clog)
+ {
+ }
+
+ console_report(std::ostream & s) : s(s)
+ {
+ }
+
+ void report(result const & r);
+ unsigned summary(result_list const & results);
+
+protected:
+ std::ostream & s;
+};
+
+class console_short_report : public console_report
+{
+public:
+ console_short_report() : console_report()
+ {
+ }
+
+ console_short_report(std::ostream & s) : console_report(s)
+ {
+ }
+
+ void report(result const & r);
+};
+
+class html_report
+{
+public:
+ html_report(std::ostream & s) : s(s)
+ {
+ }
+
+ void report(result const & r, boost::filesystem::path const & output_dir);
+ void summary(result_list const & results, boost::filesystem::path const & output_dir);
+
+protected:
+ std::ostream & s;
+};
+
+using report_type = mapnik::util::variant<console_report, console_short_report>;
+
+class report_visitor
+{
+public:
+ report_visitor(result const & r)
+ : result_(r)
+ {
+ }
+
+ template <typename T>
+ void operator()(T & report) const
+ {
+ return report.report(result_);
+ }
+
+private:
+ result const & result_;
+};
+
+class summary_visitor
+{
+public:
+ summary_visitor(result_list const & r)
+ : result_(r)
+ {
+ }
+
+ template <typename T>
+ unsigned operator()(T & report) const
+ {
+ return report.summary(result_);
+ }
+
+private:
+ result_list const & result_;
+};
+
+void html_summary(result_list const & results, boost::filesystem::path output_dir);
+
+}
+
+#endif
diff --git a/test/visual/run.cpp b/test/visual/run.cpp
new file mode 100644
index 0000000..6875e20
--- /dev/null
+++ b/test/visual/run.cpp
@@ -0,0 +1,99 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#include "runner.hpp"
+#include "config.hpp"
+
+#include <mapnik/datasource_cache.hpp>
+#include <mapnik/font_engine_freetype.hpp>
+
+// boost
+#include <boost/program_options.hpp>
+
+int main(int argc, char** argv)
+{
+ using namespace visual_tests;
+ namespace po = boost::program_options;
+
+ po::options_description desc("visual test runner");
+ desc.add_options()
+ ("help,h", "produce usage message")
+ ("verbose,v", "verbose output")
+ ("overwrite,o", "overwrite reference image")
+ ("jobs,j", po::value<std::size_t>()->default_value(1), "number of parallel threads")
+ ("styles-dir", po::value<std::string>()->default_value("test/data-visual/styles"), "directory with styles")
+ ("images-dir", po::value<std::string>()->default_value("test/data-visual/images"), "directory with reference images")
+ ("output-dir", po::value<std::string>()->default_value("/tmp/mapnik-visual-images"), "directory for output files")
+ ("unique-subdir,u", "write output files to subdirectory with unique name")
+ ("styles", po::value<std::vector<std::string>>(), "selected styles to test")
+ ("fonts", po::value<std::string>()->default_value("fonts"), "font search path")
+ ("plugins", po::value<std::string>()->default_value("plugins/input"), "input plugins search path")
+ ;
+
+ po::positional_options_description p;
+ p.add("styles", -1);
+ po::variables_map vm;
+ po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
+ po::notify(vm);
+
+ if (vm.count("help"))
+ {
+ std::clog << desc << std::endl;
+ return 1;
+ }
+
+ mapnik::freetype_engine::register_fonts(vm["fonts"].as<std::string>(), true);
+ mapnik::datasource_cache::instance().register_datasources(vm["plugins"].as<std::string>());
+
+ boost::filesystem::path output_dir(vm["output-dir"].as<std::string>());
+
+ if (vm.count("unique-subdir"))
+ {
+ output_dir /= boost::filesystem::unique_path();
+ }
+
+ runner run(vm["styles-dir"].as<std::string>(),
+ output_dir,
+ vm["images-dir"].as<std::string>(),
+ vm.count("overwrite"),
+ vm["jobs"].as<std::size_t>());
+ report_type report = vm.count("verbose") ? report_type((console_report())) : report_type((console_short_report()));
+ result_list results;
+
+ if (vm.count("styles"))
+ {
+ results = run.test(vm["styles"].as<std::vector<std::string>>(), report);
+ }
+ else
+ {
+ results = run.test_all(report);
+ }
+
+ unsigned failed_count = mapnik::util::apply_visitor(summary_visitor(results), report);
+
+ if (failed_count)
+ {
+ html_summary(results, output_dir);
+ }
+
+ return failed_count;
+}
diff --git a/test/visual/runner.cpp b/test/visual/runner.cpp
new file mode 100644
index 0000000..64b475f
--- /dev/null
+++ b/test/visual/runner.cpp
@@ -0,0 +1,248 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+// stl
+#include <algorithm>
+#include <future>
+
+#include <mapnik/load_map.hpp>
+
+#include "runner.hpp"
+
+namespace visual_tests
+{
+
+class renderer_visitor
+{
+public:
+ renderer_visitor(std::string const & name, mapnik::Map const & map, double scale_factor)
+ : name_(name), map_(map), scale_factor_(scale_factor)
+ {
+ }
+
+ template <typename T>
+ result operator()(T const & renderer) const
+ {
+ return renderer.test(name_, map_, scale_factor_);
+ }
+
+private:
+ std::string const & name_;
+ mapnik::Map const & map_;
+ double scale_factor_;
+};
+
+runner::runner(runner::path_type const & styles_dir,
+ runner::path_type const & output_dir,
+ runner::path_type const & reference_dir,
+ bool overwrite,
+ std::size_t jobs)
+ : styles_dir_(styles_dir),
+ output_dir_(output_dir),
+ reference_dir_(reference_dir),
+ jobs_(jobs),
+ renderers_{ renderer<agg_renderer>(output_dir_, reference_dir_, overwrite),
+ renderer<cairo_renderer>(output_dir_, reference_dir_, overwrite)/*,
+ renderer<grid_renderer>(output_dir_, reference_dir_, overwrite)*/ }
+{
+}
+
+result_list runner::test_all(report_type & report) const
+{
+ boost::filesystem::directory_iterator begin(styles_dir_);
+ boost::filesystem::directory_iterator end;
+ std::vector<runner::path_type> files(begin, end);
+ return test_parallel(files, report, jobs_);
+}
+
+result_list runner::test(std::vector<std::string> const & style_names, report_type & report) const
+{
+ std::vector<runner::path_type> files(style_names.size());
+ std::transform(style_names.begin(), style_names.end(), std::back_inserter(files),
+ [&](runner::path_type const & name)
+ {
+ return (name.extension() == ".xml") ? name : (styles_dir_ / (name.string() + ".xml"));
+ });
+ return test_parallel(files, report, jobs_);
+}
+
+result_list runner::test_parallel(std::vector<runner::path_type> const & files, report_type & report, std::size_t jobs) const
+{
+ result_list results;
+
+ if (files.empty())
+ {
+ return results;
+ }
+
+ if (jobs == 0)
+ {
+ jobs = 1;
+ }
+
+ std::size_t chunk_size = files.size() / jobs;
+
+ if (chunk_size == 0)
+ {
+ chunk_size = files.size();
+ jobs = 1;
+ }
+
+ std::launch launch(jobs == 1 ? std::launch::deferred : std::launch::async);
+ std::vector<std::future<result_list>> futures(jobs);
+
+ for (std::size_t i = 0; i < jobs; i++)
+ {
+ files_iterator begin(files.begin() + i * chunk_size);
+ files_iterator end(files.begin() + (i + 1) * chunk_size);
+
+ // Handle remainder of files.size() / jobs
+ if (i == jobs - 1)
+ {
+ end = files.end();
+ }
+
+ futures[i] = std::async(launch, &runner::test_range, this, begin, end, std::ref(report));
+ }
+
+ for (auto & f : futures)
+ {
+ result_list r = f.get();
+ std::move(r.begin(), r.end(), std::back_inserter(results));
+ }
+
+ return results;
+}
+
+result_list runner::test_range(files_iterator begin, files_iterator end, std::reference_wrapper<report_type> report) const
+{
+ config defaults;
+ result_list results;
+
+ for (runner::files_iterator i = begin; i != end; i++)
+ {
+ runner::path_type const & file = *i;
+ if (file.extension() == ".xml")
+ {
+ try
+ {
+ result_list r = test_one(file, defaults, report);
+ std::move(r.begin(), r.end(), std::back_inserter(results));
+ }
+ catch (std::exception const& ex)
+ {
+ result r;
+ r.state = STATE_ERROR;
+ r.name = file.string();
+ r.error_message = ex.what();
+ results.emplace_back(r);
+ mapnik::util::apply_visitor(report_visitor(r), report.get());
+ }
+ }
+ }
+
+ return results;
+}
+
+result_list runner::test_one(runner::path_type const& style_path, config cfg, report_type & report) const
+{
+ mapnik::Map m(cfg.sizes.front().width, cfg.sizes.front().height);
+ result_list results;
+
+ try
+ {
+ mapnik::load_map(m, style_path.string(), true);
+ }
+ catch (std::exception const& ex)
+ {
+ std::string what = ex.what();
+ if (what.find("Could not create datasource") != std::string::npos ||
+ what.find("Postgis Plugin: could not connect to server") != std::string::npos)
+ {
+ return results;
+ }
+ throw;
+ }
+
+ mapnik::parameters const & params = m.get_extra_parameters();
+
+ boost::optional<mapnik::value_integer> status = params.get<mapnik::value_integer>("status", cfg.status);
+
+ if (!*status)
+ {
+ return results;
+ }
+
+ boost::optional<std::string> sizes = params.get<std::string>("sizes");
+
+ if (sizes)
+ {
+ cfg.sizes.clear();
+ parse_map_sizes(*sizes, cfg.sizes);
+ }
+
+ std::string name(style_path.stem().string());
+
+ for (map_size const & size : cfg.sizes)
+ {
+ m.resize(size.width, size.height);
+
+ boost::optional<std::string> bbox_string = params.get<std::string>("bbox");
+
+ if (bbox_string)
+ {
+ mapnik::box2d<double> bbox;
+ bbox.from_string(*bbox_string);
+ m.zoom_to_box(bbox);
+ }
+ else
+ {
+ m.zoom_all();
+ }
+
+ for (double const & scale_factor : cfg.scales)
+ {
+ for(auto const& ren : renderers_)
+ {
+ result r = mapnik::util::apply_visitor(renderer_visitor(name, m, scale_factor), ren);
+ results.emplace_back(r);
+ mapnik::util::apply_visitor(report_visitor(r), report);
+ }
+ }
+ }
+
+ return results;
+}
+
+void runner::parse_map_sizes(std::string const & str, std::vector<map_size> & sizes) const
+{
+ boost::spirit::ascii::space_type space;
+ std::string::const_iterator iter = str.begin();
+ std::string::const_iterator end = str.end();
+ if (!boost::spirit::qi::phrase_parse(iter, end, map_sizes_parser_, space, sizes))
+ {
+ throw std::runtime_error("Failed to parse list of sizes: '" + str + "'");
+ }
+}
+
+}
+
diff --git a/test/visual/runner.hpp b/test/visual/runner.hpp
new file mode 100644
index 0000000..848249d
--- /dev/null
+++ b/test/visual/runner.hpp
@@ -0,0 +1,70 @@
+/*****************************************************************************
+ *
+ * This file is part of Mapnik (c++ mapping toolkit)
+ *
+ * Copyright (C) 2015 Artem Pavlenko
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *****************************************************************************/
+
+#ifndef VISUAL_TEST_RUNNER_HPP
+#define VISUAL_TEST_RUNNER_HPP
+
+#include <mapnik/util/variant.hpp>
+
+#include "config.hpp"
+#include "report.hpp"
+#include "renderer.hpp"
+#include "map_sizes_grammar.hpp"
+
+namespace visual_tests
+{
+
+class runner
+{
+ using renderer_type = mapnik::util::variant<renderer<agg_renderer>,
+ renderer<cairo_renderer>/*,
+ renderer<grid_renderer>*/>;
+ using path_type = boost::filesystem::path;
+ using files_iterator = std::vector<path_type>::const_iterator;
+
+public:
+ runner(path_type const & styles_dir,
+ path_type const & output_dir,
+ path_type const & reference_dir,
+ bool overwrite,
+ std::size_t jobs);
+
+ result_list test_all(report_type & report) const;
+ result_list test(std::vector<std::string> const & style_names, report_type & report) const;
+
+private:
+ result_list test_parallel(std::vector<path_type> const & files, report_type & report, std::size_t jobs) const;
+ result_list test_range(files_iterator begin, files_iterator end, std::reference_wrapper<report_type> report) const;
+ result_list test_one(path_type const & style_path, config cfg, report_type & report) const;
+ void parse_map_sizes(std::string const & str, std::vector<map_size> & sizes) const;
+
+ const map_sizes_grammar<std::string::const_iterator> map_sizes_parser_;
+ const path_type styles_dir_;
+ const path_type output_dir_;
+ const path_type reference_dir_;
+ const std::size_t jobs_;
+ const renderer_type renderers_[boost::mpl::size<renderer_type::types>::value];
+};
+
+}
+
+#endif
diff --git a/tests/cpp_tests/agg_blend_src_over_test.cpp b/tests/cpp_tests/agg_blend_src_over_test.cpp
deleted file mode 100644
index 0b4648f..0000000
--- a/tests/cpp_tests/agg_blend_src_over_test.cpp
+++ /dev/null
@@ -1,221 +0,0 @@
-#include <boost/detail/lightweight_test.hpp>
-#include <iostream>
-#include <cstdio>
-#include <cstring>
-#include <sstream>
-#include <string>
-#include <vector>
-#include <algorithm>
-#include "agg_color_rgba.h"
-#include "agg_pixfmt_rgba.h"
-#include "agg_rendering_buffer.h"
-#include "agg_renderer_base.h"
-
-using color = agg::rgba8;
-using order = agg::order_rgba;
-
-std::string to_string(color const& c)
-{
- std::ostringstream s;
- s << "rgba(" << (unsigned)c.r << "," << (unsigned)c.g << "," << (unsigned)c.b << "," << (unsigned)c.a << ")";
- return s.str();
-}
-
-template<typename blender>
-color blend(color const& source, color const& dest, unsigned cover=255)
-{
- unsigned stride = 4;
- unsigned size = 1;
-
- color source_pre = source;
- source_pre.premultiply();
- color dest_pre = dest;
- dest_pre.premultiply();
-
- unsigned char* buffer = new unsigned char[size*size*stride];
- std::memset(buffer, 0, size*size*stride);
- buffer[0] = dest_pre.r;
- buffer[1] = dest_pre.g;
- buffer[2] = dest_pre.b;
- buffer[3] = dest_pre.a;
- // http://www.antigrain.com/doc/basic_renderers/basic_renderers.agdoc.html
- agg::rendering_buffer rbuf(buffer,
- size,
- size,
- size * stride);
- color::value_type* psource = (color::value_type*)rbuf.row_ptr(0,0,1);
- blender::blend_pix(psource,source_pre.r,source_pre.g,source_pre.b,source_pre.a,cover);
- color color_result(psource[0],psource[1],psource[2],psource[3]);
- color_result.demultiply();
- delete [] buffer;
- return color_result;
-}
-
-// agg::pixfmt_alpha_blend_rgba
-color normal_blend(color const& source, color const& dest, unsigned cover=255)
-{
- using renderer_type = agg::renderer_base<agg::pixfmt_rgba32_pre>;
- unsigned stride = 4;
- unsigned size = 1;
- color source_pre = source;
- source_pre.premultiply();
- color dest_pre = dest;
- dest_pre.premultiply();
- // source buffer
- unsigned char* source_buffer = new unsigned char[size*size*stride];
- std::memset(source_buffer, 0, size*size*stride);
- source_buffer[0] = source_pre.r;
- source_buffer[1] = source_pre.g;
- source_buffer[2] = source_pre.b;
- source_buffer[3] = source_pre.a;
- agg::rendering_buffer source_rbuffer(source_buffer,size,size,size * 4);
- agg::pixfmt_rgba32_pre pixf_source(source_rbuffer);
-
- // destination buffer
- unsigned char* dest_buffer = new unsigned char[size*size*stride];
- std::memset(dest_buffer, 0, size*size*stride);
- dest_buffer[0] = dest_pre.r;
- dest_buffer[1] = dest_pre.g;
- dest_buffer[2] = dest_pre.b;
- dest_buffer[3] = dest_pre.a;
- agg::rendering_buffer dest_rbuffer(dest_buffer,size,size,size * 4);
- agg::pixfmt_rgba32_pre pixf_dest(dest_rbuffer);
-
- // renderer: blends source into destination
- renderer_type ren(pixf_dest);
- ren.blend_from(pixf_source,0,0,0,cover);
- color color_result(dest_buffer[0],dest_buffer[1],dest_buffer[2],dest_buffer[3]);
- color_result.demultiply();
- delete [] source_buffer;
- delete [] dest_buffer;
- return color_result;
-}
-
-
-
-namespace agg {
-
-// the original agg template code for src_over
-// before we changed A as per https://github.com/mapnik/mapnik/issues/1452
-template<class ColorT, class Order> struct comp_op_rgba_src_over2
-{
- using color_type = ColorT;
- using order_type = Order;
- using value_type = typename color_type::value_type;
- using calc_type = typename color_type::calc_type;
- enum base_scale_e
- {
- base_shift = color_type::base_shift,
- base_mask = color_type::base_mask
- };
-
- // Dca' = Sca + Dca.(1 - Sa)
- // Da' = Sa + Da - Sa.Da
- static void blend_pix(value_type* p,
- unsigned sr, unsigned sg, unsigned sb,
- unsigned sa, unsigned cover)
- {
- if(cover < 255)
- {
- sr = (sr * cover + 255) >> 8;
- sg = (sg * cover + 255) >> 8;
- sb = (sb * cover + 255) >> 8;
- sa = (sa * cover + 255) >> 8;
- }
- calc_type s1a = base_mask - sa;
- p[Order::R] = (value_type)(sr + ((p[Order::R] * s1a + base_mask) >> base_shift));
- p[Order::G] = (value_type)(sg + ((p[Order::G] * s1a + base_mask) >> base_shift));
- p[Order::B] = (value_type)(sb + ((p[Order::B] * s1a + base_mask) >> base_shift));
- p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift));
- }
-};
-
-}
-
-int main(int argc, char** argv)
-{
- std::vector<std::string> args;
- for (int i=1;i<argc;++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end();
-
- using source_over_old_agg = agg::comp_op_rgba_src_over2<color, agg::order_rgba>;
- using source_over = agg::comp_op_rgba_src_over<color, agg::order_rgba>;
-
- try
- {
- color white(255,255,255,255);
- color black(0,0,0,255);
-
- BOOST_TEST_EQ( to_string(blend<source_over>(white,white)), to_string(white) );
- BOOST_TEST_EQ( to_string(blend<source_over>(white,black)), to_string(white) );
- BOOST_TEST_EQ( to_string(blend<source_over>(black,white)), to_string(black) );
-
- // https://github.com/mapnik/mapnik/issues/1452#issuecomment-8154646
- color near_white(254,254,254,254); // Source
- color near_trans(1,1,1,1); // Dest
- color expected_color(252,252,252,255); // expected result
- BOOST_TEST_EQ( to_string(blend<source_over_old_agg>(near_white,near_trans)), to_string(color(252,252,252,254)) );
- BOOST_TEST_EQ( to_string(blend<source_over>(near_white,near_trans)), to_string(expected_color) );
- BOOST_TEST_EQ( to_string(normal_blend(near_white,near_trans)), to_string(expected_color) );
-
- // using normal_blend as expected, compare a variety of other colors
-
- {
- color source(128,128,128,255);
- color dest(128,128,128,255);
- unsigned cover = 128;
- std::string expected_str = to_string(normal_blend(source,dest,cover));
- BOOST_TEST_EQ( to_string(blend<source_over>(source,dest,cover)), expected_str );
- BOOST_TEST_EQ( to_string(blend<source_over_old_agg>(source,dest,cover)), expected_str );
- }
-
- {
- color source(128,128,128,255);
- color dest(128,128,128,255);
- unsigned cover = 245;
- std::string expected_str = to_string(normal_blend(source,dest,cover));
- BOOST_TEST_EQ( to_string(blend<source_over>(source,dest,cover)), expected_str );
- BOOST_TEST_EQ( to_string(blend<source_over_old_agg>(source,dest,cover)), expected_str );
- }
-
- // commenting until I study these failures more (dane)
- /*
- {
- // fails, why?
- color source(127,127,127,127);
- color dest(127,127,127,127);
- unsigned cover = 255;
- std::string expected_str = to_string(normal_blend(source,dest,cover));
- BOOST_TEST_EQ( to_string(blend<source_over>(source,dest,cover)), expected_str );
- BOOST_TEST_EQ( to_string(blend<source_over_old_agg>(source,dest,cover)), expected_str );
- }
-
- {
- // fails, why?
- color source(128,128,128,128);
- color dest(128,128,128,128);
- unsigned cover = 128;
- std::string expected_str = to_string(normal_blend(source,dest,cover));
- BOOST_TEST_EQ( to_string(blend<source_over>(source,dest,cover)), expected_str );
- BOOST_TEST_EQ( to_string(blend<source_over_old_agg>(source,dest,cover)), expected_str );
- }
- */
- }
- catch (std::exception const & ex)
- {
- std::clog << ex.what() << "\n";
- BOOST_TEST(false);
- }
-
- if (!::boost::detail::test_errors()) {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ AGG blending: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- } else {
- std::clog << "C++ AGG blending: ";
- return ::boost::report_errors();
- }
-}
diff --git a/tests/cpp_tests/build.py b/tests/cpp_tests/build.py
deleted file mode 100644
index 7311230..0000000
--- a/tests/cpp_tests/build.py
+++ /dev/null
@@ -1,48 +0,0 @@
-import os
-import glob
-from copy import copy
-
-Import ('env')
-
-test_env = env.Clone()
-
-if not env['CPP_TESTS']:
- for cpp_test_bin in glob.glob('*-bin'):
- os.unlink(cpp_test_bin)
-else:
- test_env['LIBS'] = [env['MAPNIK_NAME']]
- test_env.AppendUnique(LIBS=copy(env['LIBMAPNIK_LIBS']))
- if env['RUNTIME_LINK'] == 'static' and env['PLATFORM'] == 'Linux':
- test_env.AppendUnique(LIBS='dl')
- test_env.AppendUnique(CXXFLAGS='-g')
- test_env['CXXFLAGS'] = copy(test_env['LIBMAPNIK_CXXFLAGS'])
- test_env.Append(CPPDEFINES = env['LIBMAPNIK_DEFINES'])
- if test_env['HAS_CAIRO']:
- test_env.PrependUnique(CPPPATH=test_env['CAIRO_CPPPATHS'])
- test_env.Append(CPPDEFINES = '-DHAVE_CAIRO')
- for cpp_test in glob.glob('*_test.cpp'):
- name = cpp_test.replace('.cpp','-bin')
- source_files = [cpp_test]
- test_program = None
- # enable for faster compile while developing just this test
- #if 'agg_blend_src_over_test' in cpp_test:
- if False:
- # customization here for faster compile
- agg_env = Environment(ENV=os.environ)
- agg_env['CXX'] = env['CXX']
- agg_env['CXXFLAGS'] = env['CXXFLAGS']
- if 'agg' in test_env['LIBS']:
- agg_env.AppendUnique(LIBS='agg')
- agg_env.Append(CPPPATH = '#deps/agg/include')
- agg_env.Append(LIBPATH = '#deps/agg')
- agg_env['CPPPATH'] = ['#deps/agg/include',env['BOOST_INCLUDES']]
- test_program = agg_env.Program(name, source=source_files)
- else:
- test_env_local = test_env.Clone()
- if 'csv_parse' in cpp_test:
- source_files += glob.glob('../../plugins/input/csv/' + '*.cpp')
- test_program = test_env_local.Program(name, source=source_files)
- Depends(test_program, env.subst('../../src/%s' % env['MAPNIK_LIB_NAME']))
- # build locally if installing
- if 'install' in COMMAND_LINE_TARGETS:
- env.Alias('install',test_program)
diff --git a/tests/cpp_tests/clipping_test.cpp b/tests/cpp_tests/clipping_test.cpp
deleted file mode 100644
index c811634..0000000
--- a/tests/cpp_tests/clipping_test.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-// mapnik
-#include <mapnik/geometry.hpp>
-#include <mapnik/util/conversions.hpp>
-#include <mapnik/util/trim.hpp>
-
-// boost
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/algorithm/string.hpp>
-#pragma GCC diagnostic pop
-
-// stl
-#include <stdexcept>
-#include <iostream>
-#include <sstream>
-#include <fstream>
-#include <vector>
-#include <algorithm>
-
-// agg
-#include "agg_conv_clip_polygon.h"
-#include "agg_conv_clip_polyline.h"
-//#include "agg_path_storage.h"
-//#include "agg_conv_clipper.h"
-
-#include "utils.hpp"
-
-template <typename T>
-std::string dump_path(T & path)
-{
- unsigned cmd = 1;
- double x = 0;
- double y = 0;
- unsigned idx = 0;
- std::ostringstream s;
- path.rewind(0);
- while ((cmd = path.vertex(&x, &y)) != mapnik::SEG_END)
- {
- if (idx > 0) s << ",";
- s << x << " " << y << " " << cmd;
- idx++;
- }
- return s.str();
-}
-
-std::string clip_line(mapnik::box2d<double> const& bbox,
- mapnik::geometry_type & geom)
-{
- using line_clipper = agg::conv_clip_polyline<mapnik::geometry_type>;
- line_clipper clipped(geom);
- clipped.clip_box(bbox.minx(),bbox.miny(),bbox.maxx(),bbox.maxy());
- return dump_path(clipped);
-}
-
-void parse_geom(mapnik::geometry_type & geom,
- std::string const& geom_string) {
- std::vector<std::string> vertices;
- boost::split(vertices, geom_string, boost::is_any_of(","));
- for (std::string const& vert : vertices)
- {
- std::vector<std::string> commands;
- boost::split(commands, vert, boost::is_any_of(" "));
- if (commands.size() != 3)
- {
- throw std::runtime_error(std::string("could not parse geometry '") + geom_string + "'");
- }
- double x = 0;
- double y = 0;
- int c = 0;
- if (mapnik::util::string2double(commands[0],x)
- && mapnik::util::string2double(commands[1],y)
- && mapnik::util::string2int(commands[2],c))
- {
- geom.push_vertex(x,y,(mapnik::CommandType)c);
- }
- else
- {
- throw std::runtime_error(std::string("could not parse geometry '") + geom_string + "'");
- }
- }
-}
-
-int main(int argc, char** argv)
-{
- std::vector<std::string> args;
- for (int i=1;i<argc;++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end();
-
- try {
-
- BOOST_TEST(set_working_dir(args));
-
- std::string filename("tests/cpp_tests/data/cases.txt");
- std::ifstream stream(filename.c_str(),std::ios_base::in | std::ios_base::binary);
- if (!stream.is_open())
- throw std::runtime_error("could not open: '" + filename + "'");
-
- std::string csv_line;
- while(std::getline(stream,csv_line,'\n'))
- {
- if (csv_line.empty() || csv_line[0] == '#') continue;
- std::vector<std::string> parts;
- boost::split(parts, csv_line, boost::is_any_of(";"));
- // first part is clipping box
- mapnik::box2d<double> bbox;
- if (!bbox.from_string(parts[0])) {
- throw std::runtime_error(std::string("could not parse bbox '") + parts[0] + "'");
- }
- // second part is input geometry
- mapnik::geometry_type geom;
- parse_geom(geom,parts[1]);
- //std::clog << dump_path(geom) << "\n";
- // third part is expected, clipped geometry
- BOOST_TEST_EQ(clip_line(bbox,geom),mapnik::util::trim_copy(parts[2]));
- }
- stream.close();
- }
- catch (std::exception const& ex)
- {
- std::cerr << ex.what() << "\n";
- }
-
- if (!::boost::detail::test_errors())
- {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ clipping: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- }
- else
- {
- return ::boost::report_errors();
- }
-}
diff --git a/tests/cpp_tests/conversions_test.cpp b/tests/cpp_tests/conversions_test.cpp
deleted file mode 100644
index bb86f71..0000000
--- a/tests/cpp_tests/conversions_test.cpp
+++ /dev/null
@@ -1,309 +0,0 @@
-#include <mapnik/value_types.hpp>
-#include <mapnik/value.hpp>
-#include <mapnik/util/conversions.hpp>
-#include <boost/detail/lightweight_test.hpp>
-#include <iostream>
-#include <vector>
-#include <algorithm>
-#include <boost/unordered_map.hpp>
-
-#if defined(_MSC_VER) && _MSC_VER < 1900
-#include <cstdio>
-#endif
-
-int main(int argc, char** argv)
-{
- #if defined(_MSC_VER) && _MSC_VER < 1900
- unsigned int old = _set_output_format(_TWO_DIGIT_EXPONENT);
- #endif
- std::vector<std::string> args;
- for (int i=1;i<argc;++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end();
-
- using mapnik::util::to_string;
- using mapnik::util::string2bool;
-
- try
- {
- std::string out;
-
- // Test double
- to_string(out, double(0));
- BOOST_TEST_EQ( out, "0" );
- out.clear();
-
- to_string(out, double(1));
- BOOST_TEST_EQ( out, "1" );
- out.clear();
-
- to_string(out, double(-1));
- BOOST_TEST_EQ( out, "-1" );
- out.clear();
-
- to_string(out, double(0.1));
- BOOST_TEST_EQ( out, "0.1" );
- out.clear();
-
- to_string(out, double(-0.1));
- BOOST_TEST_EQ( out, "-0.1" );
- out.clear();
-
- to_string(out, double(0.123));
- BOOST_TEST_EQ( out, "0.123" );
- out.clear();
-
- to_string(out, double(-0.123));
- BOOST_TEST_EQ( out, "-0.123" );
- out.clear();
-
- to_string(out, double(1e-06));
- BOOST_TEST_EQ( out, "1e-06" );
- out.clear();
-
- to_string(out, double(-1e-06));
- BOOST_TEST_EQ( out, "-1e-06" );
- out.clear();
-
- to_string(out, double(1e-05));
- BOOST_TEST_EQ( out, "1e-05" );
- out.clear();
-
- to_string(out, double(-1e-05));
- BOOST_TEST_EQ( out, "-1e-05" );
- out.clear();
-
- to_string(out, double(0.0001));
- BOOST_TEST_EQ( out, "0.0001" );
- out.clear();
-
- to_string(out, double(-0.0001));
- BOOST_TEST_EQ( out, "-0.0001" );
- out.clear();
-
- to_string(out, double(0.0001));
- BOOST_TEST_EQ( out, "0.0001" );
- out.clear();
-
- to_string(out, double(0.00001));
- BOOST_TEST_EQ( out, "1e-05" );
- out.clear();
-
- to_string(out, double(0.000001));
- BOOST_TEST_EQ( out, "1e-06" );
- out.clear();
-
- to_string(out, double(0.0000001));
- BOOST_TEST_EQ( out, "1e-07" );
- out.clear();
-
- to_string(out, double(0.00000001));
- BOOST_TEST_EQ( out, "1e-08" );
- out.clear();
-
- to_string(out, double(0.000000001));
- BOOST_TEST_EQ( out, "1e-09" );
- out.clear();
-
- to_string(out, double(0.0000000001));
- BOOST_TEST_EQ( out, "1e-10" );
- out.clear();
-
- 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" );
- out.clear();
-
- to_string(out, double(0.00000000001));
- BOOST_TEST_EQ( out, "1e-11" );
- out.clear();
-
- to_string(out, double(0.000000000001));
- BOOST_TEST_EQ( out, "1e-12" );
- out.clear();
-
- to_string(out, double(0.0000000000001));
- BOOST_TEST_EQ( out, "1e-13" );
- out.clear();
-
- to_string(out, double(0.00000000000001));
- BOOST_TEST_EQ( out, "1e-14" );
- out.clear();
-
- to_string(out, double(0.000000000000001));
- BOOST_TEST_EQ( out, "1e-15" );
- out.clear();
-
- to_string(out, double(100000));
- BOOST_TEST_EQ( out, "100000" );
- out.clear();
-
- to_string(out, double(1000000));
- BOOST_TEST_EQ( out, "1e+06" );
- out.clear();
-
- to_string(out, double(10000000));
- BOOST_TEST_EQ( out, "1e+07" );
- out.clear();
-
- to_string(out, double(100000000));
- BOOST_TEST_EQ( out, "1e+08" );
- out.clear();
-
- to_string(out, double(1000000000));
- BOOST_TEST_EQ( out, "1e+09" );
- out.clear();
-
- to_string(out, double(10000000000));
- BOOST_TEST_EQ( out, "1e+10" );
- out.clear();
-
- to_string(out, double(100000000000));
- BOOST_TEST_EQ( out, "1e+11" );
- out.clear();
-
- to_string(out, double(1000000000000));
- BOOST_TEST_EQ( out, "1e+12" );
- out.clear();
-
- to_string(out, double(10000000000000));
- BOOST_TEST_EQ( out, "1e+13" );
- out.clear();
-
- to_string(out, double(100000000000000));
- BOOST_TEST_EQ( out, "1e+14" );
- out.clear();
-
- to_string(out, double(1000000000000005));
- BOOST_TEST_EQ( out, "1e+15" );
- out.clear();
-
- to_string(out, double(-1000000000000000));
- BOOST_TEST_EQ( out, "-1e+15" );
- out.clear();
-
- to_string(out, double(100000000000000.1));
- BOOST_TEST_EQ( out, "1e+14" );
- out.clear();
-
- to_string(out, double(1.00001));
- BOOST_TEST_EQ( out, "1.00001" );
- out.clear();
-
- to_string(out, double(67.65));
- BOOST_TEST_EQ( out, "67.65" );
- out.clear();
-
- to_string(out, double(67.35));
- BOOST_TEST_EQ( out, "67.35" );
- out.clear();
-
- 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" );
- out.clear();
-
- to_string(out, double(1.234e+16));
- BOOST_TEST_EQ( out, "1.234e+16" );
- out.clear();
-
- // int
- to_string(out, int(2));
- BOOST_TEST_EQ( out, "2" );
- out.clear();
-
- to_string(out, int(0));
- BOOST_TEST_EQ( out, "0" );
- out.clear();
-
- to_string(out, int(-2));
- BOOST_TEST_EQ( out, "-2" );
- out.clear();
-
- to_string(out, int(2147483647));
- BOOST_TEST_EQ( out, "2147483647" );
- out.clear();
-
- to_string(out, int(-2147483648));
- BOOST_TEST_EQ( out, "-2147483648" );
- out.clear();
-
- // unsigned
- to_string(out, unsigned(4294967295));
- BOOST_TEST_EQ( out, "4294967295" );
- out.clear();
-
-#ifdef BIGINT
- // long long
- to_string(out,mapnik::value_integer(-0));
- BOOST_TEST_EQ( out, "0" );
- out.clear();
-
- to_string(out,mapnik::value_integer(-2));
- BOOST_TEST_EQ( out, "-2" );
- out.clear();
-
- to_string(out,mapnik::value_integer(9223372036854775807));
- BOOST_TEST_EQ( out, "9223372036854775807" );
- out.clear();
-#else
- #ifdef _MSC_VER
- #pragma NOTE("BIGINT not defined so skipping large number conversion tests")
- #else
- #warning BIGINT not defined so skipping large number conversion tests
- #endif
-#endif
- // bool
- to_string(out, true);
- BOOST_TEST_EQ( out, "true" );
- out.clear();
-
- to_string(out, false);
- BOOST_TEST_EQ( out, "false" );
- out.clear();
-
- bool val = false;
- BOOST_TEST( !string2bool("this is invalid",val) );
- BOOST_TEST_EQ( val, false );
- BOOST_TEST( string2bool("true",val) );
- BOOST_TEST_EQ( val, true );
-
- // mapnik::value hashability
- using values_container = boost::unordered_map<mapnik::value, unsigned>;
- values_container vc;
- mapnik::value val2(1);
- vc[val2] = 1;
- BOOST_TEST_EQ( (int)vc[1], (int)1 );
-
- }
- catch (std::exception const & ex)
- {
- std::clog << ex.what() << "\n";
- BOOST_TEST(false);
- }
-
- if (!::boost::detail::test_errors()) {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ type conversions: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- } else {
- return ::boost::report_errors();
- }
-}
diff --git a/tests/cpp_tests/copy_move_test.cpp b/tests/cpp_tests/copy_move_test.cpp
deleted file mode 100644
index 665483e..0000000
--- a/tests/cpp_tests/copy_move_test.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-#include <boost/detail/lightweight_test.hpp>
-#include <iostream>
-#include <mapnik/layer.hpp>
-#include <mapnik/map.hpp>
-#include <mapnik/color.hpp>
-#include <mapnik/datasource.hpp>
-#include <mapnik/datasource_cache.hpp>
-
-#include <vector>
-#include <algorithm>
-
-int main(int argc, char** argv)
-{
- std::vector<std::string> args;
- for (int i=1;i<argc;++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end();
-
- try
- {
- mapnik::Map m0(100,100);
- mapnik::Map m2(200,100);
-
- // mapnik::datasource
- mapnik::datasource_cache::instance().register_datasources("plugins/input/shape.input");
- mapnik::parameters p;
- p["type"]="shape";
- p["file"]="demo/data/boundaries";
- p["encoding"]="latin1";
- auto ds0 = mapnik::datasource_cache::instance().create(p);
-
- auto ds1 = ds0; // shared ptr copy
- BOOST_TEST(ds1 == ds0);
- BOOST_TEST(*ds1 == *ds0);
- ds1 = mapnik::datasource_cache::instance().create(p); // new with the same parameters
- BOOST_TEST(ds1 != ds0);
- BOOST_TEST(*ds1 == *ds0);
- auto ds2 = std::move(ds1);
- BOOST_TEST(ds2 != ds0);
- BOOST_TEST(*ds2 == *ds0);
-
- // mapnik::layer
- mapnik::layer l0("test-layer");
- l0.set_datasource(ds0);
-
- mapnik::layer l1 = l0; // copy assignment
- BOOST_TEST(l1 == l0);
- mapnik::layer l2(l0); // copy ctor
- BOOST_TEST(l2 == l0);
- mapnik::layer l3(mapnik::layer("test-layer")); // move ctor
- l3.set_datasource(ds2);
-
- BOOST_TEST(l3 == l0);
- mapnik::layer l4 = std::move(l3);
- BOOST_TEST(l4 == l0); // move assignment
-
- m0.add_layer(l4);
- m0.set_background(mapnik::color("skyblue"));
- m2.set_background(mapnik::color("skyblue"));
-
- auto m1 = m0; //copy
-
- BOOST_TEST(m0 == m1);
- BOOST_TEST(m0 != m2);
-
- m2 = m1; // copy
- BOOST_TEST(m2 == m1);
- m2 = std::move(m1);
- BOOST_TEST(m2 == m0);
- BOOST_TEST(m1 != m0);
-
- BOOST_TEST(m0 == m2);
- }
- catch (std::exception const & ex)
- {
- std::clog << ex.what() << "\n";
- BOOST_TEST(false);
- }
-
- if (!::boost::detail::test_errors())
- {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ copy/move/assignment tests: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- }
- else
- {
- return ::boost::report_errors();
- }
-}
diff --git a/tests/cpp_tests/data/blank.jpg b/tests/cpp_tests/data/blank.jpg
deleted file mode 100644
index e69de29..0000000
diff --git a/tests/cpp_tests/data/blank.png b/tests/cpp_tests/data/blank.png
deleted file mode 100644
index e69de29..0000000
diff --git a/tests/cpp_tests/data/blank.tiff b/tests/cpp_tests/data/blank.tiff
deleted file mode 100644
index e69de29..0000000
diff --git a/tests/cpp_tests/data/blank.webp b/tests/cpp_tests/data/blank.webp
deleted file mode 100644
index e69de29..0000000
diff --git a/tests/cpp_tests/exceptions_test.cpp b/tests/cpp_tests/exceptions_test.cpp
deleted file mode 100644
index cc731fd..0000000
--- a/tests/cpp_tests/exceptions_test.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-#include <boost/detail/lightweight_test.hpp>
-#include <iostream>
-#include <mapnik/projection.hpp>
-#include <mapnik/map.hpp>
-#include <mapnik/save_map.hpp>
-#include <mapnik/graphics.hpp>
-#include <mapnik/feature.hpp>
-#include <mapnik/memory_datasource.hpp>
-#include <mapnik/feature_type_style.hpp>
-#include <mapnik/feature_factory.hpp>
-#include <mapnik/rule.hpp>
-#include <mapnik/expression.hpp>
-#include <mapnik/layer.hpp>
-#include <mapnik/agg_renderer.hpp>
-#include <mapnik/config_error.hpp>
-#include <mapnik/datasource_cache.hpp>
-#include <mapnik/params.hpp>
-#include <mapnik/util/fs.hpp>
-#include <vector>
-#include <algorithm>
-
-#include "utils.hpp"
-
-int main(int argc, char** argv)
-{
- std::vector<std::string> args;
- for (int i=1;i<argc;++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end();
-
- BOOST_TEST(set_working_dir(args));
- try {
- mapnik::projection srs("foo");
- // to avoid unused variable warning
- srs.params();
- BOOST_TEST(false);
- } catch (...) {
- BOOST_TEST(true);
- }
-
- // https://github.com/mapnik/mapnik/issues/2170
- try {
- BOOST_TEST(set_working_dir(args));
- mapnik::projection srs("+proj=longlat foo",true);
- BOOST_TEST(srs.is_geographic());
- BOOST_TEST(true);
- srs.init_proj4();
- // oddly init_proj4 does not throw with old proj/ubuntu precise
- //BOOST_TEST(false);
- } catch (...) {
- BOOST_TEST(true);
- }
-
- mapnik::Map map(256,256);
- mapnik::rule r;
- r.set_filter(mapnik::parse_expression("[foo]='bar'"));
- r.append(std::move(mapnik::markers_symbolizer()));
- mapnik::feature_type_style style;
- style.add_rule(std::move(r));
- map.insert_style("style", std::move(style));
-
- std::string csv_plugin("./plugins/input/csv.input");
- if (mapnik::util::exists(csv_plugin)) {
- try {
- mapnik::datasource_cache::instance().register_datasource(csv_plugin);
- mapnik::parameters p;
- p["type"]="csv";
- p["inline"]="x,y\n0,0";
- mapnik::datasource_ptr ds = mapnik::datasource_cache::instance().create(p);
- mapnik::layer l("layer");
- l.set_datasource(ds);
- l.add_style("style");
- mapnik::Map m = map;
- m.add_layer(l);
- m.zoom_all();
- mapnik::image_32 im(m.width(),m.height());
- mapnik::agg_renderer<mapnik::image_32> ren(m,im);
- //std::clog << mapnik::save_map_to_string(m) << "\n";
- BOOST_TEST(true);
- // should throw here with "CSV Plugin: no attribute 'foo'. Valid attributes are: x,y."
- ren.apply();
- BOOST_TEST(false);
- } catch (...) {
- BOOST_TEST(true);
- }
- }
-
- std::string shape_plugin("./plugins/input/shape.input");
- if (mapnik::util::exists(shape_plugin)) {
- try {
- mapnik::datasource_cache::instance().register_datasource(shape_plugin);
- mapnik::parameters p2;
- p2["type"]="shape";
- p2["file"]="foo";
- mapnik::datasource_cache::instance().create(p2);
- BOOST_TEST(false);
- } catch (...) {
- BOOST_TEST(true);
- }
- }
-
- if (!::boost::detail::test_errors()) {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ exceptions: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- } else {
- return ::boost::report_errors();
- }
-}
diff --git a/tests/cpp_tests/font_registration_test.cpp b/tests/cpp_tests/font_registration_test.cpp
deleted file mode 100644
index 39e568e..0000000
--- a/tests/cpp_tests/font_registration_test.cpp
+++ /dev/null
@@ -1,207 +0,0 @@
-#include <mapnik/font_engine_freetype.hpp>
-#include <mapnik/util/fs.hpp>
-#include <mapnik/map.hpp>
-#include <mapnik/load_map.hpp>
-#include <mapnik/debug.hpp>
-
-#include <boost/detail/lightweight_test.hpp>
-
-#include <iostream>
-#include <vector>
-#include <algorithm>
-
-#include "utils.hpp"
-
-int main(int argc, char** argv)
-{
- std::vector<std::string> args;
- for (int i=1;i<argc;++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end();
-
- try
- {
- mapnik::logger logger;
- mapnik::logger::severity_type original_severity = logger.get_severity();
-
- BOOST_TEST(set_working_dir(args));
-
-
- // grab references to global statics of registered/cached fonts
- auto const& global_mapping = mapnik::freetype_engine::get_mapping();
- auto const& global_cache = mapnik::freetype_engine::get_cache();
-
- // mapnik.Map object has parallel structure for localized fonts
- mapnik::Map m(1,1);
- auto const& local_mapping = m.get_font_file_mapping();
- auto const& local_cache = m.get_font_memory_cache();
-
- // should be empty to start
- BOOST_TEST( global_mapping.empty() );
- BOOST_TEST( global_cache.empty() );
- BOOST_TEST( local_mapping.empty() );
- BOOST_TEST( local_cache.empty() );
-
- std::string fontdir("fonts/");
-
- BOOST_TEST( mapnik::util::exists( fontdir ) );
- BOOST_TEST( mapnik::util::is_directory( fontdir ) );
-
- // test map cached fonts
- BOOST_TEST( m.register_fonts(fontdir , false ) );
- BOOST_TEST( m.get_font_memory_cache().size() == 0 );
- BOOST_TEST( m.get_font_file_mapping().size() == 1 );
- BOOST_TEST( m.load_fonts() );
- BOOST_TEST( m.get_font_memory_cache().size() == 1 );
- BOOST_TEST( m.register_fonts(fontdir , true ) );
- BOOST_TEST( m.get_font_file_mapping().size() == 22 );
- BOOST_TEST( m.load_fonts() );
- BOOST_TEST( m.get_font_memory_cache().size() == 22 );
-
- // copy discards memory cache but not file mapping
- mapnik::Map m2(m);
- BOOST_TEST( m2.get_font_memory_cache().size() == 0 );
- BOOST_TEST( m2.get_font_file_mapping().size() == 22 );
- BOOST_TEST( m2.load_fonts() );
- BOOST_TEST( m2.get_font_memory_cache().size() == 22 );
-
- // test font-directory from XML
- mapnik::Map m3(1,1);
- mapnik::load_map_string(m3,"<Map font-directory=\"fonts/\"></Map>");
- BOOST_TEST( m3.get_font_memory_cache().size() == 0 );
- BOOST_TEST( m3.load_fonts() );
- BOOST_TEST( m3.get_font_memory_cache().size() == 1 );
-
- std::vector<std::string> face_names;
- std::string foo("foo");
- // fake directories
- BOOST_TEST( !mapnik::freetype_engine::register_fonts(foo , true ) );
- face_names = mapnik::freetype_engine::face_names();
- BOOST_TEST( face_names.size() == 0 );
- BOOST_TEST( !mapnik::freetype_engine::register_fonts(foo) );
- face_names = mapnik::freetype_engine::face_names();
- BOOST_TEST( face_names.size() == 0 );
-
- // directories without fonts
- // silence warnings here by altering the logging severity
- logger.set_severity(mapnik::logger::none);
- std::string src("src");
- // an empty directory will not return true
- // we need to register at least one font and not fail on any
- // to return true
- BOOST_TEST( mapnik::freetype_engine::register_font(src) == false );
- BOOST_TEST( mapnik::freetype_engine::register_fonts(src, true) == false );
- BOOST_TEST( mapnik::freetype_engine::face_names().size() == 0 );
-
- // bogus, emtpy file that looks like font
- BOOST_TEST( mapnik::freetype_engine::register_font("tests/data/fonts/fake.ttf") == false );
- BOOST_TEST( mapnik::freetype_engine::register_fonts("tests/data/fonts/fake.ttf") == false );
- BOOST_TEST( mapnik::freetype_engine::face_names().size() == 0 );
-
- BOOST_TEST( mapnik::freetype_engine::register_font("tests/data/fonts/intentionally-broken.ttf") == false );
- BOOST_TEST( mapnik::freetype_engine::register_fonts("tests/data/fonts/intentionally-broken.ttf") == false );
- BOOST_TEST( mapnik::freetype_engine::face_names().size() == 0 );
-
- // now restore the original severity
- logger.set_severity(original_severity);
-
- // register unifont, since we know it sits in the root fonts/ dir
- BOOST_TEST( mapnik::freetype_engine::register_fonts(fontdir) );
- face_names = mapnik::freetype_engine::face_names();
- BOOST_TEST( face_names.size() > 0 );
- BOOST_TEST( face_names.size() == 1 );
-
- // re-register unifont, should not have any affect
- BOOST_TEST( mapnik::freetype_engine::register_fonts(fontdir, false) );
- face_names = mapnik::freetype_engine::face_names();
- BOOST_TEST( face_names.size() == 1 );
-
- // single dejavu font in separate location
- std::string dejavu_bold_oblique("tests/data/fonts/DejaVuSansMono-BoldOblique.ttf");
- BOOST_TEST( mapnik::freetype_engine::register_font(dejavu_bold_oblique) );
- face_names = mapnik::freetype_engine::face_names();
- BOOST_TEST( face_names.size() == 2 );
-
- // now, inspect font mapping and confirm the correct 'DejaVu Sans Mono Bold Oblique' is registered
- using font_file_mapping = std::map<std::string, std::pair<int,std::string> >;
- font_file_mapping const& name2file = mapnik::freetype_engine::get_mapping();
- bool found_dejavu = false;
- for (auto const& item : name2file)
- {
- if (item.first == "DejaVu Sans Mono Bold Oblique")
- {
- found_dejavu = true;
- BOOST_TEST( item.second.first == 0 );
- BOOST_TEST( item.second.second == dejavu_bold_oblique );
- }
- }
- BOOST_TEST( found_dejavu );
-
- // recurse to find all dejavu fonts
- BOOST_TEST( mapnik::freetype_engine::register_fonts(fontdir, true) );
- face_names = mapnik::freetype_engine::face_names();
- BOOST_TEST( face_names.size() == 22 );
-
- // we should have re-registered 'DejaVu Sans Mono Bold Oblique' again,
- // but now at a new path
- bool found_dejavu2 = false;
- for (auto const& item : name2file)
- {
- if (item.first == "DejaVu Sans Mono Bold Oblique")
- {
- found_dejavu2 = true;
- BOOST_TEST( item.second.first == 0 );
- // path should be different
- BOOST_TEST( item.second.second != dejavu_bold_oblique );
- }
- }
- BOOST_TEST( found_dejavu2 );
-
- // now that global registry is populated
- // now test that a map only loads new fonts
- mapnik::Map m4(1,1);
- BOOST_TEST( m4.register_fonts(fontdir , true ) );
- BOOST_TEST( m4.get_font_memory_cache().size() == 0 );
- BOOST_TEST( m4.get_font_file_mapping().size() == 22 );
- BOOST_TEST( !m4.load_fonts() );
- BOOST_TEST( m4.get_font_memory_cache().size() == 0 );
- BOOST_TEST( m4.register_fonts(dejavu_bold_oblique, false) );
- BOOST_TEST( m4.load_fonts() );
- BOOST_TEST( m4.get_font_memory_cache().size() == 1 );
-
- // check that we can correctly read a .ttc containing
- // multiple valid faces
- // https://github.com/mapnik/mapnik/issues/2274
- BOOST_TEST( mapnik::freetype_engine::register_font("tests/data/fonts/NotoSans-Regular.ttc") );
- face_names = mapnik::freetype_engine::face_names();
- BOOST_TEST( face_names.size() == 24 );
-
- // now blindly register as many system fonts as possible
- // the goal here to make sure we don't crash
- // linux
- mapnik::freetype_engine::register_fonts("/usr/share/fonts/", true);
- mapnik::freetype_engine::register_fonts("/usr/local/share/fonts/", true);
- // osx
- mapnik::freetype_engine::register_fonts("/Library/Fonts/", true);
- mapnik::freetype_engine::register_fonts("/System/Library/Fonts/", true);
- // windows
- mapnik::freetype_engine::register_fonts("C:\\Windows\\Fonts", true);
- face_names = mapnik::freetype_engine::face_names();
- BOOST_TEST( face_names.size() > 22 );
- }
- catch (std::exception const & ex)
- {
- std::clog << ex.what() << "\n";
- BOOST_TEST(false);
- }
-
- if (!::boost::detail::test_errors()) {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ fonts registration: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- } else {
- return ::boost::report_errors();
- }
-}
diff --git a/tests/cpp_tests/fontset_runtime_test.cpp b/tests/cpp_tests/fontset_runtime_test.cpp
deleted file mode 100644
index 1b7cc59..0000000
--- a/tests/cpp_tests/fontset_runtime_test.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-#include <boost/detail/lightweight_test.hpp>
-#include <iostream>
-#include <mapnik/memory_datasource.hpp>
-#include <mapnik/datasource_cache.hpp>
-#include <mapnik/feature.hpp>
-#include <mapnik/feature_factory.hpp>
-#include <mapnik/unicode.hpp>
-#include <mapnik/geometry.hpp>
-#include <mapnik/map.hpp>
-#include <mapnik/params.hpp>
-#include <mapnik/expression.hpp>
-#include <mapnik/layer.hpp>
-#include <mapnik/rule.hpp>
-#include <mapnik/feature_type_style.hpp>
-#include <mapnik/agg_renderer.hpp>
-#include <mapnik/graphics.hpp>
-#include <mapnik/image_util.hpp>
-#include <mapnik/color_factory.hpp>
-#include <mapnik/save_map.hpp>
-#include <mapnik/value_types.hpp>
-#include <mapnik/symbolizer.hpp>
-#include <mapnik/text/placements/dummy.hpp>
-#include <mapnik/text/formatting/text.hpp>
-#include <vector>
-#include <algorithm>
-#include <mapnik/make_unique.hpp>
-
-// icu - for memory cleanup (to make valgrind happy)
-#include "unicode/uclean.h"
-
-#include "utils.hpp"
-
-int main(int argc, char** argv)
-{
- std::vector<std::string> args;
- for (int i=1;i<argc;++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end();
-
- try {
- BOOST_TEST(set_working_dir(args));
-
- // create a renderable map with a fontset and a text symbolizer
- // and do not register any fonts, to ensure the error thrown is reasonable
- mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>();
- ctx->push("name");
- mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx,1));
- mapnik::transcoder tr("utf-8");
- mapnik::value_unicode_string ustr = tr.transcode("hello world!");
- feature->put("name",ustr);
- auto pt = std::make_unique<mapnik::geometry_type>(mapnik::geometry_type::types::Point);
- pt->move_to(128,128);
- feature->add_geometry(pt.release());
-
- mapnik::parameters params;
- params["type"]="memory";
- auto ds = std::make_shared<mapnik::memory_datasource>(params);
- ds->push(feature);
- mapnik::Map m(256,256);
- mapnik::font_set fontset("fontset");
- // NOTE: this is a valid font, but will fail because none are registered
- fontset.add_face_name("DejaVu Sans Book");
- m.insert_fontset("fontset", fontset);
- mapnik::layer lyr("layer");
- lyr.set_datasource(ds);
- lyr.add_style("style");
- m.add_layer(lyr);
- mapnik::feature_type_style the_style;
- mapnik::rule r;
- mapnik::text_symbolizer text_sym;
- mapnik::text_placements_ptr placement_finder = std::make_shared<mapnik::text_placements_dummy>();
- placement_finder->defaults.format_defaults.face_name = "DejaVu Sans Book";
- placement_finder->defaults.format_defaults.text_size = 10.0;
- placement_finder->defaults.format_defaults.fill = mapnik::color(0,0,0);
- placement_finder->defaults.format_defaults.fontset = fontset;
- placement_finder->defaults.set_format_tree(std::make_shared<mapnik::formatting::text_node>(mapnik::parse_expression("[name]")));
- mapnik::put<mapnik::text_placements_ptr>(text_sym, mapnik::keys::text_placements_, placement_finder);
- r.append(std::move(text_sym));
- the_style.add_rule(std::move(r));
- m.insert_style("style", std::move(the_style) );
- m.zoom_to_box(mapnik::box2d<double>(-256,-256,
- 256,256));
- mapnik::image_32 buf(m.width(),m.height());
- mapnik::agg_renderer<mapnik::image_32> ren(m,buf);
- ren.apply();
- } catch (std::exception const& ex) {
- BOOST_TEST_EQ(std::string(ex.what()),std::string("Unable to find specified font face 'DejaVu Sans Book' in font set: 'fontset'"));
- }
- u_cleanup();
- if (!::boost::detail::test_errors()) {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ fontset runtime: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- } else {
- return ::boost::report_errors();
- }
-}
diff --git a/tests/cpp_tests/geometry_converters_test.cpp b/tests/cpp_tests/geometry_converters_test.cpp
deleted file mode 100644
index 23ff74d..0000000
--- a/tests/cpp_tests/geometry_converters_test.cpp
+++ /dev/null
@@ -1,203 +0,0 @@
-#include <boost/detail/lightweight_test.hpp>
-#include <iostream>
-#include <vector>
-#include <algorithm>
-#include "utils.hpp"
-
-#include <mapnik/layer.hpp>
-#include <mapnik/feature_type_style.hpp>
-#include <mapnik/rule.hpp>
-#include <mapnik/debug.hpp>
-#include <mapnik/view_transform.hpp>
-#include <mapnik/feature.hpp>
-#include <mapnik/vertex_converters.hpp>
-#include <mapnik/geometry.hpp>
-#include <mapnik/wkt/wkt_factory.hpp>
-#include <mapnik/wkt/wkt_grammar_impl.hpp>
-#include <mapnik/well_known_srs.hpp>
-#include <mapnik/wkt/wkt_generator_grammar.hpp>
-#include <mapnik/wkt/wkt_generator_grammar_impl.hpp>
-#include <mapnik/projection.hpp>
-#include <mapnik/proj_transform.hpp>
-
-// stl
-#include <stdexcept>
-
-struct output_geometry_backend
-{
- output_geometry_backend(mapnik::geometry_container & paths, mapnik::geometry_type::types type)
- : paths_(paths),
- type_(type) {}
-
- template <typename T>
- void add_path(T & path)
- {
- mapnik::vertex2d vtx(mapnik::vertex2d::no_init);
- path.rewind(0);
- std::unique_ptr<mapnik::geometry_type> geom_ptr(new mapnik::geometry_type(type_));
-
- while ((vtx.cmd = path.vertex(&vtx.x, &vtx.y)) != mapnik::SEG_END)
- {
- //std::cerr << vtx.x << "," << vtx.y << " cmd=" << vtx.cmd << std::endl;
- geom_ptr->push_vertex(vtx.x, vtx.y, (mapnik::CommandType)vtx.cmd);
- }
- paths_.push_back(geom_ptr.release());
- }
- mapnik::geometry_container & paths_;
- mapnik::geometry_type::types type_;
-};
-
-boost::optional<std::string> linestring_bbox_clipping(mapnik::box2d<double> bbox,
- std::string wkt_in)
-{
- using namespace mapnik;
- agg::trans_affine tr;
- projection src(MAPNIK_LONGLAT_PROJ);
- projection dst(MAPNIK_LONGLAT_PROJ);
- proj_transform prj_trans(src,dst);
- line_symbolizer sym;
- view_transform t(bbox.width(),bbox.height(), bbox);
- mapnik::geometry_container output_paths;
- output_geometry_backend backend(output_paths, mapnik::geometry_type::types::LineString);
-
- mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>();
- mapnik::feature_impl f(ctx,0);
- vertex_converter<output_geometry_backend,clip_line_tag>
- converter(bbox, backend, sym, t, prj_trans, tr, f, attributes(), 1.0);
-
- converter.set<clip_line_tag>();
-
- mapnik::geometry_container p;
- if (!mapnik::from_wkt(wkt_in , p))
- {
- throw std::runtime_error("Failed to parse WKT");
- }
-
- for (geometry_type & geom : p)
- {
- converter.apply(geom);
- }
-
- using sink_type = std::back_insert_iterator<std::string>;
- std::string wkt; // Use Python String directly ?
- sink_type sink(wkt);
- static const mapnik::wkt::wkt_multi_generator<sink_type, mapnik::geometry_container> generator;
- if (boost::spirit::karma::generate(sink, generator, output_paths))
- {
- return boost::optional<std::string>(wkt);
- }
- return boost::optional<std::string>();
-}
-
-boost::optional<std::string> polygon_bbox_clipping(mapnik::box2d<double> bbox,
- std::string wkt_in)
-{
- using namespace mapnik;
- agg::trans_affine tr;
- projection src(MAPNIK_LONGLAT_PROJ);
- projection dst(MAPNIK_LONGLAT_PROJ);
- proj_transform prj_trans(src,dst);
- polygon_symbolizer sym;
- view_transform t(bbox.width(),bbox.height(), bbox);
- mapnik::geometry_container output_paths;
- output_geometry_backend backend(output_paths, mapnik::geometry_type::types::Polygon);
-
- mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>();
- mapnik::feature_impl f(ctx,0);
- vertex_converter<output_geometry_backend, clip_poly_tag>
- converter(bbox, backend, sym, t, prj_trans, tr, f, attributes(), 1.0);
-
- converter.set<clip_poly_tag>();
-
- mapnik::geometry_container p;
- if (!mapnik::from_wkt(wkt_in , p))
- {
- throw std::runtime_error("Failed to parse WKT");
- }
-
- for (geometry_type & geom : p)
- {
- converter.apply(geom);
- }
-
- using sink_type = std::back_insert_iterator<std::string>;
- std::string wkt; // Use Python String directly ?
- sink_type sink(wkt);
- static const mapnik::wkt::wkt_multi_generator<sink_type, mapnik::geometry_container> generator;
- if (boost::spirit::karma::generate(sink, generator, output_paths))
- {
- return boost::optional<std::string>(wkt);
- }
-
- return boost::optional<std::string>();
-}
-
-int main(int argc, char** argv)
-{
- std::vector<std::string> args;
- for (int i=1;i<argc;++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end();
-
- BOOST_TEST(set_working_dir(args));
-
- try
- {
- // LineString/bbox clipping
- {
- std::string wkt_in("LineString(0 0,200 200)");
- boost::optional<std::string> result = linestring_bbox_clipping(mapnik::box2d<double>(50,50,150,150),wkt_in);
- BOOST_TEST(result);
- BOOST_TEST_EQ(*result,std::string("LineString(50 50,150 150)"));
- }
- // Polygon/bbox clipping
- #if 0
- // these tests will fail
- {
- std::string wkt_in("Polygon((50 50,150 50,150 150,50 150,50 50))");
- boost::optional<std::string> result = polygon_bbox_clipping(mapnik::box2d<double>(50,50,150,150),wkt_in);
- BOOST_TEST(result);
- BOOST_TEST_EQ(*result,std::string("Polygon((50 50,150 50,150 150,50 150,50 50))"));
- }
-
- {
- std::string wkt_in("Polygon((60 60,140 60,140 160,60 140,60 60))");
- boost::optional<std::string> result = polygon_bbox_clipping(mapnik::box2d<double>(50,50,150,150),wkt_in);
- BOOST_TEST(result);
- BOOST_TEST_EQ(*result,std::string("Polygon((60 60,140 60,140 160,60 140,60 60))"));
- }
-
- {
- std::string wkt_in("Polygon((0 0,10 0,10 10,0 10,0 0))");
- boost::optional<std::string> result = polygon_bbox_clipping(mapnik::box2d<double>(50,50,150,150),wkt_in);
- BOOST_TEST(result);
- BOOST_TEST_EQ(*result, std::string("GeometryCollection EMPTY"));
- }
- {
- std::string wkt_in("Polygon((0 0,100 200,200 0,0 0 ))");
- boost::optional<std::string> result = polygon_bbox_clipping(mapnik::box2d<double>(50,50,150,150),wkt_in);
- BOOST_TEST(result);
- BOOST_TEST_EQ(*result,std::string("Polygon((50 50,50 100,75 150,125 150,150 100,150 50,50 50))"));
- }
- #endif
- }
- catch (std::exception const & ex)
- {
- std::clog << ex.what() << "\n";
- BOOST_TEST(false);
- }
-
-
- if (!::boost::detail::test_errors())
- {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ geometry conversions: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- }
- else
- {
- return ::boost::report_errors();
- }
-}
diff --git a/tests/cpp_tests/image_io_test.cpp b/tests/cpp_tests/image_io_test.cpp
deleted file mode 100644
index 8ed34ea..0000000
--- a/tests/cpp_tests/image_io_test.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-#include <boost/detail/lightweight_test.hpp>
-#include <iostream>
-#include <mapnik/image_reader.hpp>
-#include <mapnik/image_util.hpp>
-#include <mapnik/util/fs.hpp>
-#include <vector>
-#include <algorithm>
-
-#include "utils.hpp"
-
-int main(int argc, char** argv)
-{
- std::vector<std::string> args;
- for (int i=1;i<argc;++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end();
-
- std::string should_throw;
- boost::optional<std::string> type;
- try
- {
- mapnik::image_data_32 im(256,256);
- mapnik::image_data_32::pixel_type * data = im.getData();
- mapnik::image_data_32 * im_ptr = new mapnik::image_data_32(im.width(),im.height(),data);
- mapnik::image_data_32::pixel_type * same_data = im_ptr->getData();
- BOOST_TEST(data == same_data);
- delete im_ptr;
- BOOST_TEST(data == same_data);
- BOOST_TEST(set_working_dir(args));
-
-#if defined(HAVE_JPEG)
- should_throw = "./tests/cpp_tests/data/blank.jpg";
- BOOST_TEST( mapnik::util::exists( should_throw ) );
- type = mapnik::type_from_filename(should_throw);
- BOOST_TEST( type );
- try
- {
- std::unique_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(should_throw,*type));
- BOOST_TEST( false );
- }
- catch (std::exception const&)
- {
- BOOST_TEST( true );
- }
-#endif
-
-#if defined(HAVE_PNG)
- should_throw = "./tests/cpp_tests/data/blank.png";
- BOOST_TEST( mapnik::util::exists( should_throw ) );
- type = mapnik::type_from_filename(should_throw);
- BOOST_TEST( type );
- try
- {
- std::unique_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(should_throw,*type));
- BOOST_TEST( false );
- }
- catch (std::exception const&)
- {
- BOOST_TEST( true );
- }
-
- should_throw = "./tests/data/images/xcode-CgBI.png";
- BOOST_TEST( mapnik::util::exists( should_throw ) );
- type = mapnik::type_from_filename(should_throw);
- BOOST_TEST( type );
- try
- {
- std::unique_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(should_throw,*type));
- BOOST_TEST( false );
- }
- catch (std::exception const&)
- {
- BOOST_TEST( true );
- }
-#endif
-
-#if defined(HAVE_TIFF)
- should_throw = "./tests/cpp_tests/data/blank.tiff";
- BOOST_TEST( mapnik::util::exists( should_throw ) );
- type = mapnik::type_from_filename(should_throw);
- BOOST_TEST( type );
- try
- {
- std::unique_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(should_throw,*type));
- BOOST_TEST( false );
- }
- catch (std::exception const&)
- {
- BOOST_TEST( true );
- }
-#endif
-
-#if defined(HAVE_WEBP)
- should_throw = "./tests/cpp_tests/data/blank.webp";
- BOOST_TEST( mapnik::util::exists( should_throw ) );
- type = mapnik::type_from_filename(should_throw);
- BOOST_TEST( type );
- try
- {
- std::unique_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(should_throw,*type));
- BOOST_TEST( false );
- }
- catch (std::exception const&)
- {
- BOOST_TEST( true );
- }
-#endif
- }
- catch (std::exception const & ex)
- {
- std::clog << ex.what() << "\n";
- BOOST_TEST(false);
- }
-
- if (!::boost::detail::test_errors()) {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ image i/o: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- } else {
- return ::boost::report_errors();
- }
-}
diff --git a/tests/cpp_tests/image_painted_test.cpp b/tests/cpp_tests/image_painted_test.cpp
deleted file mode 100644
index 946c211..0000000
--- a/tests/cpp_tests/image_painted_test.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-#include <iostream>
-
-#include <boost/detail/lightweight_test.hpp>
-
-#include <mapnik/map.hpp>
-#include <mapnik/layer.hpp>
-#include <mapnik/rule.hpp>
-#include <mapnik/feature_type_style.hpp>
-#include <mapnik/graphics.hpp>
-#include <mapnik/datasource_cache.hpp>
-#include <mapnik/agg_renderer.hpp>
-#include <mapnik/expression.hpp>
-
-int main(int argc, char** argv)
-{
- std::vector<std::string> args;
- for (int i = 1; i < argc; ++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q") != args.end();
-
- using namespace mapnik;
-
- try
- {
- datasource_cache::instance().register_datasources("plugins/input/csv.input");
-
- Map m(256, 256);
-
- feature_type_style lines_style;
- {
- rule r;
- line_symbolizer line_sym;
- r.append(std::move(line_sym));
- lines_style.add_rule(std::move(r));
- }
- m.insert_style("lines", std::move(lines_style));
-
- feature_type_style markers_style;
- {
- rule r;
- r.set_filter(parse_expression("False"));
- markers_symbolizer mark_sym;
- r.append(std::move(mark_sym));
- markers_style.add_rule(std::move(r));
- }
- m.insert_style("markers", std::move(markers_style));
-
- parameters p;
- p["type"] = "csv";
- p["separator"] = "|";
- p["inline"] = "wkt\nLINESTRING(-10 0, 0 20, 10 0, 15 5)";
-
- layer lyr("layer");
- lyr.set_datasource(datasource_cache::instance().create(p));
- lyr.add_style("lines");
- lyr.add_style("markers");
- m.add_layer(lyr);
-
- m.zoom_all();
-
- image_32 image(m.width(), m.height());
- agg_renderer<image_32> ren(m, image);
- ren.apply();
-
- BOOST_TEST_EQ(image.painted(), true);
- }
- catch (std::exception const & ex)
- {
- std::clog << ex.what() << std::endl;
- BOOST_TEST(false);
- }
-
- if (::boost::detail::test_errors())
- {
- return ::boost::report_errors();
- }
- else
- {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ image painted: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- }
-}
diff --git a/tests/cpp_tests/label_algo_test.cpp b/tests/cpp_tests/label_algo_test.cpp
deleted file mode 100644
index 819fd52..0000000
--- a/tests/cpp_tests/label_algo_test.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-#include <boost/detail/lightweight_test.hpp>
-#include <iostream>
-#include <mapnik/geometry.hpp>
-#include <mapnik/geom_util.hpp>
-#include <vector>
-#include <algorithm>
-
-int main(int argc, char** argv)
-{
- std::vector<std::string> args;
- for (int i=1;i<argc;++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end();
-
- try
- {
- // reused these for simplicity
- double x,y;
-
- // single point
- mapnik::geometry_type pt(mapnik::geometry_type::types::Point);
- pt.move_to(10,10);
- BOOST_TEST( mapnik::label::centroid(pt, x, y) );
- BOOST_TEST( x == 10 );
- BOOST_TEST( y == 10 );
-
- // two points
- pt.move_to(20,20);
- BOOST_TEST( mapnik::label::centroid(pt, x, y) );
- BOOST_TEST_EQ( x, 15 );
- BOOST_TEST_EQ( y, 15 );
-
- // line with two verticies
- mapnik::geometry_type line(mapnik::geometry_type::types::LineString);
- line.move_to(0,0);
- line.line_to(50,50);
- BOOST_TEST( mapnik::label::centroid(line, x, y) );
- BOOST_TEST( x == 25 );
- BOOST_TEST( y == 25 );
-
- // TODO - centroid and interior should be equal but they appear not to be (check largest)
- // MULTIPOLYGON(((-52 40,-60 32,-68 40,-60 48,-52 40)),((-60 50,-80 30,-100 49.9999999999999,-80.0000000000001 70,-60 50)),((-52 60,-60 52,-68 60,-60 68,-52 60)))
-
- // hit tests
- mapnik::geometry_type pt_hit(mapnik::geometry_type::types::Point);
- pt_hit.move_to(10,10);
- BOOST_TEST( mapnik::label::hit_test(pt_hit, 10, 10, 0.1) );
- BOOST_TEST( !mapnik::label::hit_test(pt_hit, 9, 9, 0) );
- BOOST_TEST( mapnik::label::hit_test(pt_hit, 9, 9, 1.5) );
- mapnik::geometry_type line_hit(mapnik::geometry_type::types::LineString);
- line_hit.move_to(0,0);
- line_hit.line_to(50,50);
- BOOST_TEST( mapnik::label::hit_test(line_hit, 0, 0, 0.001) );
- BOOST_TEST( !mapnik::label::hit_test(line_hit, 1, 1, 0) );
- BOOST_TEST( mapnik::label::hit_test(line_hit, 1, 1, 1.001) );
- }
- catch (std::exception const & ex)
- {
- std::clog << ex.what() << "\n";
- BOOST_TEST(false);
- }
-
- if (!::boost::detail::test_errors()) {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ label algorithms: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- } else {
- return ::boost::report_errors();
- }
-}
diff --git a/tests/cpp_tests/line_offset_test.cpp b/tests/cpp_tests/line_offset_test.cpp
deleted file mode 100644
index 9e5732b..0000000
--- a/tests/cpp_tests/line_offset_test.cpp
+++ /dev/null
@@ -1,236 +0,0 @@
-// mapnik
-#include <mapnik/coord.hpp>
-#include <mapnik/text/vertex_cache.hpp>
-
-// boost
-#include <boost/detail/lightweight_test.hpp>
-
-// stl
-#include <stdexcept>
-#include <iostream>
-#include <fstream>
-#include <vector>
-#include <tuple>
-#include <algorithm>
-
-// test
-#include "utils.hpp"
-
-struct fake_path
-{
- using coord_type = std::tuple<double, double, unsigned>;
- using cont_type = std::vector<coord_type>;
- cont_type vertices_;
- cont_type::iterator itr_;
-
- fake_path(std::initializer_list<double> l)
- : fake_path(l.begin(), l.size()) {
- }
-
- fake_path(std::vector<double> const &v)
- : fake_path(v.begin(), v.size()) {
- }
-
- template <typename Itr>
- fake_path(Itr itr, size_t sz) {
- size_t num_coords = sz >> 1;
- vertices_.reserve(num_coords);
-
- for (size_t i = 0; i < num_coords; ++i) {
- double x = *itr++;
- double y = *itr++;
- unsigned cmd = (i == 0) ? agg::path_cmd_move_to : agg::path_cmd_line_to;
- vertices_.push_back(std::make_tuple(x, y, cmd));
- }
- itr_ = vertices_.begin();
- }
-
- unsigned vertex(double *x, double *y) {
- if (itr_ == vertices_.end()) {
- return agg::path_cmd_stop;
- }
- *x = std::get<0>(*itr_);
- *y = std::get<1>(*itr_);
- unsigned cmd = std::get<2>(*itr_);
- ++itr_;
- return cmd;
- }
-
- void rewind(unsigned) {
- itr_ = vertices_.begin();
- }
-};
-
-double dist(mapnik::pixel_position const &a,
- mapnik::pixel_position const &b)
-{
- mapnik::pixel_position d = a - b;
- return std::sqrt(d.x*d.x + d.y*d.y);
-}
-
-namespace boost { namespace detail {
-
-template<class T, class U>
-inline void test_leq_impl(char const * expr1, char const * expr2,
- char const * file, int line, char const * function,
- T const & t, U const & u)
-{
- if( t > u )
- {
- BOOST_LIGHTWEIGHT_TEST_OSTREAM
- << file << "(" << line << "): test '" << expr1 << " == " << expr2
- << "' failed in function '" << function << "': "
- << "'" << t << "' > '" << u << "'" << std::endl;
- ++test_errors();
- }
-}
-
-} }
-
-#define BOOST_TEST_LEQ(expr1,expr2) ( ::boost::detail::test_leq_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
-
-void test_simple_segment(double const &offset)
-{
- const double dx = 0.01;
- fake_path path = {0, 0, 1, 0}, off_path = {0, offset, 1, offset};
- mapnik::vertex_cache vc(path), off_vc(off_path);
-
- vc.reset(); vc.next_subpath();
- off_vc.reset(); off_vc.next_subpath();
-
- while (vc.move(dx)) {
- double pos = vc.linear_position();
- double off_pos = off_vc.position_closest_to(vc.current_position());
- BOOST_TEST_LEQ(std::abs(pos - off_pos), 1.0e-6);
- }
-}
-
-void test_straight_line(double const &offset) {
- const double dx = 0.01;
- fake_path path = {0, 0, 0.1, 0, 0.9, 0, 1, 0},
- off_path = {0, offset, 0.4, offset, 0.6, offset, 1, offset};
- mapnik::vertex_cache vc(path), off_vc(off_path);
-
- vc.reset(); vc.next_subpath();
- off_vc.reset(); off_vc.next_subpath();
-
- while (vc.move(dx)) {
- double pos = vc.linear_position();
- double off_pos = off_vc.position_closest_to(vc.current_position());
- BOOST_TEST_LEQ(std::abs(pos - off_pos), 1.0e-6);
- }
-}
-
-void test_offset_curve(double const &offset) {
- const double dx = 0.01;
- const double r = (1.0 + offset);
-
- std::vector<double> pos, off_pos;
- const size_t max_i = 1000;
- for (size_t i = 0; i <= max_i; ++i) {
- double x = M_PI * double(i) / max_i;
- pos.push_back(-std::cos(x)); pos.push_back(std::sin(x));
- off_pos.push_back(-r * std::cos(x)); off_pos.push_back(r * std::sin(x));
- }
-
- fake_path path(pos), off_path(off_pos);
- mapnik::vertex_cache vc(path), off_vc(off_path);
-
- vc.reset(); vc.next_subpath();
- off_vc.reset(); off_vc.next_subpath();
-
- while (vc.move(dx)) {
- double pos = vc.linear_position();
- double off_pos = off_vc.position_closest_to(vc.current_position());
- {
- mapnik::vertex_cache::scoped_state s(off_vc);
- off_vc.move(off_pos);
- BOOST_TEST_LEQ(dist(vc.current_position(), off_vc.current_position()), (1.001 * offset));
- }
- BOOST_TEST_LEQ(std::abs((pos / vc.length()) - (off_pos / off_vc.length())), 1.0e-3);
- }
-}
-
-void test_s_shaped_curve(double const &offset) {
- const double dx = 0.01;
- const double r = (1.0 + offset);
- const double r2 = (1.0 - offset);
-
- std::vector<double> pos, off_pos;
- const size_t max_i = 1000;
- for (size_t i = 0; i <= max_i; ++i) {
- double x = M_PI * double(i) / max_i;
- pos.push_back(-std::cos(x) - 1); pos.push_back(std::sin(x));
- off_pos.push_back(-r * std::cos(x) - 1); off_pos.push_back(r * std::sin(x));
- }
- for (size_t i = 0; i <= max_i; ++i) {
- double x = M_PI * double(i) / max_i;
- pos.push_back(-std::cos(x) + 1); pos.push_back(-std::sin(x));
- off_pos.push_back(-r2 * std::cos(x) + 1); off_pos.push_back(-r2 * std::sin(x));
- }
-
- fake_path path(pos), off_path(off_pos);
- mapnik::vertex_cache vc(path), off_vc(off_path);
-
- vc.reset(); vc.next_subpath();
- off_vc.reset(); off_vc.next_subpath();
-
- while (vc.move(dx)) {
- double off_pos = off_vc.position_closest_to(vc.current_position());
- {
- mapnik::vertex_cache::scoped_state s(off_vc);
- off_vc.move(off_pos);
- BOOST_TEST_LEQ(dist(vc.current_position(), off_vc.current_position()), (1.002 * offset));
- }
- }
-}
-
-int main(int argc, char** argv)
-{
- std::vector<std::string> args;
- for (int i=1;i<argc;++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end();
-
- try {
-
- BOOST_TEST(set_working_dir(args));
-
- std::vector<double> offsets = { 0.01, 0.02, 0.1, 0.2 };
- for (double offset : offsets) {
- // test simple straight line segment - should be easy to
- // find the correspondance here.
- test_simple_segment(offset);
-
- // test straight line consisting of more than one segment.
- test_straight_line(offset);
-
- // test an offset outer curve
- test_offset_curve(offset);
-
- // test an offset along an S-shaped curve, which is harder
- // because the positions along the offset are no longer
- // linearly related to the positions along the original
- // curve.
- test_s_shaped_curve(offset);
- }
- }
- catch (std::exception const& ex)
- {
- std::cerr << ex.what() << "\n";
- BOOST_TEST(false);
- }
-
- if (!::boost::detail::test_errors())
- {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ line offset: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- }
- else
- {
- return ::boost::report_errors();
- }
-}
diff --git a/tests/cpp_tests/map_request_test.cpp b/tests/cpp_tests/map_request_test.cpp
deleted file mode 100644
index 6af08c0..0000000
--- a/tests/cpp_tests/map_request_test.cpp
+++ /dev/null
@@ -1,165 +0,0 @@
-#include <boost/detail/lightweight_test.hpp>
-
-#include <iostream>
-#include <mapnik/map.hpp>
-#include <mapnik/load_map.hpp>
-#include <mapnik/agg_renderer.hpp>
-#if defined(HAVE_CAIRO)
-#include <mapnik/cairo/cairo_renderer.hpp>
-#endif
-#include <mapnik/graphics.hpp>
-#include <mapnik/image_util.hpp>
-#include <mapnik/datasource_cache.hpp>
-#include <mapnik/font_engine_freetype.hpp>
-#include <mapnik/image_data.hpp>
-#include <mapnik/image_reader.hpp>
-#include <mapnik/scale_denominator.hpp>
-#include <mapnik/feature_style_processor.hpp>
-
-#include <vector>
-#include <algorithm>
-#include "utils.hpp"
-
-bool compare_images(std::string const& src_fn,std::string const& dest_fn)
-{
- using namespace mapnik;
- std::unique_ptr<mapnik::image_reader> reader1(mapnik::get_image_reader(dest_fn,"png"));
- if (!reader1.get())
- {
- throw mapnik::image_reader_exception("Failed to load: " + dest_fn);
- }
- std::shared_ptr<image_32> image_ptr1 = std::make_shared<image_32>(reader1->width(),reader1->height());
- reader1->read(0,0,image_ptr1->data());
-
- std::unique_ptr<mapnik::image_reader> reader2(mapnik::get_image_reader(src_fn,"png"));
- if (!reader2.get())
- {
- throw mapnik::image_reader_exception("Failed to load: " + src_fn);
- }
- std::shared_ptr<image_32> image_ptr2 = std::make_shared<image_32>(reader2->width(),reader2->height());
- reader2->read(0,0,image_ptr2->data());
-
- image_data_32 const& dest = image_ptr1->data();
- image_data_32 const& src = image_ptr2->data();
-
- unsigned int width = src.width();
- unsigned int height = src.height();
- if ((width != dest.width()) || height != dest.height()) return false;
- for (unsigned int y = 0; y < height; ++y)
- {
- const unsigned int* row_from = src.getRow(y);
- const unsigned int* row_to = dest.getRow(y);
- for (unsigned int x = 0; x < width; ++x)
- {
- if (row_from[x] != row_to[x]) return false;
- }
- }
- return true;
-}
-
-int main(int argc, char** argv)
-{
- std::vector<std::string> args;
- for (int i=1;i<argc;++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end();
- // TODO - re-enable if we can control the freetype/cairo versions used
- // https://github.com/mapnik/mapnik/issues/1868
- /*
- std::string expected("./tests/cpp_tests/support/map-request-marker-text-line-expected.png");
- std::string expected_cairo("./tests/cpp_tests/support/map-request-marker-text-line-expected-cairo.png");
- try {
-
- BOOST_TEST(set_working_dir(args));
-
- mapnik::datasource_cache::instance().register_datasources("plugins/input/csv.input");
- mapnik::freetype_engine::register_fonts("./fonts", true );
- mapnik::Map m(256,256);
- mapnik::load_map(m,"./tests/data/good_maps/marker-text-line.xml",false);
- m.zoom_all();
- mapnik::image_32 im(m.width(),m.height());
- double scale_factor = 1.2;
-
- // render normally with apply() and just map and image
- mapnik::agg_renderer<mapnik::image_32> renderer1(m,im,scale_factor);
- renderer1.apply();
- std::string actual1("/tmp/map-request-marker-text-line-actual1.png");
- //mapnik::save_to_file(im,expected);
- mapnik::save_to_file(im,actual1);
- BOOST_TEST(compare_images(actual1,expected));
-
- // reset image
- im.clear();
-
- // set up a mapnik::request object
- mapnik::request req(m.width(),m.height(),m.get_current_extent());
- req.set_buffer_size(m.buffer_size());
-
- // render using apply() and mapnik::request
- mapnik::agg_renderer<mapnik::image_32> renderer2(m,req,im,scale_factor);
- renderer2.apply();
- std::string actual2("/tmp/map-request-marker-text-line-actual2.png");
- mapnik::save_to_file(im,actual2);
- BOOST_TEST(compare_images(actual2,expected));
-
- // reset image
- im.clear();
-
- // render with apply_to_layer api and mapnik::request params passed to apply_to_layer
- mapnik::agg_renderer<mapnik::image_32> renderer3(m,req,im,scale_factor);
- renderer3.start_map_processing(m);
- mapnik::projection map_proj(m.srs(),true);
- double scale_denom = mapnik::scale_denominator(req.scale(),map_proj.is_geographic());
- scale_denom *= scale_factor;
- for (mapnik::layer const& lyr : m.layers() )
- {
- if (lyr.visible(scale_denom))
- {
- std::set<std::string> names;
- renderer3.apply_to_layer(lyr,
- renderer3,
- map_proj,
- req.scale(),
- scale_denom,
- req.width(),
- req.height(),
- req.extent(),
- req.buffer_size(),
- names);
-
- }
- }
- renderer3.end_map_processing(m);
- std::string actual3("/tmp/map-request-marker-text-line-actual3.png");
- mapnik::save_to_file(im,actual3);
- BOOST_TEST(compare_images(actual3,expected));
-
- // also test cairo
-#if defined(HAVE_CAIRO)
- mapnik::cairo_surface_ptr image_surface(
- cairo_image_surface_create(CAIRO_FORMAT_ARGB32,req.width(),req.height()),
- mapnik::cairo_surface_closer());
- mapnik::cairo_ptr image_context = (mapnik::create_context(image_surface));
- mapnik::cairo_renderer<mapnik::cairo_ptr> png_render(m,req,image_context,scale_factor);
- png_render.apply();
- //cairo_surface_write_to_png(&*image_surface, expected_cairo.c_str());
- std::string actual_cairo("/tmp/map-request-marker-text-line-actual4.png");
- cairo_surface_write_to_png(&*image_surface, actual_cairo.c_str());
- BOOST_TEST(compare_images(actual_cairo,expected_cairo));
-#endif
- // TODO - test grid_renderer
-
- } catch (std::exception const& ex) {
- std::clog << ex.what() << "\n";
- }
- */
- if (!::boost::detail::test_errors()) {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ Map Request rendering hook: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- } else {
- return ::boost::report_errors();
- }
-}
diff --git a/tests/cpp_tests/params_test.cpp b/tests/cpp_tests/params_test.cpp
deleted file mode 100644
index 081cc3b..0000000
--- a/tests/cpp_tests/params_test.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-#include <boost/detail/lightweight_test.hpp>
-#include <iostream>
-#include <mapnik/value_types.hpp>
-#include <mapnik/params.hpp>
-#include <mapnik/boolean.hpp>
-#include <vector>
-#include <algorithm>
-
-int main(int argc, char** argv)
-{
- std::vector<std::string> args;
- for (int i=1;i<argc;++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end();
-
- try
- {
- mapnik::parameters params;
-
- // true
- params["bool"] = mapnik::value_integer(true);
- BOOST_TEST( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == true));
-
- params["bool"] = "true";
- BOOST_TEST( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == true));
-
- params["bool"] = mapnik::value_integer(1);
- BOOST_TEST( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == true));
-
- params["bool"] = "1";
- BOOST_TEST( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == true));
-
- params["bool"] = "True";
- BOOST_TEST( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == true));
-
- params["bool"] = "on";
- BOOST_TEST( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == true));
-
- params["bool"] = "yes";
- BOOST_TEST( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == true));
-
- // false
- params["bool"] = mapnik::value_integer(false);
- BOOST_TEST( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == false) );
-
- params["bool"] = "false";
- BOOST_TEST( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == false) );
-
- params["bool"] = mapnik::value_integer(0);
- BOOST_TEST( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == false));
-
- params["bool"] = "0";
- BOOST_TEST( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == false));
-
- params["bool"] = "False";
- BOOST_TEST( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == false));
-
- params["bool"] = "off";
- BOOST_TEST( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == false));
-
- params["bool"] = "no";
- BOOST_TEST( (params.get<mapnik::boolean_type>("bool") && *params.get<mapnik::boolean_type>("bool") == false));
-
- // strings
- params["string"] = "hello";
- BOOST_TEST( (params.get<std::string>("string") && *params.get<std::string>("string") == "hello") );
-
- // int
- params["int"] = mapnik::value_integer(1);
- BOOST_TEST( (params.get<mapnik::value_integer>("int") && *params.get<mapnik::value_integer>("int") == 1) );
-
- // double
- params["double"] = 1.5;
- BOOST_TEST( (params.get<double>("double") && *params.get<double>("double") == 1.5) );
-
- // value_null
- params["null"] = mapnik::value_null();
- // https://github.com/mapnik/mapnik/issues/2471
- //BOOST_TEST( (params.get<mapnik::value_null>("null") && *params.get<mapnik::value_null>("null") == mapnik::value_null()) );
- }
- catch (std::exception const& ex)
- {
- std::cerr << ex.what() << "\n";
- BOOST_TEST(false);
- }
-
- if (!::boost::detail::test_errors()) {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ parameters: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- } else {
- return ::boost::report_errors();
- }
-}
diff --git a/tests/cpp_tests/run b/tests/cpp_tests/run
deleted file mode 100755
index 34a15fc..0000000
--- a/tests/cpp_tests/run
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-
-cd "$( dirname "${BASH_SOURCE[0]}" )"
-cd ../../
-source ./localize.sh
-
-failures=0
-if [ -n "$(find tests/cpp_tests/ -maxdepth 1 -name '*-bin' -print -quit)" ]; then
- for FILE in tests/cpp_tests/*-bin; do
- ${FILE} -q -d .;
- failures=$((failures+$?))
- done
- echo
-else
- echo 'warning: no c++ tests found'
-fi
-exit $failures
-
diff --git a/tests/cpp_tests/support/map-request-marker-text-line-expected-cairo.png b/tests/cpp_tests/support/map-request-marker-text-line-expected-cairo.png
deleted file mode 100644
index cb8e478..0000000
Binary files a/tests/cpp_tests/support/map-request-marker-text-line-expected-cairo.png and /dev/null differ
diff --git a/tests/cpp_tests/support/map-request-marker-text-line-expected.png b/tests/cpp_tests/support/map-request-marker-text-line-expected.png
deleted file mode 100644
index 9de752a..0000000
Binary files a/tests/cpp_tests/support/map-request-marker-text-line-expected.png and /dev/null differ
diff --git a/tests/cpp_tests/symbolizer_test.cpp b/tests/cpp_tests/symbolizer_test.cpp
deleted file mode 100644
index c6877ac..0000000
--- a/tests/cpp_tests/symbolizer_test.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#include <boost/detail/lightweight_test.hpp>
-#include <iostream>
-#include <mapnik/symbolizer.hpp>
-#include <vector>
-#include <algorithm>
-
-using namespace mapnik;
-
-int main(int argc, char** argv)
-{
- std::vector<std::string> args;
- for (int i=1;i<argc;++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end();
-
- try {
- marker_multi_policy_enum policy_in = MARKER_WHOLE_MULTI;
- BOOST_TEST_EQ(policy_in,MARKER_WHOLE_MULTI);
- markers_symbolizer sym;
- put(sym, keys::markers_multipolicy, policy_in);
- BOOST_TEST_EQ(sym.properties.count(keys::markers_multipolicy),static_cast<unsigned long>(1));
- marker_multi_policy_enum policy_out = get<mapnik::marker_multi_policy_enum>(sym, keys::markers_multipolicy);
- BOOST_TEST_EQ(policy_out,MARKER_WHOLE_MULTI);
- }
- catch (std::exception const & ex)
- {
- std::clog << ex.what() << std::endl;
- BOOST_TEST(false);
- }
-
- if (!::boost::detail::test_errors()) {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ symbolizer test: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- } else {
- return ::boost::report_errors();
- }
-}
diff --git a/tests/cpp_tests/utils.hpp b/tests/cpp_tests/utils.hpp
deleted file mode 100644
index e822816..0000000
--- a/tests/cpp_tests/utils.hpp
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <vector>
-#include <algorithm>
-#include <string>
-#include <mapnik/util/fs.hpp>
-#include <boost/filesystem/convenience.hpp>
-
-inline static bool set_working_dir(std::vector<std::string> args)
-{
- std::vector<std::string>::iterator itr = std::find(args.begin(), args.end(), "-d");
- if (itr!=args.end())
- {
- unsigned dist = std::distance(args.begin(),itr);
- if (args.size() > dist+1)
- {
- std::string chdir = args.at(dist+1);
- bool exists = mapnik::util::exists( chdir );
- if (exists)
- {
- boost::filesystem::current_path(chdir);
- return true;
- }
- }
- return false;
- }
- return true;
-}
\ No newline at end of file
diff --git a/tests/cpp_tests/wkb_formats_test.cpp b/tests/cpp_tests/wkb_formats_test.cpp
deleted file mode 100644
index 29f9634..0000000
--- a/tests/cpp_tests/wkb_formats_test.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-#include <boost/detail/lightweight_test.hpp>
-#include <iostream>
-#include <mapnik/params.hpp>
-#include <mapnik/wkb.hpp>
-#include <mapnik/feature.hpp>
-#include <mapnik/feature_factory.hpp>
-#include <vector>
-#include <algorithm>
-
-
-int main(int argc, char** argv)
-{
- std::vector<std::string> args;
- for (int i=1;i<argc;++i)
- {
- args.push_back(argv[i]);
- }
- bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end();
-
- unsigned char sp_valid_blob[] = {
- 0x0, 0x1, 0xBC, 0xB, 0x0, 0x0, 0x1F, 0x12, 0xDB, 0xCF, 0xC3, 0xA2, 0x41, 0x41, 0x9D, 0x74, 0xB0, 0x31, 0xE6, 0x34, 0x53, 0x41, 0xDB,
- 0x1B, 0xB6, 0x7C, 0xD9, 0xA2, 0x41, 0x41, 0x67, 0xA7, 0xB6, 0xF, 0xF6, 0x34, 0x53, 0x41, 0x7C, 0x6, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0,
- 0x0, 0x69, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0xBB, 0x4B, 0x9C, 0x59, 0xD2, 0xA2, 0x41, 0x41, 0x3A, 0xAA,
- 0x3F, 0xAE, 0xEB, 0x34, 0x53, 0x41, 0xA2, 0xC2, 0xE4, 0xC6, 0xD1, 0xA2, 0x41, 0x41, 0x4C, 0xFE, 0x6, 0x2B, 0xEC, 0x34, 0x53, 0x41,
- 0xEC, 0x65, 0x5F, 0x6, 0xCE, 0xA2, 0x41, 0x41, 0xDD, 0x33, 0x7F, 0x24, 0xEF, 0x34, 0x53, 0x41, 0x2D, 0x35, 0x2D, 0x30, 0xCB, 0xA2,
- 0x41, 0x41, 0x4E, 0xA7, 0x88, 0x9, 0xF1, 0x34, 0x53, 0x41, 0x58, 0x2F, 0x12, 0x96, 0xCA, 0xA2, 0x41, 0x41, 0x52, 0xD1, 0xBD, 0xDC,
- 0xF0, 0x34, 0x53, 0x41, 0x1F, 0x12, 0xDB, 0xCF, 0xC3, 0xA2, 0x41, 0x41, 0xB9, 0x31, 0xA4, 0xE1, 0xF5, 0x34, 0x53, 0x41, 0x21, 0xBB,
- 0x20, 0x6D, 0xC4, 0xA2, 0x41, 0x41, 0x67, 0xA7, 0xB6, 0xF, 0xF6, 0x34, 0x53, 0x41, 0x5A, 0x82, 0x4A, 0xD3, 0xCA, 0xA2, 0x41, 0x41,
- 0xA7, 0x85, 0x3D, 0x58, 0xF1, 0x34, 0x53, 0x41, 0x22, 0xB8, 0x3A, 0x7D, 0xCB, 0xA2, 0x41, 0x41, 0x7D, 0x89, 0xA1, 0x8E, 0xF1, 0x34,
- 0x53, 0x41, 0xD0, 0x77, 0x3F, 0x80, 0xCF, 0xA2, 0x41, 0x41, 0x57, 0x69, 0x83, 0xC4, 0xEE, 0x34, 0x53, 0x41, 0xA7, 0xF5, 0x8E, 0xF9,
- 0xD1, 0xA2, 0x41, 0x41, 0x9A, 0xA2, 0x31, 0xEE, 0xEC, 0x34, 0x53, 0x41, 0x2A, 0xCD, 0xDE, 0x4C, 0xD4, 0xA2, 0x41, 0x41, 0x11, 0x43,
- 0xE1, 0xF7, 0xEA, 0x34, 0x53, 0x41, 0xF, 0x89, 0xB1, 0x66, 0xD5, 0xA2, 0x41, 0x41, 0xC8, 0x5D, 0x86, 0xF1, 0xE9, 0x34, 0x53, 0x41,
- 0x19, 0xF4, 0x73, 0x63, 0xD7, 0xA2, 0x41, 0x41, 0x7, 0xB1, 0x14, 0x36, 0xE8, 0x34, 0x53, 0x41, 0xDB, 0x1B, 0xB6, 0x7C, 0xD9, 0xA2,
- 0x41, 0x41, 0x98, 0xB5, 0xE0, 0x74, 0xE6, 0x34, 0x53, 0x41, 0xC0, 0x3F, 0xC6, 0xAC, 0xD8, 0xA2, 0x41, 0x41, 0x9D, 0x74, 0xB0, 0x31,
- 0xE6, 0x34, 0x53, 0x41, 0xF0, 0xB5, 0xB1, 0x53, 0xD5, 0xA2, 0x41, 0x41, 0x97, 0x47, 0xAD, 0x36, 0xE9, 0x34, 0x53, 0x41, 0xBB, 0x4B,
- 0x9C, 0x59, 0xD2, 0xA2, 0x41, 0x41, 0x3A, 0xAA, 0x3F, 0xAE, 0xEB, 0x34, 0x53, 0x41, 0xFE };
-
- unsigned char sp_invalid_blob[] = {
- 0x0, 0x1, 0xBC, 0xB, 0x0, 0x0, 0x1F, 0x12, 0xDB, 0xCF, 0xC3, 0xA2, 0x41, 0x41, 0x9D, 0x74, 0xB0, 0x31, 0xE6, 0x34, 0x53, 0x41, 0xDB,
- 0x1B, 0xB6, 0x7C, 0xD9, 0xA2, 0x41, 0x41, 0x67, 0xA7, 0xB6, 0xF, 0xF6, 0x34, 0x53, 0x41, 0x7C, 0x6, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0,
- 0x0, 0x69, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0xBB, 0x4B, 0x9C, 0x59, 0xD2, 0xA2, 0x41, 0x41, 0x3A, 0xAA,
- 0x3F, 0xAE, 0xEB, 0x34, 0x53, 0x41, 0xA2, 0xC2, 0xE4, 0xC6, 0xD1, 0xA2, 0x41, 0x41, 0x4C, 0xFE, 0x6, 0x2B, 0xEC, 0x34, 0x53, 0x41,
- 0xEC, 0x65, 0x5F, 0x6, 0xCE, 0xA2, 0x41, 0x41, 0xDD, 0x33, 0x7F, 0x24, 0xEF, 0x34, 0x53, 0x41, 0x2D, 0x35, 0x2D, 0x30, 0xCB, 0xA2,
- 0x41, 0x41, 0x4E, 0xA7, 0x88, 0x9, 0xF1, 0x34, 0x53, 0x41, 0x58, 0x2F, 0x12, 0x96, 0xCA, 0xA2, 0x41, 0x41, 0x52, 0xD1, 0xBD, 0xDC,
- 0xF0, 0x34, 0x53, 0x41, 0x1F, 0x12, 0xDB, 0xCF, 0xC3, 0xA2, 0x41, 0x41, 0xB9, 0x31, 0xA4, 0xE1, 0xF5, 0x34, 0x53, 0x41, 0x21, 0xBB,
- 0x20, 0x6D, 0xC4, 0xA2, 0x41, 0x41, 0x67, 0xA7, 0xB6, 0xF, 0xF6, 0x34, 0x53, 0x41, 0x5A, 0x82, 0x4A, 0xD3, 0xCA, 0xA2, 0x41, 0x41,
- 0xA7, 0x85, 0x3D, 0x58, 0xF1, 0x34, 0x53, 0x41, 0x22, 0xB8, 0x3A, 0x7D, 0xCB, 0xA2, 0x41, 0x41, 0x7D, 0x89, 0xA1, 0x8E, 0xF1, 0x34,
- 0x53, 0x41, 0xD0, 0x77, 0x3F, 0x80, 0xCF, 0xA2, 0x41, 0x41, 0x57, 0x69, 0x83, 0xC4, 0xEE, 0x34, 0x53, 0x41, 0xA7, 0xF5, 0x8E, 0xF9,
- 0xD1, 0xA2, 0x41, 0x41, 0x9A, 0xA2, 0x31, 0xEE, 0xEC, 0x34, 0x53, 0x41, 0x2A, 0xCD, 0xDE, 0x4C, 0xD4, 0xA2, 0x41, 0x41, 0x11, 0x43,
- 0xE1, 0xF7, 0xEA, 0x34, 0x53, 0x41, 0xF, 0x89, 0xB1, 0x66, 0xD5, 0xA2, 0x41, 0x41, 0xC8, 0x5D, 0x86, 0xF1, 0xE9, 0x34, 0x53, 0x41,
- 0x19, 0xF4, 0x73, 0x63, 0xD7, 0xA2, 0x41, 0x41, 0x7, 0xB1, 0x14, 0x36, 0xE8, 0x34, 0x53, 0x41, 0xDB, 0x1B, 0xB6, 0x7C, 0xD9, 0xA2,
- 0x41, 0x41, 0x98, 0xB5, 0xE0, 0x74, 0xE6, 0x34, 0x53, 0x41, 0xC0, 0x3F, 0xC6, 0xAC, 0xD8, 0xA2, 0x41, 0x41, 0x9D, 0x74, 0xB0, 0x31,
- 0xE6, 0x34, 0x53, 0x41, 0xF0, 0xB5, 0xB1, 0x53, 0xD5, 0xA2, 0x41, 0x41, 0x97, 0x47, 0xAD, 0x36, 0xE9, 0x34, 0x53, 0x41, 0xBB, 0x4B,
- 0x9C, 0x59, 0xD2, 0xA2, 0x41, 0x41, 0x3A, 0xAA, 0x3F, 0xAE, 0xEB, 0x34, 0x53, 0x41 };
-
- unsigned char sq_valid_blob[] = {
- 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x40 };
-
- unsigned char sq_invalid_blob[] = {
- 0x23, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x40, 0x23 };
-
- mapnik::context_ptr ctx(new mapnik::context_type);
- mapnik::feature_ptr feature = mapnik::feature_factory::create(ctx, 1);
-
- // test of parsing wks geometries
- try {
-
- // spatialite blob
- BOOST_TEST(
- mapnik::geometry_utils::from_wkb(feature->paths(),
- (const char*)sp_valid_blob,
- sizeof(sp_valid_blob) / sizeof(sp_valid_blob[0]),
- mapnik::wkbSpatiaLite)
- );
-
- BOOST_TEST(
- mapnik::geometry_utils::from_wkb(feature->paths(),
- (const char*)sp_valid_blob,
- sizeof(sp_valid_blob) / sizeof(sp_valid_blob[0]),
- mapnik::wkbAuto)
- );
-
- BOOST_TEST(
- mapnik::geometry_utils::from_wkb(feature->paths(),
- (const char*)sp_invalid_blob,
- sizeof(sp_invalid_blob) / sizeof(sp_invalid_blob[0]),
- mapnik::wkbAuto) == false
- );
-
- // sqlite generic wkb blob
- BOOST_TEST(
- mapnik::geometry_utils::from_wkb(feature->paths(),
- (const char*)sq_valid_blob,
- sizeof(sq_valid_blob) / sizeof(sq_valid_blob[0]),
- mapnik::wkbGeneric)
- );
-
- BOOST_TEST(
- mapnik::geometry_utils::from_wkb(feature->paths(),
- (const char*)sq_valid_blob,
- sizeof(sq_valid_blob) / sizeof(sq_valid_blob[0]),
- mapnik::wkbAuto)
- );
-
- BOOST_TEST(
- mapnik::geometry_utils::from_wkb(feature->paths(),
- (const char*)sq_invalid_blob,
- sizeof(sq_invalid_blob) / sizeof(sq_invalid_blob[0]),
- mapnik::wkbGeneric) == false
- );
-
- } catch (std::exception const& ex) {
- BOOST_TEST(false);
- std::clog << "threw: " << ex.what() << "\n";
- }
-
- if (!::boost::detail::test_errors()) {
- if (quiet) std::clog << "\x1b[1;32m.\x1b[0m";
- else std::clog << "C++ WKB formats test: \x1b[1;32m✓ \x1b[0m\n";
- ::boost::detail::report_errors_remind().called_report_errors_function = true;
- } else {
- return ::boost::report_errors();
- }
-}
diff --git a/tests/data/broken_maps/amenity.xml b/tests/data/broken_maps/amenity.xml
deleted file mode 100644
index 450f29d..0000000
--- a/tests/data/broken_maps/amenity.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<Style name="amenity" minimum-version="0.7.2">
-<Rule>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <Filter>[amenity]='post_box'</Filter>
- <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/post_box.png" type="png" width="16" height="16"/>
-</Rule>
-<Rule>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <Filter>[amenity]='post_office'</Filter>
- <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/post_office.png" type="png" width="16" height="16"/>
-</Rule>
-
-<Rule>
- <MaxScaleDenominator>250000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <Filter>[railway]='station'</Filter>
- <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/station_small.png" type="png" width="5" height="5"/>
-</Rule>
- <Rule>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <Filter>[railway]='station'</Filter>
- <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/station.png" type="png" width="9" height="9"/>
-</Rule>
-<Rule>
- <MaxScaleDenominator>50000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <Filter>[railway]='station'</Filter>
- <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="9" fill="#000" dy="-8" halo_radius="1" wrap_width="0"/>
-</Rule>
-<Rule>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <Filter>[railway]='station'</Filter>
- <TextSymbolizer name="name" face_name="DejaVu Sans Book" size="12" fill="#000" dy="-14" halo_radius="1" wrap_width="0"/>
-</Rule>
-
-<Rule>
- <MaxScaleDenominator>10000</MaxScaleDenominator>
- <Filter>[amenity]='pub'</Filter>
- <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/pub.png" type="png" width="16" height="16"/>
-</Rule>
-<Rule>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <Filter>[natural]='peak'</Filter>
- <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/peak.png" type="png" width="8" height="8"/>
-</Rule>
-<Rule>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <Filter>[man_made]='mast'</Filter>
- <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/tower.png" type="png" width="32" height="32"/>
-</Rule>
-<Rule>
- <MaxScaleDenominator>10000</MaxScaleDenominator>
- <Filter>[amenity]='recycling'</Filter>
- <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/recycling.png" type="png" width="20" height="20"/>
-</Rule>
-
-<Rule>
- <MaxScaleDenominator>20000</MaxScaleDenominator>
- <Filter>[amenity]='hospital'</Filter>
- <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/hospital.png" type="png" width="20" height="20"/>
-</Rule>
-
-<Rule>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <Filter>[amenity]='bus_stop' or [highway]='bus_stop'</Filter>
- <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/bus_stop.png" type="png" width="30" height="12"/>
-</Rule>
-
-<Rule>
- <MaxScaleDenominator>20000</MaxScaleDenominator>
- <Filter>[amenity]='parking'</Filter>
- <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/parking.png" type="png" width="16" height="16" allow_overlap="false"/>
-</Rule>
-
-<Rule>
- <MaxScaleDenominator>10000</MaxScaleDenominator>
- <Filter>[amenity]='place_of_worship'</Filter>
- <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/place_of_worship.png" type="png" width="16" height="16" allow_overlap="false"/>
- </Rule>
-<Rule>
- <MaxScaleDenominator>10000</MaxScaleDenominator>
- <Filter>[amenity]='airport'</Filter>
- <PointSymbolizer file="/Users/david/svn.openstreetmap.org/applications/rendering/mapnik/symbols/airport.png" type="png" width="16" height="16" allow_overlap="false"/>
- </Rule>
-</Style>
\ No newline at end of file
diff --git a/tests/data/broken_maps/bgcolor_broken.xml b/tests/data/broken_maps/bgcolor_broken.xml
deleted file mode 100644
index ea93683..0000000
--- a/tests/data/broken_maps/bgcolor_broken.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="darkfoo" minimum-version="0.7.2"/>
\ No newline at end of file
diff --git a/tests/data/broken_maps/bool_value_broken.xml b/tests/data/broken_maps/bool_value_broken.xml
deleted file mode 100644
index c17b8c2..0000000
--- a/tests/data/broken_maps/bool_value_broken.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" minimum-version="0.7.2">
- <Style name="test 1">
- <Rule>
- <PointSymbolizer file="data/images/dummy.png" allow-overlap="maybe"/>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/css_value_broken.xml b/tests/data/broken_maps/css_value_broken.xml
deleted file mode 100644
index 2926b15..0000000
--- a/tests/data/broken_maps/css_value_broken.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE Map>
-<Map minimum-version="0.7.2">
- <Style name="some_style">
- <Rule>
- <LineSymbolizer stroke-width="foobar 2"/>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/datasource_type_broken.xml b/tests/data/broken_maps/datasource_type_broken.xml
deleted file mode 100644
index 7d1a1a5..0000000
--- a/tests/data/broken_maps/datasource_type_broken.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="red" minimum-version="0.7.2">
- <Layer name="some_layer" status="on" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <Datasource>
- <Parameter name="type">foobar_db</Parameter>
- <Parameter name="user">some_one</Parameter>
- <Parameter name="password">SECRET</Parameter>
- <Parameter name="dbname">gis</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/datasource_type_missing.xml b/tests/data/broken_maps/datasource_type_missing.xml
deleted file mode 100644
index 3aeef3e..0000000
--- a/tests/data/broken_maps/datasource_type_missing.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="red" minimum-version="0.7.2">
- <Layer name="some_layer" status="on" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <Datasource>
- <Parameter name="user">some_one</Parameter>
- <Parameter name="password">SECRET</Parameter>
- <Parameter name="dbname">gis</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/db_host_broken.xml b/tests/data/broken_maps/db_host_broken.xml
deleted file mode 100644
index 551c218..0000000
--- a/tests/data/broken_maps/db_host_broken.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE Map [
-<!ENTITY db_name "gis">
-<!ENTITY db_host "/no/socket/here">
-]>
-<Map background-color="red" minimum-version="0.7.2">
- <Layer name="some_layer" status="on" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <Datasource>
- <Parameter name="type">postgis</Parameter>
- <Parameter name="host">/no/socket/here</Parameter>
- <Parameter name="password">SECRET</Parameter>
- <Parameter name="dbname">gis</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/db_user_broken.xml b/tests/data/broken_maps/db_user_broken.xml
deleted file mode 100644
index b467330..0000000
--- a/tests/data/broken_maps/db_user_broken.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE Map [
-<!ENTITY db_user "foobar">
-<!ENTITY db_name "gis">
-]>
-<Map background-color="red" minimum-version="0.7.2">
- <Layer name="some_layer" status="on" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <Datasource>
- <Parameter name="type">postgis</Parameter>
- <Parameter name="user">foobar</Parameter>
- <Parameter name="password">SECRET</Parameter>
- <Parameter name="dbname">gis</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/empty_stylename.xml b/tests/data/broken_maps/empty_stylename.xml
deleted file mode 100755
index 1620849..0000000
--- a/tests/data/broken_maps/empty_stylename.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<Map>
- <Style name="style">
- </Style>
- <Layer>
- <StyleName></StyleName>
- </Layer>
-</Map>
diff --git a/tests/data/broken_maps/expression_broken.xml b/tests/data/broken_maps/expression_broken.xml
deleted file mode 100644
index b8f88c6..0000000
--- a/tests/data/broken_maps/expression_broken.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE Map>
-<Map minimum-version="0.7.2">
- <Style name="some_style">
- <Rule>
- <Filter>[mapnik:geometry] = 1' </Filter>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/font_name_broken.xml b/tests/data/broken_maps/font_name_broken.xml
deleted file mode 100644
index b803fe0..0000000
--- a/tests/data/broken_maps/font_name_broken.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" minimum-version="0.7.2">
- <Style name="some_style">
- <Rule>
- <TextSymbolizer size="12" face-name="foobar">[foo]</TextSymbolizer>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/in_valid_whitespace.xml b/tests/data/broken_maps/in_valid_whitespace.xml
deleted file mode 100644
index 6ce5452..0000000
--- a/tests/data/broken_maps/in_valid_whitespace.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<Map>
-<!-- backspace-->
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/invalid-scale-hsla-filter.xml b/tests/data/broken_maps/invalid-scale-hsla-filter.xml
deleted file mode 100644
index fec9d9e..0000000
--- a/tests/data/broken_maps/invalid-scale-hsla-filter.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<Map>
- <Style name="style" image-filters="scale-hsla(-1,1.1,0,1,0,1,0,1)">
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/invalid_layer_srs.xml b/tests/data/broken_maps/invalid_layer_srs.xml
deleted file mode 100644
index 2fbc25f..0000000
--- a/tests/data/broken_maps/invalid_layer_srs.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<Map>
-<Layer srs="+init=invalid_srs_value" />
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/invalid_map_srs.xml b/tests/data/broken_maps/invalid_map_srs.xml
deleted file mode 100644
index 16dbf33..0000000
--- a/tests/data/broken_maps/invalid_map_srs.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<Map srs="+init=invalid_srs_value">
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/line_cap_style_broken.xml b/tests/data/broken_maps/line_cap_style_broken.xml
deleted file mode 100644
index 0867233..0000000
--- a/tests/data/broken_maps/line_cap_style_broken.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="red" minimum-version="0.7.2">
- <Style name="some_style">
- <Rule name="some_rule">
- <LineSymbolizer stroke-linecap="fooish"/>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/line_join_style_broken.xml b/tests/data/broken_maps/line_join_style_broken.xml
deleted file mode 100644
index 281b835..0000000
--- a/tests/data/broken_maps/line_join_style_broken.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="red" minimum-version="0.7.2">
- <Style name="some_style">
- <Rule name="some_rule">
- <LineSymbolizer stroke-linejoin="meta"/>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/mapnik_min_version.xml b/tests/data/broken_maps/mapnik_min_version.xml
deleted file mode 100644
index 877603d..0000000
--- a/tests/data/broken_maps/mapnik_min_version.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<Map background-color="steelblue" minimum-version="100.0.0">
-<!-- arbitrarily large version number that should throw error -->
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/max_scale_denom_broken.xml b/tests/data/broken_maps/max_scale_denom_broken.xml
deleted file mode 100644
index 441cfd1..0000000
--- a/tests/data/broken_maps/max_scale_denom_broken.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE Map>
-<Map minimum-version="0.7.2">
- <Style name="some_style">
- <Rule>
- <MaxScaleDenominator>3,141</MaxScaleDenominator>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/min_scale_denom_broken.xml b/tests/data/broken_maps/min_scale_denom_broken.xml
deleted file mode 100644
index 0604f7f..0000000
--- a/tests/data/broken_maps/min_scale_denom_broken.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE Map>
-<Map minimum-version="0.7.2">
- <Style name="some_style">
- <Rule>
- <MinScaleDenominator>foobar</MinScaleDenominator>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/missing_fontset.xml b/tests/data/broken_maps/missing_fontset.xml
deleted file mode 100644
index f36337d..0000000
--- a/tests/data/broken_maps/missing_fontset.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<Map>
-
-<FontSet name="book-fonts">
- <Font face-name="does not exist" />
-</FontSet>
-
-</Map>
diff --git a/tests/data/broken_maps/polygon_pattern_symbolizer_broken.xml b/tests/data/broken_maps/polygon_pattern_symbolizer_broken.xml
deleted file mode 100644
index 070b7bc..0000000
--- a/tests/data/broken_maps/polygon_pattern_symbolizer_broken.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" minimum-version="0.7.2">
- <Style name="some_style">
- <Rule>
- <PolygonPatternSymbolizer/>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/shield_symbolizer_broken.xml b/tests/data/broken_maps/shield_symbolizer_broken.xml
deleted file mode 100644
index 2df840e..0000000
--- a/tests/data/broken_maps/shield_symbolizer_broken.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" minimum-version="0.7.2">
- <Style name="some_style">
- <Rule>
- <ShieldSymbolizer size="10" fill="#444" file="data/images/dummy.png" face-name="bold">[foo.ttf]</ShieldSymbolizer>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/stroke_dasharray_broken.xml b/tests/data/broken_maps/stroke_dasharray_broken.xml
deleted file mode 100644
index 770015a..0000000
--- a/tests/data/broken_maps/stroke_dasharray_broken.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="red" minimum-version="0.7.2">
- <Style name="some_style">
- <Rule name="some_rule">
- <LineSymbolizer stroke="red" stroke-dasharray="1.0, 4.0, foo, 6.0"/>
- </Rule>
- </Style>
-</Map>
diff --git a/tests/data/broken_maps/style_name_missing.xml b/tests/data/broken_maps/style_name_missing.xml
deleted file mode 100644
index 5e9392f..0000000
--- a/tests/data/broken_maps/style_name_missing.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<!DOCTYPE Map>
-<Map minimum-version="0.7.2">
- <Style/>
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/text_symbolizer_broken.xml b/tests/data/broken_maps/text_symbolizer_broken.xml
deleted file mode 100644
index ca0e185..0000000
--- a/tests/data/broken_maps/text_symbolizer_broken.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" minimum-version="0.7.2">
- <Style name="some_style">
- <Rule>
- <TextSymbolizer size="-5" face-name="bold">invalid bare string</TextSymbolizer>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/broken_maps/xml_tag_mismatch.xml b/tests/data/broken_maps/xml_tag_mismatch.xml
deleted file mode 100644
index c203cdd..0000000
--- a/tests/data/broken_maps/xml_tag_mismatch.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map >
-<Map background-color="#b5d0d0" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <Style name="some_style">
- <Rule>
- <Filter>[mapnik:geometry] = 1</Filter>
- <PointSymbolizer/>
- </Rule>
- </FOOBAR>
-</Map>
diff --git a/tests/data/csv/64bit_int.csv b/tests/data/csv/64bit_int.csv
deleted file mode 100644
index a36badb..0000000
--- a/tests/data/csv/64bit_int.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-x,y,bigint
-0,0,2147483648
-0,0,9223372036854775807
diff --git a/tests/data/csv/blank_rows.csv b/tests/data/csv/blank_rows.csv
deleted file mode 100644
index 82698ca..0000000
--- a/tests/data/csv/blank_rows.csv
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-x,y,name
-0,0,a
-
-
-0,0,b
-
diff --git a/tests/data/csv/empty_rows.csv b/tests/data/csv/empty_rows.csv
deleted file mode 100644
index f9c860b..0000000
--- a/tests/data/csv/empty_rows.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-"x","y","text","date","integer","boolean","float","time","datetime","empty_column"
-0,0,a b,1971-01-01,40,True,1.0,04:14:00,1971-01-01T04:14:00,
-0,0,c d,1948-01-01,63,True,1.27,14:57:13,1948-01-01T14:57:13,
-0,0,e f,1920-01-01,164,False,41800000.01,00:00:00,1920-01-01T00:00:00,
-0,0,This row has empties,,,,,,,
\ No newline at end of file
diff --git a/tests/data/csv/fails/blank.csv b/tests/data/csv/fails/blank.csv
deleted file mode 100644
index 8b13789..0000000
--- a/tests/data/csv/fails/blank.csv
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/tests/data/csv/fails/cannot_read_a_vrt.vrt b/tests/data/csv/fails/cannot_read_a_vrt.vrt
deleted file mode 100644
index 708fd0f..0000000
--- a/tests/data/csv/fails/cannot_read_a_vrt.vrt
+++ /dev/null
@@ -1,8 +0,0 @@
-<OGRVRTDataSource>
- <OGRVRTLayer name="points">
- <SrcDataSource relativeToVRT="1">./points.csv</SrcDataSource>
- <GeometryType>wkbPoint</GeometryType>
- <LayerSRS>WGS84</LayerSRS>
- <GeometryField encoding="PointFromColumns" x="x" y="y"/>
- </OGRVRTLayer>
-</OGRVRTDataSource>
\ No newline at end of file
diff --git a/tests/data/csv/fails/datacouch_dc8364385fc612b847d66ca7886519749c.csv b/tests/data/csv/fails/datacouch_dc8364385fc612b847d66ca7886519749c.csv
deleted file mode 100644
index 7785054..0000000
--- a/tests/data/csv/fails/datacouch_dc8364385fc612b847d66ca7886519749c.csv
+++ /dev/null
@@ -1,39 +0,0 @@
-"_id","_rev","city","cross_street","geometry","gpsID","heading","moving","stopped_for","street","time","truck"
-"013013bd7417fc4eb1d70053370d698d","1-cc614ed8a795b24945508435763def31","BOSTON",,"{\"type\":\"Point\",\"coordinates\":[-71.09611556,42.33877667]}","10300B7B","382","OTHER","5350","230 FENWAY","2011-10-21T22:56:32.000Z","CheeseForceOne"
-"013013bd7417fc4eb1d70053370da624","1-303e3d47832991f13115f1f8fbf7aa30","BOSTON",,"{\"type\":\"Point\",\"coordinates\":[-71.09611556,42.33877667]}","10300B7B","382","OTHER","5400","230 FENWAY","2011-10-21T22:57:23.000Z","CheeseForceOne"
-"013013bd7417fc4eb1d700533725c9e7","1-aa06630c2060997cca42d5e5491cec00","BOSTON",,"{\"type\":\"Point\",\"coordinates\":[-71.11798667,42.29640194]}","10300295","382","OTHER","490","WASHINGTON ST","2011-10-21T23:01:06.000Z","Cupcakory"
-"013013bd7417fc4eb1d70053372c06c4","1-e5f72c7a5a71e490319257e7bafffe3d","BOSTON",,"{\"type\":\"Point\",\"coordinates\":[-71.11798667,42.29640194]}","10300295","39","MOVING","530","WASHINGTON ST","2011-10-21T23:01:47.000Z","Cupcakory"
-"013013bd7417fc4eb1d70053372c2274","1-2680de3cb56db7a8a4a603b9e49a19c6","BOSTON",,"{\"type\":\"Point\",\"coordinates\":[-71.11749917,42.29632694]}","10300295","39","MOVING CONFIRMATION",,"WASHINGTON ST","2011-10-21T23:01:48.000Z","Cupcakory"
-"013013bd7417fc4eb1d700533761e1a7","1-cef095aee70aad4819490934450c3328","BOSTON","PORTER ST","{\"type\":\"Point\",\"coordinates\":[-71.10327194,42.31483667]}","10300D5F","382","OTHER","5400","BISMARCK ST","2011-10-21T23:05:56.000Z","StaffMeal"
-"013013bd7417fc4eb1d700533762cf34","1-c22129144816e3dcd1190f77bbc5fe31","BOSTON","PORTER ST","{\"type\":\"Point\",\"coordinates\":[-71.1029475,42.31493028]}","10300D5F","84","MOVING CONFIRMATION",,"BISMARCK ST","2011-10-21T23:06:12.000Z","StaffMeal"
-"013013bd7417fc4eb1d700533762ed4e","1-4d5403a6228c84fed13ca94fb759eed1","BOSTON","EDINBORO ST","{\"type\":\"Point\",\"coordinates\":[-71.05961167,42.35137889]}","10300B7C","382","OTHER","6430","KINGSTON ST","2011-10-21T23:05:25.000Z","BBQSmith"
-"013013bd7417fc4eb1d7005337630613","1-94299d448735b989083f44cf34e98a3d","BOSTON","EDINBORO ST","{\"type\":\"Point\",\"coordinates\":[-71.05961167,42.35137889]}","10300B7C","382","OTHER","6480","KINGSTON ST","2011-10-21T23:06:15.000Z","BBQSmith"
-"013013bd7417fc4eb1d7005337631d4c","1-b8b6103d2be1fd64e38b1d6f5d0e76d2","BOSTON","PORTER ST","{\"type\":\"Point\",\"coordinates\":[-71.10327194,42.31483667]}","10300D5F","84","MOVING","5410","BISMARCK ST","2011-10-21T23:06:11.000Z","StaffMeal"
-"013013bd7417fc4eb1d7005337650fe7","1-ce161a29970409d24f5a02b7ccf4b615","BOSTON","ELIOT ST","{\"type\":\"Point\",\"coordinates\":[-71.11908333,42.31402278]}","10300295","54","MOVING UPDATE",,"JAMAICAWAY","2011-10-21T23:06:47.000Z","Cupcakory"
-"013013bd7417fc4eb1d70053377d841a","1-e0d814cb12f221e43385c16f212fcf20","BOSTON","COLUMBUS AVE","{\"type\":\"Point\",\"coordinates\":[-71.0980425,42.31647306]}","10300D5F","382","STOP",,"W WALNUT PARK","2011-10-21T23:09:49.000Z","StaffMeal"
-"013013bd7417fc4eb1d70053377db30b","1-17556dc5b906755396440419b665834d","BOSTON","COLUMBUS AVE","{\"type\":\"Point\",\"coordinates\":[-71.0980425,42.31647306]}","10300D5F","382","OTHER",,"W WALNUT PARK","2011-10-21T23:09:50.000Z","StaffMeal"
-"013013bd7417fc4eb1d70053377f3ac7","1-9d1ad161d60eef01ecf1344bad7e14c1","BOSTON","COLUMBUS AVE","{\"type\":\"Point\",\"coordinates\":[-71.09804222,42.31647306]}","10300D5F","382","OTHER","10","W WALNUT PARK","2011-10-21T23:10:00.000Z","StaffMeal"
-"013013bd7417fc4eb1d70053377fbf2c","1-c19c6c9e2dc5eb43d4be22144269a598","BOSTON","COLUMBUS AVE","{\"type\":\"Point\",\"coordinates\":[-71.09804222,42.31647306]}","10300D5F","382","OTHER","20","W WALNUT PARK","2011-10-21T23:10:09.000Z","StaffMeal"
-"013013bd7417fc4eb1d7005337898fa8","1-7c06e21f544ab04b87c8fbe6d5938e40","BOSTON","CRAFTSON WAY","{\"type\":\"Point\",\"coordinates\":[-71.11125444,42.32992222]}","10300295","342","MOVING UPDATE",,"S HUNTINGTON AVE","2011-10-21T23:11:47.000Z","Cupcakory"
-"013013bd7417fc4eb1d700533799de4a","1-e3927379e1939732bc56607a95af7b5b","BOSTON","COLUMBUS AVE","{\"type\":\"Point\",\"coordinates\":[-71.09804222,42.31647306]}","10300D5F","382","OTHER","280","W WALNUT PARK","2011-10-21T23:14:32.000Z","StaffMeal"
-"013013bd7417fc4eb1d70053379b4a53","1-3bc9cbe689e9b7b6dc912ff507c9e05d","BOSTON","W WALNUT PARK","{\"type\":\"Point\",\"coordinates\":[-71.09804222,42.31647306]}","10300D5F","213","MOVING","300","COLUMBUS AVE","2011-10-21T23:14:58.000Z","StaffMeal"
-"013013bd7417fc4eb1d70053379b5e34","1-c7a60abddc8ce7942f1b6420fa5868a1","BOSTON","WALNUT PARK","{\"type\":\"Point\",\"coordinates\":[-71.09785167,42.31621194]}","10300D5F","213","MOVING CONFIRMATION",,"WASHINGTON ST","2011-10-21T23:14:59.000Z","StaffMeal"
-"013013bd7417fc4eb1d70053379cbf2e","1-365e1b480d6ca3e541e758ffa3e3ad11","BOSTON","ST ALBANS RD","{\"type\":\"Point\",\"coordinates\":[-71.10669694,42.3333975]}","10300295","382","STOP",,"HUNTINGTON AVE","2011-10-21T23:15:05.000Z","Cupcakory"
-"013013bd7417fc4eb1d70053379cc7cf","1-87e5e6c65f7d214f222ab82a9e8089f0","BOSTON","ST ALBANS RD","{\"type\":\"Point\",\"coordinates\":[-71.10669694,42.3333975]}","10300295","382","OTHER",,"HUNTINGTON AVE","2011-10-21T23:15:06.000Z","Cupcakory"
-"02e859331414cf4c7a1081a9fe44fd7c","1-da4c76998ab374a0481a0d38cd61ca01","BOSTON",,"{\"type\":\"Point\",\"coordinates\":[-71.1181225,42.29648722]}","10300B7C","382","STOP","37850","LANESVILLE TER","2011-10-23T12:44:16.000Z","BBQSmith"
-"02e859331414cf4c7a1081a9fe954679","1-01e3b255f529757df01e7338f6c4fa9e","BOSTON","PAUL GORE ST","{\"type\":\"Point\",\"coordinates\":[-71.10521278,42.31762583]}","10300D5F","382","STOP","21630","DANFORTH ST","2011-10-23T13:10:19.000Z","StaffMeal"
-"02e859331414cf4c7a1081a9feb822e6","1-144266972310f28e6684e24676e9d861","BOSTON",,"{\"type\":\"Point\",\"coordinates\":[-71.11804111,42.29645]}","10300B7B","382","OTHER","20910","LANESVILLE TER","2011-10-23T13:26:35.000Z","CheeseForceOne"
-"02e859331414cf4c7a1081a9feb82ab9","1-d49ed0ae34db4aa289b995e71b9d796a","BOSTON",,"{\"type\":\"Point\",\"coordinates\":[-71.11804111,42.29645]}","10300B7B","382","OTHER","20860","LANESVILLE TER","2011-10-23T13:25:43.000Z","CheeseForceOne"
-"02e859331414cf4c7a1081a9febd22bc","1-efa9ad2005d635fb90c03ab3d656aa4d","BOSTON",,"{\"type\":\"Point\",\"coordinates\":[-71.1181175,42.29649972]}","10300B5F","382","OTHER","27100","LANESVILLE TER","2011-10-23T13:31:52.000Z","MobileHome"
-"02e859331414cf4c7a1081a9febd390f","1-d89b8b61be772c3d0f241ef2dedf5c30","BOSTON",,"{\"type\":\"Point\",\"coordinates\":[-71.1181175,42.29649972]}","10300B5F","382","OTHER","27160","LANESVILLE TER","2011-10-23T13:32:44.000Z","MobileHome"
-"02e859331414cf4c7a1081a9fece0a4b","1-721a504bd3368e6f147fe2da0992d88f","BOSTON","PORTER ST","{\"type\":\"Point\",\"coordinates\":[-71.10327,42.31494694]}","10300CE1","382","OTHER","22210","BISMARCK ST","2011-10-23T13:41:51.000Z","RoxysGrilledCheese"
-"02e859331414cf4c7a1081a9fece362f","1-cc8ee7a4465a9643ab405f39e1a71979","BOSTON","PORTER ST","{\"type\":\"Point\",\"coordinates\":[-71.10327,42.31494694]}","10300CE1","382","OTHER","22260","BISMARCK ST","2011-10-23T13:42:42.000Z","RoxysGrilledCheese"
-"02e859331414cf4c7a1081a9fecec292","1-6611b641ab70e0c9748cda5f14bbf6e0","BOSTON",,"{\"type\":\"Point\",\"coordinates\":[-71.11803111,42.29643222]}","10301014","382","OTHER","27820","LANESVILLE TER","2011-10-23T13:43:11.000Z","10301014"
-"02e859331414cf4c7a1081a9fecee8d4","1-733bcff28703a6afd8b9bb6b248436aa","BOSTON",,"{\"type\":\"Point\",\"coordinates\":[-71.11803111,42.29643222]}","10301014","382","OTHER","27870","LANESVILLE TER","2011-10-23T13:44:02.000Z","10301014"
-"02e859331414cf4c7a1081a9fed0f4d9","1-37b0856455fc52f71e8062652eb93e9c","BOSTON","PORTER ST","{\"type\":\"Point\",\"coordinates\":[-71.10327,42.31494694]}","10300CE1","382","STOP","22530","BISMARCK ST","2011-10-23T13:47:09.000Z","RoxysGrilledCheese"
-"0591b9ad844abb7316785a5f87a07574","1-d9d000a2e997d0b3506ec736f672c126","BOSTON","PAUL GORE ST","{\"type\":\"Point\",\"coordinates\":[-71.1051475,42.31760139]}","10300D5F","382","OTHER","11740","DANFORTH ST","2011-10-21T11:41:07.000Z","StaffMeal"
-"0591b9ad844abb7316785a5f87a4ba6e","1-111484ca06567b1cfa59d3bc13565f13","BOSTON",,"{\"type\":\"Point\",\"coordinates\":[-71.11817417,42.29650278]}","10300B7B","382","OTHER","27880","LANESVILLE TER","2011-10-21T11:44:49.000Z","CheeseForceOne"
-"0591b9ad844abb7316785a5f87a4d0ad","1-df94632b6a1ee63a6b4d5d356ab178fc","BOSTON",,"{\"type\":\"Point\",\"coordinates\":[-71.11817417,42.29650278]}","10300B7B","382","OTHER","27940","LANESVILLE TER","2011-10-21T11:45:40.000Z","CheeseForceOne"
-"0591b9ad844abb7316785a5f87ae8917","1-8601864a7e94c403c87a4a28c03c8978","BOSTON","HIGHLAND ST","{\"type\":\"Point\",\"coordinates\":[-71.11447306,42.253]}","10300295","382","HEALTH","6330","ALBION ST","2011-10-21T11:55:01.000Z","Cupcakory"
-"0591b9ad844abb7316785a5f87aea259","1-b17b9ccbcad8a02c20f73ed070521fb4","BOSTON","HIGHLAND ST","{\"type\":\"Point\",\"coordinates\":[-71.11447306,42.253]}","10300295","382","HEALTH","6330","ALBION ST","2011-10-21T11:55:00.000Z","Cupcakory"
-"0591b9ad844abb7316785a5f87b4daac","1-2dad5fa38c0332cf0b80e6ee784e9e98","BOSTON",,"{\"type\":\"Point\",\"coordinates\":[-71.11822694,42.29641556]}","10300B5F","382","OTHER","34950","LANESVILLE TER","2011-10-21T12:01:48.000Z","MobileHome"
\ No newline at end of file
diff --git a/tests/data/csv/fails/invalid_geometries.csv b/tests/data/csv/fails/invalid_geometries.csv
deleted file mode 100644
index 6763f08..0000000
--- a/tests/data/csv/fails/invalid_geometries.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-x,y,z
--122a,48b,bogus
--122,48,fine
\ No newline at end of file
diff --git a/tests/data/csv/fails/invalid_wkt.csv b/tests/data/csv/fails/invalid_wkt.csv
deleted file mode 100644
index c4de226..0000000
--- a/tests/data/csv/fails/invalid_wkt.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-wkt,name
-"POINT (a b)",one
\ No newline at end of file
diff --git a/tests/data/csv/fails/mixed_separators.csv b/tests/data/csv/fails/mixed_separators.csv
deleted file mode 100644
index 323b95d..0000000
--- a/tests/data/csv/fails/mixed_separators.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-x y name
--122, 48, hello
\ No newline at end of file
diff --git a/tests/data/csv/fails/more_column_values_than_headers.csv b/tests/data/csv/fails/more_column_values_than_headers.csv
deleted file mode 100644
index 8296929..0000000
--- a/tests/data/csv/fails/more_column_values_than_headers.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-x,y,one,two
-0,0,one,two,three
\ No newline at end of file
diff --git a/tests/data/csv/fails/needs_headers_one_line.csv b/tests/data/csv/fails/needs_headers_one_line.csv
deleted file mode 100644
index 18818aa..0000000
--- a/tests/data/csv/fails/needs_headers_one_line.csv
+++ /dev/null
@@ -1 +0,0 @@
-0,0,data_name
diff --git a/tests/data/csv/fails/needs_headers_one_line_no_newline.csv b/tests/data/csv/fails/needs_headers_one_line_no_newline.csv
deleted file mode 100644
index 6d49e12..0000000
--- a/tests/data/csv/fails/needs_headers_one_line_no_newline.csv
+++ /dev/null
@@ -1 +0,0 @@
-0,0,data_name
\ No newline at end of file
diff --git a/tests/data/csv/fails/needs_headers_two_lines.csv b/tests/data/csv/fails/needs_headers_two_lines.csv
deleted file mode 100644
index ae5c220..0000000
--- a/tests/data/csv/fails/needs_headers_two_lines.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-0,0,data_name
-0,0,data_name
\ No newline at end of file
diff --git a/tests/data/csv/fails/no_geometry.csv b/tests/data/csv/fails/no_geometry.csv
deleted file mode 100644
index dda0f12..0000000
--- a/tests/data/csv/fails/no_geometry.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-a,b,c,d,e,f,g
-1,2,3,4,5,6,7
\ No newline at end of file
diff --git a/tests/data/csv/fails/no_headers.csv b/tests/data/csv/fails/no_headers.csv
deleted file mode 100644
index ae5344d..0000000
--- a/tests/data/csv/fails/no_headers.csv
+++ /dev/null
@@ -1 +0,0 @@
--122,48,place
\ No newline at end of file
diff --git a/tests/data/csv/fails/unix_newlines_with_windows_inline.csv b/tests/data/csv/fails/unix_newlines_with_windows_inline.csv
deleted file mode 100644
index b319975..0000000
--- a/tests/data/csv/fails/unix_newlines_with_windows_inline.csv
+++ /dev/null
@@ -1,7 +0,0 @@
-x,y,line
-0,0,"
- many
- lines
- of text
- with unix newlines
- "
diff --git a/tests/data/csv/fails/unix_newlines_with_windows_inline_escaped.csv b/tests/data/csv/fails/unix_newlines_with_windows_inline_escaped.csv
deleted file mode 100644
index 5b981a6..0000000
--- a/tests/data/csv/fails/unix_newlines_with_windows_inline_escaped.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-x,y,line
-0,0,"\r\nmany\r\nlines\r\nof text\r\nwith unix newlines\r\n"
diff --git a/tests/data/csv/geojson_2x_double_quote_filebakery_style.csv b/tests/data/csv/geojson_2x_double_quote_filebakery_style.csv
deleted file mode 100644
index 27742b7..0000000
--- a/tests/data/csv/geojson_2x_double_quote_filebakery_style.csv
+++ /dev/null
@@ -1,10 +0,0 @@
-type,GeoJSON
-point, "{""type"":""Point"",""coordinates"":[30.0,10.0]}"
-linestring, "{""type"":""LineString"",""coordinates"":[[30.0,10.0],[10.0,30.0],[40.0,40.0]]}"
-polygon, "{""type"":""Polygon"",""coordinates"":[[[30.0,10.0],[10.0,20.0],[20.0,40.0],[40.0,40.0],[30.0,10.0]]]}"
-polygon, "{""type"":""Polygon"",""coordinates"":[[[35.0,10.0],[10.0,20.0],[15.0,40.0],[45.0,45.0],[35.0,10.0]],[[20.0,30.0],[35.0,35.0],[30.0,20.0],[20.0,30.0]]]}"
-multipoint, "{""type"":""MultiPoint"",""coordinates"":[[10.0,40.0],[40.0,30.0],[20.0,20.0],[30.0,10.0]]}"
-multilinestring, "{""type"":""MultiLineString"",""coordinates"":[[[10.0,10.0],[20.0,20.0],[10.0,40.0]],[[40.0,40.0],[30.0,30.0],[40.0,20.0],[30.0,10.0]]]}"
-multipolygon, "{""type"":""MultiPolygon"",""coordinates"":[[[[30.0,20.0],[10.0,40.0],[45.0,40.0],[30.0,20.0]]],[[[15.0,5.0],[40.0,10.0],[10.0,20.0],[5.0,10.0],[15.0,5.0]]]]}"
-multipolygon, "{""type"":""MultiPolygon"",""coordinates"":[[[[40.0,40.0],[20.0,45.0],[45.0,30.0],[40.0,40.0]]],[[[20.0,35.0],[45.0,20.0],[30.0,5.0],[10.0,10.0],[10.0,30.0],[20.0,35.0]],[[30.0,20.0],[20.0,25.0],[20.0,15.0],[30.0,20.0]]]]}"
-collection, "{""type"":""GeometryCollection"",""geometries"":[{""type"":""Polygon"",""coordinates"":[[[1.0,1.0],[2.0,1.0],[2.0,2.0],[1.0,2.0],[1.0,1.0]]]},{""type"":""Point"",""coordinates"":[2.0,3.0]},{""type"":""LineString"",""coordinates"":[[2.0,3.0],[3.0,4.0]]}]}"
\ No newline at end of file
diff --git a/tests/data/csv/geojson_double_quote_escape.csv b/tests/data/csv/geojson_double_quote_escape.csv
deleted file mode 100644
index c65ad88..0000000
--- a/tests/data/csv/geojson_double_quote_escape.csv
+++ /dev/null
@@ -1,10 +0,0 @@
-type,GeoJSON
-point, "{\"type\":\"Point\",\"coordinates\":[30.0,10.0]}"
-linestring, "{\"type\":\"LineString\",\"coordinates\":[[30.0,10.0],[10.0,30.0],[40.0,40.0]]}"
-polygon, "{\"type\":\"Polygon\",\"coordinates\":[[[30.0,10.0],[10.0,20.0],[20.0,40.0],[40.0,40.0],[30.0,10.0]]]}"
-polygon, "{\"type\":\"Polygon\",\"coordinates\":[[[35.0,10.0],[10.0,20.0],[15.0,40.0],[45.0,45.0],[35.0,10.0]],[[20.0,30.0],[35.0,35.0],[30.0,20.0],[20.0,30.0]]]}"
-multipoint, "{\"type\":\"MultiPoint\",\"coordinates\":[[10.0,40.0],[40.0,30.0],[20.0,20.0],[30.0,10.0]]}"
-multilinestring, "{\"type\":\"MultiLineString\",\"coordinates\":[[[10.0,10.0],[20.0,20.0],[10.0,40.0]],[[40.0,40.0],[30.0,30.0],[40.0,20.0],[30.0,10.0]]]}"
-multipolygon, "{\"type\":\"MultiPolygon\",\"coordinates\":[[[[30.0,20.0],[10.0,40.0],[45.0,40.0],[30.0,20.0]]],[[[15.0,5.0],[40.0,10.0],[10.0,20.0],[5.0,10.0],[15.0,5.0]]]]}"
-multipolygon, "{\"type\":\"MultiPolygon\",\"coordinates\":[[[[40.0,40.0],[20.0,45.0],[45.0,30.0],[40.0,40.0]]],[[[20.0,35.0],[45.0,20.0],[30.0,5.0],[10.0,10.0],[10.0,30.0],[20.0,35.0]],[[30.0,20.0],[20.0,25.0],[20.0,15.0],[30.0,20.0]]]]}"
-collection, "{\"type\":\"GeometryCollection\",\"geometries\":[{\"type\":\"Polygon\",\"coordinates\":[[[1.0,1.0],[2.0,1.0],[2.0,2.0],[1.0,2.0],[1.0,1.0]]]},{\"type\":\"Point\",\"coordinates\":[2.0,3.0]},{\"type\":\"LineString\",\"coordinates\":[[2.0,3.0],[3.0,4.0]]}]}"
\ No newline at end of file
diff --git a/tests/data/csv/geojson_single_quote.csv b/tests/data/csv/geojson_single_quote.csv
deleted file mode 100644
index d0bfb47..0000000
--- a/tests/data/csv/geojson_single_quote.csv
+++ /dev/null
@@ -1,10 +0,0 @@
-type,GeoJSON
-point, '{"type":"Point","coordinates":[30.0,10.0]}'
-linestring, '{"type":"LineString","coordinates":[[30.0,10.0],[10.0,30.0],[40.0,40.0]]}'
-polygon, '{"type":"Polygon","coordinates":[[[30.0,10.0],[10.0,20.0],[20.0,40.0],[40.0,40.0],[30.0,10.0]]]}'
-polygon, '{"type":"Polygon","coordinates":[[[35.0,10.0],[10.0,20.0],[15.0,40.0],[45.0,45.0],[35.0,10.0]],[[20.0,30.0],[35.0,35.0],[30.0,20.0],[20.0,30.0]]]}'
-multipoint, '{"type":"MultiPoint","coordinates":[[10.0,40.0],[40.0,30.0],[20.0,20.0],[30.0,10.0]]}'
-multilinestring, '{"type":"MultiLineString","coordinates":[[[10.0,10.0],[20.0,20.0],[10.0,40.0]],[[40.0,40.0],[30.0,30.0],[40.0,20.0],[30.0,10.0]]]}'
-multipolygon, '{"type":"MultiPolygon","coordinates":[[[[30.0,20.0],[10.0,40.0],[45.0,40.0],[30.0,20.0]]],[[[15.0,5.0],[40.0,10.0],[10.0,20.0],[5.0,10.0],[15.0,5.0]]]]}'
-multipolygon, '{"type":"MultiPolygon","coordinates":[[[[40.0,40.0],[20.0,45.0],[45.0,30.0],[40.0,40.0]]],[[[20.0,35.0],[45.0,20.0],[30.0,5.0],[10.0,10.0],[10.0,30.0],[20.0,35.0]],[[30.0,20.0],[20.0,25.0],[20.0,15.0],[30.0,20.0]]]]}'
-collection, '{"type":"GeometryCollection","geometries":[{"type":"Polygon","coordinates":[[[1.0,1.0],[2.0,1.0],[2.0,2.0],[1.0,2.0],[1.0,1.0]]]},{"type":"Point","coordinates":[2.0,3.0]},{"type":"LineString","coordinates":[[2.0,3.0],[3.0,4.0]]}]}'
\ No newline at end of file
diff --git a/tests/data/csv/has_attributes_with_slashes.csv b/tests/data/csv/has_attributes_with_slashes.csv
deleted file mode 100644
index b9ceb29..0000000
--- a/tests/data/csv/has_attributes_with_slashes.csv
+++ /dev/null
@@ -1,4 +0,0 @@
-x,y,name
-0,0,a/a
-1,4,b/b
-10,2.5,c/c
\ No newline at end of file
diff --git a/tests/data/csv/latitude_longitude.csv b/tests/data/csv/latitude_longitude.csv
deleted file mode 100644
index 109e346..0000000
--- a/tests/data/csv/latitude_longitude.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-latitude,longitude
-0,0
\ No newline at end of file
diff --git a/tests/data/csv/latitude_longitude_substring.csv b/tests/data/csv/latitude_longitude_substring.csv
deleted file mode 100644
index 4cd85d8..0000000
--- a/tests/data/csv/latitude_longitude_substring.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-this_is_longitude_yo,this_is_latitude_yo
-0,0
\ No newline at end of file
diff --git a/tests/data/csv/leading_zeros.csv b/tests/data/csv/leading_zeros.csv
deleted file mode 100644
index f0d8615..0000000
--- a/tests/data/csv/leading_zeros.csv
+++ /dev/null
@@ -1,4 +0,0 @@
-x,y,fips
-0,0,001
-0,0,003
-0,0,005
diff --git a/tests/data/csv/line_wkt.csv b/tests/data/csv/line_wkt.csv
deleted file mode 100644
index 0f734d4..0000000
--- a/tests/data/csv/line_wkt.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-type,WKT
-linestring, "LINESTRING (30 10, 10 30, 40 40)"
-multilinestring, "MULTILINESTRING ((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))"
\ No newline at end of file
diff --git a/tests/data/csv/lng_lat.csv b/tests/data/csv/lng_lat.csv
deleted file mode 100644
index ea3002a..0000000
--- a/tests/data/csv/lng_lat.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-lng,lat
-0,0
\ No newline at end of file
diff --git a/tests/data/csv/lon_lat.csv b/tests/data/csv/lon_lat.csv
deleted file mode 100644
index 5ce2fc9..0000000
--- a/tests/data/csv/lon_lat.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-lon,lat
-0,0
\ No newline at end of file
diff --git a/tests/data/csv/long_lat.csv b/tests/data/csv/long_lat.csv
deleted file mode 100644
index 77be885..0000000
--- a/tests/data/csv/long_lat.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-long,lat
-0,0
\ No newline at end of file
diff --git a/tests/data/csv/long_lat.vrt b/tests/data/csv/long_lat.vrt
deleted file mode 100644
index 2fa0a9f..0000000
--- a/tests/data/csv/long_lat.vrt
+++ /dev/null
@@ -1,8 +0,0 @@
-<OGRVRTDataSource>
- <OGRVRTLayer name="long_lat">
- <SrcDataSource relativeToVRT="1">long_lat.csv</SrcDataSource>
- <GeometryType>wkbPoint</GeometryType>
- <LayerSRS>WGS84</LayerSRS>
- <GeometryField encoding="PointFromColumns" x="long" y="lat"/>
- </OGRVRTLayer>
-</OGRVRTDataSource>
\ No newline at end of file
diff --git a/tests/data/csv/mac_newlines.csv b/tests/data/csv/mac_newlines.csv
deleted file mode 100644
index 34c8179..0000000
--- a/tests/data/csv/mac_newlines.csv
+++ /dev/null
@@ -1 +0,0 @@
-x,y,z
1,10,9999.9999
\ No newline at end of file
diff --git a/tests/data/csv/mac_newlines_with_unix_inline.csv b/tests/data/csv/mac_newlines_with_unix_inline.csv
deleted file mode 100644
index f748c05..0000000
--- a/tests/data/csv/mac_newlines_with_unix_inline.csv
+++ /dev/null
@@ -1,7 +0,0 @@
-x,y,line
-0,0,"
- many
- lines
- of text
- with unix newlines
- "
diff --git a/tests/data/csv/mac_newlines_with_unix_inline_escaped.csv b/tests/data/csv/mac_newlines_with_unix_inline_escaped.csv
deleted file mode 100644
index 5f551d3..0000000
--- a/tests/data/csv/mac_newlines_with_unix_inline_escaped.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-x,y,line
-0,0,"many\n lines\n of text\n with unix newlines"
diff --git a/tests/data/csv/missing_header.csv b/tests/data/csv/missing_header.csv
deleted file mode 100644
index d7a11b9..0000000
--- a/tests/data/csv/missing_header.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-one,two,x,y,,aftermissing
-one,two,0,0,missing,aftermissing
\ No newline at end of file
diff --git a/tests/data/csv/more_headers_than_column_values.csv b/tests/data/csv/more_headers_than_column_values.csv
deleted file mode 100644
index 8922a08..0000000
--- a/tests/data/csv/more_headers_than_column_values.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-x,y,one,two,three
-0,0
\ No newline at end of file
diff --git a/tests/data/csv/multi_poly_wkt.csv b/tests/data/csv/multi_poly_wkt.csv
deleted file mode 100644
index f8c2867..0000000
--- a/tests/data/csv/multi_poly_wkt.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-type,WKT
-polygon, "POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10))"
-polygon, "POLYGON ((35 10, 10 20, 15 40, 45 45, 35 10),(20 30, 35 35, 30 20, 20 30))"
-multipolygon, "MULTIPOLYGON (((30 20, 10 40, 45 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))"
-multipolygon, "MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)),((20 35, 45 20, 30 5, 10 10, 10 30, 20 35),(30 20, 20 25, 20 15, 30 20)))"
\ No newline at end of file
diff --git a/tests/data/csv/nulls_and_booleans_as_strings.csv b/tests/data/csv/nulls_and_booleans_as_strings.csv
deleted file mode 100644
index e77a2f0..0000000
--- a/tests/data/csv/nulls_and_booleans_as_strings.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-x,y,null,boolean
-0,0,null,true
-0,0,,false
\ No newline at end of file
diff --git a/tests/data/csv/number_types.csv b/tests/data/csv/number_types.csv
deleted file mode 100644
index d767bbb..0000000
--- a/tests/data/csv/number_types.csv
+++ /dev/null
@@ -1,9 +0,0 @@
-x,y,floats
-0,0,.0
-0,0,+.0
-0,0,1e-06
-0,0,-1e-06
-0,0,0.000001
-0,0,1.234e+16
-0,0,1.234e16
-0,0,"1.234e16"
\ No newline at end of file
diff --git a/tests/data/csv/numbers_for_headers.csv b/tests/data/csv/numbers_for_headers.csv
deleted file mode 100644
index e2144a7..0000000
--- a/tests/data/csv/numbers_for_headers.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-x,y,1990,1991,1992
-0,0,1,2,3
\ No newline at end of file
diff --git a/tests/data/csv/nypd.csv b/tests/data/csv/nypd.csv
deleted file mode 100644
index acd2c1a..0000000
--- a/tests/data/csv/nypd.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-Precinct,Phone,Address,City,geo_longitude,geo_latitude,geo_accuracy
-5th Precinct,(212) 334-0711,19 Elizabeth Street,"New York, NY",-70.0,40.0,house
-9th Precinct,(212) 477-7811,130 Avenue C,"New York, NY",-73.0,41.0,house
\ No newline at end of file
diff --git a/tests/data/csv/pipe_delimiters.csv b/tests/data/csv/pipe_delimiters.csv
deleted file mode 100644
index 4d1d2af..0000000
--- a/tests/data/csv/pipe_delimiters.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-x|y|z
-0|0|hello
\ No newline at end of file
diff --git a/tests/data/csv/point_wkt.csv b/tests/data/csv/point_wkt.csv
deleted file mode 100644
index b21007f..0000000
--- a/tests/data/csv/point_wkt.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-type,WKT
-point, "POINT (30 10)"
-multipoint, "MULTIPOINT ((10 40), (40 30), (20 20), (30 10))"
\ No newline at end of file
diff --git a/tests/data/csv/points.csv b/tests/data/csv/points.csv
deleted file mode 100644
index 4852c0f..0000000
--- a/tests/data/csv/points.csv
+++ /dev/null
@@ -1,6 +0,0 @@
-x,y,label
-0,0,"0,0"
-5,5,"5,5"
-0,5,"0,5"
-5,0,"5,0"
-2,2,"2.5,2.5"
diff --git a/tests/data/csv/poly_wkt.csv b/tests/data/csv/poly_wkt.csv
deleted file mode 100644
index dd4851a..0000000
--- a/tests/data/csv/poly_wkt.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-type,WKT
-polygon, "POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10))"
-polygon, "POLYGON ((35 10, 10 20, 15 40, 45 45, 35 10),(20 30, 35 35, 30 20, 20 30))"
\ No newline at end of file
diff --git a/tests/data/csv/semicolon_delimiters.csv b/tests/data/csv/semicolon_delimiters.csv
deleted file mode 100644
index ba61fae..0000000
--- a/tests/data/csv/semicolon_delimiters.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-x;y;z
-0;0;hello
\ No newline at end of file
diff --git a/tests/data/csv/tabs.tsv b/tests/data/csv/tabs.tsv
deleted file mode 100644
index be33ff8..0000000
--- a/tests/data/csv/tabs.tsv
+++ /dev/null
@@ -1,3 +0,0 @@
-x y name
--122 48 hello
-0 0 "null island"
\ No newline at end of file
diff --git a/tests/data/csv/tabs_in_csv.csv b/tests/data/csv/tabs_in_csv.csv
deleted file mode 100644
index 3718126..0000000
--- a/tests/data/csv/tabs_in_csv.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-x, y,z
--122 , 48,0
\ No newline at end of file
diff --git a/tests/data/csv/trailing_newline_mac.csv b/tests/data/csv/trailing_newline_mac.csv
deleted file mode 100644
index 5a7051d..0000000
--- a/tests/data/csv/trailing_newline_mac.csv
+++ /dev/null
@@ -1 +0,0 @@
-x,y,z
0,0,0
1,2,3
diff --git a/tests/data/csv/trailing_newline_win.csv b/tests/data/csv/trailing_newline_win.csv
deleted file mode 100644
index 289bb95..0000000
--- a/tests/data/csv/trailing_newline_win.csv
+++ /dev/null
@@ -1,12 +0,0 @@
-FID,wkt,REGIONNAME,RID
-Eth_Region_Boundary.1,"POINT (0 0)",Addis Ababa,14
-Eth_Region_Boundary.2,"POINT (0 0)",Tigray,01
-Eth_Region_Boundary.3,"POINT (0 0)",Somali,05
-Eth_Region_Boundary.4,"POINT (0 0)",Dire Dawa,15
-Eth_Region_Boundary.5,"POINT (0 0)",Hareri,13
-Eth_Region_Boundary.6,"POINT (0 0)",SNNPR,07
-Eth_Region_Boundary.7,"POINT (0 0)",Gambela,12
-Eth_Region_Boundary.8,"POINT (0 0)",Beneshangul Gumu,06
-Eth_Region_Boundary.9,"POINT (0 0)",Amhara,03
-Eth_Region_Boundary.10,"POINT (0 0)",Afar,02
-Eth_Region_Boundary.11,"POINT (0 0)",Oromia,04
diff --git a/tests/data/csv/unicode.tsv b/tests/data/csv/unicode.tsv
deleted file mode 100644
index d3e2a3c..0000000
--- a/tests/data/csv/unicode.tsv
+++ /dev/null
@@ -1,11 +0,0 @@
-geonameid name asciiname alternatenames latitude longitude feature_class feature_code country_code cc2 admin1 admin2 admin3 admin4 population elevation gtopo3 timezone mod_date
-725712 Vratsa Vratsa Vraca,Vratca,Vratsa,Vrattsa,Vratza,Wraza,Враца 43.21 23.5625 P PPLA BG 64 VRC10 64941 341 Europe/Sofia 2011-10-10
-725816 Sveti Vlas Sveti Vlas Manasturkioy,Manastŭrkioy,Monasturkioy,Monastŭrkioy,Saint Vlas,Sveti Vlas,Sveti-Vlas,Sweti Wlas,Vlas,Влас,Свети-Влас 42.7136 27.75867 P PPL BG BG 39 BGS15 BGS15-02 3875 50 -9999 Europe/Sofia 2010-03-07
-725905 Vidin Vidin Vidin,Vidine,Widin,wydyn,Видин,ویدین 43.99 22.8725 P PPLA BG 63 VID09 54409 35 Europe/Sofia 2011-10-10
-725924 Vetrino Vetrino Asya-Tepe,Jasi Tepe,Vetrino,Vyetreno,Vyetrino,Wetrino,Yasa-Tepe,Yase-Tepe,Yasu-Tepe,Yasă-Tepe,Yasŭ-Tepe,Ветрино 43.31667 27.43333 P PPL BG BG 61 VAR08 1368 223 Europe/Sofia 2011-10-10
-725935 Vetovo Vetovo Vetova,Vetovo,Vjetevo,Vyetovo,Wetowo,Ветово 43.7 26.26667 P PPL BG 53 RSE05 5175 184 Europe/Sofia 2007-04-05
-725967 Venets Venets K'okledzha,K'oklyudzha,K'okyudzha,Kiokhudza,Kiokhudža,Kokedzha,K’okledzha,K’oklyudzha,K’okyudzha,Venec,Venets,Vyenets,Wenez,Венец 43.55 26.93333 P PPL BG BG 54 SHU07 1450 334 Europe/Sofia 2011-10-10
-725988 Velingrad Velingrad Velingrad,Велинград 42.02724 23.99569 P PPL BG 48 PAZ08 24036 745 Europe/Sofia 2010-05-28
-725993 Veliko Tŭrnovo Veliko Turnovo Tarnovo,Tarnowo,Ternovo,Tirnovo,Trnova,Trnovo,Turnovo,Tărnovo,Tărnowo,Tŭrnovo,Veliko T\"rnovo,Veliko Tarnovo,Veliko Tărnovo,Weliko Tarnowo,Weliko Tyrnowo,vu~erikotarunovu~o,Велико Търново,ヴェリコタルノヴォ 43.08124 25.62904 P PPLA BG 62 VTR04 66217 162 Europe/Sofia 2007-07-01
-726050 Varna Varna Barna,Odessos,Odessus,Stalin,Varna,Warna,farna,varna,vu~aruna,wa er na,wrnh,Βάρνα,Варна,ורנה,فارنا,ვარნა,ヴァルナ,瓦爾納 43.21667 27.91667 P PPLA BG 61 VAR06 312770 95 Europe/Sofia 2011-10-10
-726114 Ugŭrchin Ugurchin Ugarchin,Ugarcin,Ugartschin,Ugarčin,Ugirkin,Ugrchin,Ugrcin,Ugrčin,Ugurchin,Ugurcin,Ugürčin,Ugărchin,Ugărtschin,Угърчин 43.1 24.41667 P PPL BG 46 LOV36 2965 298 Europe/Sofia 2007-04-05
diff --git a/tests/data/csv/warns/feature_id_counting.csv b/tests/data/csv/warns/feature_id_counting.csv
deleted file mode 100644
index 2f08994..0000000
--- a/tests/data/csv/warns/feature_id_counting.csv
+++ /dev/null
@@ -1,4 +0,0 @@
-x,y,id
-0,0,1
-bad,bad,2
-0,0,2
diff --git a/tests/data/csv/warns/invalid_geometries.csv b/tests/data/csv/warns/invalid_geometries.csv
deleted file mode 100644
index 6763f08..0000000
--- a/tests/data/csv/warns/invalid_geometries.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-x,y,z
--122a,48b,bogus
--122,48,fine
\ No newline at end of file
diff --git a/tests/data/csv/windows_newlines.csv b/tests/data/csv/windows_newlines.csv
deleted file mode 100644
index 07c0dc4..0000000
--- a/tests/data/csv/windows_newlines.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-x,y,z
-1,10,9999.9999
\ No newline at end of file
diff --git a/tests/data/csv/windows_newlines_with_unix_inline.csv b/tests/data/csv/windows_newlines_with_unix_inline.csv
deleted file mode 100644
index f748c05..0000000
--- a/tests/data/csv/windows_newlines_with_unix_inline.csv
+++ /dev/null
@@ -1,7 +0,0 @@
-x,y,line
-0,0,"
- many
- lines
- of text
- with unix newlines
- "
diff --git a/tests/data/csv/windows_newlines_with_unix_inline_escaped.csv b/tests/data/csv/windows_newlines_with_unix_inline_escaped.csv
deleted file mode 100644
index 5f551d3..0000000
--- a/tests/data/csv/windows_newlines_with_unix_inline_escaped.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-x,y,line
-0,0,"many\n lines\n of text\n with unix newlines"
diff --git a/tests/data/csv/wkt.csv b/tests/data/csv/wkt.csv
deleted file mode 100644
index e276bf8..0000000
--- a/tests/data/csv/wkt.csv
+++ /dev/null
@@ -1,10 +0,0 @@
-type,WKT
-point, "POINT (30 10)"
-linestring, "LINESTRING (30 10, 10 30, 40 40)"
-polygon, "POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10))"
-polygon, "POLYGON ((35 10, 10 20, 15 40, 45 45, 35 10),(20 30, 35 35, 30 20, 20 30))"
-multipoint, "MULTIPOINT ((10 40), (40 30), (20 20), (30 10))"
-multilinestring, "MULTILINESTRING ((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))"
-multipolygon, "MULTIPOLYGON (((30 20, 10 40, 45 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))"
-multipolygon, "MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)),((20 35, 45 20, 30 5, 10 10, 10 30, 20 35),(30 20, 20 25, 20 15, 30 20)))"
-collection, "GEOMETRYCOLLECTION(POLYGON((1 1,2 1,2 2,1 2,1 1)),POINT(2 3),LINESTRING(2 3,3 4))"
\ No newline at end of file
diff --git a/tests/data/csv/x_y.csv b/tests/data/csv/x_y.csv
deleted file mode 100644
index d436ff3..0000000
--- a/tests/data/csv/x_y.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-x,y
-0,0
\ No newline at end of file
diff --git a/tests/data/fonts/fake.ttf b/tests/data/fonts/fake.ttf
deleted file mode 100644
index e69de29..0000000
diff --git a/tests/data/fonts/intentionally-broken.ttf b/tests/data/fonts/intentionally-broken.ttf
deleted file mode 100644
index 887230d..0000000
Binary files a/tests/data/fonts/intentionally-broken.ttf and /dev/null differ
diff --git a/tests/data/good_maps/agg_poly_gamma_map.xml b/tests/data/good_maps/agg_poly_gamma_map.xml
deleted file mode 100644
index e7089ca..0000000
--- a/tests/data/good_maps/agg_poly_gamma_map.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="steelblue" minimum-version="0.7.2">
- <Style name="style">
-
- <!-- Asia - default dark color behind light polygon
- leads to "ghost lines" show-through
- -->
-
- <Rule>
- <Filter>([REGION]=142)</Filter>
- <PolygonSymbolizer fill="yellow"/>
- </Rule>
-
- <!-- Europe, using Opacity avoids "ghost lines"
- -->
- <Rule>
- <Filter>([REGION]=150)</Filter>
- <PolygonSymbolizer fill="rgb(176,151,238)" fill-opacity=".3"/>
- </Rule>
-
- <!-- Americas, using gamma of .65 to remove blue lines works as well..
- -->
- <Rule>
- <Filter>([REGION]=19)</Filter>
- <PolygonSymbolizer fill="rgb(136,172,2)" gamma=".6"/>
- </Rule>
-
- <!-- Africa, using gamma of .65 to remove blue lines works as well..
- -->
- <Rule>
- <Filter>([REGION]=2)</Filter>
- <PolygonSymbolizer fill="rgb(239,98,133)" gamma=".65"/>
- </Rule>
-
- <!-- Oceana, all disjunct polygons so it does not matter -->
- <Rule>
- <Filter>([REGION]=9)</Filter>
- <PolygonSymbolizer fill="rgb(212,9,14)"/>
- </Rule>
- </Style>
- <Layer name="world" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/world_merc</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/agg_stack_blur.xml b/tests/data/good_maps/agg_stack_blur.xml
deleted file mode 100644
index a8511c7..0000000
--- a/tests/data/good_maps/agg_stack_blur.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="steelblue">
- <!-- Asia -->
- <Style name="style" filter-mode="first">
- <Rule>
- <Filter>([REGION]=142)</Filter>
- <PolygonSymbolizer fill="yellow"/>
- </Rule>
- </Style>
- <!-- Not Asia -->
- <Style name="style2" filter-mode="first" image-filters="agg-stack-blur(2,2)">
- <Rule>
- <Filter>([REGION]!=142)</Filter>
- <PolygonSymbolizer fill="green" fill-opacity=".3"/>
- </Rule>
- </Style>
- <Layer name="world" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <StyleName>style2</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/world_merc</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/also_and_else_filter.xml b/tests/data/good_maps/also_and_else_filter.xml
deleted file mode 100644
index 0616e3d..0000000
--- a/tests/data/good_maps/also_and_else_filter.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" minimum-version="0.7.2">
- <Style name="test 1">
- <Rule>
- <Filter>[foo]='bar'</Filter>
- <PointSymbolizer file="../images/dummy.png"/>
- </Rule>
- <Rule>
- <ElseFilter/>
- <PointSymbolizer file="../images/dummy.png"/>
- </Rule>
- <Rule>
- <AlsoFilter/>
- <PointSymbolizer file="../images/dummy.png"/>
- </Rule>
- </Style>
-</Map>
diff --git a/tests/data/good_maps/background-image.xml b/tests/data/good_maps/background-image.xml
deleted file mode 100644
index 1b09e01..0000000
--- a/tests/data/good_maps/background-image.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<Map background-image="../../data/images/checker.jpg" minimum-version="0.7.2">
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/bool_values.xml b/tests/data/good_maps/bool_values.xml
deleted file mode 100644
index 5e4742d..0000000
--- a/tests/data/good_maps/bool_values.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" minimum-version="0.7.2">
- <Style name="test 1">
- <Rule>
- <PointSymbolizer file="../images/dummy.png" allow-overlap="true"/>
- </Rule>
- </Style>
- <Style name="test 2">
- <Rule>
- <PointSymbolizer file="../images/dummy.png" allow-overlap="yes"/>
- </Rule>
- </Style>
- <Style name="test 3">
- <Rule>
- <PointSymbolizer file="../images/dummy.png" allow-overlap="on"/>
- </Rule>
- </Style>
- <Style name="test 4">
- <Rule>
- <PointSymbolizer file="../images/dummy.png" allow-overlap="1"/>
- </Rule>
- </Style>
- <Style name="test 5">
- <Rule>
- <PointSymbolizer file="../images/dummy.png" allow-overlap="false"/>
- </Rule>
- </Style>
- <Style name="test 6">
- <Rule>
- <PointSymbolizer file="../images/dummy.png" allow-overlap="no"/>
- </Rule>
- </Style>
- <Style name="test 7">
- <Rule>
- <PointSymbolizer file="../images/dummy.png" allow-overlap="off"/>
- </Rule>
- </Style>
- <Style name="test 8">
- <Rule>
- <PointSymbolizer file="../images/dummy.png" allow-overlap="0"/>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/bounds_clipping.xml b/tests/data/good_maps/bounds_clipping.xml
deleted file mode 100644
index f6434f6..0000000
--- a/tests/data/good_maps/bounds_clipping.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<!-- without maximum-extent this will drop features if a
- buffer_size is used of >= 128 which can be simulated with:
-
-a tile request like: /2/0/1.png
-
-or using nik2img:
-
-nik2img.py tests/data/good_maps/bounds_clipping.xml t.png -e -20037508.34 -5009377.085697313 -5009377.08569731 15028131.25709193 -d 256 256
-
-no buffer can be simulated with:
-
-nik2img.py tests/data/good_maps/bounds_clipping.xml t.png -d 256 256 -e -20037508.342789244 0 -10018754.171394622 10018754.17139462
-
-+proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813975277778 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +towgs84=498.17,136.89,510.08,6.007,4.343,3.831,3.38 +no_defs
-
---><Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" minimum-version="0.7.2" buffer-size="128" maximum-extent="-20037508.34,-20037508.34,20037508.34,20037508.34">
-
- <Style name="style">
- <Rule>
- <PolygonSymbolizer fill="darkred"/>
- </Rule>
-
- </Style>
-
- <!-- layer in standard mercator: being protected into
- spherical mercator makes it prone to feature loss
- when using map buffer
- -->
- <Layer name="countries" srs="+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="type">shape</Parameter>
- <Parameter name="file">../shp/world_merc2.shp</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/building_symbolizer.xml b/tests/data/good_maps/building_symbolizer.xml
deleted file mode 100644
index 85abf17..0000000
--- a/tests/data/good_maps/building_symbolizer.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<Map background-color="steelblue" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs" minimum-version="0.7.2">
-
- <Style name="test">
- <Rule>
- <BuildingSymbolizer fill="yellow" fill-opacity=".7" height="30"/>
- </Rule>
- </Style>
-
- <Layer name="lay" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs">
- <StyleName>test</StyleName>
- <Datasource>
- <Parameter name="type">shape</Parameter>
- <Parameter name="file">../../data/shp/poly.shp</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/datasource.xml b/tests/data/good_maps/datasource.xml
deleted file mode 100644
index 87c7057..0000000
--- a/tests/data/good_maps/datasource.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<Map background-color="steelblue" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs" minimum-version="0.7.2">
-
- <Style name="test">
- <Rule>
- <PolygonSymbolizer/>
- </Rule>
- </Style>
-
- <Datasource name="shp">
- <Parameter name="type">shape</Parameter>
- <Parameter name="base">../../data/shp/</Parameter>
- </Datasource>
-
- <Layer name="lay" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs">
- <StyleName>test</StyleName>
- <Datasource base="shp">
- <Parameter name="file">poly.shp</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/empty_parameter1.xml b/tests/data/good_maps/empty_parameter1.xml
deleted file mode 100755
index eb52e65..0000000
--- a/tests/data/good_maps/empty_parameter1.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<Map>
- <Layer>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- x,y
- 0,0
- </Parameter>
- <Parameter name="empty"></Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/data/good_maps/empty_parameter2.xml b/tests/data/good_maps/empty_parameter2.xml
deleted file mode 100755
index e9203e7..0000000
--- a/tests/data/good_maps/empty_parameter2.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<Map>
- <Layer>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- x,y
- 0,0
- </Parameter>
- <Parameter name="empty"><![CDATA[ ]]></Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/data/good_maps/empty_parameter3.xml b/tests/data/good_maps/empty_parameter3.xml
deleted file mode 100755
index eb52e65..0000000
--- a/tests/data/good_maps/empty_parameter3.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<Map>
- <Layer>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- x,y
- 0,0
- </Parameter>
- <Parameter name="empty"></Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/data/good_maps/empty_parameter4.xml b/tests/data/good_maps/empty_parameter4.xml
deleted file mode 100755
index 5f31b85..0000000
--- a/tests/data/good_maps/empty_parameter4.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<Map>
- <Layer>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- x,y
- 0,0
- </Parameter>
- <Parameter name="empty"> </Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/data/good_maps/empty_parameter5.xml b/tests/data/good_maps/empty_parameter5.xml
deleted file mode 100755
index 7dc9078..0000000
--- a/tests/data/good_maps/empty_parameter5.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<Map>
- <Layer>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- x,y
- 0,0
- </Parameter>
- <Parameter name="empty">''</Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/data/good_maps/empty_text_symbolizer.xml b/tests/data/good_maps/empty_text_symbolizer.xml
deleted file mode 100644
index 1582583..0000000
--- a/tests/data/good_maps/empty_text_symbolizer.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="steelblue" minimum-version="0.7.2">
-
- <Style name="labels">
- <Rule>
- <TextSymbolizer face-name="DejaVu Sans Book"></TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book">''</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book"><![CDATA[]]></TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>labels</StyleName>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/extra_arbitary_map_parameters.xml b/tests/data/good_maps/extra_arbitary_map_parameters.xml
deleted file mode 100644
index e6bd5d4..0000000
--- a/tests/data/good_maps/extra_arbitary_map_parameters.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<Map>
-
-<!--
- totally arbirary Parameters can also be attached to the map
- which will be respected during serialization.
-
- This makes it easier for calling applications that work with mapnik
- xml, and leverage its serialization, to pass through directives that
- the calling application needs which describe how to handle the map.
--->
-
- <Parameters>
- <Parameter name="key" type="string"><![CDATA[value]]></Parameter>
- <!-- this one will override previous key with same name -->
- <Parameter name="key" type="string"><![CDATA[value2]]></Parameter>
- <Parameter name="key3" type="string"><![CDATA[value3]]></Parameter>
- <Parameter name="unicode" type="string"><![CDATA[iván]]></Parameter>
- <Parameter name="integer" type="int"><![CDATA[10]]></Parameter>
- <Parameter name="decimal" type="float"><![CDATA[.999]]></Parameter>
- <!-- without a type attribute numbers are treated as strings -->
- <Parameter name="number-as-string"><![CDATA[.9998]]></Parameter>
- </Parameters>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/extra_known_map_attributes.xml b/tests/data/good_maps/extra_known_map_attributes.xml
deleted file mode 100644
index 0c88449..0000000
--- a/tests/data/good_maps/extra_known_map_attributes.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<Map font-directory="../fonts/DejaVuSansMono-BoldOblique.ttf" minimum-version="0.0.0">
-
-<!--
- font-directory and minimin-version are extra attributes known
- to load_map which are use to invoke special behavior at map loading time
- if present.
-
- they are discarded after intial parse because they make no sense as an
- in-memory map property.
-
--->
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/filesource.xml b/tests/data/good_maps/filesource.xml
deleted file mode 100644
index ec8b9c2..0000000
--- a/tests/data/good_maps/filesource.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<Map background-color="steelblue" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs" minimum-version="0.7.2">
-
- <FileSource name="foo">../images/</FileSource>
-
- <Style name="test">
- <Rule>
- <BuildingSymbolizer fill="darkred" fill-opacity="1" height="30"/>
- <PointSymbolizer base="foo" file="dummy.png"/>
- </Rule>
- </Style>
-
- <Layer name="lay" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs ">
- <StyleName>test</StyleName>
- <Datasource>
- <Parameter name="type">shape</Parameter>
- <Parameter name="base">../../data/shp/</Parameter>
- <Parameter name="file">poly.shp</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/fontset.xml b/tests/data/good_maps/fontset.xml
deleted file mode 100644
index 80ab2cd..0000000
--- a/tests/data/good_maps/fontset.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<Map>
-
-<FontSet name="book-fonts">
- <Font face-name="DejaVu Sans Book" />
- <Font face-name="DejaVu Sans Oblique" />
-</FontSet>
-
-</Map>
diff --git a/tests/data/good_maps/frame.xml b/tests/data/good_maps/frame.xml
deleted file mode 100644
index 29e3626..0000000
--- a/tests/data/good_maps/frame.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer transform="scale(1,1)"/>
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/geometry-transform.xml b/tests/data/good_maps/geometry-transform.xml
deleted file mode 100644
index c5872fe..0000000
--- a/tests/data/good_maps/geometry-transform.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="steelblue" minimum-version="0.7.2">
- <Style name="base">
- <Rule>
- <LineSymbolizer stroke-width=".5"/>
- </Rule>
- </Style>
-
- <Style name="style">
-
- <!-- Asia -->
- <Rule>
- <Filter>([REGION]=142)</Filter>
- <PolygonSymbolizer fill="yellow" geometry-transform="translate(10,10)"/>
- </Rule>
-
- <!-- Europe -->
- <Rule>
- <Filter>([REGION]=150)</Filter>
- <PolygonSymbolizer fill="rgb(176,151,238)" geometry-transform="translate(-10,-10)"/>
- </Rule>
-
- <!-- Americas -->
- <Rule>
- <Filter>([REGION]=19)</Filter>
- <PolygonSymbolizer fill="rgb(136,172,2)" geometry-transform="skewX(-10) skewY(-10)"/>
- </Rule>
-
- <!-- Africa -->
- <Rule>
- <Filter>([REGION]=2)</Filter>
- <PolygonSymbolizer fill="rgb(239,98,133)" geometry-transform="rotate(10,1,-1)"/>
- </Rule>
-
- <!-- Oceana -->
- <Rule>
- <Filter>([REGION]=9)</Filter>
- <PolygonSymbolizer fill="darkred" geometry-transform="translate(1.1,1.1)"/>
- <PolygonSymbolizer fill="red" geometry-transform="translate(-1.1,-1.1)"/>
- </Rule>
-
- </Style>
- <Layer name="world" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <StyleName>base</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/world_merc</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/interior_point.xml b/tests/data/good_maps/interior_point.xml
deleted file mode 100644
index bfc0398..0000000
--- a/tests/data/good_maps/interior_point.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="rgb(233,233,233)" minimum-version="0.7.2">
-
- <Style name="multipolygon_style">
- <Rule>
- <PolygonSymbolizer fill="pink" gamma="0.7"/>
- <LineSymbolizer stroke="darkred"/>
- </Rule>
- <Rule>
- <!-- Text using interior point -->
- <!-- Using normal centroid algorithm -->
- <TextSymbolizer dy="2" placement="interior" face-name="DejaVu Sans Book" halo-radius="2" allow-overlap="true">'interior point'</TextSymbolizer>
- <PointSymbolizer placement="interior" allow-overlap="true"/>
- </Rule>
- <Rule>
- <!-- Text using interior point -->
- <!-- Using normal centroid algorithm -->
- <TextSymbolizer dy="-2" face-name="DejaVu Sans Book" halo-radius="2" allow-overlap="true">'centroid'</TextSymbolizer>
- <PointSymbolizer allow-overlap="true"/>
- </Rule>
- </Style>
-
- <Layer name="multipolygon" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>multipolygon_style</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
- <Parameter name="table">multipolygon</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/layer_buffer_size_reduction.xml b/tests/data/good_maps/layer_buffer_size_reduction.xml
deleted file mode 100644
index a6f93fd..0000000
--- a/tests/data/good_maps/layer_buffer_size_reduction.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="lightsteelblue" buffer-size="256">
- <Style name="point_style">
- <Rule>
- <PointSymbolizer file="../svg/point_sm.svg"/>
- <TextSymbolizer size="12" dy="-5" face-name="DejaVu Sans Book" halo-fill="rgba(255,255,255,.5)" halo-radius=".5">[name]</TextSymbolizer>
- </Rule>
- </Style>
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" buffer-size="-150">
- <StyleName>point_style</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
- <Parameter name="table">point</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/data/good_maps/line_symbolizer.xml b/tests/data/good_maps/line_symbolizer.xml
deleted file mode 100644
index 7a4944a..0000000
--- a/tests/data/good_maps/line_symbolizer.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<Map background-color="steelblue" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs" minimum-version="0.7.2">
-
- <Style name="test">
- <Rule>
- <!-- big, thick, aliased lines -->
- <LineSymbolizer stroke="white" stroke-gamma="0" stroke-width="10"/>
-
- <!-- small, clean, anti-aliased lines -->
- <DebugSymbolizer mode="vertex"/>
-
- </Rule>
- </Style>
-
- <Layer name="lay" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs">
- <StyleName>test</StyleName>
- <Datasource>
- <Parameter name="type">shape</Parameter>
- <Parameter name="file">../../data/shp/poly.shp</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/line_symbolizer2.xml b/tests/data/good_maps/line_symbolizer2.xml
deleted file mode 100644
index fbcdd0b..0000000
--- a/tests/data/good_maps/line_symbolizer2.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="rgb(233,233,233)" minimum-version="0.7.2">
-
- <Datasource name="sqlite">
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
- </Datasource>
-
- <Style name="polygon_style">
- <Rule>
- <MarkersSymbolizer fill="darkgreen" placement="point" allow-overlap="true"/>
- <PolygonSymbolizer fill="green"/>
- </Rule>
- </Style>
-
- <Layer name="polygons" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>polygon_style</StyleName>
- <Datasource base="sqlite">
- <Parameter name="table">multipolygon</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="line_style">
- <Rule>
- <MarkersSymbolizer fill="darkred" placement="point" allow-overlap="true"/>
- <LineSymbolizer stroke="red"/>
- </Rule>
- </Style>
-
- <Layer name="lines" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>line_style</StyleName>
- <Datasource base="sqlite">
- <Parameter name="table">lines</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/line_symbolizer_offset.xml b/tests/data/good_maps/line_symbolizer_offset.xml
deleted file mode 100644
index c796add..0000000
--- a/tests/data/good_maps/line_symbolizer_offset.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<Map minimum-version="2.1.0" background-color="white">
- <Style name="style">
- <Rule>
- <LineSymbolizer offset="2"/>
- <LineSymbolizer offset="-2"/>
- </Rule>
- </Style>
- <Layer name="lay">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- wkt,name
- "MULTILINESTRING ((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))",line
- </Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/marker-text-line.xml b/tests/data/good_maps/marker-text-line.xml
deleted file mode 100644
index 776a873..0000000
--- a/tests/data/good_maps/marker-text-line.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <Style name="ellipse">
- <Rule>
- <MarkersSymbolizer
- width="240"
- height="240"
- fill="steelblue"
- fill-opacity=".7"
- stroke="yellow"
- stroke-width="16"
- stroke-opacity=".3"
- ignore-placement="true"
- />
- </Rule>
- </Style>
-
- <Style name="line">
- <Rule>
- <LineSymbolizer
- stroke="purple"
- stroke-dasharray="15,5"
- stroke-width="4"
- stroke-opacity=".3"
- stroke-linecap="round"
- />
- <LineSymbolizer
- stroke="darkorange"
- stroke-dasharray="15,5"
- stroke-width="1"
- stroke-opacity=".9"
- stroke-linecap="round"
- />
- </Rule>
- </Style>
-
- <Style name="text">
- <Rule>
- <TextSymbolizer
- size="25"
- orientation="45"
- face-name="DejaVu Sans Book"
- halo-radius="2">'45˚ text'</TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="ellipse" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>ellipse</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-2.5,2.5
- </Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="line" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>line</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt
-"LINESTRING(0 0, 2.5 2.5, 5 5)"
-"LINESTRING(0 5, 2.5 2.5, 5 0)"
- </Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="text" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-2,2.5
-3,2.5
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/marker_ellipse_transform.xml b/tests/data/good_maps/marker_ellipse_transform.xml
deleted file mode 100644
index a5c7ffe..0000000
--- a/tests/data/good_maps/marker_ellipse_transform.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="rgba(255,255,255,.5)">
-
- <Style name="ellipse">
- <Rule>
- <MarkersSymbolizer
- width="240"
- height="240"
- fill="steelblue"
- fill-opacity=".7"
- stroke="yellow"
- stroke-width="16"
- stroke-opacity=".3"
- />
- <MarkersSymbolizer
- width="100"
- opacity=".5"
- fill="darkorange"
- comp-op="multiply"
- transform="skewX(50)"
- allow-overlap="true"
- />
- <MarkersSymbolizer
- width="100"
- opacity=".5"
- fill="darkred"
- comp-op="color-burn"
- transform="skewX(-50)"
- allow-overlap="true"
- />
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>ellipse</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-2.5,2.5
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/marker_ellipse_transform2.xml b/tests/data/good_maps/marker_ellipse_transform2.xml
deleted file mode 100644
index 5449009..0000000
--- a/tests/data/good_maps/marker_ellipse_transform2.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="rgba(255,255,255,.5)">
-
- <Style name="ellipse">
- <Rule>
- <MarkersSymbolizer
- width="240"
- height="240"
- fill="steelblue"
- fill-opacity=".7"
- stroke="yellow"
- stroke-width="16"
- stroke-opacity=".3"
- />
- <MarkersSymbolizer
- width="100"
- opacity=".5"
- fill="darkorange"
- comp-op="grain-extract"
- transform="skewX(50)"
- allow-overlap="true"
- />
- <MarkersSymbolizer
- width="100"
- opacity=".5"
- fill="darkred"
- comp-op="color-burn"
- transform="skewX(-50)"
- allow-overlap="true"
- />
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>ellipse</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-2.5,2.5
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/markers_symbolizer_lines.xml b/tests/data/good_maps/markers_symbolizer_lines.xml
deleted file mode 100644
index 6cfc5ad..0000000
--- a/tests/data/good_maps/markers_symbolizer_lines.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
- <Style name="1">
- <Rule>
- <LineSymbolizer stroke-width=".2" stroke="grey"/>
- <MarkersSymbolizer
- file="shape://arrow"
- transform="scale(.8,.5)"
- stroke="green"
- stroke-width="1.3"
- fill="yellow"
- placement="line"
- />
- </Rule>
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
- <Parameter name="table">lines</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/markers_symbolizer_lines_file.xml b/tests/data/good_maps/markers_symbolizer_lines_file.xml
deleted file mode 100644
index 1df8842..0000000
--- a/tests/data/good_maps/markers_symbolizer_lines_file.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
- <Style name="1">
- <Rule>
- <LineSymbolizer offset="-2" stroke-width="2" stroke="red"/>
- <LineSymbolizer stroke-width="2" stroke="orange"/>
- <LineSymbolizer offset="2" stroke-width="2" stroke="yellow"/>
- <LineSymbolizer offset="4" stroke-width="2" stroke="green"/>
- <MarkersSymbolizer
- file="../svg/octocat.svg"
- transform="scale(.13)"
- placement="line"
- />
- </Rule>
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
- <Parameter name="table">lines</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/markers_symbolizer_points.xml b/tests/data/good_maps/markers_symbolizer_points.xml
deleted file mode 100644
index 2984cc3..0000000
--- a/tests/data/good_maps/markers_symbolizer_points.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
-
- <Style name="1">
- <Rule>
- <Filter>([name]='CHILE')</Filter>
- <MarkersSymbolizer fill="darkgreen" opacity=".7" width="15" height="10" stroke="green" stroke-width="7" stroke-opacity=".2" placement="point" marker-type="ellipse"/>
- </Rule>
- <Rule>
- <Filter>([name]='Australia')</Filter>
- <MarkersSymbolizer fill="darkblue" opacity=".7" width="10" height="20" stroke="blue" stroke-width="7" stroke-opacity=".2" placement="point" marker-type="ellipse"/>
- </Rule>
- <Rule>
- <Filter>([name]='Brazil')</Filter>
- <MarkersSymbolizer fill="darkorange" opacity=".7" width="20" height="10" stroke="orange" stroke-width="7" stroke-opacity=".2" placement="point" marker-type="ellipse"/>
- </Rule>
- <Rule>
- <Filter>([name]='Mongolia')</Filter>
- <MarkersSymbolizer fill="darkgoldenrod" opacity=".7" width="25" height="10" stroke="yellow" stroke-width="7" stroke-opacity=".2" placement="point" marker-type="ellipse"/>
- </Rule>
- <Rule>
- <Filter>([name]='Sudan')</Filter>
- <MarkersSymbolizer fill="darkcyan" opacity=".7" width="15" height="10" stroke="cadetblue" stroke-width="7" stroke-opacity=".2" placement="point" marker-type="ellipse"/>
- </Rule>
- <Rule>
- <Filter>([name]='United States')</Filter>
- <MarkersSymbolizer fill="#cc3344" opacity=".7" width="15" height="10" stroke="#cc3344" stroke-width="7" stroke-opacity=".2" placement="point" marker-type="ellipse"/>
- </Rule>
- <Rule>
- <ElseFilter/>
- <PointSymbolizer file="../svg/ellipses.svg"/>
- </Rule>
- </Style>
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
- <Parameter name="table">point</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/markers_symbolizer_points_file.xml b/tests/data/good_maps/markers_symbolizer_points_file.xml
deleted file mode 100644
index d4b63a9..0000000
--- a/tests/data/good_maps/markers_symbolizer_points_file.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
-
- <Style name="1">
- <Rule>
- <MarkersSymbolizer file="../svg/ellipses.svg"/>
- </Rule>
- </Style>
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
- <Parameter name="table">point</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/markers_symbolizer_points_gradient.xml b/tests/data/good_maps/markers_symbolizer_points_gradient.xml
deleted file mode 100644
index 06ca818..0000000
--- a/tests/data/good_maps/markers_symbolizer_points_gradient.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="white" minimum-version="0.7.2">
-
- <Style name="1">
- <Rule>
- <MarkersSymbolizer fill="black" opacity=".01" width="10" stroke-width="0" allow-overlap="true"/>
- <MarkersSymbolizer fill="black" opacity=".05" width="9" stroke-width="0" allow-overlap="true"/>
- <MarkersSymbolizer fill="black" opacity="0.1" width="8" stroke-width="0" allow-overlap="true"/>
- <MarkersSymbolizer fill="black" opacity="0.1" width="7" stroke-width="0" allow-overlap="true"/>
- <MarkersSymbolizer fill="black" opacity="0.1" width="6" stroke-width="0" allow-overlap="true"/>
- <MarkersSymbolizer fill="black" opacity="0.1" width="5" stroke-width="0" allow-overlap="true"/>
- <MarkersSymbolizer fill="black" opacity="0.1" width="4" stroke-width="0" allow-overlap="true"/>
- <MarkersSymbolizer fill="black" opacity="0.1" width="3" stroke-width="0" allow-overlap="true"/>
- <MarkersSymbolizer fill="black" opacity="0.2" width="2" stroke-width="0" allow-overlap="true"/>
- <MarkersSymbolizer fill="black" opacity="0.2" width="1" stroke-width="0" allow-overlap="true"/>
- </Rule>
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
- <Parameter name="table">point</Parameter>
- <Parameter name="wkb_format">spatialite</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/markers_symbolizer_points_stacked.xml b/tests/data/good_maps/markers_symbolizer_points_stacked.xml
deleted file mode 100644
index 10c71a0..0000000
--- a/tests/data/good_maps/markers_symbolizer_points_stacked.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<Map background-color="lightgrey" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
-
- <Style name="1">
- <Rule>
- <Filter>([name]='CHILE' or [name]='Australia' or [name]='Brazil')</Filter>
- <!-- stacked without outlines -->
- <MarkersSymbolizer fill="red" width="5" stroke-width="0" allow-overlap="true"/>
- <MarkersSymbolizer fill="orange" width="4" stroke-width="0" allow-overlap="true"/>
- <MarkersSymbolizer fill="yellow" width="3" stroke-width="0" allow-overlap="true"/>
- <MarkersSymbolizer fill="green" width="2" stroke-width="0" allow-overlap="true"/>
- <MarkersSymbolizer fill="blue" width="1" stroke-width="0" allow-overlap="true"/>
- <MarkersSymbolizer fill="purple" width=".5" stroke-width="0" allow-overlap="true"/>
- </Rule>
- <Rule>
- <ElseFilter/>
- <!-- single with without outline using stroke params -->
- <MarkersSymbolizer fill="white" stroke-width=".3" stroke="green" stroke-opacity=".5" allow-overlap="true"/>
- </Rule>
- </Style>
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
- <Parameter name="table">point</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/merc2wgs84_reprojection.xml b/tests/data/good_maps/merc2wgs84_reprojection.xml
deleted file mode 100644
index 161932e..0000000
--- a/tests/data/good_maps/merc2wgs84_reprojection.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="lightsteelblue">
- <Style name="My Style">
- <Rule>
- <PolygonSymbolizer fill="#f2eff9"/><LineSymbolizer stroke="rgb(50%,50%,50%)" stroke-width="0.1"/>
- </Rule>
- </Style>
-
- <Layer name="world" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">shape</Parameter>
- <Parameter name="file">../shp/world_merc.shp</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/osm-styles.xml b/tests/data/good_maps/osm-styles.xml
deleted file mode 100644
index 49f8a70..0000000
--- a/tests/data/good_maps/osm-styles.xml
+++ /dev/null
@@ -1,752 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" minimum-version="0.7.2">
- <Style name="mapnik:selection">
- <Rule>
- <Filter>[mapnik:geometry] = 1</Filter>
- <PointSymbolizer/>
- </Rule>
- <Rule>
- <Filter>[mapnik:geometry] = 2</Filter>
- <LineSymbolizer stroke="red" stroke-width="6" stroke-opacity="0.5"/>
- <LineSymbolizer stroke="yellow" stroke-width="2" stroke-opacity="1.0"/>
- </Rule>
- <Rule>
- <Filter>[mapnik:geometry] = 3</Filter>
- <PolygonSymbolizer fill-opacity="0.5" fill="red"/>
- </Rule>
- </Style>
- <Style name="world-1">
- <Rule>
- <MaxScaleDenominator>250000000000</MaxScaleDenominator>
- <MinScaleDenominator>6000000</MinScaleDenominator>
- <PolygonSymbolizer fill="#f2efe9"/>
- <LineSymbolizer stroke="#b5d0d0" stroke-width="0.5"/>
- </Rule>
- </Style>
- <Style name="world">
- <Rule>
- <MaxScaleDenominator>6000000</MaxScaleDenominator>
- <MinScaleDenominator>600000</MinScaleDenominator>
- <PolygonSymbolizer fill="#f2efe9"/>
- </Rule>
- </Style>
- <Style name="coast-poly">
- <Rule>
- <MaxScaleDenominator>600000</MaxScaleDenominator>
- <PolygonSymbolizer fill="#f2efe9"/>
- </Rule>
- </Style>
- <Style name="coast-line">
- <Rule>
- <MaxScaleDenominator>600000</MaxScaleDenominator>
- <LineSymbolizer stroke="skyblue"/>
- </Rule>
- </Style>
- <Style name="builtup">
- <Rule>
- <MaxScaleDenominator>2500000</MaxScaleDenominator>
- <MinScaleDenominator>500000</MinScaleDenominator>
- <PolygonSymbolizer fill="#ddd"/>
- </Rule>
- </Style>
- <Style name="places">
- <Rule>
- <MaxScaleDenominator>50000000</MaxScaleDenominator>
- <MinScaleDenominator>10000000</MinScaleDenominator>
- <TextSymbolizer size="10" fill="#444" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="0">[place_name]</TextSymbolizer>
- </Rule>
- </Style>
- <Style name="text">
- <Rule>
- <Filter>[place] = 'city'</Filter>
- <MaxScaleDenominator>10000000</MaxScaleDenominator>
- <MinScaleDenominator>2000000</MinScaleDenominator>
- <TextSymbolizer size="10" fill="#000" dy="0" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="0">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[place] = 'city'</Filter>
- <MaxScaleDenominator>2000000</MaxScaleDenominator>
- <MinScaleDenominator>20000</MinScaleDenominator>
- <TextSymbolizer size="14" fill="#000" dy="0" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="0">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[place] = 'town'</Filter>
- <MaxScaleDenominator>2000000</MaxScaleDenominator>
- <MinScaleDenominator>50000</MinScaleDenominator>
- <TextSymbolizer size="11" fill="#000" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="20">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[place] = 'town'</Filter>
- <MaxScaleDenominator>50000</MaxScaleDenominator>
- <TextSymbolizer size="14" fill="#777777" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="20">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[place] = 'village'</Filter>
- <MaxScaleDenominator>250000</MaxScaleDenominator>
- <MinScaleDenominator>50000</MinScaleDenominator>
- <TextSymbolizer size="8" fill="#000" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="0">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[place] = 'village'</Filter>
- <MaxScaleDenominator>50000</MaxScaleDenominator>
- <TextSymbolizer size="11" fill="#777777" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="0">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[place] = 'hamlet'</Filter>
- <MaxScaleDenominator>125000</MaxScaleDenominator>
- <TextSymbolizer size="8" fill="#000" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="0">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[amenity] = 'pub'</Filter>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <TextSymbolizer size="10" fill="brown" dy="16" face-name="DejaVu Sans Bold" halo-radius="1" wrap-width="0">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[amenity] = 'place_of_worship'</Filter>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <TextSymbolizer size="10" fill="#000033" dy="12" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="20">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[leisure] <> '' or [landuse] <> '' </Filter>
- <MaxScaleDenominator>20000</MaxScaleDenominator>
- <TextSymbolizer size="10" fill="#000" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="10">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[natural] = 'wood'</Filter>
- <MaxScaleDenominator>20000</MaxScaleDenominator>
- <TextSymbolizer size="10" fill="#000" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="10">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[natural] = 'peak'</Filter>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <TextSymbolizer size="10" fill="brown" dy="10" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="20">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[natural] = 'water' or [natural] = 'lake' or [landuse] = 'reservoir'</Filter>
- <MaxScaleDenominator>20000</MaxScaleDenominator>
- <TextSymbolizer size="10" fill="#6699cc" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="20">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[tourism] <> ''</Filter>
- <MaxScaleDenominator>10000</MaxScaleDenominator>
- <TextSymbolizer size="10" fill="#660033" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="10">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[amenity] = 'school' or [amenity] = 'university'</Filter>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <TextSymbolizer size="8" fill="#000033" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="12">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[amenity] = 'hospital'</Filter>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <TextSymbolizer size="8" fill="#000033" dy="12" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="12">[name]</TextSymbolizer>
- </Rule>
- </Style>
- <Style name="water">
- <Rule>
- <Filter>[landuse] = 'reservoir' or [landuse] = 'water'</Filter>
- <MaxScaleDenominator>1000000</MaxScaleDenominator>
- <PolygonSymbolizer fill="#b5d0d0"/>
- </Rule>
- <Rule>
- <Filter>[natural] = 'lake' or [natural] = 'water'</Filter>
- <MaxScaleDenominator>1000000</MaxScaleDenominator>
- <PolygonSymbolizer fill="#b5d0d0"/>
- </Rule>
- <Rule>
- <Filter>[natural] = 'land'</Filter>
- <MaxScaleDenominator>1000000</MaxScaleDenominator>
- <PolygonSymbolizer fill="#f2efe9"/>
- </Rule>
- <Rule>
- <Filter>[waterway]='river'</Filter>
- <MaxScaleDenominator>250000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#b5d0d0" stroke-width="2" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[waterway]='canal'</Filter>
- <MaxScaleDenominator>250000</MaxScaleDenominator>
- <MinScaleDenominator>100000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#b5d0d0" stroke-width="3" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[waterway]='canal'</Filter>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <MinScaleDenominator>50000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#b5d0d0" stroke-width="4" stroke-linecap="round"/>
- <TextSymbolizer size="8" fill="#6699cc" placement="line" face-name="DejaVu Sans Book" halo-radius="1">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <ElseFilter/>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <LineSymbolizer stroke="#b5d0d0" stroke-width="1"/>
- </Rule>
- <Rule>
- <Filter>[waterway]='river'</Filter>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#b5d0d0" stroke-width="10" stroke-linecap="round"/>
- <TextSymbolizer size="10" fill="#6699cc" placement="line" face-name="DejaVu Sans Book" halo-radius="1">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[waterway]='canal'</Filter>
- <MaxScaleDenominator>50000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#b5d0d0" stroke-width="7" stroke-linecap="round"/>
- <TextSymbolizer size="9" fill="#6699cc" placement="line" face-name="DejaVu Sans Book" halo-radius="1">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <ElseFilter/>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <LineSymbolizer stroke="#b5d0d0" stroke-width="2"/>
- <TextSymbolizer size="8" fill="#6699cc" placement="line" face-name="DejaVu Sans Book" halo-radius="1">[name]</TextSymbolizer>
- </Rule>
- </Style>
- <Style name="minor-roads-casing">
- <Rule>
- <Filter>[highway] = 'motorway' or [highway]='motorway_link'</Filter>
- <MaxScaleDenominator>150000</MaxScaleDenominator>
- <MinScaleDenominator>75000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#506077" stroke-width="4" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'motorway' or [highway]='motorway_link'</Filter>
- <MaxScaleDenominator>75000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#506077" stroke-width="7" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'motorway' or [highway]='motorway_link'</Filter>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <MinScaleDenominator>5000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#506077" stroke-width="14" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'motorway' or [highway]='motorway_link'</Filter>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#506077" stroke-width="17" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
- <MaxScaleDenominator>150000</MaxScaleDenominator>
- <MinScaleDenominator>75000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#477147" stroke-width="4" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
- <MaxScaleDenominator>75000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#477147" stroke-width="11" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <MinScaleDenominator>5000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#477147" stroke-width="14" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#477147" stroke-width="17" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
- <MaxScaleDenominator>150000</MaxScaleDenominator>
- <MinScaleDenominator>75000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#8d4346" stroke-width="4" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
- <MaxScaleDenominator>75000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#8d4346" stroke-width="10" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <MinScaleDenominator>5000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#8d4346" stroke-width="12" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#8d4346" stroke-width="17" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
- <MaxScaleDenominator>150000</MaxScaleDenominator>
- <MinScaleDenominator>75000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#a37b48" stroke-width="4" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
- <MaxScaleDenominator>75000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#a37b48" stroke-width="10" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <MinScaleDenominator>5000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#a37b48" stroke-width="12" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#a37b48" stroke-width="17" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'tertiary'</Filter>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <MinScaleDenominator>50000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="7" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'residential' or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <MinScaleDenominator>50000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="3" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'tertiary'</Filter>
- <MaxScaleDenominator>50000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="9" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'residential' or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
- <MaxScaleDenominator>50000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="4.5" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'tertiary' or [highway] = 'residential' or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <MinScaleDenominator>5000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="11" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'tertiary' or [highway] = 'residential' or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <MinScaleDenominator>100</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="16" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'service'</Filter>
- <MaxScaleDenominator>50000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="3" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'service'</Filter>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#999" stroke-width="8" stroke-linecap="round"/>
- </Rule>
- </Style>
- <Style name="minor-roads">
- <!-- level 10 -->
- <Rule>
- <Filter>[highway] = 'motorway' or [highway] = 'motorway_link'</Filter>
- <MaxScaleDenominator>500000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <LineSymbolizer stroke="#809bc0" stroke-width="4"/>
- </Rule>
- <!-- level 11 ...-->
- <Rule>
- <Filter>[highway] = 'motorway' or [highway] = 'motorway_link'</Filter>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <MinScaleDenominator>10000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#809bc0" stroke-width="8" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'motorway' or [highway] = 'motorway_link'</Filter>
- <MaxScaleDenominator>10000</MaxScaleDenominator>
- <MinScaleDenominator>5000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#809bc0" stroke-width="12" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'motorway' or [highway] = 'motorway_link'</Filter>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#809bc0" stroke-width="14" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#7fc97f" stroke-width="8" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
- <MaxScaleDenominator>50000</MaxScaleDenominator>
- <MinScaleDenominator>5000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#7fc97f" stroke-width="10" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#7fc97f" stroke-width="14" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#e46d71" stroke-width="8" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <MinScaleDenominator>5000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#e46d71" stroke-width="10" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#e46d71" stroke-width="14" stroke-linecap="round"/>
- </Rule>
- <!-- level 11 ..-->
- <Rule>
- <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
- <MaxScaleDenominator>150000</MaxScaleDenominator>
- <MinScaleDenominator>75000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#fdbf6f" stroke-width="2" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
- <MaxScaleDenominator>75000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#fdbf6f" stroke-width="8" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <MinScaleDenominator>5000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#fdbf6f" stroke-width="10" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#fdbf6f" stroke-width="14" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <Filter>[railway] = 'tram' or [railway] = 'light_rail'</Filter>
- <LineSymbolizer stroke="#aaa" stroke-width="2"/>
- </Rule>
- <Rule>
- <MaxScaleDenominator>200000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <Filter>[railway]='subway'</Filter>
- <LineSymbolizer stroke="#777" stroke-width="2" stroke-dasharray="6,2"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'tertiary' or [highway] = 'residential' or [highway] = 'unclassified'</Filter>
- <MaxScaleDenominator>1000000</MaxScaleDenominator>
- <MinScaleDenominator>100000</MinScaleDenominator>
- <LineSymbolizer stroke="#ccc" stroke-width="1"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'residential' or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <MinScaleDenominator>50000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#fff" stroke-width="2" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'residential' or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
- <MaxScaleDenominator>50000</MaxScaleDenominator>
- <MinScaleDenominator>15000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#fff" stroke-width="3" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'residential' or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <MinScaleDenominator>5000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#fff" stroke-width="9.4" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'residential' or [highway] = 'minor' or [highway] = 'unclassified'</Filter>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <MinScaleDenominator>100</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#fff" stroke-width="13" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'tertiary'</Filter>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <MinScaleDenominator>50000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#ffffcc" stroke-width="5" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'tertiary'</Filter>
- <MaxScaleDenominator>50000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#ffffcc" stroke-width="7" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'tertiary'</Filter>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <MinScaleDenominator>5000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#ffffcc" stroke-width="9.4" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'tertiary'</Filter>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#ffffcc" stroke-width="13" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'service'</Filter>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <MinScaleDenominator>50000</MinScaleDenominator>
- <LineSymbolizer stroke="#bbbbbb" stroke-width="1"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'service'</Filter>
- <MaxScaleDenominator>50000</MaxScaleDenominator>
- <MinScaleDenominator>25000</MinScaleDenominator>
- <LineSymbolizer stroke="white" stroke-width="2"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'service'</Filter>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="white" stroke-width="6" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'bridleway'</Filter>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-opacity="0.4"/>
- <LineSymbolizer stroke="green" stroke-width="1.5" stroke-dasharray="4,2"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'footway'</Filter>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#fff" stroke-width="6" stroke-linecap="round" stroke-opacity="0.4"/>
- <LineSymbolizer stroke-linejoin="round" stroke="salmon" stroke-width="2.0" stroke-dasharray="1,3" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'cycleway'</Filter>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="white" stroke-width="4" stroke-linecap="round" stroke-opacity="0.4"/>
- <LineSymbolizer stroke-linejoin="round" stroke="green" stroke-width="1.5" stroke-dasharray="1,3" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'track'</Filter>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="white" stroke-width="6" stroke-linecap="round" stroke-opacity="0.4"/>
- <LineSymbolizer stroke-linejoin="round" stroke="salmon" stroke-width="2.0" stroke-dasharray="4,2" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'pedestrian'</Filter>
- <MaxScaleDenominator>50000</MaxScaleDenominator>
- <LineSymbolizer stroke="grey" stroke-width="5"/>
- <LineSymbolizer stroke="#ededed" stroke-width="4"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'unsurfaced' or [highway] = 'byway'</Filter>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <LineSymbolizer stroke-linejoin="round" stroke="#fff" stroke-width="6" stroke-linecap="round" stroke-opacity="0.4"/>
- <LineSymbolizer stroke-linejoin="round" stroke="#ffc000" stroke-width="2.0" stroke-dasharray="4,4" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <Filter>[route] = 'ferry'</Filter>
- <MaxScaleDenominator>500000</MaxScaleDenominator>
- <LineSymbolizer stroke="navy" stroke-width="0.8" stroke-dasharray="6,6"/>
- </Rule>
- <Rule>
- <Filter>[aeroway] = 'runway'</Filter>
- <MaxScaleDenominator>500000</MaxScaleDenominator>
- <MinScaleDenominator>200000</MinScaleDenominator>
- <LineSymbolizer stroke="#bbc" stroke-width="2"/>
- </Rule>
- <Rule>
- <Filter>[aeroway] = 'runway'</Filter>
- <MaxScaleDenominator>200000</MaxScaleDenominator>
- <MinScaleDenominator>50000</MinScaleDenominator>
- <LineSymbolizer stroke="#bbc" stroke-width="7"/>
- </Rule>
- <Rule>
- <Filter>[aeroway] = 'runway'</Filter>
- <MaxScaleDenominator>50000</MaxScaleDenominator>
- <LineSymbolizer stroke="#bbc" stroke-width="18"/>
- </Rule>
- <Rule>
- <Filter>[aeroway] = 'taxiway'</Filter>
- <MaxScaleDenominator>500000</MaxScaleDenominator>
- <MinScaleDenominator>50000</MinScaleDenominator>
- <LineSymbolizer stroke="#bbc" stroke-width="1"/>
- </Rule>
- <Rule>
- <Filter>[aeroway] = 'taxiway'</Filter>
- <MaxScaleDenominator>50000</MaxScaleDenominator>
- <MinScaleDenominator>20000</MinScaleDenominator>
- <LineSymbolizer stroke="#bbc" stroke-width="4"/>
- </Rule>
- <Rule>
- <Filter>[aeroway] = 'taxiway'</Filter>
- <MaxScaleDenominator>20000</MaxScaleDenominator>
- <LineSymbolizer stroke="#bbc" stroke-width="6"/>
- </Rule>
- </Style>
- <Style name="roads">
- <!-- MOTORWAY-->
- <!-- level 4-5 -->
- <Rule>
- <Filter>[highway] = 'motorway' or [highway] = 'motorway_link'</Filter>
- <MaxScaleDenominator>25000000</MaxScaleDenominator>
- <MinScaleDenominator>5000000</MinScaleDenominator>
- <LineSymbolizer stroke="#809bc0" stroke-width="1"/>
- </Rule>
- <!-- level 6-8 -->
- <Rule>
- <Filter>[highway] = 'motorway' or [highway] = 'motorway_link'</Filter>
- <MaxScaleDenominator>5000000</MaxScaleDenominator>
- <MinScaleDenominator>1000000</MinScaleDenominator>
- <LineSymbolizer stroke="#809bc0" stroke-width="2"/>
- </Rule>
- <!-- level 9 -->
- <Rule>
- <Filter>[highway] = 'motorway' or [highway] = 'motorway_link'</Filter>
- <MaxScaleDenominator>1000000</MaxScaleDenominator>
- <MinScaleDenominator>500000</MinScaleDenominator>
- <LineSymbolizer stroke="#809bc0" stroke-width="3"/>
- </Rule>
- <!-- TRUNK -->
- <!--level 4-6-->
- <Rule>
- <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
- <MaxScaleDenominator>25000000</MaxScaleDenominator>
- <MinScaleDenominator>2500000</MinScaleDenominator>
- <LineSymbolizer stroke="#7fc97f" stroke-width="1"/>
- </Rule>
- <!-- level 7-9 -->
- <Rule>
- <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
- <MaxScaleDenominator>2500000</MaxScaleDenominator>
- <MinScaleDenominator>500000</MinScaleDenominator>
- <LineSymbolizer stroke="#7fc97f" stroke-width="2"/>
- </Rule>
- <!-- level 10-->
- <Rule>
- <Filter>[highway] = 'trunk' or [highway] = 'trunk_link'</Filter>
- <MaxScaleDenominator>500000</MaxScaleDenominator>
- <MinScaleDenominator>100000</MinScaleDenominator>
- <LineSymbolizer stroke="#7fc97f" stroke-width="3"/>
- </Rule>
- <!-- PRIMARY-->
- <!-- level 5-6-->
- <Rule>
- <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
- <MaxScaleDenominator>5000000</MaxScaleDenominator>
- <MinScaleDenominator>2000000</MinScaleDenominator>
- <LineSymbolizer stroke="#e46d71" stroke-width="0.7"/>
- </Rule>
- <!-- level 7-9-->
- <Rule>
- <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
- <MaxScaleDenominator>2000000</MaxScaleDenominator>
- <MinScaleDenominator>500000</MinScaleDenominator>
- <LineSymbolizer stroke="#e46d71" stroke-width="2.0"/>
- </Rule>
- <!-- level 10 -->
- <Rule>
- <Filter>[highway] = 'primary' or [highway] = 'primary_link'</Filter>
- <MaxScaleDenominator>500000</MaxScaleDenominator>
- <MinScaleDenominator>100000</MinScaleDenominator>
- <LineSymbolizer stroke="#e46d71" stroke-width="3"/>
- </Rule>
- <!-- SECONDARY -->
- <!-- level 7-9 -->
- <Rule>
- <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
- <MaxScaleDenominator>2000000</MaxScaleDenominator>
- <MinScaleDenominator>500000</MinScaleDenominator>
- <LineSymbolizer stroke="#fdbf6f" stroke-width="1"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'secondary' or [highway] = 'secondary_link'</Filter>
- <MaxScaleDenominator>500000</MaxScaleDenominator>
- <MinScaleDenominator>100000</MinScaleDenominator>
- <LineSymbolizer stroke="#fdbf6f" stroke-width="2"/>
- </Rule>
- <!-- RAIL -->
- <Rule>
- <MaxScaleDenominator>2500000</MaxScaleDenominator>
- <MinScaleDenominator>1000000</MinScaleDenominator>
- <Filter>[railway] = 'rail' or [railway] = 'tram' or [railway] = 'light_rail'</Filter>
- <LineSymbolizer stroke="#777" stroke-width="1"/>
- </Rule>
- <Rule>
- <MaxScaleDenominator>1000000</MaxScaleDenominator>
- <MinScaleDenominator>100000</MinScaleDenominator>
- <Filter>[railway] = 'rail' or [railway] = 'tram' or [railway] = 'light_rail'</Filter>
- <LineSymbolizer stroke="#777" stroke-width="2"/>
- </Rule>
- <Rule>
- <MaxScaleDenominator>100000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <Filter>[railway] = 'preserved'</Filter>
- <!--
- <LinePatternSymbolizer file="/home/steve/symbols/rail_preserved.png" type="png" width="20" height="3" />
- -->
- </Rule>
- </Style>
- <!-- ROADS TEXT -->
- <Style name="roads-text">
- <!--
- <Rule>
- <Filter>[highway] = 'motorway' and [length] = 2</Filter>
- <MaxScaleDenominator>500000</MaxScaleDenominator>
- <MinScaleDenominator>100</MinScaleDenominator>
- <ShieldSymbolizer name="ref" face_name="DejaVu Sans Bold" size="11" fill="#809bc0" placement="line" file="/home/steve/symbols/motorway_shield.png" type="png" width="24" height="17" min_distance="100"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'motorway' and [length] = 3</Filter>
- <MaxScaleDenominator>500000</MaxScaleDenominator>
- <MinScaleDenominator>100</MinScaleDenominator>
- <ShieldSymbolizer name="ref" face_name="DejaVu Sans Bold" size="11" fill="#809bc0" placement="line" file="/home/steve/symbols/motorway_shield2.png" type="png" width="31" height="17" min_distance="100"/>
- </Rule>
- <Rule>
- <Filter>[highway] = 'motorway' and [length] = 4</Filter>
- <MaxScaleDenominator>500000</MaxScaleDenominator>
- <MinScaleDenominator>100</MinScaleDenominator>
- <ShieldSymbolizer name="ref" face_name="DejaVu Sans Bold" size="11" fill="#809bc0" placement="line" file="/home/steve/symbols/motorway_shield3.png" type="png" width="38" height="17" min_distance="100"/>
- </Rule>
- -->
- <Rule>
- <Filter>[highway] = 'trunk' or [highway] = 'primary' or [highway] = 'secondary'</Filter>
- <MaxScaleDenominator>75000</MaxScaleDenominator>
- <MinScaleDenominator>50000</MinScaleDenominator>
- <TextSymbolizer size="8" fill="black" placement="line" face-name="DejaVu Sans Book" halo-radius="0">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[highway] = 'trunk' or [highway] = 'primary' or [highway] = 'secondary'</Filter>
- <MaxScaleDenominator>50000</MaxScaleDenominator>
- <MinScaleDenominator>1000</MinScaleDenominator>
- <TextSymbolizer size="10" fill="black" placement="line" face-name="DejaVu Sans Book" halo-radius="0">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <ElseFilter/>
- <MaxScaleDenominator>25000</MaxScaleDenominator>
- <MinScaleDenominator>5000</MinScaleDenominator>
- <TextSymbolizer size="9" fill="#000" placement="line" face-name="DejaVu Sans Book" halo-radius="1">[name]</TextSymbolizer>
- </Rule>
- <Rule>
- <ElseFilter/>
- <MaxScaleDenominator>5000</MaxScaleDenominator>
- <MinScaleDenominator>100</MinScaleDenominator>
- <TextSymbolizer size="11" fill="#000" placement="line" face-name="DejaVu Sans Book" halo-radius="1">[name]</TextSymbolizer>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/osm_nodes_ways.xml b/tests/data/good_maps/osm_nodes_ways.xml
deleted file mode 100644
index 814396a..0000000
--- a/tests/data/good_maps/osm_nodes_ways.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE Map>
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="steelblue" minimum-version="0.7.2">
-
- <Style name="red">
- <Rule>
- <LineSymbolizer stroke="darkred" stroke-width="1.5"/>
- <LineSymbolizer stroke="red" stroke-width="1"/>
- <MarkersSymbolizer fill="yellow" width="5" stroke="green" stroke-width=".5"/>
- </Rule>
- </Style>
-
- <Style name="green">
- <Rule>
- <MarkersSymbolizer fill="yellow" width="7" height="5" stroke="green" stroke-width="1.5"/>
- </Rule>
- </Style>
-
- <Layer name="red" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>red</StyleName>
- <Datasource>
- <Parameter name="type">osm</Parameter>
- <Parameter name="file">../osm/ways.osm</Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="green" status="on" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>green</StyleName>
- <Datasource>
- <Parameter name="type">osm</Parameter>
- <Parameter name="file">../osm/nodes.osm</Parameter>
- </Datasource>
- </Layer>
-
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/path_expression.xml b/tests/data/good_maps/path_expression.xml
deleted file mode 100644
index a1c825a..0000000
--- a/tests/data/good_maps/path_expression.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<Map>
- <Style name="test">
- <Rule>
- <Filter>[filename]='dummy.png'</Filter>
- <PointSymbolizer file="../../[path1]/[path2]/[filename]"/>
- </Rule>
- </Style>
-
- <Layer name="layer">
- <StyleName>test</StyleName>
- <Datasource>
- <Parameter name="inline">
- x,y,path1,path2,filename
- 0,0,data,images,dummy.png
- 1,1,data,images,dummy.png
- </Parameter>
- <Parameter name="type">csv</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/point_csv.xml b/tests/data/good_maps/point_csv.xml
deleted file mode 100644
index 7949a7b..0000000
--- a/tests/data/good_maps/point_csv.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
- <Style name="1">
- <Rule>
- <Filter>([x]=0)</Filter>
- <TextSymbolizer size="10" dy="-10" face-name="DejaVu Sans Book" halo-radius="1" allow-overlap="true">[label]</TextSymbolizer>
- <PointSymbolizer/>
- </Rule>
- <Rule>
- <Filter>([y]=0)</Filter>
- <TextSymbolizer size="10" dy="5" face-name="DejaVu Sans Book" halo-radius="1">[label]</TextSymbolizer>
- <PointSymbolizer/>
- </Rule>
- <Rule>
- <ElseFilter/>
- <TextSymbolizer size="10" dy="-5" face-name="DejaVu Sans Book" halo-radius="1">[label]</TextSymbolizer>
- <PointSymbolizer/>
- </Rule>
-
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="file">../vrt/points.vrt</Parameter>
- <Parameter name="layer_by_index">0</Parameter>
- <Parameter name="type">ogr</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/point_json.xml b/tests/data/good_maps/point_json.xml
deleted file mode 100644
index aa2efd1..0000000
--- a/tests/data/good_maps/point_json.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
- <Style name="1">
- <Rule>
- <Filter>([x]=0)</Filter>
- <TextSymbolizer size="10" dy="-10" face-name="DejaVu Sans Book" halo-radius="1" allow-overlap="true">[label]</TextSymbolizer>
- <PointSymbolizer/>
- </Rule>
- <Rule>
- <Filter>([y]=0)</Filter>
- <TextSymbolizer size="10" dy="5" face-name="DejaVu Sans Book" halo-radius="1">[label]</TextSymbolizer>
- <PointSymbolizer/>
- </Rule>
- <Rule>
- <ElseFilter/>
- <TextSymbolizer size="10" dy="-5" face-name="DejaVu Sans Book" halo-radius="1">[label]</TextSymbolizer>
- <PointSymbolizer/>
- </Rule>
-
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="file">../json/points.geojson</Parameter>
- <Parameter name="layer_by_index">0</Parameter>
- <Parameter name="type">ogr</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/point_json_inline.xml b/tests/data/good_maps/point_json_inline.xml
deleted file mode 100644
index add0547..0000000
--- a/tests/data/good_maps/point_json_inline.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
- <Style name="1">
- <Rule>
- <Filter>([x]=0)</Filter>
- <TextSymbolizer size="10" dy="-10" face-name="DejaVu Sans Book" halo-radius="1" allow-overlap="true">[label]</TextSymbolizer>
- <PointSymbolizer/>
- </Rule>
- <Rule>
- <Filter>([y]=0)</Filter>
- <TextSymbolizer size="10" dy="5" face-name="DejaVu Sans Book" halo-radius="1">[label]</TextSymbolizer>
- <PointSymbolizer/>
- </Rule>
- <Rule>
- <ElseFilter/>
- <TextSymbolizer size="10" dy="-5" face-name="DejaVu Sans Book" halo-radius="1">[label]</TextSymbolizer>
- <PointSymbolizer/>
- </Rule>
-
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="string">
-
- {
-
- "type": "FeatureCollection",
-
- /* comment */
-
- "features": [
-
- { "type": "Feature",
-
- "properties": { "x": 0, "y": 0, "label": "0,0" },
- "geometry" : { "type": "Point", "coordinates": [ 0, 0 ] }
- },
- { "type": "Feature",
-
- "properties": { "x": 5, "y": 5, "label": "5,5" },
- "geometry" : { "type": "Point", "coordinates": [ 5, 5 ] }
- },
- { "type": "Feature",
-
- "properties": { "x": 0, "y": 0, "label": "0,5" },
- "geometry" : { "type": "Point", "coordinates": [ 0, 5 ] }
- },
- { "type": "Feature",
-
- "properties": { "x": 5, "y": 0, "label": "5,0" },
- "geometry" : { "type": "Point", "coordinates": [ 5, 0 ] }
- },
- { "type": "Feature",
-
- "properties": { "x": 2.5, "y": 2.5, "label": "2.5,2.5" },
- "geometry" : { "type": "Point", "coordinates": [ 2.5, 2.5 ] }
- },
-
- ]
- }
-
- </Parameter>
- <Parameter name="driver">GeoJson</Parameter>
- <Parameter name="layer_by_index">0</Parameter>
- <Parameter name="type">ogr</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/point_symbolizer.xml b/tests/data/good_maps/point_symbolizer.xml
deleted file mode 100644
index 438c391..0000000
--- a/tests/data/good_maps/point_symbolizer.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
- <Style name="1">
- <Rule>
- <Filter>([name]='CHILE')</Filter>
- <TextSymbolizer size="10" dy="5" face-name="DejaVu Sans Book" text-transform="lowercase" wrap-width="10" halo-radius="1">[name] + ' (default OGC pixel)'</TextSymbolizer>
- <PointSymbolizer/>
- </Rule>
- <Rule>
- <Filter>([name]='Australia')</Filter>
- <TextSymbolizer size="10" dy="20" face-name="DejaVu Sans Book" halo-radius="1">[name] + ' (png)'</TextSymbolizer>
- <PointSymbolizer file="../images/dummy.png" allow-overlap="true"/>
- </Rule>
- <Rule>
- <Filter>([name]='Brazil')</Filter>
- <TextSymbolizer size="10" dy="20" face-name="DejaVu Sans Book" halo-radius="1">[name] + ' (svg & tif)'</TextSymbolizer>
- <PointSymbolizer file="../images/dummy.tif" allow-overlap="true"/>
- <PointSymbolizer file="../svg/ellipses.svg" allow-overlap="true"/>
- </Rule>
- <Rule>
- <Filter>([name]='Mongolia')</Filter>
- <TextSymbolizer size="10" dy="20" face-name="DejaVu Sans Book" halo-radius="1">[name] + ' (tiff)'</TextSymbolizer>
- <PointSymbolizer file="../images/dummy.tiff" allow-overlap="true"/>
- </Rule>
- <Rule>
- <Filter>([name]='Sudan')</Filter>
- <TextSymbolizer size="10" dy="20" face-name="DejaVu Sans Book" halo-radius="1">[name] + ' (jpeg)'</TextSymbolizer>
- <PointSymbolizer file="../images/dummy.jpeg"/>
- </Rule>
- <Rule>
- <Filter>([name]='United States')</Filter>
- <TextSymbolizer size="10" dy="20" face-name="DejaVu Sans Book" halo-radius="1">[name] + ' (jpg)'</TextSymbolizer>
- <PointSymbolizer file="../images/dummy.jpg"/>
- </Rule>
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
- <Parameter name="table">point</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/point_symbolizer_ignore_placements.xml b/tests/data/good_maps/point_symbolizer_ignore_placements.xml
deleted file mode 100644
index b56ebfe..0000000
--- a/tests/data/good_maps/point_symbolizer_ignore_placements.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
- <Style name="1">
- <Rule>
- <Filter>([name]='Brazil' or [name]='Mongolia' or [name]='Sudan')</Filter>
- <PointSymbolizer file="../svg/point_sm.svg" allow-overlap="true"/>
- </Rule>
- <Rule>
- <ElseFilter/>
- <PointSymbolizer file="../svg/point_sm.svg" ignore-placement="true"/>
- <PointSymbolizer/>
- <TextSymbolizer size="10" dy="10" face-name="DejaVu Sans Book" halo-radius="1" wrap-width="15" allow-overlap="true">'should be a black square on top of this symbol'</TextSymbolizer>
-
- </Rule>
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
- <Parameter name="table">point</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/point_symbolizer_on_polygon_map.xml b/tests/data/good_maps/point_symbolizer_on_polygon_map.xml
deleted file mode 100644
index 901418d..0000000
--- a/tests/data/good_maps/point_symbolizer_on_polygon_map.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" minimum-version="0.7.2">
- <Style name="test">
- <Rule name="asia">
- <Filter>([REGION]=142)</Filter>
- <PointSymbolizer file="../images/dummy.png" allow-overlap="true"/>
- </Rule>
- <Rule name="europe">
- <Filter>([REGION]=150)</Filter>
- <!-- requires at least Mapnik 0.7.1 to work due to https://github.com/mapnik/mapnik/issues/508 -->
- <PolygonPatternSymbolizer file="../images/dummy.png"/>
- </Rule>
- <Rule name="americas">
- <Filter>([REGION]=19)</Filter>
- <!-- requires at least Mapnik 0.7.1 to work due to https://github.com/mapnik/mapnik/issues/508 -->
- <LinePatternSymbolizer file="../images/dummy.png"/>
- </Rule>
- <Rule name="Africa">
- <Filter>([REGION]=2)</Filter>
- <ShieldSymbolizer placement="vertex" size="10" fill="#000000" file="../images/dummy.png" face-name="DejaVu Sans Bold">[NAME]</ShieldSymbolizer>
- </Rule>
-
- <Rule name="rest">
- <ElseFilter/>
- <LineSymbolizer stroke-width="1"/>
- </Rule>
- </Style>
-
- <Layer name="world_merc">
- <StyleName>test</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/world_merc</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/polygon_pattern_seamless.xml b/tests/data/good_maps/polygon_pattern_seamless.xml
deleted file mode 100644
index f026f2e..0000000
--- a/tests/data/good_maps/polygon_pattern_seamless.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="steelblue" minimum-version="0.7.2">
- <Style name="style">
-
- <!-- Asia - default dark color behind light polygon
- leads to "ghost lines" show-through
- -->
-
- <Rule>
- <PolygonPatternSymbolizer alignment="global" file="../images/stripes_pattern.png"/>
- </Rule>
- </Style>
- <Layer name="world" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/world_merc</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/polygon_pattern_symbolizer.xml b/tests/data/good_maps/polygon_pattern_symbolizer.xml
deleted file mode 100644
index d755c92..0000000
--- a/tests/data/good_maps/polygon_pattern_symbolizer.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<Map srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs" minimum-version="0.7.2">
-
- <FileSource name="foo">../images/</FileSource>
-
- <Style name="1">
- <Rule>
- <Filter>([EAS_ID]<=170) and ([EAS_ID] <> 165)</Filter>
- <!-- alignment="local" is default -->
- <PolygonPatternSymbolizer alignment="local" file="../images/checker.jpg"/>
- <LineSymbolizer stroke="green" stroke-width="2"/>
- <TextSymbolizer size="10" dy="20" face-name="DejaVu Sans Book" halo-radius="1">'local'</TextSymbolizer>
- </Rule>
- <Rule>
- <ElseFilter/>
- <PolygonPatternSymbolizer alignment="global" file="../images/checker.jpg"/>
- <LineSymbolizer stroke="yellow" stroke-width=".5"/>
- <TextSymbolizer size="10" dy="20" face-name="DejaVu Sans Book" halo-radius="1">'global'</TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="lay" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="type">shape</Parameter>
- <Parameter name="base">../../data/shp/</Parameter>
- <Parameter name="file">poly.shp</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/polygon_symbolizer.xml b/tests/data/good_maps/polygon_symbolizer.xml
deleted file mode 100644
index 4fcf9fc..0000000
--- a/tests/data/good_maps/polygon_symbolizer.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<Map background-color="transparent" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs" minimum-version="0.7.2">
-
- <FileSource name="foo">../images/</FileSource>
-
- <Style name="test">
- <Rule>
- <PolygonSymbolizer fill="lavender" fill-opacity=".5"/>
- <PointSymbolizer base="foo" file="dummy.png"/>
- </Rule>
- </Style>
-
- <Layer name="lay" srs="+proj=longlat +ellps=airy +datum=OSGB36 +no_defs">
- <StyleName>test</StyleName>
- <Datasource>
- <Parameter name="type">shape</Parameter>
- <Parameter name="base">../../data/shp/</Parameter>
- <Parameter name="file">poly.shp</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/rtl_text_map.xml b/tests/data/good_maps/rtl_text_map.xml
deleted file mode 100644
index 22da9eb..0000000
--- a/tests/data/good_maps/rtl_text_map.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<Map background-color="#eee" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2" font-directory="../fonts/XB Zar.ttf">
-
-<!-- nik2img.py -b 60 46 80 28 rtl_text_map.xml text_styles.png -->
-
- <Style name="custom_font">
- <Rule>
- <TextSymbolizer fill="#000" size="20" dy="-2" face-name="XB Zar Regular" halo-fill="#fff" halo-radius="2" wrap-width="50" line-spacing="3" allow-overlap="true">[NAME_FA]</TextSymbolizer>
- <TextSymbolizer fill="#000" opacity="0.6" size="10" dy="2" face-name="DejaVu Sans Book" text-transform="uppercase" halo-fill="#fff" halo-radius="2" character-spacing="3" wrap-width="50" line-spacing="4" allow-overlap="true">[NAME_EN]</TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>custom_font</StyleName>
- <Datasource>
- <Parameter name="file">../shp/farsi-labels</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/shield_symbolizer.xml b/tests/data/good_maps/shield_symbolizer.xml
deleted file mode 100644
index 716875c..0000000
--- a/tests/data/good_maps/shield_symbolizer.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
- <Style name="1">
- <Rule>
- <ShieldSymbolizer file="../images/dummy.png" size="10" transform="scale(5) translate(15, 15) rotate(20) skewX(20) skewY(5)" dy="-5" dx="-5" opacity=".5" text-opacity=".3" face-name="DejaVu Sans Book" halo-radius="1" shield-dx="10" shield-dy="10" allow-overlap="true" avoid-edges="false">[label]</ShieldSymbolizer>
- </Rule>
- <Rule>
- <PointSymbolizer allow-overlap="true"/>
- </Rule>
- </Style>
- <Style name="2">
- <Rule>
- <LineSymbolizer/>
- </Rule>
- <Rule>
- <ShieldSymbolizer file="../svg/ellipses.svg" size="10" opacity=".5" text-opacity=".3" spacing="50" placement="line" allow-overlap="true" face-name="DejaVu Sans Book" line-spacing="10">[label]</ShieldSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="line" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>2</StyleName>
- <Datasource>
- <Parameter name="file">../json/lines.geojson</Parameter>
- <Parameter name="layer_by_index">0</Parameter>
- <Parameter name="type">ogr</Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="file">../json/points.geojson</Parameter>
- <Parameter name="layer_by_index">0</Parameter>
- <Parameter name="type">ogr</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/data/good_maps/sqlite.xml b/tests/data/good_maps/sqlite.xml
deleted file mode 100644
index 0145069..0000000
--- a/tests/data/good_maps/sqlite.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="rgb(255,255,255)" minimum-version="0.7.2">
-
- <Style name="world_borders_style1">
- <Rule>
- <!-- glow underneath continents -->
- <LineSymbolizer stroke="green" stroke-width="1.5"/>
- </Rule>
- </Style>
-
- <Style name="world_borders_style2">
- <Rule>
- <PolygonSymbolizer fill="yellow" gamma="0.5"/>
- </Rule>
- </Style>
-
- <!-- layer created by ogr like: ogr2ogr -t_srs EPSG:4326 -f SQLite ../sqlite/world.sqlite world_merc.shp -->
- <Layer name="world_borders2" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>world_borders_style1</StyleName>
- <StyleName>world_borders_style2</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../sqlite/world.sqlite</Parameter>
- <Parameter name="table">world_merc</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="point_style">
- <Rule>
- <PointSymbolizer file="../svg/point_sm.svg"/>
- <TextSymbolizer size="12" dy="-5" face-name="DejaVu Sans Book" halo-fill="rgba(255,255,255,.5)" halo-radius=".5">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
- <!-- file created by QGIS read with native sqlite plugin -->
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>point_style</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
- <Parameter name="table">point</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/sqlite_attachdb.xml b/tests/data/good_maps/sqlite_attachdb.xml
deleted file mode 100644
index 0fbb744..0000000
--- a/tests/data/good_maps/sqlite_attachdb.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" minimum-version="0.7.2">
-
-<Style name="world">
- <Rule>
- <PolygonSymbolizer fill="green"/>
- </Rule>
-</Style>
-
-<Layer name="world" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>world</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../sqlite/world.sqlite</Parameter>
- <!-- should work with or without leveraging and index -->
- <Parameter name="use_spatial_index">true</Parameter>
-
- <!-- key_field is required if a subquery AND spatial index
- is used. see: https://github.com/mapnik/mapnik/issues/821
- -->
- <Parameter name="key_field">OGC_FID</Parameter>
- <!--
- <Parameter name="table">(SELECT * FROM world_merc)</Parameter>
- -->
- <Parameter name="table">(SELECT *,world_merc.rowid FROM world_merc INNER JOIN business ON business.ISO3 = world_merc.iso3) as s</Parameter>
-
- <!--
- sqlite3 world.sqlite
- ATTACH DATABASE 'business.sqlite' AS business;
- SELECT count(*) FROM "10m_admin_0_countries" INNER JOIN business ON business.ISO3 = iso_a3;
- -->
- <Parameter name="attachdb">business at business.sqlite</Parameter>
-
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/data/good_maps/style_level_comp_op.xml b/tests/data/good_maps/style_level_comp_op.xml
deleted file mode 100644
index fa4a0fe..0000000
--- a/tests/data/good_maps/style_level_comp_op.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
- background-color="lightsteelblue">
-
- <Style name="land">
- <Rule>
- <PolygonSymbolizer fill="darkslategrey" geometry-transform="translate(+1,+1)" />
- <PolygonSymbolizer fill="lightcyan" geometry-transform="translate(-1,-1)" />
- <PolygonSymbolizer fill="forestgreen" />
- </Rule>
- </Style>
-
- <Style name="markers" comp-op="src-over">
- <Rule>
- <MarkersSymbolizer fill="saddlebrown"
- fill-opacity="0.5"
- stroke-width="0"
- width="45 - 5 * [SCALERANK]"
- height="45 - 5 * [SCALERANK]"
- allow-overlap="true"
- ignore-placement="true"
- />
- <MarkersSymbolizer fill="white"
- fill-opacity="0.7"
- stroke-width="0"
- width="5"
- height="5"
- allow-overlap="true"
- ignore-placement="true"
- />
- </Rule>
- </Style>
-
- <Layer name="land">
- <StyleName>land</StyleName>
- <Datasource>
- <Parameter name="type">shape</Parameter>
- <Parameter name="file">../shp/new_zealand/ne_50m_land.shp</Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="cities">
- <StyleName>markers</StyleName>
- <Datasource>
- <Parameter name="type">shape</Parameter>
- <Parameter name="file">../shp/new_zealand/ne_50m_populated_places_simple.shp</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/data/good_maps/style_level_image_filter.xml b/tests/data/good_maps/style_level_image_filter.xml
deleted file mode 100644
index 32d5887..0000000
--- a/tests/data/good_maps/style_level_image_filter.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
- background-color="lightsteelblue">
-
- <Style name="land">
- <Rule>
- <PolygonSymbolizer fill="darkslategrey" geometry-transform="translate(+1,+1)" />
- <PolygonSymbolizer fill="lightcyan" geometry-transform="translate(-1,-1)" />
- <PolygonSymbolizer fill="forestgreen" />
- </Rule>
- </Style>
-
- <Style name="markers" comp-op="hard-light">
- <Rule>
- <MarkersSymbolizer fill="saddlebrown"
- fill-opacity="0.5"
- stroke-width="0"
- width="45 - 5 * [SCALERANK]"
- height="45 - 5 * [SCALERANK]"
- allow-overlap="true"
- ignore-placement="true"
- />
- <MarkersSymbolizer fill="white"
- fill-opacity="0.7"
- stroke-width="0"
- width="5"
- height="5"
- allow-overlap="true"
- ignore-placement="true"
- />
- </Rule>
- </Style>
-
- <Style name="labels" comp-op="overlay">
- <Rule>
- <TextSymbolizer face-name="DejaVu Sans Book"
- size="12"
- fill="black"
- halo-fill="white"
- halo-radius="2"
- dx="7"
- dy="1"
- avoid-edges="true"
- vertical-alignment="middle"
- placement-type="simple"
- placements="NE,NW"
- allow-overlap="false"
- >[NAME]</TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="land">
- <StyleName>land</StyleName>
- <Datasource>
- <Parameter name="type">shape</Parameter>
- <Parameter name="file">../shp/new_zealand/ne_50m_land.shp</Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="cities">
- <StyleName>markers</StyleName>
- <StyleName>labels</StyleName>
- <Datasource>
- <Parameter name="type">shape</Parameter>
- <Parameter name="file">../shp/new_zealand/ne_50m_populated_places_simple.shp</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/data/good_maps/style_level_opacity_and_blur.xml b/tests/data/good_maps/style_level_opacity_and_blur.xml
deleted file mode 100644
index e369db5..0000000
--- a/tests/data/good_maps/style_level_opacity_and_blur.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<Map background-color="#fcc" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <!-- Asia -->
- <Style name="style" image-filters="agg-stack-blur(4,4)">
- <Rule>
- <Filter>([REGION]=142)</Filter>
- <PolygonSymbolizer fill="yellow"/>
- </Rule>
- </Style>
- <!-- Not Asia -->
- <Style name="style2" opacity=".5">
- <Rule>
- <Filter>([REGION]!=142)</Filter>
- <PolygonSymbolizer fill="#fff"/>
- </Rule>
- </Style>
- <Layer name="world" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <StyleName>style2</StyleName>
- <Datasource>
- <Parameter name="file">../shp/world_merc</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/text-placement-type-dummy.xml b/tests/data/good_maps/text-placement-type-dummy.xml
deleted file mode 100644
index 9b43799..0000000
--- a/tests/data/good_maps/text-placement-type-dummy.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <Style name="My Style">
- <Rule>
- <!-- https://github.com/mapnik/mapnik/issues/2502 -->
- <TextSymbolizer face-name="DejaVu Sans Book" placement-type="dummy">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/data/good_maps/text_breaks.xml b/tests/data/good_maps/text_breaks.xml
deleted file mode 100644
index 5252358..0000000
--- a/tests/data/good_maps/text_breaks.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
- <Style name="1">
- <Rule>
- <Filter>([label]='center')</Filter>
- <TextSymbolizer size="10" dy="-5" face-name="DejaVu Sans Book" wrap-width="1" halo-radius="1">'one
-two
-three'</TextSymbolizer>
- <PointSymbolizer/>
- </Rule>
- <Rule>
- <ElseFilter/>
- <TextSymbolizer size="10" dy="-5" face-name="DejaVu Sans Book" wrap-width="1" halo-radius="1">[label]</TextSymbolizer>
- <PointSymbolizer/>
- </Rule>
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="string">
-
- {
-
- "type": "FeatureCollection",
-
- /* comment */
-
- "features": [
-
- { "type": "Feature",
-
- "properties": { "x": 0, "y": 0, "label": "0\n0" },
- "geometry" : { "type": "Point", "coordinates": [ 0, 0 ] }
- },
- { "type": "Feature",
-
- "properties": { "x": 5, "y": 5, "label": "5\n5" },
- "geometry" : { "type": "Point", "coordinates": [ 5, 5 ] }
- },
- { "type": "Feature",
-
- "properties": { "x": 0, "y": 0, "label": "0,5" },
- "geometry" : { "type": "Point", "coordinates": [ 0, 5 ] }
- },
- { "type": "Feature",
-
- "properties": { "x": 5, "y": 0, "label": "5,0" },
- "geometry" : { "type": "Point", "coordinates": [ 5, 0 ] }
- },
- { "type": "Feature",
-
- "properties": { "x": 2.5, "y": 2.5, "label": "center" },
- "geometry" : { "type": "Point", "coordinates": [ 2.5, 2.5 ] }
- },
-
- ]
- }
-
- </Parameter>
- <Parameter name="layer_by_index">0</Parameter>
- <Parameter name="type">ogr</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/text_halo_and_collision.xml b/tests/data/good_maps/text_halo_and_collision.xml
deleted file mode 100644
index 63daf2f..0000000
--- a/tests/data/good_maps/text_halo_and_collision.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="steelblue">
-<!-- test case for https://github.com/mapnik/mapnik/issues/1354 -->
-
- <Style name="labels">
- <Rule>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="22"
- halo-radius="10"
- placement="point"
- allow-overlap="false">
- 'this text halos should not overlap vertically'
- </TextSymbolizer>
- </Rule>
- </Style>
-
-
- <Layer name="points" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>labels</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-2,2
-2,2.3
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/text_rotation.xml b/tests/data/good_maps/text_rotation.xml
deleted file mode 100644
index 9d0090b..0000000
--- a/tests/data/good_maps/text_rotation.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="steelblue" minimum-version="0.7.2">
-
- <Style name="labels">
- <Rule>
- <Filter>([name]='CHILE')</Filter>
- <TextSymbolizer size="15" orientation="45" face-name="DejaVu Sans Book" halo-radius="1">'45˚ angle'</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([name]='Australia')</Filter>
- <TextSymbolizer size="15" orientation="-45" face-name="DejaVu Sans Book" halo-radius="1">'- 45˚ angle'</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([name]='Brazil')</Filter>
- <TextSymbolizer size="15" orientation="90" face-name="DejaVu Sans Book" halo-radius="1">'90˚ angle'</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([name]='Mongolia')</Filter>
- <TextSymbolizer size="15" orientation="-90" face-name="DejaVu Sans Book" halo-radius="1">'- 90˚ angle'</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([name]='South Sudan')</Filter>
- <TextSymbolizer size="15" orientation="180" face-name="DejaVu Sans Book" halo-radius="1">'180˚ angle'</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([name]='United States')</Filter>
- <TextSymbolizer size="15" face-name="DejaVu Sans Book" halo-radius="1">'no rotation of text'</TextSymbolizer>
- </Rule>
- <Rule>
- <ElseFilter/>
- <TextSymbolizer size="15" face-name="DejaVu Sans Book" halo-radius="1">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>labels</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../sqlite/qgis_spatiallite.sqlite</Parameter>
- <Parameter name="geometry_field">geometry</Parameter>
- <Parameter name="table">point</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/unique_filter_map.xml b/tests/data/good_maps/unique_filter_map.xml
deleted file mode 100644
index 796d90c..0000000
--- a/tests/data/good_maps/unique_filter_map.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<Map srs="+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs" background-color="rgba(0,0,0,0)" minimum-version="0.7.2">
- <Style name="poly20090929162130952_style">
- <Rule>
- <Filter>([EAS_ID]!=158)</Filter>
- <PolygonSymbolizer fill="blue"/>
- <LineSymbolizer stroke="blue" stroke-width="4"/>
- </Rule>
- <Rule>
- <Filter>([EAS_ID]<>158)</Filter>
- <PolygonSymbolizer fill="green"/>
- <LineSymbolizer stroke="green" stroke-width="2"/>
- </Rule>
- <Rule>
- <ElseFilter/>
- <PolygonSymbolizer fill="red"/>
- </Rule>
- </Style>
- <Layer name="poly20090929162130952" srs="+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs">
- <StyleName>poly20090929162130952_style</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/poly.shp</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/data/good_maps/wgs842merc_reprojection.xml b/tests/data/good_maps/wgs842merc_reprojection.xml
deleted file mode 100644
index 50075d9..0000000
--- a/tests/data/good_maps/wgs842merc_reprojection.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="lightsteelblue">
- <Style name="My Style">
- <Rule>
- <PolygonSymbolizer fill="#f2eff9"/><LineSymbolizer stroke="rgb(50%,50%,50%)" stroke-width="0.1"/></Rule>
- </Style>
-
- <Layer name="world" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">shape</Parameter>
- <!-- from http://www.naturalearthdata.com/downloads/110m-cultural-vectors -->
- <Parameter name="file">../shp/ne_110m_admin_0_countries.shp</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/whitespace_at_end_of_filter_expression.xml b/tests/data/good_maps/whitespace_at_end_of_filter_expression.xml
deleted file mode 100644
index 114e612..0000000
--- a/tests/data/good_maps/whitespace_at_end_of_filter_expression.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84 +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2">
- <Style name="text">
- <Rule>
- <Filter>[leisure] <> '' or [landuse] <> '' </Filter>
- <MaxScaleDenominator>20000</MaxScaleDenominator>
- <TextSymbolizer size="10" fill="#000" face-name="DejaVu Sans Book" halo-radius="2" wrap-width="10">[name]</TextSymbolizer>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/xinclude/layers.xml b/tests/data/good_maps/xinclude/layers.xml
deleted file mode 100644
index 83234f0..0000000
--- a/tests/data/good_maps/xinclude/layers.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Include xmlns:xi="http://www.w3.org/2001/XInclude">
-
- <Layer name="world_borders" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>world_borders_style</StyleName>
- <StyleName>point_style</StyleName>
- <Datasource>
- <Parameter name="file">../../shp/world_merc.shp</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-
-</Include>
\ No newline at end of file
diff --git a/tests/data/good_maps/xinclude/layers_with_entities.xml b/tests/data/good_maps/xinclude/layers_with_entities.xml
deleted file mode 100644
index 78f91c9..0000000
--- a/tests/data/good_maps/xinclude/layers_with_entities.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Include SYSTEM "zoom_scales.xml">
-
-<Include xmlns:xi="http://www.w3.org/2001/XInclude">
-
- <Layer name="world_borders" minzoom="&zoom02min;" maxzoom="&zoom00max;" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>world_borders_style</StyleName>
- <StyleName>point_style</StyleName>
- <Datasource>
- <Parameter name="file">../../shp/world_merc.shp</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-
-</Include>
\ No newline at end of file
diff --git a/tests/data/good_maps/xinclude/map.xml b/tests/data/good_maps/xinclude/map.xml
deleted file mode 100644
index add6415..0000000
--- a/tests/data/good_maps/xinclude/map.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map >
-<Map xmlns:xi="http://www.w3.org/2001/XInclude" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="rgb(255,255,255)" >
-
-<!-- http://www.oreillynet.com/xml/blog/2004/05/transclude_with_xinclude_and_x.html -->
-
-<xi:include href="styles.xml" />
-
-<xi:include href="layers.xml" />
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/xinclude/map_with_entities_and_includes.xml b/tests/data/good_maps/xinclude/map_with_entities_and_includes.xml
deleted file mode 100644
index a2d5166..0000000
--- a/tests/data/good_maps/xinclude/map_with_entities_and_includes.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map >
-<Map xmlns:xi="http://www.w3.org/2001/XInclude" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="rgb(255,255,255)" >
-
-<!-- http://www.oreillynet.com/xml/blog/2004/05/transclude_with_xinclude_and_x.html -->
-
-<xi:include href="styles.xml" />
-
-<xi:include href="layers_with_entities.xml" />
-
-</Map>
\ No newline at end of file
diff --git a/tests/data/good_maps/xinclude/styles.xml b/tests/data/good_maps/xinclude/styles.xml
deleted file mode 100644
index b970ff6..0000000
--- a/tests/data/good_maps/xinclude/styles.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Include>
-
- <Style name="point_style">
- <Rule>
- <PointSymbolizer file="../../svg/point.svg"/>
- <TextSymbolizer face_name="DejaVu Sans Book" size="12" name="[name]" halo_fill="rgb(255,255,255,100)" halo_radius="1" dy="-5"/>
- </Rule>
- </Style>
-
- <Style name="world_borders_style">
- <Rule>
- <PolygonSymbolizer fill="grey" gamma="0.7"/>
- </Rule>
- </Style>
-
-</Include>
-
diff --git a/tests/data/good_maps/xinclude/zoom_scales.xml b/tests/data/good_maps/xinclude/zoom_scales.xml
deleted file mode 100644
index 8b0d439..0000000
--- a/tests/data/good_maps/xinclude/zoom_scales.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!ENTITY zoom00max "750000000" >
-<!ENTITY zoom00min "540000000" >
-
-<!ENTITY zoom01max "500000000" >
-<!ENTITY zoom01min "270000000" >
-
-<!ENTITY zoom02max "250000000" >
-<!ENTITY zoom02min "130000000" >
-
-<!ENTITY zoom03max "100000000" >
-<!ENTITY zoom03min "60000000" >
-
-<!ENTITY zoom04max "50000000" >
-<!ENTITY zoom04min "30000000" >
-
-<!ENTITY zoom05max "25000000" >
-<!ENTITY zoom05min "15000000" >
-
-<!ENTITY zoom06max "10000000" >
-<!ENTITY zoom06min "8000000" >
-
-<!ENTITY zoom07max "5000000" >
-<!ENTITY zoom07min "4000000" >
-
-<!ENTITY zoom08max "2500000" >
-<!ENTITY zoom08min "2000000" >
-
-<!ENTITY zoom09max "1500000" >
-<!ENTITY zoom09min "1000000" >
-
-<!ENTITY zoom10max "750000" >
-<!ENTITY zoom10min "540000" >
-
-<!ENTITY zoom11max "500000" >
-<!ENTITY zoom11min "270000" >
-
-<!ENTITY zoom12max "250000" >
-<!ENTITY zoom12min "130000" >
-
-<!ENTITY zoom13max "100000" >
-<!ENTITY zoom13min "60000" >
-
-<!ENTITY zoom14max "50000" >
-<!ENTITY zoom14min "30000" >
-
-<!ENTITY zoom15max "25000" >
-<!ENTITY zoom15min "15000" >
-
-<!ENTITY zoom16max "10000" >
-<!ENTITY zoom16min "8000" >
-
-<!ENTITY zoom17max "5000" >
-<!ENTITY zoom17min "4000" >
-
-<!ENTITY zoom18max "2500" >
-<!ENTITY zoom18min "2000" >
-
-<!ENTITY zoom19max "1500" >
-<!ENTITY zoom19min "1000" >
-
-<!ENTITY zoom20max "750" >
-<!ENTITY zoom20min "520" >
-
-<!ENTITY zoom21max "500" >
-<!ENTITY zoom21min "260" >
diff --git a/tests/data/gpx/empty.gpx b/tests/data/gpx/empty.gpx
deleted file mode 100644
index dd03718..0000000
--- a/tests/data/gpx/empty.gpx
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" standalone="yes"?>
-<gpx version="1.0">
-<name>Empty GPX</name>
-<desc></desc>
-<wpt lat="48" lon="-122">
- <ele>0</ele>
- <time>2001-11-28T21:06:52Z</time>
-</wpt>
-</gpx>
\ No newline at end of file
diff --git a/tests/data/images/12_654_1580.png b/tests/data/images/12_654_1580.png
deleted file mode 100644
index 0f15a35..0000000
Binary files a/tests/data/images/12_654_1580.png and /dev/null differ
diff --git a/tests/data/images/13_4194_2747.png b/tests/data/images/13_4194_2747.png
deleted file mode 100644
index 8813920..0000000
Binary files a/tests/data/images/13_4194_2747.png and /dev/null differ
diff --git a/tests/data/images/checker.jpg b/tests/data/images/checker.jpg
deleted file mode 100644
index 6d5549e..0000000
Binary files a/tests/data/images/checker.jpg and /dev/null differ
diff --git a/tests/data/images/crosshair16x16.png b/tests/data/images/crosshair16x16.png
deleted file mode 100644
index efbac0e..0000000
Binary files a/tests/data/images/crosshair16x16.png and /dev/null differ
diff --git a/tests/data/images/dummy.jpeg b/tests/data/images/dummy.jpeg
deleted file mode 100644
index 81e1a80..0000000
Binary files a/tests/data/images/dummy.jpeg and /dev/null differ
diff --git a/tests/data/images/dummy.jpg b/tests/data/images/dummy.jpg
deleted file mode 100644
index 81e1a80..0000000
Binary files a/tests/data/images/dummy.jpg and /dev/null differ
diff --git a/tests/data/images/dummy.png b/tests/data/images/dummy.png
deleted file mode 100644
index 8b8c5fd..0000000
Binary files a/tests/data/images/dummy.png and /dev/null differ
diff --git a/tests/data/images/dummy.tif b/tests/data/images/dummy.tif
deleted file mode 100644
index 7c20279..0000000
Binary files a/tests/data/images/dummy.tif and /dev/null differ
diff --git a/tests/data/images/dummy.tiff b/tests/data/images/dummy.tiff
deleted file mode 100644
index 7c20279..0000000
Binary files a/tests/data/images/dummy.tiff and /dev/null differ
diff --git a/tests/data/images/marker.png b/tests/data/images/marker.png
deleted file mode 100644
index 3e3ea29..0000000
Binary files a/tests/data/images/marker.png and /dev/null differ
diff --git a/tests/data/images/stripes_pattern.png b/tests/data/images/stripes_pattern.png
deleted file mode 100644
index 08b5098..0000000
Binary files a/tests/data/images/stripes_pattern.png and /dev/null differ
diff --git a/tests/data/images/xcode-CgBI.png b/tests/data/images/xcode-CgBI.png
deleted file mode 100644
index 243d918..0000000
Binary files a/tests/data/images/xcode-CgBI.png and /dev/null differ
diff --git a/tests/data/images/yellow_half_trans.png b/tests/data/images/yellow_half_trans.png
deleted file mode 100644
index 48d7ae3..0000000
Binary files a/tests/data/images/yellow_half_trans.png and /dev/null differ
diff --git a/tests/data/json/escaped.geojson b/tests/data/json/escaped.geojson
deleted file mode 100644
index bb7ce91..0000000
--- a/tests/data/json/escaped.geojson
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "type":"FeatureCollection",
- "features":
- [
- {
- "type":"Feature",
- "geometry":
- {
- "type":"Point",
- "coordinates":
- [
- -81.705583,
- 41.480573
- ]
- },
- "properties":
- {
- "name":"Test",
- "int":1,
- "description":"Test: \u005C",
- "spaces":"this has spaces",
- "double":1.1,
- "boolean":true,
- "NOM_FR":"Québec"
- }
- }
- ]
-}
\ No newline at end of file
diff --git a/tests/data/json/escaped.topojson b/tests/data/json/escaped.topojson
deleted file mode 100644
index ef9ea07..0000000
--- a/tests/data/json/escaped.topojson
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "type": "Topology",
- "objects": {
- "escaped": {
- "type": "GeometryCollection",
- "geometries": [
- {
- "type": "Point",
- "properties": {
- "name": "Test",
- "int": 1,
- "description": "Test: \\",
- "spaces": "this has spaces",
- "double": 1.1,
- "boolean": true,
- "NOM_FR": "Québec"
- },
- "coordinates": [
- 0,
- 0
- ]
- }
- ]
- }
- },
- "arcs": [
-
- ],
- "transform": {
- "scale": [
- 1,
- 1
- ],
- "translate": [
- -81.705583,
- 41.480573
- ]
- }
-}
diff --git a/tests/data/json/feature_collection_level_properties.json b/tests/data/json/feature_collection_level_properties.json
deleted file mode 100644
index 320cfc4..0000000
--- a/tests/data/json/feature_collection_level_properties.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "type": "FeatureCollection",
- "properties": {
- "fc_name": "fc_value"
- },
- "features": [
- {
- "type": "Feature",
- "properties": {
- "feat_name": "feat_value"
- },
- "geometry": {
- "type": "Point",
- "coordinates": [ -122, 48 ]
- }
- }
- ]
-}
\ No newline at end of file
diff --git a/tests/data/json/lines.geojson b/tests/data/json/lines.geojson
deleted file mode 100644
index 34e9bae..0000000
--- a/tests/data/json/lines.geojson
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-
-"type": "FeatureCollection",
-
-"features": [
-
- { "type": "Feature",
-
- "properties": { "x": 0, "y": 0, "label": "D" },
- "geometry" : { "type": "LineString", "coordinates": [ [1, 0], [2, 1], [3, 2], [4, 3], [5, 4], [6, 5] ] }
- },
- { "type": "Feature",
-
- "properties": { "x": 2, "y": 0, "label": "V" },
- "geometry" : { "type": "LineString", "coordinates": [ [2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5] ] }
- }
-
-]
-}
diff --git a/tests/data/json/null_feature.geojson b/tests/data/json/null_feature.geojson
deleted file mode 100644
index bf03457..0000000
--- a/tests/data/json/null_feature.geojson
+++ /dev/null
@@ -1,12 +0,0 @@
-{ "type": "FeatureCollection",
- "features": [
- { "type": "Feature",
- "geometry": {"type": "Point"},
- "properties": {"feat_id": 0}
- },
- { "type": "Feature",
- "geometry": {"type": "Point", "coordinates":[0,0]},
- "properties": {"feat_id": 1}
- }
-]
-}
\ No newline at end of file
diff --git a/tests/data/json/points.geojson b/tests/data/json/points.geojson
deleted file mode 100644
index 36dc859..0000000
--- a/tests/data/json/points.geojson
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-
-"type": "FeatureCollection",
-
-"features": [
-
- { "type": "Feature",
-
- "properties": { "x": 0, "y": 0, "label": "0,0" },
- "geometry" : { "type": "Point", "coordinates": [ 0, 0 ] }
- },
- { "type": "Feature",
-
- "properties": { "x": 5, "y": 5, "label": "5,5" },
- "geometry" : { "type": "Point", "coordinates": [ 5, 5 ] }
- },
- { "type": "Feature",
-
- "properties": { "x": 0, "y": 5, "label": "0,5" },
- "geometry" : { "type": "Point", "coordinates": [ 0, 5 ] }
- },
- { "type": "Feature",
-
- "properties": { "x": 5, "y": 0, "label": "5,0" },
- "geometry" : { "type": "Point", "coordinates": [ 5, 0 ] }
- },
- { "type": "Feature",
-
- "properties": { "x": 2.5, "y": 2.5, "label": "2.5,2.5" },
- "geometry" : { "type": "Point", "coordinates": [ 2.5, 2.5 ] }
- }
-
-]
-}
diff --git a/tests/data/osm/64bit.osm b/tests/data/osm/64bit.osm
deleted file mode 100644
index 9727d3d..0000000
--- a/tests/data/osm/64bit.osm
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<osm version="0.6" generator="mapnik">
- <node id="4294968186" version="3" timestamp="2007-11-24T19:38:32Z" uid="4946" user="user_4946" changeset="609026" lat="17.1415874" lon="-61.7960248"/>
- <node id="9223372036854775807" version="7" timestamp="2012-05-11T01:45:18Z" uid="24440" user="jaakkoh" changeset="11564167" lat="17.1416038" lon="-61.793673">
- <tag k="highway" v="mini_roundabout"/>
- <tag k="junction" v="roundabout"/>
- <tag k="note" v="mini_roundabout can't have a center island, see wiki for more info"/>
- <tag k="bigint" v="9223372036854775807"/>
- </node>
- <way id="1000" version="14" timestamp="2010-04-07T06:08:57Z" uid="28756" user="Nescum" changeset="4351472">
- <nd ref="4294968186"/>
- <nd ref="9223372036854775807"/>
- </way>
-</osm>
\ No newline at end of file
diff --git a/tests/data/osm/nodes.osm b/tests/data/osm/nodes.osm
deleted file mode 100644
index ce06231..0000000
--- a/tests/data/osm/nodes.osm
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<osm version="0.6" generator="mapnik">
- <node lat="0" lon="2" id="1"/>
- <node lat="2" lon="0" id="2"/>
- <node lat="0" lon="-2" id="3"/>
- <node lat="-2" lon="0" id="4"/>
- <way id="1">
- <nd ref="1"/>
- </way>
- <way id="2">
- <nd ref="2"/>
- </way>
- <way id="2">
- <nd ref="3"/>
- </way>
- <way id="2">
- <nd ref="4"/>
- </way>
-</osm>
\ No newline at end of file
diff --git a/tests/data/osm/t.png b/tests/data/osm/t.png
deleted file mode 100644
index 5e6d151..0000000
Binary files a/tests/data/osm/t.png and /dev/null differ
diff --git a/tests/data/osm/ways.osm b/tests/data/osm/ways.osm
deleted file mode 100644
index f25b357..0000000
--- a/tests/data/osm/ways.osm
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<osm version="0.6" generator="mapnik">
- <node lat="0" lon="2" id="1"/>
- <node lat="2" lon="0" id="2"/>
- <node lat="0" lon="-2" id="3"/>
- <node lat="-2" lon="0" id="4"/>
- <way id="1">
- <nd ref="2"/>
- <nd ref="4"/>
- </way>
- <way id="2">
- <nd ref="1"/>
- <nd ref="3"/>
- </way>
-</osm>
\ No newline at end of file
diff --git a/tests/data/palettes/palette256.act b/tests/data/palettes/palette256.act
deleted file mode 100644
index 60ab72c..0000000
Binary files a/tests/data/palettes/palette256.act and /dev/null differ
diff --git a/tests/data/palettes/palette64.act b/tests/data/palettes/palette64.act
deleted file mode 100644
index da0c772..0000000
Binary files a/tests/data/palettes/palette64.act and /dev/null differ
diff --git a/tests/data/pngsuite/PngSuite.LICENSE b/tests/data/pngsuite/PngSuite.LICENSE
deleted file mode 100644
index 8d4d1d0..0000000
--- a/tests/data/pngsuite/PngSuite.LICENSE
+++ /dev/null
@@ -1,9 +0,0 @@
-PngSuite
---------
-
-Permission to use, copy, modify and distribute these images for any
-purpose and without fee is hereby granted.
-
-
-(c) Willem van Schaik, 1996, 2011
-
diff --git a/tests/data/pngsuite/PngSuite.README b/tests/data/pngsuite/PngSuite.README
deleted file mode 100644
index 3ef8f24..0000000
--- a/tests/data/pngsuite/PngSuite.README
+++ /dev/null
@@ -1,25 +0,0 @@
- PNGSUITE
-----------------
-
- testset for PNG-(de)coders
- created by Willem van Schaik
-------------------------------------
-
-This is a collection of graphics images created to test the png applications
-like viewers, converters and editors. All (as far as that is possible)
-formats supported by the PNG standard are represented.
-
-The suite consists of the following files:
-
-- PngSuite.README - this file
-- PngSuite.LICENSE - the PngSuite is freeware
-- PngSuite.png - image with PngSuite logo
-- PngSuite.tgz - archive of all PNG testfiles
-- PngSuite.zip - same in .zip format for PCs
-
-
---------
- (c) Willem van Schaik
- willem at schaik.com
- Calgary, April 2011
-
diff --git a/tests/data/pngsuite/PngSuite.png b/tests/data/pngsuite/PngSuite.png
deleted file mode 100644
index 205460d..0000000
Binary files a/tests/data/pngsuite/PngSuite.png and /dev/null differ
diff --git a/tests/data/pngsuite/basi0g01.png b/tests/data/pngsuite/basi0g01.png
deleted file mode 100644
index 556fa72..0000000
Binary files a/tests/data/pngsuite/basi0g01.png and /dev/null differ
diff --git a/tests/data/pngsuite/basi0g02.png b/tests/data/pngsuite/basi0g02.png
deleted file mode 100644
index ce09821..0000000
Binary files a/tests/data/pngsuite/basi0g02.png and /dev/null differ
diff --git a/tests/data/pngsuite/basi0g04.png b/tests/data/pngsuite/basi0g04.png
deleted file mode 100644
index 3853273..0000000
Binary files a/tests/data/pngsuite/basi0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/basi0g08.png b/tests/data/pngsuite/basi0g08.png
deleted file mode 100644
index faed8be..0000000
Binary files a/tests/data/pngsuite/basi0g08.png and /dev/null differ
diff --git a/tests/data/pngsuite/basi0g16.png b/tests/data/pngsuite/basi0g16.png
deleted file mode 100644
index a9f2816..0000000
Binary files a/tests/data/pngsuite/basi0g16.png and /dev/null differ
diff --git a/tests/data/pngsuite/basi2c08.png b/tests/data/pngsuite/basi2c08.png
deleted file mode 100644
index 2aab44d..0000000
Binary files a/tests/data/pngsuite/basi2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/basi2c16.png b/tests/data/pngsuite/basi2c16.png
deleted file mode 100644
index cd7e50f..0000000
Binary files a/tests/data/pngsuite/basi2c16.png and /dev/null differ
diff --git a/tests/data/pngsuite/basi3p01.png b/tests/data/pngsuite/basi3p01.png
deleted file mode 100644
index 00a7cea..0000000
Binary files a/tests/data/pngsuite/basi3p01.png and /dev/null differ
diff --git a/tests/data/pngsuite/basi3p02.png b/tests/data/pngsuite/basi3p02.png
deleted file mode 100644
index bb16b44..0000000
Binary files a/tests/data/pngsuite/basi3p02.png and /dev/null differ
diff --git a/tests/data/pngsuite/basi3p04.png b/tests/data/pngsuite/basi3p04.png
deleted file mode 100644
index b4e888e..0000000
Binary files a/tests/data/pngsuite/basi3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/basi3p08.png b/tests/data/pngsuite/basi3p08.png
deleted file mode 100644
index 50a6d1c..0000000
Binary files a/tests/data/pngsuite/basi3p08.png and /dev/null differ
diff --git a/tests/data/pngsuite/basi4a08.png b/tests/data/pngsuite/basi4a08.png
deleted file mode 100644
index 398132b..0000000
Binary files a/tests/data/pngsuite/basi4a08.png and /dev/null differ
diff --git a/tests/data/pngsuite/basi4a16.png b/tests/data/pngsuite/basi4a16.png
deleted file mode 100644
index 51192e7..0000000
Binary files a/tests/data/pngsuite/basi4a16.png and /dev/null differ
diff --git a/tests/data/pngsuite/basi6a08.png b/tests/data/pngsuite/basi6a08.png
deleted file mode 100644
index aecb32e..0000000
Binary files a/tests/data/pngsuite/basi6a08.png and /dev/null differ
diff --git a/tests/data/pngsuite/basi6a16.png b/tests/data/pngsuite/basi6a16.png
deleted file mode 100644
index 4181533..0000000
Binary files a/tests/data/pngsuite/basi6a16.png and /dev/null differ
diff --git a/tests/data/pngsuite/basn0g01.png b/tests/data/pngsuite/basn0g01.png
deleted file mode 100644
index 1d72242..0000000
Binary files a/tests/data/pngsuite/basn0g01.png and /dev/null differ
diff --git a/tests/data/pngsuite/basn0g02.png b/tests/data/pngsuite/basn0g02.png
deleted file mode 100644
index 5083324..0000000
Binary files a/tests/data/pngsuite/basn0g02.png and /dev/null differ
diff --git a/tests/data/pngsuite/basn0g04.png b/tests/data/pngsuite/basn0g04.png
deleted file mode 100644
index 0bf3687..0000000
Binary files a/tests/data/pngsuite/basn0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/basn0g08.png b/tests/data/pngsuite/basn0g08.png
deleted file mode 100644
index 23c8237..0000000
Binary files a/tests/data/pngsuite/basn0g08.png and /dev/null differ
diff --git a/tests/data/pngsuite/basn0g16.png b/tests/data/pngsuite/basn0g16.png
deleted file mode 100644
index e7c82f7..0000000
Binary files a/tests/data/pngsuite/basn0g16.png and /dev/null differ
diff --git a/tests/data/pngsuite/basn2c08.png b/tests/data/pngsuite/basn2c08.png
deleted file mode 100644
index db5ad15..0000000
Binary files a/tests/data/pngsuite/basn2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/basn2c16.png b/tests/data/pngsuite/basn2c16.png
deleted file mode 100644
index 50c1cb9..0000000
Binary files a/tests/data/pngsuite/basn2c16.png and /dev/null differ
diff --git a/tests/data/pngsuite/basn3p01.png b/tests/data/pngsuite/basn3p01.png
deleted file mode 100644
index b145c2b..0000000
Binary files a/tests/data/pngsuite/basn3p01.png and /dev/null differ
diff --git a/tests/data/pngsuite/basn3p02.png b/tests/data/pngsuite/basn3p02.png
deleted file mode 100644
index 8985b3d..0000000
Binary files a/tests/data/pngsuite/basn3p02.png and /dev/null differ
diff --git a/tests/data/pngsuite/basn3p04.png b/tests/data/pngsuite/basn3p04.png
deleted file mode 100644
index 0fbf9e8..0000000
Binary files a/tests/data/pngsuite/basn3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/basn3p08.png b/tests/data/pngsuite/basn3p08.png
deleted file mode 100644
index 0ddad07..0000000
Binary files a/tests/data/pngsuite/basn3p08.png and /dev/null differ
diff --git a/tests/data/pngsuite/basn4a08.png b/tests/data/pngsuite/basn4a08.png
deleted file mode 100644
index 3e13052..0000000
Binary files a/tests/data/pngsuite/basn4a08.png and /dev/null differ
diff --git a/tests/data/pngsuite/basn4a16.png b/tests/data/pngsuite/basn4a16.png
deleted file mode 100644
index 8243644..0000000
Binary files a/tests/data/pngsuite/basn4a16.png and /dev/null differ
diff --git a/tests/data/pngsuite/basn6a08.png b/tests/data/pngsuite/basn6a08.png
deleted file mode 100644
index e608738..0000000
Binary files a/tests/data/pngsuite/basn6a08.png and /dev/null differ
diff --git a/tests/data/pngsuite/basn6a16.png b/tests/data/pngsuite/basn6a16.png
deleted file mode 100644
index 984a995..0000000
Binary files a/tests/data/pngsuite/basn6a16.png and /dev/null differ
diff --git a/tests/data/pngsuite/bgai4a08.png b/tests/data/pngsuite/bgai4a08.png
deleted file mode 100644
index 398132b..0000000
Binary files a/tests/data/pngsuite/bgai4a08.png and /dev/null differ
diff --git a/tests/data/pngsuite/bgai4a16.png b/tests/data/pngsuite/bgai4a16.png
deleted file mode 100644
index 51192e7..0000000
Binary files a/tests/data/pngsuite/bgai4a16.png and /dev/null differ
diff --git a/tests/data/pngsuite/bgan6a08.png b/tests/data/pngsuite/bgan6a08.png
deleted file mode 100644
index e608738..0000000
Binary files a/tests/data/pngsuite/bgan6a08.png and /dev/null differ
diff --git a/tests/data/pngsuite/bgan6a16.png b/tests/data/pngsuite/bgan6a16.png
deleted file mode 100644
index 984a995..0000000
Binary files a/tests/data/pngsuite/bgan6a16.png and /dev/null differ
diff --git a/tests/data/pngsuite/bgbn4a08.png b/tests/data/pngsuite/bgbn4a08.png
deleted file mode 100644
index 7cbefc3..0000000
Binary files a/tests/data/pngsuite/bgbn4a08.png and /dev/null differ
diff --git a/tests/data/pngsuite/bggn4a16.png b/tests/data/pngsuite/bggn4a16.png
deleted file mode 100644
index 13fd85b..0000000
Binary files a/tests/data/pngsuite/bggn4a16.png and /dev/null differ
diff --git a/tests/data/pngsuite/bgwn6a08.png b/tests/data/pngsuite/bgwn6a08.png
deleted file mode 100644
index a67ff20..0000000
Binary files a/tests/data/pngsuite/bgwn6a08.png and /dev/null differ
diff --git a/tests/data/pngsuite/bgyn6a16.png b/tests/data/pngsuite/bgyn6a16.png
deleted file mode 100644
index ae3e9be..0000000
Binary files a/tests/data/pngsuite/bgyn6a16.png and /dev/null differ
diff --git a/tests/data/pngsuite/ccwn2c08.png b/tests/data/pngsuite/ccwn2c08.png
deleted file mode 100644
index 47c2481..0000000
Binary files a/tests/data/pngsuite/ccwn2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/ccwn3p08.png b/tests/data/pngsuite/ccwn3p08.png
deleted file mode 100644
index 8bb2c10..0000000
Binary files a/tests/data/pngsuite/ccwn3p08.png and /dev/null differ
diff --git a/tests/data/pngsuite/cdfn2c08.png b/tests/data/pngsuite/cdfn2c08.png
deleted file mode 100644
index 559e526..0000000
Binary files a/tests/data/pngsuite/cdfn2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/cdhn2c08.png b/tests/data/pngsuite/cdhn2c08.png
deleted file mode 100644
index 3e07e8e..0000000
Binary files a/tests/data/pngsuite/cdhn2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/cdsn2c08.png b/tests/data/pngsuite/cdsn2c08.png
deleted file mode 100644
index 076c32c..0000000
Binary files a/tests/data/pngsuite/cdsn2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/cdun2c08.png b/tests/data/pngsuite/cdun2c08.png
deleted file mode 100644
index 846033b..0000000
Binary files a/tests/data/pngsuite/cdun2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/ch1n3p04.png b/tests/data/pngsuite/ch1n3p04.png
deleted file mode 100644
index 17cd12d..0000000
Binary files a/tests/data/pngsuite/ch1n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/ch2n3p08.png b/tests/data/pngsuite/ch2n3p08.png
deleted file mode 100644
index 25c1798..0000000
Binary files a/tests/data/pngsuite/ch2n3p08.png and /dev/null differ
diff --git a/tests/data/pngsuite/cm0n0g04.png b/tests/data/pngsuite/cm0n0g04.png
deleted file mode 100644
index 9fba5db..0000000
Binary files a/tests/data/pngsuite/cm0n0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/cm7n0g04.png b/tests/data/pngsuite/cm7n0g04.png
deleted file mode 100644
index f7dc46e..0000000
Binary files a/tests/data/pngsuite/cm7n0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/cm9n0g04.png b/tests/data/pngsuite/cm9n0g04.png
deleted file mode 100644
index dd70911..0000000
Binary files a/tests/data/pngsuite/cm9n0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/cs3n2c16.png b/tests/data/pngsuite/cs3n2c16.png
deleted file mode 100644
index bf5fd20..0000000
Binary files a/tests/data/pngsuite/cs3n2c16.png and /dev/null differ
diff --git a/tests/data/pngsuite/cs3n3p08.png b/tests/data/pngsuite/cs3n3p08.png
deleted file mode 100644
index f4a6623..0000000
Binary files a/tests/data/pngsuite/cs3n3p08.png and /dev/null differ
diff --git a/tests/data/pngsuite/cs5n2c08.png b/tests/data/pngsuite/cs5n2c08.png
deleted file mode 100644
index 40f947c..0000000
Binary files a/tests/data/pngsuite/cs5n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/cs5n3p08.png b/tests/data/pngsuite/cs5n3p08.png
deleted file mode 100644
index dfd6e6e..0000000
Binary files a/tests/data/pngsuite/cs5n3p08.png and /dev/null differ
diff --git a/tests/data/pngsuite/cs8n2c08.png b/tests/data/pngsuite/cs8n2c08.png
deleted file mode 100644
index 8e01d32..0000000
Binary files a/tests/data/pngsuite/cs8n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/cs8n3p08.png b/tests/data/pngsuite/cs8n3p08.png
deleted file mode 100644
index a44066e..0000000
Binary files a/tests/data/pngsuite/cs8n3p08.png and /dev/null differ
diff --git a/tests/data/pngsuite/ct0n0g04.png b/tests/data/pngsuite/ct0n0g04.png
deleted file mode 100644
index 40d1e06..0000000
Binary files a/tests/data/pngsuite/ct0n0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/ct1n0g04.png b/tests/data/pngsuite/ct1n0g04.png
deleted file mode 100644
index 3ba110a..0000000
Binary files a/tests/data/pngsuite/ct1n0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/cten0g04.png b/tests/data/pngsuite/cten0g04.png
deleted file mode 100644
index 2f2d0c8..0000000
Binary files a/tests/data/pngsuite/cten0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/ctfn0g04.png b/tests/data/pngsuite/ctfn0g04.png
deleted file mode 100644
index ddac7f4..0000000
Binary files a/tests/data/pngsuite/ctfn0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/ctgn0g04.png b/tests/data/pngsuite/ctgn0g04.png
deleted file mode 100644
index baceb0c..0000000
Binary files a/tests/data/pngsuite/ctgn0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/cthn0g04.png b/tests/data/pngsuite/cthn0g04.png
deleted file mode 100644
index 11580f8..0000000
Binary files a/tests/data/pngsuite/cthn0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/ctjn0g04.png b/tests/data/pngsuite/ctjn0g04.png
deleted file mode 100644
index 2d30372..0000000
Binary files a/tests/data/pngsuite/ctjn0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/ctzn0g04.png b/tests/data/pngsuite/ctzn0g04.png
deleted file mode 100644
index b4401c9..0000000
Binary files a/tests/data/pngsuite/ctzn0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/f00n0g08.png b/tests/data/pngsuite/f00n0g08.png
deleted file mode 100644
index 45a0075..0000000
Binary files a/tests/data/pngsuite/f00n0g08.png and /dev/null differ
diff --git a/tests/data/pngsuite/f00n2c08.png b/tests/data/pngsuite/f00n2c08.png
deleted file mode 100644
index d6a1fff..0000000
Binary files a/tests/data/pngsuite/f00n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/f01n0g08.png b/tests/data/pngsuite/f01n0g08.png
deleted file mode 100644
index 4a1107b..0000000
Binary files a/tests/data/pngsuite/f01n0g08.png and /dev/null differ
diff --git a/tests/data/pngsuite/f01n2c08.png b/tests/data/pngsuite/f01n2c08.png
deleted file mode 100644
index 26fee95..0000000
Binary files a/tests/data/pngsuite/f01n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/f02n0g08.png b/tests/data/pngsuite/f02n0g08.png
deleted file mode 100644
index bfe410c..0000000
Binary files a/tests/data/pngsuite/f02n0g08.png and /dev/null differ
diff --git a/tests/data/pngsuite/f02n2c08.png b/tests/data/pngsuite/f02n2c08.png
deleted file mode 100644
index e590f12..0000000
Binary files a/tests/data/pngsuite/f02n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/f03n0g08.png b/tests/data/pngsuite/f03n0g08.png
deleted file mode 100644
index ed01e29..0000000
Binary files a/tests/data/pngsuite/f03n0g08.png and /dev/null differ
diff --git a/tests/data/pngsuite/f03n2c08.png b/tests/data/pngsuite/f03n2c08.png
deleted file mode 100644
index 7581150..0000000
Binary files a/tests/data/pngsuite/f03n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/f04n0g08.png b/tests/data/pngsuite/f04n0g08.png
deleted file mode 100644
index 663fdae..0000000
Binary files a/tests/data/pngsuite/f04n0g08.png and /dev/null differ
diff --git a/tests/data/pngsuite/f04n2c08.png b/tests/data/pngsuite/f04n2c08.png
deleted file mode 100644
index 3c8b511..0000000
Binary files a/tests/data/pngsuite/f04n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/f99n0g04.png b/tests/data/pngsuite/f99n0g04.png
deleted file mode 100644
index 0b521c1..0000000
Binary files a/tests/data/pngsuite/f99n0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/g03n0g16.png b/tests/data/pngsuite/g03n0g16.png
deleted file mode 100644
index 41083ca..0000000
Binary files a/tests/data/pngsuite/g03n0g16.png and /dev/null differ
diff --git a/tests/data/pngsuite/g03n2c08.png b/tests/data/pngsuite/g03n2c08.png
deleted file mode 100644
index a9354db..0000000
Binary files a/tests/data/pngsuite/g03n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/g03n3p04.png b/tests/data/pngsuite/g03n3p04.png
deleted file mode 100644
index 60396c9..0000000
Binary files a/tests/data/pngsuite/g03n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/g04n0g16.png b/tests/data/pngsuite/g04n0g16.png
deleted file mode 100644
index 32395b7..0000000
Binary files a/tests/data/pngsuite/g04n0g16.png and /dev/null differ
diff --git a/tests/data/pngsuite/g04n2c08.png b/tests/data/pngsuite/g04n2c08.png
deleted file mode 100644
index a652b0c..0000000
Binary files a/tests/data/pngsuite/g04n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/g04n3p04.png b/tests/data/pngsuite/g04n3p04.png
deleted file mode 100644
index 5661cc3..0000000
Binary files a/tests/data/pngsuite/g04n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/g05n0g16.png b/tests/data/pngsuite/g05n0g16.png
deleted file mode 100644
index 70b37f0..0000000
Binary files a/tests/data/pngsuite/g05n0g16.png and /dev/null differ
diff --git a/tests/data/pngsuite/g05n2c08.png b/tests/data/pngsuite/g05n2c08.png
deleted file mode 100644
index 932c136..0000000
Binary files a/tests/data/pngsuite/g05n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/g05n3p04.png b/tests/data/pngsuite/g05n3p04.png
deleted file mode 100644
index 9619930..0000000
Binary files a/tests/data/pngsuite/g05n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/g07n0g16.png b/tests/data/pngsuite/g07n0g16.png
deleted file mode 100644
index d6a47c2..0000000
Binary files a/tests/data/pngsuite/g07n0g16.png and /dev/null differ
diff --git a/tests/data/pngsuite/g07n2c08.png b/tests/data/pngsuite/g07n2c08.png
deleted file mode 100644
index 5973464..0000000
Binary files a/tests/data/pngsuite/g07n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/g07n3p04.png b/tests/data/pngsuite/g07n3p04.png
deleted file mode 100644
index c73fb61..0000000
Binary files a/tests/data/pngsuite/g07n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/g10n0g16.png b/tests/data/pngsuite/g10n0g16.png
deleted file mode 100644
index 85f2c95..0000000
Binary files a/tests/data/pngsuite/g10n0g16.png and /dev/null differ
diff --git a/tests/data/pngsuite/g10n2c08.png b/tests/data/pngsuite/g10n2c08.png
deleted file mode 100644
index b303997..0000000
Binary files a/tests/data/pngsuite/g10n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/g10n3p04.png b/tests/data/pngsuite/g10n3p04.png
deleted file mode 100644
index 1b6a6be..0000000
Binary files a/tests/data/pngsuite/g10n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/g25n0g16.png b/tests/data/pngsuite/g25n0g16.png
deleted file mode 100644
index a9f6787..0000000
Binary files a/tests/data/pngsuite/g25n0g16.png and /dev/null differ
diff --git a/tests/data/pngsuite/g25n2c08.png b/tests/data/pngsuite/g25n2c08.png
deleted file mode 100644
index 03f505a..0000000
Binary files a/tests/data/pngsuite/g25n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/g25n3p04.png b/tests/data/pngsuite/g25n3p04.png
deleted file mode 100644
index 4f943c6..0000000
Binary files a/tests/data/pngsuite/g25n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/linepattern.png b/tests/data/pngsuite/linepattern.png
deleted file mode 100644
index 9a89f21..0000000
Binary files a/tests/data/pngsuite/linepattern.png and /dev/null differ
diff --git a/tests/data/pngsuite/linepattern1.png b/tests/data/pngsuite/linepattern1.png
deleted file mode 100644
index 73234b7..0000000
Binary files a/tests/data/pngsuite/linepattern1.png and /dev/null differ
diff --git a/tests/data/pngsuite/oi1n0g16.png b/tests/data/pngsuite/oi1n0g16.png
deleted file mode 100644
index e7c82f7..0000000
Binary files a/tests/data/pngsuite/oi1n0g16.png and /dev/null differ
diff --git a/tests/data/pngsuite/oi1n2c16.png b/tests/data/pngsuite/oi1n2c16.png
deleted file mode 100644
index 50c1cb9..0000000
Binary files a/tests/data/pngsuite/oi1n2c16.png and /dev/null differ
diff --git a/tests/data/pngsuite/oi2n0g16.png b/tests/data/pngsuite/oi2n0g16.png
deleted file mode 100644
index 14d64c5..0000000
Binary files a/tests/data/pngsuite/oi2n0g16.png and /dev/null differ
diff --git a/tests/data/pngsuite/oi2n2c16.png b/tests/data/pngsuite/oi2n2c16.png
deleted file mode 100644
index 4c2e3e3..0000000
Binary files a/tests/data/pngsuite/oi2n2c16.png and /dev/null differ
diff --git a/tests/data/pngsuite/oi4n0g16.png b/tests/data/pngsuite/oi4n0g16.png
deleted file mode 100644
index 69e73ed..0000000
Binary files a/tests/data/pngsuite/oi4n0g16.png and /dev/null differ
diff --git a/tests/data/pngsuite/oi4n2c16.png b/tests/data/pngsuite/oi4n2c16.png
deleted file mode 100644
index 93691e3..0000000
Binary files a/tests/data/pngsuite/oi4n2c16.png and /dev/null differ
diff --git a/tests/data/pngsuite/oi9n0g16.png b/tests/data/pngsuite/oi9n0g16.png
deleted file mode 100644
index 9248413..0000000
Binary files a/tests/data/pngsuite/oi9n0g16.png and /dev/null differ
diff --git a/tests/data/pngsuite/oi9n2c16.png b/tests/data/pngsuite/oi9n2c16.png
deleted file mode 100644
index f0512e4..0000000
Binary files a/tests/data/pngsuite/oi9n2c16.png and /dev/null differ
diff --git a/tests/data/pngsuite/pp0n2c16.png b/tests/data/pngsuite/pp0n2c16.png
deleted file mode 100644
index 8f2aad7..0000000
Binary files a/tests/data/pngsuite/pp0n2c16.png and /dev/null differ
diff --git a/tests/data/pngsuite/pp0n6a08.png b/tests/data/pngsuite/pp0n6a08.png
deleted file mode 100644
index 4ed7a30..0000000
Binary files a/tests/data/pngsuite/pp0n6a08.png and /dev/null differ
diff --git a/tests/data/pngsuite/ps1n0g08.png b/tests/data/pngsuite/ps1n0g08.png
deleted file mode 100644
index 99625fa..0000000
Binary files a/tests/data/pngsuite/ps1n0g08.png and /dev/null differ
diff --git a/tests/data/pngsuite/ps1n2c16.png b/tests/data/pngsuite/ps1n2c16.png
deleted file mode 100644
index 0c7a6b3..0000000
Binary files a/tests/data/pngsuite/ps1n2c16.png and /dev/null differ
diff --git a/tests/data/pngsuite/ps2n0g08.png b/tests/data/pngsuite/ps2n0g08.png
deleted file mode 100644
index 90b2979..0000000
Binary files a/tests/data/pngsuite/ps2n0g08.png and /dev/null differ
diff --git a/tests/data/pngsuite/ps2n2c16.png b/tests/data/pngsuite/ps2n2c16.png
deleted file mode 100644
index a4a181e..0000000
Binary files a/tests/data/pngsuite/ps2n2c16.png and /dev/null differ
diff --git a/tests/data/pngsuite/s01i3p01.png b/tests/data/pngsuite/s01i3p01.png
deleted file mode 100644
index 6c0fad1..0000000
Binary files a/tests/data/pngsuite/s01i3p01.png and /dev/null differ
diff --git a/tests/data/pngsuite/s01n3p01.png b/tests/data/pngsuite/s01n3p01.png
deleted file mode 100644
index cb2c8c7..0000000
Binary files a/tests/data/pngsuite/s01n3p01.png and /dev/null differ
diff --git a/tests/data/pngsuite/s02i3p01.png b/tests/data/pngsuite/s02i3p01.png
deleted file mode 100644
index 2defaed..0000000
Binary files a/tests/data/pngsuite/s02i3p01.png and /dev/null differ
diff --git a/tests/data/pngsuite/s02n3p01.png b/tests/data/pngsuite/s02n3p01.png
deleted file mode 100644
index 2b1b669..0000000
Binary files a/tests/data/pngsuite/s02n3p01.png and /dev/null differ
diff --git a/tests/data/pngsuite/s03i3p01.png b/tests/data/pngsuite/s03i3p01.png
deleted file mode 100644
index c23fdc4..0000000
Binary files a/tests/data/pngsuite/s03i3p01.png and /dev/null differ
diff --git a/tests/data/pngsuite/s03n3p01.png b/tests/data/pngsuite/s03n3p01.png
deleted file mode 100644
index 6d96ee4..0000000
Binary files a/tests/data/pngsuite/s03n3p01.png and /dev/null differ
diff --git a/tests/data/pngsuite/s04i3p01.png b/tests/data/pngsuite/s04i3p01.png
deleted file mode 100644
index 0e710c2..0000000
Binary files a/tests/data/pngsuite/s04i3p01.png and /dev/null differ
diff --git a/tests/data/pngsuite/s04n3p01.png b/tests/data/pngsuite/s04n3p01.png
deleted file mode 100644
index 956396c..0000000
Binary files a/tests/data/pngsuite/s04n3p01.png and /dev/null differ
diff --git a/tests/data/pngsuite/s05i3p02.png b/tests/data/pngsuite/s05i3p02.png
deleted file mode 100644
index d14cbd3..0000000
Binary files a/tests/data/pngsuite/s05i3p02.png and /dev/null differ
diff --git a/tests/data/pngsuite/s05n3p02.png b/tests/data/pngsuite/s05n3p02.png
deleted file mode 100644
index bf940f0..0000000
Binary files a/tests/data/pngsuite/s05n3p02.png and /dev/null differ
diff --git a/tests/data/pngsuite/s06i3p02.png b/tests/data/pngsuite/s06i3p02.png
deleted file mode 100644
index 456ada3..0000000
Binary files a/tests/data/pngsuite/s06i3p02.png and /dev/null differ
diff --git a/tests/data/pngsuite/s06n3p02.png b/tests/data/pngsuite/s06n3p02.png
deleted file mode 100644
index 501064d..0000000
Binary files a/tests/data/pngsuite/s06n3p02.png and /dev/null differ
diff --git a/tests/data/pngsuite/s07i3p02.png b/tests/data/pngsuite/s07i3p02.png
deleted file mode 100644
index 44b66ba..0000000
Binary files a/tests/data/pngsuite/s07i3p02.png and /dev/null differ
diff --git a/tests/data/pngsuite/s07n3p02.png b/tests/data/pngsuite/s07n3p02.png
deleted file mode 100644
index 6a58259..0000000
Binary files a/tests/data/pngsuite/s07n3p02.png and /dev/null differ
diff --git a/tests/data/pngsuite/s08i3p02.png b/tests/data/pngsuite/s08i3p02.png
deleted file mode 100644
index acf74f3..0000000
Binary files a/tests/data/pngsuite/s08i3p02.png and /dev/null differ
diff --git a/tests/data/pngsuite/s08n3p02.png b/tests/data/pngsuite/s08n3p02.png
deleted file mode 100644
index b7094e1..0000000
Binary files a/tests/data/pngsuite/s08n3p02.png and /dev/null differ
diff --git a/tests/data/pngsuite/s09i3p02.png b/tests/data/pngsuite/s09i3p02.png
deleted file mode 100644
index 0bfae8e..0000000
Binary files a/tests/data/pngsuite/s09i3p02.png and /dev/null differ
diff --git a/tests/data/pngsuite/s09n3p02.png b/tests/data/pngsuite/s09n3p02.png
deleted file mode 100644
index 711ab82..0000000
Binary files a/tests/data/pngsuite/s09n3p02.png and /dev/null differ
diff --git a/tests/data/pngsuite/s32i3p04.png b/tests/data/pngsuite/s32i3p04.png
deleted file mode 100644
index 0841910..0000000
Binary files a/tests/data/pngsuite/s32i3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s32n3p04.png b/tests/data/pngsuite/s32n3p04.png
deleted file mode 100644
index fa58e3e..0000000
Binary files a/tests/data/pngsuite/s32n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s33i3p04.png b/tests/data/pngsuite/s33i3p04.png
deleted file mode 100644
index ab0dc14..0000000
Binary files a/tests/data/pngsuite/s33i3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s33n3p04.png b/tests/data/pngsuite/s33n3p04.png
deleted file mode 100644
index 764f1a3..0000000
Binary files a/tests/data/pngsuite/s33n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s34i3p04.png b/tests/data/pngsuite/s34i3p04.png
deleted file mode 100644
index bd99039..0000000
Binary files a/tests/data/pngsuite/s34i3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s34n3p04.png b/tests/data/pngsuite/s34n3p04.png
deleted file mode 100644
index 9cbc68b..0000000
Binary files a/tests/data/pngsuite/s34n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s35i3p04.png b/tests/data/pngsuite/s35i3p04.png
deleted file mode 100644
index e2a5e0a..0000000
Binary files a/tests/data/pngsuite/s35i3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s35n3p04.png b/tests/data/pngsuite/s35n3p04.png
deleted file mode 100644
index 90b892e..0000000
Binary files a/tests/data/pngsuite/s35n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s36i3p04.png b/tests/data/pngsuite/s36i3p04.png
deleted file mode 100644
index eb61b6f..0000000
Binary files a/tests/data/pngsuite/s36i3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s36n3p04.png b/tests/data/pngsuite/s36n3p04.png
deleted file mode 100644
index b38d179..0000000
Binary files a/tests/data/pngsuite/s36n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s37i3p04.png b/tests/data/pngsuite/s37i3p04.png
deleted file mode 100644
index 6e2b1e9..0000000
Binary files a/tests/data/pngsuite/s37i3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s37n3p04.png b/tests/data/pngsuite/s37n3p04.png
deleted file mode 100644
index 4d3054d..0000000
Binary files a/tests/data/pngsuite/s37n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s38i3p04.png b/tests/data/pngsuite/s38i3p04.png
deleted file mode 100644
index a0a8a14..0000000
Binary files a/tests/data/pngsuite/s38i3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s38n3p04.png b/tests/data/pngsuite/s38n3p04.png
deleted file mode 100644
index 1233ed0..0000000
Binary files a/tests/data/pngsuite/s38n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s39i3p04.png b/tests/data/pngsuite/s39i3p04.png
deleted file mode 100644
index 04fee93..0000000
Binary files a/tests/data/pngsuite/s39i3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s39n3p04.png b/tests/data/pngsuite/s39n3p04.png
deleted file mode 100644
index c750100..0000000
Binary files a/tests/data/pngsuite/s39n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s40i3p04.png b/tests/data/pngsuite/s40i3p04.png
deleted file mode 100644
index 68f358b..0000000
Binary files a/tests/data/pngsuite/s40i3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/s40n3p04.png b/tests/data/pngsuite/s40n3p04.png
deleted file mode 100644
index 864b6b9..0000000
Binary files a/tests/data/pngsuite/s40n3p04.png and /dev/null differ
diff --git a/tests/data/pngsuite/tbbn0g04.png b/tests/data/pngsuite/tbbn0g04.png
deleted file mode 100644
index 39a7050..0000000
Binary files a/tests/data/pngsuite/tbbn0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/tbbn2c16.png b/tests/data/pngsuite/tbbn2c16.png
deleted file mode 100644
index dd3168e..0000000
Binary files a/tests/data/pngsuite/tbbn2c16.png and /dev/null differ
diff --git a/tests/data/pngsuite/tbbn3p08.png b/tests/data/pngsuite/tbbn3p08.png
deleted file mode 100644
index 0ede357..0000000
Binary files a/tests/data/pngsuite/tbbn3p08.png and /dev/null differ
diff --git a/tests/data/pngsuite/tbgn2c16.png b/tests/data/pngsuite/tbgn2c16.png
deleted file mode 100644
index 85cec39..0000000
Binary files a/tests/data/pngsuite/tbgn2c16.png and /dev/null differ
diff --git a/tests/data/pngsuite/tbgn3p08.png b/tests/data/pngsuite/tbgn3p08.png
deleted file mode 100644
index 8cf2e6f..0000000
Binary files a/tests/data/pngsuite/tbgn3p08.png and /dev/null differ
diff --git a/tests/data/pngsuite/tbrn2c08.png b/tests/data/pngsuite/tbrn2c08.png
deleted file mode 100644
index 5cca0d6..0000000
Binary files a/tests/data/pngsuite/tbrn2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/tbwn0g16.png b/tests/data/pngsuite/tbwn0g16.png
deleted file mode 100644
index 99bdeed..0000000
Binary files a/tests/data/pngsuite/tbwn0g16.png and /dev/null differ
diff --git a/tests/data/pngsuite/tbwn3p08.png b/tests/data/pngsuite/tbwn3p08.png
deleted file mode 100644
index eacab7a..0000000
Binary files a/tests/data/pngsuite/tbwn3p08.png and /dev/null differ
diff --git a/tests/data/pngsuite/tbyn3p08.png b/tests/data/pngsuite/tbyn3p08.png
deleted file mode 100644
index 656db09..0000000
Binary files a/tests/data/pngsuite/tbyn3p08.png and /dev/null differ
diff --git a/tests/data/pngsuite/tp0n0g08.png b/tests/data/pngsuite/tp0n0g08.png
deleted file mode 100644
index 333465f..0000000
Binary files a/tests/data/pngsuite/tp0n0g08.png and /dev/null differ
diff --git a/tests/data/pngsuite/tp0n2c08.png b/tests/data/pngsuite/tp0n2c08.png
deleted file mode 100644
index fc6e42c..0000000
Binary files a/tests/data/pngsuite/tp0n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/tp0n3p08.png b/tests/data/pngsuite/tp0n3p08.png
deleted file mode 100644
index 69a69e5..0000000
Binary files a/tests/data/pngsuite/tp0n3p08.png and /dev/null differ
diff --git a/tests/data/pngsuite/tp1n3p08.png b/tests/data/pngsuite/tp1n3p08.png
deleted file mode 100644
index a6c9f35..0000000
Binary files a/tests/data/pngsuite/tp1n3p08.png and /dev/null differ
diff --git a/tests/data/pngsuite/xc1n0g08.png b/tests/data/pngsuite/xc1n0g08.png
deleted file mode 100644
index 9404227..0000000
Binary files a/tests/data/pngsuite/xc1n0g08.png and /dev/null differ
diff --git a/tests/data/pngsuite/xc9n2c08.png b/tests/data/pngsuite/xc9n2c08.png
deleted file mode 100644
index b11c2a7..0000000
Binary files a/tests/data/pngsuite/xc9n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/xcrn0g04.png b/tests/data/pngsuite/xcrn0g04.png
deleted file mode 100644
index 48abba1..0000000
Binary files a/tests/data/pngsuite/xcrn0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/xd0n2c08.png b/tests/data/pngsuite/xd0n2c08.png
deleted file mode 100644
index 2f00161..0000000
Binary files a/tests/data/pngsuite/xd0n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/xd3n2c08.png b/tests/data/pngsuite/xd3n2c08.png
deleted file mode 100644
index 9e4a3ff..0000000
Binary files a/tests/data/pngsuite/xd3n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/xd9n2c08.png b/tests/data/pngsuite/xd9n2c08.png
deleted file mode 100644
index 2c3b91a..0000000
Binary files a/tests/data/pngsuite/xd9n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/xdtn0g01.png b/tests/data/pngsuite/xdtn0g01.png
deleted file mode 100644
index 1a81abe..0000000
Binary files a/tests/data/pngsuite/xdtn0g01.png and /dev/null differ
diff --git a/tests/data/pngsuite/xlfn0g04.png b/tests/data/pngsuite/xlfn0g04.png
deleted file mode 100644
index d9ec53e..0000000
Binary files a/tests/data/pngsuite/xlfn0g04.png and /dev/null differ
diff --git a/tests/data/pngsuite/xs1n0g01.png b/tests/data/pngsuite/xs1n0g01.png
deleted file mode 100644
index 1817c51..0000000
Binary files a/tests/data/pngsuite/xs1n0g01.png and /dev/null differ
diff --git a/tests/data/pngsuite/xs2n0g01.png b/tests/data/pngsuite/xs2n0g01.png
deleted file mode 100644
index b8147f2..0000000
Binary files a/tests/data/pngsuite/xs2n0g01.png and /dev/null differ
diff --git a/tests/data/pngsuite/xs4n0g01.png b/tests/data/pngsuite/xs4n0g01.png
deleted file mode 100644
index 45237a1..0000000
Binary files a/tests/data/pngsuite/xs4n0g01.png and /dev/null differ
diff --git a/tests/data/pngsuite/xs7n0g01.png b/tests/data/pngsuite/xs7n0g01.png
deleted file mode 100644
index 3f307f1..0000000
Binary files a/tests/data/pngsuite/xs7n0g01.png and /dev/null differ
diff --git a/tests/data/pngsuite/z00n2c08.png b/tests/data/pngsuite/z00n2c08.png
deleted file mode 100644
index 7669eb8..0000000
Binary files a/tests/data/pngsuite/z00n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/z03n2c08.png b/tests/data/pngsuite/z03n2c08.png
deleted file mode 100644
index bfb10de..0000000
Binary files a/tests/data/pngsuite/z03n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/z06n2c08.png b/tests/data/pngsuite/z06n2c08.png
deleted file mode 100644
index b90ebc1..0000000
Binary files a/tests/data/pngsuite/z06n2c08.png and /dev/null differ
diff --git a/tests/data/pngsuite/z09n2c08.png b/tests/data/pngsuite/z09n2c08.png
deleted file mode 100644
index 5f191a7..0000000
Binary files a/tests/data/pngsuite/z09n2c08.png and /dev/null differ
diff --git a/tests/data/python_plugin/python_circle_datasource.xml b/tests/data/python_plugin/python_circle_datasource.xml
deleted file mode 100644
index c8d7d8b..0000000
--- a/tests/data/python_plugin/python_circle_datasource.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
- <Style name="1">
- <Rule>
- <LineSymbolizer stroke="rgb(80%,0%,0%)" />
- </Rule>
- </Style>
-
- <Style name="2">
- <Rule>
- <LineSymbolizer stroke="rgb(0%,80%,0%)" />
- </Rule>
- </Style>
-
- <Style name="3">
- <Rule>
- <LineSymbolizer stroke="rgb(0%,0%,80%)" />
- </Rule>
- </Style>
-
- <Layer name="circles1" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="type">python</Parameter>
- <Parameter name="factory">python_plugin_test:CirclesDatasource</Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="circles2" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>2</StyleName>
- <Datasource>
- <Parameter name="type">python</Parameter>
- <Parameter name="factory">python_plugin_test:CirclesDatasource</Parameter>
- <Parameter name="centre_x">-20</Parameter>
- <Parameter name="centre_y">50</Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="circles3" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>3</StyleName>
- <Datasource>
- <Parameter name="type">python</Parameter>
- <Parameter name="factory">python_plugin_test:CirclesDatasource</Parameter>
- <Parameter name="centre_x">60</Parameter>
- <Parameter name="centre_y">140</Parameter>
- <Parameter name="step">20</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/data/python_plugin/python_point_datasource.xml b/tests/data/python_plugin/python_point_datasource.xml
deleted file mode 100644
index 249e5ce..0000000
--- a/tests/data/python_plugin/python_point_datasource.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
- <Style name="1">
- <Rule>
- <TextSymbolizer size="10" dy="-5" face-name="DejaVu Sans Book" halo-radius="1">[label]</TextSymbolizer>
- <PointSymbolizer/>
- </Rule>
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="type">python</Parameter>
- <Parameter name="factory">python_plugin_test:PointDatasource</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/data/raster_tiles/000/000/000/000/000/000.tif b/tests/data/raster_tiles/000/000/000/000/000/000.tif
deleted file mode 100644
index d43cebc..0000000
Binary files a/tests/data/raster_tiles/000/000/000/000/000/000.tif and /dev/null differ
diff --git a/tests/data/raster_tiles/000/000/000/000/000/001.tif b/tests/data/raster_tiles/000/000/000/000/000/001.tif
deleted file mode 100644
index 67d3bb6..0000000
Binary files a/tests/data/raster_tiles/000/000/000/000/000/001.tif and /dev/null differ
diff --git a/tests/data/raster_tiles/000/000/001/000/000/000.tif b/tests/data/raster_tiles/000/000/001/000/000/000.tif
deleted file mode 100644
index 0868eea..0000000
Binary files a/tests/data/raster_tiles/000/000/001/000/000/000.tif and /dev/null differ
diff --git a/tests/data/raster_tiles/000/000/001/000/000/001.tif b/tests/data/raster_tiles/000/000/001/000/000/001.tif
deleted file mode 100644
index 95eee54..0000000
Binary files a/tests/data/raster_tiles/000/000/001/000/000/001.tif and /dev/null differ
diff --git a/tests/data/shp/arrows.dbf b/tests/data/shp/arrows.dbf
deleted file mode 100644
index 64b2c24..0000000
Binary files a/tests/data/shp/arrows.dbf and /dev/null differ
diff --git a/tests/data/shp/arrows.shp b/tests/data/shp/arrows.shp
deleted file mode 100644
index 27247e1..0000000
Binary files a/tests/data/shp/arrows.shp and /dev/null differ
diff --git a/tests/data/shp/arrows.shx b/tests/data/shp/arrows.shx
deleted file mode 100644
index f6038c9..0000000
Binary files a/tests/data/shp/arrows.shx and /dev/null differ
diff --git a/tests/data/shp/charplacement.dbf b/tests/data/shp/charplacement.dbf
deleted file mode 100644
index c143baa..0000000
Binary files a/tests/data/shp/charplacement.dbf and /dev/null differ
diff --git a/tests/data/shp/charplacement.shp b/tests/data/shp/charplacement.shp
deleted file mode 100644
index ccdfcf4..0000000
Binary files a/tests/data/shp/charplacement.shp and /dev/null differ
diff --git a/tests/data/shp/charplacement.shx b/tests/data/shp/charplacement.shx
deleted file mode 100644
index 65b8dab..0000000
Binary files a/tests/data/shp/charplacement.shx and /dev/null differ
diff --git a/tests/data/shp/displacement.dbf b/tests/data/shp/displacement.dbf
deleted file mode 100644
index 06ec320..0000000
Binary files a/tests/data/shp/displacement.dbf and /dev/null differ
diff --git a/tests/data/shp/displacement.shp b/tests/data/shp/displacement.shp
deleted file mode 100644
index 899b163..0000000
Binary files a/tests/data/shp/displacement.shp and /dev/null differ
diff --git a/tests/data/shp/displacement.shx b/tests/data/shp/displacement.shx
deleted file mode 100644
index 359820d..0000000
Binary files a/tests/data/shp/displacement.shx and /dev/null differ
diff --git a/tests/data/shp/farsi-labels.dbf b/tests/data/shp/farsi-labels.dbf
deleted file mode 100644
index 6b5d117..0000000
Binary files a/tests/data/shp/farsi-labels.dbf and /dev/null differ
diff --git a/tests/data/shp/farsi-labels.prj b/tests/data/shp/farsi-labels.prj
deleted file mode 100644
index a30c00a..0000000
--- a/tests/data/shp/farsi-labels.prj
+++ /dev/null
@@ -1 +0,0 @@
-GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
\ No newline at end of file
diff --git a/tests/data/shp/farsi-labels.shp b/tests/data/shp/farsi-labels.shp
deleted file mode 100644
index 5c2380e..0000000
Binary files a/tests/data/shp/farsi-labels.shp and /dev/null differ
diff --git a/tests/data/shp/farsi-labels.shx b/tests/data/shp/farsi-labels.shx
deleted file mode 100644
index 6fe17c7..0000000
Binary files a/tests/data/shp/farsi-labels.shx and /dev/null differ
diff --git a/tests/data/shp/long_lat.dbf b/tests/data/shp/long_lat.dbf
deleted file mode 100644
index d3716da..0000000
Binary files a/tests/data/shp/long_lat.dbf and /dev/null differ
diff --git a/tests/data/shp/long_lat.dbt b/tests/data/shp/long_lat.dbt
deleted file mode 100644
index 608c357..0000000
Binary files a/tests/data/shp/long_lat.dbt and /dev/null differ
diff --git a/tests/data/shp/long_lat.prj b/tests/data/shp/long_lat.prj
deleted file mode 100644
index a30c00a..0000000
--- a/tests/data/shp/long_lat.prj
+++ /dev/null
@@ -1 +0,0 @@
-GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
\ No newline at end of file
diff --git a/tests/data/shp/long_lat.shp b/tests/data/shp/long_lat.shp
deleted file mode 100644
index 0112cd7..0000000
Binary files a/tests/data/shp/long_lat.shp and /dev/null differ
diff --git a/tests/data/shp/long_lat.shx b/tests/data/shp/long_lat.shx
deleted file mode 100644
index cc0b42a..0000000
Binary files a/tests/data/shp/long_lat.shx and /dev/null differ
diff --git a/tests/data/shp/overlap.dbf b/tests/data/shp/overlap.dbf
deleted file mode 100644
index 566f81b..0000000
Binary files a/tests/data/shp/overlap.dbf and /dev/null differ
diff --git a/tests/data/shp/overlap.shp b/tests/data/shp/overlap.shp
deleted file mode 100644
index 7462a5b..0000000
Binary files a/tests/data/shp/overlap.shp and /dev/null differ
diff --git a/tests/data/shp/overlap.shx b/tests/data/shp/overlap.shx
deleted file mode 100644
index c6308ec..0000000
Binary files a/tests/data/shp/overlap.shx and /dev/null differ
diff --git a/tests/data/shp/points/ogr_zfield.dbf b/tests/data/shp/points/ogr_zfield.dbf
deleted file mode 100644
index b1d47b2..0000000
Binary files a/tests/data/shp/points/ogr_zfield.dbf and /dev/null differ
diff --git a/tests/data/shp/points/ogr_zfield.prj b/tests/data/shp/points/ogr_zfield.prj
deleted file mode 100644
index a30c00a..0000000
--- a/tests/data/shp/points/ogr_zfield.prj
+++ /dev/null
@@ -1 +0,0 @@
-GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
\ No newline at end of file
diff --git a/tests/data/shp/points/ogr_zfield.shp b/tests/data/shp/points/ogr_zfield.shp
deleted file mode 100644
index 6735df4..0000000
Binary files a/tests/data/shp/points/ogr_zfield.shp and /dev/null differ
diff --git a/tests/data/shp/points/ogr_zfield.shx b/tests/data/shp/points/ogr_zfield.shx
deleted file mode 100644
index e3b4576..0000000
Binary files a/tests/data/shp/points/ogr_zfield.shx and /dev/null differ
diff --git a/tests/data/shp/points/poi.dbf b/tests/data/shp/points/poi.dbf
deleted file mode 100644
index 797d92d..0000000
Binary files a/tests/data/shp/points/poi.dbf and /dev/null differ
diff --git a/tests/data/shp/points/poi.prj b/tests/data/shp/points/poi.prj
deleted file mode 100644
index 91f1f56..0000000
--- a/tests/data/shp/points/poi.prj
+++ /dev/null
@@ -1 +0,0 @@
-PROJCS["NAD_1983_HARN_StatePlane_North_Carolina_FIPS_3200_Feet",GEOGCS["GCS_North_American_1983_HARN",DATUM["D_North_American_1983_HARN",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",2000000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-79.0],PARAMETER["Standard_Parallel_1",34.33333333333334],PARAMETER["Standard_Parallel_2",36.16666666666666],PARAM [...]
\ No newline at end of file
diff --git a/tests/data/shp/points/poi.shp b/tests/data/shp/points/poi.shp
deleted file mode 100644
index de2ad34..0000000
Binary files a/tests/data/shp/points/poi.shp and /dev/null differ
diff --git a/tests/data/shp/points/poi.shx b/tests/data/shp/points/poi.shx
deleted file mode 100644
index 092e619..0000000
Binary files a/tests/data/shp/points/poi.shx and /dev/null differ
diff --git a/tests/data/shp/points/poi.zip b/tests/data/shp/points/poi.zip
deleted file mode 100644
index 66f40bc..0000000
Binary files a/tests/data/shp/points/poi.zip and /dev/null differ
diff --git a/tests/data/shp/points/poi_ogr.dbf b/tests/data/shp/points/poi_ogr.dbf
deleted file mode 100644
index 4706618..0000000
Binary files a/tests/data/shp/points/poi_ogr.dbf and /dev/null differ
diff --git a/tests/data/shp/points/poi_ogr.prj b/tests/data/shp/points/poi_ogr.prj
deleted file mode 100644
index 1bca7cc..0000000
--- a/tests/data/shp/points/poi_ogr.prj
+++ /dev/null
@@ -1 +0,0 @@
-PROJCS["NAD_1983_HARN_StatePlane_North_Carolina_FIPS_3200_Feet",GEOGCS["GCS_North_American_1983_HARN",DATUM["D_North_American_1983_HARN",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.017453292519943295]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",2000000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-79.0],PARAMETER["Standard_Parallel_1",34.33333333333334],PARAMETER["Standard_Parallel_2",36.16666666666666],PAR [...]
\ No newline at end of file
diff --git a/tests/data/shp/points/poi_ogr.shp b/tests/data/shp/points/poi_ogr.shp
deleted file mode 100644
index a50e78f..0000000
Binary files a/tests/data/shp/points/poi_ogr.shp and /dev/null differ
diff --git a/tests/data/shp/points/poi_ogr.shx b/tests/data/shp/points/poi_ogr.shx
deleted file mode 100644
index d05f21d..0000000
Binary files a/tests/data/shp/points/poi_ogr.shx and /dev/null differ
diff --git a/tests/data/shp/points/qgis.dbf b/tests/data/shp/points/qgis.dbf
deleted file mode 100644
index be97f7e..0000000
Binary files a/tests/data/shp/points/qgis.dbf and /dev/null differ
diff --git a/tests/data/shp/points/qgis.prj b/tests/data/shp/points/qgis.prj
deleted file mode 100644
index a30c00a..0000000
--- a/tests/data/shp/points/qgis.prj
+++ /dev/null
@@ -1 +0,0 @@
-GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
\ No newline at end of file
diff --git a/tests/data/shp/points/qgis.qpj b/tests/data/shp/points/qgis.qpj
deleted file mode 100644
index 5fbc831..0000000
--- a/tests/data/shp/points/qgis.qpj
+++ /dev/null
@@ -1 +0,0 @@
-GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]
diff --git a/tests/data/shp/points/qgis.shp b/tests/data/shp/points/qgis.shp
deleted file mode 100644
index c3c6351..0000000
Binary files a/tests/data/shp/points/qgis.shp and /dev/null differ
diff --git a/tests/data/shp/points/qgis.shx b/tests/data/shp/points/qgis.shx
deleted file mode 100644
index d7e2834..0000000
Binary files a/tests/data/shp/points/qgis.shx and /dev/null differ
diff --git a/tests/data/shp/points/qgis_multi.dbf b/tests/data/shp/points/qgis_multi.dbf
deleted file mode 100644
index 839e3b4..0000000
Binary files a/tests/data/shp/points/qgis_multi.dbf and /dev/null differ
diff --git a/tests/data/shp/points/qgis_multi.prj b/tests/data/shp/points/qgis_multi.prj
deleted file mode 100644
index a30c00a..0000000
--- a/tests/data/shp/points/qgis_multi.prj
+++ /dev/null
@@ -1 +0,0 @@
-GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
\ No newline at end of file
diff --git a/tests/data/shp/points/qgis_multi.qpj b/tests/data/shp/points/qgis_multi.qpj
deleted file mode 100644
index 5fbc831..0000000
--- a/tests/data/shp/points/qgis_multi.qpj
+++ /dev/null
@@ -1 +0,0 @@
-GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]
diff --git a/tests/data/shp/points/qgis_multi.shp b/tests/data/shp/points/qgis_multi.shp
deleted file mode 100644
index 53af804..0000000
Binary files a/tests/data/shp/points/qgis_multi.shp and /dev/null differ
diff --git a/tests/data/shp/points/qgis_multi.shx b/tests/data/shp/points/qgis_multi.shx
deleted file mode 100644
index 6c761fd..0000000
Binary files a/tests/data/shp/points/qgis_multi.shx and /dev/null differ
diff --git a/tests/data/shp/poly.dbf b/tests/data/shp/poly.dbf
deleted file mode 100644
index 277f8ff..0000000
Binary files a/tests/data/shp/poly.dbf and /dev/null differ
diff --git a/tests/data/shp/poly.prj b/tests/data/shp/poly.prj
deleted file mode 100644
index 1dc12b3..0000000
--- a/tests/data/shp/poly.prj
+++ /dev/null
@@ -1 +0,0 @@
-PROJCS["OSGB 1936 / British National Grid",GEOGCS["OSGB 1936",DATUM["D_OSGB_1936",SPHEROID["Airy_1830",6377563.396,299.3249646]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",-2],PARAMETER["scale_factor",0.9996012717],PARAMETER["false_easting",400000],PARAMETER["false_northing",-100000],UNIT["Meter",1]]
\ No newline at end of file
diff --git a/tests/data/shp/poly.shp b/tests/data/shp/poly.shp
deleted file mode 100644
index 9895153..0000000
Binary files a/tests/data/shp/poly.shp and /dev/null differ
diff --git a/tests/data/shp/poly.shx b/tests/data/shp/poly.shx
deleted file mode 100644
index 134898b..0000000
Binary files a/tests/data/shp/poly.shx and /dev/null differ
diff --git a/tests/data/shp/polylines.dbf b/tests/data/shp/polylines.dbf
deleted file mode 100755
index ecd2415..0000000
Binary files a/tests/data/shp/polylines.dbf and /dev/null differ
diff --git a/tests/data/shp/polylines.prj b/tests/data/shp/polylines.prj
deleted file mode 100755
index c49d9ed..0000000
--- a/tests/data/shp/polylines.prj
+++ /dev/null
@@ -1 +0,0 @@
-PROJCS["Spherical Mercator",GEOGCS["Unknown",DATUM["D_Unknown",SPHEROID["GRS80_Sphere_No_Flattening",6378137,0]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]]
\ No newline at end of file
diff --git a/tests/data/shp/polylines.shp b/tests/data/shp/polylines.shp
deleted file mode 100755
index aa1cf9c..0000000
Binary files a/tests/data/shp/polylines.shp and /dev/null differ
diff --git a/tests/data/shp/polylines.shx b/tests/data/shp/polylines.shx
deleted file mode 100755
index 5aecc01..0000000
Binary files a/tests/data/shp/polylines.shx and /dev/null differ
diff --git a/tests/data/shp/textspacing.dbf b/tests/data/shp/textspacing.dbf
deleted file mode 100644
index bd1b127..0000000
Binary files a/tests/data/shp/textspacing.dbf and /dev/null differ
diff --git a/tests/data/shp/textspacing.shp b/tests/data/shp/textspacing.shp
deleted file mode 100644
index 60dc7c0..0000000
Binary files a/tests/data/shp/textspacing.shp and /dev/null differ
diff --git a/tests/data/shp/textspacing.shx b/tests/data/shp/textspacing.shx
deleted file mode 100644
index 9c4767d..0000000
Binary files a/tests/data/shp/textspacing.shx and /dev/null differ
diff --git a/tests/data/shp/wkt_poly.dbf b/tests/data/shp/wkt_poly.dbf
deleted file mode 100644
index 09587db..0000000
Binary files a/tests/data/shp/wkt_poly.dbf and /dev/null differ
diff --git a/tests/data/shp/wkt_poly.shp b/tests/data/shp/wkt_poly.shp
deleted file mode 100644
index 207eb46..0000000
Binary files a/tests/data/shp/wkt_poly.shp and /dev/null differ
diff --git a/tests/data/shp/wkt_poly.shx b/tests/data/shp/wkt_poly.shx
deleted file mode 100644
index fc4b733..0000000
Binary files a/tests/data/shp/wkt_poly.shx and /dev/null differ
diff --git a/tests/data/sqlite/64bit_int.sqlite b/tests/data/sqlite/64bit_int.sqlite
deleted file mode 100644
index 2918dde..0000000
Binary files a/tests/data/sqlite/64bit_int.sqlite and /dev/null differ
diff --git a/tests/data/sqlite/business.sqlite b/tests/data/sqlite/business.sqlite
deleted file mode 100755
index fd8a246..0000000
Binary files a/tests/data/sqlite/business.sqlite and /dev/null differ
diff --git a/tests/data/sqlite/empty.db b/tests/data/sqlite/empty.db
deleted file mode 100644
index 98816e6..0000000
Binary files a/tests/data/sqlite/empty.db and /dev/null differ
diff --git a/tests/data/sqlite/qgis_spatiallite.sqlite b/tests/data/sqlite/qgis_spatiallite.sqlite
deleted file mode 100644
index ff9639b..0000000
Binary files a/tests/data/sqlite/qgis_spatiallite.sqlite and /dev/null differ
diff --git a/tests/data/sqlite/world.sqlite b/tests/data/sqlite/world.sqlite
deleted file mode 100644
index 802f2df..0000000
Binary files a/tests/data/sqlite/world.sqlite and /dev/null differ
diff --git a/tests/data/svg/README.md b/tests/data/svg/README.md
deleted file mode 100644
index 328d72a..0000000
--- a/tests/data/svg/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-Other good sources of svg for tests include:
-
- * http://intertwingly.net/svg/
- * http://www.w3.org/Graphics/SVG/Test/20110816/
- * http://croczilla.com/bits_and_pieces/svg/samples/
- * http://www.w3schools.com/svg/svg_examples.asp
\ No newline at end of file
diff --git a/tests/data/svg/box.svg b/tests/data/svg/box.svg
deleted file mode 100644
index a6ddb17..0000000
--- a/tests/data/svg/box.svg
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.1"
- width="10"
- height="9.9999971"
- id="svg6102">
- <g
- transform="translate(-240,-532.36218)"
- id="layer1">
- <rect
- width="10"
- height="9.9999971"
- x="240"
- y="532.36218"
- id="rect6613"
- style="opacity:0.5;color:#000000;fill:#00ccff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- </g>
-</svg>
\ No newline at end of file
diff --git a/tests/data/svg/crosshair16x16.svg b/tests/data/svg/crosshair16x16.svg
deleted file mode 100644
index 9a3ba9a..0000000
--- a/tests/data/svg/crosshair16x16.svg
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="16"
- height="16"
- id="svg2"
- version="1.1"
->
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <path
- style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 0,8 16,8"
- id="path4387"
- inkscape:path-effect="#path-effect4389"
- inkscape:original-d="M 0,8 16,8"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- inkscape:original-d="M 8,0 8,16"
- inkscape:path-effect="#path-effect4389"
- id="path4391"
- d="M 8,0 8,16"
- style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- </g>
-</svg>
diff --git a/tests/data/svg/ellipses.svg b/tests/data/svg/ellipses.svg
deleted file mode 100644
index 114cf9e..0000000
--- a/tests/data/svg/ellipses.svg
+++ /dev/null
@@ -1,118 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="100%"
- height="100%"
- version="1.1"
- id="svg2"
- inkscape:version="0.48.0 r9654"
- sodipodi:docname="ellipses.svg">
- <metadata
- id="metadata16">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <sodipodi:namedview
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1"
- objecttolerance="10"
- gridtolerance="10"
- guidetolerance="10"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:window-width="1280"
- inkscape:window-height="758"
- id="namedview14"
- showgrid="false"
- inkscape:zoom="21.841736"
- inkscape:cx="-11.26864"
- inkscape:cy="1072.9165"
- inkscape:window-x="0"
- inkscape:window-y="0"
- inkscape:window-maximized="1"
- inkscape:current-layer="svg2" />
- <defs
- id="defs12">
- <linearGradient
- collect="always"
- id="linearGradient3775"
- x1="0"
- y1="-30"
- x2="0"
- y2="-10"
- gradientUnits="userSpaceOnUse">
- <stop
- style="stop-color:#008000;stop-opacity:1;"
- offset="0"
- id="stop3771" />
- <stop
- style="stop-color:#008000;stop-opacity:0;"
- offset="1"
- id="stop3773" />
- </linearGradient>
- <radialGradient
- collect="always"
- id="radialGradient3765"
- cx="-2.5"
- cy="-22.5"
- fx="0.5"
- fy="-20.5"
- r="5"
- gradientUnits="userSpaceOnUse">
- <stop
- style="stop-color:#ff0000;stop-opacity:1;"
- offset="0"
- id="stop3761" />
- <stop
- id="stop3764"
- offset="0.5"
- style="stop-color:#ff4040;stop-opacity:1;" />
- <stop
- id="stop3767"
- offset="0.6"
- style="stop-color:#80ff80;stop-opacity:1;" />
- <stop
- style="stop-color:#ffacac;stop-opacity:1;"
- offset="0.75"
- id="stop3762" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop3763" />
- </radialGradient>
- </defs>
- <ellipse
- cy="-20"
- rx="10"
- ry="4"
- fill="green"
- id="ellipse4"
- style="fill-opacity:1;fill:url(#linearGradient3775)" />
- <ellipse
- cy="-20"
- rx="4"
- ry="10"
- fill="blue"
- id="ellipse6" />
- <circle
- cy="-20"
- r="5"
- stroke="green"
- stroke-width=".4"
- fill="red"
- id="circle8"
- style="fill-opacity:1;fill:url(#radialGradient3765);stroke-width:0.40000000000000002;stroke-miterlimit:4;stroke-dasharray:none" />
-</svg>
diff --git a/tests/data/svg/linepattern.svg b/tests/data/svg/linepattern.svg
deleted file mode 100644
index 147cdf5..0000000
--- a/tests/data/svg/linepattern.svg
+++ /dev/null
@@ -1,97 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="12"
- height="5"
- id="svg2"
- inkscape:label="Pozadí"
- version="1.1"
- inkscape:version="0.48.4 r9939"
- sodipodi:docname="Nový dokument 1">
- <defs
- id="defs3" />
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="63.356767"
- inkscape:cx="5.6969231"
- inkscape:cy="-1.2203929"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showgrid="true"
- fit-margin-top="0"
- fit-margin-left="0"
- fit-margin-right="0"
- fit-margin-bottom="0"
- inkscape:window-width="1920"
- inkscape:window-height="1052"
- inkscape:window-x="0"
- inkscape:window-y="0"
- inkscape:window-maximized="1">
- <inkscape:grid
- type="xygrid"
- id="grid2984"
- empspacing="1"
- visible="true"
- enabled="true"
- snapvisiblegridlinesonly="true"
- originx="-18px"
- originy="-2.3841865e-07px" />
- </sodipodi:namedview>
- <metadata
- id="metadata6">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Vrstva 1"
- inkscape:groupmode="layer"
- id="layer1"
- transform="translate(-18,-1047.3622)">
- <rect
- style="fill:#000000"
- id="rect2986"
- width="12"
- height="1"
- x="18"
- y="4"
- transform="translate(0,1047.3622)" />
- <path
- style="fill:#000000;fill-opacity:1;stroke:none"
- d="m 26,1052.3622 2,-5 2,5 z"
- id="path3792"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc" />
- <path
- sodipodi:type="arc"
- style="fill:#000000;fill-opacity:1;stroke:none"
- id="path3806"
- sodipodi:cx="22"
- sodipodi:cy="9"
- sodipodi:rx="2"
- sodipodi:ry="2"
- d="m 20.00001,8.9935833 c 0.0035,-1.1045638 0.901843,-1.9971168 2.006407,-1.993573 1.097565,0.00352 1.987227,0.8909156 1.99355,1.9884679 L 22,9 z"
- transform="translate(-0.97858528,1042.3746)"
- sodipodi:start="3.144801"
- sodipodi:end="6.2774244" />
- </g>
-</svg>
diff --git a/tests/data/svg/octocat.svg b/tests/data/svg/octocat.svg
deleted file mode 100644
index 1f88326..0000000
--- a/tests/data/svg/octocat.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-0.2 -1 379 334">
- <path id="puddle" fill="#9CDAF1" d="m296.94 295.43c0 20.533-47.56 37.176-106.22 37.176-58.67 0-106.23-16.643-106.23-37.176s47.558-37.18 106.23-37.18c58.66 0 106.22 16.65 106.22 37.18z"/>
- <g id="shadow-legs" fill="#7DBBE6">
- <path d="m161.85 331.22v-26.5c0-3.422-.619-6.284-1.653-8.701 6.853 5.322 7.316 18.695 7.316 18.695v17.004c6.166.481 12.534.773 19.053.861l-.172-16.92c-.944-23.13-20.769-25.961-20.769-25.961-7.245-1.645-7.137 1.991-6.409 4.34-7.108-12.122-26.158-10.556-26.158-10.556-6.611 2.357-.475 6.607-.475 6.607 10.387 3.775 11.33 15.105 11.33 15.105v23.622c5.72.98 11.71 1.79 17.94 2.4z"/>
- <path d="m245.4 283.48s-19.053-1.566-26.16 10.559c.728-2.35.839-5.989-6.408-4.343 0 0-19.824 2.832-20.768 25.961l-.174 16.946c6.509-.025 12.876-.254 19.054-.671v-17.219s.465-13.373 7.316-18.695c-1.034 2.417-1.653 5.278-1.653 8.701v26.775c6.214-.544 12.211-1.279 17.937-2.188v-24.113s.944-11.33 11.33-15.105c0-.01 6.13-4.26-.48-6.62z"/>
- </g>
- <path id="cat" d="m378.18 141.32l.28-1.389c-31.162-6.231-63.141-6.294-82.487-5.49 3.178-11.451 4.134-24.627 4.134-39.32 0-21.073-7.917-37.931-20.77-50.759 2.246-7.25 5.246-23.351-2.996-43.963 0 0-14.541-4.617-47.431 17.396-12.884-3.22-26.596-4.81-40.328-4.81-15.109 0-30.376 1.924-44.615 5.83-33.94-23.154-48.923-18.411-48.923-18.411-9.78 24.457-3.733 42.566-1.896 47.063-11.495 12.406-18.513 28.243-18.513 47.659 0 14.658 1.669 27.808 5.745 39.237-19.511-.71-50.323-.437-80.373 5.572l.276 1 [...]
- <path id="face" fill="#F4CBB2" d="m258.19 94.132c9.231 8.363 14.631 18.462 14.631 29.343 0 50.804-37.872 52.181-84.585 52.181-46.721 0-84.589-7.035-84.589-52.181 0-10.809 5.324-20.845 14.441-29.174 15.208-13.881 40.946-6.531 70.147-6.531 29.07-.004 54.72-7.429 69.95 6.357z"/>
- <path id="eyes" fill="#FFF" d="m160.1 126.06 c0 13.994-7.88 25.336-17.6 25.336-9.72 0-17.6-11.342-17.6-25.336 0-13.992 7.88-25.33 17.6-25.33 9.72.01 17.6 11.34 17.6 25.33z m94.43 0 c0 13.994-7.88 25.336-17.6 25.336-9.72 0-17.6-11.342-17.6-25.336 0-13.992 7.88-25.33 17.6-25.33 9.72.01 17.6 11.34 17.6 25.33z"/>
- <g fill="#AD5C51">
- <path id="pupils" d="m154.46 126.38 c0 9.328-5.26 16.887-11.734 16.887s-11.733-7.559-11.733-16.887c0-9.331 5.255-16.894 11.733-16.894 6.47 0 11.73 7.56 11.73 16.89z m94.42 0 c0 9.328-5.26 16.887-11.734 16.887s-11.733-7.559-11.733-16.887c0-9.331 5.255-16.894 11.733-16.894 6.47 0 11.73 7.56 11.73 16.89z"/>
- <circle id="nose" cx="188.5" cy="148.56" r="4.401"/>
- <path id="mouth" d="m178.23 159.69c-.26-.738.128-1.545.861-1.805.737-.26 1.546.128 1.805.861 1.134 3.198 4.167 5.346 7.551 5.346s6.417-2.147 7.551-5.346c.26-.738 1.067-1.121 1.805-.861s1.121 1.067.862 1.805c-1.529 4.324-5.639 7.229-10.218 7.229s-8.68-2.89-10.21-7.22z"/>
- </g>
- <path id="octo" fill="#C3E4D8" d="m80.641 179.82 c0 1.174-1.376 2.122-3.07 2.122-1.693 0-3.07-.948-3.07-2.122 0-1.175 1.377-2.127 3.07-2.127 1.694 0 3.07.95 3.07 2.13z m8.5 4.72 c0 1.174-1.376 2.122-3.07 2.122-1.693 0-3.07-.948-3.07-2.122 0-1.175 1.377-2.127 3.07-2.127 1.694 0 3.07.95 3.07 2.13z m5.193 6.14 c0 1.174-1.376 2.122-3.07 2.122-1.693 0-3.07-.948-3.07-2.122 0-1.175 1.377-2.127 3.07-2.127 1.694 0 3.07.95 3.07 2.13z m4.72 7.08 c0 1.174-1.376 2.122-3.07 2.122-1.693 0-3.07-.948-3. [...]
- <path id="drop" fill="#9CDAF1" d="m69.369 186.12l-3.066 10.683s-.8 3.861 2.84 4.546c3.8-.074 3.486-3.627 3.223-4.781z"/>
-</svg>
\ No newline at end of file
diff --git a/tests/data/svg/place-of-worship-24.svg b/tests/data/svg/place-of-worship-24.svg
deleted file mode 100644
index ac31795..0000000
--- a/tests/data/svg/place-of-worship-24.svg
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.1">
- <g transform="translate(0,-1028.3622)">
- <g transform="translate(-6.0000014,-118)"
- style="display:inline">
- <path
- style="opacity:0.3;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 18.5,1150.3622 c 0,0 -2.5,1 -2.5,2 0,0.6667 0,1.3958 0,2 0,1 -2,1 -2,2 0,2.3333 0,9 0,9 l 9,0 c 0,0 0,-6.6667 0,-9 0,-1 -2,-1 -2,-2.1875 0,-0.6042 0,-1.2083 0,-1.8125 0,-1 -2.5,-2 -2.5,-2 z m -8.5,8 c 0,2.3333 0,7 0,7 l 2,0 c 0,0 0,-4.6667 0,-7 0,-1 -1,-1 -1,-1 0,0 -1,0 -1,1 z m 15,0 c 0,2.3333 0,7 0,7 l 2,0 c 0,0 0,-4.6667 0,-7 0,-1 -1,-1 -1,-1 0,0 -1,0 -1,1 z"/>
- <g transform="translate(0,24)">
- <g />
- <rect
- style="opacity:0.5;color:#000000;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
- id="rect8822"
- width="24"
- height="24.000017"
- x="6.0000014"
- y="1122.3622" />
- </g>
- <path
- d="m 18.5,1150.3622 c 0,0 -2.5,1 -2.5,2 0,0.6667 0,1.3958 0,2 0,1 -2,1 -2,2 0,2.3333 0,9 0,9 l 9,0 c 0,0 0,-6.6667 0,-9 0,-1 -2,-1 -2,-2.1875 0,-0.6042 0,-1.2083 0,-1.8125 0,-1 -2.5,-2 -2.5,-2 z m -8.5,8 c 0,2.3333 0,7 0,7 l 2,0 c 0,0 0,-4.6667 0,-7 0,-1 -1,-1 -1,-1 0,0 -1,0 -1,1 z m 15,0 c 0,2.3333 0,7 0,7 l 2,0 c 0,0 0,-4.6667 0,-7 0,-1 -1,-1 -1,-1 0,0 -1,0 -1,1 z"
- style="color:#000000;fill:#444444;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- </g>
- </g>
-</svg>
diff --git a/tests/data/svg/point.svg b/tests/data/svg/point.svg
deleted file mode 100644
index bb71f43..0000000
--- a/tests/data/svg/point.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-
-<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
-
-<circle cx="0" cy="0" r="50" stroke="green" stroke-width=".4" fill="red"/>
-
-</svg>
-
diff --git a/tests/data/svg/point_sm.svg b/tests/data/svg/point_sm.svg
deleted file mode 100644
index 2a47ccf..0000000
--- a/tests/data/svg/point_sm.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-
-<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
-
-<circle cx="0" cy="0" r="10" fill="red"/>
-
-</svg>
-
diff --git a/tests/data/svg/radial.svg b/tests/data/svg/radial.svg
deleted file mode 100644
index 1dc3dcc..0000000
--- a/tests/data/svg/radial.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- width="500"
- height="500"
- version="1.1" >
-
- <radialGradient id="rad" >
- <stop style="stop-color:#000000;stop-opacity:1;" offset="0" />
- <stop style="stop-color:#000000;stop-opacity:0;" offset="1" />
- </radialGradient>
-
- <circle fill="url(#rad)" cx="250" cy="250" r="250"/>
-</svg>
diff --git a/tests/data/svg/radial_combo.svg b/tests/data/svg/radial_combo.svg
deleted file mode 100644
index 27a454d..0000000
--- a/tests/data/svg/radial_combo.svg
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- width="500"
- height="500"
- id="svg2"
- version="1.1" >
-
- <radialGradient id="rad1" cx="0%" cy="0%" r="100%">
- <stop style="stop-color:#888888;stop-opacity:1;" offset="0" />
- <stop style="stop-color:#000000;stop-opacity:0;" offset="1" />
- </radialGradient>
- <radialGradient id="rad2" gradientUnits="userSpaceOnUse" cx="0" cy="0" r="100">
- <stop style="stop-color:#FF0000;stop-opacity:1;" offset="0" />
- <stop style="stop-color:#000000;stop-opacity:0;" offset="1" />
- </radialGradient>
- <radialGradient id="rad3" cx="0" cy="1" r="1">
- <stop style="stop-color:#00FF00;stop-opacity:1;" offset="0" />
- <stop style="stop-color:#000000;stop-opacity:0;" offset="1" />
- </radialGradient>
- <radialGradient id="rad4" gradientUnits="userSpaceOnUse" cx="50%" cy="50%" r="50%">
- <stop style="stop-color:#0000FF;stop-opacity:1;" offset="0" />
- <stop style="stop-color:#000000;stop-opacity:0;" offset="1" />
- </radialGradient>
-
- <circle fill="url(#rad1)" cx="50" cy="50" r="50"/>
- <circle fill="url(#rad2)" cx="-50" cy="50" r="50"/>
- <circle fill="url(#rad3)" cx="50" cy="-50" r="50"/>
- <circle fill="url(#rad4)" cx="-50" cy="-50" r="50"/>
-
-</svg>
diff --git a/tests/data/svg/rect.svg b/tests/data/svg/rect.svg
deleted file mode 100644
index e05c3ba..0000000
--- a/tests/data/svg/rect.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-
-<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
-
-<rect width="20" height="15" style="fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,0)" />
-
-</svg>
\ No newline at end of file
diff --git a/tests/data/svg/rect2.svg b/tests/data/svg/rect2.svg
deleted file mode 100644
index 3790707..0000000
--- a/tests/data/svg/rect2.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- version="1.1"
- width="10"
- height="9.9999971"
- id="svg6102">
- <defs
- id="defs6104" />
- <metadata
- id="metadata6107">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- transform="translate(-240,-532.36218)"
- id="layer1">
- <rect
- width="10"
- height="9.9999971"
- x="240"
- y="532.36218"
- id="rect6613"
- style="opacity:.5;color:#000000;fill:red;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- </g>
-</svg>
\ No newline at end of file
diff --git a/tests/data/svg/transparent_circle.svg b/tests/data/svg/transparent_circle.svg
deleted file mode 100644
index ac5ec6c..0000000
--- a/tests/data/svg/transparent_circle.svg
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="76"
- height="76"
- id="svg2"
- version="1.1"
- inkscape:version="0.48.4 r9939"
- sodipodi:docname="transparent_circle.svg">
- <defs
- id="defs4" />
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="3.8563637"
- inkscape:cx="-7.6522455"
- inkscape:cy="37.99942"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showgrid="false"
- fit-margin-top="0"
- fit-margin-left="0"
- fit-margin-right="0"
- fit-margin-bottom="0"
- inkscape:window-width="1920"
- inkscape:window-height="1056"
- inkscape:window-x="0"
- inkscape:window-y="24"
- inkscape:window-maximized="1" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1"
- transform="translate(-82.01339,-82.93304)">
- <path
- sodipodi:type="arc"
- style="fill:#4682b4;fill-opacity:0.2;fill-rule:evenodd;stroke:#ffff00;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.3;stroke-dasharray:none;stroke-dashoffset:0"
- id="path2985"
- sodipodi:cx="257.14285"
- sodipodi:cy="295.21933"
- sodipodi:rx="30"
- sodipodi:ry="30"
- d="m 287.14285,295.21933 c 0,16.56854 -13.43145,30 -30,30 -16.56854,0 -30,-13.43146 -30,-30 0,-16.56854 13.43146,-30 30,-30 16.56855,0 30,13.43146 30,30 z"
- transform="translate(-137.14286,-174.28571)" />
- </g>
-</svg>
diff --git a/tests/data/vrt/points.vrt b/tests/data/vrt/points.vrt
deleted file mode 100644
index e40d870..0000000
--- a/tests/data/vrt/points.vrt
+++ /dev/null
@@ -1,8 +0,0 @@
-<OGRVRTDataSource>
- <OGRVRTLayer name="points">
- <SrcDataSource relativeToVRT="1">../csv/points.csv</SrcDataSource>
- <GeometryType>wkbPoint</GeometryType>
- <LayerSRS>WGS84</LayerSRS>
- <GeometryField encoding="PointFromColumns" x="x" y="y"/>
- </OGRVRTLayer>
-</OGRVRTDataSource>
\ No newline at end of file
diff --git a/tests/data/warning_maps/line_pattern_symbolizer_broken.xml b/tests/data/warning_maps/line_pattern_symbolizer_broken.xml
deleted file mode 100644
index 2f2763f..0000000
--- a/tests/data/warning_maps/line_pattern_symbolizer_broken.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84 +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2">
- <Style name="some_style">
- <Rule>
- <LinePatternSymbolizer file="foo.png"/>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/warning_maps/missing_icon.xml b/tests/data/warning_maps/missing_icon.xml
deleted file mode 100644
index fa1f091..0000000
--- a/tests/data/warning_maps/missing_icon.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84 +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2">
- <Style name="some_style">
- <Rule>
- <PolygonPatternSymbolizer file="/no/shuch/icon.png"/>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/data/warning_maps/point_symbolizer_broken.xml b/tests/data/warning_maps/point_symbolizer_broken.xml
deleted file mode 100644
index 98c22a8..0000000
--- a/tests/data/warning_maps/point_symbolizer_broken.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=merc +datum=WGS84 +k=1.0 +units=m +over +no_defs" minimum-version="0.7.2">
- <Style name="some_style">
- <Rule>
- <PointSymbolizer file="foo.png"/>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/python_tests/__init__.py b/tests/python_tests/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/tests/python_tests/agg_rasterizer_integer_overflow_test.py b/tests/python_tests/agg_rasterizer_integer_overflow_test.py
deleted file mode 100644
index 9b723fe..0000000
--- a/tests/python_tests/agg_rasterizer_integer_overflow_test.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from nose.tools import *
-from utilities import run_all
-import mapnik
-import json
-
-# geojson box of the world
-geojson = { "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -17963313.143242701888084, -6300857.11560364998877 ], [ -17963313.143242701888084, 13071343.332991421222687 ], [ 7396658.353099936619401, 13071343.332991421222687 ], [ 7396658.353099936619401, -6300857.11560364998877 ], [ -17963313.143242701888084, -6300857.11560364998877 ] ] ] } }
-
-def test_that_coordinates_do_not_overflow_and_polygon_is_rendered():
- expected_color = mapnik.Color('white')
- ds = mapnik.MemoryDatasource()
- context = mapnik.Context()
- ds.add_feature(mapnik.Feature.from_geojson(json.dumps(geojson),context))
- s = mapnik.Style()
- r = mapnik.Rule()
- sym = mapnik.PolygonSymbolizer()
- sym.fill = expected_color
- sym.clip = False
- r.symbols.append(sym)
- s.rules.append(r)
- lyr = mapnik.Layer('Layer')
- lyr.datasource = ds
- lyr.styles.append('style')
- m = mapnik.Map(256,256)
- m.background_color = mapnik.Color('black')
- m.append_style('style',s)
- m.layers.append(lyr)
- # 17/20864/45265.png
- m.zoom_to_box(mapnik.Box2d(-13658379.710221574,6197514.253362091,-13657768.213995293,6198125.749588372))
- # works 15/5216/11316.png
- #m.zoom_to_box(mapnik.Box2d(-13658379.710221574,6195679.764683247,-13655933.72531645,6198125.749588372))
- im = mapnik.Image(256,256)
- mapnik.render(m,im)
- eq_(im.get_pixel(128,128),expected_color.packed())
-
-if __name__ == "__main__":
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/box2d_test.py b/tests/python_tests/box2d_test.py
deleted file mode 100644
index 601b6df..0000000
--- a/tests/python_tests/box2d_test.py
+++ /dev/null
@@ -1,177 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import os
-from nose.tools import *
-from utilities import execution_path, run_all
-import mapnik
-
-def test_coord_init():
- c = mapnik.Coord(100, 100)
-
- eq_(c.x, 100)
- eq_(c.y, 100)
-
-def test_coord_multiplication():
- c = mapnik.Coord(100, 100)
- c *= 2
-
- eq_(c.x, 200)
- eq_(c.y, 200)
-
-def test_envelope_init():
- e = mapnik.Box2d(100, 100, 200, 200)
-
- assert_true(e.contains(100, 100))
- assert_true(e.contains(100, 200))
- assert_true(e.contains(200, 200))
- assert_true(e.contains(200, 100))
-
- assert_true(e.contains(e.center()))
-
- assert_false(e.contains(99.9, 99.9))
- assert_false(e.contains(99.9, 200.1))
- assert_false(e.contains(200.1, 200.1))
- assert_false(e.contains(200.1, 99.9))
-
- eq_(e.width(), 100)
- eq_(e.height(), 100)
-
- eq_(e.minx, 100)
- eq_(e.miny, 100)
-
- eq_(e.maxx, 200)
- eq_(e.maxy, 200)
-
- eq_(e[0],100)
- eq_(e[1],100)
- eq_(e[2],200)
- eq_(e[3],200)
- eq_(e[0],e[-4])
- eq_(e[1],e[-3])
- eq_(e[2],e[-2])
- eq_(e[3],e[-1])
-
- c = e.center()
-
- eq_(c.x, 150)
- eq_(c.y, 150)
-
-def test_envelope_static_init():
- e = mapnik.Box2d.from_string('100 100 200 200')
- e2 = mapnik.Box2d.from_string('100,100,200,200')
- e3 = mapnik.Box2d.from_string('100 , 100 , 200 , 200')
- eq_(e,e2)
- eq_(e,e3)
-
- assert_true(e.contains(100, 100))
- assert_true(e.contains(100, 200))
- assert_true(e.contains(200, 200))
- assert_true(e.contains(200, 100))
-
- assert_true(e.contains(e.center()))
-
- assert_false(e.contains(99.9, 99.9))
- assert_false(e.contains(99.9, 200.1))
- assert_false(e.contains(200.1, 200.1))
- assert_false(e.contains(200.1, 99.9))
-
- eq_(e.width(), 100)
- eq_(e.height(), 100)
-
- eq_(e.minx, 100)
- eq_(e.miny, 100)
-
- eq_(e.maxx, 200)
- eq_(e.maxy, 200)
-
- eq_(e[0],100)
- eq_(e[1],100)
- eq_(e[2],200)
- eq_(e[3],200)
- eq_(e[0],e[-4])
- eq_(e[1],e[-3])
- eq_(e[2],e[-2])
- eq_(e[3],e[-1])
-
- c = e.center()
-
- eq_(c.x, 150)
- eq_(c.y, 150)
-
-def test_envelope_multiplication():
- # no width then no impact of multiplication
- a = mapnik.Box2d(100, 100, 100, 100)
- a *= 5
- eq_(a.minx,100)
- eq_(a.miny,100)
- eq_(a.maxx,100)
- eq_(a.maxy,100)
-
- a = mapnik.Box2d(100.0, 100.0, 100.0, 100.0)
- a *= 5
- eq_(a.minx,100)
- eq_(a.miny,100)
- eq_(a.maxx,100)
- eq_(a.maxy,100)
-
- a = mapnik.Box2d(100.0, 100.0, 100.001, 100.001)
- a *= 5
- assert_almost_equal(a.minx, 99.9979, places=3)
- assert_almost_equal(a.miny, 99.9979, places=3)
- assert_almost_equal(a.maxx, 100.0030, places=3)
- assert_almost_equal(a.maxy, 100.0030, places=3)
-
- e = mapnik.Box2d(100, 100, 200, 200)
- e *= 2
- eq_(e.minx,50)
- eq_(e.miny,50)
- eq_(e.maxx,250)
- eq_(e.maxy,250)
-
- assert_true(e.contains(50, 50))
- assert_true(e.contains(50, 250))
- assert_true(e.contains(250, 250))
- assert_true(e.contains(250, 50))
-
- assert_false(e.contains(49.9, 49.9))
- assert_false(e.contains(49.9, 250.1))
- assert_false(e.contains(250.1, 250.1))
- assert_false(e.contains(250.1, 49.9))
-
- assert_true(e.contains(e.center()))
-
- eq_(e.width(), 200)
- eq_(e.height(), 200)
-
- eq_(e.minx, 50)
- eq_(e.miny, 50)
-
- eq_(e.maxx, 250)
- eq_(e.maxy, 250)
-
- c = e.center()
-
- eq_(c.x, 150)
- eq_(c.y, 150)
-
-def test_envelope_clipping():
- e1 = mapnik.Box2d(-180,-90,180,90)
- e2 = mapnik.Box2d(-120,40,-110,48)
- e1.clip(e2)
- eq_(e1,e2)
-
- # madagascar in merc
- e1 = mapnik.Box2d(4772116.5490, -2744395.0631, 5765186.4203, -1609458.0673)
- e2 = mapnik.Box2d(5124338.3753, -2240522.1727, 5207501.8621, -2130452.8520)
- e1.clip(e2)
- eq_(e1,e2)
-
- # nz in lon/lat
- e1 = mapnik.Box2d(163.8062, -47.1897, 179.3628, -33.9069)
- e2 = mapnik.Box2d(173.7378, -39.6395, 174.4849, -38.9252)
- e1.clip(e2)
- eq_(e1,e2)
-
-if __name__ == "__main__":
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/buffer_clear_test.py b/tests/python_tests/buffer_clear_test.py
deleted file mode 100644
index 495acff..0000000
--- a/tests/python_tests/buffer_clear_test.py
+++ /dev/null
@@ -1,63 +0,0 @@
-import sys
-import os, mapnik
-from timeit import Timer, time
-from nose.tools import *
-from utilities import execution_path, run_all
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def test_clearing_image_data():
- im = mapnik.Image(256,256)
- # make sure it equals itself
- bytes = im.tostring()
- eq_(im.tostring(),bytes)
- # set background, then clear
- im.background = mapnik.Color('green')
- eq_(im.tostring()!=bytes,True)
- # clear image, should now equal original
- im.clear()
- eq_(im.tostring(),bytes)
-
-def make_map():
- ds = mapnik.MemoryDatasource()
- context = mapnik.Context()
- context.push('Name')
- pixel_key = 1
- f = mapnik.Feature(context,pixel_key)
- f['Name'] = str(pixel_key)
- f.add_geometries_from_wkt('POLYGON ((0 0, 0 256, 256 256, 256 0, 0 0))')
- ds.add_feature(f)
- s = mapnik.Style()
- r = mapnik.Rule()
- symb = mapnik.PolygonSymbolizer()
- r.symbols.append(symb)
- s.rules.append(r)
- lyr = mapnik.Layer('Places')
- lyr.datasource = ds
- lyr.styles.append('places_labels')
- width,height = 256,256
- m = mapnik.Map(width,height)
- m.append_style('places_labels',s)
- m.layers.append(lyr)
- m.zoom_all()
- return m
-
-if mapnik.has_grid_renderer():
- def test_clearing_grid_data():
- g = mapnik.Grid(256,256)
- utf = g.encode()
- # make sure it equals itself
- eq_(g.encode(),utf)
- m = make_map()
- mapnik.render_layer(m,g,layer=0,fields=['__id__','Name'])
- eq_(g.encode()!=utf,True)
- # clear grid, should now match original
- g.clear()
- eq_(g.encode(),utf)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/cairo_test.py b/tests/python_tests/cairo_test.py
deleted file mode 100644
index 9a4771a..0000000
--- a/tests/python_tests/cairo_test.py
+++ /dev/null
@@ -1,196 +0,0 @@
-#!/usr/bin/env python
-
-import os
-import shutil
-import mapnik
-from nose.tools import *
-from utilities import execution_path, run_all
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def make_tmp_map():
- m = mapnik.Map(512,512)
- m.background_color = mapnik.Color('steelblue')
- ds = mapnik.MemoryDatasource()
- context = mapnik.Context()
- context.push('Name')
- f = mapnik.Feature(context,1)
- f['Name'] = 'Hello'
- f.add_geometries_from_wkt('POINT (0 0)')
- ds.add_feature(f)
- s = mapnik.Style()
- r = mapnik.Rule()
- sym = mapnik.MarkersSymbolizer()
- sym.allow_overlap = True
- r.symbols.append(sym)
- s.rules.append(r)
- lyr = mapnik.Layer('Layer')
- lyr.datasource = ds
- lyr.styles.append('style')
- m.append_style('style',s)
- m.layers.append(lyr)
- return m
-
-def draw_title(m,ctx,text,size=10,color=mapnik.Color('black')):
- """ Draw a Map Title near the top of a page."""
- middle = m.width/2.0
- ctx.set_source_rgba(*cairo_color(color))
- ctx.select_font_face("DejaVu Sans Book", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
- ctx.set_font_size(size)
- x_bearing, y_bearing, width, height = ctx.text_extents(text)[:4]
- ctx.move_to(middle - width / 2 - x_bearing, 20.0 - height / 2 - y_bearing)
- ctx.show_text(text)
-
-def draw_neatline(m,ctx):
- w,h = m.width, m.height
- ctx.set_source_rgba(*cairo_color(mapnik.Color('black')))
- outline = [
- [0,0],[w,0],[w,h],[0,h]
- ]
- ctx.set_line_width(1)
- for idx,pt in enumerate(outline):
- if (idx == 0):
- ctx.move_to(*pt)
- else:
- ctx.line_to(*pt)
- ctx.close_path()
- inset = 6
- inline = [
- [inset,inset],[w-inset,inset],[w-inset,h-inset],[inset,h-inset]
- ]
- ctx.set_line_width(inset/2)
- for idx,pt in enumerate(inline):
- if (idx == 0):
- ctx.move_to(*pt)
- else:
- ctx.line_to(*pt)
- ctx.close_path()
- ctx.stroke()
-
-def cairo_color(c):
- """ Return a Cairo color tuple from a Mapnik Color."""
- ctx_c = (c.r/255.0,c.g/255.0,c.b/255.0,c.a/255.0)
- return ctx_c
-
-if mapnik.has_pycairo():
- import cairo
-
- def test_passing_pycairo_context_svg():
- m = make_tmp_map()
- m.zoom_to_box(mapnik.Box2d(-180,-90,180,90))
- test_cairo_file = '/tmp/mapnik-cairo-context-test.svg'
- surface = cairo.SVGSurface(test_cairo_file, m.width, m.height)
- expected_cairo_file = './images/pycairo/cairo-cairo-expected.svg'
- context = cairo.Context(surface)
- mapnik.render(m,context)
- draw_title(m,context,"Hello Map",size=20)
- draw_neatline(m,context)
- surface.finish()
- if not os.path.exists(expected_cairo_file):
- print 'generated expected cairo surface file %s' % expected_cairo_file
- shutil.copy(test_cairo_file,expected_cairo_file)
- diff = abs(os.stat(expected_cairo_file).st_size-os.stat(test_cairo_file).st_size)
- msg = 'diff in size (%s) between actual (%s) and expected(%s)' % (diff,test_cairo_file,'tests/python_tests/'+ expected_cairo_file)
- eq_( diff < 1500, True, msg)
- os.remove(test_cairo_file)
-
- def test_passing_pycairo_context_pdf():
- m = make_tmp_map()
- m.zoom_to_box(mapnik.Box2d(-180,-90,180,90))
- test_cairo_file = '/tmp/mapnik-cairo-context-test.pdf'
- surface = cairo.PDFSurface(test_cairo_file, m.width, m.height)
- expected_cairo_file = './images/pycairo/cairo-cairo-expected.pdf'
- context = cairo.Context(surface)
- mapnik.render(m,context)
- draw_title(m,context,"Hello Map",size=20)
- draw_neatline(m,context)
- surface.finish()
- if not os.path.exists(expected_cairo_file):
- print 'generated expected cairo surface file %s' % expected_cairo_file
- shutil.copy(test_cairo_file,expected_cairo_file)
- diff = abs(os.stat(expected_cairo_file).st_size-os.stat(test_cairo_file).st_size)
- msg = 'diff in size (%s) between actual (%s) and expected(%s)' % (diff,test_cairo_file,'tests/python_tests/'+ expected_cairo_file)
- eq_( diff < 1500, True, msg)
- os.remove(test_cairo_file)
-
- def test_passing_pycairo_context_png():
- m = make_tmp_map()
- m.zoom_to_box(mapnik.Box2d(-180,-90,180,90))
- test_cairo_file = '/tmp/mapnik-cairo-context-test.png'
- surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, m.width, m.height)
- expected_cairo_file = './images/pycairo/cairo-cairo-expected.png'
- expected_cairo_file2 = './images/pycairo/cairo-cairo-expected-reduced.png'
- context = cairo.Context(surface)
- mapnik.render(m,context)
- draw_title(m,context,"Hello Map",size=20)
- draw_neatline(m,context)
- surface.write_to_png(test_cairo_file)
- reduced_color_image = test_cairo_file.replace('png','-mapnik.png')
- im = mapnik.Image.from_cairo(surface)
- im.save(reduced_color_image,'png8')
- surface.finish()
- if not os.path.exists(expected_cairo_file):
- print 'generated expected cairo surface file %s' % expected_cairo_file
- shutil.copy(test_cairo_file,expected_cairo_file)
- diff = abs(os.stat(expected_cairo_file).st_size-os.stat(test_cairo_file).st_size)
- msg = 'diff in size (%s) between actual (%s) and expected(%s)' % (diff,test_cairo_file,'tests/python_tests/'+ expected_cairo_file)
- eq_( diff < 500, True, msg)
- os.remove(test_cairo_file)
- if not os.path.exists(expected_cairo_file2):
- print 'generated expected cairo surface file %s' % expected_cairo_file2
- shutil.copy(reduced_color_image,expected_cairo_file2)
- diff = abs(os.stat(expected_cairo_file2).st_size-os.stat(reduced_color_image).st_size)
- msg = 'diff in size (%s) between actual (%s) and expected(%s)' % (diff,reduced_color_image,'tests/python_tests/'+ expected_cairo_file2)
- eq_( diff < 500, True, msg)
- os.remove(reduced_color_image)
-
- if 'sqlite' in mapnik.DatasourceCache.plugin_names():
- def _pycairo_surface(type,sym):
- test_cairo_file = '/tmp/mapnik-cairo-surface-test.%s.%s' % (sym,type)
- expected_cairo_file = './images/pycairo/cairo-surface-expected.%s.%s' % (sym,type)
- m = mapnik.Map(256,256)
- mapnik.load_map(m,'../data/good_maps/%s_symbolizer.xml' % sym)
- m.zoom_all()
- if hasattr(cairo,'%sSurface' % type.upper()):
- surface = getattr(cairo,'%sSurface' % type.upper())(test_cairo_file, m.width,m.height)
- mapnik.render(m, surface)
- surface.finish()
- if not os.path.exists(expected_cairo_file):
- print 'generated expected cairo surface file %s' % expected_cairo_file
- shutil.copy(test_cairo_file,expected_cairo_file)
- diff = abs(os.stat(expected_cairo_file).st_size-os.stat(test_cairo_file).st_size)
- msg = 'diff in size (%s) between actual (%s) and expected(%s)' % (diff,test_cairo_file,'tests/python_tests/'+ expected_cairo_file)
- if os.uname()[0] == 'Darwin':
- eq_( diff < 2100, True, msg)
- else:
- eq_( diff < 23000, True, msg)
- os.remove(test_cairo_file)
- return True
- else:
- print 'skipping cairo.%s test since surface is not available' % type.upper()
- return True
-
- def test_pycairo_svg_surface1():
- eq_(_pycairo_surface('svg','point'),True)
-
- def test_pycairo_svg_surface2():
- eq_(_pycairo_surface('svg','building'),True)
-
- def test_pycairo_svg_surface3():
- eq_(_pycairo_surface('svg','polygon'),True)
-
- def test_pycairo_pdf_surface1():
- eq_(_pycairo_surface('pdf','point'),True)
-
- def test_pycairo_pdf_surface2():
- eq_(_pycairo_surface('pdf','building'),True)
-
- def test_pycairo_pdf_surface3():
- eq_(_pycairo_surface('pdf','polygon'),True)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/compositing_test.py b/tests/python_tests/compositing_test.py
deleted file mode 100644
index 14b697b..0000000
--- a/tests/python_tests/compositing_test.py
+++ /dev/null
@@ -1,262 +0,0 @@
-#encoding: utf8
-
-from nose.tools import *
-import os,sys
-from utilities import execution_path, run_all, Todo
-from utilities import get_unique_colors, pixel2channels, side_by_side_image
-import mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def is_pre(color,alpha):
- return (color*255.0/alpha) <= 255
-
-def debug_image(image,step=2):
- for x in range(0,image.width(),step):
- for y in range(0,image.height(),step):
- pixel = image.get_pixel(x,y)
- red,green,blue,alpha = pixel2channels(pixel)
- print "rgba(%s,%s,%s,%s) at %s,%s" % (red,green,blue,alpha,x,y)
-
-def replace_style(m, name, style):
- m.remove_style(name)
- m.append_style(name, style)
-
-# note: it is impossible to know for all pixel colors
-# we can only detect likely cases of non premultiplied colors
-def validate_pixels_are_not_premultiplied(image):
- over_alpha = False
- transparent = True
- fully_opaque = True
- for x in range(0,image.width(),2):
- for y in range(0,image.height(),2):
- pixel = image.get_pixel(x,y)
- red,green,blue,alpha = pixel2channels(pixel)
- if alpha > 0:
- transparent = False
- if alpha < 255:
- fully_opaque = False
- color_max = max(red,green,blue)
- if color_max > alpha:
- over_alpha = True
- return over_alpha or transparent or fully_opaque
-
-def validate_pixels_are_not_premultiplied2(image):
- looks_not_multiplied = False
- for x in range(0,image.width(),2):
- for y in range(0,image.height(),2):
- pixel = image.get_pixel(x,y)
- red,green,blue,alpha = pixel2channels(pixel)
- #each value of the color channels will never be bigger than that of the alpha channel.
- if alpha > 0:
- if red > 0 and red > alpha:
- print 'red: %s, a: %s' % (red,alpha)
- looks_not_multiplied = True
- return looks_not_multiplied
-
-def validate_pixels_are_premultiplied(image):
- bad_pixels = []
- for x in range(0,image.width(),2):
- for y in range(0,image.height(),2):
- pixel = image.get_pixel(x,y)
- red,green,blue,alpha = pixel2channels(pixel)
- if alpha > 0:
- pixel = image.get_pixel(x,y)
- is_valid = ((0 <= red <= alpha) and is_pre(red,alpha)) \
- and ((0 <= green <= alpha) and is_pre(green,alpha)) \
- and ((0 <= blue <= alpha) and is_pre(blue,alpha)) \
- and (alpha >= 0 and alpha <= 255)
- if not is_valid:
- bad_pixels.append("rgba(%s,%s,%s,%s) at %s,%s" % (red,green,blue,alpha,x,y))
- num_bad = len(bad_pixels)
- return (num_bad == 0,bad_pixels)
-
-def test_compare_images():
- b = mapnik.Image.open('./images/support/b.png')
- b.premultiply()
- num_ops = len(mapnik.CompositeOp.names)
- successes = []
- fails = []
- for name in mapnik.CompositeOp.names:
- a = mapnik.Image.open('./images/support/a.png')
- a.premultiply()
- a.composite(b,getattr(mapnik.CompositeOp,name))
- actual = '/tmp/mapnik-comp-op-test-' + name + '.png'
- expected = 'images/composited/' + name + '.png'
- valid = validate_pixels_are_premultiplied(a)
- if not valid[0]:
- fails.append('%s not validly premultiplied!:\n\t %s pixels (%s)' % (name,len(valid[1]),valid[1][0]))
- a.demultiply()
- if not validate_pixels_are_not_premultiplied(a):
- fails.append('%s not validly demultiplied' % (name))
- a.save(actual,'png32')
- if not os.path.exists(expected):
- print 'generating expected test image: %s' % expected
- a.save(expected,'png32')
- expected_im = mapnik.Image.open(expected)
- # compare them
- if a.tostring('png32') == expected_im.tostring('png32'):
- successes.append(name)
- else:
- fails.append('failed comparing actual (%s) and expected(%s)' % (actual,'tests/python_tests/'+ expected))
- fail_im = side_by_side_image(expected_im, a)
- fail_im.save('/tmp/mapnik-comp-op-test-' + name + '.fail.png','png32')
- eq_(len(successes),num_ops,'\n'+'\n'.join(fails))
- b.demultiply()
- # b will be slightly modified by pre and then de multiplication rounding errors
- # TODO - write test to ensure the image is 99% the same.
- #expected_b = mapnik.Image.open('./images/support/b.png')
- #b.save('/tmp/mapnik-comp-op-test-original-mask.png')
- #eq_(b.tostring('png32'),expected_b.tostring('png32'), '/tmp/mapnik-comp-op-test-original-mask.png is no longer equivalent to original mask: ./images/support/b.png')
-
-def test_pre_multiply_status():
- b = mapnik.Image.open('./images/support/b.png')
- # not premultiplied yet, should appear that way
- result = validate_pixels_are_not_premultiplied(b)
- eq_(result,True)
- # not yet premultiplied therefore should return false
- result = validate_pixels_are_premultiplied(b)
- eq_(result[0],False)
- # now actually premultiply the pixels
- b.premultiply()
- # now checking if premultiplied should succeed
- result = validate_pixels_are_premultiplied(b)
- eq_(result[0],True)
- # should now not appear to look not premultiplied
- result = validate_pixels_are_not_premultiplied(b)
- eq_(result,False)
- # now actually demultiply the pixels
- b.demultiply()
- # should now appear demultiplied
- result = validate_pixels_are_not_premultiplied(b)
- eq_(result,True)
-
-def test_pre_multiply_status_of_map1():
- m = mapnik.Map(256,256)
- im = mapnik.Image(m.width,m.height)
- eq_(validate_pixels_are_not_premultiplied(im),True)
- mapnik.render(m,im)
- eq_(validate_pixels_are_not_premultiplied(im),True)
-
-def test_pre_multiply_status_of_map2():
- m = mapnik.Map(256,256)
- m.background = mapnik.Color(1,1,1,255)
- im = mapnik.Image(m.width,m.height)
- eq_(validate_pixels_are_not_premultiplied(im),True)
- mapnik.render(m,im)
- eq_(validate_pixels_are_not_premultiplied(im),True)
-
-if 'shape' in mapnik.DatasourceCache.plugin_names():
- def test_style_level_comp_op():
- m = mapnik.Map(256, 256)
- mapnik.load_map(m, '../data/good_maps/style_level_comp_op.xml')
- m.zoom_all()
- successes = []
- fails = []
- for name in mapnik.CompositeOp.names:
- # find_style returns a copy of the style object
- style_markers = m.find_style("markers")
- style_markers.comp_op = getattr(mapnik.CompositeOp, name)
- # replace the original style with the modified one
- replace_style(m, "markers", style_markers)
- im = mapnik.Image(m.width, m.height)
- mapnik.render(m, im)
- actual = '/tmp/mapnik-style-comp-op-' + name + '.png'
- expected = 'images/style-comp-op/' + name + '.png'
- im.save(actual,'png32')
- if not os.path.exists(expected):
- print 'generating expected test image: %s' % expected
- im.save(expected,'png32')
- expected_im = mapnik.Image.open(expected)
- # compare them
- if im.tostring('png32') == expected_im.tostring('png32'):
- successes.append(name)
- else:
- fails.append('failed comparing actual (%s) and expected(%s)' % (actual,'tests/python_tests/'+ expected))
- fail_im = side_by_side_image(expected_im, im)
- fail_im.save('/tmp/mapnik-style-comp-op-' + name + '.fail.png','png32')
- eq_(len(fails), 0, '\n'+'\n'.join(fails))
-
- def test_style_level_opacity():
- m = mapnik.Map(512,512)
- mapnik.load_map(m,'../data/good_maps/style_level_opacity_and_blur.xml')
- m.zoom_all()
- im = mapnik.Image(512,512)
- mapnik.render(m,im)
- actual = '/tmp/mapnik-style-level-opacity.png'
- expected = 'images/support/mapnik-style-level-opacity.png'
- im.save(actual,'png32')
- expected_im = mapnik.Image.open(expected)
- eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
-
-def test_rounding_and_color_expectations():
- m = mapnik.Map(1,1)
- m.background = mapnik.Color('rgba(255,255,255,.4999999)')
- im = mapnik.Image(m.width,m.height)
- mapnik.render(m,im)
- # ugh 252, see: https://github.com/mapnik/mapnik/issues/1519
- eq_(get_unique_colors(im),['rgba(252,252,252,127)'])
- m = mapnik.Map(1,1)
- m.background = mapnik.Color('rgba(255,255,255,.5)')
- im = mapnik.Image(m.width,m.height)
- mapnik.render(m,im)
- eq_(get_unique_colors(im),['rgba(253,253,253,128)'])
- im_file = mapnik.Image.open('../data/images/stripes_pattern.png')
- eq_(get_unique_colors(im_file),['rgba(0,0,0,0)', 'rgba(74,74,74,255)'])
- # should have no effect
- im_file.premultiply()
- eq_(get_unique_colors(im_file),['rgba(0,0,0,0)', 'rgba(74,74,74,255)'])
- im_file.set_alpha(.5)
- # should have effect now that image has transparency
- im_file.premultiply()
- eq_(get_unique_colors(im_file),['rgba(0,0,0,0)', 'rgba(37,37,37,127)'])
- # should restore to original nonpremultiplied colors
- im_file.demultiply()
- eq_(get_unique_colors(im_file),['rgba(0,0,0,0)', 'rgba(74,74,74,127)'])
-
-
-def test_background_image_and_background_color():
- m = mapnik.Map(8,8)
- m.background = mapnik.Color('rgba(255,255,255,.5)')
- m.background_image = '../data/images/stripes_pattern.png'
- im = mapnik.Image(m.width,m.height)
- mapnik.render(m,im)
- # note: data loss due to rounding as per https://github.com/mapnik/mapnik/issues/1519
- # means that background will roundtrip to 253 not 255
- #eq_(get_unique_colors(im),['rgba(255,255,255,128)', 'rgba(74,74,74,255)'])
- eq_(get_unique_colors(im),['rgba(253,253,253,128)', 'rgba(74,74,74,255)'])
-
-def test_background_image_with_alpha_and_background_color():
- m = mapnik.Map(10,10)
- m.background = mapnik.Color('rgba(255,255,255,.5)')
- m.background_image = '../data/images/yellow_half_trans.png'
- im = mapnik.Image(m.width,m.height)
- mapnik.render(m,im)
- eq_(get_unique_colors(im),['rgba(255,255,85,191)'])
-
-def test_background_image_with_alpha_and_background_color_against_composited_control():
- m = mapnik.Map(10,10)
- m.background = mapnik.Color('rgba(255,255,255,.5)')
- m.background_image = '../data/images/yellow_half_trans.png'
- im = mapnik.Image(m.width,m.height)
- mapnik.render(m,im)
- # create and composite the expected result
- im1 = mapnik.Image(10,10)
- im1.background = mapnik.Color('rgba(255,255,255,.5)')
- im1.premultiply()
- im2 = mapnik.Image(10,10)
- im2.background = mapnik.Color('rgba(255,255,0,.5)')
- im2.premultiply()
- im1.composite(im2)
- im1.demultiply()
- # compare image rendered (compositing in `agg_renderer<T>::setup`)
- # vs image composited via python bindings
- #raise Todo("looks like we need to investigate PNG color rounding when saving")
- #eq_(get_unique_colors(im),get_unique_colors(im1))
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/csv_test.py b/tests/python_tests/csv_test.py
deleted file mode 100644
index d871e77..0000000
--- a/tests/python_tests/csv_test.py
+++ /dev/null
@@ -1,607 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import glob
-import sys
-from nose.tools import *
-from utilities import execution_path
-
-import os, mapnik
-
-default_logging_severity = mapnik.logger.get_severity()
-
-def setup():
- # make the tests silent since we intentially test error conditions that are noisy
- mapnik.logger.set_severity(mapnik.severity_type.None)
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def teardown():
- mapnik.logger.set_severity(default_logging_severity)
-
-if 'csv' in mapnik.DatasourceCache.plugin_names():
-
- def get_csv_ds(filename):
- return mapnik.Datasource(type='csv',file=os.path.join('../data/csv/',filename))
-
- def test_broken_files(visual=False):
- broken = glob.glob("../data/csv/fails/*.*")
- broken.extend(glob.glob("../data/csv/warns/*.*"))
-
- # Add a filename that doesn't exist
- broken.append("../data/csv/fails/does_not_exist.csv")
-
- for csv in broken:
- throws = False
- if visual:
- try:
- ds = mapnik.Datasource(type='csv',file=csv,strict=True)
- print '\x1b[33mfailed\x1b[0m',csv
- except Exception:
- print '\x1b[1;32m✓ \x1b[0m', csv
-
- def test_good_files(visual=False):
- good_files = glob.glob("../data/csv/*.*")
- good_files.extend(glob.glob("../data/csv/warns/*.*"))
-
- for csv in good_files:
- if visual:
- try:
- ds = mapnik.Datasource(type='csv',file=csv)
- print '\x1b[1;32m✓ \x1b[0m', csv
- except Exception:
- print '\x1b[33mfailed\x1b[0m',csv
-
- def test_lon_lat_detection(**kwargs):
- ds = get_csv_ds('lon_lat.csv')
- eq_(len(ds.fields()),2)
- eq_(ds.fields(),['lon','lat'])
- eq_(ds.field_types(),['int','int'])
- query = mapnik.Query(ds.envelope())
- for fld in ds.fields():
- query.add_property_name(fld)
- fs = ds.features(query)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- feat = fs.next()
- attr = {'lon': 0, 'lat': 0}
- eq_(feat.attributes,attr)
-
- def test_lon_lat_detection(**kwargs):
- ds = get_csv_ds('lng_lat.csv')
- eq_(len(ds.fields()),2)
- eq_(ds.fields(),['lng','lat'])
- eq_(ds.field_types(),['int','int'])
- query = mapnik.Query(ds.envelope())
- for fld in ds.fields():
- query.add_property_name(fld)
- fs = ds.features(query)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- feat = fs.next()
- attr = {'lng': 0, 'lat': 0}
- eq_(feat.attributes,attr)
-
- def test_type_detection(**kwargs):
- ds = get_csv_ds('nypd.csv')
- eq_(ds.fields(),['Precinct','Phone','Address','City','geo_longitude','geo_latitude','geo_accuracy'])
- eq_(ds.field_types(),['str','str','str','str','float','float','str'])
- feat = ds.featureset().next()
- attr = {'City': u'New York, NY', 'geo_accuracy': u'house', 'Phone': u'(212) 334-0711', 'Address': u'19 Elizabeth Street', 'Precinct': u'5th Precinct', 'geo_longitude': -70, 'geo_latitude': 40}
- eq_(feat.attributes,attr)
- eq_(len(ds.all_features()),2)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(desc['name'],'csv')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
-
- def test_skipping_blank_rows(**kwargs):
- ds = get_csv_ds('blank_rows.csv')
- eq_(ds.fields(),['x','y','name'])
- eq_(ds.field_types(),['int','int','str'])
- eq_(len(ds.all_features()),2)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(desc['name'],'csv')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
-
- def test_empty_rows(**kwargs):
- ds = get_csv_ds('empty_rows.csv')
- eq_(len(ds.fields()),10)
- eq_(len(ds.field_types()),10)
- eq_(ds.fields(),['x', 'y', 'text', 'date', 'integer', 'boolean', 'float', 'time', 'datetime', 'empty_column'])
- eq_(ds.field_types(),['int', 'int', 'str', 'str', 'int', 'bool', 'float', 'str', 'str', 'str'])
- fs = ds.featureset()
- attr = {'x': 0, 'empty_column': u'', 'text': u'a b', 'float': 1.0, 'datetime': u'1971-01-01T04:14:00', 'y': 0, 'boolean': True, 'time': u'04:14:00', 'date': u'1971-01-01', 'integer': 40}
- first = True
- for feat in fs:
- if first:
- first=False
- eq_(feat.attributes,attr)
- eq_(len(feat),10)
- eq_(feat['empty_column'],u'')
-
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(desc['name'],'csv')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
-
- def test_slashes(**kwargs):
- ds = get_csv_ds('has_attributes_with_slashes.csv')
- eq_(len(ds.fields()),3)
- fs = ds.all_features()
- eq_(fs[0].attributes,{'x':0,'y':0,'name':u'a/a'})
- eq_(fs[1].attributes,{'x':1,'y':4,'name':u'b/b'})
- eq_(fs[2].attributes,{'x':10,'y':2.5,'name':u'c/c'})
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(desc['name'],'csv')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
-
- def test_wkt_field(**kwargs):
- ds = get_csv_ds('wkt.csv')
- eq_(len(ds.fields()),1)
- eq_(ds.fields(),['type'])
- eq_(ds.field_types(),['str'])
- fs = ds.all_features()
- eq_(len(fs[0].geometries()),1)
- eq_(fs[0].geometries()[0].type(),mapnik.DataGeometryType.Point)
- eq_(len(fs[1].geometries()),1)
- eq_(fs[1].geometries()[0].type(),mapnik.DataGeometryType.LineString)
- eq_(len(fs[2].geometries()),1)
- eq_(fs[2].geometries()[0].type(),mapnik.DataGeometryType.Polygon)
- eq_(len(fs[3].geometries()),1) # one geometry, two parts
- eq_(fs[3].geometries()[0].type(),mapnik.DataGeometryType.Polygon)
- eq_(len(fs[4].geometries()),4)
- eq_(fs[4].geometries()[0].type(),mapnik.DataGeometryType.Point)
- eq_(len(fs[5].geometries()),2)
- eq_(fs[5].geometries()[0].type(),mapnik.DataGeometryType.LineString)
- eq_(len(fs[6].geometries()),2)
- eq_(fs[6].geometries()[0].type(),mapnik.DataGeometryType.Polygon)
- eq_(len(fs[7].geometries()),2)
- eq_(fs[7].geometries()[0].type(),mapnik.DataGeometryType.Polygon)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Collection)
- eq_(desc['name'],'csv')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
-
- def test_handling_of_missing_header(**kwargs):
- ds = get_csv_ds('missing_header.csv')
- eq_(len(ds.fields()),6)
- eq_(ds.fields(),['one','two','x','y','_4','aftermissing'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['_4'],'missing')
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(desc['name'],'csv')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
-
- def test_handling_of_headers_that_are_numbers(**kwargs):
- ds = get_csv_ds('numbers_for_headers.csv')
- eq_(len(ds.fields()),5)
- eq_(ds.fields(),['x','y','1990','1991','1992'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['x'],0)
- eq_(feat['y'],0)
- eq_(feat['1990'],1)
- eq_(feat['1991'],2)
- eq_(feat['1992'],3)
-
- eq_(mapnik.Expression("[1991]=2").evaluate(feat),True)
-
- def test_quoted_numbers(**kwargs):
- ds = get_csv_ds('points.csv')
- eq_(len(ds.fields()),3)
- eq_(ds.fields(),['x','y','label'])
- fs = ds.all_features()
- eq_(fs[0]['label'],"0,0")
- eq_(fs[1]['label'],"5,5")
- eq_(fs[2]['label'],"0,5")
- eq_(fs[3]['label'],"5,0")
- eq_(fs[4]['label'],"2.5,2.5")
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(desc['name'],'csv')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
-
- def test_reading_windows_newlines(**kwargs):
- ds = get_csv_ds('windows_newlines.csv')
- eq_(len(ds.fields()),3)
- feats = ds.all_features()
- eq_(len(feats),1)
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['x'],1)
- eq_(feat['y'],10)
- eq_(feat['z'],9999.9999)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(desc['name'],'csv')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
-
- def test_reading_mac_newlines(**kwargs):
- ds = get_csv_ds('mac_newlines.csv')
- eq_(len(ds.fields()),3)
- feats = ds.all_features()
- eq_(len(feats),1)
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['x'],1)
- eq_(feat['y'],10)
- eq_(feat['z'],9999.9999)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(desc['name'],'csv')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
-
- def check_newlines(filename):
- ds = get_csv_ds(filename)
- eq_(len(ds.fields()),3)
- feats = ds.all_features()
- eq_(len(feats),1)
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['x'],0)
- eq_(feat['y'],0)
- eq_(feat['line'],'many\n lines\n of text\n with unix newlines')
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(desc['name'],'csv')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
-
- def test_mixed_mac_unix_newlines(**kwargs):
- check_newlines('mac_newlines_with_unix_inline.csv')
-
- def test_mixed_mac_unix_newlines_escaped(**kwargs):
- check_newlines('mac_newlines_with_unix_inline_escaped.csv')
-
- # To hard to support this case
- #def test_mixed_unix_windows_newlines(**kwargs):
- # check_newlines('unix_newlines_with_windows_inline.csv')
-
- # To hard to support this case
- #def test_mixed_unix_windows_newlines_escaped(**kwargs):
- # check_newlines('unix_newlines_with_windows_inline_escaped.csv')
-
- def test_mixed_windows_unix_newlines(**kwargs):
- check_newlines('windows_newlines_with_unix_inline.csv')
-
- def test_mixed_windows_unix_newlines_escaped(**kwargs):
- check_newlines('windows_newlines_with_unix_inline_escaped.csv')
-
- def test_tabs(**kwargs):
- ds = get_csv_ds('tabs_in_csv.csv')
- eq_(len(ds.fields()),3)
- eq_(ds.fields(),['x','y','z'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['x'],-122)
- eq_(feat['y'],48)
- eq_(feat['z'],0)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(desc['name'],'csv')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
-
- def test_separator_pipes(**kwargs):
- ds = get_csv_ds('pipe_delimiters.csv')
- eq_(len(ds.fields()),3)
- eq_(ds.fields(),['x','y','z'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['x'],0)
- eq_(feat['y'],0)
- eq_(feat['z'],'hello')
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(desc['name'],'csv')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
-
- def test_separator_semicolon(**kwargs):
- ds = get_csv_ds('semicolon_delimiters.csv')
- eq_(len(ds.fields()),3)
- eq_(ds.fields(),['x','y','z'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['x'],0)
- eq_(feat['y'],0)
- eq_(feat['z'],'hello')
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(desc['name'],'csv')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
-
- def test_that_null_and_bool_keywords_are_empty_strings(**kwargs):
- ds = get_csv_ds('nulls_and_booleans_as_strings.csv')
- eq_(len(ds.fields()),4)
- eq_(ds.fields(),['x','y','null','boolean'])
- eq_(ds.field_types(),['int', 'int', 'str', 'bool'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['x'],0)
- eq_(feat['y'],0)
- eq_(feat['null'],'null')
- eq_(feat['boolean'],True)
- feat = fs.next()
- eq_(feat['x'],0)
- eq_(feat['y'],0)
- eq_(feat['null'],'')
- eq_(feat['boolean'],False)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
-
- @raises(RuntimeError)
- def test_that_nonexistant_query_field_throws(**kwargs):
- ds = get_csv_ds('lon_lat.csv')
- eq_(len(ds.fields()),2)
- eq_(ds.fields(),['lon','lat'])
- eq_(ds.field_types(),['int','int'])
- query = mapnik.Query(ds.envelope())
- for fld in ds.fields():
- query.add_property_name(fld)
- # also add an invalid one, triggering throw
- query.add_property_name('bogus')
- fs = ds.features(query)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
-
- def test_that_leading_zeros_mean_strings(**kwargs):
- ds = get_csv_ds('leading_zeros.csv')
- eq_(len(ds.fields()),3)
- eq_(ds.fields(),['x','y','fips'])
- eq_(ds.field_types(),['int','int','str'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['x'],0)
- eq_(feat['y'],0)
- eq_(feat['fips'],'001')
- feat = fs.next()
- eq_(feat['x'],0)
- eq_(feat['y'],0)
- eq_(feat['fips'],'003')
- feat = fs.next()
- eq_(feat['x'],0)
- eq_(feat['y'],0)
- eq_(feat['fips'],'005')
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
-
- def test_advanced_geometry_detection(**kwargs):
- ds = get_csv_ds('point_wkt.csv')
- eq_(ds.describe()['geometry_type'],mapnik.DataGeometryType.Point)
- ds = get_csv_ds('poly_wkt.csv')
- eq_(ds.describe()['geometry_type'],mapnik.DataGeometryType.Polygon)
- ds = get_csv_ds('multi_poly_wkt.csv')
- eq_(ds.describe()['geometry_type'],mapnik.DataGeometryType.Polygon)
- ds = get_csv_ds('line_wkt.csv')
- eq_(ds.describe()['geometry_type'],mapnik.DataGeometryType.LineString)
-
- def test_creation_of_csv_from_in_memory_string(**kwargs):
- csv_string = '''
- wkt,Name
- "POINT (120.15 48.47)","Winthrop, WA"
- ''' # csv plugin will test lines <= 10 chars for being fully blank
- ds = mapnik.Datasource(**{"type":"csv","inline":csv_string})
- eq_(ds.describe()['geometry_type'],mapnik.DataGeometryType.Point)
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['Name'],u"Winthrop, WA")
-
- def test_creation_of_csv_from_in_memory_string_with_uft8(**kwargs):
- csv_string = '''
- wkt,Name
- "POINT (120.15 48.47)","Québec"
- ''' # csv plugin will test lines <= 10 chars for being fully blank
- ds = mapnik.Datasource(**{"type":"csv","inline":csv_string})
- eq_(ds.describe()['geometry_type'],mapnik.DataGeometryType.Point)
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['Name'],u"Québec")
-
- def validate_geojson_datasource(ds):
- eq_(len(ds.fields()),1)
- eq_(ds.fields(),['type'])
- eq_(ds.field_types(),['str'])
- fs = ds.all_features()
- eq_(len(fs[0].geometries()),1)
- eq_(fs[0].geometries()[0].type(),mapnik.DataGeometryType.Point)
- eq_(len(fs[1].geometries()),1)
- eq_(fs[1].geometries()[0].type(),mapnik.DataGeometryType.LineString)
- eq_(len(fs[2].geometries()),1)
- eq_(fs[2].geometries()[0].type(),mapnik.DataGeometryType.Polygon)
- eq_(len(fs[3].geometries()),1) # one geometry, two parts
- eq_(fs[3].geometries()[0].type(),mapnik.DataGeometryType.Polygon)
- eq_(len(fs[4].geometries()),4)
- eq_(fs[4].geometries()[0].type(),mapnik.DataGeometryType.Point)
- eq_(len(fs[5].geometries()),2)
- eq_(fs[5].geometries()[0].type(),mapnik.DataGeometryType.LineString)
- eq_(len(fs[6].geometries()),2)
- eq_(fs[6].geometries()[0].type(),mapnik.DataGeometryType.Polygon)
- eq_(len(fs[7].geometries()),2)
- eq_(fs[7].geometries()[0].type(),mapnik.DataGeometryType.Polygon)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Collection)
- eq_(desc['name'],'csv')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
-
- def test_json_field1(**kwargs):
- ds = get_csv_ds('geojson_double_quote_escape.csv')
- validate_geojson_datasource(ds)
-
- def test_json_field2(**kwargs):
- ds = get_csv_ds('geojson_single_quote.csv')
- validate_geojson_datasource(ds)
-
- def test_json_field3(**kwargs):
- ds = get_csv_ds('geojson_2x_double_quote_filebakery_style.csv')
- validate_geojson_datasource(ds)
-
- def test_that_blank_undelimited_rows_are_still_parsed(**kwargs):
- ds = get_csv_ds('more_headers_than_column_values.csv')
- eq_(len(ds.fields()),5)
- eq_(ds.fields(),['x','y','one', 'two','three'])
- eq_(ds.field_types(),['int','int','str','str','str'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['x'],0)
- eq_(feat['y'],0)
- eq_(feat['one'],'')
- eq_(feat['two'],'')
- eq_(feat['three'],'')
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
-
- @raises(RuntimeError)
- def test_that_fewer_headers_than_rows_throws(**kwargs):
- # this has invalid header # so throw
- ds = get_csv_ds('more_column_values_than_headers.csv')
-
- def test_that_feature_id_only_incremented_for_valid_rows(**kwargs):
- ds = mapnik.Datasource(type='csv',
- file=os.path.join('../data/csv/warns','feature_id_counting.csv'))
- eq_(len(ds.fields()),3)
- eq_(ds.fields(),['x','y','id'])
- eq_(ds.field_types(),['int','int','int'])
- fs = ds.featureset()
- # first
- feat = fs.next()
- eq_(feat['x'],0)
- eq_(feat['y'],0)
- eq_(feat['id'],1)
- # second, should have skipped bogus one
- feat = fs.next()
- eq_(feat['x'],0)
- eq_(feat['y'],0)
- eq_(feat['id'],2)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(len(ds.all_features()),2)
-
- def test_dynamically_defining_headers1(**kwargs):
- ds = mapnik.Datasource(type='csv',
- file=os.path.join('../data/csv/fails','needs_headers_two_lines.csv'),
- headers='x,y,name')
- eq_(len(ds.fields()),3)
- eq_(ds.fields(),['x','y','name'])
- eq_(ds.field_types(),['int','int','str'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['x'],0)
- eq_(feat['y'],0)
- eq_(feat['name'],'data_name')
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(len(ds.all_features()),2)
-
- def test_dynamically_defining_headers2(**kwargs):
- ds = mapnik.Datasource(type='csv',
- file=os.path.join('../data/csv/fails','needs_headers_one_line.csv'),
- headers='x,y,name')
- eq_(len(ds.fields()),3)
- eq_(ds.fields(),['x','y','name'])
- eq_(ds.field_types(),['int','int','str'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['x'],0)
- eq_(feat['y'],0)
- eq_(feat['name'],'data_name')
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(len(ds.all_features()),1)
-
- def test_dynamically_defining_headers3(**kwargs):
- ds = mapnik.Datasource(type='csv',
- file=os.path.join('../data/csv/fails','needs_headers_one_line_no_newline.csv'),
- headers='x,y,name')
- eq_(len(ds.fields()),3)
- eq_(ds.fields(),['x','y','name'])
- eq_(ds.field_types(),['int','int','str'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['x'],0)
- eq_(feat['y'],0)
- eq_(feat['name'],'data_name')
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(len(ds.all_features()),1)
-
- def test_that_64bit_int_fields_work(**kwargs):
- ds = get_csv_ds('64bit_int.csv')
- eq_(len(ds.fields()),3)
- eq_(ds.fields(),['x','y','bigint'])
- eq_(ds.field_types(),['int','int','int'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['bigint'],2147483648)
- feat = fs.next()
- eq_(feat['bigint'],9223372036854775807)
- eq_(feat['bigint'],0x7FFFFFFFFFFFFFFF)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(len(ds.all_features()),2)
-
- def test_various_number_types(**kwargs):
- ds = get_csv_ds('number_types.csv')
- eq_(len(ds.fields()),3)
- eq_(ds.fields(),['x','y','floats'])
- eq_(ds.field_types(),['int','int','float'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['floats'],.0)
- feat = fs.next()
- eq_(feat['floats'],+.0)
- feat = fs.next()
- eq_(feat['floats'],1e-06)
- feat = fs.next()
- eq_(feat['floats'],-1e-06)
- feat = fs.next()
- eq_(feat['floats'],0.000001)
- feat = fs.next()
- eq_(feat['floats'],1.234e+16)
- feat = fs.next()
- eq_(feat['floats'],1.234e+16)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(len(ds.all_features()),8)
-
- def test_manually_supplied_extent(**kwargs):
- csv_string = '''
- wkt,Name
- '''
- ds = mapnik.Datasource(**{"type":"csv","extent":"-180,-90,180,90","inline":csv_string})
- b = ds.envelope()
- eq_(b.minx,-180)
- eq_(b.miny,-90)
- eq_(b.maxx,180)
- eq_(b.maxy,90)
-
- def test_inline_geojson(**kwargs):
- csv_string = "geojson\n'{\"coordinates\":[-92.22568,38.59553],\"type\":\"Point\"}'"
- ds = mapnik.Datasource(**{"type":"csv","inline":csv_string})
- eq_(len(ds.fields()),0)
- eq_(ds.fields(),[])
- # FIXME - re-enable after https://github.com/mapnik/mapnik/issues/2319 is fixed
- #fs = ds.featureset()
- #feat = fs.next()
- #eq_(feat.num_geometries(),1)
-
-if __name__ == "__main__":
- setup()
- [eval(run)(visual=True) for run in dir() if 'test_' in run]
diff --git a/tests/python_tests/datasource_test.py b/tests/python_tests/datasource_test.py
deleted file mode 100644
index c86b829..0000000
--- a/tests/python_tests/datasource_test.py
+++ /dev/null
@@ -1,128 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import os, mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def test_that_datasources_exist():
- if len(mapnik.DatasourceCache.plugin_names()) == 0:
- print '***NOTICE*** - no datasource plugins have been loaded'
-
-def test_field_listing():
- if 'shape' in mapnik.DatasourceCache.plugin_names():
- ds = mapnik.Shapefile(file='../data/shp/poly.shp')
- fields = ds.fields()
- eq_(fields, ['AREA', 'EAS_ID', 'PRFEDEA'])
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Polygon)
- eq_(desc['name'],'shape')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
-
-def test_total_feature_count_shp():
- if 'shape' in mapnik.DatasourceCache.plugin_names():
- ds = mapnik.Shapefile(file='../data/shp/poly.shp')
- features = ds.all_features()
- num_feats = len(features)
- eq_(num_feats, 10)
-
-def test_total_feature_count_json():
- if 'ogr' in mapnik.DatasourceCache.plugin_names():
- ds = mapnik.Ogr(file='../data/json/points.geojson',layer_by_index=0)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(desc['name'],'ogr')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
- features = ds.all_features()
- num_feats = len(features)
- eq_(num_feats, 5)
-
-def test_sqlite_reading():
- if 'sqlite' in mapnik.DatasourceCache.plugin_names():
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',table_by_index=0)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Polygon)
- eq_(desc['name'],'sqlite')
- eq_(desc['type'],mapnik.DataType.Vector)
- eq_(desc['encoding'],'utf-8')
- features = ds.all_features()
- num_feats = len(features)
- eq_(num_feats, 245)
-
-def test_reading_json_from_string():
- json = open('../data/json/points.geojson','r').read()
- if 'ogr' in mapnik.DatasourceCache.plugin_names():
- ds = mapnik.Ogr(file=json,layer_by_index=0)
- features = ds.all_features()
- num_feats = len(features)
- eq_(num_feats, 5)
-
-def test_feature_envelope():
- if 'shape' in mapnik.DatasourceCache.plugin_names():
- ds = mapnik.Shapefile(file='../data/shp/poly.shp')
- features = ds.all_features()
- for feat in features:
- env = feat.envelope()
- contains = ds.envelope().contains(env)
- eq_(contains, True)
- intersects = ds.envelope().contains(env)
- eq_(intersects, True)
-
-def test_feature_attributes():
- if 'shape' in mapnik.DatasourceCache.plugin_names():
- ds = mapnik.Shapefile(file='../data/shp/poly.shp')
- features = ds.all_features()
- feat = features[0]
- attrs = {'PRFEDEA': u'35043411', 'EAS_ID': 168, 'AREA': 215229.266}
- eq_(feat.attributes, attrs)
- eq_(ds.fields(),['AREA', 'EAS_ID', 'PRFEDEA'])
- eq_(ds.field_types(),['float','int','str'])
-
-def test_ogr_layer_by_sql():
- if 'ogr' in mapnik.DatasourceCache.plugin_names():
- ds = mapnik.Ogr(file='../data/shp/poly.shp', layer_by_sql='SELECT * FROM poly WHERE EAS_ID = 168')
- features = ds.all_features()
- num_feats = len(features)
- eq_(num_feats, 1)
-
-def test_hit_grid():
- import os
- from itertools import groupby
-
- def rle_encode(l):
- """ encode a list of strings with run-length compression """
- return ["%d:%s" % (len(list(group)), name) for name, group in groupby(l)]
-
- m = mapnik.Map(256,256);
- try:
- mapnik.load_map(m,'../data/good_maps/agg_poly_gamma_map.xml');
- m.zoom_all()
- join_field = 'NAME'
- fg = [] # feature grid
- for y in range(0, 256, 4):
- for x in range(0, 256, 4):
- featureset = m.query_map_point(0,x,y)
- added = False
- for feature in featureset.features:
- fg.append(feature[join_field])
- added = True
- if not added:
- fg.append('')
- hit_list = '|'.join(rle_encode(fg))
- eq_(hit_list[:16],'730:|2:Greenland')
- eq_(hit_list[-12:],'1:Chile|812:')
- except RuntimeError, e:
- # only test datasources that we have installed
- if not 'Could not create datasource' in str(e):
- raise RuntimeError(str(e))
-
-
-if __name__ == '__main__':
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/datasource_xml_template_test.py b/tests/python_tests/datasource_xml_template_test.py
deleted file mode 100644
index 2a73bd5..0000000
--- a/tests/python_tests/datasource_xml_template_test.py
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import os
-from nose.tools import *
-from utilities import execution_path, run_all
-import mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def test_datasource_template_is_working():
- m = mapnik.Map(256,256)
- try:
- mapnik.load_map(m,'../data/good_maps/datasource.xml')
- except RuntimeError, e:
- if "Required parameter 'type'" in str(e):
- raise RuntimeError(e)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/extra_map_props_test.py b/tests/python_tests/extra_map_props_test.py
deleted file mode 100644
index 06d6596..0000000
--- a/tests/python_tests/extra_map_props_test.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import os, mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def test_arbitrary_parameters_attached_to_map():
- m = mapnik.Map(256,256)
- mapnik.load_map(m,'../data/good_maps/extra_arbitary_map_parameters.xml')
- eq_(len(m.parameters),6)
- eq_(m.parameters['key'],'value2')
- eq_(m.parameters['key3'],'value3')
- eq_(m.parameters['unicode'],u'iván')
- eq_(m.parameters['integer'],10)
- eq_(m.parameters['decimal'],.999)
- eq_(m.parameters['number-as-string'],u'.9998')
-
-
-def test_serializing_arbitrary_parameters():
- m = mapnik.Map(256,256)
- m.parameters.append(mapnik.Parameter('width',m.width))
- m.parameters.append(mapnik.Parameter('height',m.height))
-
- m2 = mapnik.Map(1,1)
- mapnik.load_map_from_string(m2,mapnik.save_map_to_string(m))
- eq_(m2.parameters['width'],m.width)
- eq_(m2.parameters['height'],m.height)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/feature_id_test.py b/tests/python_tests/feature_id_test.py
deleted file mode 100644
index cd8d85f..0000000
--- a/tests/python_tests/feature_id_test.py
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import os, sys, glob, mapnik
-import itertools
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def compare_shape_between_mapnik_and_ogr(shapefile,query=None):
- plugins = mapnik.DatasourceCache.plugin_names()
- if 'shape' in plugins and 'ogr' in plugins:
- ds1 = mapnik.Ogr(file=shapefile,layer_by_index=0)
- ds2 = mapnik.Shapefile(file=shapefile)
- if query:
- fs1 = ds1.features(query)
- fs2 = ds2.features(query)
- else:
- fs1 = ds1.featureset()
- fs2 = ds2.featureset()
- count = 0;
- for feat1,feat2 in itertools.izip(fs1,fs2):
- count += 1
- eq_(feat1.id(),feat2.id(),
- '%s : ogr feature id %s "%s" does not equal shapefile feature id %s "%s"'
- % (count,feat1.id(),str(feat1.attributes), feat2.id(),str(feat2.attributes)))
- return True
-
-
-def test_shapefile_line_featureset_id():
- compare_shape_between_mapnik_and_ogr('../data/shp/polylines.shp')
-
-def test_shapefile_polygon_featureset_id():
- compare_shape_between_mapnik_and_ogr('../data/shp/poly.shp')
-
-def test_shapefile_polygon_feature_query_id():
- bbox = (15523428.2632, 4110477.6323, -11218494.8310, 7495720.7404)
- query = mapnik.Query(mapnik.Box2d(*bbox))
- if 'ogr' in mapnik.DatasourceCache.plugin_names():
- ds = mapnik.Ogr(file='../data/shp/world_merc.shp',layer_by_index=0)
- for fld in ds.fields():
- query.add_property_name(fld)
- compare_shape_between_mapnik_and_ogr('../data/shp/world_merc.shp',query)
-
-def test_feature_hit_count():
- pass
- #raise Todo("need to optimize multigeom bbox handling in shapeindex: https://github.com/mapnik/mapnik/issues/783")
- # results in different results between shp and ogr!
- #bbox = (-14284551.8434, 2074195.1992, -7474929.8687, 8140237.7628)
- #bbox = (1113194.91,4512803.085,2226389.82,6739192.905)
- #query = mapnik.Query(mapnik.Box2d(*bbox))
- #if 'ogr' in mapnik.DatasourceCache.plugin_names():
- # ds1 = mapnik.Ogr(file='../data/shp/world_merc.shp',layer_by_index=0)
- # for fld in ds1.fields():
- # query.add_property_name(fld)
- # ds2 = mapnik.Shapefile(file='../data/shp/world_merc.shp')
- # count1 = len(ds1.features(query).features)
- # count2 = len(ds2.features(query).features)
- # eq_(count1,count2,"Feature count differs between OGR driver (%s features) and Shapefile Driver (%s features) when querying the same bbox" % (count1,count2))
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/feature_test.py b/tests/python_tests/feature_test.py
deleted file mode 100644
index 11f3f8a..0000000
--- a/tests/python_tests/feature_test.py
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-import itertools,sys
-import unittest
-from nose.tools import *
-from utilities import execution_path, run_all
-
-import mapnik
-from binascii import unhexlify
-
-def test_default_constructor():
- f = mapnik.Feature(mapnik.Context(),1)
- eq_(f is not None,True)
-
-def test_feature_geo_interface():
- ctx = mapnik.Context()
- feat = mapnik.Feature(ctx,1)
- feat.add_geometries_from_wkt('Point (0 0)')
- eq_(feat.__geo_interface__['geometry'],{u'type': u'Point', u'coordinates': [0, 0]})
-
-def test_python_extended_constructor():
- context = mapnik.Context()
- context.push('foo')
- context.push('foo')
- f = mapnik.Feature(context,1)
- wkt = 'POLYGON ((35 10, 10 20, 15 40, 45 45, 35 10),(20 30, 35 35, 30 20, 20 30))'
- f.add_geometries_from_wkt(wkt)
- f['foo'] = 'bar'
- eq_(f['foo'], 'bar')
- eq_(f.envelope(),mapnik.Box2d(10.0,10.0,45.0,45.0))
- # reset
- f['foo'] = u"avión"
- eq_(f['foo'], u"avión")
- f['foo'] = 1.4
- eq_(f['foo'], 1.4)
- f['foo'] = True
- eq_(f['foo'], True)
-
-def test_add_geom_wkb():
-# POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10))
- wkb = '010300000001000000050000000000000000003e4000000000000024400000000000002440000000000000344000000000000034400000000000004440000000000000444000000000000044400000000000003e400000000000002440'
- context = mapnik.Context()
- f = mapnik.Feature(context,1)
- eq_(len(f.geometries()), 0)
- f.add_geometries_from_wkb(unhexlify(wkb))
- eq_(len(f.geometries()), 1)
- e = mapnik.Box2d()
- eq_(e.valid(), False)
- for g in f.geometries():
- if not e.valid():
- e = g.envelope()
- else:
- e +=g.envelope()
-
- eq_(e, f.envelope())
-
-def test_feature_expression_evaluation():
- context = mapnik.Context()
- context.push('name')
- f = mapnik.Feature(context,1)
- f['name'] = 'a'
- eq_(f['name'],u'a')
- expr = mapnik.Expression("[name]='a'")
- evaluated = expr.evaluate(f)
- eq_(evaluated,True)
- num_attributes = len(f)
- eq_(num_attributes,1)
- eq_(f.id(),1)
-
-# https://github.com/mapnik/mapnik/issues/933
-def test_feature_expression_evaluation_missing_attr():
- context = mapnik.Context()
- context.push('name')
- f = mapnik.Feature(context,1)
- f['name'] = u'a'
- eq_(f['name'],u'a')
- expr = mapnik.Expression("[fielddoesnotexist]='a'")
- eq_(f.has_key('fielddoesnotexist'),False)
- try:
- evaluated = expr.evaluate(f)
- except Exception, e:
- eq_("Key does not exist" in str(e),True)
- num_attributes = len(f)
- eq_(num_attributes,1)
- eq_(f.id(),1)
-
-# https://github.com/mapnik/mapnik/issues/934
-def test_feature_expression_evaluation_attr_with_spaces():
- context = mapnik.Context()
- context.push('name with space')
- f = mapnik.Feature(context,1)
- f['name with space'] = u'a'
- eq_(f['name with space'],u'a')
- expr = mapnik.Expression("[name with space]='a'")
- eq_(str(expr),"([name with space]='a')")
- eq_(expr.evaluate(f),True)
-
-# https://github.com/mapnik/mapnik/issues/2390
- at raises(RuntimeError)
-def test_feature_from_geojson():
- ctx = mapnik.Context()
- inline_string = """
- {
- "geometry" : {
- "coordinates" : [ 0,0 ]
- "type" : "Point"
- },
- "type" : "Feature",
- "properties" : {
- "this":"that"
- "known":"nope because missing comma"
- }
- }
- """
- feat = mapnik.Feature.from_geojson(inline_string,ctx)
-
-if __name__ == "__main__":
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/filter_test.py b/tests/python_tests/filter_test.py
deleted file mode 100644
index bf80fd9..0000000
--- a/tests/python_tests/filter_test.py
+++ /dev/null
@@ -1,445 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from nose.tools import *
-from utilities import run_all
-import mapnik
-
-if hasattr(mapnik,'Expression'):
- mapnik.Filter = mapnik.Expression
-
-map_ = '''<Map>
- <Style name="s">
- <Rule>
- <Filter><![CDATA[(([region]>=0) and ([region]<=50))]]></Filter>
- </Rule>
- <Rule>
- <Filter><![CDATA[([region]>=0) and ([region]<=50)]]></Filter>
- </Rule>
- <Rule>
- <Filter>
-
- <![CDATA[
-
- ([region] >= 0)
-
- and
-
- ([region] <= 50)
- ]]>
-
- </Filter>
- </Rule>
- <Rule>
- <Filter>([region]>=0) and ([region]<=50)</Filter>
- </Rule>
- <Rule>
- <Filter>
- ([region] >= 0)
- and
- ([region] <= 50)
- </Filter>
- </Rule>
-
- </Style>
- <Style name="s2" filter-mode="first">
- <Rule>
- </Rule>
- <Rule>
- </Rule>
- </Style>
-</Map>'''
-
-def test_filter_init():
- m = mapnik.Map(1,1)
- mapnik.load_map_from_string(m,map_)
- filters = []
- filters.append(mapnik.Filter("([region]>=0) and ([region]<=50)"))
- filters.append(mapnik.Filter("(([region]>=0) and ([region]<=50))"))
- filters.append(mapnik.Filter("((([region]>=0) and ([region]<=50)))"))
- filters.append(mapnik.Filter('((([region]>=0) and ([region]<=50)))'))
- filters.append(mapnik.Filter('''((([region]>=0) and ([region]<=50)))'''))
- filters.append(mapnik.Filter('''
- ((([region]>=0)
- and
- ([region]<=50)))
- '''))
- filters.append(mapnik.Filter('''
- ([region]>=0)
- and
- ([region]<=50)
- '''))
- filters.append(mapnik.Filter('''
- ([region]
- >=
- 0)
- and
- ([region]
- <=
- 50)
- '''))
-
- s = m.find_style('s')
-
- for r in s.rules:
- filters.append(r.filter)
-
- first = filters[0]
- for f in filters:
- eq_(str(first),str(f))
-
- s = m.find_style('s2')
-
- eq_(s.filter_mode,mapnik.filter_mode.FIRST)
-
-
-def test_geometry_type_eval():
- # clashing field called 'mapnik::geometry'
- context2 = mapnik.Context()
- context2.push('mapnik::geometry_type')
- f = mapnik.Feature(context2,0)
- f["mapnik::geometry_type"] = 'sneaky'
- expr = mapnik.Expression("[mapnik::geometry_type]")
- eq_(expr.evaluate(f),0)
-
- expr = mapnik.Expression("[mapnik::geometry_type]")
- context = mapnik.Context()
-
- # no geometry
- f = mapnik.Feature(context,0)
- eq_(expr.evaluate(f),0)
- eq_(mapnik.Expression("[mapnik::geometry_type]=0").evaluate(f),True)
-
- # POINT = 1
- f = mapnik.Feature(context,0)
- f.add_geometries_from_wkt('POINT(10 40)')
- eq_(expr.evaluate(f),1)
- eq_(mapnik.Expression("[mapnik::geometry_type]=point").evaluate(f),True)
-
- # LINESTRING = 2
- f = mapnik.Feature(context,0)
- f.add_geometries_from_wkt('LINESTRING (30 10, 10 30, 40 40)')
- eq_(expr.evaluate(f),2)
- eq_(mapnik.Expression("[mapnik::geometry_type]=linestring").evaluate(f),True)
-
- # POLYGON = 3
- f = mapnik.Feature(context,0)
- f.add_geometries_from_wkt('POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10))')
- eq_(expr.evaluate(f),3)
- eq_(mapnik.Expression("[mapnik::geometry_type]=polygon").evaluate(f),True)
-
- # COLLECTION = 4
- f = mapnik.Feature(context,0)
- f.add_geometries_from_wkt('GEOMETRYCOLLECTION(POLYGON((1 1,2 1,2 2,1 2,1 1)),POINT(2 3),LINESTRING(2 3,3 4))')
- eq_(expr.evaluate(f),4)
- eq_(mapnik.Expression("[mapnik::geometry_type]=collection").evaluate(f),True)
-
-def test_regex_match():
- context = mapnik.Context()
- context.push('name')
- f = mapnik.Feature(context,0)
- f["name"] = 'test'
- expr = mapnik.Expression("[name].match('test')")
- eq_(expr.evaluate(f),True) # 1 == True
-
-def test_unicode_regex_match():
- context = mapnik.Context()
- context.push('name')
- f = mapnik.Feature(context,0)
- f["name"] = 'Québec'
- expr = mapnik.Expression("[name].match('Québec')")
- eq_(expr.evaluate(f),True) # 1 == True
-
-def test_regex_replace():
- context = mapnik.Context()
- context.push('name')
- f = mapnik.Feature(context,0)
- f["name"] = 'test'
- expr = mapnik.Expression("[name].replace('(\B)|( )','$1 ')")
- eq_(expr.evaluate(f),'t e s t')
-
-def test_unicode_regex_replace_to_str():
- expr = mapnik.Expression("[name].replace('(\B)|( )','$1 ')")
- eq_(str(expr),"[name].replace('(\B)|( )','$1 ')")
-
-def test_unicode_regex_replace():
- context = mapnik.Context()
- context.push('name')
- f = mapnik.Feature(context,0)
- f["name"] = 'Québec'
- expr = mapnik.Expression("[name].replace('(\B)|( )','$1 ')")
- # will fail if -DBOOST_REGEX_HAS_ICU is not defined
- eq_(expr.evaluate(f), u'Q u é b e c')
-
-def test_float_precision():
- context = mapnik.Context()
- context.push('num')
- f = mapnik.Feature(context,0)
- f["num1"] = 1.0000
- f["num2"] = 1.0001
- eq_(f["num1"],1.0000)
- eq_(f["num2"],1.0001)
- expr = mapnik.Expression("[num1] = 1.0000")
- eq_(expr.evaluate(f),True)
- expr = mapnik.Expression("[num1].match('1')")
- eq_(expr.evaluate(f),True)
- expr = mapnik.Expression("[num2] = 1.0001")
- eq_(expr.evaluate(f),True)
- expr = mapnik.Expression("[num2].match('1.0001')")
- eq_(expr.evaluate(f),True)
-
-def test_string_matching_on_precision():
- context = mapnik.Context()
- context.push('num')
- f = mapnik.Feature(context,0)
- f["num"] = "1.0000"
- eq_(f["num"],"1.0000")
- expr = mapnik.Expression("[num].match('.*(^0|00)$')")
- eq_(expr.evaluate(f),True)
-
-def test_creation_of_null_value():
- context = mapnik.Context()
- context.push('nv')
- f = mapnik.Feature(context,0)
- f["nv"] = None
- eq_(f["nv"],None)
- eq_(f["nv"] is None,True)
- # test boolean
- f["nv"] = 0
- eq_(f["nv"],0)
- eq_(f["nv"] is not None,True)
-
-def test_creation_of_bool():
- context = mapnik.Context()
- context.push('bool')
- f = mapnik.Feature(context,0)
- f["bool"] = True
- eq_(f["bool"],True)
- # TODO - will become int of 1 do to built in boost python conversion
- # https://github.com/mapnik/mapnik/issues/1873
- eq_(isinstance(f["bool"],bool) or isinstance(f["bool"],long),True)
- f["bool"] = False
- eq_(f["bool"],False)
- eq_(isinstance(f["bool"],bool) or isinstance(f["bool"],long),True)
- # test NoneType
- f["bool"] = None
- eq_(f["bool"],None)
- eq_(isinstance(f["bool"],bool) or isinstance(f["bool"],long),False)
- # test integer
- f["bool"] = 0
- eq_(f["bool"],0)
- # https://github.com/mapnik/mapnik/issues/1873
- # ugh, boost_python's built into converter does not work right
- #eq_(isinstance(f["bool"],bool),False)
-
-null_equality = [
- ['hello',False,unicode],
- [u'',False,unicode],
- [0,False,long],
- [123,False,long],
- [0.0,False,float],
- [123.123,False,float],
- [.1,False,float],
- [False,False,long], # TODO - should become bool: https://github.com/mapnik/mapnik/issues/1873
- [True,False,long], # TODO - should become bool: https://github.com/mapnik/mapnik/issues/1873
- [None,True,None],
- [2147483648,False,long],
- [922337203685477580,False,long]
-]
-
-def test_expressions_with_null_equality():
- for eq in null_equality:
- context = mapnik.Context()
- f = mapnik.Feature(context,0)
- f["prop"] = eq[0]
- eq_(f["prop"],eq[0])
- if eq[0] is None:
- eq_(f["prop"] is None, True)
- else:
- eq_(isinstance(f['prop'],eq[2]),True,'%s is not an instance of %s' % (f['prop'],eq[2]))
- expr = mapnik.Expression("[prop] = null")
- eq_(expr.evaluate(f),eq[1])
- expr = mapnik.Expression("[prop] is null")
- eq_(expr.evaluate(f),eq[1])
-
-def test_expressions_with_null_equality2():
- for eq in null_equality:
- context = mapnik.Context()
- f = mapnik.Feature(context,0)
- f["prop"] = eq[0]
- eq_(f["prop"],eq[0])
- if eq[0] is None:
- eq_(f["prop"] is None, True)
- else:
- eq_(isinstance(f['prop'],eq[2]),True,'%s is not an instance of %s' % (f['prop'],eq[2]))
- # TODO - support `is not` syntax:
- # https://github.com/mapnik/mapnik/issues/796
- expr = mapnik.Expression("not [prop] is null")
- eq_(expr.evaluate(f),not eq[1])
- # https://github.com/mapnik/mapnik/issues/1642
- expr = mapnik.Expression("[prop] != null")
- eq_(expr.evaluate(f),not eq[1])
-
-truthyness = [
- [u'hello',True,unicode],
- [u'',False,unicode],
- [0,False,long],
- [123,True,long],
- [0.0,False,float],
- [123.123,True,float],
- [.1,True,float],
- [False,False,long], # TODO - should become bool: https://github.com/mapnik/mapnik/issues/1873
- [True,True,long], # TODO - should become bool: https://github.com/mapnik/mapnik/issues/1873
- [None,False,None],
- [2147483648,True,long],
- [922337203685477580,True,long]
-]
-
-def test_expressions_for_thruthyness():
- context = mapnik.Context()
- for eq in truthyness:
- f = mapnik.Feature(context,0)
- f["prop"] = eq[0]
- eq_(f["prop"],eq[0])
- if eq[0] is None:
- eq_(f["prop"] is None, True)
- else:
- eq_(isinstance(f['prop'],eq[2]),True,'%s is not an instance of %s' % (f['prop'],eq[2]))
- expr = mapnik.Expression("[prop]")
- eq_(expr.to_bool(f),eq[1])
- expr = mapnik.Expression("not [prop]")
- eq_(expr.to_bool(f),not eq[1])
- expr = mapnik.Expression("! [prop]")
- eq_(expr.to_bool(f),not eq[1])
- # also test if feature does not have property at all
- f2 = mapnik.Feature(context,1)
- # no property existing will return value_null since
- # https://github.com/mapnik/mapnik/commit/562fada9d0f680f59b2d9f396c95320a0d753479#include/mapnik/feature.hpp
- eq_(f2["prop"] is None,True)
- expr = mapnik.Expression("[prop]")
- eq_(expr.evaluate(f2),None)
- eq_(expr.to_bool(f2),False)
-
-# https://github.com/mapnik/mapnik/issues/1859
-def test_if_null_and_empty_string_are_equal():
- context = mapnik.Context()
- f = mapnik.Feature(context,0)
- f["empty"] = u""
- f["null"] = None
- # ensure base assumptions are good
- eq_(mapnik.Expression("[empty] = ''").to_bool(f),True)
- eq_(mapnik.Expression("[null] = null").to_bool(f),True)
- eq_(mapnik.Expression("[empty] != ''").to_bool(f),False)
- eq_(mapnik.Expression("[null] != null").to_bool(f),False)
- # now test expected behavior
- eq_(mapnik.Expression("[null] = ''").to_bool(f),False)
- eq_(mapnik.Expression("[empty] = null").to_bool(f),False)
- eq_(mapnik.Expression("[empty] != null").to_bool(f),True)
- # this one is the back compatibility shim
- eq_(mapnik.Expression("[null] != ''").to_bool(f),False)
-
-def test_filtering_nulls_and_empty_strings():
- context = mapnik.Context()
- f = mapnik.Feature(context,0)
- f["prop"] = u"hello"
- eq_(f["prop"],u"hello")
- eq_(mapnik.Expression("[prop]").to_bool(f),True)
- eq_(mapnik.Expression("! [prop]").to_bool(f),False)
- eq_(mapnik.Expression("[prop] != null").to_bool(f),True)
- eq_(mapnik.Expression("[prop] != ''").to_bool(f),True)
- eq_(mapnik.Expression("[prop] != null and [prop] != ''").to_bool(f),True)
- eq_(mapnik.Expression("[prop] != null or [prop] != ''").to_bool(f),True)
- f["prop2"] = u""
- eq_(f["prop2"],u"")
- eq_(mapnik.Expression("[prop2]").to_bool(f),False)
- eq_(mapnik.Expression("! [prop2]").to_bool(f),True)
- eq_(mapnik.Expression("[prop2] != null").to_bool(f),True)
- eq_(mapnik.Expression("[prop2] != ''").to_bool(f),False)
- eq_(mapnik.Expression("[prop2] = ''").to_bool(f),True)
- eq_(mapnik.Expression("[prop2] != null or [prop2] != ''").to_bool(f),True)
- eq_(mapnik.Expression("[prop2] != null and [prop2] != ''").to_bool(f),False)
- f["prop3"] = None
- eq_(f["prop3"],None)
- eq_(mapnik.Expression("[prop3]").to_bool(f),False)
- eq_(mapnik.Expression("! [prop3]").to_bool(f),True)
- eq_(mapnik.Expression("[prop3] != null").to_bool(f),False)
- eq_(mapnik.Expression("[prop3] = null").to_bool(f),True)
-
- # https://github.com/mapnik/mapnik/issues/1859
- #eq_(mapnik.Expression("[prop3] != ''").to_bool(f),True)
- eq_(mapnik.Expression("[prop3] != ''").to_bool(f),False)
-
- eq_(mapnik.Expression("[prop3] = ''").to_bool(f),False)
-
- # https://github.com/mapnik/mapnik/issues/1859
- #eq_(mapnik.Expression("[prop3] != null or [prop3] != ''").to_bool(f),True)
- eq_(mapnik.Expression("[prop3] != null or [prop3] != ''").to_bool(f),False)
-
- eq_(mapnik.Expression("[prop3] != null and [prop3] != ''").to_bool(f),False)
- # attr not existing should behave the same as prop3
- eq_(mapnik.Expression("[prop4]").to_bool(f),False)
- eq_(mapnik.Expression("! [prop4]").to_bool(f),True)
- eq_(mapnik.Expression("[prop4] != null").to_bool(f),False)
- eq_(mapnik.Expression("[prop4] = null").to_bool(f),True)
-
- # https://github.com/mapnik/mapnik/issues/1859
- ##eq_(mapnik.Expression("[prop4] != ''").to_bool(f),True)
- eq_(mapnik.Expression("[prop4] != ''").to_bool(f),False)
-
- eq_(mapnik.Expression("[prop4] = ''").to_bool(f),False)
-
- # https://github.com/mapnik/mapnik/issues/1859
- ##eq_(mapnik.Expression("[prop4] != null or [prop4] != ''").to_bool(f),True)
- eq_(mapnik.Expression("[prop4] != null or [prop4] != ''").to_bool(f),False)
-
- eq_(mapnik.Expression("[prop4] != null and [prop4] != ''").to_bool(f),False)
- f["prop5"] = False
- eq_(f["prop5"],False)
- eq_(mapnik.Expression("[prop5]").to_bool(f),False)
- eq_(mapnik.Expression("! [prop5]").to_bool(f),True)
- eq_(mapnik.Expression("[prop5] != null").to_bool(f),True)
- eq_(mapnik.Expression("[prop5] = null").to_bool(f),False)
- eq_(mapnik.Expression("[prop5] != ''").to_bool(f),True)
- eq_(mapnik.Expression("[prop5] = ''").to_bool(f),False)
- eq_(mapnik.Expression("[prop5] != null or [prop5] != ''").to_bool(f),True)
- eq_(mapnik.Expression("[prop5] != null and [prop5] != ''").to_bool(f),True)
- # note, we need to do [prop5] != 0 here instead of false due to this bug:
- # https://github.com/mapnik/mapnik/issues/1873
- eq_(mapnik.Expression("[prop5] != null and [prop5] != '' and [prop5] != 0").to_bool(f),False)
-
-# https://github.com/mapnik/mapnik/issues/1872
-def test_falseyness_comparision():
- context = mapnik.Context()
- f = mapnik.Feature(context,0)
- f["prop"] = 0
- eq_(mapnik.Expression("[prop]").to_bool(f),False)
- eq_(mapnik.Expression("[prop] = false").to_bool(f),True)
- eq_(mapnik.Expression("not [prop] != false").to_bool(f),True)
- eq_(mapnik.Expression("not [prop] = true").to_bool(f),True)
- eq_(mapnik.Expression("[prop] = true").to_bool(f),False)
- eq_(mapnik.Expression("[prop] != true").to_bool(f),True)
-
-# https://github.com/mapnik/mapnik/issues/1806, fixed by https://github.com/mapnik/mapnik/issues/1872
-def test_truthyness_comparision():
- context = mapnik.Context()
- f = mapnik.Feature(context,0)
- f["prop"] = 1
- eq_(mapnik.Expression("[prop]").to_bool(f),True)
- eq_(mapnik.Expression("[prop] = false").to_bool(f),False)
- eq_(mapnik.Expression("not [prop] != false").to_bool(f),False)
- eq_(mapnik.Expression("not [prop] = true").to_bool(f),False)
- eq_(mapnik.Expression("[prop] = true").to_bool(f),True)
- eq_(mapnik.Expression("[prop] != true").to_bool(f),False)
-
-def test_division_by_zero():
- expr = mapnik.Expression('[a]/[b]')
- c = mapnik.Context()
- c.push('a')
- c.push('b')
- f = mapnik.Feature(c,0);
- f['a'] = 1
- f['b'] = 0
- eq_(expr.evaluate(f),None)
-
-if __name__ == "__main__":
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/font_test.py b/tests/python_tests/font_test.py
deleted file mode 100644
index 445c104..0000000
--- a/tests/python_tests/font_test.py
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import mapnik
-
-# Tests that exercise fonts.
-
-# Trac Ticket #31
-# Todo: Add logic to use this TextSymbolizer in a rendering
-#@raises(UserWarning)
-#def test_invalid_font():
-# ts = mapnik.TextSymbolizer('Name', 'Invalid Font Name', int(8), mapnik.Color('black'))
-
-if __name__ == "__main__":
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/fontset_test.py b/tests/python_tests/fontset_test.py
deleted file mode 100644
index 34c6858..0000000
--- a/tests/python_tests/fontset_test.py
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-from utilities import execution_path
-from utilities import execution_path, run_all
-import os, mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def test_loading_fontset_from_map():
- m = mapnik.Map(256,256)
- mapnik.load_map(m,'../data/good_maps/fontset.xml',True)
- fs = m.find_fontset('book-fonts')
- eq_(len(fs.names),2)
- eq_(list(fs.names),['DejaVu Sans Book','DejaVu Sans Oblique'])
-
-# def test_loading_fontset_from_python():
-# m = mapnik.Map(256,256)
-# fset = mapnik.FontSet('foo')
-# fset.add_face_name('Comic Sans')
-# fset.add_face_name('Papyrus')
-# eq_(fset.name,'foo')
-# fset.name = 'my-set'
-# eq_(fset.name,'my-set')
-# m.append_fontset('my-set', fset)
-# sty = mapnik.Style()
-# rule = mapnik.Rule()
-# tsym = mapnik.TextSymbolizer()
-# eq_(tsym.fontset,None)
-# tsym.fontset = fset
-# rule.symbols.append(tsym)
-# sty.rules.append(rule)
-# m.append_style('Style',sty)
-# serialized_map = mapnik.save_map_to_string(m)
-# eq_('fontset-name="my-set"' in serialized_map,True)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/geojson_plugin_test.py b/tests/python_tests/geojson_plugin_test.py
deleted file mode 100644
index 065cd30..0000000
--- a/tests/python_tests/geojson_plugin_test.py
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import os, mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-if 'geojson' in mapnik.DatasourceCache.plugin_names():
-
- def test_geojson_init():
- ds = mapnik.Datasource(type='geojson',file='../data/json/escaped.geojson')
- e = ds.envelope()
- assert_almost_equal(e.minx, -81.705583, places=7)
- assert_almost_equal(e.miny, 41.480573, places=6)
- assert_almost_equal(e.maxx, -81.705583, places=5)
- assert_almost_equal(e.maxy, 41.480573, places=3)
-
- def test_geojson_properties():
- ds = mapnik.Datasource(type='geojson',file='../data/json/escaped.geojson')
- f = ds.features_at_point(ds.envelope().center()).features[0]
- eq_(len(ds.fields()),7)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
-
- eq_(f['name'], u'Test')
- eq_(f['int'], 1)
- eq_(f['description'], u'Test: \u005C')
- eq_(f['spaces'], u'this has spaces')
- eq_(f['double'], 1.1)
- eq_(f['boolean'], True)
- eq_(f['NOM_FR'], u'Qu\xe9bec')
- eq_(f['NOM_FR'], u'Québec')
-
- ds = mapnik.Datasource(type='geojson',file='../data/json/escaped.geojson')
- f = ds.all_features()[0]
- eq_(len(ds.fields()),7)
-
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
-
- eq_(f['name'], u'Test')
- eq_(f['int'], 1)
- eq_(f['description'], u'Test: \u005C')
- eq_(f['spaces'], u'this has spaces')
- eq_(f['double'], 1.1)
- eq_(f['boolean'], True)
- eq_(f['NOM_FR'], u'Qu\xe9bec')
- eq_(f['NOM_FR'], u'Québec')
-
- def test_geojson_from_in_memory_string():
- # will silently fail since it is a geometry and needs to be a featurecollection.
- #ds = mapnik.Datasource(type='geojson',inline='{"type":"LineString","coordinates":[[0,0],[10,10]]}')
- # works since it is a featurecollection
- ds = mapnik.Datasource(type='geojson',inline='{ "type":"FeatureCollection", "features": [ { "type":"Feature", "properties":{"name":"test"}, "geometry": { "type":"LineString","coordinates":[[0,0],[10,10]] } } ]}')
- eq_(len(ds.fields()),1)
- f = ds.all_features()[0]
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.LineString)
- eq_(f['name'], u'test')
-
-# @raises(RuntimeError)
- def test_that_nonexistant_query_field_throws(**kwargs):
- ds = mapnik.Datasource(type='geojson',file='../data/json/escaped.geojson')
- eq_(len(ds.fields()),7)
- # TODO - this sorting is messed up
- #eq_(ds.fields(),['name', 'int', 'double', 'description', 'boolean', 'NOM_FR'])
- #eq_(ds.field_types(),['str', 'int', 'float', 'str', 'bool', 'str'])
-# TODO - should geojson plugin throw like others?
-# query = mapnik.Query(ds.envelope())
-# for fld in ds.fields():
-# query.add_property_name(fld)
-# # also add an invalid one, triggering throw
-# query.add_property_name('bogus')
-# fs = ds.features(query)
-
- def test_parsing_feature_collection_with_top_level_properties():
- ds = mapnik.Datasource(type='geojson',file='../data/json/feature_collection_level_properties.json')
- f = ds.all_features()[0]
-
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
- eq_(f['feat_name'], u'feat_value')
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/geometry_io_test.py b/tests/python_tests/geometry_io_test.py
deleted file mode 100644
index 667116f..0000000
--- a/tests/python_tests/geometry_io_test.py
+++ /dev/null
@@ -1,347 +0,0 @@
-#encoding: utf8
-
-from nose.tools import *
-import os,sys
-from utilities import execution_path, run_all
-import mapnik
-from binascii import unhexlify
-
-try:
- import json
-except ImportError:
- import simplejson as json
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-wkts = [
- [1,"POINT(30 10)"],
- [1,"POINT(30 10)"],
- [1,"POINT(30.1 10.1)"],
- [1,"LINESTRING(30 10,10 30,40 40)"],
- [1,"POLYGON((30 10,10 20,20 40,40 40,30 10))"],
- [1,"POLYGON((35 10,10 20,15 40,45 45,35 10),(20 30,35 35,30 20,20 30))"],
- [4,"MULTIPOINT((10 40),(40 30),(20 20),(30 10))"],
- [2,"MULTILINESTRING((10 10,20 20,10 40),(40 40,30 30,40 20,30 10))"],
- [2,"MULTIPOLYGON(((30 20,10 40,45 40,30 20)),((15 5,40 10,10 20,5 10,15 5)))"],
- [2,"MULTIPOLYGON(((40 40,20 45,45 30,40 40)),((20 35,45 20,30 5,10 10,10 30,20 35),(30 20,20 25,20 15,30 20)))"],
- [3,"GEOMETRYCOLLECTION(POLYGON((1 1,2 1,2 2,1 2,1 1)),POINT(2 3),LINESTRING(2 3,3 4))"],
- [1,"POLYGON((-178.32319 71.518365,-178.321586 71.518439,-178.259635 71.510688,-178.304862 71.513129,-178.32319 71.518365),(-178.32319 71.518365,-178.341544 71.517524,-178.32244 71.505439,-178.215323 71.478034,-178.193473 71.47663,-178.147757 71.485175,-178.124442 71.481879,-178.005729 71.448615,-178.017203 71.441413,-178.054191 71.428778,-178.047049 71.425727,-178.033439 71.417792,-178.026236 71.415107,-178.030082 71.413459,-178.039908 71.40766,-177.970878 71.39643,-177.779837 71.333 [...]
- [2,"MULTIPOLYGON(((-178.32319 71.518365,-178.321586 71.518439,-178.259635 71.510688,-178.304862 71.513129,-178.32319 71.518365)),((-178.32319 71.518365,-178.341544 71.517524,-178.32244 71.505439,-178.215323 71.478034,-178.193473 71.47663,-178.147757 71.485175,-178.124442 71.481879,-178.005729 71.448615,-178.017203 71.441413,-178.054191 71.428778,-178.047049 71.425727,-178.033439 71.417792,-178.026236 71.415107,-178.030082 71.413459,-178.039908 71.40766,-177.970878 71.39643,-177.77983 [...]
-]
-
-geojson = [
- [1,'{"type":"Point","coordinates":[30,10]}'],
- [1,'{"type":"Point","coordinates":[30.0,10.0]}'],
- [1,'{"type":"Point","coordinates":[30.1,10.1]}'],
- [1,'{"type":"LineString","coordinates":[[30.0,10.0],[10.0,30.0],[40.0,40.0]]}'],
- [1,'{"type":"Polygon","coordinates":[[[30.0,10.0],[10.0,20.0],[20.0,40.0],[40.0,40.0],[30.0,10.0]]]}'],
- [1,'{"type":"Polygon","coordinates":[[[35.0,10.0],[10.0,20.0],[15.0,40.0],[45.0,45.0],[35.0,10.0]],[[20.0,30.0],[35.0,35.0],[30.0,20.0],[20.0,30.0]]]}'],
- [4,'{"type":"MultiPoint","coordinates":[[10.0,40.0],[40.0,30.0],[20.0,20.0],[30.0,10.0]]}'],
- [2,'{"type":"MultiLineString","coordinates":[[[10.0,10.0],[20.0,20.0],[10.0,40.0]],[[40.0,40.0],[30.0,30.0],[40.0,20.0],[30.0,10.0]]]}'],
- [2,'{"type":"MultiPolygon","coordinates":[[[[30.0,20.0],[10.0,40.0],[45.0,40.0],[30.0,20.0]]],[[[15.0,5.0],[40.0,10.0],[10.0,20.0],[5.0,10.0],[15.0,5.0]]]]}'],
- [2,'{"type":"MultiPolygon","coordinates":[[[[40.0,40.0],[20.0,45.0],[45.0,30.0],[40.0,40.0]]],[[[20.0,35.0],[45.0,20.0],[30.0,5.0],[10.0,10.0],[10.0,30.0],[20.0,35.0]],[[30.0,20.0],[20.0,25.0],[20.0,15.0],[30.0,20.0]]]]}'],
- [3,'{"type":"GeometryCollection","geometries":[{"type":"Polygon","coordinates":[[[1.0,1.0],[2.0,1.0],[2.0,2.0],[1.0,2.0],[1.0,1.0]]]},{"type":"Point","coordinates":[2.0,3.0]},{"type":"LineString","coordinates":[[2.0,3.0],[3.0,4.0]]}]}'],
- [1,'{"type":"Polygon","coordinates":[[[-178.32319,71.518365],[-178.321586,71.518439],[-178.259635,71.510688],[-178.304862,71.513129],[-178.32319,71.518365]],[[-178.32319,71.518365],[-178.341544,71.517524],[-178.32244,71.505439],[-178.215323,71.478034],[-178.193473,71.47663],[-178.147757,71.485175],[-178.124442,71.481879],[-178.005729,71.448615],[-178.017203,71.441413],[-178.054191,71.428778],[-178.047049,71.425727],[-178.033439,71.417792],[-178.026236,71.415107],[-178.030082,71.41345 [...]
- [2,'{"type":"MultiPolygon","coordinates":[[[[-178.32319,71.518365],[-178.321586,71.518439],[-178.259635,71.510688],[-178.304862,71.513129],[-178.32319,71.518365]]],[[[-178.32319,71.518365],[-178.341544,71.517524],[-178.32244,71.505439],[-178.215323,71.478034],[-178.193473,71.47663],[-178.147757,71.485175],[-178.124442,71.481879],[-178.005729,71.448615],[-178.017203,71.441413],[-178.054191,71.428778],[-178.047049,71.425727],[-178.033439,71.417792],[-178.026236,71.415107],[-178.030082, [...]
-]
-
-geojson_reversed = [
- [1,'{"coordinates":[30,10],"type":"Point"}'],
- [1,'{"coordinates":[30.0,10.0],"type":"Point"}'],
- [1,'{"coordinates":[30.1,10.1],"type":"Point"}'],
- [1,'{"coordinates":[[30.0,10.0],[10.0,30.0],[40.0,40.0]],"type":"LineString"}'],
- [1,'{"coordinates":[[[30.0,10.0],[10.0,20.0],[20.0,40.0],[40.0,40.0],[30.0,10.0]]],"type":"Polygon"}'],
- [1,'{"coordinates":[[[35.0,10.0],[10.0,20.0],[15.0,40.0],[45.0,45.0],[35.0,10.0]],[[20.0,30.0],[35.0,35.0],[30.0,20.0],[20.0,30.0]]],"type":"Polygon"}'],
- [4,'{"coordinates":[[10.0,40.0],[40.0,30.0],[20.0,20.0],[30.0,10.0]],"type":"MultiPoint"}'],
- [2,'{"coordinates":[[[10.0,10.0],[20.0,20.0],[10.0,40.0]],[[40.0,40.0],[30.0,30.0],[40.0,20.0],[30.0,10.0]]],"type":"MultiLineString"}'],
- [2,'{"coordinates":[[[[30.0,20.0],[10.0,40.0],[45.0,40.0],[30.0,20.0]]],[[[15.0,5.0],[40.0,10.0],[10.0,20.0],[5.0,10.0],[15.0,5.0]]]],"type":"MultiPolygon"}'],
- [2,'{"coordinates":[[[[40.0,40.0],[20.0,45.0],[45.0,30.0],[40.0,40.0]]],[[[20.0,35.0],[45.0,20.0],[30.0,5.0],[10.0,10.0],[10.0,30.0],[20.0,35.0]],[[30.0,20.0],[20.0,25.0],[20.0,15.0],[30.0,20.0]]]],"type":"MultiPolygon"}'],
- [3,'{"geometries":[{"coordinates":[[[1.0,1.0],[2.0,1.0],[2.0,2.0],[1.0,2.0],[1.0,1.0]]],"type":"Polygon"},{"coordinates":[2.0,3.0],"type":"Point"},{"coordinates":[[2.0,3.0],[3.0,4.0]],"type":"LineString"}],"type":"GeometryCollection"}'],
- [1,'{"coordinates":[[[-178.32319,71.518365],[-178.321586,71.518439],[-178.259635,71.510688],[-178.304862,71.513129],[-178.32319,71.518365]],[[-178.32319,71.518365],[-178.341544,71.517524],[-178.32244,71.505439],[-178.215323,71.478034],[-178.193473,71.47663],[-178.147757,71.485175],[-178.124442,71.481879],[-178.005729,71.448615],[-178.017203,71.441413],[-178.054191,71.428778],[-178.047049,71.425727],[-178.033439,71.417792],[-178.026236,71.415107],[-178.030082,71.413459],[-178.039908,7 [...]
- [2,'{"coordinates":[[[[-178.32319,71.518365],[-178.321586,71.518439],[-178.259635,71.510688],[-178.304862,71.513129],[-178.32319,71.518365]]],[[[-178.32319,71.518365],[-178.341544,71.517524],[-178.32244,71.505439],[-178.215323,71.478034],[-178.193473,71.47663],[-178.147757,71.485175],[-178.124442,71.481879],[-178.005729,71.448615],[-178.017203,71.441413],[-178.054191,71.428778],[-178.047049,71.425727],[-178.033439,71.417792],[-178.026236,71.415107],[-178.030082,71.413459],[-178.03990 [...]
-]
-
-geojson_nulls = [
- '{ "type": "Feature", "properties": { }, "geometry": null }',
- '{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [] }}',
- '{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [] ] }}',
- '{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [] ] ] } }',
- '{ "type": "Feature", "properties": { }, "geometry": { "coordinates": [], "type": "Point" }}',
- '{ "type": "Feature", "properties": { }, "geometry": { "coordinates": [ [] ], "type": "LineString" }}',
- '{ "type": "Feature", "properties": { }, "geometry": { "coordinates": [ [ [] ] ], "type": "Polygon" } }',
- '{ "type": "Feature", "properties": { }, "geometry": { "type": "MultiPoint", "coordinates": [ [] ] }}',
- '{ "type": "Feature", "properties": { }, "geometry": { "type": "MultiPoint", "coordinates": [ [],[] ] }}',
- '{ "type": "Feature", "properties": { }, "geometry": { "type": "MultiLineString", "coordinates": [ [] ] }}',
- '{ "type": "Feature", "properties": { }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [] ] ] }}',
- '{ "type": "Feature", "properties": { }, "geometry": { "type": "MultiPolygon", "coordinates": [ [] ] }}',
- '{ "type": "Feature", "properties": { }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [] ] ] }}',
- '{ "type": "Feature", "properties": { }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [] ] ] ] }}',
-]
-
-wkbs = [
- [ 0, "Point EMPTY", '010400000000000000'],
- [ 0, "MULTIPOINT EMPTY", '010400000000000000'],
- [ 0, "LINESTRING EMPTY", '010200000000000000'],
- [ 0, "MULTILINESTRING EMPTY", '010500000000000000'],
- [ 0, "Polygon EMPTY", '010300000000000000'],
- [ 0, "GEOMETRYCOLLECTION EMPTY", '010700000000000000'],
- [ 2, "GEOMETRYCOLLECTION(MULTILINESTRING((10 10,20 20,10 40),(40 40,30 30,40 20,30 10)),LINESTRING EMPTY)", '010700000002000000010500000002000000010200000003000000000000000000244000000000000024400000000000003440000000000000344000000000000024400000000000004440010200000004000000000000000000444000000000000044400000000000003e400000000000003e40000000000000444000000000000034400000000000003e400000000000002440010200000000000000'
- ],
- [ 0, "GEOMETRYCOLLECTION(LINESTRING EMPTY,LINESTRING EMPTY)", '010700000000000000'],
- [ 0, "GEOMETRYCOLLECTION(POINT EMPTY,POINT EMPTY)", '010700000000000000'],
- [ 1, "GEOMETRYCOLLECTION(POINT EMPTY,POINT(0 0))", '010700000002000000010400000000000000010100000000000000000000000000000000000000'],
- [ 1, "GEOMETRYCOLLECTION(POINT EMPTY,MULTIPOINT(0 0))", '010700000002000000010400000000000000010400000001000000010100000000000000000000000000000000000000'],
- [ 0, "LINESTRING EMPTY", '010200000000000000' ],
- [ 1, "Point(0 0)", '010100000000000000000000000000000000000000' ],
- # unsupported types
- [ 0, "MULTIPOLYGON EMPTY", '010600000000000000'],
- [ 0, "TRIANGLE EMPTY", '011100000000000000'],
- [ 0, "CircularString EMPTY", '010800000000000000'],
- [ 0, "CurvePolygon EMPTY", '010A00000000000000'],
- [ 0, "CompoundCurve EMPTY", '010900000000000000'],
- [ 0, "MultiCurve EMPTY", '010B00000000000000'],
- [ 0, "MultiSurface EMPTY", '010C00000000000000'],
- [ 0, "PolyhedralSurface EMPTY", '010F00000000000000'],
- [ 0, "TIN EMPTY", '011000000000000000'],
- # TODO - a few bogus inputs
- # enable if we start range checking to avoid crashing on invalid input?
- # https://github.com/mapnik/mapnik/issues/2236
- #[ 0, "", '' ],
- #[ 0, "00", '01' ],
- #[ 0, "0000", '0104' ],
-]
-
-def test_path_geo_interface():
- path = mapnik.Path()
- path.add_wkt('POINT(0 0)')
- eq_(path.__geo_interface__,{u'type': u'Point', u'coordinates': [0, 0]})
-
-def test_wkb_parsing():
- path = mapnik.Path()
- count = 0
- for wkb in wkbs:
- count += wkb[0]
- try :
- path.add_wkb(unhexlify(wkb[2]))
- except RuntimeError, e:
- if 'EMPTY' in wkb[1]:
- pass
- else:
- raise e
- eq_(count,len(path))
-
-def test_geojson_parsing():
- path = mapnik.Path()
- count = 0
- for json in geojson:
- count += json[0]
- path.add_geojson(json[1])
- eq_(count,len(path))
-
-def test_geojson_parsing_reversed():
- path = mapnik.Path()
- path2 = mapnik.Path()
- count = 0
- for idx,json in enumerate(geojson_reversed):
- count += json[0]
- path.add_geojson(json[1])
- path2.add_geojson(geojson[idx][1])
- eq_(path.to_geojson(),path2.to_geojson())
- eq_(count,len(path))
-
-
-# http://geojson.org/geojson-spec.html#positions
-def test_geojson_point_positions():
- input_json = '{"type":"Point","coordinates":[30,10]}'
-
- path = mapnik.Path()
- path.add_geojson(input_json)
- eq_(path.to_geojson(),input_json)
-
- path = mapnik.Path()
- # should ignore all but the first two
- path.add_geojson('{"type":"Point","coordinates":[30,10,50,50,50,50]}')
- eq_(path.to_geojson(),input_json)
-
-def test_geojson_point_positions():
- input_json = '{"type":"LineString","coordinates":[[30,10],[10,30],[40,40]]}'
-
- path = mapnik.Path()
- path.add_geojson(input_json)
- eq_(path.to_geojson(),input_json)
-
- path = mapnik.Path()
- # should ignore all but the first two
- path.add_geojson('{"type":"LineString","coordinates":[[30.0,10.0,0,0,0],[10.0,30.0,0,0,0],[40.0,40.0,0,0,0]]}')
- eq_(path.to_geojson(),input_json)
-
-def compare_wkb_from_wkt(wkt,num=None):
-
- paths = mapnik.Path.from_wkt(wkt)
-
- # add geometry(s) to feature from wkt
- f = mapnik.Feature(mapnik.Context(),1)
- f.add_geometries_from_wkt(wkt)
-
- # ensure both have same result
- # compare number of geometry parts
- if num:
- eq_(len(paths),num)
- eq_(len(f.geometries()),num)
- # compare collection off all geometries
- eq_(paths.to_wkb(mapnik.wkbByteOrder.XDR),f.geometries().to_wkb(mapnik.wkbByteOrder.XDR))
- # compare all parts
- for idx,path in enumerate(paths):
- eq_(f.geometries()[idx].to_wkb(mapnik.wkbByteOrder.XDR),path.to_wkb(mapnik.wkbByteOrder.XDR))
-
- # compare round trip
- paths2 = mapnik.Path()
- for path in paths:
- paths2.add_wkb(path.to_wkb(mapnik.wkbByteOrder.XDR))
-
- # ensure result
- if num:
- eq_(len(paths2),num)
- eq_(paths2.to_wkb(mapnik.wkbByteOrder.XDR),paths.to_wkb(mapnik.wkbByteOrder.XDR))
- for idx,path in enumerate(paths2):
- eq_(f.geometries()[idx].to_wkb(mapnik.wkbByteOrder.XDR),path.to_wkb(mapnik.wkbByteOrder.XDR))
-
-def compare_wkt_from_wkt(wkt,num=None):
- paths = mapnik.Path.from_wkt(wkt)
-
- # add geometry(s) to feature from wkt
- f = mapnik.Feature(mapnik.Context(),1)
- f.add_geometries_from_wkt(wkt)
-
- # compare to original, which may not have significant digits
- if '.' not in wkt:
- eq_(f.geometries().to_wkt().upper().replace('.0',''),wkt)
- else:
- eq_(f.geometries().to_wkt().upper(),wkt)
-
- # ensure both have same result
- if num:
- eq_(len(paths),num)
- eq_(len(f.geometries()),num)
- eq_(paths.to_wkt(),f.geometries().to_wkt())
- for idx,path in enumerate(paths):
- eq_(f.geometries()[idx].to_wkt(),path.to_wkt())
-
- # compare round trip
- paths2 = mapnik.Path()
- for path in paths:
- paths2.add_wkt(path.to_wkt())
-
- # ensure result
- if num:
- eq_(len(paths2),num)
- eq_(paths2.to_wkt(),paths.to_wkt())
- for idx,path in enumerate(paths2):
- eq_(f.geometries()[idx].to_wkb(mapnik.wkbByteOrder.XDR),path.to_wkb(mapnik.wkbByteOrder.XDR))
-
-def compare_wkt_to_geojson(idx,wkt,num=None):
- paths = mapnik.Path.from_wkt(wkt)
- # ensure both have same result
- if num:
- eq_(len(paths),num)
- gj = paths.to_geojson()
- eq_(len(gj) > 1,True)
- a = json.loads(gj)
- e = json.loads(geojson[idx][1])
- eq_(a,e)
-
-def test_wkt_simple():
- for wkt in wkts:
- try:
- compare_wkt_from_wkt(wkt[1],wkt[0])
- except RuntimeError, e:
- raise RuntimeError('%s %s' % (e, wkt))
-
-def test_wkb_simple():
- for wkt in wkts:
- try:
- compare_wkb_from_wkt(wkt[1],wkt[0])
- except RuntimeError, e:
- raise RuntimeError('%s %s' % (e, wkt))
-
-def test_wkt_to_geojson():
- idx = -1
- for wkt in wkts:
- try:
- idx += 1
- compare_wkt_to_geojson(idx,wkt[1],wkt[0])
- except RuntimeError, e:
- raise RuntimeError('%s %s' % (e, wkt))
-
- at raises(IndexError)
-def test_geometry_index_error():
- wkt = 'Point (0 0)'
- paths = mapnik.Path.from_wkt(wkt)
- paths[3]
- f = mapnik.Feature(mapnik.Context(),1)
- f.add_geometries_from_wkt(wkt)
- f.geometries()[3]
-
- at raises(IndexError)
-def test_geometry_index_error2():
- wkt = 'Point (0 0)'
- f = mapnik.Feature(mapnik.Context(),1)
- f.add_geometries_from_wkt(wkt)
- f.geometries()[3]
-
-def test_wkt_rounding():
- # currently fails because we use output precision of 6 - should we make configurable? https://github.com/mapnik/mapnik/issues/1009
- # if precision is set to 15 still fails due to very subtle rounding issues
- wkt = "POLYGON((7.904185 54.180426,7.89918 54.178168,7.897715 54.182318,7.893565 54.183111,7.890391 54.187567,7.885874 54.19068,7.879893 54.193915,7.894541 54.194647,7.900645 54.19068,7.904185 54.180426))"
- compare_wkt_from_wkt(wkt,1)
-
-def test_wkt_collection_flattening():
- wkt = 'GEOMETRYCOLLECTION(POLYGON((1 1,2 1,2 2,1 2,1 1)),POLYGON((40 40,20 45,45 30,40 40)),POLYGON((20 35,45 20,30 5,10 10,10 30,20 35),(30 20,20 25,20 15,30 20)),LINESTRING(2 3,3 4))'
- # currently fails as the MULTIPOLYGON inside will be returned as multiple polygons - not a huge deal - should we worry?
- #wkt = "GEOMETRYCOLLECTION(POLYGON((1 1,2 1,2 2,1 2,1 1)),MULTIPOLYGON(((40 40,20 45,45 30,40 40)),((20 35,45 20,30 5,10 10,10 30,20 35),(30 20,20 25,20 15,30 20))),LINESTRING(2 3,3 4))"
- compare_wkt_from_wkt(wkt,4)
-
-# skip since this data is not checked into tests
-#def test_wkt_natural_earth():
-# '''
-# wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/physical/10m-land.zip
-# unzip 10m-land.zip
-# ogr2ogr -F CSV -lco GEOMETRY=AS_WKT 10m-land.csv 10m_land.shp
-# mv 10m-land.csv tests/data/csv/
-# '''
-# lines = open('../data/csv/10m-land.csv').readlines()
-# for line in lines:
-# wkt = lines[1][lines[1].index('"',0)+1:lines[1].index('"',1)]
-# wkt = wkt.replace(' (','(',1)
-# try:
-# compare_wkb_from_wkt(wkt)
-# except RuntimeError, e:
-# raise RuntimeError('%s %s' % (e, wkt))
-
-def test_creating_feature_from_geojson():
- json_feat = {
- "type": "Feature",
- "geometry": {"type": "Point", "coordinates": [-122,48]},
- "properties": {"name": "value"}
- }
- ctx = mapnik.Context()
- feat = mapnik.Feature.from_geojson(json.dumps(json_feat),ctx)
- eq_(feat.id(),1)
- eq_(feat['name'],u'value')
-
-def test_handling_geojson_null_geoms():
- for json in geojson_nulls:
- ctx = mapnik.Context()
- out_json = mapnik.Feature.from_geojson(json,ctx).to_geojson()
- expected = '{"type":"Feature","id":1,"geometry":null,"properties":{}}'
- eq_(out_json,expected)
- # ensure it round trips
- eq_(mapnik.Feature.from_geojson(out_json,ctx).to_geojson(),expected)
-
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/grayscale_test.py b/tests/python_tests/grayscale_test.py
deleted file mode 100644
index de1fa47..0000000
--- a/tests/python_tests/grayscale_test.py
+++ /dev/null
@@ -1,13 +0,0 @@
-import mapnik
-from nose.tools import *
-from utilities import execution_path, run_all
-
-def test_grayscale_conversion():
- im = mapnik.Image(2,2)
- im.background = mapnik.Color('white')
- im.set_grayscale_to_alpha()
- pixel = im.get_pixel(0,0)
- eq_((pixel >> 24) & 0xff,255);
-
-if __name__ == "__main__":
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/image_encoding_speed_test.py b/tests/python_tests/image_encoding_speed_test.py
deleted file mode 100644
index 51dedc4..0000000
--- a/tests/python_tests/image_encoding_speed_test.py
+++ /dev/null
@@ -1,127 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import sys
-import os, mapnik
-from timeit import Timer, time
-from nose.tools import *
-from utilities import execution_path, run_all
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-combinations = ['png',
- 'png8',
- 'png8:m=o',
- 'png8:m=h',
- 'png8:m=o:t=0',
- 'png8:m=o:t=1',
- 'png8:m=o:t=2',
- 'png8:m=h:t=0',
- 'png8:m=h:t=1',
- 'png8:m=h:t=2',
- 'png:z=1',
- 'png:z=1:t=0', # forces rbg, no a
- 'png8:z=1',
- 'png8:z=1:m=o',
- 'png8:z=1:m=h',
- 'png8:z=1:c=1',
- 'png8:z=1:c=24',
- 'png8:z=1:c=64',
- 'png8:z=1:c=128',
- 'png8:z=1:c=200',
- 'png8:z=1:c=255',
- 'png8:z=9:c=64',
- 'png8:z=9:c=128',
- 'png8:z=9:c=200',
- 'png8:z=1:c=50:m=h',
- 'png8:z=1:c=1:m=o',
- 'png8:z=1:c=1:m=o:s=filtered',
- 'png:z=1:s=filtered',
- 'png:z=1:s=huff',
- 'png:z=1:s=rle',
- 'png:m=h:g=2.0',
- 'png:m=h:g=1.0',
- 'png:e=miniz',
- 'png8:e=miniz'
- ]
-
-tiles = [
-'blank',
-'solid',
-'many_colors',
-'aerial_24'
-]
-
-iterations = 10
-
-def do_encoding():
-
- image = None
-
- results = {}
- sortable = {}
-
- def run(func, im, format, t):
- global image
- image = im
- start = time.time()
- set = t.repeat(iterations,1)
- elapsed = (time.time() - start)
- min_ = min(set)*1000
- avg = (sum(set)/len(set))*1000
- name = func.__name__ + ' ' + format
- results[name] = [min_,avg,elapsed*1000,name,len(func())]
- sortable[name] = [min_]
-
- if 'blank' in tiles:
- def blank():
- return eval('image.tostring("%s")' % c)
- blank_im = mapnik.Image(512,512)
- for c in combinations:
- t = Timer(blank)
- run(blank,blank_im,c,t)
-
- if 'solid' in tiles:
- def solid():
- return eval('image.tostring("%s")' % c)
- solid_im = mapnik.Image(512,512)
- solid_im.background = mapnik.Color("#f2efe9")
- for c in combinations:
- t = Timer(solid)
- run(solid,solid_im,c,t)
-
- if 'many_colors' in tiles:
- def many_colors():
- return eval('image.tostring("%s")' % c)
- # lots of colors: http://tile.osm.org/13/4194/2747.png
- many_colors_im = mapnik.Image.open('../data/images/13_4194_2747.png')
- for c in combinations:
- t = Timer(many_colors)
- run(many_colors,many_colors_im,c,t)
-
- if 'aerial_24' in tiles:
- def aerial_24():
- return eval('image.tostring("%s")' % c)
- aerial_24_im = mapnik.Image.open('../data/images/12_654_1580.png')
- for c in combinations:
- t = Timer(aerial_24)
- run(aerial_24,aerial_24_im,c,t)
-
- for key, value in sorted(sortable.iteritems(), key=lambda (k,v): (v,k)):
- s = results[key]
- min_ = str(s[0])[:6]
- avg = str(s[1])[:6]
- elapsed = str(s[2])[:6]
- percent_reduction = s[4]
- name = s[3]
- size = s[4]
- print 'min: %sms | avg: %sms | total: %sms | len: %s <-- %s' % (min_,avg,elapsed,size,name)
-
-
-if __name__ == "__main__":
- setup()
- do_encoding()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/image_filters_test.py b/tests/python_tests/image_filters_test.py
deleted file mode 100644
index c122294..0000000
--- a/tests/python_tests/image_filters_test.py
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-from utilities import execution_path, run_all
-from utilities import side_by_side_image
-import os, mapnik
-import re
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def replace_style(m, name, style):
- m.remove_style(name)
- m.append_style(name, style)
-
-def test_append():
- s = mapnik.Style()
- eq_(s.image_filters,'')
- s.image_filters = 'gray'
- eq_(s.image_filters,'gray')
- s.image_filters = 'sharpen'
- eq_(s.image_filters,'sharpen')
-
-if 'shape' in mapnik.DatasourceCache.plugin_names():
- def test_style_level_image_filter():
- m = mapnik.Map(256, 256)
- mapnik.load_map(m, '../data/good_maps/style_level_image_filter.xml')
- m.zoom_all()
- successes = []
- fails = []
- for name in ("", "agg-stack-blur(2,2)", "blur",
- "edge-detect", "emboss", "gray", "invert",
- "sharpen", "sobel", "x-gradient", "y-gradient"):
- if name == "":
- filename = "none"
- else:
- filename = re.sub(r"[^-_a-z.0-9]", "", name)
- # find_style returns a copy of the style object
- style_markers = m.find_style("markers")
- style_markers.image_filters = name
- style_labels = m.find_style("labels")
- style_labels.image_filters = name
- # replace the original style with the modified one
- replace_style(m, "markers", style_markers)
- replace_style(m, "labels", style_labels)
- im = mapnik.Image(m.width, m.height)
- mapnik.render(m, im)
- actual = '/tmp/mapnik-style-image-filter-' + filename + '.png'
- expected = 'images/style-image-filter/' + filename + '.png'
- im.save(actual,"png32")
- if not os.path.exists(expected):
- print 'generating expected test image: %s' % expected
- im.save(expected,'png32')
- expected_im = mapnik.Image.open(expected)
- # compare them
- if im.tostring('png32') == expected_im.tostring('png32'):
- successes.append(name)
- else:
- fails.append('failed comparing actual (%s) and expected(%s)' % (actual,'tests/python_tests/'+ expected))
- fail_im = side_by_side_image(expected_im, im)
- fail_im.save('/tmp/mapnik-style-image-filter-' + filename + '.fail.png','png32')
- eq_(len(fails), 0, '\n'+'\n'.join(fails))
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/image_test.py b/tests/python_tests/image_test.py
deleted file mode 100644
index 4947ce9..0000000
--- a/tests/python_tests/image_test.py
+++ /dev/null
@@ -1,82 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import sys
-import os, mapnik
-from timeit import Timer, time
-from nose.tools import *
-from utilities import execution_path, run_all
-
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def test_image_premultiply():
- im = mapnik.Image(256,256)
- eq_(im.premultiplied(),False)
- im.premultiply()
- eq_(im.premultiplied(),True)
- im.demultiply()
- eq_(im.premultiplied(),False)
-
-# Disabled for now since this breaks hard if run against
-# a mapnik version that does not have the fix
-#@raises(RuntimeError)
-#def test_negative_image_dimensions():
- #im = mapnik.Image(-40,40)
-
-def test_tiff_round_trip():
- filepath = '/tmp/mapnik-tiff-io.tiff'
- im = mapnik.Image(255,267)
- im.background = mapnik.Color('rgba(1,2,3,.5)')
- im.save(filepath,'tiff')
- im2 = mapnik.Image.open(filepath)
- eq_(im.width(),im2.width())
- eq_(im.height(),im2.height())
- eq_(len(im.tostring()),len(im2.tostring()))
- eq_(len(im.tostring('tiff')),len(im2.tostring('tiff')))
-
-def test_jpeg_round_trip():
- filepath = '/tmp/mapnik-jpeg-io.jpeg'
- im = mapnik.Image(255,267)
- im.background = mapnik.Color('rgba(1,2,3,.5)')
- im.save(filepath,'jpeg')
- im2 = mapnik.Image.open(filepath)
- eq_(im.width(),im2.width())
- eq_(im.height(),im2.height())
- eq_(len(im.tostring()),len(im2.tostring()))
- eq_(len(im.tostring('jpeg')),len(im2.tostring('jpeg')))
-
-def test_png_round_trip():
- filepath = '/tmp/mapnik-png-io.png'
- im = mapnik.Image(255,267)
- im.background = mapnik.Color('rgba(1,2,3,.5)')
- im.save(filepath,'png')
- im2 = mapnik.Image.open(filepath)
- eq_(im.width(),im2.width())
- eq_(im.height(),im2.height())
- eq_(len(im.tostring()),len(im2.tostring()))
- eq_(len(im.tostring('png')),len(im2.tostring('png')))
- eq_(len(im.tostring('png8')),len(im2.tostring('png8')))
-
-def test_image_open_from_string():
- filepath = '../data/images/dummy.png'
- im1 = mapnik.Image.open(filepath)
- im2 = mapnik.Image.fromstring(open(filepath,'rb').read())
- eq_(im1.width(),im2.width())
- length = len(im1.tostring())
- eq_(length,len(im2.tostring()))
- eq_(len(mapnik.Image.fromstring(im1.tostring('png')).tostring()),length)
- eq_(len(mapnik.Image.fromstring(im1.tostring('jpeg')).tostring()),length)
- eq_(len(mapnik.Image.frombuffer(buffer(im1.tostring('png'))).tostring()),length)
- eq_(len(mapnik.Image.frombuffer(buffer(im1.tostring('jpeg'))).tostring()),length)
-
- # TODO - https://github.com/mapnik/mapnik/issues/1831
- eq_(len(mapnik.Image.fromstring(im1.tostring('tiff')).tostring()),length)
- eq_(len(mapnik.Image.frombuffer(buffer(im1.tostring('tiff'))).tostring()),length)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/images/composited/clear.png b/tests/python_tests/images/composited/clear.png
deleted file mode 100644
index 4fe9ab3..0000000
Binary files a/tests/python_tests/images/composited/clear.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/color.png b/tests/python_tests/images/composited/color.png
deleted file mode 100644
index f9a6879..0000000
Binary files a/tests/python_tests/images/composited/color.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/color_burn.png b/tests/python_tests/images/composited/color_burn.png
deleted file mode 100644
index af985bd..0000000
Binary files a/tests/python_tests/images/composited/color_burn.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/color_dodge.png b/tests/python_tests/images/composited/color_dodge.png
deleted file mode 100644
index 6c45b85..0000000
Binary files a/tests/python_tests/images/composited/color_dodge.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/contrast.png b/tests/python_tests/images/composited/contrast.png
deleted file mode 100644
index 54ea219..0000000
Binary files a/tests/python_tests/images/composited/contrast.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/darken.png b/tests/python_tests/images/composited/darken.png
deleted file mode 100644
index 4324c0a..0000000
Binary files a/tests/python_tests/images/composited/darken.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/difference.png b/tests/python_tests/images/composited/difference.png
deleted file mode 100644
index 312bded..0000000
Binary files a/tests/python_tests/images/composited/difference.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/divide.png b/tests/python_tests/images/composited/divide.png
deleted file mode 100644
index 0a4b24f..0000000
Binary files a/tests/python_tests/images/composited/divide.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/dst.png b/tests/python_tests/images/composited/dst.png
deleted file mode 100644
index 14be353..0000000
Binary files a/tests/python_tests/images/composited/dst.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/dst_atop.png b/tests/python_tests/images/composited/dst_atop.png
deleted file mode 100644
index 845c370..0000000
Binary files a/tests/python_tests/images/composited/dst_atop.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/dst_in.png b/tests/python_tests/images/composited/dst_in.png
deleted file mode 100644
index 1664be0..0000000
Binary files a/tests/python_tests/images/composited/dst_in.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/dst_out.png b/tests/python_tests/images/composited/dst_out.png
deleted file mode 100644
index eb943bc..0000000
Binary files a/tests/python_tests/images/composited/dst_out.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/dst_over.png b/tests/python_tests/images/composited/dst_over.png
deleted file mode 100644
index 51fe08e..0000000
Binary files a/tests/python_tests/images/composited/dst_over.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/exclusion.png b/tests/python_tests/images/composited/exclusion.png
deleted file mode 100644
index 6cf4fa7..0000000
Binary files a/tests/python_tests/images/composited/exclusion.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/grain_extract.png b/tests/python_tests/images/composited/grain_extract.png
deleted file mode 100644
index cfa03e1..0000000
Binary files a/tests/python_tests/images/composited/grain_extract.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/grain_merge.png b/tests/python_tests/images/composited/grain_merge.png
deleted file mode 100644
index 78de8b5..0000000
Binary files a/tests/python_tests/images/composited/grain_merge.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/hard_light.png b/tests/python_tests/images/composited/hard_light.png
deleted file mode 100644
index 9d878de..0000000
Binary files a/tests/python_tests/images/composited/hard_light.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/hue.png b/tests/python_tests/images/composited/hue.png
deleted file mode 100644
index 96ed7a6..0000000
Binary files a/tests/python_tests/images/composited/hue.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/invert.png b/tests/python_tests/images/composited/invert.png
deleted file mode 100644
index 03e8e94..0000000
Binary files a/tests/python_tests/images/composited/invert.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/invert_rgb.png b/tests/python_tests/images/composited/invert_rgb.png
deleted file mode 100644
index 5a8904f..0000000
Binary files a/tests/python_tests/images/composited/invert_rgb.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/lighten.png b/tests/python_tests/images/composited/lighten.png
deleted file mode 100644
index 3b8a860..0000000
Binary files a/tests/python_tests/images/composited/lighten.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/linear_burn.png b/tests/python_tests/images/composited/linear_burn.png
deleted file mode 100644
index 37ec4b7..0000000
Binary files a/tests/python_tests/images/composited/linear_burn.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/linear_dodge.png b/tests/python_tests/images/composited/linear_dodge.png
deleted file mode 100644
index 848ddca..0000000
Binary files a/tests/python_tests/images/composited/linear_dodge.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/minus.png b/tests/python_tests/images/composited/minus.png
deleted file mode 100644
index 46a7647..0000000
Binary files a/tests/python_tests/images/composited/minus.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/multiply.png b/tests/python_tests/images/composited/multiply.png
deleted file mode 100644
index 0c6880f..0000000
Binary files a/tests/python_tests/images/composited/multiply.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/overlay.png b/tests/python_tests/images/composited/overlay.png
deleted file mode 100644
index 77df0d3..0000000
Binary files a/tests/python_tests/images/composited/overlay.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/plus.png b/tests/python_tests/images/composited/plus.png
deleted file mode 100644
index 6656c63..0000000
Binary files a/tests/python_tests/images/composited/plus.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/saturation.png b/tests/python_tests/images/composited/saturation.png
deleted file mode 100644
index 52e9d6c..0000000
Binary files a/tests/python_tests/images/composited/saturation.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/screen.png b/tests/python_tests/images/composited/screen.png
deleted file mode 100644
index df69486..0000000
Binary files a/tests/python_tests/images/composited/screen.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/soft_light.png b/tests/python_tests/images/composited/soft_light.png
deleted file mode 100644
index 954bef3..0000000
Binary files a/tests/python_tests/images/composited/soft_light.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/src.png b/tests/python_tests/images/composited/src.png
deleted file mode 100644
index 70aa18f..0000000
Binary files a/tests/python_tests/images/composited/src.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/src_atop.png b/tests/python_tests/images/composited/src_atop.png
deleted file mode 100644
index 5621a09..0000000
Binary files a/tests/python_tests/images/composited/src_atop.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/src_in.png b/tests/python_tests/images/composited/src_in.png
deleted file mode 100644
index c2dbc51..0000000
Binary files a/tests/python_tests/images/composited/src_in.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/src_out.png b/tests/python_tests/images/composited/src_out.png
deleted file mode 100644
index 4df0d0a..0000000
Binary files a/tests/python_tests/images/composited/src_out.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/src_over.png b/tests/python_tests/images/composited/src_over.png
deleted file mode 100644
index fcba78a..0000000
Binary files a/tests/python_tests/images/composited/src_over.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/value.png b/tests/python_tests/images/composited/value.png
deleted file mode 100644
index 70bcf4e..0000000
Binary files a/tests/python_tests/images/composited/value.png and /dev/null differ
diff --git a/tests/python_tests/images/composited/xor.png b/tests/python_tests/images/composited/xor.png
deleted file mode 100644
index b6f2f2f..0000000
Binary files a/tests/python_tests/images/composited/xor.png and /dev/null differ
diff --git a/tests/python_tests/images/pycairo/cairo-cairo-expected-reduced.png b/tests/python_tests/images/pycairo/cairo-cairo-expected-reduced.png
deleted file mode 100644
index 6c3bfc9..0000000
Binary files a/tests/python_tests/images/pycairo/cairo-cairo-expected-reduced.png and /dev/null differ
diff --git a/tests/python_tests/images/pycairo/cairo-cairo-expected.pdf b/tests/python_tests/images/pycairo/cairo-cairo-expected.pdf
deleted file mode 100644
index 7c654ae..0000000
Binary files a/tests/python_tests/images/pycairo/cairo-cairo-expected.pdf and /dev/null differ
diff --git a/tests/python_tests/images/pycairo/cairo-cairo-expected.png b/tests/python_tests/images/pycairo/cairo-cairo-expected.png
deleted file mode 100644
index 1c31f0e..0000000
Binary files a/tests/python_tests/images/pycairo/cairo-cairo-expected.png and /dev/null differ
diff --git a/tests/python_tests/images/pycairo/cairo-cairo-expected.svg b/tests/python_tests/images/pycairo/cairo-cairo-expected.svg
deleted file mode 100644
index ae1e90b..0000000
--- a/tests/python_tests/images/pycairo/cairo-cairo-expected.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="512pt" height="512pt" viewBox="0 0 512 512" version="1.1">
-<defs>
-<g>
-<symbol overflow="visible" id="glyph0-0">
-<path style="stroke:none;" d="M 1 3.53125 L 1 -14.109375 L 11 -14.109375 L 11 3.53125 Z M 2.125 2.421875 L 9.890625 2.421875 L 9.890625 -12.984375 L 2.125 -12.984375 Z "/>
-</symbol>
-<symbol overflow="visible" id="glyph0-1">
-<path style="stroke:none;" d="M 1.96875 -14.578125 L 3.9375 -14.578125 L 3.9375 -8.609375 L 11.109375 -8.609375 L 11.109375 -14.578125 L 13.078125 -14.578125 L 13.078125 0 L 11.109375 0 L 11.109375 -6.9375 L 3.9375 -6.9375 L 3.9375 0 L 1.96875 0 Z "/>
-</symbol>
-<symbol overflow="visible" id="glyph0-2">
-<path style="stroke:none;" d="M 11.234375 -5.921875 L 11.234375 -5.046875 L 2.984375 -5.046875 C 3.054688 -3.804688 3.425781 -2.859375 4.09375 -2.203125 C 4.757812 -1.554688 5.691406 -1.234375 6.890625 -1.234375 C 7.578125 -1.234375 8.242188 -1.316406 8.890625 -1.484375 C 9.535156 -1.660156 10.179688 -1.914062 10.828125 -2.25 L 10.828125 -0.5625 C 10.179688 -0.28125 9.519531 -0.0703125 8.84375 0.0625 C 8.164062 0.207031 7.476562 0.28125 6.78125 0.28125 C 5.03125 0.28125 3.644531 -0.22265 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-3">
-<path style="stroke:none;" d="M 1.890625 -15.203125 L 3.6875 -15.203125 L 3.6875 0 L 1.890625 0 Z "/>
-</symbol>
-<symbol overflow="visible" id="glyph0-4">
-<path style="stroke:none;" d="M 6.125 -9.671875 C 5.15625 -9.671875 4.390625 -9.296875 3.828125 -8.546875 C 3.273438 -7.796875 3 -6.765625 3 -5.453125 C 3 -4.148438 3.273438 -3.117188 3.828125 -2.359375 C 4.390625 -1.609375 5.15625 -1.234375 6.125 -1.234375 C 7.082031 -1.234375 7.835938 -1.609375 8.390625 -2.359375 C 8.953125 -3.117188 9.234375 -4.148438 9.234375 -5.453125 C 9.234375 -6.753906 8.953125 -7.78125 8.390625 -8.53125 C 7.835938 -9.289062 7.082031 -9.671875 6.125 -9.671875 Z M [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-5">
-<path style="stroke:none;" d=""/>
-</symbol>
-<symbol overflow="visible" id="glyph0-6">
-<path style="stroke:none;" d="M 1.96875 -14.578125 L 4.90625 -14.578125 L 8.625 -4.65625 L 12.359375 -14.578125 L 15.296875 -14.578125 L 15.296875 0 L 13.375 0 L 13.375 -12.796875 L 9.625 -2.796875 L 7.640625 -2.796875 L 3.875 -12.796875 L 3.875 0 L 1.96875 0 Z "/>
-</symbol>
-<symbol overflow="visible" id="glyph0-7">
-<path style="stroke:none;" d="M 6.859375 -5.5 C 5.398438 -5.5 4.390625 -5.332031 3.828125 -5 C 3.273438 -4.664062 3 -4.097656 3 -3.296875 C 3 -2.660156 3.207031 -2.15625 3.625 -1.78125 C 4.050781 -1.40625 4.625 -1.21875 5.34375 -1.21875 C 6.34375 -1.21875 7.140625 -1.570312 7.734375 -2.28125 C 8.335938 -2.988281 8.640625 -3.925781 8.640625 -5.09375 L 8.640625 -5.5 Z M 10.4375 -6.234375 L 10.4375 0 L 8.640625 0 L 8.640625 -1.65625 C 8.234375 -1 7.722656 -0.507812 7.109375 -0.1875 C 6.4921 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-8">
-<path style="stroke:none;" d="M 3.625 -1.640625 L 3.625 4.15625 L 1.8125 4.15625 L 1.8125 -10.9375 L 3.625 -10.9375 L 3.625 -9.28125 C 4 -9.925781 4.472656 -10.40625 5.046875 -10.71875 C 5.628906 -11.039062 6.320312 -11.203125 7.125 -11.203125 C 8.445312 -11.203125 9.523438 -10.671875 10.359375 -9.609375 C 11.191406 -8.554688 11.609375 -7.171875 11.609375 -5.453125 C 11.609375 -3.734375 11.191406 -2.347656 10.359375 -1.296875 C 9.523438 -0.242188 8.445312 0.28125 7.125 0.28125 C 6.320312 [...]
-</symbol>
-</g>
-</defs>
-<g id="surface1">
-<rect x="0" y="0" width="512" height="512" style="fill:rgb(27.45098%,50.980392%,70.588235%);fill-opacity:1;stroke:none;"/>
-<path style="fill-rule:nonzero;fill:rgb(0%,0%,100%);fill-opacity:1;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:4;" d="M 5 0 L 4.503906 2.167969 L 3.117188 3.910156 L 1.113281 4.875 L -1.113281 4.875 L -3.117188 3.910156 L -4.503906 2.167969 L -5 0 L -4.503906 -2.167969 L -3.117188 -3.910156 L -1.113281 -4.875 L 1.113281 -4.875 L 3.117188 -3.910156 L 4.503906 -2.167969 Z " transform="matrix(1,0,0,1,256,256)"/>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-1" x="205.929688" y="25.523438"/>
- <use xlink:href="#glyph0-2" x="220.96875" y="25.523438"/>
- <use xlink:href="#glyph0-3" x="233.273438" y="25.523438"/>
- <use xlink:href="#glyph0-3" x="238.830078" y="25.523438"/>
- <use xlink:href="#glyph0-4" x="244.386719" y="25.523438"/>
- <use xlink:href="#glyph0-5" x="256.623047" y="25.523438"/>
- <use xlink:href="#glyph0-6" x="262.980469" y="25.523438"/>
- <use xlink:href="#glyph0-7" x="280.236328" y="25.523438"/>
- <use xlink:href="#glyph0-8" x="292.492188" y="25.523438"/>
-</g>
-<path style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L 512 0 L 512 512 L 0 512 Z M 6 6 L 506 6 L 506 506 L 6 506 Z "/>
-</g>
-</svg>
diff --git a/tests/python_tests/images/pycairo/cairo-surface-expected.building.pdf b/tests/python_tests/images/pycairo/cairo-surface-expected.building.pdf
deleted file mode 100644
index 21d0661..0000000
Binary files a/tests/python_tests/images/pycairo/cairo-surface-expected.building.pdf and /dev/null differ
diff --git a/tests/python_tests/images/pycairo/cairo-surface-expected.building.svg b/tests/python_tests/images/pycairo/cairo-surface-expected.building.svg
deleted file mode 100644
index 48cf241..0000000
--- a/tests/python_tests/images/pycairo/cairo-surface-expected.building.svg
+++ /dev/null
@@ -1,261 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="256pt" height="256pt" viewBox="0 0 256 256" version="1.1">
-<g id="surface39">
-<rect x="0" y="0" width="256" height="256" style="fill:rgb(27.45098%,50.980392%,70.588235%);fill-opacity:1;stroke:none;"/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 132.222656 27.054688 L 141.789062 23.054688 L 141.789062 20.75 L 132.222656 24.746094 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 132.507812 28.515625 L 132.222656 27.054688 L 132.222656 24.746094 L 132.507812 26.207031 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 141.789062 23.054688 L 145.058594 32.933594 L 145.058594 30.628906 L 141.789062 20.75 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 108.777344 39.203125 L 132.507812 28.515625 L 132.507812 26.207031 L 108.777344 36.894531 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 127.984375 38.507812 L 122.578125 41.546875 L 122.578125 39.238281 L 127.984375 36.203125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 102.367188 41.585938 L 108.777344 39.203125 L 108.777344 36.894531 L 102.367188 39.277344 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 131.019531 45.429688 L 127.984375 38.507812 L 127.984375 36.203125 L 131.019531 43.121094 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 122.578125 41.546875 L 118.730469 49.234375 L 118.730469 46.929688 L 122.578125 39.238281 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 105.6875 50.042969 L 102.367188 41.585938 L 102.367188 39.277344 L 105.6875 47.734375 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 134.109375 51.578125 L 131.019531 45.429688 L 131.019531 43.121094 L 134.109375 49.273438 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 115.65625 56.117188 L 105.6875 50.042969 L 105.6875 47.734375 L 115.65625 53.808594 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 118.730469 49.234375 L 115.65625 56.117188 L 115.65625 53.808594 L 118.730469 46.929688 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 136.332031 59.265625 L 134.109375 51.578125 L 134.109375 49.273438 L 136.332031 56.960938 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 135.882812 66.1875 L 136.332031 59.265625 L 136.332031 56.960938 L 135.882812 63.878906 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 145.058594 32.933594 L 157.566406 68.800781 L 157.566406 66.496094 L 145.058594 30.628906 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 135.675781 71.570312 L 135.882812 66.1875 L 135.882812 63.878906 L 135.675781 69.261719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 157.566406 68.800781 L 159.464844 73.835938 L 159.464844 71.53125 L 157.566406 66.496094 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 159.464844 73.835938 L 139.804688 81.023438 L 139.804688 78.71875 L 159.464844 71.53125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 139.804688 81.023438 L 135.675781 71.570312 L 135.675781 69.261719 L 139.804688 78.71875 "/>
-<path style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(80%,80%,0%);stroke-opacity:0.7;stroke-miterlimit:10;" d="M 115.65625 56.117188 L 105.6875 50.042969 L 102.367188 41.585938 L 108.777344 39.203125 L 132.507812 28.515625 L 132.222656 27.054688 L 141.789062 23.054688 L 145.058594 32.933594 L 157.566406 68.800781 L 159.464844 73.835938 L 139.804688 81.023438 L 135.675781 71.570312 L 135.882812 66.1875 L 136.332031 59.265625 L 134.109375 51.578125 L 13 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:0.7;" d="M 115.65625 53.808594 L 105.6875 47.734375 L 102.367188 39.277344 L 108.777344 36.894531 L 132.507812 26.207031 L 132.222656 24.746094 L 141.789062 20.75 L 145.058594 30.628906 L 157.566406 66.496094 L 159.464844 71.53125 L 139.804688 78.71875 L 135.675781 69.261719 L 135.882812 63.878906 L 136.332031 56.960938 L 134.109375 49.273438 L 131.019531 43.121094 L 127.984375 36.203125 L 122.578125 39.23828 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 132.222656 27.054688 L 132.507812 28.515625 L 132.507812 26.207031 L 132.222656 24.746094 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 132.507812 28.515625 L 108.777344 39.203125 L 108.777344 36.894531 L 132.507812 26.207031 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 101.800781 39.277344 L 132.222656 27.054688 L 132.222656 24.746094 L 101.800781 36.972656 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 108.777344 39.203125 L 102.367188 41.585938 L 102.367188 39.277344 L 108.777344 36.894531 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 102.367188 41.585938 L 105.6875 50.042969 L 105.6875 47.734375 L 102.367188 39.277344 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 64.152344 54.578125 L 101.800781 39.277344 L 101.800781 36.972656 L 64.152344 52.269531 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 105.6875 50.042969 L 115.65625 56.117188 L 115.65625 53.808594 L 105.6875 47.734375 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 53.773438 58.652344 L 64.152344 54.578125 L 64.152344 52.269531 L 53.773438 56.347656 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 56.199219 60.996094 L 54.90625 61.496094 L 54.90625 59.191406 L 56.199219 58.691406 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 54.90625 61.496094 L 53.773438 58.652344 L 53.773438 56.347656 L 54.90625 59.191406 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 115.65625 56.117188 L 112.578125 61.574219 L 112.578125 59.265625 L 115.65625 53.808594 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 62.101562 68.839844 L 56.199219 60.996094 L 56.199219 58.691406 L 62.101562 66.53125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 88.605469 74.414062 L 84.253906 74.566406 L 84.253906 72.261719 L 88.605469 72.105469 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 112.578125 61.574219 L 105.039062 74.605469 L 105.039062 72.300781 L 112.578125 59.265625 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 105.039062 74.605469 L 88.605469 74.414062 L 88.605469 72.105469 L 105.039062 72.300781 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 84.253906 74.566406 L 79.761719 74.644531 L 79.761719 72.335938 L 84.253906 72.261719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 79.761719 74.644531 L 68.664062 79.027344 L 68.664062 76.71875 L 79.761719 72.335938 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 68.664062 79.027344 L 67.753906 79.296875 L 67.753906 76.988281 L 68.664062 76.71875 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 67.753906 79.296875 L 62.101562 68.839844 L 62.101562 66.53125 L 67.753906 76.988281 "/>
-<path style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(80%,80%,0%);stroke-opacity:0.7;stroke-miterlimit:10;" d="M 132.222656 27.054688 L 132.507812 28.515625 L 108.777344 39.203125 L 102.367188 41.585938 L 105.6875 50.042969 L 115.65625 56.117188 L 112.578125 61.574219 L 105.039062 74.605469 L 88.605469 74.414062 L 84.253906 74.566406 L 79.761719 74.644531 L 68.664062 79.027344 L 67.753906 79.296875 L 62.101562 68.839844 L 56.199219 60.996094 L 54.9062 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:0.7;" d="M 132.222656 24.746094 L 132.507812 26.207031 L 108.777344 36.894531 L 102.367188 39.277344 L 105.6875 47.734375 L 115.65625 53.808594 L 112.578125 59.265625 L 105.039062 72.300781 L 88.605469 72.105469 L 84.253906 72.261719 L 79.761719 72.335938 L 68.664062 76.71875 L 67.753906 76.988281 L 62.101562 66.53125 L 56.199219 58.691406 L 54.90625 59.191406 L 53.773438 56.347656 L 64.152344 52.269531 L 101 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 122.578125 41.546875 L 127.984375 38.507812 L 127.984375 36.203125 L 122.578125 39.238281 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 127.984375 38.507812 L 131.019531 45.429688 L 131.019531 43.121094 L 127.984375 36.203125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 118.730469 49.234375 L 122.578125 41.546875 L 122.578125 39.238281 L 118.730469 46.929688 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 131.019531 45.429688 L 134.109375 51.578125 L 134.109375 49.273438 L 131.019531 43.121094 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 115.65625 56.117188 L 118.730469 49.234375 L 118.730469 46.929688 L 115.65625 53.808594 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 134.109375 51.578125 L 136.332031 59.265625 L 136.332031 56.960938 L 134.109375 49.273438 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 112.578125 61.574219 L 115.65625 56.117188 L 115.65625 53.808594 L 112.578125 59.265625 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 136.332031 59.265625 L 135.882812 66.1875 L 135.882812 63.878906 L 136.332031 56.960938 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 135.882812 66.1875 L 129.527344 66.6875 L 129.527344 64.378906 L 135.882812 63.878906 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 129.527344 66.6875 L 124.503906 68.453125 L 124.503906 66.148438 L 129.527344 64.378906 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 124.503906 68.453125 L 121.441406 69.992188 L 121.441406 67.6875 L 124.503906 66.148438 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 84.253906 74.566406 L 88.605469 74.414062 L 88.605469 72.105469 L 84.253906 72.261719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 105.039062 74.605469 L 112.578125 61.574219 L 112.578125 59.265625 L 105.039062 72.300781 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 88.605469 74.414062 L 105.039062 74.605469 L 105.039062 72.300781 L 88.605469 72.105469 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 79.761719 74.644531 L 84.253906 74.566406 L 84.253906 72.261719 L 79.761719 72.335938 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 68.664062 79.027344 L 79.761719 74.644531 L 79.761719 72.335938 L 68.664062 76.71875 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 67.753906 79.296875 L 68.664062 79.027344 L 68.664062 76.71875 L 67.753906 76.988281 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 121.441406 69.992188 L 109.082031 80.371094 L 109.082031 78.066406 L 121.441406 67.6875 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 109.082031 80.371094 L 104.925781 81.371094 L 104.925781 79.066406 L 109.082031 78.066406 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 61.679688 81.753906 L 67.753906 79.296875 L 67.753906 76.988281 L 61.679688 79.449219 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 104.925781 81.371094 L 102.195312 83.253906 L 102.195312 80.949219 L 104.925781 79.066406 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 102.195312 83.253906 L 101.664062 85.136719 L 101.664062 82.832031 L 102.195312 80.949219 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 101.664062 85.136719 L 100.078125 88.445312 L 100.078125 86.136719 L 101.664062 82.832031 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 100.078125 88.445312 L 97.773438 91.671875 L 97.773438 89.367188 L 100.078125 86.136719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 97.773438 91.671875 L 94.757812 93.558594 L 94.757812 91.25 L 97.773438 89.367188 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 94.757812 93.558594 L 91.441406 100.015625 L 91.441406 97.707031 L 94.757812 91.25 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 91.441406 100.015625 L 71.058594 108.050781 L 71.058594 105.742188 L 91.441406 97.707031 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 71.058594 108.050781 L 61.679688 81.753906 L 61.679688 79.449219 L 71.058594 105.742188 "/>
-<path style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(80%,80%,0%);stroke-opacity:0.7;stroke-miterlimit:10;" d="M 115.65625 56.117188 L 118.730469 49.234375 L 122.578125 41.546875 L 127.984375 38.507812 L 131.019531 45.429688 L 134.109375 51.578125 L 136.332031 59.265625 L 135.882812 66.1875 L 129.527344 66.6875 L 124.503906 68.453125 L 121.441406 69.992188 L 109.082031 80.371094 L 104.925781 81.371094 L 102.195312 83.253906 L 101.664062 85.136719 L 10 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:0.7;" d="M 115.65625 53.808594 L 118.730469 46.929688 L 122.578125 39.238281 L 127.984375 36.203125 L 131.019531 43.121094 L 134.109375 49.273438 L 136.332031 56.960938 L 135.882812 63.878906 L 129.527344 64.378906 L 124.503906 66.148438 L 121.441406 67.6875 L 109.082031 78.066406 L 104.925781 79.066406 L 102.195312 80.949219 L 101.664062 82.832031 L 100.078125 86.136719 L 97.773438 89.367188 L 94.757812 91.2 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 53.773438 58.652344 L 54.90625 61.496094 L 54.90625 59.191406 L 53.773438 56.347656 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 44.109375 62.304688 L 53.773438 58.652344 L 53.773438 56.347656 L 44.109375 59.996094 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 0 79.527344 L 44.109375 62.304688 L 44.109375 59.996094 L 0 77.21875 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 54.90625 61.496094 L 61.679688 81.753906 L 61.679688 79.449219 L 54.90625 59.191406 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 23.488281 86.253906 L 21.667969 87.945312 L 21.667969 85.636719 L 23.488281 83.945312 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 28.25 90.710938 L 23.488281 86.253906 L 23.488281 83.945312 L 28.25 88.40625 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 21.667969 87.945312 L 16.679688 93.402344 L 16.679688 91.097656 L 21.667969 85.636719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 7.113281 96.59375 L 0 79.527344 L 0 77.21875 L 7.113281 94.289062 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 11.117188 99.59375 L 7.113281 96.59375 L 7.113281 94.289062 L 11.117188 97.285156 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 16.679688 93.402344 L 11.117188 99.59375 L 11.117188 97.285156 L 16.679688 91.097656 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 14.351562 105.242188 L 28.25 90.710938 L 28.25 88.40625 L 14.351562 102.9375 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 10.238281 106.011719 L 14.351562 105.242188 L 14.351562 102.9375 L 10.238281 103.707031 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 61.679688 81.753906 L 71.058594 108.050781 L 71.058594 105.742188 L 61.679688 79.449219 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 10.171875 111.96875 L 10.238281 106.011719 L 10.238281 103.707031 L 10.171875 109.664062 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 9.871094 116.082031 L 10.171875 111.96875 L 10.171875 109.664062 L 9.871094 113.777344 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 54.027344 114.699219 L 44.699219 118.351562 L 44.699219 116.042969 L 54.027344 112.394531 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 71.058594 108.050781 L 76.140625 119.121094 L 76.140625 116.8125 L 71.058594 105.742188 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 11.242188 120.925781 L 9.871094 116.082031 L 9.871094 113.777344 L 11.242188 118.621094 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 76.140625 119.121094 L 72.308594 122.695312 L 72.308594 120.390625 L 76.140625 116.8125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 44.699219 118.351562 L 33.3125 123.15625 L 33.3125 120.851562 L 44.699219 116.042969 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 14.414062 130.113281 L 11.242188 120.925781 L 11.242188 118.621094 L 14.414062 127.808594 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 33.3125 123.15625 L 14.414062 130.113281 L 14.414062 127.808594 L 33.3125 120.851562 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 72.308594 122.695312 L 69.605469 130.535156 L 69.605469 128.230469 L 72.308594 120.390625 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 61.425781 133.496094 L 54.027344 114.699219 L 54.027344 112.394531 L 61.425781 131.191406 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 69.605469 130.535156 L 61.425781 133.496094 L 61.425781 131.191406 L 69.605469 128.230469 "/>
-<path style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(80%,80%,0%);stroke-opacity:0.7;stroke-miterlimit:10;" d="M 53.773438 58.652344 L 54.90625 61.496094 L 61.679688 81.753906 L 71.058594 108.050781 L 76.140625 119.121094 L 72.308594 122.695312 L 69.605469 130.535156 L 61.425781 133.496094 L 54.027344 114.699219 L 44.699219 118.351562 L 33.3125 123.15625 L 14.414062 130.113281 L 11.242188 120.925781 L 9.871094 116.082031 L 10.171875 111.96875 L 10.238 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:0.7;" d="M 53.773438 56.347656 L 54.90625 59.191406 L 61.679688 79.449219 L 71.058594 105.742188 L 76.140625 116.8125 L 72.308594 120.390625 L 69.605469 128.230469 L 61.425781 131.191406 L 54.027344 112.394531 L 44.699219 116.042969 L 33.3125 120.851562 L 14.414062 127.808594 L 11.242188 118.621094 L 9.871094 113.777344 L 10.171875 109.664062 L 10.238281 103.707031 L 14.351562 102.9375 L 28.25 88.40625 L 23.4 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 54.90625 61.496094 L 56.199219 60.996094 L 56.199219 58.691406 L 54.90625 59.191406 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 56.199219 60.996094 L 62.101562 68.839844 L 62.101562 66.53125 L 56.199219 58.691406 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 62.101562 68.839844 L 67.753906 79.296875 L 67.753906 76.988281 L 62.101562 66.53125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 67.753906 79.296875 L 61.679688 81.753906 L 61.679688 79.449219 L 67.753906 76.988281 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 61.679688 81.753906 L 54.90625 61.496094 L 54.90625 59.191406 L 61.679688 79.449219 "/>
-<path style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(80%,80%,0%);stroke-opacity:0.7;stroke-miterlimit:10;" d="M 54.90625 61.496094 L 56.199219 60.996094 L 62.101562 68.839844 L 67.753906 79.296875 L 61.679688 81.753906 Z M 54.90625 61.496094 L 54.90625 59.191406 M 56.199219 60.996094 L 56.199219 58.691406 M 62.101562 68.839844 L 62.101562 66.53125 M 67.753906 79.296875 L 67.753906 76.988281 M 61.679688 81.753906 L 61.679688 79.449219 M 54.90625 59.19 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:0.7;" d="M 54.90625 59.191406 L 56.199219 58.691406 L 62.101562 66.53125 L 67.753906 76.988281 L 61.679688 79.449219 Z "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 129.527344 66.6875 L 135.882812 66.1875 L 135.882812 63.878906 L 129.527344 64.378906 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 124.503906 68.453125 L 129.527344 66.6875 L 129.527344 64.378906 L 124.503906 66.148438 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 121.441406 69.992188 L 124.503906 68.453125 L 124.503906 66.148438 L 121.441406 67.6875 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 135.882812 66.1875 L 135.675781 71.570312 L 135.675781 69.261719 L 135.882812 63.878906 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 109.082031 80.371094 L 121.441406 69.992188 L 121.441406 67.6875 L 109.082031 78.066406 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 135.675781 71.570312 L 139.804688 81.023438 L 139.804688 78.71875 L 135.675781 69.261719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 104.925781 81.371094 L 109.082031 80.371094 L 109.082031 78.066406 L 104.925781 79.066406 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 102.195312 83.253906 L 104.925781 81.371094 L 104.925781 79.066406 L 102.195312 80.949219 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 101.664062 85.136719 L 102.195312 83.253906 L 102.195312 80.949219 L 101.664062 82.832031 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 139.804688 81.023438 L 127.082031 86.292969 L 127.082031 83.984375 L 139.804688 78.71875 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 100.078125 88.445312 L 101.664062 85.136719 L 101.664062 82.832031 L 100.078125 86.136719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 109.199219 89.058594 L 101.835938 91.441406 L 101.835938 89.136719 L 109.199219 86.753906 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 97.773438 91.671875 L 100.078125 88.445312 L 100.078125 86.136719 L 97.773438 89.367188 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 110.335938 92.902344 L 109.199219 89.058594 L 109.199219 86.753906 L 110.335938 90.597656 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 127.082031 86.292969 L 110.335938 92.902344 L 110.335938 90.597656 L 127.082031 83.984375 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 94.757812 93.558594 L 97.773438 91.671875 L 97.773438 89.367188 L 94.757812 91.25 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 101.835938 91.441406 L 103.257812 95.363281 L 103.257812 93.058594 L 101.835938 89.136719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 103.257812 95.363281 L 91.441406 100.015625 L 91.441406 97.707031 L 103.257812 93.058594 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 91.441406 100.015625 L 94.757812 93.558594 L 94.757812 91.25 L 91.441406 97.707031 "/>
-<path style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(80%,80%,0%);stroke-opacity:0.7;stroke-miterlimit:10;" d="M 135.882812 66.1875 L 135.675781 71.570312 L 139.804688 81.023438 L 127.082031 86.292969 L 110.335938 92.902344 L 109.199219 89.058594 L 101.835938 91.441406 L 103.257812 95.363281 L 91.441406 100.015625 L 94.757812 93.558594 L 97.773438 91.671875 L 100.078125 88.445312 L 101.664062 85.136719 L 102.195312 83.253906 L 104.925781 81.371094 L 1 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:0.7;" d="M 135.882812 63.878906 L 135.675781 69.261719 L 139.804688 78.71875 L 127.082031 83.984375 L 110.335938 90.597656 L 109.199219 86.753906 L 101.835938 89.136719 L 103.257812 93.058594 L 91.441406 97.707031 L 94.757812 91.25 L 97.773438 89.367188 L 100.078125 86.136719 L 101.664062 82.832031 L 102.195312 80.949219 L 104.925781 79.066406 L 109.082031 78.066406 L 121.441406 67.6875 L 124.503906 66.148438 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 159.464844 73.835938 L 170.804688 68.917969 L 170.804688 66.609375 L 159.464844 71.53125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 170.804688 68.917969 L 173.171875 76.296875 L 173.171875 73.992188 L 170.804688 66.609375 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 139.804688 81.023438 L 159.464844 73.835938 L 159.464844 71.53125 L 139.804688 78.71875 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 173.171875 76.296875 L 176.019531 82.679688 L 176.019531 80.371094 L 173.171875 73.992188 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 127.082031 86.292969 L 139.804688 81.023438 L 139.804688 78.71875 L 127.082031 83.984375 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 149.34375 87.90625 L 143.125 89.828125 L 143.125 87.523438 L 149.34375 85.601562 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 174.757812 89.945312 L 171.078125 89.90625 L 171.078125 87.597656 L 174.757812 87.636719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 176.019531 82.679688 L 183.402344 90.136719 L 183.402344 87.828125 L 176.019531 80.371094 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 128.355469 90.597656 L 127.082031 86.292969 L 127.082031 83.984375 L 128.355469 88.289062 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 143.125 89.828125 L 136.710938 92.828125 L 136.710938 90.519531 L 143.125 87.523438 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 171.078125 89.90625 L 169.109375 93.441406 L 169.109375 91.136719 L 171.078125 87.597656 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 183.402344 90.136719 L 184.109375 93.789062 L 184.109375 91.480469 L 183.402344 87.828125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 184.109375 93.789062 L 174.757812 89.945312 L 174.757812 87.636719 L 184.109375 91.480469 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 130.351562 95.019531 L 128.355469 90.597656 L 128.355469 88.289062 L 130.351562 92.710938 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 136.710938 92.828125 L 130.351562 95.019531 L 130.351562 92.710938 L 136.710938 90.519531 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 169.109375 93.441406 L 185.757812 103.707031 L 185.757812 101.398438 L 169.109375 91.136719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 155.929688 105.933594 L 149.34375 87.90625 L 149.34375 85.601562 L 155.929688 103.628906 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 155.917969 110.203125 L 155.929688 105.933594 L 155.929688 103.628906 L 155.917969 107.894531 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 185.757812 103.707031 L 182.722656 112.007812 L 182.722656 109.703125 L 185.757812 101.398438 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 182.722656 112.007812 L 181.617188 113.125 L 181.617188 110.816406 L 182.722656 109.703125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 181.617188 113.125 L 179.890625 116.3125 L 179.890625 114.007812 L 181.617188 110.816406 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 153.800781 116.507812 L 155.917969 110.203125 L 155.917969 107.894531 L 153.800781 114.199219 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 179.890625 116.3125 L 174.433594 119.734375 L 174.433594 117.429688 L 179.890625 114.007812 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 151.734375 120.082031 L 153.800781 116.507812 L 153.800781 114.199219 L 151.734375 117.773438 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 174.433594 119.734375 L 167.976562 121.773438 L 167.976562 119.464844 L 174.433594 117.429688 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 147.519531 123.503906 L 151.734375 120.082031 L 151.734375 117.773438 L 147.519531 121.195312 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 167.976562 121.773438 L 157.070312 125.578125 L 157.070312 123.273438 L 167.976562 119.464844 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 141.585938 126.386719 L 147.519531 123.503906 L 147.519531 121.195312 L 141.585938 124.078125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 144.289062 132.804688 L 141.585938 126.386719 L 141.585938 124.078125 L 144.289062 130.5 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 157.070312 125.578125 L 144.289062 132.804688 L 144.289062 130.5 L 157.070312 123.273438 "/>
-<path style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(80%,80%,0%);stroke-opacity:0.7;stroke-miterlimit:10;" d="M 159.464844 73.835938 L 170.804688 68.917969 L 173.171875 76.296875 L 176.019531 82.679688 L 183.402344 90.136719 L 184.109375 93.789062 L 174.757812 89.945312 L 171.078125 89.90625 L 169.109375 93.441406 L 185.757812 103.707031 L 182.722656 112.007812 L 181.617188 113.125 L 179.890625 116.3125 L 174.433594 119.734375 L 167.976562 121.773438 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:0.7;" d="M 159.464844 71.53125 L 170.804688 66.609375 L 173.171875 73.992188 L 176.019531 80.371094 L 183.402344 87.828125 L 184.109375 91.480469 L 174.757812 87.636719 L 171.078125 87.597656 L 169.109375 91.136719 L 185.757812 101.398438 L 182.722656 109.703125 L 181.617188 110.816406 L 179.890625 114.007812 L 174.433594 117.429688 L 167.976562 119.464844 L 157.070312 123.273438 L 144.289062 130.5 L 141.5859 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 247.820312 71.339844 L 250.59375 70.03125 L 250.59375 67.722656 L 247.820312 69.03125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 245.570312 72.53125 L 247.820312 71.339844 L 247.820312 69.03125 L 245.570312 70.222656 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 241.550781 74.835938 L 245.570312 72.53125 L 245.570312 70.222656 L 241.550781 72.53125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 213.167969 74.914062 L 216.90625 70.414062 L 216.90625 68.109375 L 213.167969 72.605469 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 250.59375 70.03125 L 252.679688 76.488281 L 252.679688 74.183594 L 250.59375 67.722656 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 216.90625 70.414062 L 228.015625 79.488281 L 228.015625 77.179688 L 216.90625 68.109375 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 205.175781 79.601562 L 213.167969 74.914062 L 213.167969 72.605469 L 205.175781 77.296875 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 242.207031 79.796875 L 241.550781 74.835938 L 241.550781 72.53125 L 242.207031 77.488281 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 201.0625 81.371094 L 205.175781 79.601562 L 205.175781 77.296875 L 201.0625 79.066406 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 200.394531 81.488281 L 201.0625 81.371094 L 201.0625 79.066406 L 200.394531 79.179688 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 252.679688 76.488281 L 254.8125 83.101562 L 254.8125 80.792969 L 252.679688 74.183594 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 192.929688 83.832031 L 200.394531 81.488281 L 200.394531 79.179688 L 192.929688 81.523438 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 228.015625 79.488281 L 228.765625 84.601562 L 228.765625 82.292969 L 228.015625 77.179688 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 228.765625 84.601562 L 242.207031 79.796875 L 242.207031 77.488281 L 228.765625 82.292969 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 254.8125 83.101562 L 256 85.5625 L 256 83.253906 L 254.8125 80.792969 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 256 85.5625 L 255.28125 85.714844 L 255.28125 83.410156 L 256 83.253906 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 188.046875 87.058594 L 192.929688 83.832031 L 192.929688 81.523438 L 188.046875 84.753906 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 171.078125 89.90625 L 174.757812 89.945312 L 174.757812 87.636719 L 171.078125 87.597656 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 183.402344 90.136719 L 188.046875 87.058594 L 188.046875 84.753906 L 183.402344 87.828125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 169.109375 93.441406 L 171.078125 89.90625 L 171.078125 87.597656 L 169.109375 91.136719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 174.757812 89.945312 L 184.109375 93.789062 L 184.109375 91.480469 L 174.757812 87.636719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 184.109375 93.789062 L 183.402344 90.136719 L 183.402344 87.828125 L 184.109375 91.480469 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 255.28125 85.714844 L 224.476562 96.902344 L 224.476562 94.59375 L 255.28125 83.410156 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 224.476562 96.902344 L 222.519531 98.167969 L 222.519531 95.863281 L 224.476562 94.59375 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 222.519531 98.167969 L 221.703125 98.9375 L 221.703125 96.632812 L 222.519531 95.863281 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 221.703125 98.9375 L 220.648438 100.207031 L 220.648438 97.902344 L 221.703125 96.632812 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 220.648438 100.207031 L 218.683594 102.28125 L 218.683594 99.976562 L 220.648438 97.902344 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 185.757812 103.707031 L 169.109375 93.441406 L 169.109375 91.136719 L 185.757812 101.398438 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 218.683594 102.28125 L 217.1875 107.625 L 217.1875 105.320312 L 218.683594 99.976562 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 217.1875 107.625 L 217.277344 109.933594 L 217.277344 107.625 L 217.1875 105.320312 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 182.722656 112.007812 L 185.757812 103.707031 L 185.757812 101.398438 L 182.722656 109.703125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 181.617188 113.125 L 182.722656 112.007812 L 182.722656 109.703125 L 181.617188 110.816406 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 179.890625 116.3125 L 181.617188 113.125 L 181.617188 110.816406 L 179.890625 114.007812 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 174.433594 119.734375 L 179.890625 116.3125 L 179.890625 114.007812 L 174.433594 117.429688 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 167.976562 121.773438 L 174.433594 119.734375 L 174.433594 117.429688 L 167.976562 119.464844 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 157.070312 125.578125 L 167.976562 121.773438 L 167.976562 119.464844 L 157.070312 123.273438 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 138.746094 132.382812 L 144.289062 132.804688 L 144.289062 130.5 L 138.746094 130.074219 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 144.289062 132.804688 L 157.070312 125.578125 L 157.070312 123.273438 L 144.289062 130.5 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 217.277344 109.933594 L 221.75 133.035156 L 221.75 130.730469 L 217.277344 107.625 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 221.75 133.035156 L 217.414062 146.066406 L 217.414062 143.761719 L 221.75 130.730469 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 217.414062 146.066406 L 216.40625 148.449219 L 216.40625 146.144531 L 217.414062 143.761719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 94.914062 153.0625 L 138.746094 132.382812 L 138.746094 130.074219 L 94.914062 150.757812 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 216.40625 148.449219 L 209.457031 155.371094 L 209.457031 153.0625 L 216.40625 146.144531 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 90.503906 158.40625 L 94.914062 153.0625 L 94.914062 150.757812 L 90.503906 156.101562 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 209.457031 155.371094 L 197.367188 172.246094 L 197.367188 169.9375 L 209.457031 153.0625 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 197.367188 172.246094 L 193.015625 173.746094 L 193.015625 171.4375 L 197.367188 169.9375 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 193.015625 173.746094 L 186.796875 175.4375 L 186.796875 173.128906 L 193.015625 171.4375 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 179.820312 175.511719 L 175.621094 173.015625 L 175.621094 170.707031 L 179.820312 173.207031 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 186.796875 175.4375 L 179.820312 175.511719 L 179.820312 173.207031 L 186.796875 173.128906 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 175.621094 173.015625 L 151.179688 179.433594 L 151.179688 177.128906 L 175.621094 170.707031 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 151.179688 179.433594 L 146.535156 182.738281 L 146.535156 180.433594 L 151.179688 177.128906 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 146.535156 182.738281 L 144.859375 184.625 L 144.859375 182.316406 L 146.535156 180.433594 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 144.859375 184.625 L 144.503906 190.695312 L 144.503906 188.390625 L 144.859375 182.316406 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 144.503906 190.695312 L 150.546875 200.269531 L 150.546875 197.960938 L 144.503906 188.390625 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 108.660156 207.035156 L 90.503906 158.40625 L 90.503906 156.101562 L 108.660156 204.726562 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 150.546875 200.269531 L 153.316406 218.875 L 153.316406 216.566406 L 150.546875 197.960938 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 153.316406 218.875 L 145.023438 226.640625 L 145.023438 224.332031 L 153.316406 216.566406 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 117.859375 231.675781 L 108.660156 207.035156 L 108.660156 204.726562 L 117.859375 229.367188 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 118.382812 232.945312 L 117.859375 231.675781 L 117.859375 229.367188 L 118.382812 230.636719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 145.023438 226.640625 L 118.382812 232.945312 L 118.382812 230.636719 L 145.023438 224.332031 "/>
-<path style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(80%,80%,0%);stroke-opacity:0.7;stroke-miterlimit:10;" d="M 183.402344 90.136719 L 188.046875 87.058594 L 192.929688 83.832031 L 200.394531 81.488281 L 201.0625 81.371094 L 205.175781 79.601562 L 213.167969 74.914062 L 216.90625 70.414062 L 228.015625 79.488281 L 228.765625 84.601562 L 242.207031 79.796875 L 241.550781 74.835938 L 245.570312 72.53125 L 247.820312 71.339844 L 250.59375 70.03125 L 252 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:0.7;" d="M 183.402344 87.828125 L 188.046875 84.753906 L 192.929688 81.523438 L 200.394531 79.179688 L 201.0625 79.066406 L 205.175781 77.296875 L 213.167969 72.605469 L 216.90625 68.109375 L 228.015625 77.179688 L 228.765625 82.292969 L 242.207031 77.488281 L 241.550781 72.53125 L 245.570312 70.222656 L 247.820312 69.03125 L 250.59375 67.722656 L 252.679688 74.183594 L 254.8125 80.792969 L 256 83.253906 L 25 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 143.125 89.828125 L 149.34375 87.90625 L 149.34375 85.601562 L 143.125 87.523438 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 127.082031 86.292969 L 128.355469 90.597656 L 128.355469 88.289062 L 127.082031 83.984375 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 136.710938 92.828125 L 143.125 89.828125 L 143.125 87.523438 L 136.710938 90.519531 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 110.335938 92.902344 L 127.082031 86.292969 L 127.082031 83.984375 L 110.335938 90.597656 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 128.355469 90.597656 L 130.351562 95.019531 L 130.351562 92.710938 L 128.355469 88.289062 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 130.351562 95.019531 L 136.710938 92.828125 L 136.710938 90.519531 L 130.351562 92.710938 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 103.257812 95.363281 L 110.335938 92.902344 L 110.335938 90.597656 L 103.257812 93.058594 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 91.441406 100.015625 L 103.257812 95.363281 L 103.257812 93.058594 L 91.441406 97.707031 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 149.34375 87.90625 L 155.929688 105.933594 L 155.929688 103.628906 L 149.34375 85.601562 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 71.058594 108.050781 L 91.441406 100.015625 L 91.441406 97.707031 L 71.058594 105.742188 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 155.929688 105.933594 L 155.917969 110.203125 L 155.917969 107.894531 L 155.929688 103.628906 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 155.917969 110.203125 L 153.800781 116.507812 L 153.800781 114.199219 L 155.917969 107.894531 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 76.140625 119.121094 L 71.058594 108.050781 L 71.058594 105.742188 L 76.140625 116.8125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 153.800781 116.507812 L 151.734375 120.082031 L 151.734375 117.773438 L 153.800781 114.199219 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 151.734375 120.082031 L 147.519531 123.503906 L 147.519531 121.195312 L 151.734375 117.773438 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 147.519531 123.503906 L 141.585938 126.386719 L 141.585938 124.078125 L 147.519531 121.195312 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 79.503906 129.191406 L 76.140625 119.121094 L 76.140625 116.8125 L 79.503906 126.886719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 144.289062 132.804688 L 138.746094 132.382812 L 138.746094 130.074219 L 144.289062 130.5 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 141.585938 126.386719 L 144.289062 132.804688 L 144.289062 130.5 L 141.585938 124.078125 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 83.292969 139.1875 L 79.503906 129.191406 L 79.503906 126.886719 L 83.292969 136.878906 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 86.144531 145.105469 L 83.292969 139.1875 L 83.292969 136.878906 L 86.144531 142.800781 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 86.664062 147.644531 L 86.144531 145.105469 L 86.144531 142.800781 L 86.664062 145.335938 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 138.746094 132.382812 L 94.914062 153.0625 L 94.914062 150.757812 L 138.746094 130.074219 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 90.121094 157.292969 L 86.664062 147.644531 L 86.664062 145.335938 L 90.121094 154.984375 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 94.914062 153.0625 L 90.503906 158.40625 L 90.503906 156.101562 L 94.914062 150.757812 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 90.503906 158.40625 L 90.121094 157.292969 L 90.121094 154.984375 L 90.503906 156.101562 "/>
-<path style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(80%,80%,0%);stroke-opacity:0.7;stroke-miterlimit:10;" d="M 110.335938 92.902344 L 127.082031 86.292969 L 128.355469 90.597656 L 130.351562 95.019531 L 136.710938 92.828125 L 143.125 89.828125 L 149.34375 87.90625 L 155.929688 105.933594 L 155.917969 110.203125 L 153.800781 116.507812 L 151.734375 120.082031 L 147.519531 123.503906 L 141.585938 126.386719 L 144.289062 132.804688 L 138.746094 132.382 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:0.7;" d="M 110.335938 90.597656 L 127.082031 83.984375 L 128.355469 88.289062 L 130.351562 92.710938 L 136.710938 90.519531 L 143.125 87.523438 L 149.34375 85.601562 L 155.929688 103.628906 L 155.917969 107.894531 L 153.800781 114.199219 L 151.734375 117.773438 L 147.519531 121.195312 L 141.585938 124.078125 L 144.289062 130.5 L 138.746094 130.074219 L 94.914062 150.757812 L 90.503906 156.101562 L 90.121094 1 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 101.835938 91.441406 L 109.199219 89.058594 L 109.199219 86.753906 L 101.835938 89.136719 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 109.199219 89.058594 L 110.335938 92.902344 L 110.335938 90.597656 L 109.199219 86.753906 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 110.335938 92.902344 L 103.257812 95.363281 L 103.257812 93.058594 L 110.335938 90.597656 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(80%,80%,0%);fill-opacity:0.7;" d="M 103.257812 95.363281 L 101.835938 91.441406 L 101.835938 89.136719 L 103.257812 93.058594 "/>
-<path style="fill:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(80%,80%,0%);stroke-opacity:0.7;stroke-miterlimit:10;" d="M 110.335938 92.902344 L 103.257812 95.363281 L 101.835938 91.441406 L 109.199219 89.058594 Z M 101.835938 91.441406 L 101.835938 89.136719 M 109.199219 89.058594 L 109.199219 86.753906 M 110.335938 92.902344 L 110.335938 90.597656 M 103.257812 95.363281 L 103.257812 93.058594 M 110.335938 90.597656 L 103.257812 93.058594 L 101.835938 89.1367 [...]
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:0.7;" d="M 110.335938 90.597656 L 103.257812 93.058594 L 101.835938 89.136719 L 109.199219 86.753906 Z "/>
-</g>
-</svg>
diff --git a/tests/python_tests/images/pycairo/cairo-surface-expected.point.pdf b/tests/python_tests/images/pycairo/cairo-surface-expected.point.pdf
deleted file mode 100644
index d6ec819..0000000
Binary files a/tests/python_tests/images/pycairo/cairo-surface-expected.point.pdf and /dev/null differ
diff --git a/tests/python_tests/images/pycairo/cairo-surface-expected.point.svg b/tests/python_tests/images/pycairo/cairo-surface-expected.point.svg
deleted file mode 100644
index 990cc04..0000000
--- a/tests/python_tests/images/pycairo/cairo-surface-expected.point.svg
+++ /dev/null
@@ -1,488 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="256pt" height="256pt" viewBox="0 0 256 256" version="1.1">
-<defs>
-<g>
-<symbol overflow="visible" id="glyph0-0">
-<path style="stroke:none;" d="M 0.875 -7.296875 L 1.859375 -7.296875 L 1.859375 -2.859375 C 1.859375 -2.078125 2 -1.515625 2.28125 -1.171875 C 2.5625 -0.828125 3.019531 -0.65625 3.65625 -0.65625 C 4.289062 -0.65625 4.75 -0.828125 5.03125 -1.171875 C 5.3125 -1.515625 5.453125 -2.078125 5.453125 -2.859375 L 5.453125 -7.296875 L 6.453125 -7.296875 L 6.453125 -2.734375 C 6.453125 -1.785156 6.21875 -1.066406 5.75 -0.578125 C 5.28125 -0.0976562 4.582031 0.140625 3.65625 0.140625 C 2.738281 0.1 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-1">
-<path style="stroke:none;" d="M 5.484375 -3.296875 L 5.484375 0 L 4.59375 0 L 4.59375 -3.265625 C 4.59375 -3.785156 4.488281 -4.171875 4.28125 -4.421875 C 4.082031 -4.679688 3.78125 -4.8125 3.375 -4.8125 C 2.894531 -4.8125 2.515625 -4.65625 2.234375 -4.34375 C 1.953125 -4.039062 1.8125 -3.625 1.8125 -3.09375 L 1.8125 0 L 0.90625 0 L 0.90625 -5.46875 L 1.8125 -5.46875 L 1.8125 -4.625 C 2.03125 -4.945312 2.285156 -5.1875 2.578125 -5.34375 C 2.867188 -5.507812 3.203125 -5.59375 3.578125 -5. [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-2">
-<path style="stroke:none;" d="M 0.9375 -5.46875 L 1.84375 -5.46875 L 1.84375 0 L 0.9375 0 Z M 0.9375 -7.59375 L 1.84375 -7.59375 L 1.84375 -6.453125 L 0.9375 -6.453125 Z M 0.9375 -7.59375 "/>
-</symbol>
-<symbol overflow="visible" id="glyph0-3">
-<path style="stroke:none;" d="M 1.828125 -7.015625 L 1.828125 -5.46875 L 3.6875 -5.46875 L 3.6875 -4.765625 L 1.828125 -4.765625 L 1.828125 -1.796875 C 1.828125 -1.359375 1.890625 -1.070312 2.015625 -0.9375 C 2.140625 -0.8125 2.390625 -0.75 2.765625 -0.75 L 3.6875 -0.75 L 3.6875 0 L 2.765625 0 C 2.066406 0 1.582031 -0.128906 1.3125 -0.390625 C 1.050781 -0.648438 0.921875 -1.117188 0.921875 -1.796875 L 0.921875 -4.765625 L 0.265625 -4.765625 L 0.265625 -5.46875 L 0.921875 -5.46875 L 0.921 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-4">
-<path style="stroke:none;" d="M 5.625 -2.953125 L 5.625 -2.515625 L 1.484375 -2.515625 C 1.523438 -1.898438 1.710938 -1.429688 2.046875 -1.109375 C 2.378906 -0.785156 2.84375 -0.625 3.4375 -0.625 C 3.78125 -0.625 4.113281 -0.664062 4.4375 -0.75 C 4.769531 -0.832031 5.09375 -0.957031 5.40625 -1.125 L 5.40625 -0.28125 C 5.082031 -0.144531 4.75 -0.0390625 4.40625 0.03125 C 4.070312 0.101562 3.734375 0.140625 3.390625 0.140625 C 2.515625 0.140625 1.820312 -0.109375 1.3125 -0.609375 C 0.80078 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-5">
-<path style="stroke:none;" d="M 4.546875 -4.640625 L 4.546875 -7.59375 L 5.4375 -7.59375 L 5.4375 0 L 4.546875 0 L 4.546875 -0.828125 C 4.359375 -0.492188 4.117188 -0.25 3.828125 -0.09375 C 3.535156 0.0625 3.1875 0.140625 2.78125 0.140625 C 2.125 0.140625 1.585938 -0.117188 1.171875 -0.640625 C 0.753906 -1.171875 0.546875 -1.867188 0.546875 -2.734375 C 0.546875 -3.585938 0.753906 -4.273438 1.171875 -4.796875 C 1.585938 -5.328125 2.125 -5.59375 2.78125 -5.59375 C 3.1875 -5.59375 3.535156 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-6">
-<path style="stroke:none;" d=""/>
-</symbol>
-<symbol overflow="visible" id="glyph0-7">
-<path style="stroke:none;" d="M 5.359375 -7.046875 L 5.359375 -6.09375 C 4.984375 -6.269531 4.628906 -6.398438 4.296875 -6.484375 C 3.960938 -6.578125 3.640625 -6.625 3.328125 -6.625 C 2.796875 -6.625 2.382812 -6.519531 2.09375 -6.3125 C 1.800781 -6.101562 1.65625 -5.804688 1.65625 -5.421875 C 1.65625 -5.097656 1.75 -4.851562 1.9375 -4.6875 C 2.132812 -4.519531 2.503906 -4.390625 3.046875 -4.296875 L 3.640625 -4.171875 C 4.367188 -4.023438 4.910156 -3.773438 5.265625 -3.421875 C 5.617188 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-8">
-<path style="stroke:none;" d="M 3.421875 -2.75 C 2.703125 -2.75 2.203125 -2.664062 1.921875 -2.5 C 1.640625 -2.332031 1.5 -2.050781 1.5 -1.65625 C 1.5 -1.332031 1.601562 -1.078125 1.8125 -0.890625 C 2.019531 -0.703125 2.304688 -0.609375 2.671875 -0.609375 C 3.171875 -0.609375 3.570312 -0.785156 3.875 -1.140625 C 4.175781 -1.492188 4.328125 -1.960938 4.328125 -2.546875 L 4.328125 -2.75 Z M 5.21875 -3.125 L 5.21875 0 L 4.328125 0 L 4.328125 -0.828125 C 4.117188 -0.492188 3.859375 -0.25 3.5 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-9">
-<path style="stroke:none;" d="M 4.421875 -5.3125 L 4.421875 -4.453125 C 4.171875 -4.585938 3.910156 -4.6875 3.640625 -4.75 C 3.367188 -4.8125 3.082031 -4.84375 2.78125 -4.84375 C 2.34375 -4.84375 2.007812 -4.773438 1.78125 -4.640625 C 1.5625 -4.503906 1.453125 -4.300781 1.453125 -4.03125 C 1.453125 -3.820312 1.53125 -3.65625 1.6875 -3.53125 C 1.84375 -3.414062 2.164062 -3.304688 2.65625 -3.203125 L 2.953125 -3.125 C 3.597656 -2.988281 4.050781 -2.796875 4.3125 -2.546875 C 4.582031 -2.296 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-10">
-<path style="stroke:none;" d="M 3.09375 -7.59375 C 2.664062 -6.84375 2.34375 -6.097656 2.125 -5.359375 C 1.914062 -4.628906 1.8125 -3.890625 1.8125 -3.140625 C 1.8125 -2.390625 1.914062 -1.644531 2.125 -0.90625 C 2.34375 -0.164062 2.664062 0.570312 3.09375 1.3125 L 2.3125 1.3125 C 1.832031 0.550781 1.46875 -0.195312 1.21875 -0.9375 C 0.976562 -1.675781 0.859375 -2.410156 0.859375 -3.140625 C 0.859375 -3.867188 0.976562 -4.597656 1.21875 -5.328125 C 1.457031 -6.066406 1.820312 -6.820312 2 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-11">
-<path style="stroke:none;" d="M 0.9375 -5.46875 L 1.84375 -5.46875 L 1.84375 0.09375 C 1.84375 0.789062 1.707031 1.296875 1.4375 1.609375 C 1.175781 1.921875 0.75 2.078125 0.15625 2.078125 L -0.1875 2.078125 L -0.1875 1.3125 L 0.0625 1.3125 C 0.40625 1.3125 0.632812 1.234375 0.75 1.078125 C 0.875 0.921875 0.9375 0.59375 0.9375 0.09375 Z M 0.9375 -7.59375 L 1.84375 -7.59375 L 1.84375 -6.453125 L 0.9375 -6.453125 Z M 0.9375 -7.59375 "/>
-</symbol>
-<symbol overflow="visible" id="glyph0-12">
-<path style="stroke:none;" d="M 1.8125 -0.828125 L 1.8125 2.078125 L 0.90625 2.078125 L 0.90625 -5.46875 L 1.8125 -5.46875 L 1.8125 -4.640625 C 2 -4.960938 2.234375 -5.203125 2.515625 -5.359375 C 2.804688 -5.515625 3.15625 -5.59375 3.5625 -5.59375 C 4.226562 -5.59375 4.765625 -5.328125 5.171875 -4.796875 C 5.585938 -4.273438 5.796875 -3.585938 5.796875 -2.734375 C 5.796875 -1.867188 5.585938 -1.171875 5.171875 -0.640625 C 4.765625 -0.117188 4.226562 0.140625 3.5625 0.140625 C 3.15625 0.1 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-13">
-<path style="stroke:none;" d="M 4.546875 -2.796875 C 4.546875 -3.453125 4.410156 -3.957031 4.140625 -4.3125 C 3.867188 -4.664062 3.492188 -4.84375 3.015625 -4.84375 C 2.523438 -4.84375 2.144531 -4.664062 1.875 -4.3125 C 1.613281 -3.957031 1.484375 -3.453125 1.484375 -2.796875 C 1.484375 -2.148438 1.613281 -1.644531 1.875 -1.28125 C 2.144531 -0.925781 2.523438 -0.75 3.015625 -0.75 C 3.492188 -0.75 3.867188 -0.925781 4.140625 -1.28125 C 4.410156 -1.644531 4.546875 -2.148438 4.546875 -2.796 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-14">
-<path style="stroke:none;" d="M 0.796875 -7.59375 L 1.578125 -7.59375 C 2.066406 -6.820312 2.429688 -6.066406 2.671875 -5.328125 C 2.921875 -4.597656 3.046875 -3.867188 3.046875 -3.140625 C 3.046875 -2.410156 2.921875 -1.675781 2.671875 -0.9375 C 2.429688 -0.195312 2.066406 0.550781 1.578125 1.3125 L 0.796875 1.3125 C 1.234375 0.570312 1.554688 -0.164062 1.765625 -0.90625 C 1.984375 -1.644531 2.09375 -2.390625 2.09375 -3.140625 C 2.09375 -3.890625 1.984375 -4.628906 1.765625 -5.359375 C [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-15">
-<path style="stroke:none;" d="M 3.421875 -6.3125 L 2.078125 -2.6875 L 4.765625 -2.6875 Z M 2.859375 -7.296875 L 3.984375 -7.296875 L 6.765625 0 L 5.734375 0 L 5.0625 -1.875 L 1.78125 -1.875 L 1.125 0 L 0.078125 0 Z M 2.859375 -7.296875 "/>
-</symbol>
-<symbol overflow="visible" id="glyph0-16">
-<path style="stroke:none;" d="M 0.84375 -2.15625 L 0.84375 -5.46875 L 1.75 -5.46875 L 1.75 -2.1875 C 1.75 -1.675781 1.847656 -1.289062 2.046875 -1.03125 C 2.253906 -0.769531 2.554688 -0.640625 2.953125 -0.640625 C 3.441406 -0.640625 3.828125 -0.789062 4.109375 -1.09375 C 4.390625 -1.40625 4.53125 -1.832031 4.53125 -2.375 L 4.53125 -5.46875 L 5.4375 -5.46875 L 5.4375 0 L 4.53125 0 L 4.53125 -0.84375 C 4.3125 -0.507812 4.054688 -0.257812 3.765625 -0.09375 C 3.484375 0.0625 3.148438 0.14062 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-17">
-<path style="stroke:none;" d="M 4.109375 -4.625 C 4.003906 -4.6875 3.894531 -4.726562 3.78125 -4.75 C 3.664062 -4.78125 3.535156 -4.796875 3.390625 -4.796875 C 2.878906 -4.796875 2.488281 -4.628906 2.21875 -4.296875 C 1.945312 -3.972656 1.8125 -3.5 1.8125 -2.875 L 1.8125 0 L 0.90625 0 L 0.90625 -5.46875 L 1.8125 -5.46875 L 1.8125 -4.625 C 2 -4.957031 2.242188 -5.203125 2.546875 -5.359375 C 2.847656 -5.515625 3.21875 -5.59375 3.65625 -5.59375 C 3.71875 -5.59375 3.785156 -5.585938 3.859375 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-18">
-<path style="stroke:none;" d="M 0.9375 -7.59375 L 1.84375 -7.59375 L 1.84375 0 L 0.9375 0 Z M 0.9375 -7.59375 "/>
-</symbol>
-<symbol overflow="visible" id="glyph0-19">
-<path style="stroke:none;" d="M 1.96875 -3.484375 L 1.96875 -0.8125 L 3.546875 -0.8125 C 4.078125 -0.8125 4.46875 -0.921875 4.71875 -1.140625 C 4.976562 -1.359375 5.109375 -1.695312 5.109375 -2.15625 C 5.109375 -2.601562 4.976562 -2.9375 4.71875 -3.15625 C 4.46875 -3.375 4.078125 -3.484375 3.546875 -3.484375 Z M 1.96875 -6.484375 L 1.96875 -4.28125 L 3.421875 -4.28125 C 3.910156 -4.28125 4.269531 -4.367188 4.5 -4.546875 C 4.738281 -4.734375 4.859375 -5.007812 4.859375 -5.375 C 4.859375 - [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-20">
-<path style="stroke:none;" d="M 0.546875 -5.46875 L 4.8125 -5.46875 L 4.8125 -4.65625 L 1.4375 -0.71875 L 4.8125 -0.71875 L 4.8125 0 L 0.4375 0 L 0.4375 -0.828125 L 3.8125 -4.75 L 0.546875 -4.75 Z M 0.546875 -5.46875 "/>
-</symbol>
-<symbol overflow="visible" id="glyph0-21">
-<path style="stroke:none;" d="M 0.296875 -5.46875 L 1.25 -5.46875 L 2.953125 -0.875 L 4.671875 -5.46875 L 5.625 -5.46875 L 3.5625 0 L 2.34375 0 Z M 0.296875 -5.46875 "/>
-</symbol>
-<symbol overflow="visible" id="glyph0-22">
-<path style="stroke:none;" d="M 2.4375 -3.921875 C 2.132812 -3.660156 1.914062 -3.394531 1.78125 -3.125 C 1.644531 -2.863281 1.578125 -2.59375 1.578125 -2.3125 C 1.578125 -1.832031 1.75 -1.4375 2.09375 -1.125 C 2.4375 -0.8125 2.867188 -0.65625 3.390625 -0.65625 C 3.703125 -0.65625 3.988281 -0.703125 4.25 -0.796875 C 4.519531 -0.898438 4.773438 -1.054688 5.015625 -1.265625 Z M 3.125 -4.46875 L 5.59375 -1.921875 C 5.789062 -2.210938 5.941406 -2.523438 6.046875 -2.859375 C 6.160156 -3.19140 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-23">
-<path style="stroke:none;" d="M 3.71875 -7.59375 L 3.71875 -6.84375 L 2.859375 -6.84375 C 2.535156 -6.84375 2.3125 -6.773438 2.1875 -6.640625 C 2.0625 -6.515625 2 -6.285156 2 -5.953125 L 2 -5.46875 L 3.46875 -5.46875 L 3.46875 -4.765625 L 2 -4.765625 L 2 0 L 1.09375 0 L 1.09375 -4.765625 L 0.234375 -4.765625 L 0.234375 -5.46875 L 1.09375 -5.46875 L 1.09375 -5.84375 C 1.09375 -6.457031 1.234375 -6.898438 1.515625 -7.171875 C 1.796875 -7.453125 2.242188 -7.59375 2.859375 -7.59375 Z M 3.718 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-24">
-<path style="stroke:none;" d="M 0.984375 -7.296875 L 2.453125 -7.296875 L 4.3125 -2.328125 L 6.1875 -7.296875 L 7.65625 -7.296875 L 7.65625 0 L 6.6875 0 L 6.6875 -6.40625 L 4.8125 -1.40625 L 3.8125 -1.40625 L 1.9375 -6.40625 L 1.9375 0 L 0.984375 0 Z M 0.984375 -7.296875 "/>
-</symbol>
-<symbol overflow="visible" id="glyph0-25">
-<path style="stroke:none;" d="M 3.0625 -4.84375 C 2.582031 -4.84375 2.203125 -4.65625 1.921875 -4.28125 C 1.640625 -3.90625 1.5 -3.390625 1.5 -2.734375 C 1.5 -2.078125 1.632812 -1.5625 1.90625 -1.1875 C 2.1875 -0.8125 2.570312 -0.625 3.0625 -0.625 C 3.539062 -0.625 3.921875 -0.8125 4.203125 -1.1875 C 4.484375 -1.5625 4.625 -2.078125 4.625 -2.734375 C 4.625 -3.378906 4.484375 -3.890625 4.203125 -4.265625 C 3.921875 -4.648438 3.539062 -4.84375 3.0625 -4.84375 Z M 3.0625 -5.59375 C 3.84375 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-26">
-<path style="stroke:none;" d="M 7.078125 -7.59375 L 7.078125 -6.84375 L 6.21875 -6.84375 C 5.894531 -6.84375 5.671875 -6.773438 5.546875 -6.640625 C 5.421875 -6.515625 5.359375 -6.285156 5.359375 -5.953125 L 5.359375 -5.46875 L 6.84375 -5.46875 L 6.84375 -4.765625 L 5.359375 -4.765625 L 5.359375 0 L 4.453125 0 L 4.453125 -4.765625 L 2 -4.765625 L 2 0 L 1.09375 0 L 1.09375 -4.765625 L 0.234375 -4.765625 L 0.234375 -5.46875 L 1.09375 -5.46875 L 1.09375 -5.84375 C 1.09375 -6.457031 1.234375 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-27">
-<path style="stroke:none;" d="M 4.875 -5.265625 L 4.875 -4.421875 C 4.625 -4.554688 4.367188 -4.660156 4.109375 -4.734375 C 3.859375 -4.804688 3.601562 -4.84375 3.34375 -4.84375 C 2.757812 -4.84375 2.304688 -4.65625 1.984375 -4.28125 C 1.660156 -3.914062 1.5 -3.398438 1.5 -2.734375 C 1.5 -2.066406 1.660156 -1.546875 1.984375 -1.171875 C 2.304688 -0.804688 2.757812 -0.625 3.34375 -0.625 C 3.601562 -0.625 3.859375 -0.65625 4.109375 -0.71875 C 4.367188 -0.789062 4.625 -0.898438 4.875 -1.046 [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-28">
-<path style="stroke:none;" d="M 5.484375 -3.296875 L 5.484375 0 L 4.59375 0 L 4.59375 -3.265625 C 4.59375 -3.785156 4.488281 -4.171875 4.28125 -4.421875 C 4.082031 -4.679688 3.78125 -4.8125 3.375 -4.8125 C 2.894531 -4.8125 2.515625 -4.65625 2.234375 -4.34375 C 1.953125 -4.039062 1.8125 -3.625 1.8125 -3.09375 L 1.8125 0 L 0.90625 0 L 0.90625 -7.59375 L 1.8125 -7.59375 L 1.8125 -4.625 C 2.03125 -4.945312 2.285156 -5.1875 2.578125 -5.34375 C 2.867188 -5.507812 3.203125 -5.59375 3.578125 -5. [...]
-</symbol>
-<symbol overflow="visible" id="glyph0-29">
-<path style="stroke:none;" d="M 5.484375 -5.46875 L 3.515625 -2.8125 L 5.59375 0 L 4.53125 0 L 2.9375 -2.15625 L 1.34375 0 L 0.28125 0 L 2.40625 -2.859375 L 0.46875 -5.46875 L 1.53125 -5.46875 L 2.984375 -3.515625 L 4.421875 -5.46875 Z M 5.484375 -5.46875 "/>
-</symbol>
-</g>
-<image id="image22" width="16" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAB40lEQVQokT2Su24UQRREz+2+PTM7+2ANESSAbCMIiPgKQAYJRGjJCL6Xv3BowN717Ly6i2At8pLq6FRRQQU1dcQxSAahSpxsGQ5vlE80o4yERBHBzQtBRgGArJSKJ66vPwfrCGCQAQoYhuN1aMAhYFQ16zVd92Gaz6RNHtCEtMiFIgZhTspIlFgXE5Xz58+FhV8eb8wmSsYMi90YYnwKLRgxOYGYeLTl9u7TOJ2W0iiHuT+i2zghnR+6q80aLAaLNAvaln74lsuraVxISFHyUpjmtuj079379YLGAYL7A/ehfzFPrYpLUSUNPVKSXt/uvrctjeNAlVitOBw+DuMzaSG [...]
-<image id="image25" width="16" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAATUlEQVQokZXNSwrAAAgD0bH3v7PdFIqQ+HEZ3mDgL1OMcdI2cFoHjRbBoKMGoy4fNvoPlvoL9hqIkwaek+4CqW3gtA4aLYJeZ9Zg1MALX2IYF9KsZQAAAAAASUVORK5CYII="/>
-<image id="image28" width="16" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAATUlEQVQokZXNSwrAAAgD0bH3v7PdFIqQ+HEZ3mDgL1OMcdI2cFoHjRbBoKMGoy4fNvoPlvoL9hqIkwaek+4CqW3gtA4aLYJeZ9Zg1MALX2IYF9KsZQAAAAAASUVORK5CYII="/>
-<linearGradient id="linear0" gradientUnits="userSpaceOnUse" x1="0" y1="-30" x2="0" y2="-10" gradientTransform="matrix(1,0,0,1,53.809602,179.402308)">
-<stop offset="0" style="stop-color:rgb(0%,50.196078%,0%);stop-opacity:1;"/>
-<stop offset="1" style="stop-color:rgb(0%,50.196078%,0%);stop-opacity:0;"/>
-</linearGradient>
-<radialGradient id="radial0" gradientUnits="userSpaceOnUse" cx="-2.5" cy="-22.5" fx="0.5" fy="-20.5" r="5" >
-<stop offset="0" style="stop-color:rgb(100%,0%,0%);stop-opacity:1;"/>
-<stop offset="0.5" style="stop-color:rgb(100%,25.098039%,25.098039%);stop-opacity:1;"/>
-<stop offset="0.6" style="stop-color:rgb(50.196078%,100%,50.196078%);stop-opacity:1;"/>
-<stop offset="0.75" style="stop-color:rgb(100%,67.45098%,67.45098%);stop-opacity:1;"/>
-<stop offset="1" style="stop-color:rgb(100%,100%,100%);stop-opacity:1;"/>
-</radialGradient>
-<image id="image31" width="16" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAATUlEQVQokZXNSwrAAAgD0bH3v7PdFIqQ+HEZ3mDgL1OMcdI2cFoHjRbBoKMGoy4fNvoPlvoL9hqIkwaek+4CqW3gtA4aLYJeZ9Zg1MALX2IYF9KsZQAAAAAASUVORK5CYII="/>
-<image id="image34" width="4" height="4" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAIAAAAmkwkpAAAABmJLR0QA/wD/AP+gvaeTAAAADElEQVQImWNgIB0AAAA0AAEjQ4N1AAAAAElFTkSuQmCC"/>
-</defs>
-<g id="surface18">
-<rect x="0" y="0" width="256" height="256" style="fill:rgb(70.980392%,81.568627%,81.568627%);fill-opacity:1;stroke:none;"/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M -41.625 121.21875 L -40.640625 121.21875 L -40.640625 125.65625 C -40.640625 126.4375 -40.5 127 -40.21875 127.34375 C -39.9375 127.6875 -39.480469 127.859375 -38.84375 127.859375 C -38.210938 127.859375 -37.75 127.6875 -37.46875 127.34375 C -37.1875 127 -37.046875 126.4375 -37.046875 125.65625 L -37.046875 121.21875 L -36.046875 121.21875 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M -30.015625 125.21875 L -30.015625 128.515625 L -30.90625 128.515625 L -30.90625 125.25 C -30.90625 124.730469 -31.011719 124.34375 -31.21875 124.09375 C -31.417969 123.835938 -31.71875 123.703125 -32.125 123.703125 C -32.605469 123.703125 -32.984375 123.859375 -33.265625 124.171875 C -33.546875 124.476562 -33.6875 124.890625 -33.6875 125. [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M -28.5625 123.046875 L -27.65625 123.046875 L -27.65625 128.515625 L -28.5625 128.515625 Z M -28.5625 120.921875 L -27.65625 120.921875 L -27.65625 122.0625 L -28.5625 122.0625 Z M -28.5625 120.921875 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M -25.671875 121.5 L -25.671875 123.046875 L -23.8125 123.046875 L -23.8125 123.75 L -25.671875 123.75 L -25.671875 126.71875 C -25.671875 127.15625 -25.609375 127.445312 -25.484375 127.578125 C -25.359375 127.703125 -25.109375 127.765625 -24.734375 127.765625 L -23.8125 127.765625 L -23.8125 128.515625 L -24.734375 128.515625 C -25.433594 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M -18.875 125.5625 L -18.875 126 L -23.015625 126 C -22.976562 126.617188 -22.789062 127.085938 -22.453125 127.40625 C -22.121094 127.730469 -21.65625 127.890625 -21.0625 127.890625 C -20.71875 127.890625 -20.386719 127.851562 -20.0625 127.765625 C -19.730469 127.683594 -19.40625 127.558594 -19.09375 127.390625 L -19.09375 128.234375 C -19. [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M -13.953125 123.875 L -13.953125 120.921875 L -13.0625 120.921875 L -13.0625 128.515625 L -13.953125 128.515625 L -13.953125 127.6875 C -14.140625 128.023438 -14.382812 128.265625 -14.671875 128.421875 C -14.964844 128.578125 -15.3125 128.65625 -15.71875 128.65625 C -16.375 128.65625 -16.914062 128.398438 -17.328125 127.875 C -17.746094 12 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d=""/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M -4.140625 121.46875 L -4.140625 122.421875 C -4.515625 122.246094 -4.871094 122.117188 -5.203125 122.03125 C -5.539062 121.9375 -5.859375 121.890625 -6.171875 121.890625 C -6.703125 121.890625 -7.117188 121.996094 -7.40625 122.203125 C -7.699219 122.414062 -7.84375 122.710938 -7.84375 123.09375 C -7.84375 123.417969 -7.75 123.664062 -7.56 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M -1.671875 121.5 L -1.671875 123.046875 L 0.1875 123.046875 L 0.1875 123.75 L -1.671875 123.75 L -1.671875 126.71875 C -1.671875 127.15625 -1.609375 127.445312 -1.484375 127.578125 C -1.359375 127.703125 -1.109375 127.765625 -0.734375 127.765625 L 0.1875 127.765625 L 0.1875 128.515625 L -0.734375 128.515625 C -1.433594 128.515625 -1.917969 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 2.921875 125.765625 C 2.203125 125.765625 1.703125 125.851562 1.421875 126.015625 C 1.140625 126.183594 1 126.464844 1 126.859375 C 1 127.183594 1.101562 127.4375 1.3125 127.625 C 1.519531 127.8125 1.804688 127.90625 2.171875 127.90625 C 2.671875 127.90625 3.070312 127.730469 3.375 127.375 C 3.675781 127.023438 3.828125 126.554688 3.82812 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.328125 121.5 L 7.328125 123.046875 L 9.1875 123.046875 L 9.1875 123.75 L 7.328125 123.75 L 7.328125 126.71875 C 7.328125 127.15625 7.390625 127.445312 7.515625 127.578125 C 7.640625 127.703125 7.890625 127.765625 8.265625 127.765625 L 9.1875 127.765625 L 9.1875 128.515625 L 8.265625 128.515625 C 7.566406 128.515625 7.082031 128.386719 6 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 14.125 125.5625 L 14.125 126 L 9.984375 126 C 10.023438 126.617188 10.210938 127.085938 10.546875 127.40625 C 10.878906 127.730469 11.34375 127.890625 11.9375 127.890625 C 12.28125 127.890625 12.613281 127.851562 12.9375 127.765625 C 13.269531 127.683594 13.59375 127.558594 13.90625 127.390625 L 13.90625 128.234375 C 13.582031 128.371094 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 18.921875 123.203125 L 18.921875 124.0625 C 18.671875 123.929688 18.410156 123.828125 18.140625 123.765625 C 17.867188 123.703125 17.582031 123.671875 17.28125 123.671875 C 16.84375 123.671875 16.507812 123.742188 16.28125 123.875 C 16.0625 124.011719 15.953125 124.214844 15.953125 124.484375 C 15.953125 124.695312 16.03125 124.859375 16. [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d=""/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 25.59375 120.921875 C 25.164062 121.671875 24.84375 122.417969 24.625 123.15625 C 24.414062 123.886719 24.3125 124.625 24.3125 125.375 C 24.3125 126.125 24.414062 126.871094 24.625 127.609375 C 24.84375 128.351562 25.164062 129.085938 25.59375 129.828125 L 24.8125 129.828125 C 24.332031 129.066406 23.96875 128.320312 23.71875 127.578125 C [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 26.4375 123.046875 L 27.34375 123.046875 L 27.34375 128.609375 C 27.34375 129.304688 27.207031 129.8125 26.9375 130.125 C 26.675781 130.4375 26.25 130.59375 25.65625 130.59375 L 25.3125 130.59375 L 25.3125 129.828125 L 25.5625 129.828125 C 25.90625 129.828125 26.132812 129.75 26.25 129.59375 C 26.375 129.4375 26.4375 129.109375 26.4375 12 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 29.3125 127.6875 L 29.3125 130.59375 L 28.40625 130.59375 L 28.40625 123.046875 L 29.3125 123.046875 L 29.3125 123.875 C 29.5 123.554688 29.734375 123.3125 30.015625 123.15625 C 30.304688 123 30.65625 122.921875 31.0625 122.921875 C 31.726562 122.921875 32.265625 123.1875 32.671875 123.71875 C 33.085938 124.242188 33.296875 124.929688 33. [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 38.046875 125.71875 C 38.046875 125.0625 37.910156 124.558594 37.640625 124.203125 C 37.367188 123.851562 36.992188 123.671875 36.515625 123.671875 C 36.023438 123.671875 35.644531 123.851562 35.375 124.203125 C 35.113281 124.558594 34.984375 125.0625 34.984375 125.71875 C 34.984375 126.367188 35.113281 126.871094 35.375 127.234375 C 35.6 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 40.296875 120.921875 L 41.078125 120.921875 C 41.566406 121.695312 41.929688 122.449219 42.171875 123.1875 C 42.421875 123.917969 42.546875 124.648438 42.546875 125.375 C 42.546875 126.105469 42.421875 126.839844 42.171875 127.578125 C 41.929688 128.320312 41.566406 129.066406 41.078125 129.828125 L 40.296875 129.828125 C 40.734375 129.08 [...]
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-0" x="-42.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-1" x="-35.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-2" x="-29.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-3" x="-27.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-4" x="-24.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-5" x="-18.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-6" x="-12.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-7" x="-9.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-3" x="-3.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-8" x="-0.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-3" x="5.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-4" x="8.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-9" x="14.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-6" x="19.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-10" x="22.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-11" x="25.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-12" x="27.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-13" x="33.5" y="128.517317"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-14" x="39.5" y="128.517317"/>
-</g>
-<use xlink:href="#image22" transform="matrix(1,0,0,1,-8,92.517317)"/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 225.921875 190.570312 L 224.578125 194.195312 L 227.265625 194.195312 Z M 225.359375 189.585938 L 226.484375 189.585938 L 229.265625 196.882812 L 228.234375 196.882812 L 227.5625 195.007812 L 224.28125 195.007812 L 223.625 196.882812 L 222.578125 196.882812 Z M 225.359375 189.585938 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 229.34375 194.726562 L 229.34375 191.414062 L 230.25 191.414062 L 230.25 194.695312 C 230.25 195.207031 230.347656 195.59375 230.546875 195.851562 C 230.753906 196.113281 231.054688 196.242188 231.453125 196.242188 C 231.941406 196.242188 232.328125 196.09375 232.609375 195.789062 C 232.890625 195.476562 233.03125 195.050781 233.03125 194 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 238.921875 191.570312 L 238.921875 192.429688 C 238.671875 192.296875 238.410156 192.195312 238.140625 192.132812 C 237.867188 192.070312 237.582031 192.039062 237.28125 192.039062 C 236.84375 192.039062 236.507812 192.109375 236.28125 192.242188 C 236.0625 192.378906 235.953125 192.582031 235.953125 192.851562 C 235.953125 193.0625 236.0 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 241.328125 189.867188 L 241.328125 191.414062 L 243.1875 191.414062 L 243.1875 192.117188 L 241.328125 192.117188 L 241.328125 195.085938 C 241.328125 195.523438 241.390625 195.8125 241.515625 195.945312 C 241.640625 196.070312 241.890625 196.132812 242.265625 196.132812 L 243.1875 196.132812 L 243.1875 196.882812 L 242.265625 196.882812 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 246.609375 192.257812 C 246.503906 192.195312 246.394531 192.15625 246.28125 192.132812 C 246.164062 192.101562 246.035156 192.085938 245.890625 192.085938 C 245.378906 192.085938 244.988281 192.253906 244.71875 192.585938 C 244.445312 192.910156 244.3125 193.382812 244.3125 194.007812 L 244.3125 196.882812 L 243.40625 196.882812 L 243.40 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 249.921875 194.132812 C 249.203125 194.132812 248.703125 194.21875 248.421875 194.382812 C 248.140625 194.550781 248 194.832031 248 195.226562 C 248 195.550781 248.101562 195.804688 248.3125 195.992188 C 248.519531 196.179688 248.804688 196.273438 249.171875 196.273438 C 249.671875 196.273438 250.070312 196.097656 250.375 195.742188 C 250 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 253.4375 189.289062 L 254.34375 189.289062 L 254.34375 196.882812 L 253.4375 196.882812 Z M 253.4375 189.289062 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 255.4375 191.414062 L 256.34375 191.414062 L 256.34375 196.882812 L 255.4375 196.882812 Z M 255.4375 189.289062 L 256.34375 189.289062 L 256.34375 190.429688 L 255.4375 190.429688 Z M 255.4375 189.289062 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 259.921875 194.132812 C 259.203125 194.132812 258.703125 194.21875 258.421875 194.382812 C 258.140625 194.550781 258 194.832031 258 195.226562 C 258 195.550781 258.101562 195.804688 258.3125 195.992188 C 258.519531 196.179688 258.804688 196.273438 259.171875 196.273438 C 259.671875 196.273438 260.070312 196.097656 260.375 195.742188 C 260 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d=""/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 268.59375 189.289062 C 268.164062 190.039062 267.84375 190.785156 267.625 191.523438 C 267.414062 192.253906 267.3125 192.992188 267.3125 193.742188 C 267.3125 194.492188 267.414062 195.238281 267.625 195.976562 C 267.84375 196.71875 268.164062 197.453125 268.59375 198.195312 L 267.8125 198.195312 C 267.332031 197.433594 266.96875 196.687 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 270.3125 196.054688 L 270.3125 198.960938 L 269.40625 198.960938 L 269.40625 191.414062 L 270.3125 191.414062 L 270.3125 192.242188 C 270.5 191.921875 270.734375 191.679688 271.015625 191.523438 C 271.304688 191.367188 271.65625 191.289062 272.0625 191.289062 C 272.726562 191.289062 273.265625 191.554688 273.671875 192.085938 C 274.085938 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 279.984375 193.585938 L 279.984375 196.882812 L 279.09375 196.882812 L 279.09375 193.617188 C 279.09375 193.097656 278.988281 192.710938 278.78125 192.460938 C 278.582031 192.203125 278.28125 192.070312 277.875 192.070312 C 277.394531 192.070312 277.015625 192.226562 276.734375 192.539062 C 276.453125 192.84375 276.3125 193.257812 276.312 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 285.046875 194.085938 C 285.046875 193.429688 284.910156 192.925781 284.640625 192.570312 C 284.367188 192.21875 283.992188 192.039062 283.515625 192.039062 C 283.023438 192.039062 282.644531 192.21875 282.375 192.570312 C 282.113281 192.925781 281.984375 193.429688 281.984375 194.085938 C 281.984375 194.734375 282.113281 195.238281 282.3 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 287.296875 189.289062 L 288.078125 189.289062 C 288.566406 190.0625 288.929688 190.816406 289.171875 191.554688 C 289.421875 192.285156 289.546875 193.015625 289.546875 193.742188 C 289.546875 194.472656 289.421875 195.207031 289.171875 195.945312 C 288.929688 196.6875 288.566406 197.433594 288.078125 198.195312 L 287.296875 198.195312 C [...]
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-15" x="222.500002" y="196.88379"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-16" x="228.500002" y="196.88379"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-9" x="234.500002" y="196.88379"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-3" x="239.500002" y="196.88379"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-17" x="242.500002" y="196.88379"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-8" x="246.500002" y="196.88379"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-18" x="252.500002" y="196.88379"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-2" x="254.500002" y="196.88379"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-8" x="256.500002" y="196.88379"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-6" x="262.500002" y="196.88379"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-10" x="265.500002" y="196.88379"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-12" x="268.500002" y="196.88379"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-1" x="274.500002" y="196.88379"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-13" x="280.500002" y="196.88379"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-14" x="286.500002" y="196.88379"/>
-</g>
-<use xlink:href="#image25" transform="matrix(1,0,0,1,248.000002,160.88379)"/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 20.363281 183.917969 L 20.363281 186.589844 L 21.941406 186.589844 C 22.472656 186.589844 22.863281 186.480469 23.113281 186.261719 C 23.371094 186.042969 23.503906 185.707031 23.503906 185.246094 C 23.503906 184.800781 23.371094 184.464844 23.113281 184.246094 C 22.863281 184.027344 22.472656 183.917969 21.941406 183.917969 Z M 20.363281 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 28.503906 182.777344 C 28.398438 182.714844 28.289062 182.675781 28.175781 182.652344 C 28.058594 182.621094 27.929688 182.605469 27.785156 182.605469 C 27.273438 182.605469 26.882812 182.773438 26.613281 183.105469 C 26.339844 183.429688 26.207031 183.902344 26.207031 184.527344 L 26.207031 187.402344 L 25.300781 187.402344 L 25.300781 1 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 31.816406 184.652344 C 31.097656 184.652344 30.597656 184.738281 30.316406 184.902344 C 30.035156 185.070312 29.894531 185.351562 29.894531 185.746094 C 29.894531 186.070312 29.996094 186.324219 30.207031 186.511719 C 30.414062 186.699219 30.699219 186.792969 31.066406 186.792969 C 31.566406 186.792969 31.964844 186.617188 32.269531 186.2 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 34.941406 181.933594 L 39.207031 181.933594 L 39.207031 182.746094 L 35.832031 186.683594 L 39.207031 186.683594 L 39.207031 187.402344 L 34.832031 187.402344 L 34.832031 186.574219 L 38.207031 182.652344 L 34.941406 182.652344 Z M 34.941406 181.933594 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 40.332031 181.933594 L 41.238281 181.933594 L 41.238281 187.402344 L 40.332031 187.402344 Z M 40.332031 179.808594 L 41.238281 179.808594 L 41.238281 180.949219 L 40.332031 180.949219 Z M 40.332031 179.808594 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 42.332031 179.808594 L 43.238281 179.808594 L 43.238281 187.402344 L 42.332031 187.402344 Z M 42.332031 179.808594 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d=""/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 49.488281 179.808594 C 49.058594 180.558594 48.738281 181.304688 48.519531 182.042969 C 48.308594 182.773438 48.207031 183.511719 48.207031 184.261719 C 48.207031 185.011719 48.308594 185.757812 48.519531 186.496094 C 48.738281 187.238281 49.058594 187.972656 49.488281 188.714844 L 48.707031 188.714844 C 48.226562 187.953125 47.863281 187 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 53.816406 182.089844 L 53.816406 182.949219 C 53.566406 182.816406 53.304688 182.714844 53.035156 182.652344 C 52.761719 182.589844 52.476562 182.558594 52.175781 182.558594 C 51.738281 182.558594 51.402344 182.628906 51.175781 182.761719 C 50.957031 182.898438 50.847656 183.101562 50.847656 183.371094 C 50.847656 183.582031 50.925781 183 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.691406 181.933594 L 55.644531 181.933594 L 57.347656 186.527344 L 59.066406 181.933594 L 60.019531 181.933594 L 57.957031 187.402344 L 56.738281 187.402344 Z M 54.691406 181.933594 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 63.941406 184.605469 C 63.941406 183.949219 63.804688 183.445312 63.535156 183.089844 C 63.261719 182.738281 62.886719 182.558594 62.410156 182.558594 C 61.917969 182.558594 61.539062 182.738281 61.269531 183.089844 C 61.007812 183.445312 60.878906 183.949219 60.878906 184.605469 C 60.878906 185.253906 61.007812 185.757812 61.269531 186.1 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d=""/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 70.832031 183.480469 C 70.527344 183.742188 70.308594 184.007812 70.175781 184.277344 C 70.039062 184.539062 69.972656 184.808594 69.972656 185.089844 C 69.972656 185.570312 70.144531 185.964844 70.488281 186.277344 C 70.832031 186.589844 71.261719 186.746094 71.785156 186.746094 C 72.097656 186.746094 72.382812 186.699219 72.644531 186.6 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d=""/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 80.222656 180.386719 L 80.222656 181.933594 L 82.082031 181.933594 L 82.082031 182.636719 L 80.222656 182.636719 L 80.222656 185.605469 C 80.222656 186.042969 80.285156 186.332031 80.410156 186.464844 C 80.535156 186.589844 80.785156 186.652344 81.160156 186.652344 L 82.082031 186.652344 L 82.082031 187.402344 L 81.160156 187.402344 C 80. [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 82.332031 181.933594 L 83.238281 181.933594 L 83.238281 187.402344 L 82.332031 187.402344 Z M 82.332031 179.808594 L 83.238281 179.808594 L 83.238281 180.949219 L 82.332031 180.949219 Z M 82.332031 179.808594 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 87.113281 179.808594 L 87.113281 180.558594 L 86.253906 180.558594 C 85.929688 180.558594 85.707031 180.628906 85.582031 180.761719 C 85.457031 180.886719 85.394531 181.117188 85.394531 181.449219 L 85.394531 181.933594 L 86.863281 181.933594 L 86.863281 182.636719 L 85.394531 182.636719 L 85.394531 187.402344 L 84.488281 187.402344 L 84. [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 87.191406 179.808594 L 87.972656 179.808594 C 88.460938 180.582031 88.824219 181.335938 89.066406 182.074219 C 89.316406 182.804688 89.441406 183.535156 89.441406 184.261719 C 89.441406 184.992188 89.316406 185.726562 89.066406 186.464844 C 88.824219 187.207031 88.460938 187.953125 87.972656 188.714844 L 87.191406 188.714844 C 87.628906 1 [...]
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-19" x="18.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-17" x="24.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-8" x="28.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-20" x="34.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-2" x="39.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-18" x="41.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-6" x="43.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-10" x="46.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-9" x="49.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-21" x="54.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-13" x="59.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-6" x="65.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-22" x="68.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-6" x="75.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-3" x="78.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-2" x="81.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-23" x="83.394737" y="187.402308"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-14" x="86.394737" y="187.402308"/>
-</g>
-<use xlink:href="#image28" transform="matrix(1,0,0,1,45.894737,151.402308)"/>
-<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear0);" d="M 63.808594 159.402344 L 63.132812 160.847656 L 61.199219 162.097656 L 58.265625 162.984375 L 54.730469 163.386719 L 51.074219 163.25 L 47.785156 162.59375 L 45.308594 161.507812 L 43.980469 160.136719 L 43.980469 158.667969 L 45.308594 157.296875 L 47.785156 156.210938 L 51.074219 155.554688 L 54.730469 155.417969 L 58.265625 155.820312 L 61.199219 156.707031 L 63.132812 157.957031 Z M 63.808594 159.402344 "/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,100%);fill-opacity:1;" d="M 57.808594 159.402344 L 57.539062 163.015625 L 56.765625 166.140625 L 55.59375 168.355469 L 54.179688 169.359375 L 52.714844 169.019531 L 51.398438 167.382812 L 50.410156 164.667969 L 49.878906 161.238281 L 49.878906 157.566406 L 50.410156 154.136719 L 51.398438 151.421875 L 52.714844 149.785156 L 54.179688 149.445312 L 55.59375 150.449219 L 56.765625 152.664062 L 57.539062 155.789062 Z M 57.808594 159. [...]
-<path style="fill-rule:nonzero;fill:url(#radial0);stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,50.196078%,0%);stroke-opacity:1;stroke-miterlimit:4;" d="M 4.998991 -19.999964 L 4.502898 -17.831996 L 3.116179 -16.089808 L 1.112273 -15.124964 L -1.11429 -15.124964 L -3.118196 -16.089808 L -4.504915 -17.831996 L -5.001009 -19.999964 L -4.504915 -22.167933 L -3.118196 -23.910121 L -1.11429 -24.874964 L 1.112273 -24.874964 L 3.116179 -23.910121 L 4.502898 -22.167933 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 189.554688 114.734375 L 191.023438 114.734375 L 192.882812 119.703125 L 194.757812 114.734375 L 196.226562 114.734375 L 196.226562 122.03125 L 195.257812 122.03125 L 195.257812 115.625 L 193.382812 120.625 L 192.382812 120.625 L 190.507812 115.625 L 190.507812 122.03125 L 189.554688 122.03125 Z M 189.554688 114.734375 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 199.632812 117.1875 C 199.152344 117.1875 198.773438 117.375 198.492188 117.75 C 198.210938 118.125 198.070312 118.640625 198.070312 119.296875 C 198.070312 119.953125 198.203125 120.46875 198.476562 120.84375 C 198.757812 121.21875 199.140625 121.40625 199.632812 121.40625 C 200.109375 121.40625 200.492188 121.21875 200.773438 120.84375 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 208.054688 118.734375 L 208.054688 122.03125 L 207.164062 122.03125 L 207.164062 118.765625 C 207.164062 118.246094 207.058594 117.859375 206.851562 117.609375 C 206.652344 117.351562 206.351562 117.21875 205.945312 117.21875 C 205.464844 117.21875 205.085938 117.375 204.804688 117.6875 C 204.523438 117.992188 204.382812 118.40625 204.382 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 213.117188 119.234375 C 213.117188 118.578125 212.980469 118.074219 212.710938 117.71875 C 212.4375 117.367188 212.0625 117.1875 211.585938 117.1875 C 211.09375 117.1875 210.714844 117.367188 210.445312 117.71875 C 210.183594 118.074219 210.054688 118.578125 210.054688 119.234375 C 210.054688 119.882812 210.183594 120.386719 210.445312 12 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 217.632812 117.1875 C 217.152344 117.1875 216.773438 117.375 216.492188 117.75 C 216.210938 118.125 216.070312 118.640625 216.070312 119.296875 C 216.070312 119.953125 216.203125 120.46875 216.476562 120.84375 C 216.757812 121.21875 217.140625 121.40625 217.632812 121.40625 C 218.109375 121.40625 218.492188 121.21875 218.773438 120.84375 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 221.507812 114.4375 L 222.414062 114.4375 L 222.414062 122.03125 L 221.507812 122.03125 Z M 221.507812 114.4375 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 223.507812 116.5625 L 224.414062 116.5625 L 224.414062 122.03125 L 223.507812 122.03125 Z M 223.507812 114.4375 L 224.414062 114.4375 L 224.414062 115.578125 L 223.507812 115.578125 Z M 223.507812 114.4375 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 227.992188 119.28125 C 227.273438 119.28125 226.773438 119.367188 226.492188 119.53125 C 226.210938 119.699219 226.070312 119.980469 226.070312 120.375 C 226.070312 120.699219 226.171875 120.953125 226.382812 121.140625 C 226.589844 121.328125 226.875 121.421875 227.242188 121.421875 C 227.742188 121.421875 228.140625 121.246094 228.44531 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d=""/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 236.664062 114.4375 C 236.234375 115.1875 235.914062 115.933594 235.695312 116.671875 C 235.484375 117.402344 235.382812 118.140625 235.382812 118.890625 C 235.382812 119.640625 235.484375 120.386719 235.695312 121.125 C 235.914062 121.867188 236.234375 122.601562 236.664062 123.34375 L 235.882812 123.34375 C 235.402344 122.582031 235.039 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 238.398438 115.015625 L 238.398438 116.5625 L 240.257812 116.5625 L 240.257812 117.265625 L 238.398438 117.265625 L 238.398438 120.234375 C 238.398438 120.671875 238.460938 120.960938 238.585938 121.09375 C 238.710938 121.21875 238.960938 121.28125 239.335938 121.28125 L 240.257812 121.28125 L 240.257812 122.03125 L 239.335938 122.03125 C [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 240.507812 116.5625 L 241.414062 116.5625 L 241.414062 122.03125 L 240.507812 122.03125 Z M 240.507812 114.4375 L 241.414062 114.4375 L 241.414062 115.578125 L 240.507812 115.578125 Z M 240.507812 114.4375 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 248.648438 114.4375 L 248.648438 115.1875 L 247.789062 115.1875 C 247.464844 115.1875 247.242188 115.257812 247.117188 115.390625 C 246.992188 115.515625 246.929688 115.746094 246.929688 116.078125 L 246.929688 116.5625 L 248.414062 116.5625 L 248.414062 117.265625 L 246.929688 117.265625 L 246.929688 122.03125 L 246.023438 122.03125 L 24 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 248.367188 114.4375 L 249.148438 114.4375 C 249.636719 115.210938 250 115.964844 250.242188 116.703125 C 250.492188 117.433594 250.617188 118.164062 250.617188 118.890625 C 250.617188 119.621094 250.492188 120.355469 250.242188 121.09375 C 250 121.835938 249.636719 122.582031 249.148438 123.34375 L 248.367188 123.34375 C 248.804688 122.60 [...]
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-24" x="188.571152" y="122.029988"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-25" x="196.571152" y="122.029988"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-1" x="202.571152" y="122.029988"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-13" x="208.571152" y="122.029988"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-25" x="214.571152" y="122.029988"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-18" x="220.571152" y="122.029988"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-2" x="222.571152" y="122.029988"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-8" x="224.571152" y="122.029988"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-6" x="230.571152" y="122.029988"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-10" x="233.571152" y="122.029988"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-3" x="236.571152" y="122.029988"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-2" x="239.571152" y="122.029988"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-26" x="241.571152" y="122.029988"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-14" x="247.571152" y="122.029988"/>
-</g>
-<use xlink:href="#image31" transform="matrix(1,0,0,1,211.571152,86.029988)"/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 22.355469 201.613281 L 22.355469 202.457031 C 22.105469 202.324219 21.847656 202.21875 21.589844 202.144531 C 21.339844 202.074219 21.082031 202.035156 20.824219 202.035156 C 20.238281 202.035156 19.785156 202.222656 19.464844 202.597656 C 19.140625 202.964844 18.980469 203.480469 18.980469 204.144531 C 18.980469 204.8125 19.140625 205.33 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 27.964844 203.582031 L 27.964844 206.878906 L 27.074219 206.878906 L 27.074219 203.613281 C 27.074219 203.09375 26.96875 202.707031 26.761719 202.457031 C 26.5625 202.199219 26.261719 202.066406 25.855469 202.066406 C 25.375 202.066406 24.996094 202.222656 24.714844 202.535156 C 24.433594 202.839844 24.292969 203.253906 24.292969 203.7851 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 29.417969 201.410156 L 30.324219 201.410156 L 30.324219 206.878906 L 29.417969 206.878906 Z M 29.417969 199.285156 L 30.324219 199.285156 L 30.324219 200.425781 L 29.417969 200.425781 Z M 29.417969 199.285156 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 31.417969 199.285156 L 32.324219 199.285156 L 32.324219 206.878906 L 31.417969 206.878906 Z M 31.417969 199.285156 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 38.105469 203.925781 L 38.105469 204.363281 L 33.964844 204.363281 C 34.003906 204.980469 34.191406 205.449219 34.527344 205.769531 C 34.859375 206.09375 35.324219 206.253906 35.917969 206.253906 C 36.261719 206.253906 36.59375 206.214844 36.917969 206.128906 C 37.25 206.046875 37.574219 205.921875 37.886719 205.753906 L 37.886719 206.597 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d=""/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 13.574219 211.285156 C 13.144531 212.035156 12.824219 212.78125 12.605469 213.519531 C 12.394531 214.25 12.292969 214.988281 12.292969 215.738281 C 12.292969 216.488281 12.394531 217.234375 12.605469 217.972656 C 12.824219 218.714844 13.144531 219.449219 13.574219 220.191406 L 12.792969 220.191406 C 12.3125 219.429688 11.949219 218.683594 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 18.027344 214.238281 L 18.027344 211.285156 L 18.917969 211.285156 L 18.917969 218.878906 L 18.027344 218.878906 L 18.027344 218.050781 C 17.839844 218.386719 17.597656 218.628906 17.308594 218.785156 C 17.015625 218.941406 16.667969 219.019531 16.261719 219.019531 C 15.605469 219.019531 15.066406 218.761719 14.652344 218.238281 C 14.2343 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 25.105469 215.925781 L 25.105469 216.363281 L 20.964844 216.363281 C 21.003906 216.980469 21.191406 217.449219 21.527344 217.769531 C 21.859375 218.09375 22.324219 218.253906 22.917969 218.253906 C 23.261719 218.253906 23.59375 218.214844 23.917969 218.128906 C 24.25 218.046875 24.574219 217.921875 24.886719 217.753906 L 24.886719 218.597 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 29.199219 211.285156 L 29.199219 212.035156 L 28.339844 212.035156 C 28.015625 212.035156 27.792969 212.105469 27.667969 212.238281 C 27.542969 212.363281 27.480469 212.59375 27.480469 212.925781 L 27.480469 213.410156 L 28.949219 213.410156 L 28.949219 214.113281 L 27.480469 214.113281 L 27.480469 218.878906 L 26.574219 218.878906 L 26.5 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 31.902344 216.128906 C 31.183594 216.128906 30.683594 216.214844 30.402344 216.378906 C 30.121094 216.546875 29.980469 216.828125 29.980469 217.222656 C 29.980469 217.546875 30.082031 217.800781 30.292969 217.988281 C 30.5 218.175781 30.785156 218.269531 31.152344 218.269531 C 31.652344 218.269531 32.050781 218.09375 32.355469 217.738281 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 35.324219 216.722656 L 35.324219 213.410156 L 36.230469 213.410156 L 36.230469 216.691406 C 36.230469 217.203125 36.328125 217.589844 36.527344 217.847656 C 36.734375 218.109375 37.035156 218.238281 37.433594 218.238281 C 37.921875 218.238281 38.308594 218.089844 38.589844 217.785156 C 38.871094 217.472656 39.011719 217.046875 39.011719 2 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 41.417969 211.285156 L 42.324219 211.285156 L 42.324219 218.878906 L 41.417969 218.878906 Z M 41.417969 211.285156 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 44.308594 211.863281 L 44.308594 213.410156 L 46.167969 213.410156 L 46.167969 214.113281 L 44.308594 214.113281 L 44.308594 217.082031 C 44.308594 217.519531 44.371094 217.808594 44.496094 217.941406 C 44.621094 218.066406 44.871094 218.128906 45.246094 218.128906 L 46.167969 218.128906 L 46.167969 218.878906 L 45.246094 218.878906 C 44. [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d=""/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 22.542969 226.035156 C 22.0625 226.035156 21.683594 226.222656 21.402344 226.597656 C 21.121094 226.972656 20.980469 227.488281 20.980469 228.144531 C 20.980469 228.800781 21.113281 229.316406 21.386719 229.691406 C 21.667969 230.066406 22.050781 230.253906 22.542969 230.253906 C 23.019531 230.253906 23.402344 230.066406 23.683594 229.691 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 30.027344 228.082031 C 30.027344 227.425781 29.890625 226.921875 29.621094 226.566406 C 29.347656 226.214844 28.972656 226.035156 28.496094 226.035156 C 28.003906 226.035156 27.625 226.214844 27.355469 226.566406 C 27.09375 226.921875 26.964844 227.425781 26.964844 228.082031 C 26.964844 228.730469 27.09375 229.234375 27.355469 229.597656 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 36.355469 225.613281 L 36.355469 226.457031 C 36.105469 226.324219 35.847656 226.21875 35.589844 226.144531 C 35.339844 226.074219 35.082031 226.035156 34.824219 226.035156 C 34.238281 226.035156 33.785156 226.222656 33.464844 226.597656 C 33.140625 226.964844 32.980469 227.480469 32.980469 228.144531 C 32.980469 228.8125 33.140625 229.33 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d=""/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 19.292969 242.050781 L 19.292969 244.957031 L 18.386719 244.957031 L 18.386719 237.410156 L 19.292969 237.410156 L 19.292969 238.238281 C 19.480469 237.917969 19.714844 237.675781 19.996094 237.519531 C 20.285156 237.363281 20.636719 237.285156 21.042969 237.285156 C 21.707031 237.285156 22.246094 237.550781 22.652344 238.082031 C 23.0664 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 24.417969 237.410156 L 25.324219 237.410156 L 25.324219 242.878906 L 24.417969 242.878906 Z M 24.417969 235.285156 L 25.324219 235.285156 L 25.324219 236.425781 L 24.417969 236.425781 Z M 24.417969 235.285156 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 30.964844 237.410156 L 28.996094 240.066406 L 31.074219 242.878906 L 30.011719 242.878906 L 28.417969 240.722656 L 26.824219 242.878906 L 25.761719 242.878906 L 27.886719 240.019531 L 25.949219 237.410156 L 27.011719 237.410156 L 28.464844 239.363281 L 29.902344 237.410156 Z M 30.964844 237.410156 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 36.105469 239.925781 L 36.105469 240.363281 L 31.964844 240.363281 C 32.003906 240.980469 32.191406 241.449219 32.527344 241.769531 C 32.859375 242.09375 33.324219 242.253906 33.917969 242.253906 C 34.261719 242.253906 34.59375 242.214844 34.917969 242.128906 C 35.25 242.046875 35.574219 241.921875 35.886719 241.753906 L 35.886719 242.597 [...]
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 37.417969 235.285156 L 38.324219 235.285156 L 38.324219 242.878906 L 37.417969 242.878906 Z M 37.417969 235.285156 "/>
-<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 39.277344 235.285156 L 40.058594 235.285156 C 40.546875 236.058594 40.910156 236.8125 41.152344 237.550781 C 41.402344 238.28125 41.527344 239.011719 41.527344 239.738281 C 41.527344 240.46875 41.402344 241.203125 41.152344 241.941406 C 40.910156 242.683594 40.546875 243.429688 40.058594 244.191406 L 39.277344 244.191406 C 39.714844 243.4 [...]
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-27" x="17.478651" y="206.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-28" x="22.478651" y="206.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-2" x="28.478651" y="206.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-18" x="30.478651" y="206.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-4" x="32.478651" y="206.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-6" x="38.478651" y="206.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-10" x="10.478651" y="218.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-5" x="13.478651" y="218.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-4" x="19.478651" y="218.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-23" x="25.478651" y="218.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-8" x="28.478651" y="218.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-16" x="34.478651" y="218.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-18" x="40.478651" y="218.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-3" x="42.478651" y="218.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-6" x="45.478651" y="218.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-25" x="19.478651" y="230.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-13" x="25.478651" y="230.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-27" x="31.478651" y="230.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-6" x="36.478651" y="230.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-12" x="17.478651" y="242.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-2" x="23.478651" y="242.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-29" x="25.478651" y="242.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-4" x="30.478651" y="242.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-18" x="36.478651" y="242.877778"/>
-</g>
-<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
- <use xlink:href="#glyph0-14" x="38.478651" y="242.877778"/>
-</g>
-<use xlink:href="#image34" transform="matrix(1,0,0,1,27.478651,191.877778)"/>
-</g>
-</svg>
diff --git a/tests/python_tests/images/pycairo/cairo-surface-expected.polygon.pdf b/tests/python_tests/images/pycairo/cairo-surface-expected.polygon.pdf
deleted file mode 100644
index 2621730..0000000
Binary files a/tests/python_tests/images/pycairo/cairo-surface-expected.polygon.pdf and /dev/null differ
diff --git a/tests/python_tests/images/pycairo/cairo-surface-expected.polygon.svg b/tests/python_tests/images/pycairo/cairo-surface-expected.polygon.svg
deleted file mode 100644
index 886e24b..0000000
--- a/tests/python_tests/images/pycairo/cairo-surface-expected.polygon.svg
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="256pt" height="256pt" viewBox="0 0 256 256" version="1.1">
-<defs>
-<image id="image48" width="16" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAATUlEQVQokZXNSwrAAAgD0bH3v7PdFIqQ+HEZ3mDgL1OMcdI2cFoHjRbBoKMGoy4fNvoPlvoL9hqIkwaek+4CqW3gtA4aLYJeZ9Zg1MALX2IYF9KsZQAAAAAASUVORK5CYII="/>
-<image id="image51" width="16" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAATUlEQVQokZXNSwrAAAgD0bH3v7PdFIqQ+HEZ3mDgL1OMcdI2cFoHjRbBoKMGoy4fNvoPlvoL9hqIkwaek+4CqW3gtA4aLYJeZ9Zg1MALX2IYF9KsZQAAAAAASUVORK5CYII="/>
-<image id="image54" width="16" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAATUlEQVQokZXNSwrAAAgD0bH3v7PdFIqQ+HEZ3mDgL1OMcdI2cFoHjRbBoKMGoy4fNvoPlvoL9hqIkwaek+4CqW3gtA4aLYJeZ9Zg1MALX2IYF9KsZQAAAAAASUVORK5CYII="/>
-<image id="image57" width="16" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAATUlEQVQokZXNSwrAAAgD0bH3v7PdFIqQ+HEZ3mDgL1OMcdI2cFoHjRbBoKMGoy4fNvoPlvoL9hqIkwaek+4CqW3gtA4aLYJeZ9Zg1MALX2IYF9KsZQAAAAAASUVORK5CYII="/>
-<image id="image60" width="16" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAATUlEQVQokZXNSwrAAAgD0bH3v7PdFIqQ+HEZ3mDgL1OMcdI2cFoHjRbBoKMGoy4fNvoPlvoL9hqIkwaek+4CqW3gtA4aLYJeZ9Zg1MALX2IYF9KsZQAAAAAASUVORK5CYII="/>
-<image id="image63" width="16" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAATUlEQVQokZXNSwrAAAgD0bH3v7PdFIqQ+HEZ3mDgL1OMcdI2cFoHjRbBoKMGoy4fNvoPlvoL9hqIkwaek+4CqW3gtA4aLYJeZ9Zg1MALX2IYF9KsZQAAAAAASUVORK5CYII="/>
-<image id="image66" width="16" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAATUlEQVQokZXNSwrAAAgD0bH3v7PdFIqQ+HEZ3mDgL1OMcdI2cFoHjRbBoKMGoy4fNvoPlvoL9hqIkwaek+4CqW3gtA4aLYJeZ9Zg1MALX2IYF9KsZQAAAAAASUVORK5CYII="/>
-<image id="image69" width="16" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAATUlEQVQokZXNSwrAAAgD0bH3v7PdFIqQ+HEZ3mDgL1OMcdI2cFoHjRbBoKMGoy4fNvoPlvoL9hqIkwaek+4CqW3gtA4aLYJeZ9Zg1MALX2IYF9KsZQAAAAAASUVORK5CYII="/>
-<image id="image72" width="16" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAATUlEQVQokZXNSwrAAAgD0bH3v7PdFIqQ+HEZ3mDgL1OMcdI2cFoHjRbBoKMGoy4fNvoPlvoL9hqIkwaek+4CqW3gtA4aLYJeZ9Zg1MALX2IYF9KsZQAAAAAASUVORK5CYII="/>
-</defs>
-<g id="surface44">
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(90.196078%,90.196078%,98.039216%);fill-opacity:0.5;" d="M 115.65625 56.117188 L 105.6875 50.042969 L 102.367188 41.585938 L 108.777344 39.203125 L 132.507812 28.515625 L 132.222656 27.054688 L 141.789062 23.054688 L 145.058594 32.933594 L 157.566406 68.800781 L 159.464844 73.835938 L 139.804688 81.023438 L 135.675781 71.570312 L 135.882812 66.1875 L 136.332031 59.265625 L 134.109375 51.578125 L 131.019531 45.429688 L 127.984375 38.5078 [...]
-<use xlink:href="#image48" transform="matrix(1,0,0,1,127.94131,42.841104)"/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(90.196078%,90.196078%,98.039216%);fill-opacity:0.5;" d="M 132.222656 27.054688 L 132.507812 28.515625 L 108.777344 39.203125 L 102.367188 41.585938 L 105.6875 50.042969 L 115.65625 56.117188 L 112.578125 61.574219 L 105.039062 74.605469 L 88.605469 74.414062 L 84.253906 74.566406 L 79.761719 74.644531 L 68.664062 79.027344 L 67.753906 79.296875 L 62.101562 68.839844 L 56.199219 60.996094 L 54.90625 61.496094 L 53.773438 58.652344 L 64. [...]
-<use xlink:href="#image51" transform="matrix(1,0,0,1,79.836035,51.528053)"/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(90.196078%,90.196078%,98.039216%);fill-opacity:0.5;" d="M 115.65625 56.117188 L 118.730469 49.234375 L 122.578125 41.546875 L 127.984375 38.507812 L 131.019531 45.429688 L 134.109375 51.578125 L 136.332031 59.265625 L 135.882812 66.1875 L 129.527344 66.6875 L 124.503906 68.453125 L 121.441406 69.992188 L 109.082031 80.371094 L 104.925781 81.371094 L 102.195312 83.253906 L 101.664062 85.136719 L 100.078125 88.445312 L 97.773438 91.67187 [...]
-<use xlink:href="#image54" transform="matrix(1,0,0,1,90.102079,69.169472)"/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(90.196078%,90.196078%,98.039216%);fill-opacity:0.5;" d="M 53.773438 58.652344 L 54.90625 61.496094 L 61.679688 81.753906 L 71.058594 108.050781 L 76.140625 119.121094 L 72.308594 122.695312 L 69.605469 130.535156 L 61.425781 133.496094 L 54.027344 114.699219 L 44.699219 118.351562 L 33.3125 123.15625 L 14.414062 130.113281 L 11.242188 120.925781 L 9.871094 116.082031 L 10.171875 111.96875 L 10.238281 106.011719 L 14.351562 105.242188 L [...]
-<use xlink:href="#image57" transform="matrix(1,0,0,1,31.167216,88.825)"/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(90.196078%,90.196078%,98.039216%);fill-opacity:0.5;" d="M 54.90625 61.496094 L 56.199219 60.996094 L 62.101562 68.839844 L 67.753906 79.296875 L 61.679688 81.753906 Z "/>
-<use xlink:href="#image60" transform="matrix(1,0,0,1,53.212824,64.674519)"/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(90.196078%,90.196078%,98.039216%);fill-opacity:0.5;" d="M 135.882812 66.1875 L 135.675781 71.570312 L 139.804688 81.023438 L 127.082031 86.292969 L 110.335938 92.902344 L 109.199219 89.058594 L 101.835938 91.441406 L 103.257812 95.363281 L 91.441406 100.015625 L 94.757812 93.558594 L 97.773438 91.671875 L 100.078125 88.445312 L 101.664062 85.136719 L 102.195312 83.253906 L 104.925781 81.371094 L 109.082031 80.371094 L 121.441406 69.992 [...]
-<use xlink:href="#image63" transform="matrix(1,0,0,1,111.187238,73.378811)"/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(90.196078%,90.196078%,98.039216%);fill-opacity:0.5;" d="M 159.464844 73.835938 L 170.804688 68.917969 L 173.171875 76.296875 L 176.019531 82.679688 L 183.402344 90.136719 L 184.109375 93.789062 L 174.757812 89.945312 L 171.078125 89.90625 L 169.109375 93.441406 L 185.757812 103.707031 L 182.722656 112.007812 L 181.617188 113.125 L 179.890625 116.3125 L 174.433594 119.734375 L 167.976562 121.773438 L 157.070312 125.578125 L 144.289062 1 [...]
-<use xlink:href="#image66" transform="matrix(1,0,0,1,153.144399,90.01164)"/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(90.196078%,90.196078%,98.039216%);fill-opacity:0.5;" d="M 183.402344 90.136719 L 188.046875 87.058594 L 192.929688 83.832031 L 200.394531 81.488281 L 201.0625 81.371094 L 205.175781 79.601562 L 213.167969 74.914062 L 216.90625 70.414062 L 228.015625 79.488281 L 228.765625 84.601562 L 242.207031 79.796875 L 241.550781 74.835938 L 245.570312 72.53125 L 247.820312 71.339844 L 250.59375 70.03125 L 252.679688 76.488281 L 254.8125 83.101562 [...]
-<use xlink:href="#image69" transform="matrix(1,0,0,1,155.527409,142.794669)"/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(90.196078%,90.196078%,98.039216%);fill-opacity:0.5;" d="M 110.335938 92.902344 L 127.082031 86.292969 L 128.355469 90.597656 L 130.351562 95.019531 L 136.710938 92.828125 L 143.125 89.828125 L 149.34375 87.90625 L 155.929688 105.933594 L 155.917969 110.203125 L 153.800781 116.507812 L 151.734375 120.082031 L 147.519531 123.503906 L 141.585938 126.386719 L 144.289062 132.804688 L 138.746094 132.382812 L 94.914062 153.0625 L 90.503906 15 [...]
-<use xlink:href="#image72" transform="matrix(1,0,0,1,105.830723,109.774724)"/>
-<path style=" stroke:none;fill-rule:nonzero;fill:rgb(90.196078%,90.196078%,98.039216%);fill-opacity:0.5;" d="M 110.335938 92.902344 L 103.257812 95.363281 L 101.835938 91.441406 L 109.199219 89.058594 Z "/>
-</g>
-</svg>
diff --git a/tests/python_tests/images/style-comp-op/clear.png b/tests/python_tests/images/style-comp-op/clear.png
deleted file mode 100644
index 4fe9ab3..0000000
Binary files a/tests/python_tests/images/style-comp-op/clear.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/color.png b/tests/python_tests/images/style-comp-op/color.png
deleted file mode 100644
index c0947a0..0000000
Binary files a/tests/python_tests/images/style-comp-op/color.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/color_burn.png b/tests/python_tests/images/style-comp-op/color_burn.png
deleted file mode 100644
index cf1f723..0000000
Binary files a/tests/python_tests/images/style-comp-op/color_burn.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/color_dodge.png b/tests/python_tests/images/style-comp-op/color_dodge.png
deleted file mode 100644
index d4638c2..0000000
Binary files a/tests/python_tests/images/style-comp-op/color_dodge.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/contrast.png b/tests/python_tests/images/style-comp-op/contrast.png
deleted file mode 100644
index 9d3c430..0000000
Binary files a/tests/python_tests/images/style-comp-op/contrast.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/darken.png b/tests/python_tests/images/style-comp-op/darken.png
deleted file mode 100644
index 9792549..0000000
Binary files a/tests/python_tests/images/style-comp-op/darken.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/difference.png b/tests/python_tests/images/style-comp-op/difference.png
deleted file mode 100644
index a33f772..0000000
Binary files a/tests/python_tests/images/style-comp-op/difference.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/divide.png b/tests/python_tests/images/style-comp-op/divide.png
deleted file mode 100644
index 551ee10..0000000
Binary files a/tests/python_tests/images/style-comp-op/divide.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/dst.png b/tests/python_tests/images/style-comp-op/dst.png
deleted file mode 100644
index 6715d57..0000000
Binary files a/tests/python_tests/images/style-comp-op/dst.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/dst_atop.png b/tests/python_tests/images/style-comp-op/dst_atop.png
deleted file mode 100644
index dbb6b43..0000000
Binary files a/tests/python_tests/images/style-comp-op/dst_atop.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/dst_in.png b/tests/python_tests/images/style-comp-op/dst_in.png
deleted file mode 100644
index dbb6b43..0000000
Binary files a/tests/python_tests/images/style-comp-op/dst_in.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/dst_out.png b/tests/python_tests/images/style-comp-op/dst_out.png
deleted file mode 100644
index 59e0ff0..0000000
Binary files a/tests/python_tests/images/style-comp-op/dst_out.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/dst_over.png b/tests/python_tests/images/style-comp-op/dst_over.png
deleted file mode 100644
index 6715d57..0000000
Binary files a/tests/python_tests/images/style-comp-op/dst_over.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/exclusion.png b/tests/python_tests/images/style-comp-op/exclusion.png
deleted file mode 100644
index bfef058..0000000
Binary files a/tests/python_tests/images/style-comp-op/exclusion.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/grain_extract.png b/tests/python_tests/images/style-comp-op/grain_extract.png
deleted file mode 100644
index 7c70598..0000000
Binary files a/tests/python_tests/images/style-comp-op/grain_extract.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/grain_merge.png b/tests/python_tests/images/style-comp-op/grain_merge.png
deleted file mode 100644
index db5159e..0000000
Binary files a/tests/python_tests/images/style-comp-op/grain_merge.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/hard_light.png b/tests/python_tests/images/style-comp-op/hard_light.png
deleted file mode 100644
index 01c0c2a..0000000
Binary files a/tests/python_tests/images/style-comp-op/hard_light.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/hue.png b/tests/python_tests/images/style-comp-op/hue.png
deleted file mode 100644
index 2d2a3c1..0000000
Binary files a/tests/python_tests/images/style-comp-op/hue.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/invert.png b/tests/python_tests/images/style-comp-op/invert.png
deleted file mode 100644
index a4e5991..0000000
Binary files a/tests/python_tests/images/style-comp-op/invert.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/lighten.png b/tests/python_tests/images/style-comp-op/lighten.png
deleted file mode 100644
index 3132288..0000000
Binary files a/tests/python_tests/images/style-comp-op/lighten.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/linear_burn.png b/tests/python_tests/images/style-comp-op/linear_burn.png
deleted file mode 100644
index 95a984b..0000000
Binary files a/tests/python_tests/images/style-comp-op/linear_burn.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/linear_dodge.png b/tests/python_tests/images/style-comp-op/linear_dodge.png
deleted file mode 100644
index 23effa5..0000000
Binary files a/tests/python_tests/images/style-comp-op/linear_dodge.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/minus.png b/tests/python_tests/images/style-comp-op/minus.png
deleted file mode 100644
index 30575e2..0000000
Binary files a/tests/python_tests/images/style-comp-op/minus.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/multiply.png b/tests/python_tests/images/style-comp-op/multiply.png
deleted file mode 100644
index 28a1f54..0000000
Binary files a/tests/python_tests/images/style-comp-op/multiply.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/overlay.png b/tests/python_tests/images/style-comp-op/overlay.png
deleted file mode 100644
index f227d1c..0000000
Binary files a/tests/python_tests/images/style-comp-op/overlay.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/plus.png b/tests/python_tests/images/style-comp-op/plus.png
deleted file mode 100644
index 23effa5..0000000
Binary files a/tests/python_tests/images/style-comp-op/plus.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/saturation.png b/tests/python_tests/images/style-comp-op/saturation.png
deleted file mode 100644
index 4fa0aec..0000000
Binary files a/tests/python_tests/images/style-comp-op/saturation.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/screen.png b/tests/python_tests/images/style-comp-op/screen.png
deleted file mode 100644
index b58bc8b..0000000
Binary files a/tests/python_tests/images/style-comp-op/screen.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/soft_light.png b/tests/python_tests/images/style-comp-op/soft_light.png
deleted file mode 100644
index 8eeffe2..0000000
Binary files a/tests/python_tests/images/style-comp-op/soft_light.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/src.png b/tests/python_tests/images/style-comp-op/src.png
deleted file mode 100644
index 6e22f73..0000000
Binary files a/tests/python_tests/images/style-comp-op/src.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/src_atop.png b/tests/python_tests/images/style-comp-op/src_atop.png
deleted file mode 100644
index 7bc1b5b..0000000
Binary files a/tests/python_tests/images/style-comp-op/src_atop.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/src_in.png b/tests/python_tests/images/style-comp-op/src_in.png
deleted file mode 100644
index 6e22f73..0000000
Binary files a/tests/python_tests/images/style-comp-op/src_in.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/src_out.png b/tests/python_tests/images/style-comp-op/src_out.png
deleted file mode 100644
index 4fe9ab3..0000000
Binary files a/tests/python_tests/images/style-comp-op/src_out.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/src_over.png b/tests/python_tests/images/style-comp-op/src_over.png
deleted file mode 100644
index 81ff2d4..0000000
Binary files a/tests/python_tests/images/style-comp-op/src_over.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/value.png b/tests/python_tests/images/style-comp-op/value.png
deleted file mode 100644
index a8ca240..0000000
Binary files a/tests/python_tests/images/style-comp-op/value.png and /dev/null differ
diff --git a/tests/python_tests/images/style-comp-op/xor.png b/tests/python_tests/images/style-comp-op/xor.png
deleted file mode 100644
index 8d276f6..0000000
Binary files a/tests/python_tests/images/style-comp-op/xor.png and /dev/null differ
diff --git a/tests/python_tests/images/style-image-filter/agg-stack-blur22.png b/tests/python_tests/images/style-image-filter/agg-stack-blur22.png
deleted file mode 100644
index b605053..0000000
Binary files a/tests/python_tests/images/style-image-filter/agg-stack-blur22.png and /dev/null differ
diff --git a/tests/python_tests/images/style-image-filter/blur.png b/tests/python_tests/images/style-image-filter/blur.png
deleted file mode 100644
index 64e8296..0000000
Binary files a/tests/python_tests/images/style-image-filter/blur.png and /dev/null differ
diff --git a/tests/python_tests/images/style-image-filter/edge-detect.png b/tests/python_tests/images/style-image-filter/edge-detect.png
deleted file mode 100644
index 89b0668..0000000
Binary files a/tests/python_tests/images/style-image-filter/edge-detect.png and /dev/null differ
diff --git a/tests/python_tests/images/style-image-filter/emboss.png b/tests/python_tests/images/style-image-filter/emboss.png
deleted file mode 100644
index f634472..0000000
Binary files a/tests/python_tests/images/style-image-filter/emboss.png and /dev/null differ
diff --git a/tests/python_tests/images/style-image-filter/gray.png b/tests/python_tests/images/style-image-filter/gray.png
deleted file mode 100644
index 36e6df7..0000000
Binary files a/tests/python_tests/images/style-image-filter/gray.png and /dev/null differ
diff --git a/tests/python_tests/images/style-image-filter/invert.png b/tests/python_tests/images/style-image-filter/invert.png
deleted file mode 100644
index ffc1e03..0000000
Binary files a/tests/python_tests/images/style-image-filter/invert.png and /dev/null differ
diff --git a/tests/python_tests/images/style-image-filter/none.png b/tests/python_tests/images/style-image-filter/none.png
deleted file mode 100644
index b745b75..0000000
Binary files a/tests/python_tests/images/style-image-filter/none.png and /dev/null differ
diff --git a/tests/python_tests/images/style-image-filter/sharpen.png b/tests/python_tests/images/style-image-filter/sharpen.png
deleted file mode 100644
index 3c11306..0000000
Binary files a/tests/python_tests/images/style-image-filter/sharpen.png and /dev/null differ
diff --git a/tests/python_tests/images/style-image-filter/sobel.png b/tests/python_tests/images/style-image-filter/sobel.png
deleted file mode 100644
index 281d99a..0000000
Binary files a/tests/python_tests/images/style-image-filter/sobel.png and /dev/null differ
diff --git a/tests/python_tests/images/style-image-filter/x-gradient.png b/tests/python_tests/images/style-image-filter/x-gradient.png
deleted file mode 100644
index fc19f8b..0000000
Binary files a/tests/python_tests/images/style-image-filter/x-gradient.png and /dev/null differ
diff --git a/tests/python_tests/images/style-image-filter/y-gradient.png b/tests/python_tests/images/style-image-filter/y-gradient.png
deleted file mode 100644
index 1d0bbf2..0000000
Binary files a/tests/python_tests/images/style-image-filter/y-gradient.png and /dev/null differ
diff --git a/tests/python_tests/images/support/a.png b/tests/python_tests/images/support/a.png
deleted file mode 100644
index 3d0cc72..0000000
Binary files a/tests/python_tests/images/support/a.png and /dev/null differ
diff --git a/tests/python_tests/images/support/b.png b/tests/python_tests/images/support/b.png
deleted file mode 100644
index 6eca9e1..0000000
Binary files a/tests/python_tests/images/support/b.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png+e=miniz.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png+e=miniz.png
deleted file mode 100644
index 4cc101b..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png+e=miniz.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png+t=0.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png+t=0.png
deleted file mode 100644
index b2aa991..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png.png
deleted file mode 100644
index b2aa991..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png32+e=miniz.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png32+e=miniz.png
deleted file mode 100644
index 046b4fc..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png32+e=miniz.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png32+t=0.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png32+t=0.png
deleted file mode 100644
index 16481a4..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png32+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png32.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png32.png
deleted file mode 100644
index 0f15a35..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png32.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+e=miniz.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+e=miniz.png
deleted file mode 100644
index 4cc101b..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+e=miniz.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h+c=1+t=0.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h+c=1+t=0.png
deleted file mode 100644
index d6e19b7..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h+c=1+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h+c=1.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h+c=1.png
deleted file mode 100644
index d6e19b7..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h+c=1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h+t=0.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h+t=0.png
deleted file mode 100644
index b2aa991..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h+t=1.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h+t=1.png
deleted file mode 100644
index b2aa991..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h+t=1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h+t=2.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h+t=2.png
deleted file mode 100644
index b2aa991..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h+t=2.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h.png
deleted file mode 100644
index b2aa991..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=h.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o+c=1+t=0.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o+c=1+t=0.png
deleted file mode 100644
index ad0aca7..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o+c=1+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o+c=1.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o+c=1.png
deleted file mode 100644
index ad0aca7..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o+c=1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o+t=0.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o+t=0.png
deleted file mode 100644
index 4ab31b6..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o+t=1.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o+t=1.png
deleted file mode 100644
index 4ab31b6..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o+t=1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o+t=2.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o+t=2.png
deleted file mode 100644
index 4ab31b6..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o+t=2.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o.png b/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o.png
deleted file mode 100644
index 4ab31b6..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-png8+m=o.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+alpha=false.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+alpha=false.webp
deleted file mode 100644
index f2a3cfa..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+alpha=false.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+alpha_compression=0.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+alpha_compression=0.webp
deleted file mode 100644
index f2a3cfa..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+alpha_compression=0.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+alpha_filtering=2.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+alpha_filtering=2.webp
deleted file mode 100644
index f2a3cfa..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+alpha_filtering=2.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+alpha_quality=50.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+alpha_quality=50.webp
deleted file mode 100644
index f2a3cfa..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+alpha_quality=50.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+autofilter=0.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+autofilter=0.webp
deleted file mode 100644
index f2a3cfa..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+autofilter=0.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+filter_sharpness=4.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+filter_sharpness=4.webp
deleted file mode 100644
index f29a97e..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+filter_sharpness=4.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+filter_strength=50.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+filter_strength=50.webp
deleted file mode 100644
index 87c1fe6..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+filter_strength=50.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+filter_type=1+autofilter=1.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+filter_type=1+autofilter=1.webp
deleted file mode 100644
index 752148d..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+filter_type=1+autofilter=1.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+method=0.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+method=0.webp
deleted file mode 100644
index 9235d1f..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+method=0.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+method=6.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+method=6.webp
deleted file mode 100644
index d0c8206..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+method=6.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+partition_limit=50.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+partition_limit=50.webp
deleted file mode 100644
index 837ff3b..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+partition_limit=50.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+partitions=3.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+partitions=3.webp
deleted file mode 100644
index f2a3cfa..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+partitions=3.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+pass=10.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+pass=10.webp
deleted file mode 100644
index 7d71893..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+pass=10.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+preprocessing=1.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+preprocessing=1.webp
deleted file mode 100644
index f5e64b7..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+preprocessing=1.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+quality=64.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+quality=64.webp
deleted file mode 100644
index efd13ad..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+quality=64.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+segments=3.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+segments=3.webp
deleted file mode 100644
index 967cc57..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+segments=3.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+sns_strength=50.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+sns_strength=50.webp
deleted file mode 100644
index f2a3cfa..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+sns_strength=50.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+target_PSNR=.5.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+target_PSNR=.5.webp
deleted file mode 100644
index f2a3cfa..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+target_PSNR=.5.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+target_size=100.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+target_size=100.webp
deleted file mode 100644
index f2a3cfa..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp+target_size=100.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp.webp b/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp.webp
deleted file mode 100644
index f2a3cfa..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/aerial_rgba-webp.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png+e=miniz.png b/tests/python_tests/images/support/encoding-opts/blank-png+e=miniz.png
deleted file mode 100644
index 334ffe5..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png+e=miniz.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png+t=0.png b/tests/python_tests/images/support/encoding-opts/blank-png+t=0.png
deleted file mode 100644
index 49c789a..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png.png b/tests/python_tests/images/support/encoding-opts/blank-png.png
deleted file mode 100644
index 49c789a..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png32+e=miniz.png b/tests/python_tests/images/support/encoding-opts/blank-png32+e=miniz.png
deleted file mode 100644
index 8708c32..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png32+e=miniz.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png32+t=0.png b/tests/python_tests/images/support/encoding-opts/blank-png32+t=0.png
deleted file mode 100644
index 50e3890..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png32+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png32.png b/tests/python_tests/images/support/encoding-opts/blank-png32.png
deleted file mode 100644
index 04469ac..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png32.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png8+e=miniz.png b/tests/python_tests/images/support/encoding-opts/blank-png8+e=miniz.png
deleted file mode 100644
index 334ffe5..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png8+e=miniz.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png8+m=h+c=1+t=0.png b/tests/python_tests/images/support/encoding-opts/blank-png8+m=h+c=1+t=0.png
deleted file mode 100644
index 49c789a..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png8+m=h+c=1+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png8+m=h+c=1.png b/tests/python_tests/images/support/encoding-opts/blank-png8+m=h+c=1.png
deleted file mode 100644
index 49c789a..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png8+m=h+c=1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png8+m=h+t=0.png b/tests/python_tests/images/support/encoding-opts/blank-png8+m=h+t=0.png
deleted file mode 100644
index 49c789a..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png8+m=h+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png8+m=h+t=1.png b/tests/python_tests/images/support/encoding-opts/blank-png8+m=h+t=1.png
deleted file mode 100644
index 49c789a..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png8+m=h+t=1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png8+m=h+t=2.png b/tests/python_tests/images/support/encoding-opts/blank-png8+m=h+t=2.png
deleted file mode 100644
index 49c789a..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png8+m=h+t=2.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png8+m=h.png b/tests/python_tests/images/support/encoding-opts/blank-png8+m=h.png
deleted file mode 100644
index 49c789a..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png8+m=h.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png8+m=o+c=1+t=0.png b/tests/python_tests/images/support/encoding-opts/blank-png8+m=o+c=1+t=0.png
deleted file mode 100644
index 49c789a..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png8+m=o+c=1+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png8+m=o+c=1.png b/tests/python_tests/images/support/encoding-opts/blank-png8+m=o+c=1.png
deleted file mode 100644
index 49c789a..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png8+m=o+c=1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png8+m=o+t=0.png b/tests/python_tests/images/support/encoding-opts/blank-png8+m=o+t=0.png
deleted file mode 100644
index 49c789a..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png8+m=o+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png8+m=o+t=1.png b/tests/python_tests/images/support/encoding-opts/blank-png8+m=o+t=1.png
deleted file mode 100644
index 49c789a..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png8+m=o+t=1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png8+m=o+t=2.png b/tests/python_tests/images/support/encoding-opts/blank-png8+m=o+t=2.png
deleted file mode 100644
index 49c789a..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png8+m=o+t=2.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-png8+m=o.png b/tests/python_tests/images/support/encoding-opts/blank-png8+m=o.png
deleted file mode 100644
index 49c789a..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-png8+m=o.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+alpha=false.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+alpha=false.webp
deleted file mode 100644
index da95b42..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+alpha=false.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+alpha_compression=0.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+alpha_compression=0.webp
deleted file mode 100644
index 2e264d4..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+alpha_compression=0.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+alpha_filtering=2.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+alpha_filtering=2.webp
deleted file mode 100644
index 5322827..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+alpha_filtering=2.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+alpha_quality=50.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+alpha_quality=50.webp
deleted file mode 100644
index ca054c5..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+alpha_quality=50.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+autofilter=0.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+autofilter=0.webp
deleted file mode 100644
index 5322827..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+autofilter=0.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+filter_sharpness=4.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+filter_sharpness=4.webp
deleted file mode 100644
index b354377..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+filter_sharpness=4.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+filter_strength=50.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+filter_strength=50.webp
deleted file mode 100644
index 02bd501..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+filter_strength=50.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+filter_type=1+autofilter=1.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+filter_type=1+autofilter=1.webp
deleted file mode 100644
index e090422..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+filter_type=1+autofilter=1.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+method=0.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+method=0.webp
deleted file mode 100644
index 61a6b2c..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+method=0.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+method=6.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+method=6.webp
deleted file mode 100644
index cb9388b..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+method=6.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+partition_limit=50.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+partition_limit=50.webp
deleted file mode 100644
index 5322827..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+partition_limit=50.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+partitions=3.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+partitions=3.webp
deleted file mode 100644
index 5322827..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+partitions=3.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+pass=10.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+pass=10.webp
deleted file mode 100644
index 5322827..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+pass=10.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+preprocessing=1.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+preprocessing=1.webp
deleted file mode 100644
index 5322827..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+preprocessing=1.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+quality=64.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+quality=64.webp
deleted file mode 100644
index f201c07..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+quality=64.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+segments=3.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+segments=3.webp
deleted file mode 100644
index f9c9b4a..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+segments=3.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+sns_strength=50.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+sns_strength=50.webp
deleted file mode 100644
index 5322827..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+sns_strength=50.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+target_PSNR=.5.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+target_PSNR=.5.webp
deleted file mode 100644
index 5322827..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+target_PSNR=.5.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp+target_size=100.webp b/tests/python_tests/images/support/encoding-opts/blank-webp+target_size=100.webp
deleted file mode 100644
index 5322827..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp+target_size=100.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/blank-webp.webp b/tests/python_tests/images/support/encoding-opts/blank-webp.webp
deleted file mode 100644
index 5322827..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/blank-webp.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png+e=miniz.png b/tests/python_tests/images/support/encoding-opts/solid-png+e=miniz.png
deleted file mode 100644
index c3e5db4..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png+e=miniz.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png+t=0.png b/tests/python_tests/images/support/encoding-opts/solid-png+t=0.png
deleted file mode 100644
index 0d7dee0..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png.png b/tests/python_tests/images/support/encoding-opts/solid-png.png
deleted file mode 100644
index a4c4de3..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png32+e=miniz.png b/tests/python_tests/images/support/encoding-opts/solid-png32+e=miniz.png
deleted file mode 100644
index f155fce..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png32+e=miniz.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png32+t=0.png b/tests/python_tests/images/support/encoding-opts/solid-png32+t=0.png
deleted file mode 100644
index 21fffbf..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png32+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png32.png b/tests/python_tests/images/support/encoding-opts/solid-png32.png
deleted file mode 100644
index 4fe9ab3..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png32.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png8+e=miniz.png b/tests/python_tests/images/support/encoding-opts/solid-png8+e=miniz.png
deleted file mode 100644
index c3e5db4..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png8+e=miniz.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png8+m=h+c=1+t=0.png b/tests/python_tests/images/support/encoding-opts/solid-png8+m=h+c=1+t=0.png
deleted file mode 100644
index 0d7dee0..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png8+m=h+c=1+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png8+m=h+c=1.png b/tests/python_tests/images/support/encoding-opts/solid-png8+m=h+c=1.png
deleted file mode 100644
index a4c4de3..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png8+m=h+c=1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png8+m=h+t=0.png b/tests/python_tests/images/support/encoding-opts/solid-png8+m=h+t=0.png
deleted file mode 100644
index 0d7dee0..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png8+m=h+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png8+m=h+t=1.png b/tests/python_tests/images/support/encoding-opts/solid-png8+m=h+t=1.png
deleted file mode 100644
index a4c4de3..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png8+m=h+t=1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png8+m=h+t=2.png b/tests/python_tests/images/support/encoding-opts/solid-png8+m=h+t=2.png
deleted file mode 100644
index a4c4de3..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png8+m=h+t=2.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png8+m=h.png b/tests/python_tests/images/support/encoding-opts/solid-png8+m=h.png
deleted file mode 100644
index a4c4de3..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png8+m=h.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png8+m=o+c=1+t=0.png b/tests/python_tests/images/support/encoding-opts/solid-png8+m=o+c=1+t=0.png
deleted file mode 100644
index 0d7dee0..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png8+m=o+c=1+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png8+m=o+c=1.png b/tests/python_tests/images/support/encoding-opts/solid-png8+m=o+c=1.png
deleted file mode 100644
index a4c4de3..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png8+m=o+c=1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png8+m=o+t=0.png b/tests/python_tests/images/support/encoding-opts/solid-png8+m=o+t=0.png
deleted file mode 100644
index 0d7dee0..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png8+m=o+t=0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png8+m=o+t=1.png b/tests/python_tests/images/support/encoding-opts/solid-png8+m=o+t=1.png
deleted file mode 100644
index a4c4de3..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png8+m=o+t=1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png8+m=o+t=2.png b/tests/python_tests/images/support/encoding-opts/solid-png8+m=o+t=2.png
deleted file mode 100644
index a4c4de3..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png8+m=o+t=2.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-png8+m=o.png b/tests/python_tests/images/support/encoding-opts/solid-png8+m=o.png
deleted file mode 100644
index a4c4de3..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-png8+m=o.png and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+alpha=false.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+alpha=false.webp
deleted file mode 100644
index cbd85ab..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+alpha=false.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+alpha_compression=0.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+alpha_compression=0.webp
deleted file mode 100644
index cbd85ab..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+alpha_compression=0.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+alpha_filtering=2.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+alpha_filtering=2.webp
deleted file mode 100644
index cbd85ab..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+alpha_filtering=2.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+alpha_quality=50.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+alpha_quality=50.webp
deleted file mode 100644
index cbd85ab..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+alpha_quality=50.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+autofilter=0.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+autofilter=0.webp
deleted file mode 100644
index cbd85ab..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+autofilter=0.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+filter_sharpness=4.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+filter_sharpness=4.webp
deleted file mode 100644
index 1eadaa1..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+filter_sharpness=4.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+filter_strength=50.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+filter_strength=50.webp
deleted file mode 100644
index 621e6cc..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+filter_strength=50.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+filter_type=1+autofilter=1.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+filter_type=1+autofilter=1.webp
deleted file mode 100644
index 1372321..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+filter_type=1+autofilter=1.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+method=0.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+method=0.webp
deleted file mode 100644
index 15f58ff..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+method=0.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+method=6.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+method=6.webp
deleted file mode 100644
index 5a76594..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+method=6.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+partition_limit=50.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+partition_limit=50.webp
deleted file mode 100644
index cbd85ab..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+partition_limit=50.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+partitions=3.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+partitions=3.webp
deleted file mode 100644
index cbd85ab..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+partitions=3.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+pass=10.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+pass=10.webp
deleted file mode 100644
index cbd85ab..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+pass=10.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+preprocessing=1.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+preprocessing=1.webp
deleted file mode 100644
index cbd85ab..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+preprocessing=1.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+quality=64.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+quality=64.webp
deleted file mode 100644
index fba30ff..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+quality=64.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+segments=3.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+segments=3.webp
deleted file mode 100644
index 84ba1a8..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+segments=3.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+sns_strength=50.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+sns_strength=50.webp
deleted file mode 100644
index cbd85ab..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+sns_strength=50.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+target_PSNR=.5.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+target_PSNR=.5.webp
deleted file mode 100644
index cbd85ab..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+target_PSNR=.5.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp+target_size=100.webp b/tests/python_tests/images/support/encoding-opts/solid-webp+target_size=100.webp
deleted file mode 100644
index cbd85ab..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp+target_size=100.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/encoding-opts/solid-webp.webp b/tests/python_tests/images/support/encoding-opts/solid-webp.webp
deleted file mode 100644
index cbd85ab..0000000
Binary files a/tests/python_tests/images/support/encoding-opts/solid-webp.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/mapnik-layer-buffer-size.png b/tests/python_tests/images/support/mapnik-layer-buffer-size.png
deleted file mode 100644
index f1de74a..0000000
Binary files a/tests/python_tests/images/support/mapnik-layer-buffer-size.png and /dev/null differ
diff --git a/tests/python_tests/images/support/mapnik-marker-ellipse-render1.png b/tests/python_tests/images/support/mapnik-marker-ellipse-render1.png
deleted file mode 100644
index 254f811..0000000
Binary files a/tests/python_tests/images/support/mapnik-marker-ellipse-render1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/mapnik-marker-ellipse-render2.png b/tests/python_tests/images/support/mapnik-marker-ellipse-render2.png
deleted file mode 100644
index c2cd876..0000000
Binary files a/tests/python_tests/images/support/mapnik-marker-ellipse-render2.png and /dev/null differ
diff --git a/tests/python_tests/images/support/mapnik-merc2merc-reprojection-render1.png b/tests/python_tests/images/support/mapnik-merc2merc-reprojection-render1.png
deleted file mode 100644
index 59726ad..0000000
Binary files a/tests/python_tests/images/support/mapnik-merc2merc-reprojection-render1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/mapnik-merc2merc-reprojection-render2.png b/tests/python_tests/images/support/mapnik-merc2merc-reprojection-render2.png
deleted file mode 100644
index 351febf..0000000
Binary files a/tests/python_tests/images/support/mapnik-merc2merc-reprojection-render2.png and /dev/null differ
diff --git a/tests/python_tests/images/support/mapnik-merc2wgs84-reprojection-render.png b/tests/python_tests/images/support/mapnik-merc2wgs84-reprojection-render.png
deleted file mode 100644
index 55995d5..0000000
Binary files a/tests/python_tests/images/support/mapnik-merc2wgs84-reprojection-render.png and /dev/null differ
diff --git a/tests/python_tests/images/support/mapnik-palette-test.png b/tests/python_tests/images/support/mapnik-palette-test.png
deleted file mode 100644
index e657620..0000000
Binary files a/tests/python_tests/images/support/mapnik-palette-test.png and /dev/null differ
diff --git a/tests/python_tests/images/support/mapnik-python-circle-render1.png b/tests/python_tests/images/support/mapnik-python-circle-render1.png
deleted file mode 100644
index cb5eba4..0000000
Binary files a/tests/python_tests/images/support/mapnik-python-circle-render1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/mapnik-python-point-render1.png b/tests/python_tests/images/support/mapnik-python-point-render1.png
deleted file mode 100644
index b131d86..0000000
Binary files a/tests/python_tests/images/support/mapnik-python-point-render1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/mapnik-style-level-opacity.png b/tests/python_tests/images/support/mapnik-style-level-opacity.png
deleted file mode 100644
index 988a438..0000000
Binary files a/tests/python_tests/images/support/mapnik-style-level-opacity.png and /dev/null differ
diff --git a/tests/python_tests/images/support/mapnik-wgs842merc-reprojection-render.png b/tests/python_tests/images/support/mapnik-wgs842merc-reprojection-render.png
deleted file mode 100644
index 6fc5f12..0000000
Binary files a/tests/python_tests/images/support/mapnik-wgs842merc-reprojection-render.png and /dev/null differ
diff --git a/tests/python_tests/images/support/marker-in-center-not-placed.png b/tests/python_tests/images/support/marker-in-center-not-placed.png
deleted file mode 100644
index a4c4de3..0000000
Binary files a/tests/python_tests/images/support/marker-in-center-not-placed.png and /dev/null differ
diff --git a/tests/python_tests/images/support/marker-in-center.png b/tests/python_tests/images/support/marker-in-center.png
deleted file mode 100644
index 7845d4f..0000000
Binary files a/tests/python_tests/images/support/marker-in-center.png and /dev/null differ
diff --git a/tests/python_tests/images/support/marker-text-line-scale-factor-0.005.png b/tests/python_tests/images/support/marker-text-line-scale-factor-0.005.png
deleted file mode 100644
index ea97490..0000000
Binary files a/tests/python_tests/images/support/marker-text-line-scale-factor-0.005.png and /dev/null differ
diff --git a/tests/python_tests/images/support/marker-text-line-scale-factor-0.1.png b/tests/python_tests/images/support/marker-text-line-scale-factor-0.1.png
deleted file mode 100644
index 0af26d7..0000000
Binary files a/tests/python_tests/images/support/marker-text-line-scale-factor-0.1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/marker-text-line-scale-factor-0.899.png b/tests/python_tests/images/support/marker-text-line-scale-factor-0.899.png
deleted file mode 100644
index a31b886..0000000
Binary files a/tests/python_tests/images/support/marker-text-line-scale-factor-0.899.png and /dev/null differ
diff --git a/tests/python_tests/images/support/marker-text-line-scale-factor-1.5.png b/tests/python_tests/images/support/marker-text-line-scale-factor-1.5.png
deleted file mode 100644
index 33b2751..0000000
Binary files a/tests/python_tests/images/support/marker-text-line-scale-factor-1.5.png and /dev/null differ
diff --git a/tests/python_tests/images/support/marker-text-line-scale-factor-1.png b/tests/python_tests/images/support/marker-text-line-scale-factor-1.png
deleted file mode 100644
index 07c1065..0000000
Binary files a/tests/python_tests/images/support/marker-text-line-scale-factor-1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/marker-text-line-scale-factor-10.png b/tests/python_tests/images/support/marker-text-line-scale-factor-10.png
deleted file mode 100644
index ffdfad1..0000000
Binary files a/tests/python_tests/images/support/marker-text-line-scale-factor-10.png and /dev/null differ
diff --git a/tests/python_tests/images/support/marker-text-line-scale-factor-100.png b/tests/python_tests/images/support/marker-text-line-scale-factor-100.png
deleted file mode 100644
index c5828b5..0000000
Binary files a/tests/python_tests/images/support/marker-text-line-scale-factor-100.png and /dev/null differ
diff --git a/tests/python_tests/images/support/marker-text-line-scale-factor-1e-05.png b/tests/python_tests/images/support/marker-text-line-scale-factor-1e-05.png
deleted file mode 100644
index 0f36830..0000000
Binary files a/tests/python_tests/images/support/marker-text-line-scale-factor-1e-05.png and /dev/null differ
diff --git a/tests/python_tests/images/support/marker-text-line-scale-factor-2.png b/tests/python_tests/images/support/marker-text-line-scale-factor-2.png
deleted file mode 100644
index 25217e4..0000000
Binary files a/tests/python_tests/images/support/marker-text-line-scale-factor-2.png and /dev/null differ
diff --git a/tests/python_tests/images/support/marker-text-line-scale-factor-5.png b/tests/python_tests/images/support/marker-text-line-scale-factor-5.png
deleted file mode 100644
index a6c4c1e..0000000
Binary files a/tests/python_tests/images/support/marker-text-line-scale-factor-5.png and /dev/null differ
diff --git a/tests/python_tests/images/support/raster-alpha.png b/tests/python_tests/images/support/raster-alpha.png
deleted file mode 100644
index 3c79bb3..0000000
Binary files a/tests/python_tests/images/support/raster-alpha.png and /dev/null differ
diff --git a/tests/python_tests/images/support/spacing.png b/tests/python_tests/images/support/spacing.png
deleted file mode 100644
index 8d6bb40..0000000
Binary files a/tests/python_tests/images/support/spacing.png and /dev/null differ
diff --git a/tests/python_tests/images/support/transparency/aerial_rgb.png b/tests/python_tests/images/support/transparency/aerial_rgb.png
deleted file mode 100644
index 16481a4..0000000
Binary files a/tests/python_tests/images/support/transparency/aerial_rgb.png and /dev/null differ
diff --git a/tests/python_tests/images/support/transparency/aerial_rgba.png b/tests/python_tests/images/support/transparency/aerial_rgba.png
deleted file mode 100644
index 0f15a35..0000000
Binary files a/tests/python_tests/images/support/transparency/aerial_rgba.png and /dev/null differ
diff --git a/tests/python_tests/images/support/transparency/white0.png b/tests/python_tests/images/support/transparency/white0.png
deleted file mode 100644
index 955861a..0000000
Binary files a/tests/python_tests/images/support/transparency/white0.png and /dev/null differ
diff --git a/tests/python_tests/images/support/transparency/white0.webp b/tests/python_tests/images/support/transparency/white0.webp
deleted file mode 100644
index a370626..0000000
Binary files a/tests/python_tests/images/support/transparency/white0.webp and /dev/null differ
diff --git a/tests/python_tests/images/support/transparency/white1.png b/tests/python_tests/images/support/transparency/white1.png
deleted file mode 100644
index db4e827..0000000
Binary files a/tests/python_tests/images/support/transparency/white1.png and /dev/null differ
diff --git a/tests/python_tests/images/support/transparency/white2.png b/tests/python_tests/images/support/transparency/white2.png
deleted file mode 100644
index 136e098..0000000
Binary files a/tests/python_tests/images/support/transparency/white2.png and /dev/null differ
diff --git a/tests/python_tests/introspection_test.py b/tests/python_tests/introspection_test.py
deleted file mode 100644
index 6fbbbb7..0000000
--- a/tests/python_tests/introspection_test.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env python
-
-import os
-from nose.tools import *
-from utilities import execution_path, run_all
-
-import mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def test_introspect_symbolizers():
- # create a symbolizer
- p = mapnik.PointSymbolizer()
- p.file = "../data/images/dummy.png"
- p.allow_overlap = True
- p.opacity = 0.5
-
- eq_(p.allow_overlap, True)
- eq_(p.opacity, 0.5)
- eq_(p.filename,'../data/images/dummy.png')
-
- # make sure the defaults
- # are what we think they are
- eq_(p.allow_overlap, True)
- eq_(p.opacity,0.5)
- eq_(p.filename,'../data/images/dummy.png')
-
- # contruct objects to hold it
- r = mapnik.Rule()
- r.symbols.append(p)
- s = mapnik.Style()
- s.rules.append(r)
- m = mapnik.Map(0,0)
- m.append_style('s',s)
-
- # try to figure out what is
- # in the map and make sure
- # style is there and the same
-
- s2 = m.find_style('s')
- rules = s2.rules
- eq_(len(rules),1)
- r2 = rules[0]
- syms = r2.symbols
- eq_(len(syms),1)
-
- ## TODO here, we can do...
- sym = syms[0]
- p2 = sym.extract()
- assert isinstance(p2,mapnik.PointSymbolizer)
-
- eq_(p2.allow_overlap, True)
- eq_(p2.opacity, 0.5)
- eq_(p2.filename,'../data/images/dummy.png')
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/json_feature_properties_test.py b/tests/python_tests/json_feature_properties_test.py
deleted file mode 100644
index 25c6a8c..0000000
--- a/tests/python_tests/json_feature_properties_test.py
+++ /dev/null
@@ -1,103 +0,0 @@
-#encoding: utf8
-
-from nose.tools import *
-import os,sys
-import mapnik
-from utilities import execution_path, run_all
-try:
- import json
-except ImportError:
- import simplejson as json
-
-chars = [
- {
- "name":"single_quote",
- "test": "string with ' quote",
- "json": '{"type":"Feature","id":1,"geometry":null,"properties":{"name":"string with \' quote"}}'
- },
- {
- "name":"escaped_single_quote",
- "test":"string with \' quote",
- "json":'{"type":"Feature","id":1,"geometry":null,"properties":{"name":"string with \' quote"}}'
- },
- {
- "name":"double_quote",
- "test":'string with " quote',
- "json":'{"type":"Feature","id":1,"geometry":null,"properties":{"name":"string with \\" quote"}}'
- },
- {
- "name":"double_quote2",
- "test":"string with \" quote",
- "json":'{"type":"Feature","id":1,"geometry":null,"properties":{"name":"string with \\" quote"}}'
- },
- {
- "name":"reverse_solidus", # backslash
- "test":"string with \\ quote",
- "json":'{"type":"Feature","id":1,"geometry":null,"properties":{"name":"string with \\\ quote"}}'
- },
- {
- "name":"solidus", # forward slash
- "test":"string with / quote",
- "json":'{"type":"Feature","id":1,"geometry":null,"properties":{"name":"string with / quote"}}'
- },
- {
- "name":"backspace",
- "test":"string with \b quote",
- "json":'{"type":"Feature","id":1,"geometry":null,"properties":{"name":"string with \\b quote"}}'
- },
- {
- "name":"formfeed",
- "test":"string with \f quote",
- "json":'{"type":"Feature","id":1,"geometry":null,"properties":{"name":"string with \\f quote"}}'
- },
- {
- "name":"newline",
- "test":"string with \n quote",
- "json":'{"type":"Feature","id":1,"geometry":null,"properties":{"name":"string with \\n quote"}}'
- },
- {
- "name":"carriage_return",
- "test":"string with \r quote",
- "json":'{"type":"Feature","id":1,"geometry":null,"properties":{"name":"string with \\r quote"}}'
- },
- {
- "name":"horiztonal_tab",
- "test":"string with \t quote",
- "json":'{"type":"Feature","id":1,"geometry":null,"properties":{"name":"string with \\t quote"}}'
- },
- # remainder are c++ reserved, but not json
- {
- "name":"vert_tab",
- "test":"string with \v quote",
- "json":'{"type":"Feature","id":1,"geometry":null,"properties":{"name":"string with \\u000b quote"}}'
- },
- {
- "name":"alert",
- "test":"string with \a quote",
- "json":'{"type":"Feature","id":1,"geometry":null,"properties":{"name":"string with \u0007 quote"}}'
- }
-]
-
-ctx = mapnik.Context()
-ctx.push('name')
-
-def test_char_escaping():
- for char in chars:
- feat = mapnik.Feature(ctx,1)
- expected = char['test']
- feat["name"] = expected
- eq_(feat["name"],expected)
- # confirm the python json module
- # is working as we would expect
- pyjson2 = json.loads(char['json'])
- eq_(pyjson2['properties']['name'],expected)
- # confirm our behavior is the same as python json module
- # for the original string
- geojson_feat_string = feat.to_geojson()
- eq_(geojson_feat_string,char['json'],"Mapnik's json escaping is not to spec: actual(%s) and expected(%s)" % (geojson_feat_string,char['json']))
- # and the round tripped string
- pyjson = json.loads(geojson_feat_string)
- eq_(pyjson['properties']['name'],expected)
-
-if __name__ == "__main__":
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/layer_buffer_size_test.py b/tests/python_tests/layer_buffer_size_test.py
deleted file mode 100644
index 3916c92..0000000
--- a/tests/python_tests/layer_buffer_size_test.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#coding=utf8
-import os
-import mapnik
-from utilities import execution_path, run_all
-from nose.tools import *
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-if 'sqlite' in mapnik.DatasourceCache.plugin_names():
-
- # the negative buffer on the layer should
- # override the postive map buffer leading
- # only one point to be rendered in the map
- def test_layer_buffer_size_1():
- m = mapnik.Map(512,512)
- eq_(m.buffer_size,0)
- mapnik.load_map(m,'../data/good_maps/layer_buffer_size_reduction.xml')
- eq_(m.buffer_size,256)
- eq_(m.layers[0].buffer_size,-150)
- m.zoom_all()
- im = mapnik.Image(m.width,m.height)
- mapnik.render(m,im)
- actual = '/tmp/mapnik-layer-buffer-size.png'
- expected = 'images/support/mapnik-layer-buffer-size.png'
- im.save(actual,"png32")
- expected_im = mapnik.Image.open(expected)
- eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
-
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/layer_modification_test.py b/tests/python_tests/layer_modification_test.py
deleted file mode 100644
index 2903143..0000000
--- a/tests/python_tests/layer_modification_test.py
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/usr/bin/env python
-
-import os
-from nose.tools import *
-from utilities import execution_path, run_all
-import mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def test_adding_datasource_to_layer():
- map_string = '''<?xml version="1.0" encoding="utf-8"?>
-<Map>
-
- <Layer name="world_borders">
- <StyleName>world_borders_style</StyleName>
- <StyleName>point_style</StyleName>
- <!-- leave datasource empty -->
- <!--
- <Datasource>
- <Parameter name="file">../data/shp/world_merc.shp</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- -->
- </Layer>
-
-</Map>
-'''
- m = mapnik.Map(256, 256)
-
- try:
- mapnik.load_map_from_string(m, map_string)
-
- # validate it loaded fine
- eq_(m.layers[0].styles[0],'world_borders_style')
- eq_(m.layers[0].styles[1],'point_style')
- eq_(len(m.layers),1)
-
- # also assign a variable reference to that layer
- # below we will test that this variable references
- # the same object that is attached to the map
- lyr = m.layers[0]
-
- # ensure that there was no datasource for the layer...
- eq_(m.layers[0].datasource,None)
- eq_(lyr.datasource,None)
-
- # also note that since the srs was black it defaulted to wgs84
- eq_(m.layers[0].srs,'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
- eq_(lyr.srs,'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
-
- # now add a datasource one...
- ds = mapnik.Shapefile(file='../data/shp/world_merc.shp')
- m.layers[0].datasource = ds
-
- # now ensure it is attached
- eq_(m.layers[0].datasource.describe()['name'],"shape")
- eq_(lyr.datasource.describe()['name'],"shape")
-
- # and since we have now added a shapefile in spherical mercator, adjust the projection
- lyr.srs = '+proj=merc +lon_0=0 +lat_ts=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs'
-
- # test that assignment
- eq_(m.layers[0].srs,'+proj=merc +lon_0=0 +lat_ts=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs')
- eq_(lyr.srs,'+proj=merc +lon_0=0 +lat_ts=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs')
- except RuntimeError, e:
- # only test datasources that we have installed
- if not 'Could not create datasource' in str(e):
- raise RuntimeError(e)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/layer_test.py b/tests/python_tests/layer_test.py
deleted file mode 100644
index 1a11c0f..0000000
--- a/tests/python_tests/layer_test.py
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import mapnik
-
-# Map initialization
-def test_layer_init():
- l = mapnik.Layer('test')
- eq_(l.name,'test')
- eq_(l.srs,'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
- eq_(l.envelope(),mapnik.Box2d())
- eq_(l.clear_label_cache,False)
- eq_(l.cache_features,False)
- eq_(l.visible(1),True)
- eq_(l.active,True)
- eq_(l.datasource,None)
- eq_(l.queryable,False)
- eq_(l.minzoom,0.0)
- eq_(l.maxzoom > 1e+6,True)
- eq_(l.group_by,"")
- eq_(l.maximum_extent,None)
- eq_(l.buffer_size,None)
- eq_(len(l.styles),0)
-
-if __name__ == "__main__":
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/load_map_test.py b/tests/python_tests/load_map_test.py
deleted file mode 100644
index 106981d..0000000
--- a/tests/python_tests/load_map_test.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-from utilities import execution_path, run_all
-
-import os, sys, glob, mapnik
-
-default_logging_severity = mapnik.logger.get_severity()
-
-def setup():
- # make the tests silent to suppress unsupported params from harfbuzz tests
- # TODO: remove this after harfbuzz branch merges
- mapnik.logger.set_severity(mapnik.severity_type.None)
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def teardown():
- mapnik.logger.set_severity(default_logging_severity)
-
-def test_broken_files():
- default_logging_severity = mapnik.logger.get_severity()
- mapnik.logger.set_severity(mapnik.severity_type.None)
- broken_files = glob.glob("../data/broken_maps/*.xml")
- # Add a filename that doesn't exist
- broken_files.append("../data/broken/does_not_exist.xml")
-
- failures = [];
- for filename in broken_files:
- try:
- m = mapnik.Map(512, 512)
- strict = True
- mapnik.load_map(m, filename, strict)
- failures.append('Loading broken map (%s) did not raise RuntimeError!' % filename)
- except RuntimeError:
- pass
- eq_(len(failures),0,'\n'+'\n'.join(failures))
- mapnik.logger.set_severity(default_logging_severity)
-
-def test_good_files():
- good_files = glob.glob("../data/good_maps/*.xml")
- good_files.extend(glob.glob("../visual_tests/styles/*.xml"))
-
- failures = [];
- for filename in good_files:
- try:
- m = mapnik.Map(512, 512)
- strict = True
- mapnik.load_map(m, filename, strict)
- base_path = os.path.dirname(filename)
- mapnik.load_map_from_string(m,open(filename,'rb').read(),strict,base_path)
- except RuntimeError, e:
- # only test datasources that we have installed
- if not 'Could not create datasource' in str(e) \
- and not 'Bad connection' in str(e):
- failures.append('Failed to load valid map %s (%s)' % (filename,e))
- eq_(len(failures),0,'\n'+'\n'.join(failures))
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/map_query_test.py b/tests/python_tests/map_query_test.py
deleted file mode 100644
index e01407e..0000000
--- a/tests/python_tests/map_query_test.py
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import os, mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-# map has no layers
- at raises(IndexError)
-def test_map_query_throw1():
- m = mapnik.Map(256,256)
- m.zoom_to_box(mapnik.Box2d(-1,-1,0,0))
- m.query_point(0,0,0)
-
-# only positive indexes
- at raises(IndexError)
-def test_map_query_throw2():
- m = mapnik.Map(256,256)
- m.query_point(-1,0,0)
-
-# map has never been zoomed (nodata)
- at raises(RuntimeError)
-def test_map_query_throw3():
- m = mapnik.Map(256,256)
- m.query_point(0,0,0)
-
-if 'shape' in mapnik.DatasourceCache.plugin_names():
- # map has never been zoomed (even with data)
- @raises(RuntimeError)
- def test_map_query_throw4():
- m = mapnik.Map(256,256)
- mapnik.load_map(m,'../data/good_maps/agg_poly_gamma_map.xml')
- m.query_point(0,0,0)
-
- # invalid coords in general (do not intersect)
- @raises(RuntimeError)
- def test_map_query_throw5():
- m = mapnik.Map(256,256)
- mapnik.load_map(m,'../data/good_maps/agg_poly_gamma_map.xml')
- m.zoom_all()
- m.query_point(0,9999999999999999,9999999999999999)
-
- def test_map_query_works1():
- m = mapnik.Map(256,256)
- mapnik.load_map(m,'../data/good_maps/wgs842merc_reprojection.xml')
- merc_bounds = mapnik.Box2d(-20037508.34,-20037508.34,20037508.34,20037508.34)
- m.maximum_extent = merc_bounds
- m.zoom_all()
- fs = m.query_point(0,-11012435.5376, 4599674.6134) # somewhere in kansas
- feat = fs.next()
- eq_(feat.attributes['NAME_FORMA'],u'United States of America')
-
- def test_map_query_works2():
- m = mapnik.Map(256,256)
- mapnik.load_map(m,'../data/good_maps/merc2wgs84_reprojection.xml')
- wgs84_bounds = mapnik.Box2d(-179.999999975,-85.0511287776,179.999999975,85.0511287776)
- m.maximum_extent = wgs84_bounds
- # caution - will go square due to evil aspect_fix_mode backhandedness
- m.zoom_all()
- #mapnik.render_to_file(m,'works2.png')
- # validate that aspect_fix_mode modified the bbox reasonably
- e = m.envelope()
- assert_almost_equal(e.minx, -179.999999975, places=7)
- assert_almost_equal(e.miny, -167.951396161, places=7)
- assert_almost_equal(e.maxx, 179.999999975, places=7)
- assert_almost_equal(e.maxy, 192.048603789, places=7)
- fs = m.query_point(0,-98.9264, 38.1432) # somewhere in kansas
- feat = fs.next()
- eq_(feat.attributes['NAME'],u'United States')
-
- def test_map_query_in_pixels_works1():
- m = mapnik.Map(256,256)
- mapnik.load_map(m,'../data/good_maps/wgs842merc_reprojection.xml')
- merc_bounds = mapnik.Box2d(-20037508.34,-20037508.34,20037508.34,20037508.34)
- m.maximum_extent = merc_bounds
- m.zoom_all()
- fs = m.query_map_point(0,55,100) # somewhere in middle of us
- feat = fs.next()
- eq_(feat.attributes['NAME_FORMA'],u'United States of America')
-
- def test_map_query_in_pixels_works2():
- m = mapnik.Map(256,256)
- mapnik.load_map(m,'../data/good_maps/merc2wgs84_reprojection.xml')
- wgs84_bounds = mapnik.Box2d(-179.999999975,-85.0511287776,179.999999975,85.0511287776)
- m.maximum_extent = wgs84_bounds
- # caution - will go square due to evil aspect_fix_mode backhandedness
- m.zoom_all()
- # validate that aspect_fix_mode modified the bbox reasonably
- e = m.envelope()
- assert_almost_equal(e.minx, -179.999999975, places=7)
- assert_almost_equal(e.miny, -167.951396161, places=7)
- assert_almost_equal(e.maxx, 179.999999975, places=7)
- assert_almost_equal(e.maxy, 192.048603789, places=7)
- fs = m.query_map_point(0,55,100) # somewhere in Canada
- feat = fs.next()
- eq_(feat.attributes['NAME'],u'Canada')
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/mapnik_config_test.py b/tests/python_tests/mapnik_config_test.py
deleted file mode 100644
index d49a8ba..0000000
--- a/tests/python_tests/mapnik_config_test.py
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-from utilities import execution_path, run_all
-from subprocess import Popen, PIPE, STDOUT
-import os
-
-import os, sys, glob, mapnik
-
-def test_mapnik_config_no_args():
- process = Popen('mapnik-config', shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
- result = process.communicate()
- eq_('Usage: mapnik-config' in result[0],True)
- eq_(result[1],'')
- eq_(process.returncode,1)
-
-def test_mapnik_config_help():
- process = Popen('mapnik-config --help', shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
- result = process.communicate()
- eq_('Usage: mapnik-config' in result[0],True)
- eq_(result[1],'')
- eq_(process.returncode,0)
-
-def test_mapnik_config_help_short():
- process = Popen('mapnik-config -h', shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
- result = process.communicate()
- eq_('Usage: mapnik-config' in result[0],True)
- eq_(result[1],'')
- eq_(process.returncode,0)
-
-def test_mapnik_config_valid_opts():
- valid_args = [
- '-h',
- '--help',
- '-v',
- '--version',
- '--version-number',
- '--git-revision',
- '--git-describe',
- '--fonts',
- '--input-plugins',
- '--defines',
- '--prefix',
- '--lib-name',
- '--libs',
- '--dep-libs',
- '--ldflags',
- '--includes',
- '--dep-includes',
- '--cxxflags',
- '--cflags',
- '--all-flags',
- '--cxx'
- ]
- for item in valid_args:
- cmd = 'mapnik-config ' + item
- process = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
- result = process.communicate()
- eq_(process.returncode,0)
- eq_(len(result[0]) > 1,True,cmd)
- eq_(result[1],'')
-
-def test_mapnik_config_invalid_option():
- cmd = 'mapnik-config --invalid-does-not-exist'
- process = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
- result = process.communicate()
- eq_(process.returncode,0)
- eq_(result[0].strip(),'')
- eq_(result[1].strip(),'unknown option --invalid-does-not-exist')
-
-def test_mapnik_config_valid_and_invalid_option():
- cmd = 'mapnik-config --libs --invalid-does-not-exist'
- process = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
- result = process.communicate()
- eq_('mapnik' in result[0],True)
- eq_(result[1].strip(),'unknown option --invalid-does-not-exist')
- eq_(process.returncode,0)
-
-if __name__ == "__main__":
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/mapnik_logger_test.py b/tests/python_tests/mapnik_logger_test.py
deleted file mode 100644
index da338ee..0000000
--- a/tests/python_tests/mapnik_logger_test.py
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env python
-from nose.tools import *
-from utilities import execution_path, run_all
-import mapnik
-
-def test_logger_init():
- eq_(mapnik.severity_type.Debug,0)
- eq_(mapnik.severity_type.Warn,1)
- eq_(mapnik.severity_type.Error,2)
- eq_(mapnik.severity_type.None,3)
- default = mapnik.logger.get_severity()
- mapnik.logger.set_severity(mapnik.severity_type.Debug)
- eq_(mapnik.logger.get_severity(),mapnik.severity_type.Debug)
- mapnik.logger.set_severity(default)
- eq_(mapnik.logger.get_severity(),default)
-
-if __name__ == "__main__":
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/mapnik_test_data_test.py b/tests/python_tests/mapnik_test_data_test.py
deleted file mode 100644
index df0b837..0000000
--- a/tests/python_tests/mapnik_test_data_test.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import os, mapnik
-from glob import glob
-
-default_logging_severity = mapnik.logger.get_severity()
-
-def setup():
- mapnik.logger.set_severity(mapnik.severity_type.None)
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def teardown():
- mapnik.logger.set_severity(default_logging_severity)
-
-plugin_mapping = {
- '.csv' : ['csv'],
- '.json': ['geojson','ogr'],
- '.tif' : ['gdal'],
- #'.tif' : ['gdal','raster'],
- '.kml' : ['ogr'],
- '.gpx' : ['ogr'],
- '.vrt' : ['gdal']
-}
-
-def test_opening_data():
- # https://github.com/mapbox/mapnik-test-data
- # cd tests/data
- # git clone --depth 1 https://github.com/mapbox/mapnik-test-data
- if os.path.exists('../data/mapnik-test-data/'):
- files = glob('../data/mapnik-test-data/data/*/*.*')
- for filepath in files:
- ext = os.path.splitext(filepath)[1]
- if plugin_mapping.get(ext):
- #print 'testing opening %s' % filepath
- if 'topo' in filepath:
- kwargs = {'type': 'ogr','file': filepath}
- kwargs['layer_by_index'] = 0
- try:
- ds = mapnik.Datasource(**kwargs)
- except Exception, e:
- print 'could not open, %s: %s' % (kwargs,e)
- else:
- for plugin in plugin_mapping[ext]:
- kwargs = {'type': plugin,'file': filepath}
- if plugin is 'ogr':
- kwargs['layer_by_index'] = 0
- try:
- ds = mapnik.Datasource(**kwargs)
- except Exception, e:
- print 'could not open, %s: %s' % (kwargs,e)
- #else:
- # print 'skipping opening %s' % filepath
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/markers_complex_rendering_test.py b/tests/python_tests/markers_complex_rendering_test.py
deleted file mode 100644
index f66277f..0000000
--- a/tests/python_tests/markers_complex_rendering_test.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#coding=utf8
-import os
-import mapnik
-from utilities import execution_path, run_all
-from nose.tools import *
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-if 'csv' in mapnik.DatasourceCache.plugin_names():
- def test_marker_ellipse_render1():
- m = mapnik.Map(256,256)
- mapnik.load_map(m,'../data/good_maps/marker_ellipse_transform.xml')
- m.zoom_all()
- im = mapnik.Image(m.width,m.height)
- mapnik.render(m,im)
- actual = '/tmp/mapnik-marker-ellipse-render1.png'
- expected = 'images/support/mapnik-marker-ellipse-render1.png'
- im.save(actual,'png32')
- expected_im = mapnik.Image.open(expected)
- eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
-
- def test_marker_ellipse_render2():
- # currently crashes https://github.com/mapnik/mapnik/issues/1365
- m = mapnik.Map(256,256)
- mapnik.load_map(m,'../data/good_maps/marker_ellipse_transform2.xml')
- m.zoom_all()
- im = mapnik.Image(m.width,m.height)
- mapnik.render(m,im)
- actual = '/tmp/mapnik-marker-ellipse-render2.png'
- expected = 'images/support/mapnik-marker-ellipse-render2.png'
- im.save(actual,'png32')
- expected_im = mapnik.Image.open(expected)
- eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/memory_datasource_test.py b/tests/python_tests/memory_datasource_test.py
deleted file mode 100644
index c2791bf..0000000
--- a/tests/python_tests/memory_datasource_test.py
+++ /dev/null
@@ -1,34 +0,0 @@
-#encoding: utf8
-import mapnik
-from utilities import execution_path, run_all
-from nose.tools import *
-
-def test_add_feature():
- md = mapnik.MemoryDatasource()
- eq_(md.num_features(), 0)
- context = mapnik.Context()
- context.push('foo')
- feature = mapnik.Feature(context,1)
- feature['foo'] = 'bar'
- feature.add_geometries_from_wkt('POINT(2 3)')
- md.add_feature(feature)
- eq_(md.num_features(), 1)
-
- featureset = md.features_at_point(mapnik.Coord(2,3))
- retrieved = []
-
- for feat in featureset:
- retrieved.append(feat)
-
- eq_(len(retrieved), 1)
- f = retrieved[0]
- eq_(f['foo'], 'bar')
-
- featureset = md.features_at_point(mapnik.Coord(20,30))
- retrieved = []
- for feat in featureset:
- retrieved.append(feat)
- eq_(len(retrieved), 0)
-
-if __name__ == "__main__":
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/multi_tile_raster_test.py b/tests/python_tests/multi_tile_raster_test.py
deleted file mode 100644
index 5ecb46e..0000000
--- a/tests/python_tests/multi_tile_raster_test.py
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-from utilities import execution_path, run_all, contains_word
-import os, mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def test_multi_tile_policy():
- srs = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
- lyr = mapnik.Layer('raster')
- if 'raster' in mapnik.DatasourceCache.plugin_names():
- lyr.datasource = mapnik.Raster(
- file = '../data/raster_tiles/${x}/${y}.tif',
- lox = -180,
- loy = -90,
- hix = 180,
- hiy = 90,
- multi = 1,
- tile_size = 256,
- x_width = 2,
- y_width = 2
- )
- lyr.srs = srs
- _map = mapnik.Map(256, 256, srs)
- style = mapnik.Style()
- rule = mapnik.Rule()
- sym = mapnik.RasterSymbolizer()
- rule.symbols.append(sym)
- style.rules.append(rule)
- _map.append_style('foo', style)
- lyr.styles.append('foo')
- _map.layers.append(lyr)
- _map.zoom_to_box(lyr.envelope())
-
- im = mapnik.Image(_map.width, _map.height)
- mapnik.render(_map, im)
-
- # test green chunk
- eq_(im.view(0,64,1,1).tostring(), '\x00\xff\x00\xff')
- eq_(im.view(127,64,1,1).tostring(), '\x00\xff\x00\xff')
- eq_(im.view(0,127,1,1).tostring(), '\x00\xff\x00\xff')
- eq_(im.view(127,127,1,1).tostring(), '\x00\xff\x00\xff')
-
- # test blue chunk
- eq_(im.view(128,64,1,1).tostring(), '\x00\x00\xff\xff')
- eq_(im.view(255,64,1,1).tostring(), '\x00\x00\xff\xff')
- eq_(im.view(128,127,1,1).tostring(), '\x00\x00\xff\xff')
- eq_(im.view(255,127,1,1).tostring(), '\x00\x00\xff\xff')
-
- # test red chunk
- eq_(im.view(0,128,1,1).tostring(), '\xff\x00\x00\xff')
- eq_(im.view(127,128,1,1).tostring(), '\xff\x00\x00\xff')
- eq_(im.view(0,191,1,1).tostring(), '\xff\x00\x00\xff')
- eq_(im.view(127,191,1,1).tostring(), '\xff\x00\x00\xff')
-
- # test magenta chunk
- eq_(im.view(128,128,1,1).tostring(), '\xff\x00\xff\xff')
- eq_(im.view(255,128,1,1).tostring(), '\xff\x00\xff\xff')
- eq_(im.view(128,191,1,1).tostring(), '\xff\x00\xff\xff')
- eq_(im.view(255,191,1,1).tostring(), '\xff\x00\xff\xff')
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/object_test.py b/tests/python_tests/object_test.py
deleted file mode 100644
index 0f23e71..0000000
--- a/tests/python_tests/object_test.py
+++ /dev/null
@@ -1,569 +0,0 @@
-# #!/usr/bin/env python
-# # -*- coding: utf-8 -*-
-
-# import os
-# from nose.tools import *
-# from utilities import execution_path, run_all
-# import tempfile
-
-# import mapnik
-
-# def setup():
-# # All of the paths used are relative, if we run the tests
-# # from another directory we need to chdir()
-# os.chdir(execution_path('.'))
-
-# def test_debug_symbolizer():
-# s = mapnik.DebugSymbolizer()
-# eq_(s.mode,mapnik.debug_symbolizer_mode.collision)
-
-# def test_raster_symbolizer():
-# s = mapnik.RasterSymbolizer()
-# eq_(s.comp_op,mapnik.CompositeOp.src_over) # note: mode is deprecated
-# eq_(s.scaling,mapnik.scaling_method.NEAR)
-# eq_(s.opacity,1.0)
-# eq_(s.colorizer,None)
-# eq_(s.filter_factor,-1)
-# eq_(s.mesh_size,16)
-# eq_(s.premultiplied,None)
-# s.premultiplied = True
-# eq_(s.premultiplied,True)
-
-# def test_line_pattern():
-# s = mapnik.LinePatternSymbolizer(mapnik.PathExpression('../data/images/dummy.png'))
-# eq_(s.filename, '../data/images/dummy.png')
-# eq_(s.smooth,0.0)
-# eq_(s.transform,'')
-# eq_(s.offset,0.0)
-# eq_(s.comp_op,mapnik.CompositeOp.src_over)
-# eq_(s.clip,True)
-
-# def test_line_symbolizer():
-# s = mapnik.LineSymbolizer()
-# eq_(s.rasterizer, mapnik.line_rasterizer.FULL)
-# eq_(s.smooth,0.0)
-# eq_(s.comp_op,mapnik.CompositeOp.src_over)
-# eq_(s.clip,True)
-# eq_(s.stroke.width, 1)
-# eq_(s.stroke.opacity, 1)
-# eq_(s.stroke.color, mapnik.Color('black'))
-# eq_(s.stroke.line_cap, mapnik.line_cap.BUTT_CAP)
-# eq_(s.stroke.line_join, mapnik.line_join.MITER_JOIN)
-
-# l = mapnik.LineSymbolizer(mapnik.Color('blue'), 5.0)
-
-# eq_(l.stroke.width, 5)
-# eq_(l.stroke.opacity, 1)
-# eq_(l.stroke.color, mapnik.Color('blue'))
-# eq_(l.stroke.line_cap, mapnik.line_cap.BUTT_CAP)
-# eq_(l.stroke.line_join, mapnik.line_join.MITER_JOIN)
-
-# s = mapnik.Stroke(mapnik.Color('blue'), 5.0)
-# l = mapnik.LineSymbolizer(s)
-
-# eq_(l.stroke.width, 5)
-# eq_(l.stroke.opacity, 1)
-# eq_(l.stroke.color, mapnik.Color('blue'))
-# eq_(l.stroke.line_cap, mapnik.line_cap.BUTT_CAP)
-# eq_(l.stroke.line_join, mapnik.line_join.MITER_JOIN)
-
-# def test_line_symbolizer_stroke_reference():
-# l = mapnik.LineSymbolizer(mapnik.Color('green'),0.1)
-# l.stroke.add_dash(.1,.1)
-# l.stroke.add_dash(.1,.1)
-# eq_(l.stroke.get_dashes(), [(.1,.1),(.1,.1)])
-# eq_(l.stroke.color,mapnik.Color('green'))
-# eq_(l.stroke.opacity,1.0)
-# assert_almost_equal(l.stroke.width,0.1)
-
-# # https://github.com/mapnik/mapnik/issues/1427
-# def test_stroke_dash_api():
-# stroke = mapnik.Stroke()
-# dashes = [(1.0,1.0)]
-# stroke.dasharray = dashes
-# eq_(stroke.dasharray, dashes)
-# stroke.add_dash(.1,.1)
-# dashes.append((.1,.1))
-# eq_(stroke.dasharray, dashes)
-
-
-# def test_text_symbolizer():
-# s = mapnik.TextSymbolizer()
-# eq_(s.comp_op,mapnik.CompositeOp.src_over)
-# eq_(s.clip,True)
-# eq_(s.halo_rasterizer,mapnik.halo_rasterizer.FULL)
-
-# # https://github.com/mapnik/mapnik/issues/1420
-# eq_(s.text_transform, mapnik.text_transform.NONE)
-
-# # old args required method
-# ts = mapnik.TextSymbolizer(mapnik.Expression('[Field_Name]'), 'Font Name', 8, mapnik.Color('black'))
-# # eq_(str(ts.name), str(mapnik2.Expression('[Field_Name]'))) name field is no longer supported
-# eq_(ts.format.face_name, 'Font Name')
-# eq_(ts.format.text_size, 8)
-# eq_(ts.format.fill, mapnik.Color('black'))
-# eq_(ts.properties.label_placement, mapnik.label_placement.POINT_PLACEMENT)
-# eq_(ts.properties.horizontal_alignment, mapnik.horizontal_alignment.AUTO)
-
-# def test_shield_symbolizer_init():
-# s = mapnik.ShieldSymbolizer(mapnik.Expression('[Field Name]'), 'DejaVu Sans Bold', 6, mapnik.Color('#000000'), mapnik.PathExpression('../data/images/dummy.png'))
-# eq_(s.comp_op,mapnik.CompositeOp.src_over)
-# eq_(s.clip,True)
-# eq_(s.displacement, (0.0,0.0))
-# eq_(s.allow_overlap, False)
-# eq_(s.avoid_edges, False)
-# eq_(s.character_spacing,0)
-# #eq_(str(s.name), str(mapnik2.Expression('[Field Name]'))) name field is no longer supported
-# eq_(s.face_name, 'DejaVu Sans Bold')
-# eq_(s.allow_overlap, False)
-# eq_(s.fill, mapnik.Color('#000000'))
-# eq_(s.halo_fill, mapnik.Color('rgb(255,255,255)'))
-# eq_(s.halo_radius, 0)
-# eq_(s.label_placement, mapnik.label_placement.POINT_PLACEMENT)
-# eq_(s.minimum_distance, 0.0)
-# eq_(s.text_ratio, 0)
-# eq_(s.text_size, 6)
-# eq_(s.wrap_width, 0)
-# eq_(s.vertical_alignment, mapnik.vertical_alignment.AUTO)
-# eq_(s.label_spacing, 0)
-# eq_(s.label_position_tolerance, 0)
-# # 22.5 * M_PI/180.0 initialized by default
-# assert_almost_equal(s.max_char_angle_delta, 0.39269908169872414)
-
-# eq_(s.text_transform, mapnik.text_transform.NONE)
-# eq_(s.line_spacing, 0)
-# eq_(s.character_spacing, 0)
-
-# # r1341
-# eq_(s.wrap_before, False)
-# eq_(s.horizontal_alignment, mapnik.horizontal_alignment.AUTO)
-# eq_(s.justify_alignment, mapnik.justify_alignment.AUTO)
-# eq_(s.opacity, 1.0)
-
-# # r2300
-# eq_(s.minimum_padding, 0.0)
-
-# # was mixed with s.opacity
-# eq_(s.text_opacity, 1.0)
-
-# eq_(s.shield_displacement, (0.0,0.0))
-# # TODO - the pattern in bindings seems to be to get/set
-# # strings for PathExpressions... should we pass objects?
-# eq_(s.filename, '../data/images/dummy.png')
-
-# # 11c34b1: default transform list is empty, not identity matrix
-# eq_(s.transform, '')
-
-# eq_(s.fontset, None)
-
-# # ShieldSymbolizer missing image file
-# # images paths are now PathExpressions are evaluated at runtime
-# # so it does not make sense to throw...
-# #@raises(RuntimeError)
-# #def test_shieldsymbolizer_missing_image():
-# # s = mapnik.ShieldSymbolizer(mapnik.Expression('[Field Name]'), 'DejaVu Sans Bold', 6, mapnik.Color('#000000'), mapnik.PathExpression('../#data/images/broken.png'))
-
-# def test_shield_symbolizer_modify():
-# s = mapnik.ShieldSymbolizer(mapnik.Expression('[Field Name]'), 'DejaVu Sans Bold', 6, mapnik.Color('#000000'), mapnik.PathExpression('../data/images/dummy.png'))
-# # transform expression
-# def check_transform(expr, expect_str=None):
-# s.transform = expr
-# eq_(s.transform, expr if expect_str is None else expect_str)
-# check_transform("matrix(1 2 3 4 5 6)", "matrix(1, 2, 3, 4, 5, 6)")
-# check_transform("matrix(1, 2, 3, 4, 5, 6 +7)", "matrix(1, 2, 3, 4, 5, (6+7))")
-# check_transform("rotate([a])")
-# check_transform("rotate([a] -2)", "rotate(([a]-2))")
-# check_transform("rotate([a] -2 -3)", "rotate([a], -2, -3)")
-# check_transform("rotate([a] -2 -3 -4)", "rotate(((([a]-2)-3)-4))")
-# check_transform("rotate([a] -2, 3, 4)", "rotate(([a]-2), 3, 4)")
-# check_transform("translate([tx]) rotate([a])")
-# check_transform("scale([sx], [sy]/2)")
-# # TODO check expected failures
-
-# def test_point_symbolizer():
-# p = mapnik.PointSymbolizer()
-# eq_(p.filename,'')
-# eq_(p.transform,'')
-# eq_(p.opacity,1.0)
-# eq_(p.allow_overlap,False)
-# eq_(p.ignore_placement,False)
-# eq_(p.comp_op,mapnik.CompositeOp.src_over)
-# eq_(p.placement, mapnik.point_placement.CENTROID)
-
-# p = mapnik.PointSymbolizer(mapnik.PathExpression("../data/images/dummy.png"))
-# p.allow_overlap = True
-# p.opacity = 0.5
-# p.ignore_placement = True
-# p.placement = mapnik.point_placement.INTERIOR
-# eq_(p.allow_overlap, True)
-# eq_(p.opacity, 0.5)
-# eq_(p.filename,'../data/images/dummy.png')
-# eq_(p.ignore_placement,True)
-# eq_(p.placement, mapnik.point_placement.INTERIOR)
-
-# def test_markers_symbolizer():
-# p = mapnik.MarkersSymbolizer()
-# eq_(p.allow_overlap, False)
-# eq_(p.opacity,1.0)
-# eq_(p.fill_opacity,None)
-# eq_(p.filename,'shape://ellipse')
-# eq_(p.placement,mapnik.marker_placement.POINT_PLACEMENT)
-# eq_(p.multi_policy,mapnik.marker_multi_policy.EACH)
-# eq_(p.fill,None)
-# eq_(p.ignore_placement,False)
-# eq_(p.spacing,100)
-# eq_(p.max_error,0.2)
-# eq_(p.width,None)
-# eq_(p.height,None)
-# eq_(p.transform,'')
-# eq_(p.clip,True)
-# eq_(p.comp_op,mapnik.CompositeOp.src_over)
-
-
-# p.width = mapnik.Expression('12')
-# p.height = mapnik.Expression('12')
-# eq_(str(p.width),'12')
-# eq_(str(p.height),'12')
-
-# p.width = mapnik.Expression('[field] + 2')
-# p.height = mapnik.Expression('[field] + 2')
-# eq_(str(p.width),'([field]+2)')
-# eq_(str(p.height),'([field]+2)')
-
-# stroke = mapnik.Stroke()
-# stroke.color = mapnik.Color('black')
-# stroke.width = 1.0
-
-# p.stroke = stroke
-# p.fill = mapnik.Color('white')
-# p.allow_overlap = True
-# p.opacity = 0.5
-# p.fill_opacity = 0.5
-# p.placement = mapnik.marker_placement.LINE_PLACEMENT
-# p.multi_policy = mapnik.marker_multi_policy.WHOLE
-
-# eq_(p.allow_overlap, True)
-# eq_(p.opacity, 0.5)
-# eq_(p.fill_opacity, 0.5)
-# eq_(p.multi_policy,mapnik.marker_multi_policy.WHOLE)
-# eq_(p.placement,mapnik.marker_placement.LINE_PLACEMENT)
-
-# #https://github.com/mapnik/mapnik/issues/1285
-# #https://github.com/mapnik/mapnik/issues/1427
-# p.marker_type = 'arrow'
-# eq_(p.marker_type,'shape://arrow')
-# eq_(p.filename,'shape://arrow')
-
-
-# # PointSymbolizer missing image file
-# # images paths are now PathExpressions are evaluated at runtime
-# # so it does not make sense to throw...
-# #@raises(RuntimeError)
-# #def test_pointsymbolizer_missing_image():
-# # p = mapnik.PointSymbolizer(mapnik.PathExpression("../data/images/broken.png"))
-
-# def test_polygon_symbolizer():
-# p = mapnik.PolygonSymbolizer()
-# eq_(p.smooth,0.0)
-# eq_(p.comp_op,mapnik.CompositeOp.src_over)
-# eq_(p.clip,True)
-# eq_(p.fill, mapnik.Color('gray'))
-# eq_(p.fill_opacity, 1)
-
-# p = mapnik.PolygonSymbolizer(mapnik.Color('blue'))
-
-# eq_(p.fill, mapnik.Color('blue'))
-# eq_(p.fill_opacity, 1)
-
-# def test_building_symbolizer_init():
-# p = mapnik.BuildingSymbolizer()
-
-# eq_(p.fill, mapnik.Color('gray'))
-# eq_(p.fill_opacity, 1)
-# eq_(p.height,None)
-
-# def test_group_symbolizer_init():
-# s = mapnik.GroupSymbolizer()
-
-# p = mapnik.GroupSymbolizerProperties()
-
-# l = mapnik.PairLayout()
-# l.item_margin = 5.0
-# p.set_layout(l)
-
-# r = mapnik.GroupRule(mapnik.Expression("[name%1]"))
-# r.append(mapnik.PointSymbolizer())
-# p.add_rule(r)
-# s.symbolizer_properties = p
-
-# eq_(s.comp_op,mapnik.CompositeOp.src_over)
-
-# def test_stroke_init():
-# s = mapnik.Stroke()
-
-# eq_(s.width, 1)
-# eq_(s.opacity, 1)
-# eq_(s.color, mapnik.Color('black'))
-# eq_(s.line_cap, mapnik.line_cap.BUTT_CAP)
-# eq_(s.line_join, mapnik.line_join.MITER_JOIN)
-# eq_(s.gamma,1.0)
-
-# s = mapnik.Stroke(mapnik.Color('blue'), 5.0)
-# s.gamma = .5
-
-# eq_(s.width, 5)
-# eq_(s.opacity, 1)
-# eq_(s.color, mapnik.Color('blue'))
-# eq_(s.gamma, .5)
-# eq_(s.line_cap, mapnik.line_cap.BUTT_CAP)
-# eq_(s.line_join, mapnik.line_join.MITER_JOIN)
-
-# def test_stroke_dash_arrays():
-# s = mapnik.Stroke()
-# s.add_dash(1,2)
-# s.add_dash(3,4)
-# s.add_dash(5,6)
-
-# eq_(s.get_dashes(), [(1,2),(3,4),(5,6)])
-
-# def test_map_init():
-# m = mapnik.Map(256, 256)
-
-# eq_(m.width, 256)
-# eq_(m.height, 256)
-# eq_(m.srs, '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
-# eq_(m.base, '')
-# eq_(m.maximum_extent, None)
-# eq_(m.background_image, None)
-# eq_(m.background_image_comp_op, mapnik.CompositeOp.src_over)
-# eq_(m.background_image_opacity, 1.0)
-
-# m = mapnik.Map(256, 256, '+proj=latlong')
-# eq_(m.srs, '+proj=latlong')
-
-# def test_map_style_access():
-# m = mapnik.Map(256, 256)
-# sty = mapnik.Style()
-# m.append_style("style",sty)
-# styles = list(m.styles)
-# eq_(len(styles),1)
-# eq_(styles[0][0],'style')
-# # returns a copy so let's just check it is the right instance
-# eq_(isinstance(styles[0][1],mapnik.Style),True)
-
-# def test_map_maximum_extent_modification():
-# m = mapnik.Map(256, 256)
-# eq_(m.maximum_extent, None)
-# m.maximum_extent = mapnik.Box2d()
-# eq_(m.maximum_extent, mapnik.Box2d())
-# m.maximum_extent = None
-# eq_(m.maximum_extent, None)
-
-# # Map initialization from string
-# def test_map_init_from_string():
-# map_string = '''<Map background-color="steelblue" base="./" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-# <Style name="My Style">
-# <Rule>
-# <PolygonSymbolizer fill="#f2eff9"/>
-# <LineSymbolizer stroke="rgb(50%,50%,50%)" stroke-width="0.1"/>
-# </Rule>
-# </Style>
-# <Layer name="boundaries">
-# <StyleName>My Style</StyleName>
-# <Datasource>
-# <Parameter name="type">shape</Parameter>
-# <Parameter name="file">../../demo/data/boundaries</Parameter>
-# </Datasource>
-# </Layer>
-# </Map>'''
-
-# m = mapnik.Map(600, 300)
-# eq_(m.base, '')
-# try:
-# mapnik.load_map_from_string(m, map_string)
-# eq_(m.base, './')
-# mapnik.load_map_from_string(m, map_string, False, "") # this "" will have no effect
-# eq_(m.base, './')
-
-# tmp_dir = tempfile.gettempdir()
-# try:
-# mapnik.load_map_from_string(m, map_string, False, tmp_dir)
-# except RuntimeError:
-# pass # runtime error expected because shapefile path should be wrong and datasource will throw
-# eq_(m.base, tmp_dir) # tmp_dir will be set despite the exception because load_map mostly worked
-# m.base = 'foo'
-# mapnik.load_map_from_string(m, map_string, True, ".")
-# eq_(m.base, '.')
-# except RuntimeError, e:
-# # only test datasources that we have installed
-# if not 'Could not create datasource' in str(e):
-# raise RuntimeError(e)
-
-# # Color initialization
-# @raises(Exception) # Boost.Python.ArgumentError
-# def test_color_init_errors():
-# c = mapnik.Color()
-
-# @raises(RuntimeError)
-# def test_color_init_errors():
-# c = mapnik.Color('foo') # mapnik config
-
-# def test_color_init():
-# c = mapnik.Color('blue')
-
-# eq_(c.a, 255)
-# eq_(c.r, 0)
-# eq_(c.g, 0)
-# eq_(c.b, 255)
-
-# eq_(c.to_hex_string(), '#0000ff')
-
-# c = mapnik.Color('#f2eff9')
-
-# eq_(c.a, 255)
-# eq_(c.r, 242)
-# eq_(c.g, 239)
-# eq_(c.b, 249)
-
-# eq_(c.to_hex_string(), '#f2eff9')
-
-# c = mapnik.Color('rgb(50%,50%,50%)')
-
-# eq_(c.a, 255)
-# eq_(c.r, 128)
-# eq_(c.g, 128)
-# eq_(c.b, 128)
-
-# eq_(c.to_hex_string(), '#808080')
-
-# c = mapnik.Color(0, 64, 128)
-
-# eq_(c.a, 255)
-# eq_(c.r, 0)
-# eq_(c.g, 64)
-# eq_(c.b, 128)
-
-# eq_(c.to_hex_string(), '#004080')
-
-# c = mapnik.Color(0, 64, 128, 192)
-
-# eq_(c.a, 192)
-# eq_(c.r, 0)
-# eq_(c.g, 64)
-# eq_(c.b, 128)
-
-# eq_(c.to_hex_string(), '#004080c0')
-
-# def test_color_equality():
-
-# c1 = mapnik.Color('blue')
-# c2 = mapnik.Color(0,0,255)
-# c3 = mapnik.Color('black')
-
-# c3.r = 0
-# c3.g = 0
-# c3.b = 255
-# c3.a = 255
-
-# eq_(c1, c2)
-# eq_(c1, c3)
-
-# c1 = mapnik.Color(0, 64, 128)
-# c2 = mapnik.Color(0, 64, 128)
-# c3 = mapnik.Color(0, 0, 0)
-
-# c3.r = 0
-# c3.g = 64
-# c3.b = 128
-
-# eq_(c1, c2)
-# eq_(c1, c3)
-
-# c1 = mapnik.Color(0, 64, 128, 192)
-# c2 = mapnik.Color(0, 64, 128, 192)
-# c3 = mapnik.Color(0, 0, 0, 255)
-
-# c3.r = 0
-# c3.g = 64
-# c3.b = 128
-# c3.a = 192
-
-# eq_(c1, c2)
-# eq_(c1, c3)
-
-# c1 = mapnik.Color('rgb(50%,50%,50%)')
-# c2 = mapnik.Color(128, 128, 128, 255)
-# c3 = mapnik.Color('#808080')
-# c4 = mapnik.Color('gray')
-
-# eq_(c1, c2)
-# eq_(c1, c3)
-# eq_(c1, c4)
-
-# c1 = mapnik.Color('hsl(0, 100%, 50%)') # red
-# c2 = mapnik.Color('hsl(120, 100%, 50%)') # lime
-# c3 = mapnik.Color('hsla(240, 100%, 50%, 0.5)') # semi-transparent solid blue
-
-# eq_(c1, mapnik.Color('red'))
-# eq_(c2, mapnik.Color('lime'))
-# eq_(c3, mapnik.Color(0,0,255,128))
-
-# def test_rule_init():
-# min_scale = 5
-# max_scale = 10
-
-# r = mapnik.Rule()
-
-# eq_(r.name, '')
-# eq_(r.min_scale, 0)
-# eq_(r.max_scale, float('inf'))
-# eq_(r.has_else(), False)
-# eq_(r.has_also(), False)
-
-# r = mapnik.Rule()
-
-# r.set_else(True)
-# eq_(r.has_else(), True)
-# eq_(r.has_also(), False)
-
-# r = mapnik.Rule()
-
-# r.set_also(True)
-# eq_(r.has_else(), False)
-# eq_(r.has_also(), True)
-
-# r = mapnik.Rule("Name")
-
-# eq_(r.name, 'Name')
-# eq_(r.min_scale, 0)
-# eq_(r.max_scale, float('inf'))
-# eq_(r.has_else(), False)
-# eq_(r.has_also(), False)
-
-# r = mapnik.Rule("Name")
-
-# eq_(r.name, 'Name')
-# eq_(r.min_scale, 0)
-# eq_(r.max_scale, float('inf'))
-# eq_(r.has_else(), False)
-# eq_(r.has_also(), False)
-
-# r = mapnik.Rule("Name", min_scale)
-
-# eq_(r.name, 'Name')
-# eq_(r.min_scale, min_scale)
-# eq_(r.max_scale, float('inf'))
-# eq_(r.has_else(), False)
-# eq_(r.has_also(), False)
-
-# r = mapnik.Rule("Name", min_scale, max_scale)
-
-# eq_(r.name, 'Name')
-# eq_(r.min_scale, min_scale)
-# eq_(r.max_scale, max_scale)
-# eq_(r.has_else(), False)
-# eq_(r.has_also(), False)
-
-# if __name__ == "__main__":
-# setup()
-# run_all(eval(x) for x in dir() if x.startswith("test_"))
diff --git a/tests/python_tests/ogr_and_shape_geometries_test.py b/tests/python_tests/ogr_and_shape_geometries_test.py
deleted file mode 100644
index be36426..0000000
--- a/tests/python_tests/ogr_and_shape_geometries_test.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-
-from utilities import execution_path, run_all
-
-import os, sys, glob, mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-# TODO - fix truncation in shapefile...
-polys = ["POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10))",
- "POLYGON ((35 10, 10 20, 15 40, 45 45, 35 10),(20 30, 35 35, 30 20, 20 30))",
- "MULTIPOLYGON (((30 20, 10 40, 45 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))"
- "MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)),((20 35, 45 20, 30 5, 10 10, 10 30, 20 35),(30 20, 20 25, 20 15, 30 20)))"
- ]
-
-plugins = mapnik.DatasourceCache.plugin_names()
-if 'shape' in plugins and 'ogr' in plugins:
-
- def ensure_geometries_are_interpreted_equivalently(filename):
- ds1 = mapnik.Ogr(file=filename,layer_by_index=0)
- ds2 = mapnik.Shapefile(file=filename)
- fs1 = ds1.featureset()
- fs2 = ds2.featureset()
- count = 0;
- import itertools
- for feat1,feat2 in itertools.izip(fs1, fs2):
- count += 1
- eq_(feat1.attributes,feat2.attributes)
- # TODO - revisit this: https://github.com/mapnik/mapnik/issues/1093
- # eq_(feat1.to_geojson(),feat2.to_geojson())
- #eq_(feat1.geometries().to_wkt(),feat2.geometries().to_wkt())
- #eq_(feat1.geometries().to_wkb(mapnik.wkbByteOrder.NDR),feat2.geometries().to_wkb(mapnik.wkbByteOrder.NDR))
- #eq_(feat1.geometries().to_wkb(mapnik.wkbByteOrder.XDR),feat2.geometries().to_wkb(mapnik.wkbByteOrder.XDR))
-
- def test_simple_polys():
- ensure_geometries_are_interpreted_equivalently('../data/shp/wkt_poly.shp')
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/ogr_test.py b/tests/python_tests/ogr_test.py
deleted file mode 100644
index cccc658..0000000
--- a/tests/python_tests/ogr_test.py
+++ /dev/null
@@ -1,101 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import os, mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-if 'ogr' in mapnik.DatasourceCache.plugin_names():
-
- # Shapefile initialization
- def test_shapefile_init():
- s = mapnik.Ogr(file='../../demo/data/boundaries.shp',layer_by_index=0)
-
- e = s.envelope()
-
- assert_almost_equal(e.minx, -11121.6896651, places=7)
- assert_almost_equal(e.miny, -724724.216526, places=6)
- assert_almost_equal(e.maxx, 2463000.67866, places=5)
- assert_almost_equal(e.maxy, 1649661.267, places=3)
-
- # Shapefile properties
- def test_shapefile_properties():
- ds = mapnik.Ogr(file='../../demo/data/boundaries.shp',layer_by_index=0)
- f = ds.features_at_point(ds.envelope().center(), 0.001).features[0]
- eq_(ds.geometry_type(),mapnik.DataGeometryType.Polygon)
-
- eq_(f['CGNS_FID'], u'6f733341ba2011d892e2080020a0f4c9')
- eq_(f['COUNTRY'], u'CAN')
- eq_(f['F_CODE'], u'FA001')
- eq_(f['NAME_EN'], u'Quebec')
- eq_(f['Shape_Area'], 1512185733150.0)
- eq_(f['Shape_Leng'], 19218883.724300001)
- # NOTE: encoding is latin1 but gdal >= 1.9 should now expose utf8 encoded features
- # See SHAPE_ENCODING for overriding: http://gdal.org/ogr/drv_shapefile.html
- # Failure for the NOM_FR field is expected for older gdal
- #eq_(f['NOM_FR'], u'Qu\xe9bec')
- #eq_(f['NOM_FR'], u'Québec')
-
- @raises(RuntimeError)
- def test_that_nonexistant_query_field_throws(**kwargs):
- ds = mapnik.Ogr(file='../data/shp/world_merc.shp',layer_by_index=0)
- eq_(len(ds.fields()),11)
- eq_(ds.fields(),['FIPS', 'ISO2', 'ISO3', 'UN', 'NAME', 'AREA', 'POP2005', 'REGION', 'SUBREGION', 'LON', 'LAT'])
- eq_(ds.field_types(),['str', 'str', 'str', 'int', 'str', 'int', 'int', 'int', 'int', 'float', 'float'])
- query = mapnik.Query(ds.envelope())
- for fld in ds.fields():
- query.add_property_name(fld)
- # also add an invalid one, triggering throw
- query.add_property_name('bogus')
- fs = ds.features(query)
-
- # disabled because OGR prints an annoying error: ERROR 1: Invalid Point object. Missing 'coordinates' member.
- #def test_handling_of_null_features():
- # ds = mapnik.Ogr(file='../data/json/null_feature.geojson',layer_by_index=0)
- # fs = ds.all_features()
- # eq_(len(fs),1)
-
- # OGR plugin extent parameter
- def test_ogr_extent_parameter():
- ds = mapnik.Ogr(file='../data/shp/world_merc.shp',layer_by_index=0,extent='-1,-1,1,1')
- e = ds.envelope()
- eq_(e.minx,-1)
- eq_(e.miny,-1)
- eq_(e.maxx,1)
- eq_(e.maxy,1)
-
- def test_ogr_reading_gpx_waypoint():
- ds = mapnik.Ogr(file='../data/gpx/empty.gpx',layer='waypoints')
- e = ds.envelope()
- eq_(e.minx,-122)
- eq_(e.miny,48)
- eq_(e.maxx,-122)
- eq_(e.maxy,48)
-
- def test_ogr_empty_data_should_not_throw():
- default_logging_severity = mapnik.logger.get_severity()
- mapnik.logger.set_severity(mapnik.severity_type.None)
- # use logger to silence expected warnings
- for layer in ['routes', 'tracks', 'route_points', 'track_points']:
- ds = mapnik.Ogr(file='../data/gpx/empty.gpx',layer=layer)
- e = ds.envelope()
- eq_(e.minx,0)
- eq_(e.miny,0)
- eq_(e.maxx,0)
- eq_(e.maxy,0)
- mapnik.logger.set_severity(default_logging_severity)
-
- # disabled because OGR prints an annoying error: ERROR 1: Invalid Point object. Missing 'coordinates' member.
- #def test_handling_of_null_features():
- # ds = mapnik.Ogr(file='../data/json/null_feature.geojson',layer_by_index=0)
- # fs = ds.all_features()
- # eq_(len(fs),1)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/osm_test.py b/tests/python_tests/osm_test.py
deleted file mode 100644
index c962cc3..0000000
--- a/tests/python_tests/osm_test.py
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import os, mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-if 'osm' in mapnik.DatasourceCache.plugin_names():
-
- # osm initialization
- def test_osm_init():
- ds = mapnik.Osm(file='../data/osm/nodes.osm')
-
- e = ds.envelope()
-
- # these are hardcoded in the plugin… ugh
- eq_(e.minx >= -180.0,True)
- eq_(e.miny >= -90.0,True)
- eq_(e.maxx <= 180.0,True)
- eq_(e.maxy <= 90,True)
-
- def test_that_nonexistant_query_field_throws(**kwargs):
- ds = mapnik.Osm(file='../data/osm/nodes.osm')
- eq_(len(ds.fields()),0)
- query = mapnik.Query(ds.envelope())
- for fld in ds.fields():
- query.add_property_name(fld)
- # also add an invalid one, triggering throw
- query.add_property_name('bogus')
- fs = ds.features(query)
-
- def test_that_64bit_int_fields_work():
- ds = mapnik.Osm(file='../data/osm/64bit.osm')
- eq_(len(ds.fields()),4)
- eq_(ds.fields(),['bigint', 'highway', 'junction', 'note'])
- eq_(ds.field_types(),['str', 'str', 'str', 'str'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat.id(),4294968186)
- eq_(feat['bigint'], None)
- feat = fs.next()
- eq_(feat['bigint'],'9223372036854775807')
-
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/palette_test.py b/tests/python_tests/palette_test.py
deleted file mode 100644
index 9c8576f..0000000
--- a/tests/python_tests/palette_test.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import os, mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-expected_64 = '[Palette 64 colors #494746 #c37631 #89827c #d1955c #7397b9 #fc9237 #a09f9c #fbc147 #9bb3ce #b7c9a1 #b5d29c #c4b9aa #cdc4a5 #d5c8a3 #c1d7aa #ccc4b6 #dbd19c #b2c4d5 #eae487 #c9c8c6 #e4db99 #c9dcb5 #dfd3ac #cbd2c2 #d6cdbc #dbd2b6 #c0ceda #ece597 #f7ef86 #d7d3c3 #dfcbc3 #d1d0cd #d1e2bf #d3dec1 #dbd3c4 #e6d8b6 #f4ef91 #d3d3cf #cad5de #ded7c9 #dfdbce #fcf993 #ffff8a #dbd9d7 #dbe7cd #d4dce2 #e4ded3 #ebe3c9 #e0e2e2 #f4edc3 #fdfcae #e9e5dc #f4edda #eeebe4 #fefdc5 #e7edf2 #edf4e5 #f [...]
-
-expected_256 = '[Palette 256 colors #272727 #3c3c3c #484847 #564b41 #605243 #6a523e #555555 #785941 #5d5d5d #746856 #676767 #956740 #ba712e #787777 #cb752a #c27c3d #b68049 #dc8030 #df9e10 #878685 #e1a214 #928b82 #a88a70 #ea8834 #e7a81d #cb8d55 #909090 #94938c #e18f48 #f68d36 #6f94b7 #e1ab2e #8e959b #c79666 #999897 #ff9238 #ef9447 #a99a88 #f1b32c #919ca6 #a1a09f #f0b04b #8aa4bf #f8bc39 #b3ac8f #d1a67a #e3b857 #a8a8a7 #ffc345 #a2adb9 #afaeab #f9ab69 #afbba4 #c4c48a #b4b2af #dec177 #9ab2cf [...]
-
-expected_rgb = '[Palette 2 colors #ff00ff #ffffff]'
-
-def test_reading_palettes():
- act = open('../data/palettes/palette64.act','rb')
- palette = mapnik.Palette(act.read(),'act')
- eq_(palette.to_string(),expected_64);
- act = open('../data/palettes/palette256.act','rb')
- palette = mapnik.Palette(act.read(),'act')
- eq_(palette.to_string(),expected_256);
- palette = mapnik.Palette('\xff\x00\xff\xff\xff\xff', 'rgb')
- eq_(palette.to_string(),expected_rgb);
-
-if 'shape' in mapnik.DatasourceCache.plugin_names():
-
- def test_render_with_palette():
- m = mapnik.Map(600,400)
- mapnik.load_map(m,'../data/good_maps/agg_poly_gamma_map.xml')
- m.zoom_all()
- im = mapnik.Image(m.width,m.height)
- mapnik.render(m,im)
- act = open('../data/palettes/palette256.act','rb')
- palette = mapnik.Palette(act.read(),'act')
- # test saving directly to filesystem
- im.save('/tmp/mapnik-palette-test.png','png',palette)
- # test saving to a string
- open('/tmp/mapnik-palette-test2.png','wb').write(im.tostring('png',palette));
- # compare the two methods
- eq_(mapnik.Image.open('/tmp/mapnik-palette-test.png').tostring(),mapnik.Image.open('/tmp/mapnik-palette-test2.png').tostring(),'%s not eq to %s' % ('/tmp/mapnik-palette-test.png','/tmp/mapnik-palette-test2.png'))
- # compare to expected
- eq_(mapnik.Image.open('/tmp/mapnik-palette-test.png').tostring(),mapnik.Image.open('./images/support/mapnik-palette-test.png').tostring(),'%s not eq to %s' % ('/tmp/mapnik-palette-test.png','./images/support/mapnik-palette-test.png'))
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/parameters_test.py b/tests/python_tests/parameters_test.py
deleted file mode 100644
index 150fdb8..0000000
--- a/tests/python_tests/parameters_test.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import os
-import sys
-from nose.tools import *
-from utilities import execution_path, run_all
-import mapnik
-
-def setup():
- os.chdir(execution_path('.'))
-
-def test_parameter_null():
- p = mapnik.Parameter('key',None)
- eq_(p[0],'key')
- eq_(p[1],None)
-
-def test_parameter_string():
- p = mapnik.Parameter('key','value')
- eq_(p[0],'key')
- eq_(p[1],'value')
-
-def test_parameter_unicode():
- p = mapnik.Parameter('key',u'value')
- eq_(p[0],'key')
- eq_(p[1],u'value')
-
-def test_parameter_integer():
- p = mapnik.Parameter('int',sys.maxint)
- eq_(p[0],'int')
- eq_(p[1],sys.maxint)
-
-def test_parameter_double():
- p = mapnik.Parameter('double',float(sys.maxint))
- eq_(p[0],'double')
- eq_(p[1],float(sys.maxint))
-
-def test_parameter_boolean():
- p = mapnik.Parameter('boolean',True)
- eq_(p[0],'boolean')
- eq_(p[1],True)
- eq_(bool(p[1]),True)
-
-
-def test_parameters():
- params = mapnik.Parameters()
- p = mapnik.Parameter('float',1.0777)
- eq_(p[0],'float')
- eq_(p[1],1.0777)
-
- params.append(p)
-
- eq_(params[0][0],'float')
- eq_(params[0][1],1.0777)
-
- eq_(params.get('float'),1.0777)
-
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/pgraster_test.py b/tests/python_tests/pgraster_test.py
deleted file mode 100644
index 0d81a2a..0000000
--- a/tests/python_tests/pgraster_test.py
+++ /dev/null
@@ -1,756 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-import atexit
-import cProfile, pstats, io
-import time
-from utilities import execution_path, run_all
-from subprocess import Popen, PIPE
-import os, mapnik
-from Queue import Queue
-import threading
-import sys
-import re
-from binascii import hexlify, unhexlify
-
-
-MAPNIK_TEST_DBNAME = 'mapnik-tmp-pgraster-test-db'
-POSTGIS_TEMPLATE_DBNAME = 'template_postgis'
-DEBUG_OUTPUT=False
-
-def log(msg):
- if DEBUG_OUTPUT:
- print msg
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def call(cmd,silent=False):
- stdin, stderr = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE).communicate()
- if not stderr:
- return stdin.strip()
- elif not silent and 'error' in stderr.lower() \
- or 'not found' in stderr.lower() \
- or 'could not connect' in stderr.lower() \
- or 'bad connection' in stderr.lower() \
- or 'not recognized as an internal' in stderr.lower():
- raise RuntimeError(stderr.strip())
-
-def psql_can_connect():
- """Test ability to connect to a postgis template db with no options.
-
- Basically, to run these tests your user must have full read
- access over unix sockets without supplying a password. This
- keeps these tests simple and focused on postgis not on postgres
- auth issues.
- """
- try:
- call('psql %s -c "select postgis_version()"' % POSTGIS_TEMPLATE_DBNAME)
- return True
- except RuntimeError, e:
- print 'Notice: skipping pgraster tests (connection)'
- return False
-
-def psql_run(cmd):
- cmd = 'psql --set ON_ERROR_STOP=1 %s -c "%s"' % \
- (MAPNIK_TEST_DBNAME, cmd.replace('"', '\\"'))
- log('DEBUG: running ' + cmd)
- call(cmd)
-
-def raster2pgsql_on_path():
- """Test for presence of raster2pgsql on the user path.
-
- We require this program to load test data into a temporarily database.
- """
- try:
- call('raster2pgsql')
- return True
- except RuntimeError, e:
- print 'Notice: skipping pgraster tests (raster2pgsql)'
- return False
-
-def createdb_and_dropdb_on_path():
- """Test for presence of dropdb/createdb on user path.
-
- We require these programs to setup and teardown the testing db.
- """
- try:
- call('createdb --help')
- call('dropdb --help')
- return True
- except RuntimeError, e:
- print 'Notice: skipping pgraster tests (createdb/dropdb)'
- return False
-
-def postgis_setup():
- call('dropdb %s' % MAPNIK_TEST_DBNAME,silent=True)
- call('createdb -T %s %s' % (POSTGIS_TEMPLATE_DBNAME,MAPNIK_TEST_DBNAME),silent=False)
-
-def postgis_takedown():
- pass
- # fails as the db is in use: https://github.com/mapnik/mapnik/issues/960
- #call('dropdb %s' % MAPNIK_TEST_DBNAME)
-
-def import_raster(filename, tabname, tilesize, constraint, overview):
- log('tile: ' + tilesize + ' constraints: ' + str(constraint) \
- + ' overviews: ' + overview)
- cmd = 'raster2pgsql -Y -I -q'
- if constraint:
- cmd += ' -C'
- if tilesize:
- cmd += ' -t ' + tilesize
- if overview:
- cmd += ' -l ' + overview
- cmd += ' %s %s | psql --set ON_ERROR_STOP=1 -q %s' % (os.path.abspath(os.path.normpath(filename)),tabname,MAPNIK_TEST_DBNAME)
- log('Import call: ' + cmd)
- call(cmd)
-
-def drop_imported(tabname, overview):
- psql_run('DROP TABLE IF EXISTS "' + tabname + '";')
- if overview:
- for of in overview.split(','):
- psql_run('DROP TABLE IF EXISTS "o_' + of + '_' + tabname + '";')
-
-if 'pgraster' in mapnik.DatasourceCache.plugin_names() \
- and createdb_and_dropdb_on_path() \
- and psql_can_connect() \
- and raster2pgsql_on_path():
-
- # initialize test database
- postgis_setup()
-
- # [old]dataraster.tif, 2283x1913 int16 single-band
- # dataraster-small.tif, 457x383 int16 single-band
- def _test_dataraster_16bsi_rendering(lbl, overview, rescale, clip):
- if rescale:
- lbl += ' Sc'
- if clip:
- lbl += ' Cl'
- ds = mapnik.PgRaster(dbname=MAPNIK_TEST_DBNAME,table='"dataRaster"',
- band=1,use_overviews=1 if overview else 0,
- prescale_rasters=rescale,clip_rasters=clip)
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['rid'],1)
- lyr = mapnik.Layer('dataraster_16bsi')
- lyr.datasource = ds
- expenv = mapnik.Box2d(-14637, 3903178, 1126863, 4859678)
- env = lyr.envelope()
- # As the input size is a prime number both horizontally
- # and vertically, we expect the extent of the overview
- # tables to be a pixel wider than the original, whereas
- # the pixel size in geographical units depends on the
- # overview factor. So we start with the original pixel size
- # as base scale and multiply by the overview factor.
- # NOTE: the overview table extent only grows north and east
- pixsize = 500 # see gdalinfo dataraster.tif
- pixsize = 2497 # see gdalinfo dataraster-small.tif
- tol = pixsize * max(overview.split(',')) if overview else 0
- assert_almost_equal(env.minx, expenv.minx)
- assert_almost_equal(env.miny, expenv.miny, delta=tol)
- assert_almost_equal(env.maxx, expenv.maxx, delta=tol)
- assert_almost_equal(env.maxy, expenv.maxy)
- mm = mapnik.Map(256, 256)
- style = mapnik.Style()
- col = mapnik.RasterColorizer();
- col.default_mode = mapnik.COLORIZER_DISCRETE;
- col.add_stop(0, mapnik.Color(0x40,0x40,0x40,255));
- col.add_stop(10, mapnik.Color(0x80,0x80,0x80,255));
- col.add_stop(20, mapnik.Color(0xa0,0xa0,0xa0,255));
- sym = mapnik.RasterSymbolizer()
- sym.colorizer = col
- rule = mapnik.Rule()
- rule.symbols.append(sym)
- style.rules.append(rule)
- mm.append_style('foo', style)
- lyr.styles.append('foo')
- mm.layers.append(lyr)
- mm.zoom_to_box(expenv)
- im = mapnik.Image(mm.width, mm.height)
- t0 = time.time() # we want wall time to include IO waits
- mapnik.render(mm, im)
- lap = time.time() - t0
- log('T ' + str(lap) + ' -- ' + lbl + ' E:full')
- # no data
- eq_(im.view(1,1,1,1).tostring(), '\x00\x00\x00\x00')
- eq_(im.view(255,255,1,1).tostring(), '\x00\x00\x00\x00')
- eq_(im.view(195,116,1,1).tostring(), '\x00\x00\x00\x00')
- # A0A0A0
- eq_(im.view(100,120,1,1).tostring(), '\xa0\xa0\xa0\xff')
- eq_(im.view( 75, 80,1,1).tostring(), '\xa0\xa0\xa0\xff')
- # 808080
- eq_(im.view( 74,170,1,1).tostring(), '\x80\x80\x80\xff')
- eq_(im.view( 30, 50,1,1).tostring(), '\x80\x80\x80\xff')
- # 404040
- eq_(im.view(190, 70,1,1).tostring(), '\x40\x40\x40\xff')
- eq_(im.view(140,170,1,1).tostring(), '\x40\x40\x40\xff')
-
- # Now zoom over a portion of the env (1/10)
- newenv = mapnik.Box2d(273663,4024478,330738,4072303)
- mm.zoom_to_box(newenv)
- t0 = time.time() # we want wall time to include IO waits
- mapnik.render(mm, im)
- lap = time.time() - t0
- log('T ' + str(lap) + ' -- ' + lbl + ' E:1/10')
- # nodata
- eq_(hexlify(im.view(255,255,1,1).tostring()), '00000000')
- eq_(hexlify(im.view(200,254,1,1).tostring()), '00000000')
- # A0A0A0
- eq_(hexlify(im.view(90,232,1,1).tostring()), 'a0a0a0ff')
- eq_(hexlify(im.view(96,245,1,1).tostring()), 'a0a0a0ff')
- # 808080
- eq_(hexlify(im.view(1,1,1,1).tostring()), '808080ff')
- eq_(hexlify(im.view(128,128,1,1).tostring()), '808080ff')
- # 404040
- eq_(hexlify(im.view(255, 0,1,1).tostring()), '404040ff')
-
- def _test_dataraster_16bsi(lbl, tilesize, constraint, overview):
- import_raster('../data/raster/dataraster-small.tif', 'dataRaster', tilesize, constraint, overview)
- if constraint:
- lbl += ' C'
- if tilesize:
- lbl += ' T:' + tilesize
- if overview:
- lbl += ' O:' + overview
- for prescale in [0,1]:
- for clip in [0,1]:
- _test_dataraster_16bsi_rendering(lbl, overview, prescale, clip)
- drop_imported('dataRaster', overview)
-
- def test_dataraster_16bsi():
- #for tilesize in ['','256x256']:
- for tilesize in ['256x256']:
- for constraint in [0,1]:
- #for overview in ['','4','2,16']:
- for overview in ['','2']:
- _test_dataraster_16bsi('data_16bsi', tilesize, constraint, overview)
-
- # river.tiff, RGBA 8BUI
- def _test_rgba_8bui_rendering(lbl, overview, rescale, clip):
- if rescale:
- lbl += ' Sc'
- if clip:
- lbl += ' Cl'
- ds = mapnik.PgRaster(dbname=MAPNIK_TEST_DBNAME,table='(select * from "River") foo',
- use_overviews=1 if overview else 0,
- prescale_rasters=rescale,clip_rasters=clip)
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['rid'],1)
- lyr = mapnik.Layer('rgba_8bui')
- lyr.datasource = ds
- expenv = mapnik.Box2d(0, -210, 256, 0)
- env = lyr.envelope()
- # As the input size is a prime number both horizontally
- # and vertically, we expect the extent of the overview
- # tables to be a pixel wider than the original, whereas
- # the pixel size in geographical units depends on the
- # overview factor. So we start with the original pixel size
- # as base scale and multiply by the overview factor.
- # NOTE: the overview table extent only grows north and east
- pixsize = 1 # see gdalinfo river.tif
- tol = pixsize * max(overview.split(',')) if overview else 0
- assert_almost_equal(env.minx, expenv.minx)
- assert_almost_equal(env.miny, expenv.miny, delta=tol)
- assert_almost_equal(env.maxx, expenv.maxx, delta=tol)
- assert_almost_equal(env.maxy, expenv.maxy)
- mm = mapnik.Map(256, 256)
- style = mapnik.Style()
- sym = mapnik.RasterSymbolizer()
- rule = mapnik.Rule()
- rule.symbols.append(sym)
- style.rules.append(rule)
- mm.append_style('foo', style)
- lyr.styles.append('foo')
- mm.layers.append(lyr)
- mm.zoom_to_box(expenv)
- im = mapnik.Image(mm.width, mm.height)
- t0 = time.time() # we want wall time to include IO waits
- mapnik.render(mm, im)
- lap = time.time() - t0
- log('T ' + str(lap) + ' -- ' + lbl + ' E:full')
- #im.save('/tmp/xfull.png') # for debugging
- # no data
- eq_(hexlify(im.view(3,3,1,1).tostring()), '00000000')
- eq_(hexlify(im.view(250,250,1,1).tostring()), '00000000')
- # full opaque river color
- eq_(hexlify(im.view(175,118,1,1).tostring()), 'b9d8f8ff')
- # half-transparent pixel
- pxstr = hexlify(im.view(122,138,1,1).tostring())
- apat = ".*(..)$"
- match = re.match(apat, pxstr)
- assert match, 'pixel ' + pxstr + ' does not match pattern ' + apat
- alpha = match.group(1)
- assert alpha != 'ff' and alpha != '00', \
- 'unexpected full transparent/opaque pixel: ' + alpha
-
- # Now zoom over a portion of the env (1/10)
- newenv = mapnik.Box2d(166,-105,191,-77)
- mm.zoom_to_box(newenv)
- t0 = time.time() # we want wall time to include IO waits
- mapnik.render(mm, im)
- lap = time.time() - t0
- log('T ' + str(lap) + ' -- ' + lbl + ' E:1/10')
- #im.save('/tmp/xtenth.png') # for debugging
- # no data
- eq_(hexlify(im.view(255,255,1,1).tostring()), '00000000')
- eq_(hexlify(im.view(200,40,1,1).tostring()), '00000000')
- # full opaque river color
- eq_(hexlify(im.view(100,168,1,1).tostring()), 'b9d8f8ff')
- # half-transparent pixel
- pxstr = hexlify(im.view(122,138,1,1).tostring())
- apat = ".*(..)$"
- match = re.match(apat, pxstr)
- assert match, 'pixel ' + pxstr + ' does not match pattern ' + apat
- alpha = match.group(1)
- assert alpha != 'ff' and alpha != '00', \
- 'unexpected full transparent/opaque pixel: ' + alpha
-
- def _test_rgba_8bui(lbl, tilesize, constraint, overview):
- import_raster('../data/raster/river.tiff', 'River', tilesize, constraint, overview)
- if constraint:
- lbl += ' C'
- if tilesize:
- lbl += ' T:' + tilesize
- if overview:
- lbl += ' O:' + overview
- for prescale in [0,1]:
- for clip in [0,1]:
- _test_rgba_8bui_rendering(lbl, overview, prescale, clip)
- drop_imported('River', overview)
-
- def test_rgba_8bui():
- for tilesize in ['','16x16']:
- for constraint in [0,1]:
- for overview in ['2']:
- _test_rgba_8bui('rgba_8bui', tilesize, constraint, overview)
-
- # nodata-edge.tif, RGB 8BUI
- def _test_rgb_8bui_rendering(lbl, tnam, overview, rescale, clip):
- if rescale:
- lbl += ' Sc'
- if clip:
- lbl += ' Cl'
- ds = mapnik.PgRaster(dbname=MAPNIK_TEST_DBNAME,table=tnam,
- use_overviews=1 if overview else 0,
- prescale_rasters=rescale,clip_rasters=clip)
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['rid'],1)
- lyr = mapnik.Layer('rgba_8bui')
- lyr.datasource = ds
- expenv = mapnik.Box2d(-12329035.7652168,4508650.39854396, \
- -12328653.0279471,4508957.34625536)
- env = lyr.envelope()
- # As the input size is a prime number both horizontally
- # and vertically, we expect the extent of the overview
- # tables to be a pixel wider than the original, whereas
- # the pixel size in geographical units depends on the
- # overview factor. So we start with the original pixel size
- # as base scale and multiply by the overview factor.
- # NOTE: the overview table extent only grows north and east
- pixsize = 2 # see gdalinfo nodata-edge.tif
- tol = pixsize * max(overview.split(',')) if overview else 0
- assert_almost_equal(env.minx, expenv.minx, places=0)
- assert_almost_equal(env.miny, expenv.miny, delta=tol)
- assert_almost_equal(env.maxx, expenv.maxx, delta=tol)
- assert_almost_equal(env.maxy, expenv.maxy, places=0)
- mm = mapnik.Map(256, 256)
- style = mapnik.Style()
- sym = mapnik.RasterSymbolizer()
- rule = mapnik.Rule()
- rule.symbols.append(sym)
- style.rules.append(rule)
- mm.append_style('foo', style)
- lyr.styles.append('foo')
- mm.layers.append(lyr)
- mm.zoom_to_box(expenv)
- im = mapnik.Image(mm.width, mm.height)
- t0 = time.time() # we want wall time to include IO waits
- mapnik.render(mm, im)
- lap = time.time() - t0
- log('T ' + str(lap) + ' -- ' + lbl + ' E:full')
- #im.save('/tmp/xfull.png') # for debugging
- # no data
- eq_(hexlify(im.view(3,16,1,1).tostring()), '00000000')
- eq_(hexlify(im.view(128,16,1,1).tostring()), '00000000')
- eq_(hexlify(im.view(250,16,1,1).tostring()), '00000000')
- eq_(hexlify(im.view(3,240,1,1).tostring()), '00000000')
- eq_(hexlify(im.view(128,240,1,1).tostring()), '00000000')
- eq_(hexlify(im.view(250,240,1,1).tostring()), '00000000')
- # dark brown
- eq_(hexlify(im.view(174,39,1,1).tostring()), 'c3a698ff')
- # dark gray
- eq_(hexlify(im.view(195,132,1,1).tostring()), '575f62ff')
- # Now zoom over a portion of the env (1/10)
- newenv = mapnik.Box2d(-12329035.7652168, 4508926.651484220, \
- -12328997.49148983,4508957.34625536)
- mm.zoom_to_box(newenv)
- t0 = time.time() # we want wall time to include IO waits
- mapnik.render(mm, im)
- lap = time.time() - t0
- log('T ' + str(lap) + ' -- ' + lbl + ' E:1/10')
- #im.save('/tmp/xtenth.png') # for debugging
- # no data
- eq_(hexlify(im.view(3,16,1,1).tostring()), '00000000')
- eq_(hexlify(im.view(128,16,1,1).tostring()), '00000000')
- eq_(hexlify(im.view(250,16,1,1).tostring()), '00000000')
- # black
- eq_(hexlify(im.view(3,42,1,1).tostring()), '000000ff')
- eq_(hexlify(im.view(3,134,1,1).tostring()), '000000ff')
- eq_(hexlify(im.view(3,244,1,1).tostring()), '000000ff')
- # gray
- eq_(hexlify(im.view(135,157,1,1).tostring()), '4e555bff')
- # brown
- eq_(hexlify(im.view(195,223,1,1).tostring()), 'f2cdbaff')
-
- def _test_rgb_8bui(lbl, tilesize, constraint, overview):
- tnam = 'nodataedge'
- import_raster('../data/raster/nodata-edge.tif', tnam, tilesize, constraint, overview)
- if constraint:
- lbl += ' C'
- if tilesize:
- lbl += ' T:' + tilesize
- if overview:
- lbl += ' O:' + overview
- for prescale in [0,1]:
- for clip in [0,1]:
- _test_rgb_8bui_rendering(lbl, tnam, overview, prescale, clip)
- #drop_imported(tnam, overview)
-
- def test_rgb_8bui():
- for tilesize in ['64x64']:
- for constraint in [1]:
- for overview in ['']:
- _test_rgb_8bui('rgb_8bui', tilesize, constraint, overview)
-
- def _test_grayscale_subquery(lbl,pixtype,value):
- #
- # 3 8 13
- # +---+---+---+
- # 3 | v | v | v | NOTE: writes different color
- # +---+---+---+ in 13,8 and 8,13
- # 8 | v | v | a |
- # +---+---+---+
- # 13 | v | b | v |
- # +---+---+---+
- #
- val_a = value/3;
- val_b = val_a*2;
- sql = "(select 3 as i, " \
- " ST_SetValues(" \
- " ST_SetValues(" \
- " ST_AsRaster(" \
- " ST_MakeEnvelope(0,0,14,14), " \
- " 1.0, -1.0, '%s', %s" \
- " ), " \
- " 11, 6, 4, 5, %s::float8" \
- " )," \
- " 6, 11, 5, 4, %s::float8" \
- " ) as \"R\"" \
- ") as foo" % (pixtype,value, val_a, val_b)
- rescale = 0
- clip = 0
- if rescale:
- lbl += ' Sc'
- if clip:
- lbl += ' Cl'
- ds = mapnik.PgRaster(dbname=MAPNIK_TEST_DBNAME, table=sql,
- raster_field='"R"', use_overviews=1,
- prescale_rasters=rescale,clip_rasters=clip)
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['i'],3)
- lyr = mapnik.Layer('grayscale_subquery')
- lyr.datasource = ds
- expenv = mapnik.Box2d(0,0,14,14)
- env = lyr.envelope()
- assert_almost_equal(env.minx, expenv.minx, places=0)
- assert_almost_equal(env.miny, expenv.miny, places=0)
- assert_almost_equal(env.maxx, expenv.maxx, places=0)
- assert_almost_equal(env.maxy, expenv.maxy, places=0)
- mm = mapnik.Map(15, 15)
- style = mapnik.Style()
- sym = mapnik.RasterSymbolizer()
- rule = mapnik.Rule()
- rule.symbols.append(sym)
- style.rules.append(rule)
- mm.append_style('foo', style)
- lyr.styles.append('foo')
- mm.layers.append(lyr)
- mm.zoom_to_box(expenv)
- im = mapnik.Image(mm.width, mm.height)
- t0 = time.time() # we want wall time to include IO waits
- mapnik.render(mm, im)
- lap = time.time() - t0
- log('T ' + str(lap) + ' -- ' + lbl + ' E:full')
- #im.save('/tmp/xfull.png') # for debugging
- h = format(value, '02x')
- hex_v = h+h+h+'ff'
- h = format(val_a, '02x')
- hex_a = h+h+h+'ff'
- h = format(val_b, '02x')
- hex_b = h+h+h+'ff'
- eq_(hexlify(im.view( 3, 3,1,1).tostring()), hex_v);
- eq_(hexlify(im.view( 8, 3,1,1).tostring()), hex_v);
- eq_(hexlify(im.view(13, 3,1,1).tostring()), hex_v);
- eq_(hexlify(im.view( 3, 8,1,1).tostring()), hex_v);
- eq_(hexlify(im.view( 8, 8,1,1).tostring()), hex_v);
- eq_(hexlify(im.view(13, 8,1,1).tostring()), hex_a);
- eq_(hexlify(im.view( 3,13,1,1).tostring()), hex_v);
- eq_(hexlify(im.view( 8,13,1,1).tostring()), hex_b);
- eq_(hexlify(im.view(13,13,1,1).tostring()), hex_v);
-
- def test_grayscale_2bui_subquery():
- _test_grayscale_subquery('grayscale_2bui_subquery', '2BUI', 3)
-
- def test_grayscale_4bui_subquery():
- _test_grayscale_subquery('grayscale_4bui_subquery', '4BUI', 15)
-
- def test_grayscale_8bui_subquery():
- _test_grayscale_subquery('grayscale_8bui_subquery', '8BUI', 63)
-
- def test_grayscale_8bsi_subquery():
- # NOTE: we're using a positive integer because Mapnik
- # does not support negative data values anyway
- _test_grayscale_subquery('grayscale_8bsi_subquery', '8BSI', 69)
-
- def test_grayscale_16bui_subquery():
- _test_grayscale_subquery('grayscale_16bui_subquery', '16BUI', 126)
-
- def test_grayscale_16bsi_subquery():
- # NOTE: we're using a positive integer because Mapnik
- # does not support negative data values anyway
- _test_grayscale_subquery('grayscale_16bsi_subquery', '16BSI', 144)
-
- def test_grayscale_32bui_subquery():
- _test_grayscale_subquery('grayscale_32bui_subquery', '32BUI', 255)
-
- def test_grayscale_32bsi_subquery():
- # NOTE: we're using a positive integer because Mapnik
- # does not support negative data values anyway
- _test_grayscale_subquery('grayscale_32bsi_subquery', '32BSI', 129)
-
- def _test_data_subquery(lbl, pixtype, value):
- #
- # 3 8 13
- # +---+---+---+
- # 3 | v | v | v | NOTE: writes different values
- # +---+---+---+ in 13,8 and 8,13
- # 8 | v | v | a |
- # +---+---+---+
- # 13 | v | b | v |
- # +---+---+---+
- #
- val_a = value/3;
- val_b = val_a*2;
- sql = "(select 3 as i, " \
- " ST_SetValues(" \
- " ST_SetValues(" \
- " ST_AsRaster(" \
- " ST_MakeEnvelope(0,0,14,14), " \
- " 1.0, -1.0, '%s', %s" \
- " ), " \
- " 11, 6, 5, 5, %s::float8" \
- " )," \
- " 6, 11, 5, 5, %s::float8" \
- " ) as \"R\"" \
- ") as foo" % (pixtype,value, val_a, val_b)
- overview = ''
- rescale = 0
- clip = 0
- if rescale:
- lbl += ' Sc'
- if clip:
- lbl += ' Cl'
- ds = mapnik.PgRaster(dbname=MAPNIK_TEST_DBNAME, table=sql,
- raster_field='R', use_overviews=0 if overview else 0,
- band=1, prescale_rasters=rescale, clip_rasters=clip)
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['i'],3)
- lyr = mapnik.Layer('data_subquery')
- lyr.datasource = ds
- expenv = mapnik.Box2d(0,0,14,14)
- env = lyr.envelope()
- assert_almost_equal(env.minx, expenv.minx, places=0)
- assert_almost_equal(env.miny, expenv.miny, places=0)
- assert_almost_equal(env.maxx, expenv.maxx, places=0)
- assert_almost_equal(env.maxy, expenv.maxy, places=0)
- mm = mapnik.Map(15, 15)
- style = mapnik.Style()
- col = mapnik.RasterColorizer();
- col.default_mode = mapnik.COLORIZER_DISCRETE;
- col.add_stop(val_a, mapnik.Color(0xff,0x00,0x00,255));
- col.add_stop(val_b, mapnik.Color(0x00,0xff,0x00,255));
- col.add_stop(value, mapnik.Color(0x00,0x00,0xff,255));
- sym = mapnik.RasterSymbolizer()
- sym.colorizer = col
- rule = mapnik.Rule()
- rule.symbols.append(sym)
- style.rules.append(rule)
- mm.append_style('foo', style)
- lyr.styles.append('foo')
- mm.layers.append(lyr)
- mm.zoom_to_box(expenv)
- im = mapnik.Image(mm.width, mm.height)
- t0 = time.time() # we want wall time to include IO waits
- mapnik.render(mm, im)
- lap = time.time() - t0
- log('T ' + str(lap) + ' -- ' + lbl + ' E:full')
- #im.save('/tmp/xfull.png') # for debugging
- h = format(value, '02x')
- hex_v = '0000ffff'
- hex_a = 'ff0000ff'
- hex_b = '00ff00ff'
- eq_(hexlify(im.view( 3, 3,1,1).tostring()), hex_v);
- eq_(hexlify(im.view( 8, 3,1,1).tostring()), hex_v);
- eq_(hexlify(im.view(13, 3,1,1).tostring()), hex_v);
- eq_(hexlify(im.view( 3, 8,1,1).tostring()), hex_v);
- eq_(hexlify(im.view( 8, 8,1,1).tostring()), hex_v);
- eq_(hexlify(im.view(13, 8,1,1).tostring()), hex_a);
- eq_(hexlify(im.view( 3,13,1,1).tostring()), hex_v);
- eq_(hexlify(im.view( 8,13,1,1).tostring()), hex_b);
- eq_(hexlify(im.view(13,13,1,1).tostring()), hex_v);
-
- def test_data_2bui_subquery():
- _test_data_subquery('data_2bui_subquery', '2BUI', 3)
-
- def test_data_4bui_subquery():
- _test_data_subquery('data_4bui_subquery', '4BUI', 15)
-
- def test_data_8bui_subquery():
- _test_data_subquery('data_8bui_subquery', '8BUI', 63)
-
- def test_data_8bsi_subquery():
- # NOTE: we're using a positive integer because Mapnik
- # does not support negative data values anyway
- _test_data_subquery('data_8bsi_subquery', '8BSI', 69)
-
- def test_data_16bui_subquery():
- _test_data_subquery('data_16bui_subquery', '16BUI', 126)
-
- def test_data_16bsi_subquery():
- # NOTE: we're using a positive integer because Mapnik
- # does not support negative data values anyway
- _test_data_subquery('data_16bsi_subquery', '16BSI', 135)
-
- def test_data_32bui_subquery():
- _test_data_subquery('data_32bui_subquery', '32BUI', 255)
-
- def test_data_32bsi_subquery():
- # NOTE: we're using a positive integer because Mapnik
- # does not support negative data values anyway
- _test_data_subquery('data_32bsi_subquery', '32BSI', 264)
-
- def test_data_32bf_subquery():
- _test_data_subquery('data_32bf_subquery', '32BF', 450)
-
- def test_data_64bf_subquery():
- _test_data_subquery('data_64bf_subquery', '64BF', 3072)
-
- def _test_rgba_subquery(lbl, pixtype, r, g, b, a, g1, b1):
- #
- # 3 8 13
- # +---+---+---+
- # 3 | v | v | h | NOTE: writes different alpha
- # +---+---+---+ in 13,8 and 8,13
- # 8 | v | v | a |
- # +---+---+---+
- # 13 | v | b | v |
- # +---+---+---+
- #
- sql = "(select 3 as i, " \
- " ST_SetValues(" \
- " ST_SetValues(" \
- " ST_AddBand(" \
- " ST_AddBand(" \
- " ST_AddBand(" \
- " ST_AsRaster(" \
- " ST_MakeEnvelope(0,0,14,14), " \
- " 1.0, -1.0, '%s', %s" \
- " )," \
- " '%s', %d::float" \
- " ), " \
- " '%s', %d::float" \
- " ), " \
- " '%s', %d::float" \
- " ), " \
- " 2, 11, 6, 4, 5, %s::float8" \
- " )," \
- " 3, 6, 11, 5, 4, %s::float8" \
- " ) as r" \
- ") as foo" % (pixtype, r, pixtype, g, pixtype, b, pixtype, a, g1, b1)
- overview = ''
- rescale = 0
- clip = 0
- if rescale:
- lbl += ' Sc'
- if clip:
- lbl += ' Cl'
- ds = mapnik.PgRaster(dbname=MAPNIK_TEST_DBNAME, table=sql,
- raster_field='r', use_overviews=0 if overview else 0,
- prescale_rasters=rescale, clip_rasters=clip)
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['i'],3)
- lyr = mapnik.Layer('rgba_subquery')
- lyr.datasource = ds
- expenv = mapnik.Box2d(0,0,14,14)
- env = lyr.envelope()
- assert_almost_equal(env.minx, expenv.minx, places=0)
- assert_almost_equal(env.miny, expenv.miny, places=0)
- assert_almost_equal(env.maxx, expenv.maxx, places=0)
- assert_almost_equal(env.maxy, expenv.maxy, places=0)
- mm = mapnik.Map(15, 15)
- style = mapnik.Style()
- sym = mapnik.RasterSymbolizer()
- rule = mapnik.Rule()
- rule.symbols.append(sym)
- style.rules.append(rule)
- mm.append_style('foo', style)
- lyr.styles.append('foo')
- mm.layers.append(lyr)
- mm.zoom_to_box(expenv)
- im = mapnik.Image(mm.width, mm.height)
- t0 = time.time() # we want wall time to include IO waits
- mapnik.render(mm, im)
- lap = time.time() - t0
- log('T ' + str(lap) + ' -- ' + lbl + ' E:full')
- im.save('/tmp/xfull.png') # for debugging
- hex_v = format(r << 24 | g << 16 | b << 8 | a, '08x')
- hex_a = format(r << 24 | g1 << 16 | b << 8 | a, '08x')
- hex_b = format(r << 24 | g << 16 | b1 << 8 | a, '08x')
- eq_(hexlify(im.view( 3, 3,1,1).tostring()), hex_v);
- eq_(hexlify(im.view( 8, 3,1,1).tostring()), hex_v);
- eq_(hexlify(im.view(13, 3,1,1).tostring()), hex_v);
- eq_(hexlify(im.view( 3, 8,1,1).tostring()), hex_v);
- eq_(hexlify(im.view( 8, 8,1,1).tostring()), hex_v);
- eq_(hexlify(im.view(13, 8,1,1).tostring()), hex_a);
- eq_(hexlify(im.view( 3,13,1,1).tostring()), hex_v);
- eq_(hexlify(im.view( 8,13,1,1).tostring()), hex_b);
- eq_(hexlify(im.view(13,13,1,1).tostring()), hex_v);
-
- def test_rgba_8bui_subquery():
- _test_rgba_subquery('rgba_8bui_subquery', '8BUI', 255, 0, 0, 255, 255, 255)
-
- #def test_rgba_16bui_subquery():
- # _test_rgba_subquery('rgba_16bui_subquery', '16BUI', 65535, 0, 0, 65535, 65535, 65535)
-
- #def test_rgba_32bui_subquery():
- # _test_rgba_subquery('rgba_32bui_subquery', '32BUI')
-
- atexit.register(postgis_takedown)
-
-def enabled(tname):
- enabled = len(sys.argv) < 2 or tname in sys.argv
- if not enabled:
- print "Skipping " + tname + " as not explicitly enabled"
- return enabled
-
-if __name__ == "__main__":
- setup()
- fail = run_all(eval(x) for x in dir() if x.startswith("test_") and enabled(x))
- exit(fail)
diff --git a/tests/python_tests/pickling_test.py b/tests/python_tests/pickling_test.py
deleted file mode 100644
index 772c274..0000000
--- a/tests/python_tests/pickling_test.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import os
-from nose.tools import *
-from utilities import execution_path, run_all
-import tempfile
-
-import mapnik, pickle
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def test_color_pickle():
- c = mapnik.Color('blue')
-
- eq_(pickle.loads(pickle.dumps(c)), c)
-
- c = mapnik.Color(0, 64, 128)
-
- eq_(pickle.loads(pickle.dumps(c)), c)
-
- c = mapnik.Color(0, 64, 128, 192)
-
- eq_(pickle.loads(pickle.dumps(c)), c)
-
-def test_envelope_pickle():
- e = mapnik.Box2d(100, 100, 200, 200)
-
- eq_(pickle.loads(pickle.dumps(e)), e)
-
-def test_parameters_pickle():
- params = mapnik.Parameters()
- params.append(mapnik.Parameter('oh',str('yeah')))
-
- params2 = pickle.loads(pickle.dumps(params,pickle.HIGHEST_PROTOCOL))
-
- eq_(params[0][0],params2[0][0])
- eq_(params[0][1],params2[0][1])
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/png_encoding_test.py b/tests/python_tests/png_encoding_test.py
deleted file mode 100644
index 82adf1e..0000000
--- a/tests/python_tests/png_encoding_test.py
+++ /dev/null
@@ -1,164 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import sys
-import os, mapnik
-from timeit import Timer, time
-from nose.tools import *
-from utilities import execution_path, run_all
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-if mapnik.has_png():
- tmp_dir = '/tmp/mapnik-png/'
- if not os.path.exists(tmp_dir):
- os.makedirs(tmp_dir)
-
- opts = [
- 'png32',
- 'png32:t=0',
- 'png8:m=o',
- 'png8:m=o:c=1',
- 'png8:m=o:t=0',
- 'png8:m=o:c=1:t=0',
- 'png8:m=o:t=1',
- 'png8:m=o:t=2',
- 'png8:m=h',
- 'png8:m=h:c=1',
- 'png8:m=h:t=0',
- 'png8:m=h:c=1:t=0',
- 'png8:m=h:t=1',
- 'png8:m=h:t=2',
- 'png32:e=miniz',
- 'png8:e=miniz'
- ]
-
- # Todo - use itertools.product
- #z_opts = range(1,9+1)
- #t_opts = range(0,2+1)
-
- def gen_filepath(name,format):
- return os.path.join('images/support/encoding-opts',name+'-'+format.replace(":","+")+'.png')
-
- generate = False
-
- def test_expected_encodings():
- # blank image
- im = mapnik.Image(256,256)
- for opt in opts:
- expected = gen_filepath('solid',opt)
- actual = os.path.join(tmp_dir,os.path.basename(expected))
- if generate or not os.path.exists(expected):
- print 'generating expected image %s' % expected
- im.save(expected,opt)
- else:
- im.save(actual,opt)
- eq_(mapnik.Image.open(actual).tostring('png32'),
- mapnik.Image.open(expected).tostring('png32'),
- '%s (actual) not == to %s (expected)' % (actual,expected))
-
- # solid image
- im.background = mapnik.Color('green');
- for opt in opts:
- expected = gen_filepath('blank',opt)
- actual = os.path.join(tmp_dir,os.path.basename(expected))
- if generate or not os.path.exists(expected):
- print 'generating expected image %s' % expected
- im.save(expected,opt)
- else:
- im.save(actual,opt)
- eq_(mapnik.Image.open(actual).tostring('png32'),
- mapnik.Image.open(expected).tostring('png32'),
- '%s (actual) not == to %s (expected)' % (actual,expected))
-
- # aerial
- im = mapnik.Image.open('./images/support/transparency/aerial_rgba.png')
- for opt in opts:
- expected = gen_filepath('aerial_rgba',opt)
- actual = os.path.join(tmp_dir,os.path.basename(expected))
- if generate or not os.path.exists(expected):
- print 'generating expected image %s' % expected
- im.save(expected,opt)
- else:
- im.save(actual,opt)
- eq_(mapnik.Image.open(actual).tostring('png32'),
- mapnik.Image.open(expected).tostring('png32'),
- '%s (actual) not == to %s (expected)' % (actual,expected))
-
- def test_transparency_levels():
- # create partial transparency image
- im = mapnik.Image(256,256)
- im.background = mapnik.Color('rgba(255,255,255,.5)')
- c2 = mapnik.Color('rgba(255,255,0,.2)')
- c3 = mapnik.Color('rgb(0,255,255)')
- for y in range(0,im.height()/2):
- for x in range(0,im.width()/2):
- im.set_pixel(x,y,c2)
- for y in range(im.height()/2,im.height()):
- for x in range(im.width()/2,im.width()):
- im.set_pixel(x,y,c3)
-
- t0 = tmp_dir + 'white0.png'
- t2 = tmp_dir + 'white2.png'
- t1 = tmp_dir + 'white1.png'
-
- # octree
- format = 'png8:m=o:t=0'
- im.save(t0,format)
- im_in = mapnik.Image.open(t0)
- t0_len = len(im_in.tostring(format))
- eq_(t0_len,len(mapnik.Image.open('images/support/transparency/white0.png').tostring(format)))
- format = 'png8:m=o:t=1'
- im.save(t1,format)
- im_in = mapnik.Image.open(t1)
- t1_len = len(im_in.tostring(format))
- eq_(len(im.tostring(format)),len(mapnik.Image.open('images/support/transparency/white1.png').tostring(format)))
- format = 'png8:m=o:t=2'
- im.save(t2,format)
- im_in = mapnik.Image.open(t2)
- t2_len = len(im_in.tostring(format))
- eq_(len(im.tostring(format)),len(mapnik.Image.open('images/support/transparency/white2.png').tostring(format)))
-
- eq_(t0_len < t1_len < t2_len,True)
-
- # hextree
- format = 'png8:m=h:t=0'
- im.save(t0,format)
- im_in = mapnik.Image.open(t0)
- t0_len = len(im_in.tostring(format))
- eq_(t0_len,len(mapnik.Image.open('images/support/transparency/white0.png').tostring(format)))
- format = 'png8:m=h:t=1'
- im.save(t1,format)
- im_in = mapnik.Image.open(t1)
- t1_len = len(im_in.tostring(format))
- eq_(len(im.tostring(format)),len(mapnik.Image.open('images/support/transparency/white1.png').tostring(format)))
- format = 'png8:m=h:t=2'
- im.save(t2,format)
- im_in = mapnik.Image.open(t2)
- t2_len = len(im_in.tostring(format))
- eq_(len(im.tostring(format)),len(mapnik.Image.open('images/support/transparency/white2.png').tostring(format)))
-
- eq_(t0_len < t1_len < t2_len,True)
-
- def test_transparency_levels_aerial():
- im = mapnik.Image.open('../data/images/12_654_1580.png')
- im_in = mapnik.Image.open('./images/support/transparency/aerial_rgba.png')
- eq_(len(im.tostring('png8')),len(im_in.tostring('png8')))
- eq_(len(im.tostring('png32')),len(im_in.tostring('png32')))
-
- im_in = mapnik.Image.open('./images/support/transparency/aerial_rgb.png')
- eq_(len(im.tostring('png32')),len(im_in.tostring('png32')))
- eq_(len(im.tostring('png32:t=0')),len(im_in.tostring('png32:t=0')))
- eq_(len(im.tostring('png32:t=0')) == len(im_in.tostring('png32')), False)
- eq_(len(im.tostring('png8')),len(im_in.tostring('png8')))
- eq_(len(im.tostring('png8:t=0')),len(im_in.tostring('png8:t=0')))
- # unlike png32 paletted images without alpha will look the same even if no alpha is forced
- eq_(len(im.tostring('png8:t=0')) == len(im_in.tostring('png8')), True)
- eq_(len(im.tostring('png8:t=0:m=o')) == len(im_in.tostring('png8:m=o')), True)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/pngsuite_test.py b/tests/python_tests/pngsuite_test.py
deleted file mode 100644
index 26c2456..0000000
--- a/tests/python_tests/pngsuite_test.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env python
-
-import os
-import mapnik
-from nose.tools import *
-from utilities import execution_path, run_all
-
-datadir = '../data/pngsuite'
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def assert_broken_file(fname):
- assert_raises(RuntimeError, lambda: mapnik.Image.open(fname))
-
-def assert_good_file(fname):
- assert mapnik.Image.open(fname)
-
-def get_pngs(good):
- files = [ x for x in os.listdir(datadir) if x.endswith('.png') ]
- return [ os.path.join(datadir, x) for x in files if good != x.startswith('x') ]
-
-def test_good_pngs():
- for x in get_pngs(True):
- yield assert_good_file, x
-
-def test_broken_pngs():
- for x in get_pngs(False):
- yield assert_broken_file, x
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/postgis_test.py b/tests/python_tests/postgis_test.py
deleted file mode 100644
index 13f46a0..0000000
--- a/tests/python_tests/postgis_test.py
+++ /dev/null
@@ -1,1032 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-import atexit
-import time
-from utilities import execution_path, run_all
-from subprocess import Popen, PIPE
-import os, mapnik
-from Queue import Queue
-import threading
-
-
-MAPNIK_TEST_DBNAME = 'mapnik-tmp-postgis-test-db'
-POSTGIS_TEMPLATE_DBNAME = 'template_postgis'
-SHAPEFILE = os.path.join(execution_path('.'),'../data/shp/world_merc.shp')
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def call(cmd,silent=False):
- stdin, stderr = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE).communicate()
- if not stderr:
- return stdin.strip()
- elif not silent and 'error' in stderr.lower() \
- or 'not found' in stderr.lower() \
- or 'could not connect' in stderr.lower() \
- or 'bad connection' in stderr.lower() \
- or 'not recognized as an internal' in stderr.lower():
- raise RuntimeError(stderr.strip())
-
-def psql_can_connect():
- """Test ability to connect to a postgis template db with no options.
-
- Basically, to run these tests your user must have full read
- access over unix sockets without supplying a password. This
- keeps these tests simple and focused on postgis not on postgres
- auth issues.
- """
- try:
- call('psql %s -c "select postgis_version()"' % POSTGIS_TEMPLATE_DBNAME)
- return True
- except RuntimeError, e:
- print 'Notice: skipping postgis tests (connection)'
- return False
-
-def shp2pgsql_on_path():
- """Test for presence of shp2pgsql on the user path.
-
- We require this program to load test data into a temporarily database.
- """
- try:
- call('shp2pgsql')
- return True
- except RuntimeError, e:
- print 'Notice: skipping postgis tests (shp2pgsql)'
- return False
-
-def createdb_and_dropdb_on_path():
- """Test for presence of dropdb/createdb on user path.
-
- We require these programs to setup and teardown the testing db.
- """
- try:
- call('createdb --help')
- call('dropdb --help')
- return True
- except RuntimeError, e:
- print 'Notice: skipping postgis tests (createdb/dropdb)'
- return False
-
-insert_table_1 = """
-CREATE TABLE test(gid serial PRIMARY KEY, geom geometry);
-INSERT INTO test(geom) values (GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test(geom) values (GeomFromEWKT('SRID=4326;POINT(-2 2)'));
-INSERT INTO test(geom) values (GeomFromEWKT('SRID=4326;MULTIPOINT(2 1,1 2)'));
-INSERT INTO test(geom) values (GeomFromEWKT('SRID=4326;LINESTRING(0 0,1 1,1 2)'));
-INSERT INTO test(geom) values (GeomFromEWKT('SRID=4326;MULTILINESTRING((1 0,0 1,3 2),(3 2,5 4))'));
-INSERT INTO test(geom) values (GeomFromEWKT('SRID=4326;POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))'));
-INSERT INTO test(geom) values (GeomFromEWKT('SRID=4326;MULTIPOLYGON(((1 1,3 1,3 3,1 3,1 1),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))'));
-INSERT INTO test(geom) values (GeomFromEWKT('SRID=4326;GEOMETRYCOLLECTION(POLYGON((1 1, 2 1, 2 2, 1 2,1 1)),POINT(2 3),LINESTRING(2 3,3 4))'));
-"""
-
-insert_table_2 = """
-CREATE TABLE test2(manual_id int4 PRIMARY KEY, geom geometry);
-INSERT INTO test2(manual_id, geom) values (0, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test2(manual_id, geom) values (1, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test2(manual_id, geom) values (1000, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test2(manual_id, geom) values (-1000, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test2(manual_id, geom) values (2147483647, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test2(manual_id, geom) values (-2147483648, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-"""
-
-insert_table_3 = """
-CREATE TABLE test3(non_id bigint, manual_id int4, geom geometry);
-INSERT INTO test3(non_id, manual_id, geom) values (9223372036854775807, 0, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test3(non_id, manual_id, geom) values (9223372036854775807, 1, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test3(non_id, manual_id, geom) values (9223372036854775807, 1000, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test3(non_id, manual_id, geom) values (9223372036854775807, -1000, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test3(non_id, manual_id, geom) values (9223372036854775807, 2147483647, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test3(non_id, manual_id, geom) values (9223372036854775807, -2147483648, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-"""
-
-insert_table_4 = """
-CREATE TABLE test4(non_id int4, manual_id int8 PRIMARY KEY, geom geometry);
-INSERT INTO test4(non_id, manual_id, geom) values (0, 0, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test4(non_id, manual_id, geom) values (0, 1, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test4(non_id, manual_id, geom) values (0, 1000, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test4(non_id, manual_id, geom) values (0, -1000, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test4(non_id, manual_id, geom) values (0, 2147483647, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test4(non_id, manual_id, geom) values (0, -2147483648, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-"""
-
-insert_table_5 = """
-CREATE TABLE test5(non_id int4, manual_id numeric PRIMARY KEY, geom geometry);
-INSERT INTO test5(non_id, manual_id, geom) values (0, -1, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test5(non_id, manual_id, geom) values (0, 1, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-"""
-
-insert_table_5b = '''
-CREATE TABLE "tableWithMixedCase"(gid serial PRIMARY KEY, geom geometry);
-INSERT INTO "tableWithMixedCase"(geom) values (ST_MakePoint(0,0));
-INSERT INTO "tableWithMixedCase"(geom) values (ST_MakePoint(0,1));
-INSERT INTO "tableWithMixedCase"(geom) values (ST_MakePoint(1,0));
-INSERT INTO "tableWithMixedCase"(geom) values (ST_MakePoint(1,1));
-'''
-
-insert_table_6 = '''
-CREATE TABLE test6(first_id int4, second_id int4,PRIMARY KEY (first_id,second_id), geom geometry);
-INSERT INTO test6(first_id, second_id, geom) values (0, 0, GeomFromEWKT('SRID=4326;POINT(0 0)'));
-'''
-
-insert_table_7 = '''
-CREATE TABLE test7(gid serial PRIMARY KEY, geom geometry);
-INSERT INTO test7(gid, geom) values (1, GeomFromEWKT('SRID=4326;GEOMETRYCOLLECTION(MULTILINESTRING((10 10,20 20,10 40),(40 40,30 30,40 20,30 10)),LINESTRING EMPTY)'));
-'''
-
-insert_table_8 = '''
-CREATE TABLE test8(gid serial PRIMARY KEY,int_field bigint, geom geometry);
-INSERT INTO test8(gid, int_field, geom) values (1, 2147483648, ST_MakePoint(1,1));
-INSERT INTO test8(gid, int_field, geom) values (2, 922337203685477580, ST_MakePoint(1,1));
-'''
-
-insert_table_9 = '''
-CREATE TABLE test9(gid serial PRIMARY KEY, name varchar, geom geometry);
-INSERT INTO test9(gid, name, geom) values (1, 'name', ST_MakePoint(1,1));
-INSERT INTO test9(gid, name, geom) values (2, '', ST_MakePoint(1,1));
-INSERT INTO test9(gid, name, geom) values (3, null, ST_MakePoint(1,1));
-'''
-
-insert_table_10 = '''
-CREATE TABLE test10(gid serial PRIMARY KEY, bool_field boolean, geom geometry);
-INSERT INTO test10(gid, bool_field, geom) values (1, TRUE, ST_MakePoint(1,1));
-INSERT INTO test10(gid, bool_field, geom) values (2, FALSE, ST_MakePoint(1,1));
-INSERT INTO test10(gid, bool_field, geom) values (3, null, ST_MakePoint(1,1));
-'''
-
-insert_table_11 = """
-CREATE TABLE test11(gid serial PRIMARY KEY, label varchar(40), geom geometry);
-INSERT INTO test11(label,geom) values ('label_1',GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test11(label,geom) values ('label_2',GeomFromEWKT('SRID=4326;POINT(-2 2)'));
-INSERT INTO test11(label,geom) values ('label_3',GeomFromEWKT('SRID=4326;MULTIPOINT(2 1,1 2)'));
-INSERT INTO test11(label,geom) values ('label_4',GeomFromEWKT('SRID=4326;LINESTRING(0 0,1 1,1 2)'));
-INSERT INTO test11(label,geom) values ('label_5',GeomFromEWKT('SRID=4326;MULTILINESTRING((1 0,0 1,3 2),(3 2,5 4))'));
-INSERT INTO test11(label,geom) values ('label_6',GeomFromEWKT('SRID=4326;POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))'));
-INSERT INTO test11(label,geom) values ('label_7',GeomFromEWKT('SRID=4326;MULTIPOLYGON(((1 1,3 1,3 3,1 3,1 1),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))'));
-INSERT INTO test11(label,geom) values ('label_8',GeomFromEWKT('SRID=4326;GEOMETRYCOLLECTION(POLYGON((1 1, 2 1, 2 2, 1 2,1 1)),POINT(2 3),LINESTRING(2 3,3 4))'));
-"""
-
-insert_table_12 = """
-CREATE TABLE test12(gid serial PRIMARY KEY, name varchar(40), geom geometry);
-INSERT INTO test12(name,geom) values ('Point',GeomFromEWKT('SRID=4326;POINT(0 0)'));
-INSERT INTO test12(name,geom) values ('PointZ',GeomFromEWKT('SRID=4326;POINTZ(0 0 0)'));
-INSERT INTO test12(name,geom) values ('PointM',GeomFromEWKT('SRID=4326;POINTM(0 0 0)'));
-INSERT INTO test12(name,geom) values ('PointZM',GeomFromEWKT('SRID=4326;POINTZM(0 0 0 0)'));
-INSERT INTO test12(name,geom) values ('MultiPoint',GeomFromEWKT('SRID=4326;MULTIPOINT(0 0, 1 1)'));
-INSERT INTO test12(name,geom) values ('MultiPointZ',GeomFromEWKT('SRID=4326;MULTIPOINTZ(0 0 0, 1 1 1)'));
-INSERT INTO test12(name,geom) values ('MultiPointM',GeomFromEWKT('SRID=4326;MULTIPOINTM(0 0 0, 1 1 1)'));
-INSERT INTO test12(name,geom) values ('MultiPointZM',GeomFromEWKT('SRID=4326;MULTIPOINTZM(0 0 0 0, 1 1 1 1)'));
-INSERT INTO test12(name,geom) values ('LineString',GeomFromEWKT('SRID=4326;LINESTRING(0 0, 1 1)'));
-INSERT INTO test12(name,geom) values ('LineStringZ',GeomFromEWKT('SRID=4326;LINESTRINGZ(0 0 0, 1 1 1)'));
-INSERT INTO test12(name,geom) values ('LineStringM',GeomFromEWKT('SRID=4326;LINESTRINGM(0 0 0, 1 1 1)'));
-INSERT INTO test12(name,geom) values ('LineStringZM',GeomFromEWKT('SRID=4326;LINESTRINGZM(0 0 0 0, 1 1 1 1)'));
-INSERT INTO test12(name,geom) values ('Polygon',GeomFromEWKT('SRID=4326;POLYGON((0 0, 1 1, 2 2, 0 0))'));
-INSERT INTO test12(name,geom) values ('PolygonZ',GeomFromEWKT('SRID=4326;POLYGONZ((0 0 0, 1 1 1, 2 2 2, 0 0 0))'));
-INSERT INTO test12(name,geom) values ('PolygonM',GeomFromEWKT('SRID=4326;POLYGONZ((0 0 0, 1 1 1, 2 2 2, 0 0 0))'));
-INSERT INTO test12(name,geom) values ('PolygonZM',GeomFromEWKT('SRID=4326;POLYGONZM((0 0 0 0, 1 1 1 1, 2 2 2 2, 0 0 0 0))'));
-INSERT INTO test12(name,geom) values ('MultiLineString',GeomFromEWKT('SRID=4326;MULTILINESTRING((0 0, 1 1),(2 2, 3 3))'));
-INSERT INTO test12(name,geom) values ('MultiLineStringZ',GeomFromEWKT('SRID=4326;MULTILINESTRINGZ((0 0 0, 1 1 1),(2 2 2, 3 3 3))'));
-INSERT INTO test12(name,geom) values ('MultiLineStringM',GeomFromEWKT('SRID=4326;MULTILINESTRINGM((0 0 0, 1 1 1),(2 2 2, 3 3 3))'));
-INSERT INTO test12(name,geom) values ('MultiLineStringZM',GeomFromEWKT('SRID=4326;MULTILINESTRINGZM((0 0 0 0, 1 1 1 1),(2 2 2 2, 3 3 3 3))'));
-INSERT INTO test12(name,geom) values ('MultiPolygon',GeomFromEWKT('SRID=4326;MULTIPOLYGON(((0 0, 1 1, 2 2, 0 0)),((0 0, 1 1, 2 2, 0 0)))'));
-INSERT INTO test12(name,geom) values ('MultiPolygonZ',GeomFromEWKT('SRID=4326;MULTIPOLYGONZ(((0 0 0, 1 1 1, 2 2 2, 0 0 0)),((0 0 0, 1 1 1, 2 2 2, 0 0 0)))'));
-INSERT INTO test12(name,geom) values ('MultiPolygonM',GeomFromEWKT('SRID=4326;MULTIPOLYGONM(((0 0 0, 1 1 1, 2 2 2, 0 0 0)),((0 0 0, 1 1 1, 2 2 2, 0 0 0)))'));
-INSERT INTO test12(name,geom) values ('MultiPolygonZM',GeomFromEWKT('SRID=4326;MULTIPOLYGONZM(((0 0 0 0, 1 1 1 1, 2 2 2 2, 0 0 0 0)),((0 0 0 0, 1 1 1 1, 2 2 2 2, 0 0 0 0)))'));
-"""
-
-
-def postgis_setup():
- call('dropdb %s' % MAPNIK_TEST_DBNAME,silent=True)
- call('createdb -T %s %s' % (POSTGIS_TEMPLATE_DBNAME,MAPNIK_TEST_DBNAME),silent=False)
- call('shp2pgsql -s 3857 -g geom -W LATIN1 %s world_merc | psql -q %s' % (SHAPEFILE,MAPNIK_TEST_DBNAME), silent=True)
- call('''psql -q %s -c "CREATE TABLE \"empty\" (key serial);SELECT AddGeometryColumn('','empty','geom','-1','GEOMETRY',4);"''' % MAPNIK_TEST_DBNAME,silent=False)
- call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_1),silent=False)
- call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_2),silent=False)
- call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_3),silent=False)
- call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_4),silent=False)
- call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_5),silent=False)
- call("""psql -q %s -c '%s'""" % (MAPNIK_TEST_DBNAME,insert_table_5b),silent=False)
- call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_6),silent=False)
- call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_7),silent=False)
- call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_8),silent=False)
- call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_9),silent=False)
- call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_10),silent=False)
- call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_11),silent=False)
- call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_12),silent=False)
-
-def postgis_takedown():
- pass
- # fails as the db is in use: https://github.com/mapnik/mapnik/issues/960
- #call('dropdb %s' % MAPNIK_TEST_DBNAME)
-
-if 'postgis' in mapnik.DatasourceCache.plugin_names() \
- and createdb_and_dropdb_on_path() \
- and psql_can_connect() \
- and shp2pgsql_on_path():
-
- # initialize test database
- postgis_setup()
-
- def test_feature():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='world_merc')
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['gid'],1)
- eq_(feature['fips'],u'AC')
- eq_(feature['iso2'],u'AG')
- eq_(feature['iso3'],u'ATG')
- eq_(feature['un'],28)
- eq_(feature['name'],u'Antigua and Barbuda')
- eq_(feature['area'],44)
- eq_(feature['pop2005'],83039)
- eq_(feature['region'],19)
- eq_(feature['subregion'],29)
- eq_(feature['lon'],-61.783)
- eq_(feature['lat'],17.078)
- eq_(ds.describe()['geometry_type'],mapnik.DataGeometryType.Polygon)
-
- def test_subquery():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='(select * from world_merc) as w')
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['gid'],1)
- eq_(feature['fips'],u'AC')
- eq_(feature['iso2'],u'AG')
- eq_(feature['iso3'],u'ATG')
- eq_(feature['un'],28)
- eq_(feature['name'],u'Antigua and Barbuda')
- eq_(feature['area'],44)
- eq_(feature['pop2005'],83039)
- eq_(feature['region'],19)
- eq_(feature['subregion'],29)
- eq_(feature['lon'],-61.783)
- eq_(feature['lat'],17.078)
- eq_(ds.describe()['geometry_type'],mapnik.DataGeometryType.Polygon)
-
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='(select gid,geom,fips as _fips from world_merc) as w')
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['gid'],1)
- eq_(feature['_fips'],u'AC')
- eq_(len(feature),2)
- eq_(ds.describe()['geometry_type'],mapnik.DataGeometryType.Polygon)
-
- def test_empty_db():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='empty')
- fs = ds.featureset()
- feature = None
- try:
- feature = fs.next()
- except StopIteration:
- pass
- eq_(feature,None)
- eq_(ds.describe()['geometry_type'],None)
-
- def test_geometry_detection():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='test',
- geometry_field='geom')
- eq_(ds.describe()['geometry_type'],mapnik.DataGeometryType.Collection)
-
- # will fail with postgis 2.0 because it automatically adds a geometry_columns entry
- #ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='test',
- # geometry_field='geom',
- # row_limit=1)
- #eq_(ds.describe()['geometry_type'],mapnik.DataGeometryType.Point)
-
- @raises(RuntimeError)
- def test_that_nonexistant_query_field_throws(**kwargs):
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='empty')
- eq_(len(ds.fields()),1)
- eq_(ds.fields(),['key'])
- eq_(ds.field_types(),['int'])
- query = mapnik.Query(ds.envelope())
- for fld in ds.fields():
- query.add_property_name(fld)
- # also add an invalid one, triggering throw
- query.add_property_name('bogus')
- fs = ds.features(query)
-
- def test_auto_detection_of_unique_feature_id_32_bit():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='test2',
- geometry_field='geom',
- autodetect_key_field=True)
- fs = ds.featureset()
- eq_(fs.next()['manual_id'],0)
- eq_(fs.next()['manual_id'],1)
- eq_(fs.next()['manual_id'],1000)
- eq_(fs.next()['manual_id'],-1000)
- eq_(fs.next()['manual_id'],2147483647)
- eq_(fs.next()['manual_id'],-2147483648)
-
- fs = ds.featureset()
- eq_(fs.next().id(),0)
- eq_(fs.next().id(),1)
- eq_(fs.next().id(),1000)
- eq_(fs.next().id(),-1000)
- eq_(fs.next().id(),2147483647)
- eq_(fs.next().id(),-2147483648)
-
- def test_auto_detection_will_fail_since_no_primary_key():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='test3',
- geometry_field='geom',
- autodetect_key_field=False)
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['manual_id'],0)
- # will fail: https://github.com/mapnik/mapnik/issues/895
- #eq_(feat['non_id'],9223372036854775807)
- eq_(fs.next()['manual_id'],1)
- eq_(fs.next()['manual_id'],1000)
- eq_(fs.next()['manual_id'],-1000)
- eq_(fs.next()['manual_id'],2147483647)
- eq_(fs.next()['manual_id'],-2147483648)
-
- # since no valid primary key will be detected the fallback
- # is auto-incrementing counter
- fs = ds.featureset()
- eq_(fs.next().id(),1)
- eq_(fs.next().id(),2)
- eq_(fs.next().id(),3)
- eq_(fs.next().id(),4)
- eq_(fs.next().id(),5)
- eq_(fs.next().id(),6)
-
- @raises(RuntimeError)
- def test_auto_detection_will_fail_and_should_throw():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='test3',
- geometry_field='geom',
- autodetect_key_field=True)
- fs = ds.featureset()
-
- def test_auto_detection_of_unique_feature_id_64_bit():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='test4',
- geometry_field='geom',
- autodetect_key_field=True)
- fs = ds.featureset()
- eq_(fs.next()['manual_id'],0)
- eq_(fs.next()['manual_id'],1)
- eq_(fs.next()['manual_id'],1000)
- eq_(fs.next()['manual_id'],-1000)
- eq_(fs.next()['manual_id'],2147483647)
- eq_(fs.next()['manual_id'],-2147483648)
-
- fs = ds.featureset()
- eq_(fs.next().id(),0)
- eq_(fs.next().id(),1)
- eq_(fs.next().id(),1000)
- eq_(fs.next().id(),-1000)
- eq_(fs.next().id(),2147483647)
- eq_(fs.next().id(),-2147483648)
-
- def test_disabled_auto_detection_and_subquery():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='''(select geom, 'a'::varchar as name from test2) as t''',
- geometry_field='geom',
- autodetect_key_field=False)
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat.id(),1)
- eq_(feat['name'],'a')
- feat = fs.next()
- eq_(feat.id(),2)
- eq_(feat['name'],'a')
- feat = fs.next()
- eq_(feat.id(),3)
- eq_(feat['name'],'a')
- feat = fs.next()
- eq_(feat.id(),4)
- eq_(feat['name'],'a')
- feat = fs.next()
- eq_(feat.id(),5)
- eq_(feat['name'],'a')
- feat = fs.next()
- eq_(feat.id(),6)
- eq_(feat['name'],'a')
-
- def test_auto_detection_and_subquery_including_key():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='''(select geom, manual_id from test2) as t''',
- geometry_field='geom',
- autodetect_key_field=True)
- fs = ds.featureset()
- eq_(fs.next()['manual_id'],0)
- eq_(fs.next()['manual_id'],1)
- eq_(fs.next()['manual_id'],1000)
- eq_(fs.next()['manual_id'],-1000)
- eq_(fs.next()['manual_id'],2147483647)
- eq_(fs.next()['manual_id'],-2147483648)
-
- fs = ds.featureset()
- eq_(fs.next().id(),0)
- eq_(fs.next().id(),1)
- eq_(fs.next().id(),1000)
- eq_(fs.next().id(),-1000)
- eq_(fs.next().id(),2147483647)
- eq_(fs.next().id(),-2147483648)
-
- @raises(RuntimeError)
- def test_auto_detection_of_invalid_numeric_primary_key():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='''(select geom, manual_id::numeric from test2) as t''',
- geometry_field='geom',
- autodetect_key_field=True)
-
- @raises(RuntimeError)
- def test_auto_detection_of_invalid_multiple_keys():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='''test6''',
- geometry_field='geom',
- autodetect_key_field=True)
-
- @raises(RuntimeError)
- def test_auto_detection_of_invalid_multiple_keys_subquery():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='''(select first_id,second_id,geom from test6) as t''',
- geometry_field='geom',
- autodetect_key_field=True)
-
- def test_manually_specified_feature_id_field():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='test4',
- geometry_field='geom',
- key_field='manual_id',
- autodetect_key_field=True)
- fs = ds.featureset()
- eq_(fs.next()['manual_id'],0)
- eq_(fs.next()['manual_id'],1)
- eq_(fs.next()['manual_id'],1000)
- eq_(fs.next()['manual_id'],-1000)
- eq_(fs.next()['manual_id'],2147483647)
- eq_(fs.next()['manual_id'],-2147483648)
-
- fs = ds.featureset()
- eq_(fs.next().id(),0)
- eq_(fs.next().id(),1)
- eq_(fs.next().id(),1000)
- eq_(fs.next().id(),-1000)
- eq_(fs.next().id(),2147483647)
- eq_(fs.next().id(),-2147483648)
-
- def test_numeric_type_feature_id_field():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='test5',
- geometry_field='geom',
- autodetect_key_field=False)
- fs = ds.featureset()
- eq_(fs.next()['manual_id'],-1)
- eq_(fs.next()['manual_id'],1)
-
- fs = ds.featureset()
- eq_(fs.next().id(),1)
- eq_(fs.next().id(),2)
-
- def test_querying_table_with_mixed_case():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='"tableWithMixedCase"',
- geometry_field='geom',
- autodetect_key_field=True)
- fs = ds.featureset()
- for id in range(1,5):
- eq_(fs.next().id(),id)
-
- def test_querying_subquery_with_mixed_case():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='(SeLeCt * FrOm "tableWithMixedCase") as MixedCaseQuery',
- geometry_field='geom',
- autodetect_key_field=True)
- fs = ds.featureset()
- for id in range(1,5):
- eq_(fs.next().id(),id)
-
- def test_bbox_token_in_subquery1():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='''
- (SeLeCt * FrOm "tableWithMixedCase" where geom && !bbox! ) as MixedCaseQuery''',
- geometry_field='geom',
- autodetect_key_field=True)
- fs = ds.featureset()
- for id in range(1,5):
- eq_(fs.next().id(),id)
-
- def test_bbox_token_in_subquery2():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='''
- (SeLeCt * FrOm "tableWithMixedCase" where ST_Intersects(geom,!bbox!) ) as MixedCaseQuery''',
- geometry_field='geom',
- autodetect_key_field=True)
- fs = ds.featureset()
- for id in range(1,5):
- eq_(fs.next().id(),id)
-
- def test_empty_geom():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='test7',
- geometry_field='geom')
- fs = ds.featureset()
- eq_(fs.next()['gid'],1)
-
- def create_ds():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,
- table='test',
- max_size=20,
- geometry_field='geom')
- fs = ds.all_features()
- eq_(len(fs),8)
-
- def test_threaded_create(NUM_THREADS=100):
- # run one to start before thread loop
- # to ensure that a throw stops the test
- # from running all threads
- create_ds()
- runs = 0
- for i in range(NUM_THREADS):
- t = threading.Thread(target=create_ds)
- t.start()
- t.join()
- runs +=1
- eq_(runs,NUM_THREADS)
-
- def create_ds_and_error():
- try:
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,
- table='asdfasdfasdfasdfasdf',
- max_size=20)
- fs = ds.all_features()
- except Exception, e:
- eq_('in executeQuery' in str(e),True)
-
- def test_threaded_create2(NUM_THREADS=10):
- for i in range(NUM_THREADS):
- t = threading.Thread(target=create_ds_and_error)
- t.start()
- t.join()
-
- def test_that_64bit_int_fields_work():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,
- table='test8',
- geometry_field='geom')
- eq_(len(ds.fields()),2)
- eq_(ds.fields(),['gid','int_field'])
- eq_(ds.field_types(),['int','int'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat.id(),1)
- eq_(feat['gid'],1)
- eq_(feat['int_field'],2147483648)
- feat = fs.next()
- eq_(feat.id(),2)
- eq_(feat['gid'],2)
- eq_(feat['int_field'],922337203685477580)
-
- def test_persist_connection_off():
- # NOTE: max_size should be equal or greater than
- # the pool size. There's currently no API to
- # check nor set that size, but the current
- # default is 20, so we use that value. See
- # http://github.com/mapnik/mapnik/issues/863
- max_size = 20
- for i in range(0, max_size+1):
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,
- max_size=1, # unused
- persist_connection=False,
- table='(select ST_MakePoint(0,0) as g, pg_backend_pid() as p, 1 as v) as w',
- geometry_field='g')
- fs = ds.featureset()
- eq_(fs.next()['v'], 1)
-
- def test_null_comparision():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='test9',
- geometry_field='geom')
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['gid'],1)
- eq_(feat['name'],'name')
- eq_(mapnik.Expression("[name] = 'name'").evaluate(feat),True)
- eq_(mapnik.Expression("[name] = ''").evaluate(feat),False)
- eq_(mapnik.Expression("[name] = null").evaluate(feat),False)
- eq_(mapnik.Expression("[name] = true").evaluate(feat),False)
- eq_(mapnik.Expression("[name] = false").evaluate(feat),False)
- eq_(mapnik.Expression("[name] != 'name'").evaluate(feat),False)
- eq_(mapnik.Expression("[name] != ''").evaluate(feat),True)
- eq_(mapnik.Expression("[name] != null").evaluate(feat),True)
- eq_(mapnik.Expression("[name] != true").evaluate(feat),True)
- eq_(mapnik.Expression("[name] != false").evaluate(feat),True)
-
- feat = fs.next()
- eq_(feat['gid'],2)
- eq_(feat['name'],'')
- eq_(mapnik.Expression("[name] = 'name'").evaluate(feat),False)
- eq_(mapnik.Expression("[name] = ''").evaluate(feat),True)
- eq_(mapnik.Expression("[name] = null").evaluate(feat),False)
- eq_(mapnik.Expression("[name] = true").evaluate(feat),False)
- eq_(mapnik.Expression("[name] = false").evaluate(feat),False)
- eq_(mapnik.Expression("[name] != 'name'").evaluate(feat),True)
- eq_(mapnik.Expression("[name] != ''").evaluate(feat),False)
- eq_(mapnik.Expression("[name] != null").evaluate(feat),True)
- eq_(mapnik.Expression("[name] != true").evaluate(feat),True)
- eq_(mapnik.Expression("[name] != false").evaluate(feat),True)
-
- feat = fs.next()
- eq_(feat['gid'],3)
- eq_(feat['name'],None) # null
- eq_(mapnik.Expression("[name] = 'name'").evaluate(feat),False)
- eq_(mapnik.Expression("[name] = ''").evaluate(feat),False)
- eq_(mapnik.Expression("[name] = null").evaluate(feat),True)
- eq_(mapnik.Expression("[name] = true").evaluate(feat),False)
- eq_(mapnik.Expression("[name] = false").evaluate(feat),False)
- eq_(mapnik.Expression("[name] != 'name'").evaluate(feat),True)
- # https://github.com/mapnik/mapnik/issues/1859
- eq_(mapnik.Expression("[name] != ''").evaluate(feat),False)
- eq_(mapnik.Expression("[name] != null").evaluate(feat),False)
- eq_(mapnik.Expression("[name] != true").evaluate(feat),True)
- eq_(mapnik.Expression("[name] != false").evaluate(feat),True)
-
- def test_null_comparision2():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='test10',
- geometry_field='geom')
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat['gid'],1)
- eq_(feat['bool_field'],True)
- eq_(mapnik.Expression("[bool_field] = 'name'").evaluate(feat),False)
- eq_(mapnik.Expression("[bool_field] = ''").evaluate(feat),False)
- eq_(mapnik.Expression("[bool_field] = null").evaluate(feat),False)
- eq_(mapnik.Expression("[bool_field] = true").evaluate(feat),True)
- eq_(mapnik.Expression("[bool_field] = false").evaluate(feat),False)
- eq_(mapnik.Expression("[bool_field] != 'name'").evaluate(feat),True)
- eq_(mapnik.Expression("[bool_field] != ''").evaluate(feat),True) # in 2.1.x used to be False
- eq_(mapnik.Expression("[bool_field] != null").evaluate(feat),True) # in 2.1.x used to be False
- eq_(mapnik.Expression("[bool_field] != true").evaluate(feat),False)
- eq_(mapnik.Expression("[bool_field] != false").evaluate(feat),True)
-
- feat = fs.next()
- eq_(feat['gid'],2)
- eq_(feat['bool_field'],False)
- eq_(mapnik.Expression("[bool_field] = 'name'").evaluate(feat),False)
- eq_(mapnik.Expression("[bool_field] = ''").evaluate(feat),False)
- eq_(mapnik.Expression("[bool_field] = null").evaluate(feat),False)
- eq_(mapnik.Expression("[bool_field] = true").evaluate(feat),False)
- eq_(mapnik.Expression("[bool_field] = false").evaluate(feat),True)
- eq_(mapnik.Expression("[bool_field] != 'name'").evaluate(feat),True)
- eq_(mapnik.Expression("[bool_field] != ''").evaluate(feat),True)
- eq_(mapnik.Expression("[bool_field] != null").evaluate(feat),True) # in 2.1.x used to be False
- eq_(mapnik.Expression("[bool_field] != true").evaluate(feat),True)
- eq_(mapnik.Expression("[bool_field] != false").evaluate(feat),False)
-
- feat = fs.next()
- eq_(feat['gid'],3)
- eq_(feat['bool_field'],None) # null
- eq_(mapnik.Expression("[bool_field] = 'name'").evaluate(feat),False)
- eq_(mapnik.Expression("[bool_field] = ''").evaluate(feat),False)
- eq_(mapnik.Expression("[bool_field] = null").evaluate(feat),True)
- eq_(mapnik.Expression("[bool_field] = true").evaluate(feat),False)
- eq_(mapnik.Expression("[bool_field] = false").evaluate(feat),False)
- eq_(mapnik.Expression("[bool_field] != 'name'").evaluate(feat),True) # in 2.1.x used to be False
- # https://github.com/mapnik/mapnik/issues/1859
- eq_(mapnik.Expression("[bool_field] != ''").evaluate(feat),False)
- eq_(mapnik.Expression("[bool_field] != null").evaluate(feat),False)
- eq_(mapnik.Expression("[bool_field] != true").evaluate(feat),True) # in 2.1.x used to be False
- eq_(mapnik.Expression("[bool_field] != false").evaluate(feat),True) # in 2.1.x used to be False
-
- # https://github.com/mapnik/mapnik/issues/1816
- def test_exception_message_reporting():
- try:
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='doesnotexist')
- except Exception, e:
- eq_(e.message != 'unidentifiable C++ exception', True)
-
- def test_null_id_field():
- opts = {'type':'postgis',
- 'dbname':MAPNIK_TEST_DBNAME,
- 'geometry_field':'geom',
- 'table':"(select null::bigint as osm_id, GeomFromEWKT('SRID=4326;POINT(0 0)') as geom) as tmp"}
- ds = mapnik.Datasource(**opts)
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat.id(),1L)
- eq_(feat['osm_id'],None)
-
- @raises(StopIteration)
- def test_null_key_field():
- opts = {'type':'postgis',
- "key_field": 'osm_id',
- 'dbname':MAPNIK_TEST_DBNAME,
- 'geometry_field':'geom',
- 'table':"(select null::bigint as osm_id, GeomFromEWKT('SRID=4326;POINT(0 0)') as geom) as tmp"}
- ds = mapnik.Datasource(**opts)
- fs = ds.featureset()
- feat = fs.next() ## should throw since key_field is null: StopIteration: No more features.
-
- def test_psql_error_should_not_break_connection_pool():
- # Bad request, will trigger an error when returning result
- ds_bad = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table="""(SELECT geom as geom,label::int from test11) as failure_table""",
- max_async_connection=5,geometry_field='geom',srid=4326)
-
- # Good request
- ds_good = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table="test",
- max_async_connection=5,geometry_field='geom',srid=4326)
-
- # This will/should trigger a PSQL error
- failed = False
- try:
- fs = ds_bad.featureset()
- for feature in fs:
- pass
- except RuntimeError:
- failed = True
-
- eq_(failed,True)
-
- # Should be ok
- fs = ds_good.featureset()
- count = 0
- for feature in fs:
- count += 1
- eq_(count,8)
-
-
- def test_psql_error_should_give_back_connections_opened_for_lower_layers_to_the_pool():
- map1 = mapnik.Map(600,300)
- s = mapnik.Style()
- r = mapnik.Rule()
- r.symbols.append(mapnik.PolygonSymbolizer())
- s.rules.append(r)
- map1.append_style('style',s)
-
- # This layer will fail after a while
- buggy_s = mapnik.Style()
- buggy_r = mapnik.Rule()
- buggy_r.symbols.append(mapnik.PolygonSymbolizer())
- buggy_r.filter = mapnik.Filter("[fips] = 'FR'")
- buggy_s.rules.append(buggy_r)
- map1.append_style('style for buggy layer',buggy_s)
- buggy_layer = mapnik.Layer('this layer is buggy at runtime')
- # We ensure the query wille be long enough
- buggy_layer.datasource = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='(SELECT geom as geom, pg_sleep(0.1), fips::int from world_merc) as failure_tabl',
- max_async_connection=2, max_size=2,asynchronous_request = True, geometry_field='geom')
- buggy_layer.styles.append('style for buggy layer')
-
- # The query for this layer will be sent, then the previous layer will raise an exception before results are read
- forced_canceled_layer = mapnik.Layer('this layer will be canceled when an exception stops map rendering')
- forced_canceled_layer.datasource = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='world_merc',
- max_async_connection=2, max_size=2, asynchronous_request = True, geometry_field='geom')
- forced_canceled_layer.styles.append('style')
-
- map1.layers.append(buggy_layer)
- map1.layers.append(forced_canceled_layer)
- map1.zoom_all()
- map2 = mapnik.Map(600,300)
- map2.background = mapnik.Color('steelblue')
- s = mapnik.Style()
- r = mapnik.Rule()
- r.symbols.append(mapnik.LineSymbolizer())
- r.symbols.append(mapnik.LineSymbolizer())
- s.rules.append(r)
- map2.append_style('style',s)
- layer1 = mapnik.Layer('layer1')
- layer1.datasource = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='world_merc',
- max_async_connection=2, max_size=2, asynchronous_request = True, geometry_field='geom')
- layer1.styles.append('style')
- map2.layers.append(layer1)
- map2.zoom_all()
-
- # We expect this to trigger a PSQL error
- try:
- mapnik.render_to_file(map1,'/tmp/mapnik-postgis-test-map1.png', 'png')
- # Test must fail if error was not raised just above
- eq_(False,True)
- except RuntimeError:
- pass
- # This used to raise an exception before correction of issue 2042
- mapnik.render_to_file(map2,'/tmp/mapnik-postgis-test-map2.png', 'png')
-
- def test_handling_of_zm_dimensions():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,
- table='(select gid,ST_CoordDim(geom) as dim,name,geom from test12) as tmp',
- geometry_field='geom')
- eq_(len(ds.fields()),3)
- eq_(ds.fields(),['gid', 'dim', 'name'])
- eq_(ds.field_types(),['int', 'int', 'str'])
- fs = ds.featureset()
- # Point (2d)
- feat = fs.next()
- eq_(feat.id(),1)
- eq_(feat['gid'],1)
- eq_(feat['dim'],2)
- eq_(feat['name'],'Point')
- geoms = feat.geometries()
- eq_(len(geoms),1)
- eq_(geoms[0].to_wkt(),'Point(0 0)')
- # PointZ
- feat = fs.next()
- eq_(feat.id(),2)
- eq_(feat['gid'],2)
- eq_(feat['dim'],3)
- eq_(feat['name'],'PointZ')
- geoms = feat.geometries()
- eq_(len(geoms),1)
- eq_(geoms[0].to_wkt(),'Point(0 0)')
- # PointM
- feat = fs.next()
- eq_(feat.id(),3)
- eq_(feat['gid'],3)
- eq_(feat['dim'],3)
- eq_(feat['name'],'PointM')
- geoms = feat.geometries()
- eq_(len(geoms),1)
- eq_(geoms[0].to_wkt(),'Point(0 0)')
- # PointZM
- feat = fs.next()
- eq_(feat.id(),4)
- eq_(feat['gid'],4)
- eq_(feat['dim'],4)
- eq_(feat['name'],'PointZM')
- geoms = feat.geometries()
- eq_(len(geoms),1)
- eq_(geoms[0].to_wkt(),'Point(0 0)')
- # MultiPoint
- feat = fs.next()
- eq_(feat.id(),5)
- eq_(feat['gid'],5)
- eq_(feat['dim'],2)
- eq_(feat['name'],'MultiPoint')
- geoms = feat.geometries()
- eq_(len(geoms),2)
- eq_(geoms[0].to_wkt(),'Point(0 0)')
- eq_(geoms[1].to_wkt(),'Point(1 1)')
- # MultiPointZ
- feat = fs.next()
- eq_(feat.id(),6)
- eq_(feat['gid'],6)
- eq_(feat['dim'],3)
- eq_(feat['name'],'MultiPointZ')
- geoms = feat.geometries()
- eq_(len(geoms),2)
- eq_(geoms[0].to_wkt(),'Point(0 0)')
- eq_(geoms[1].to_wkt(),'Point(1 1)')
- # MultiPointM
- feat = fs.next()
- eq_(feat.id(),7)
- eq_(feat['gid'],7)
- eq_(feat['dim'],3)
- eq_(feat['name'],'MultiPointM')
- geoms = feat.geometries()
- eq_(len(geoms),2)
- eq_(geoms[0].to_wkt(),'Point(0 0)')
- eq_(geoms[1].to_wkt(),'Point(1 1)')
- # MultiPointZM
- feat = fs.next()
- eq_(feat.id(),8)
- eq_(feat['gid'],8)
- eq_(feat['dim'],4)
- eq_(feat['name'],'MultiPointZM')
- geoms = feat.geometries()
- eq_(len(geoms),2)
- eq_(geoms[0].to_wkt(),'Point(0 0)')
- eq_(geoms[1].to_wkt(),'Point(1 1)')
- # LineString
- feat = fs.next()
- eq_(feat.id(),9)
- eq_(feat['gid'],9)
- eq_(feat['dim'],2)
- eq_(feat['name'],'LineString')
- geoms = feat.geometries()
- eq_(len(geoms),1)
- eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
- # LineStringZ
- feat = fs.next()
- eq_(feat.id(),10)
- eq_(feat['gid'],10)
- eq_(feat['dim'],3)
- eq_(feat['name'],'LineStringZ')
- geoms = feat.geometries()
- eq_(len(geoms),1)
- eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
- # LineStringM
- feat = fs.next()
- eq_(feat.id(),11)
- eq_(feat['gid'],11)
- eq_(feat['dim'],3)
- eq_(feat['name'],'LineStringM')
- geoms = feat.geometries()
- eq_(len(geoms),1)
- eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
- # LineStringZM
- feat = fs.next()
- eq_(feat.id(),12)
- eq_(feat['gid'],12)
- eq_(feat['dim'],4)
- eq_(feat['name'],'LineStringZM')
- geoms = feat.geometries()
- eq_(len(geoms),1)
- eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
- # Polygon
- feat = fs.next()
- eq_(feat.id(),13)
- eq_(feat['gid'],13)
- eq_(feat['name'],'Polygon')
- geoms = feat.geometries()
- eq_(len(geoms),1)
- eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
- # PolygonZ
- feat = fs.next()
- eq_(feat.id(),14)
- eq_(feat['gid'],14)
- eq_(feat['name'],'PolygonZ')
- geoms = feat.geometries()
- eq_(len(geoms),1)
- eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
- # PolygonM
- feat = fs.next()
- eq_(feat.id(),15)
- eq_(feat['gid'],15)
- eq_(feat['name'],'PolygonM')
- geoms = feat.geometries()
- eq_(len(geoms),1)
- eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
- # PolygonZM
- feat = fs.next()
- eq_(feat.id(),16)
- eq_(feat['gid'],16)
- eq_(feat['name'],'PolygonZM')
- geoms = feat.geometries()
- eq_(len(geoms),1)
- eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
- # MultiLineString
- feat = fs.next()
- eq_(feat.id(),17)
- eq_(feat['gid'],17)
- eq_(feat['name'],'MultiLineString')
- geoms = feat.geometries()
- eq_(len(geoms),2)
- eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
- eq_(geoms[1].to_wkt(),'LineString(2 2,3 3)')
- # MultiLineStringZ
- feat = fs.next()
- eq_(feat.id(),18)
- eq_(feat['gid'],18)
- eq_(feat['name'],'MultiLineStringZ')
- geoms = feat.geometries()
- eq_(len(geoms),2)
- eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
- eq_(geoms[1].to_wkt(),'LineString(2 2,3 3)')
- # MultiLineStringM
- feat = fs.next()
- eq_(feat.id(),19)
- eq_(feat['gid'],19)
- eq_(feat['name'],'MultiLineStringM')
- geoms = feat.geometries()
- eq_(len(geoms),2)
- eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
- eq_(geoms[1].to_wkt(),'LineString(2 2,3 3)')
- # MultiLineStringZM
- feat = fs.next()
- eq_(feat.id(),20)
- eq_(feat['gid'],20)
- eq_(feat['name'],'MultiLineStringZM')
- geoms = feat.geometries()
- eq_(len(geoms),2)
- eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
- eq_(geoms[1].to_wkt(),'LineString(2 2,3 3)')
- # MultiPolygon
- feat = fs.next()
- eq_(feat.id(),21)
- eq_(feat['gid'],21)
- eq_(feat['name'],'MultiPolygon')
- geoms = feat.geometries()
- eq_(len(geoms),2)
- eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
- eq_(geoms[1].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
- # MultiPolygonZ
- feat = fs.next()
- eq_(feat.id(),22)
- eq_(feat['gid'],22)
- eq_(feat['name'],'MultiPolygonZ')
- geoms = feat.geometries()
- eq_(len(geoms),2)
- eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
- eq_(geoms[1].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
- # MultiPolygonM
- feat = fs.next()
- eq_(feat.id(),23)
- eq_(feat['gid'],23)
- eq_(feat['name'],'MultiPolygonM')
- geoms = feat.geometries()
- eq_(len(geoms),2)
- eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
- eq_(geoms[1].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
- # MultiPolygonZM
- feat = fs.next()
- eq_(feat.id(),24)
- eq_(feat['gid'],24)
- eq_(feat['name'],'MultiPolygonZM')
- geoms = feat.geometries()
- eq_(len(geoms),2)
- eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
- eq_(geoms[1].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
-
- def test_variable_in_subquery1():
- ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='''
- (select * from test where @zoom = 30 ) as tmp''',
- geometry_field='geom', srid=4326,
- autodetect_key_field=True)
- fs = ds.featureset(variables={'zoom':30})
- for id in range(1,5):
- eq_(fs.next().id(),id)
-
-
- atexit.register(postgis_takedown)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/projection_test.py b/tests/python_tests/projection_test.py
deleted file mode 100644
index e45b37d..0000000
--- a/tests/python_tests/projection_test.py
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-
-import mapnik
-import random
-import math
-from utilities import run_all
-
-# Tests that exercise map projections.
-
-def test_normalizing_definition():
- p = mapnik.Projection('+init=epsg:4326')
- expanded = p.expanded()
- eq_('+proj=longlat' in expanded,True)
-
-
-# Trac Ticket #128
-def test_wgs84_inverse_forward():
- p = mapnik.Projection('+init=epsg:4326')
-
- c = mapnik.Coord(3.01331418311, 43.3333092669)
- e = mapnik.Box2d(-122.54345245, 45.12312553, 68.2335581353, 48.231231233)
-
- # It appears that the y component changes very slightly, is this OK?
- # so we test for 'almost equal float values'
-
- assert_almost_equal(p.inverse(c).y, c.y)
- assert_almost_equal(p.inverse(c).x, c.x)
-
- assert_almost_equal(p.forward(c).y, c.y)
- assert_almost_equal(p.forward(c).x, c.x)
-
- assert_almost_equal(p.inverse(e).center().y, e.center().y)
- assert_almost_equal(p.inverse(e).center().x, e.center().x)
-
- assert_almost_equal(p.forward(e).center().y, e.center().y)
- assert_almost_equal(p.forward(e).center().x, e.center().x)
-
- assert_almost_equal(c.inverse(p).y, c.y)
- assert_almost_equal(c.inverse(p).x, c.x)
-
- assert_almost_equal(c.forward(p).y, c.y)
- assert_almost_equal(c.forward(p).x, c.x)
-
- assert_almost_equal(e.inverse(p).center().y, e.center().y)
- assert_almost_equal(e.inverse(p).center().x, e.center().x)
-
- assert_almost_equal(e.forward(p).center().y, e.center().y)
- assert_almost_equal(e.forward(p).center().x, e.center().x)
-
-def wgs2merc(lon,lat):
- x = lon * 20037508.34 / 180;
- y = math.log(math.tan((90 + lat) * math.pi / 360)) / (math.pi / 180);
- y = y * 20037508.34 / 180;
- return [x,y];
-
-def merc2wgs(x,y):
- x = (x / 20037508.34) * 180;
- y = (y / 20037508.34) * 180;
- y = 180 / math.pi * (2 * math.atan(math.exp(y * math.pi/180)) - math.pi/2);
- if x > 180: x = 180;
- if x < -180: x = -180;
- if y > 85.0511: y = 85.0511;
- if y < -85.0511: y = -85.0511;
- return [x,y]
-
-#echo -109 37 | cs2cs -f "%.10f" +init=epsg:4326 +to +init=epsg:3857
-#-12133824.4964668211 4439106.7872505859 0.0000000000
-
-## todo
-# benchmarks
-# better well known detection
-# better srs matching with strip/trim
-# python copy to avoid crash
-
-def test_proj_transform_between_init_and_literal():
- one = mapnik.Projection('+init=epsg:4326')
- two = mapnik.Projection('+init=epsg:3857')
- tr1 = mapnik.ProjTransform(one,two)
- tr1b = mapnik.ProjTransform(two,one)
- wgs84 = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
- merc = '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over'
- src = mapnik.Projection(wgs84)
- dest = mapnik.Projection(merc)
- tr2 = mapnik.ProjTransform(src,dest)
- tr2b = mapnik.ProjTransform(dest,src)
- for x in xrange(-180,180,10):
- for y in xrange(-60,60,10):
- coord = mapnik.Coord(x,y)
- merc_coord1 = tr1.forward(coord)
- merc_coord2 = tr1b.backward(coord)
- merc_coord3 = tr2.forward(coord)
- merc_coord4 = tr2b.backward(coord)
- eq_(math.fabs(merc_coord1.x - merc_coord1.x) < 1,True)
- eq_(math.fabs(merc_coord1.x - merc_coord2.x) < 1,True)
- eq_(math.fabs(merc_coord1.x - merc_coord3.x) < 1,True)
- eq_(math.fabs(merc_coord1.x - merc_coord4.x) < 1,True)
- eq_(math.fabs(merc_coord1.y - merc_coord1.y) < 1,True)
- eq_(math.fabs(merc_coord1.y - merc_coord2.y) < 1,True)
- eq_(math.fabs(merc_coord1.y - merc_coord3.y) < 1,True)
- eq_(math.fabs(merc_coord1.y - merc_coord4.y) < 1,True)
- lon_lat_coord1 = tr1.backward(merc_coord1)
- lon_lat_coord2 = tr1b.forward(merc_coord2)
- lon_lat_coord3 = tr2.backward(merc_coord3)
- lon_lat_coord4 = tr2b.forward(merc_coord4)
- eq_(math.fabs(coord.x - lon_lat_coord1.x) < 1,True)
- eq_(math.fabs(coord.x - lon_lat_coord2.x) < 1,True)
- eq_(math.fabs(coord.x - lon_lat_coord3.x) < 1,True)
- eq_(math.fabs(coord.x - lon_lat_coord4.x) < 1,True)
- eq_(math.fabs(coord.y - lon_lat_coord1.y) < 1,True)
- eq_(math.fabs(coord.y - lon_lat_coord2.y) < 1,True)
- eq_(math.fabs(coord.y - lon_lat_coord3.y) < 1,True)
- eq_(math.fabs(coord.y - lon_lat_coord4.y) < 1,True)
-
-
-if __name__ == "__main__":
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/python_plugin_test.py b/tests/python_tests/python_plugin_test.py
deleted file mode 100644
index a39272f..0000000
--- a/tests/python_tests/python_plugin_test.py
+++ /dev/null
@@ -1,160 +0,0 @@
-# #!/usr/bin/env python
-# # -*- coding: utf-8 -*-
-
-# import os
-# import math
-# import mapnik
-# import sys
-# from utilities import execution_path, run_all
-# from nose.tools import *
-
-# def setup():
-# # All of the paths used are relative, if we run the tests
-# # from another directory we need to chdir()
-# os.chdir(execution_path('.'))
-
-# class PointDatasource(mapnik.PythonDatasource):
-# def __init__(self):
-# super(PointDatasource, self).__init__(
-# geometry_type = mapnik.DataGeometryType.Point,
-# envelope = mapnik.Box2d(0,-10,100,110),
-# data_type = mapnik.DataType.Vector
-# )
-
-# def features(self, query):
-# return mapnik.PythonDatasource.wkt_features(
-# keys = ('label',),
-# features = (
-# ( 'POINT (5 6)', { 'label': 'foo-bar'} ),
-# ( 'POINT (60 50)', { 'label': 'buzz-quux'} ),
-# )
-# )
-
-# class ConcentricCircles(object):
-# def __init__(self, centre, bounds, step=1):
-# self.centre = centre
-# self.bounds = bounds
-# self.step = step
-
-# class Iterator(object):
-# def __init__(self, container):
-# self.container = container
-
-# centre = self.container.centre
-# bounds = self.container.bounds
-# step = self.container.step
-
-# self.radius = step
-
-# def next(self):
-# points = []
-# for alpha in xrange(0, 361, 5):
-# x = math.sin(math.radians(alpha)) * self.radius + self.container.centre[0]
-# y = math.cos(math.radians(alpha)) * self.radius + self.container.centre[1]
-# points.append('%s %s' % (x,y))
-# circle = 'POLYGON ((' + ','.join(points) + '))'
-
-# # has the circle grown so large that the boundary is entirely within it?
-# tl = (self.container.bounds.maxx, self.container.bounds.maxy)
-# tr = (self.container.bounds.maxx, self.container.bounds.maxy)
-# bl = (self.container.bounds.minx, self.container.bounds.miny)
-# br = (self.container.bounds.minx, self.container.bounds.miny)
-# def within_circle(p):
-# delta_x = p[0] - self.container.centre[0]
-# delta_y = p[0] - self.container.centre[0]
-# return delta_x*delta_x + delta_y*delta_y < self.radius*self.radius
-
-# if all(within_circle(p) for p in (tl,tr,bl,br)):
-# raise StopIteration()
-
-# self.radius += self.container.step
-# return ( circle, { } )
-
-# def __iter__(self):
-# return ConcentricCircles.Iterator(self)
-
-# class CirclesDatasource(mapnik.PythonDatasource):
-# def __init__(self, centre_x=-20, centre_y=0, step=10):
-# super(CirclesDatasource, self).__init__(
-# geometry_type = mapnik.DataGeometryType.Polygon,
-# envelope = mapnik.Box2d(-180, -90, 180, 90),
-# data_type = mapnik.DataType.Vector
-# )
-
-# # note that the plugin loader will set all arguments to strings and will not try to parse them
-# centre_x = int(centre_x)
-# centre_y = int(centre_y)
-# step = int(step)
-
-# self.centre_x = centre_x
-# self.centre_y = centre_y
-# self.step = step
-
-# def features(self, query):
-# centre = (self.centre_x, self.centre_y)
-
-# return mapnik.PythonDatasource.wkt_features(
-# keys = (),
-# features = ConcentricCircles(centre, query.bbox, self.step)
-# )
-
-# if 'python' in mapnik.DatasourceCache.plugin_names():
-# # make sure we can load from ourself as a module
-# sys.path.append(execution_path('.'))
-
-# def test_python_point_init():
-# ds = mapnik.Python(factory='python_plugin_test:PointDatasource')
-# e = ds.envelope()
-
-# assert_almost_equal(e.minx, 0, places=7)
-# assert_almost_equal(e.miny, -10, places=7)
-# assert_almost_equal(e.maxx, 100, places=7)
-# assert_almost_equal(e.maxy, 110, places=7)
-
-# def test_python_circle_init():
-# ds = mapnik.Python(factory='python_plugin_test:CirclesDatasource')
-# e = ds.envelope()
-
-# assert_almost_equal(e.minx, -180, places=7)
-# assert_almost_equal(e.miny, -90, places=7)
-# assert_almost_equal(e.maxx, 180, places=7)
-# assert_almost_equal(e.maxy, 90, places=7)
-
-# def test_python_circle_init_with_args():
-# ds = mapnik.Python(factory='python_plugin_test:CirclesDatasource', centre_x=40, centre_y=7)
-# e = ds.envelope()
-
-# assert_almost_equal(e.minx, -180, places=7)
-# assert_almost_equal(e.miny, -90, places=7)
-# assert_almost_equal(e.maxx, 180, places=7)
-# assert_almost_equal(e.maxy, 90, places=7)
-
-# def test_python_point_rendering():
-# m = mapnik.Map(512,512)
-# mapnik.load_map(m,'../data/python_plugin/python_point_datasource.xml')
-# m.zoom_all()
-# im = mapnik.Image(512,512)
-# mapnik.render(m,im)
-# actual = '/tmp/mapnik-python-point-render1.png'
-# expected = 'images/support/mapnik-python-point-render1.png'
-# im.save(actual)
-# expected_im = mapnik.Image.open(expected)
-# eq_(im.tostring('png32'),expected_im.tostring('png32'),
-# 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
-
-# def test_python_circle_rendering():
-# m = mapnik.Map(512,512)
-# mapnik.load_map(m,'../data/python_plugin/python_circle_datasource.xml')
-# m.zoom_all()
-# im = mapnik.Image(512,512)
-# mapnik.render(m,im)
-# actual = '/tmp/mapnik-python-circle-render1.png'
-# expected = 'images/support/mapnik-python-circle-render1.png'
-# im.save(actual)
-# expected_im = mapnik.Image.open(expected)
-# eq_(im.tostring('png32'),expected_im.tostring('png32'),
-# 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
-
-# if __name__ == "__main__":
-# setup()
-# run_all(eval(x) for x in dir() if x.startswith("test_"))
diff --git a/tests/python_tests/query_test.py b/tests/python_tests/query_test.py
deleted file mode 100644
index 6138f6e..0000000
--- a/tests/python_tests/query_test.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import os, mapnik
-
-from nose.tools import *
-from utilities import execution_path, run_all
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def test_query_init():
- bbox = (-180, -90, 180, 90)
- query = mapnik.Query(mapnik.Box2d(*bbox))
- r = query.resolution
- assert_almost_equal(r[0], 1.0, places=7)
- assert_almost_equal(r[1], 1.0, places=7)
- # https://github.com/mapnik/mapnik/issues/1762
- eq_(query.property_names,[])
- query.add_property_name('migurski')
- eq_(query.property_names,['migurski'])
-
-# Converting *from* tuples *to* resolutions is not yet supported
- at raises(TypeError)
-def test_query_resolution():
- bbox = (-180, -90, 180, 90)
- init_res = (4.5, 6.7)
- query = mapnik.Query(mapnik.Box2d(*bbox), init_res)
- r = query.resolution
- assert_almost_equal(r[0], init_res[0], places=7)
- assert_almost_equal(r[1], init_res[1], places=7)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/query_tolerance_test.py b/tests/python_tests/query_tolerance_test.py
deleted file mode 100644
index 420d180..0000000
--- a/tests/python_tests/query_tolerance_test.py
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import os, mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-if 'shape' in mapnik.DatasourceCache.plugin_names():
- def test_query_tolerance():
- srs = '+init=epsg:4326'
- lyr = mapnik.Layer('test')
- ds = mapnik.Shapefile(file='../data/shp/arrows.shp')
- lyr.datasource = ds
- lyr.srs = srs
- _width = 256
- _map = mapnik.Map(_width,_width, srs)
- _map.layers.append(lyr)
- # zoom determines tolerance
- _map.zoom_all()
- _map_env = _map.envelope()
- tol = (_map_env.maxx - _map_env.minx) / _width * 3
- # 0.046875 for arrows.shp and zoom_all
- eq_(tol,0.046875)
- # check point really exists
- x, y = 2.0, 4.0
- features = _map.query_point(0,x,y).features
- eq_(len(features),1)
- # check inside tolerance limit
- x = 2.0 + tol * 0.9
- features = _map.query_point(0,x,y).features
- eq_(len(features),1)
- # check outside tolerance limit
- x = 2.0 + tol * 1.1
- features = _map.query_point(0,x,y).features
- eq_(len(features),0)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/raster_colorizer_test.py b/tests/python_tests/raster_colorizer_test.py
deleted file mode 100644
index e0284d2..0000000
--- a/tests/python_tests/raster_colorizer_test.py
+++ /dev/null
@@ -1,90 +0,0 @@
-#coding=utf8
-import os
-import mapnik
-from utilities import execution_path, run_all
-from nose.tools import *
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-#test discrete colorizer mode
-def test_get_color_discrete():
- #setup
- colorizer = mapnik.RasterColorizer();
- colorizer.default_color = mapnik.Color(0,0,0,0);
- colorizer.default_mode = mapnik.COLORIZER_DISCRETE;
-
- colorizer.add_stop(10, mapnik.Color(100,100,100,100));
- colorizer.add_stop(20, mapnik.Color(200,200,200,200));
-
- #should be default colour
- eq_(colorizer.get_color(-50), mapnik.Color(0,0,0,0));
- eq_(colorizer.get_color(0), mapnik.Color(0,0,0,0));
-
- #now in stop 1
- eq_(colorizer.get_color(10), mapnik.Color(100,100,100,100));
- eq_(colorizer.get_color(19), mapnik.Color(100,100,100,100));
-
- #now in stop 2
- eq_(colorizer.get_color(20), mapnik.Color(200,200,200,200));
- eq_(colorizer.get_color(1000), mapnik.Color(200,200,200,200));
-
-#test exact colorizer mode
-def test_get_color_exact():
- #setup
- colorizer = mapnik.RasterColorizer();
- colorizer.default_color = mapnik.Color(0,0,0,0);
- colorizer.default_mode = mapnik.COLORIZER_EXACT;
-
- colorizer.add_stop(10, mapnik.Color(100,100,100,100));
- colorizer.add_stop(20, mapnik.Color(200,200,200,200));
-
- #should be default colour
- eq_(colorizer.get_color(-50), mapnik.Color(0,0,0,0));
- eq_(colorizer.get_color(11), mapnik.Color(0,0,0,0));
- eq_(colorizer.get_color(20.001), mapnik.Color(0,0,0,0));
-
- #should be stop 1
- eq_(colorizer.get_color(10), mapnik.Color(100,100,100,100));
-
- #should be stop 2
- eq_(colorizer.get_color(20), mapnik.Color(200,200,200,200));
-
-#test linear colorizer mode
-def test_get_color_linear():
- #setup
- colorizer = mapnik.RasterColorizer();
- colorizer.default_color = mapnik.Color(0,0,0,0);
- colorizer.default_mode = mapnik.COLORIZER_LINEAR;
-
- colorizer.add_stop(10, mapnik.Color(100,100,100,100));
- colorizer.add_stop(20, mapnik.Color(200,200,200,200));
-
- #should be default colour
- eq_(colorizer.get_color(-50), mapnik.Color(0,0,0,0));
- eq_(colorizer.get_color(9.9), mapnik.Color(0,0,0,0));
-
- #should be stop 1
- eq_(colorizer.get_color(10), mapnik.Color(100,100,100,100));
-
- #should be stop 2
- eq_(colorizer.get_color(20), mapnik.Color(200,200,200,200));
-
- #half way between stops 1 and 2
- eq_(colorizer.get_color(15), mapnik.Color(150,150,150,150));
-
- #after stop 2
- eq_(colorizer.get_color(100), mapnik.Color(200,200,200,200));
-
-def test_stop_label():
- stop = mapnik.ColorizerStop(1, mapnik.COLORIZER_LINEAR, mapnik.Color('red'))
- assert not stop.label
- label = u"32º C".encode('utf8')
- stop.label = label
- assert stop.label == label, stop.label
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/raster_symbolizer_test.py b/tests/python_tests/raster_symbolizer_test.py
deleted file mode 100644
index 2c7ba1d..0000000
--- a/tests/python_tests/raster_symbolizer_test.py
+++ /dev/null
@@ -1,199 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-from utilities import execution_path, run_all, contains_word, get_unique_colors
-
-import os, mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-
-def test_dataraster_coloring():
- srs = '+init=epsg:32630'
- lyr = mapnik.Layer('dataraster')
- if 'gdal' in mapnik.DatasourceCache.plugin_names():
- lyr.datasource = mapnik.Gdal(
- file = '../data/raster/dataraster.tif',
- band = 1,
- )
- lyr.srs = srs
- _map = mapnik.Map(256,256, srs)
- style = mapnik.Style()
- rule = mapnik.Rule()
- sym = mapnik.RasterSymbolizer()
- # Assigning a colorizer to the RasterSymbolizer tells the later
- # that it should use it to colorize the raw data raster
- colorizer = mapnik.RasterColorizer(mapnik.COLORIZER_DISCRETE, mapnik.Color("transparent"))
-
- for value, color in [
- ( 0, "#0044cc"),
- ( 10, "#00cc00"),
- ( 20, "#ffff00"),
- ( 30, "#ff7f00"),
- ( 40, "#ff0000"),
- ( 50, "#ff007f"),
- ( 60, "#ff00ff"),
- ( 70, "#cc00cc"),
- ( 80, "#990099"),
- ( 90, "#660066"),
- ( 200, "transparent"),
- ]:
- colorizer.add_stop(value, mapnik.Color(color))
- sym.colorizer = colorizer;
- rule.symbols.append(sym)
- style.rules.append(rule)
- _map.append_style('foo', style)
- lyr.styles.append('foo')
- _map.layers.append(lyr)
- _map.zoom_to_box(lyr.envelope())
-
- im = mapnik.Image(_map.width,_map.height)
- mapnik.render(_map, im)
- imdata = im.tostring()
- # we have some values in the [20,30) interval so check that they're colored
- assert contains_word('\xff\xff\x00\xff', imdata)
-
-def test_dataraster_query_point():
- srs = '+init=epsg:32630'
- lyr = mapnik.Layer('dataraster')
- if 'gdal' in mapnik.DatasourceCache.plugin_names():
- lyr.datasource = mapnik.Gdal(
- file = '../data/raster/dataraster.tif',
- band = 1,
- )
- lyr.srs = srs
- _map = mapnik.Map(256,256, srs)
- _map.layers.append(lyr)
-
- x, y = 556113.0,4381428.0 # center of extent of raster
- _map.zoom_all()
- features = _map.query_point(0,x,y).features
- assert len(features) == 1
- feat = features[0]
- center = feat.envelope().center()
- assert center.x==x and center.y==y, center
- value = feat['value']
- assert value == 18.0, value
-
- # point inside map extent but outside raster extent
- current_box = _map.envelope()
- current_box.expand_to_include(-427417,4477517)
- _map.zoom_to_box(current_box)
- features = _map.query_point(0,-427417,4477517).features
- assert len(features) == 0
-
- # point inside raster extent with nodata
- features = _map.query_point(0,126850,4596050).features
- assert len(features) == 0
-
-def test_load_save_map():
- map = mapnik.Map(256,256)
- in_map = "../visual_tests/styles/raster_symbolizer.xml"
- try:
- mapnik.load_map(map, in_map)
-
- out_map = mapnik.save_map_to_string(map)
- assert 'RasterSymbolizer' in out_map
- assert 'RasterColorizer' in out_map
- assert 'stop' in out_map
- except RuntimeError, e:
- # only test datasources that we have installed
- if not 'Could not create datasource' in str(e):
- raise RuntimeError(str(e))
-
-def test_raster_with_alpha_blends_correctly_with_background():
- WIDTH = 500
- HEIGHT = 500
-
- map = mapnik.Map(WIDTH, HEIGHT)
- WHITE = mapnik.Color(255, 255, 255)
- map.background = WHITE
-
- style = mapnik.Style()
- rule = mapnik.Rule()
- symbolizer = mapnik.RasterSymbolizer()
- symbolizer.scaling = mapnik.scaling_method.BILINEAR
-
- rule.symbols.append(symbolizer)
- style.rules.append(rule)
-
- map.append_style('raster_style', style)
-
- map_layer = mapnik.Layer('test_layer')
- filepath = '../data/raster/white-alpha.png'
- if 'gdal' in mapnik.DatasourceCache.plugin_names():
- map_layer.datasource = mapnik.Gdal(file=filepath)
- map_layer.styles.append('raster_style')
- map.layers.append(map_layer)
-
- map.zoom_all()
-
- mim = mapnik.Image(WIDTH, HEIGHT)
-
- mapnik.render(map, mim)
- imdata = mim.tostring()
- # All white is expected
- eq_(get_unique_colors(mim),['rgba(254,254,254,255)'])
-
-def test_raster_warping():
- lyrSrs = "+init=epsg:32630"
- mapSrs = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
- lyr = mapnik.Layer('dataraster', lyrSrs)
- if 'gdal' in mapnik.DatasourceCache.plugin_names():
- lyr.datasource = mapnik.Gdal(
- file = '../data/raster/dataraster.tif',
- band = 1,
- )
- sym = mapnik.RasterSymbolizer()
- sym.colorizer = mapnik.RasterColorizer(mapnik.COLORIZER_DISCRETE, mapnik.Color(255,255,0))
- rule = mapnik.Rule()
- rule.symbols.append(sym)
- style = mapnik.Style()
- style.rules.append(rule)
- _map = mapnik.Map(256,256, mapSrs)
- _map.append_style('foo', style)
- lyr.styles.append('foo')
- _map.layers.append(lyr)
- map_proj = mapnik.Projection(mapSrs)
- layer_proj = mapnik.Projection(lyrSrs)
- prj_trans = mapnik.ProjTransform(map_proj,
- layer_proj)
- _map.zoom_to_box(prj_trans.backward(lyr.envelope()))
-
- im = mapnik.Image(_map.width,_map.height)
- mapnik.render(_map, im)
- imdata = im.tostring()
- assert contains_word('\xff\xff\x00\xff', imdata)
-
-def test_raster_warping_does_not_overclip_source():
- lyrSrs = "+init=epsg:32630"
- mapSrs = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
- lyr = mapnik.Layer('dataraster', lyrSrs)
- if 'gdal' in mapnik.DatasourceCache.plugin_names():
- lyr.datasource = mapnik.Gdal(
- file = '../data/raster/dataraster.tif',
- band = 1,
- )
- sym = mapnik.RasterSymbolizer()
- sym.colorizer = mapnik.RasterColorizer(mapnik.COLORIZER_DISCRETE, mapnik.Color(255,255,0))
- rule = mapnik.Rule()
- rule.symbols.append(sym)
- style = mapnik.Style()
- style.rules.append(rule)
- _map = mapnik.Map(256,256, mapSrs)
- _map.background=mapnik.Color('white')
- _map.append_style('foo', style)
- lyr.styles.append('foo')
- _map.layers.append(lyr)
- _map.zoom_to_box(mapnik.Box2d(3,42,4,43))
-
- im = mapnik.Image(_map.width,_map.height)
- mapnik.render(_map, im)
- assert im.view(0,200,1,1).tostring()=='\xff\xff\x00\xff'
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/render_grid_test.py b/tests/python_tests/render_grid_test.py
deleted file mode 100644
index c60b4c2..0000000
--- a/tests/python_tests/render_grid_test.py
+++ /dev/null
@@ -1,355 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import os, mapnik
-
-try:
- import json
-except ImportError:
- import simplejson as json
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-if mapnik.has_grid_renderer():
- def show_grids(name,g1,g2):
- g1_file = '/tmp/mapnik-%s-actual.json' % name
- open(g1_file,'w').write(json.dumps(g1,sort_keys=True))
- g2_file = '/tmp/mapnik-%s-expected.json' % name
- open(g2_file,'w').write(json.dumps(g2,sort_keys=True))
- val = 'JSON does not match ->\n'
- if g1['grid'] != g2['grid']:
- val += ' X grid does not match\n'
- else:
- val += ' ✓ grid matches\n'
- if g1['data'].keys() != g2['data'].keys():
- val += ' X data does not match\n'
- else:
- val += ' ✓ data matches\n'
- if g1['keys'] != g2['keys']:
- val += ' X keys do not\n'
- else:
- val += ' ✓ keys match\n'
- val += '\n\t%s\n\t%s' % (g1_file,g2_file)
- return val
-
- def show_grids2(name,g1,g2):
- g2_expected = '../data/grids/mapnik-%s-actual.json' % name
- if not os.path.exists(g2_expected):
- # create test fixture based on actual results
- open(g2_expected,'a+').write(json.dumps(g1,sort_keys=True))
- return
- g1_file = '/tmp/mapnik-%s-actual.json' % name
- open(g1_file,'w').write(json.dumps(g1,sort_keys=True))
- val = 'JSON does not match ->\n'
- if g1['grid'] != g2['grid']:
- val += ' X grid does not match\n'
- else:
- val += ' ✓ grid matches\n'
- if g1['data'].keys() != g2['data'].keys():
- val += ' X data does not match\n'
- else:
- val += ' ✓ data matches\n'
- if g1['keys'] != g2['keys']:
- val += ' X keys do not\n'
- else:
- val += ' ✓ keys match\n'
- val += '\n\t%s\n\t%s' % (g1_file,g2_expected)
- return val
-
- # previous rendering using agg ellipse directly
- grid_correct_new = {"data": {"North East": {"Name": "North East"}, "North West": {"Name": "North West"}, "South East": {"Name": "South East"}, "South West": {"Name": "South West"}}, "grid": [" ", " ", " ", " ", " [...]
-
- # newer rendering using svg
- grid_correct_new2 = {"data": {"North East": {"Name": "North East"}, "North West": {"Name": "North West"}, "South East": {"Name": "South East"}, "South West": {"Name": "South West"}}, "grid": [" ", " ", " ", " ", " [...]
-
- grid_correct_new3 = {"data": {"North East": {"Name": "North East"}, "North West": {"Name": "North West"}, "South East": {"Name": "South East"}, "South West": {"Name": "South West"}}, "grid": [" ", " ", " ", " ", " [...]
-
- def resolve(grid,row,col):
- """ Resolve the attributes for a given pixel in a grid.
- """
- row = grid['grid'][row]
- utf_val = row[col]
- #http://docs.python.org/library/functions.html#ord
- codepoint = ord(utf_val)
- if (codepoint >= 93):
- codepoint-=1
- if (codepoint >= 35):
- codepoint-=1
- codepoint -= 32
- key = grid['keys'][codepoint]
- return grid['data'].get(key)
-
-
- def create_grid_map(width,height,sym):
- ds = mapnik.MemoryDatasource()
- context = mapnik.Context()
- context.push('Name')
- f = mapnik.Feature(context,1)
- f['Name'] = 'South East'
- f.add_geometries_from_wkt('POINT (143.10 -38.60)')
- ds.add_feature(f)
-
- f = mapnik.Feature(context,2)
- f['Name'] = 'South West'
- f.add_geometries_from_wkt('POINT (142.48 -38.60)')
- ds.add_feature(f)
-
- f = mapnik.Feature(context,3)
- f['Name'] = 'North West'
- f.add_geometries_from_wkt('POINT (142.48 -38.38)')
- ds.add_feature(f)
-
- f = mapnik.Feature(context,4)
- f['Name'] = 'North East'
- f.add_geometries_from_wkt('POINT (143.10 -38.38)')
- ds.add_feature(f)
- s = mapnik.Style()
- r = mapnik.Rule()
- sym.allow_overlap = True
- r.symbols.append(sym)
- s.rules.append(r)
- lyr = mapnik.Layer('Places')
- lyr.datasource = ds
- lyr.styles.append('places_labels')
- m = mapnik.Map(width,height)
- m.append_style('places_labels',s)
- m.layers.append(lyr)
- return m
-
-
- def test_render_grid():
- """ test render_grid method"""
- width,height = 256,256
- sym = mapnik.MarkersSymbolizer()
- sym.width = mapnik.Expression('10')
- sym.height = mapnik.Expression('10')
- m = create_grid_map(width,height,sym)
- ul_lonlat = mapnik.Coord(142.30,-38.20)
- lr_lonlat = mapnik.Coord(143.40,-38.80)
- m.zoom_to_box(mapnik.Box2d(ul_lonlat,lr_lonlat))
-
- # new method
- grid = mapnik.Grid(m.width,m.height,key='Name')
- mapnik.render_layer(m,grid,layer=0,fields=['Name'])
- utf1 = grid.encode('utf',resolution=4)
- eq_(utf1,grid_correct_new3,show_grids('new-markers',utf1,grid_correct_new3))
-
- # check a full view is the same as a full image
- grid_view = grid.view(0,0,width,height)
- # for kicks check at full res too
- utf3 = grid.encode('utf',resolution=1)
- utf4 = grid_view.encode('utf',resolution=1)
- eq_(utf3['grid'],utf4['grid'])
- eq_(utf3['keys'],utf4['keys'])
- eq_(utf3['data'],utf4['data'])
-
- eq_(resolve(utf4,0,0),None)
-
- # resolve some center points in the
- # resampled view
- utf5 = grid_view.encode('utf',resolution=4)
- eq_(resolve(utf5,25,10),{"Name": "North West"})
- eq_(resolve(utf5,25,46),{"Name": "North East"})
- eq_(resolve(utf5,38,10),{"Name": "South West"})
- eq_(resolve(utf5,38,46),{"Name": "South East"})
-
-
- grid_feat_id = {'keys': ['', '3', '4', '2', '1'], 'data': {'1': {'Name': 'South East'}, '3': {'Name': u'North West'}, '2': {'Name': 'South West'}, '4': {'Name': 'North East'}}, 'grid': [' ', ' ', ' ', ' ', ' [...]
-
- grid_feat_id2 = {"data": {"1": {"Name": "South East"}, "2": {"Name": "South West"}, "3": {"Name": "North West"}, "4": {"Name": "North East"}}, "grid": [" ", " ", " ", " ", " [...]
-
- grid_feat_id3 = {"data": {"1": {"Name": "South East", "__id__": 1}, "2": {"Name": "South West", "__id__": 2}, "3": {"Name": "North West", "__id__": 3}, "4": {"Name": "North East", "__id__": 4}}, "grid": [" ", " ", " ", " ", " [...]
-
- def test_render_grid3():
- """ test using feature id"""
- width,height = 256,256
- sym = mapnik.MarkersSymbolizer()
- sym.width = mapnik.Expression('10')
- sym.height = mapnik.Expression('10')
- m = create_grid_map(width,height,sym)
- ul_lonlat = mapnik.Coord(142.30,-38.20)
- lr_lonlat = mapnik.Coord(143.40,-38.80)
- m.zoom_to_box(mapnik.Box2d(ul_lonlat,lr_lonlat))
-
- grid = mapnik.Grid(m.width,m.height,key='__id__')
- mapnik.render_layer(m,grid,layer=0,fields=['__id__','Name'])
- utf1 = grid.encode('utf',resolution=4)
- eq_(utf1,grid_feat_id3,show_grids('id-markers',utf1,grid_feat_id3))
- # check a full view is the same as a full image
- grid_view = grid.view(0,0,width,height)
- # for kicks check at full res too
- utf3 = grid.encode('utf',resolution=1)
- utf4 = grid_view.encode('utf',resolution=1)
- eq_(utf3['grid'],utf4['grid'])
- eq_(utf3['keys'],utf4['keys'])
- eq_(utf3['data'],utf4['data'])
-
- eq_(resolve(utf4,0,0),None)
-
- # resolve some center points in the
- # resampled view
- utf5 = grid_view.encode('utf',resolution=4)
- eq_(resolve(utf5,25,10),{"Name": "North West","__id__": 3})
- eq_(resolve(utf5,25,46),{"Name": "North East","__id__": 4})
- eq_(resolve(utf5,38,10),{"Name": "South West","__id__": 2})
- eq_(resolve(utf5,38,46),{"Name": "South East","__id__": 1})
-
-
- def gen_grid_for_id(pixel_key):
- ds = mapnik.MemoryDatasource()
- context = mapnik.Context()
- context.push('Name')
- f = mapnik.Feature(context,pixel_key)
- f['Name'] = str(pixel_key)
- f.add_geometries_from_wkt('POLYGON ((0 0, 0 256, 256 256, 256 0, 0 0))')
- ds.add_feature(f)
- s = mapnik.Style()
- r = mapnik.Rule()
- symb = mapnik.PolygonSymbolizer()
- r.symbols.append(symb)
- s.rules.append(r)
- lyr = mapnik.Layer('Places')
- lyr.datasource = ds
- lyr.styles.append('places_labels')
- width,height = 256,256
- m = mapnik.Map(width,height)
- m.append_style('places_labels',s)
- m.layers.append(lyr)
- m.zoom_all()
- grid = mapnik.Grid(m.width,m.height,key='__id__')
- mapnik.render_layer(m,grid,layer=0,fields=['__id__','Name'])
- return grid
-
- def test_negative_id():
- grid = gen_grid_for_id(-1)
- eq_(grid.get_pixel(128,128),-1)
- utf1 = grid.encode('utf',resolution=4)
- eq_(utf1['keys'],['-1'])
-
- def test_32bit_int_id():
- int32 = 2147483647
- grid = gen_grid_for_id(int32)
- eq_(grid.get_pixel(128,128),int32)
- utf1 = grid.encode('utf',resolution=4)
- eq_(utf1['keys'],[str(int32)])
- max_neg = -(int32)
- grid = gen_grid_for_id(max_neg)
- eq_(grid.get_pixel(128,128),max_neg)
- utf1 = grid.encode('utf',resolution=4)
- eq_(utf1['keys'],[str(max_neg)])
-
- def test_64bit_int_id():
- int64 = 0x7FFFFFFFFFFFFFFF
- grid = gen_grid_for_id(int64)
- eq_(grid.get_pixel(128,128),int64)
- utf1 = grid.encode('utf',resolution=4)
- eq_(utf1['keys'],[str(int64)])
- max_neg = -(int64)
- grid = gen_grid_for_id(max_neg)
- eq_(grid.get_pixel(128,128),max_neg)
- utf1 = grid.encode('utf',resolution=4)
- eq_(utf1['keys'],[str(max_neg)])
-
- def test_id_zero():
- grid = gen_grid_for_id(0)
- eq_(grid.get_pixel(128,128),0)
- utf1 = grid.encode('utf',resolution=4)
- eq_(utf1['keys'],['0'])
-
- line_expected = {"keys": ["", "1"], "data": {"1": {"Name": "1"}}, "grid": [" !", " !! ", " !! ", " !! ", " !! ", " !! ", " [...]
-
- def test_line_rendering():
- ds = mapnik.MemoryDatasource()
- context = mapnik.Context()
- context.push('Name')
- pixel_key = 1
- f = mapnik.Feature(context,pixel_key)
- f['Name'] = str(pixel_key)
- f.add_geometries_from_wkt('LINESTRING (30 10, 10 30, 40 40)')
- ds.add_feature(f)
- s = mapnik.Style()
- r = mapnik.Rule()
- symb = mapnik.LineSymbolizer()
- r.symbols.append(symb)
- s.rules.append(r)
- lyr = mapnik.Layer('Places')
- lyr.datasource = ds
- lyr.styles.append('places_labels')
- width,height = 256,256
- m = mapnik.Map(width,height)
- m.append_style('places_labels',s)
- m.layers.append(lyr)
- m.zoom_all()
- #mapnik.render_to_file(m,'test.png')
- grid = mapnik.Grid(m.width,m.height,key='__id__')
- mapnik.render_layer(m,grid,layer=0,fields=['Name'])
- utf1 = grid.encode()
- eq_(utf1,line_expected,show_grids('line',utf1,line_expected))
-
- point_expected = {"data": {"1": {"Name": "South East"}, "2": {"Name": "South West"}, "3": {"Name": "North West"}, "4": {"Name": "North East"}}, "grid": [" ", " ", " ", " ", " [...]
-
- def test_point_symbolizer_grid():
- width,height = 256,256
- sym = mapnik.PointSymbolizer()
- sym.file = '../data/images/dummy.png'
- m = create_grid_map(width,height,sym)
- ul_lonlat = mapnik.Coord(142.30,-38.20)
- lr_lonlat = mapnik.Coord(143.40,-38.80)
- m.zoom_to_box(mapnik.Box2d(ul_lonlat,lr_lonlat))
- grid = mapnik.Grid(m.width,m.height)
- mapnik.render_layer(m,grid,layer=0,fields=['Name'])
- utf1 = grid.encode()
- eq_(utf1,point_expected,show_grids('point-sym',utf1,point_expected))
-
-
- # should throw because this is a mis-usage
- # https://github.com/mapnik/mapnik/issues/1325
- @raises(RuntimeError)
- def test_render_to_grid_multiple_times():
- # create map with two layers
- m = mapnik.Map(256,256)
- s = mapnik.Style()
- r = mapnik.Rule()
- sym = mapnik.MarkersSymbolizer()
- sym.allow_overlap = True
- r.symbols.append(sym)
- s.rules.append(r)
- m.append_style('points',s)
-
- # NOTE: we use a csv datasource here
- # because the memorydatasource fails silently for
- # queries requesting fields that do not exist in the datasource
- ds1 = mapnik.Datasource(**{"type":"csv","inline":'''
- wkt,Name
- "POINT (143.10 -38.60)",South East'''})
- lyr1 = mapnik.Layer('One')
- lyr1.datasource = ds1
- lyr1.styles.append('points')
- m.layers.append(lyr1)
-
- ds2 = mapnik.Datasource(**{"type":"csv","inline":'''
- wkt,Value
- "POINT (142.48 -38.60)",South West'''})
- lyr2 = mapnik.Layer('Two')
- lyr2.datasource = ds2
- lyr2.styles.append('points')
- m.layers.append(lyr2)
-
- ul_lonlat = mapnik.Coord(142.30,-38.20)
- lr_lonlat = mapnik.Coord(143.40,-38.80)
- m.zoom_to_box(mapnik.Box2d(ul_lonlat,lr_lonlat))
- grid = mapnik.Grid(m.width,m.height)
- mapnik.render_layer(m,grid,layer=0,fields=['Name'])
- # should throw right here since Name will be a property now on the `grid` object
- # and it is not found on the second layer
- mapnik.render_layer(m,grid,layer=1,fields=['Value'])
- utf1 = grid.encode()
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/render_test.py b/tests/python_tests/render_test.py
deleted file mode 100644
index 9010213..0000000
--- a/tests/python_tests/render_test.py
+++ /dev/null
@@ -1,241 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from nose.tools import *
-import tempfile
-import os, mapnik
-from nose.tools import *
-from utilities import execution_path, run_all
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def test_simplest_render():
- m = mapnik.Map(256, 256)
- im = mapnik.Image(m.width, m.height)
- eq_(im.painted(),False)
- eq_(im.is_solid(),True)
- mapnik.render(m, im)
- eq_(im.painted(),False)
- eq_(im.is_solid(),True)
- s = im.tostring()
- eq_(s, 256 * 256 * '\x00\x00\x00\x00')
-
-def test_render_image_to_string():
- im = mapnik.Image(256, 256)
- im.background = mapnik.Color('black')
- eq_(im.painted(),False)
- eq_(im.is_solid(),True)
- s = im.tostring()
- eq_(s, 256 * 256 * '\x00\x00\x00\xff')
-
-def test_non_solid_image():
- im = mapnik.Image(256, 256)
- im.background = mapnik.Color('black')
- eq_(im.painted(),False)
- eq_(im.is_solid(),True)
- # set one pixel to a different color
- im.set_pixel(0,0,mapnik.Color('white'))
- eq_(im.painted(),False)
- eq_(im.is_solid(),False)
-
-def test_non_solid_image_view():
- im = mapnik.Image(256, 256)
- im.background = mapnik.Color('black')
- view = im.view(0,0,256,256)
- eq_(view.is_solid(),True)
- # set one pixel to a different color
- im.set_pixel(0,0,mapnik.Color('white'))
- eq_(im.is_solid(),False)
- # view, since it is the exact dimensions of the image
- # should also be non-solid
- eq_(view.is_solid(),False)
- # but not a view that excludes the single diff pixel
- view2 = im.view(1,1,256,256)
- eq_(view2.is_solid(),True)
-
-def test_setting_alpha():
- w,h = 256,256
- im1 = mapnik.Image(w,h)
- # white, half transparent
- c1 = mapnik.Color('rgba(255,255,255,.5)')
- im1.background = c1
- eq_(im1.painted(),False)
- eq_(im1.is_solid(),True)
- # pure white
- im2 = mapnik.Image(w,h)
- c2 = mapnik.Color('rgba(255,255,255,1)')
- im2.background = c2
- im2.set_alpha(c1.a/255.0)
- eq_(im2.painted(),False)
- eq_(im2.is_solid(),True)
- eq_(len(im1.tostring('png32')), len(im2.tostring('png32')))
-
-def test_render_image_to_file():
- im = mapnik.Image(256, 256)
- im.background = mapnik.Color('black')
- if mapnik.has_jpeg():
- im.save('test.jpg')
- im.save('test.png', 'png')
- if os.path.exists('test.jpg'):
- os.remove('test.jpg')
- else:
- return False
- if os.path.exists('test.png'):
- os.remove('test.png')
- else:
- return False
-
-def get_paired_images(w,h,mapfile):
- tmp_map = 'tmp_map.xml'
- m = mapnik.Map(w,h)
- mapnik.load_map(m,mapfile)
- im = mapnik.Image(w,h)
- m.zoom_all()
- mapnik.render(m,im)
- mapnik.save_map(m,tmp_map)
- m2 = mapnik.Map(w,h)
- mapnik.load_map(m2,tmp_map)
- im2 = mapnik.Image(w,h)
- m2.zoom_all()
- mapnik.render(m2,im2)
- os.remove(tmp_map)
- return im,im2
-
-def test_render_from_serialization():
- try:
- im,im2 = get_paired_images(100,100,'../data/good_maps/building_symbolizer.xml')
- eq_(im.tostring('png32'),im2.tostring('png32'))
-
- im,im2 = get_paired_images(100,100,'../data/good_maps/polygon_symbolizer.xml')
- eq_(im.tostring('png32'),im2.tostring('png32'))
- except RuntimeError, e:
- # only test datasources that we have installed
- if not 'Could not create datasource' in str(e):
- raise RuntimeError(e)
-
-def test_render_points():
- if not mapnik.has_cairo(): return
- # create and populate point datasource (WGS84 lat-lon coordinates)
- ds = mapnik.MemoryDatasource()
- context = mapnik.Context()
- context.push('Name')
- f = mapnik.Feature(context,1)
- f['Name'] = 'Westernmost Point'
- f.add_geometries_from_wkt('POINT (142.48 -38.38)')
- ds.add_feature(f)
-
- f = mapnik.Feature(context,2)
- f['Name'] = 'Southernmost Point'
- f.add_geometries_from_wkt('POINT (143.10 -38.60)')
- ds.add_feature(f)
-
- # create layer/rule/style
- s = mapnik.Style()
- r = mapnik.Rule()
- symb = mapnik.PointSymbolizer()
- symb.allow_overlap = True
- r.symbols.append(symb)
- s.rules.append(r)
- lyr = mapnik.Layer('Places','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
- lyr.datasource = ds
- lyr.styles.append('places_labels')
- # latlon bounding box corners
- ul_lonlat = mapnik.Coord(142.30,-38.20)
- lr_lonlat = mapnik.Coord(143.40,-38.80)
- # render for different projections
- projs = {
- 'google': '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over',
- 'latlon': '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs',
- 'merc': '+proj=merc +datum=WGS84 +k=1.0 +units=m +over +no_defs',
- 'utm': '+proj=utm +zone=54 +datum=WGS84'
- }
- for projdescr in projs.iterkeys():
- m = mapnik.Map(1000, 500, projs[projdescr])
- m.append_style('places_labels',s)
- m.layers.append(lyr)
- dest_proj = mapnik.Projection(projs[projdescr])
- src_proj = mapnik.Projection('+init=epsg:4326')
- tr = mapnik.ProjTransform(src_proj,dest_proj)
- m.zoom_to_box(tr.forward(mapnik.Box2d(ul_lonlat,lr_lonlat)))
- # Render to SVG so that it can be checked how many points are there with string comparison
- svg_file = os.path.join(tempfile.gettempdir(), 'mapnik-render-points-%s.svg' % projdescr)
- mapnik.render_to_file(m, svg_file)
- num_points_present = len(ds.all_features())
- svg = open(svg_file,'r').read()
- num_points_rendered = svg.count('<image ')
- eq_(num_points_present, num_points_rendered, "Not all points were rendered (%d instead of %d) at projection %s" % (num_points_rendered, num_points_present, projdescr))
-
- at raises(RuntimeError)
-def test_render_with_scale_factor_zero_throws():
- m = mapnik.Map(256,256)
- im = mapnik.Image(256, 256)
- mapnik.render(m,im,0.0)
-
-def test_render_with_detector():
- ds = mapnik.MemoryDatasource()
- context = mapnik.Context()
- geojson = '{ "type": "Feature", "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }'
- ds.add_feature(mapnik.Feature.from_geojson(geojson,context))
- s = mapnik.Style()
- r = mapnik.Rule()
- lyr = mapnik.Layer('point')
- lyr.datasource = ds
- lyr.styles.append('point')
- symb = mapnik.MarkersSymbolizer()
- symb.allow_overlap = False
- r.symbols.append(symb)
- s.rules.append(r)
- m = mapnik.Map(256,256)
- m.append_style('point',s)
- m.layers.append(lyr)
- m.zoom_to_box(mapnik.Box2d(-180,-85,180,85))
- im = mapnik.Image(256, 256)
- mapnik.render(m,im)
- expected_file = './images/support/marker-in-center.png'
- actual_file = '/tmp/' + os.path.basename(expected_file)
- #im.save(expected_file,'png8')
- im.save(actual_file,'png8')
- actual = mapnik.Image.open(expected_file)
- expected = mapnik.Image.open(expected_file)
- eq_(actual.tostring('png32'),expected.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual_file,expected_file))
- # now render will a collision detector that should
- # block out the placement of this point
- detector = mapnik.LabelCollisionDetector(m)
- eq_(detector.extent(),mapnik.Box2d(-0.0,-0.0,m.width,m.height))
- eq_(detector.extent(),mapnik.Box2d(-0.0,-0.0,256.0,256.0))
- eq_(detector.boxes(),[])
- detector.insert(detector.extent())
- eq_(detector.boxes(),[detector.extent()])
- im2 = mapnik.Image(256, 256)
- mapnik.render_with_detector(m, im2, detector)
- expected_file_collision = './images/support/marker-in-center-not-placed.png'
- #im2.save(expected_file_collision,'png8')
- actual_file = '/tmp/' + os.path.basename(expected_file_collision)
- im2.save(actual_file,'png8')
-
-
-if 'shape' in mapnik.DatasourceCache.plugin_names():
-
- def test_render_with_scale_factor():
- m = mapnik.Map(256,256)
- mapnik.load_map(m,'../data/good_maps/marker-text-line.xml')
- m.zoom_all()
- sizes = [.00001,.005,.1,.899,1,1.5,2,5,10,100]
- for size in sizes:
- im = mapnik.Image(256, 256)
- mapnik.render(m,im,size)
- expected_file = './images/support/marker-text-line-scale-factor-%s.png' % size
- actual_file = '/tmp/' + os.path.basename(expected_file)
- im.save(actual_file,'png32')
- #im.save(expected_file,'png32')
- # we save and re-open here so both png8 images are ready as full color png
- actual = mapnik.Image.open(actual_file)
- expected = mapnik.Image.open(expected_file)
- eq_(actual.tostring('png32'),expected.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual_file,expected_file))
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/reprojection_test.py b/tests/python_tests/reprojection_test.py
deleted file mode 100644
index 4863298..0000000
--- a/tests/python_tests/reprojection_test.py
+++ /dev/null
@@ -1,92 +0,0 @@
-#coding=utf8
-import os
-import mapnik
-from utilities import execution_path, run_all
-from nose.tools import *
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-if 'shape' in mapnik.DatasourceCache.plugin_names():
-
- #@raises(RuntimeError)
- def test_zoom_all_will_fail():
- m = mapnik.Map(512,512)
- mapnik.load_map(m,'../data/good_maps/wgs842merc_reprojection.xml')
- m.zoom_all()
-
- def test_zoom_all_will_work_with_max_extent():
- m = mapnik.Map(512,512)
- mapnik.load_map(m,'../data/good_maps/wgs842merc_reprojection.xml')
- merc_bounds = mapnik.Box2d(-20037508.34,-20037508.34,20037508.34,20037508.34)
- m.maximum_extent = merc_bounds
- m.zoom_all()
- # note - fixAspectRatio is being called, then re-clipping to maxextent
- # which makes this hard to predict
- #eq_(m.envelope(),merc_bounds)
-
- #m = mapnik.Map(512,512)
- #mapnik.load_map(m,'../data/good_maps/wgs842merc_reprojection.xml')
- #merc_bounds = mapnik.Box2d(-20037508.34,-20037508.34,20037508.34,20037508.34)
- #m.zoom_to_box(merc_bounds)
- #eq_(m.envelope(),merc_bounds)
-
-
- def test_visual_zoom_all_rendering1():
- m = mapnik.Map(512,512)
- mapnik.load_map(m,'../data/good_maps/wgs842merc_reprojection.xml')
- merc_bounds = mapnik.Box2d(-20037508.34,-20037508.34,20037508.34,20037508.34)
- m.maximum_extent = merc_bounds
- m.zoom_all()
- im = mapnik.Image(512,512)
- mapnik.render(m,im)
- actual = '/tmp/mapnik-wgs842merc-reprojection-render.png'
- expected = 'images/support/mapnik-wgs842merc-reprojection-render.png'
- im.save(actual,'png32')
- expected_im = mapnik.Image.open(expected)
- eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
-
- def test_visual_zoom_all_rendering2():
- m = mapnik.Map(512,512)
- mapnik.load_map(m,'../data/good_maps/merc2wgs84_reprojection.xml')
- m.zoom_all()
- im = mapnik.Image(512,512)
- mapnik.render(m,im)
- actual = '/tmp/mapnik-merc2wgs84-reprojection-render.png'
- expected = 'images/support/mapnik-merc2wgs84-reprojection-render.png'
- im.save(actual,'png32')
- expected_im = mapnik.Image.open(expected)
- eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
-
- # maximum-extent read from map.xml
- def test_visual_zoom_all_rendering3():
- m = mapnik.Map(512,512)
- mapnik.load_map(m,'../data/good_maps/bounds_clipping.xml')
- m.zoom_all()
- im = mapnik.Image(512,512)
- mapnik.render(m,im)
- actual = '/tmp/mapnik-merc2merc-reprojection-render1.png'
- expected = 'images/support/mapnik-merc2merc-reprojection-render1.png'
- im.save(actual,'png32')
- expected_im = mapnik.Image.open(expected)
- eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
-
- # no maximum-extent
- def test_visual_zoom_all_rendering4():
- m = mapnik.Map(512,512)
- mapnik.load_map(m,'../data/good_maps/bounds_clipping.xml')
- m.maximum_extent = None
- m.zoom_all()
- im = mapnik.Image(512,512)
- mapnik.render(m,im)
- actual = '/tmp/mapnik-merc2merc-reprojection-render2.png'
- expected = 'images/support/mapnik-merc2merc-reprojection-render2.png'
- im.save(actual,'png32')
- expected_im = mapnik.Image.open(expected)
- eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/save_map_test.py b/tests/python_tests/save_map_test.py
deleted file mode 100644
index 4df244d..0000000
--- a/tests/python_tests/save_map_test.py
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import tempfile
-
-import os, sys, glob, mapnik
-
-default_logging_severity = mapnik.logger.get_severity()
-
-def setup():
- # make the tests silent to suppress unsupported params from harfbuzz tests
- # TODO: remove this after harfbuzz branch merges
- mapnik.logger.set_severity(mapnik.severity_type.None)
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-def teardown():
- mapnik.logger.set_severity(default_logging_severity)
-
-def compare_map(xml):
- m = mapnik.Map(256, 256)
- absolute_base = os.path.abspath(os.path.dirname(xml))
- try:
- mapnik.load_map(m, xml, False, absolute_base)
- except RuntimeError, e:
- # only test datasources that we have installed
- if not 'Could not create datasource' in str(e) \
- and not 'Bad connection' in str(e):
- raise RuntimeError(str(e))
- return
- (handle, test_map) = tempfile.mkstemp(suffix='.xml', prefix='mapnik-temp-map1-')
- os.close(handle)
- (handle, test_map2) = tempfile.mkstemp(suffix='.xml', prefix='mapnik-temp-map2-')
- os.close(handle)
- if os.path.exists(test_map):
- os.remove(test_map)
- mapnik.save_map(m, test_map)
- new_map = mapnik.Map(256, 256)
- mapnik.load_map(new_map, test_map,False,absolute_base)
- open(test_map2,'w').write(mapnik.save_map_to_string(new_map))
- diff = ' diff -u %s %s' % (os.path.abspath(test_map),os.path.abspath(test_map2))
- try:
- eq_(open(test_map).read(),open(test_map2).read())
- except AssertionError, e:
- raise AssertionError('serialized map "%s" not the same after being reloaded, \ncompare with command:\n\n$%s' % (xml,diff))
-
- if os.path.exists(test_map):
- os.remove(test_map)
- else:
- # Fail, the map wasn't written
- return False
-
-def test_compare_map():
- good_maps = glob.glob("../data/good_maps/*.xml")
- good_maps = [os.path.normpath(p) for p in good_maps]
- # remove one map that round trips CDATA differently, but this is okay
- ignorable = os.path.join('..','data','good_maps','empty_parameter2.xml')
- good_maps.remove(ignorable)
- for m in good_maps:
- compare_map(m)
-
- for m in glob.glob("../visual_tests/styles/*.xml"):
- compare_map(m)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/shapefile_test.py b/tests/python_tests/shapefile_test.py
deleted file mode 100644
index b12a143..0000000
--- a/tests/python_tests/shapefile_test.py
+++ /dev/null
@@ -1,113 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import os, mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-if 'shape' in mapnik.DatasourceCache.plugin_names():
-
- # Shapefile initialization
- def test_shapefile_init():
- s = mapnik.Shapefile(file='../../demo/data/boundaries')
-
- e = s.envelope()
-
- assert_almost_equal(e.minx, -11121.6896651, places=7)
- assert_almost_equal(e.miny, -724724.216526, places=6)
- assert_almost_equal(e.maxx, 2463000.67866, places=5)
- assert_almost_equal(e.maxy, 1649661.267, places=3)
-
- # Shapefile properties
- def test_shapefile_properties():
- s = mapnik.Shapefile(file='../../demo/data/boundaries', encoding='latin1')
- f = s.features_at_point(s.envelope().center()).features[0]
-
- eq_(f['CGNS_FID'], u'6f733341ba2011d892e2080020a0f4c9')
- eq_(f['COUNTRY'], u'CAN')
- eq_(f['F_CODE'], u'FA001')
- eq_(f['NAME_EN'], u'Quebec')
- # this seems to break if icu data linking is not working
- eq_(f['NOM_FR'], u'Qu\xe9bec')
- eq_(f['NOM_FR'], u'Québec')
- eq_(f['Shape_Area'], 1512185733150.0)
- eq_(f['Shape_Leng'], 19218883.724300001)
-
- @raises(RuntimeError)
- def test_that_nonexistant_query_field_throws(**kwargs):
- ds = mapnik.Shapefile(file='../data/shp/world_merc')
- eq_(len(ds.fields()),11)
- eq_(ds.fields(),['FIPS', 'ISO2', 'ISO3', 'UN', 'NAME', 'AREA', 'POP2005', 'REGION', 'SUBREGION', 'LON', 'LAT'])
- eq_(ds.field_types(),['str', 'str', 'str', 'int', 'str', 'int', 'int', 'int', 'int', 'float', 'float'])
- query = mapnik.Query(ds.envelope())
- for fld in ds.fields():
- query.add_property_name(fld)
- # also add an invalid one, triggering throw
- query.add_property_name('bogus')
- fs = ds.features(query)
-
- def test_dbf_logical_field_is_boolean():
- ds = mapnik.Shapefile(file='../data/shp/long_lat')
- eq_(len(ds.fields()),7)
- eq_(ds.fields(),['LONG', 'LAT', 'LOGICAL_TR', 'LOGICAL_FA', 'CHARACTER', 'NUMERIC', 'DATE'])
- eq_(ds.field_types(),['str', 'str', 'bool', 'bool', 'str', 'float', 'str'])
- query = mapnik.Query(ds.envelope())
- for fld in ds.fields():
- query.add_property_name(fld)
- feat = ds.all_features()[0]
- eq_(feat.id(),1)
- eq_(feat['LONG'],'0')
- eq_(feat['LAT'],'0')
- eq_(feat['LOGICAL_TR'],True)
- eq_(feat['LOGICAL_FA'],False)
- eq_(feat['CHARACTER'],'254')
- eq_(feat['NUMERIC'],32)
- eq_(feat['DATE'],'20121202')
-
- # created by hand in qgis 1.8.0
- def test_shapefile_point2d_from_qgis():
- ds = mapnik.Shapefile(file='../data/shp/points/qgis.shp')
- eq_(len(ds.fields()),2)
- eq_(ds.fields(),['id','name'])
- eq_(ds.field_types(),['int','str'])
- eq_(len(ds.all_features()),3)
-
- # ogr2ogr tests/data/shp/3dpoint/ogr_zfield.shp tests/data/shp/3dpoint/qgis.shp -zfield id
- def test_shapefile_point_z_from_qgis():
- ds = mapnik.Shapefile(file='../data/shp/points/ogr_zfield.shp')
- eq_(len(ds.fields()),2)
- eq_(ds.fields(),['id','name'])
- eq_(ds.field_types(),['int','str'])
- eq_(len(ds.all_features()),3)
-
- def test_shapefile_multipoint_from_qgis():
- ds = mapnik.Shapefile(file='../data/shp/points/qgis_multi.shp')
- eq_(len(ds.fields()),2)
- eq_(ds.fields(),['id','name'])
- eq_(ds.field_types(),['int','str'])
- eq_(len(ds.all_features()),1)
-
- # pointzm from arcinfo
- def test_shapefile_point_zm_from_arcgis():
- ds = mapnik.Shapefile(file='../data/shp/points/poi.shp')
- eq_(len(ds.fields()),7)
- eq_(ds.fields(),['interst_id', 'state_d', 'cnty_name', 'latitude', 'longitude', 'Name', 'Website'])
- eq_(ds.field_types(),['str', 'str', 'str', 'float', 'float', 'str', 'str'])
- eq_(len(ds.all_features()),17)
-
- # copy of the above with ogr2ogr that makes m record 14 instead of 18
- def test_shapefile_point_zm_from_ogr():
- ds = mapnik.Shapefile(file='../data/shp/points/poi_ogr.shp')
- eq_(len(ds.fields()),7)
- eq_(ds.fields(),['interst_id', 'state_d', 'cnty_name', 'latitude', 'longitude', 'Name', 'Website'])
- eq_(ds.field_types(),['str', 'str', 'str', 'float', 'float', 'str', 'str'])
- eq_(len(ds.all_features()),17)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/sqlite_rtree_test.py b/tests/python_tests/sqlite_rtree_test.py
deleted file mode 100644
index 792f268..0000000
--- a/tests/python_tests/sqlite_rtree_test.py
+++ /dev/null
@@ -1,170 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-from utilities import execution_path, run_all
-from Queue import Queue
-import threading
-import time
-
-import os, mapnik
-import sqlite3
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-NUM_THREADS = 10
-TOTAL = 245
-
-def create_ds(test_db,table):
- ds = mapnik.SQLite(file=test_db,table=table)
- fs = ds.all_features()
- del ds
-
-if 'sqlite' in mapnik.DatasourceCache.plugin_names():
-
- def test_rtree_creation():
- test_db = '../data/sqlite/world.sqlite'
- index = test_db +'.index'
- table = 'world_merc'
-
- if os.path.exists(index):
- os.unlink(index)
-
- threads = []
- for i in range(NUM_THREADS):
- t = threading.Thread(target=create_ds,args=(test_db,table))
- t.start()
- threads.append(t)
-
- for i in threads:
- i.join()
-
- eq_(os.path.exists(index),True)
- conn = sqlite3.connect(index)
- cur = conn.cursor()
- try:
- cur.execute("Select count(*) from idx_%s_GEOMETRY" % table.replace("'",""))
- conn.commit()
- eq_(cur.fetchone()[0],TOTAL)
- except sqlite3.OperationalError:
- # don't worry about testing # of index records if
- # python's sqlite module does not support rtree
- pass
- cur.close()
- conn.close()
-
- ds = mapnik.SQLite(file=test_db,table=table)
- fs = ds.all_features()
- del ds
- eq_(len(fs),TOTAL)
- os.unlink(index)
- ds = mapnik.SQLite(file=test_db,table=table,use_spatial_index=False)
- fs = ds.all_features()
- del ds
- eq_(len(fs),TOTAL)
- eq_(os.path.exists(index),False)
-
- ds = mapnik.SQLite(file=test_db,table=table,use_spatial_index=True)
- fs = ds.all_features()
- #TODO - this loop is not releasing something
- # because it causes the unlink below to fail on windows
- # as the file is still open
- #for feat in fs:
- # query = mapnik.Query(feat.envelope())
- # selected = ds.features(query)
- # eq_(len(selected.features)>=1,True)
- del ds
-
- eq_(os.path.exists(index),True)
- os.unlink(index)
-
- def test_geometry_round_trip():
- test_db = '/tmp/mapnik-sqlite-point.db'
- ogr_metadata = True
-
- # create test db
- conn = sqlite3.connect(test_db)
- cur = conn.cursor()
- cur.execute('''
- CREATE TABLE IF NOT EXISTS point_table
- (id INTEGER PRIMARY KEY AUTOINCREMENT, geometry BLOB, name varchar)
- ''')
- # optional: but nice if we want to read with ogr
- if ogr_metadata:
- cur.execute('''CREATE TABLE IF NOT EXISTS geometry_columns (
- f_table_name VARCHAR,
- f_geometry_column VARCHAR,
- geometry_type INTEGER,
- coord_dimension INTEGER,
- srid INTEGER,
- geometry_format VARCHAR )''')
- cur.execute('''INSERT INTO geometry_columns
- (f_table_name, f_geometry_column, geometry_format,
- geometry_type, coord_dimension, srid) VALUES
- ('point_table','geometry','WKB', 1, 1, 4326)''')
- conn.commit()
- cur.close()
-
- # add a point as wkb (using mapnik) to match how an ogr created db looks
- x = -122 # longitude
- y = 48 # latitude
- wkt = 'POINT(%s %s)' % (x,y)
- # little endian wkb (mapnik will auto-detect and ready either little or big endian (XDR))
- wkb = mapnik.Path.from_wkt(wkt).to_wkb(mapnik.wkbByteOrder.NDR)
- values = (None,sqlite3.Binary(wkb),"test point")
- cur = conn.cursor()
- cur.execute('''INSERT into "point_table" (id,geometry,name) values (?,?,?)''',values)
- conn.commit()
- cur.close()
- conn.close()
-
- def make_wkb_point(x,y):
- import struct
- byteorder = 1; # little endian
- endianess = ''
- if byteorder == 1:
- endianess = '<'
- else:
- endianess = '>'
- geom_type = 1; # for a point
- return struct.pack('%sbldd' % endianess, byteorder, geom_type, x, y)
-
- # confirm the wkb matches a manually formed wkb
- wkb2 = make_wkb_point(x,y)
- eq_(wkb,wkb2)
-
- # ensure we can read this data back out properly with mapnik
- ds = mapnik.Datasource(**{'type':'sqlite','file':test_db, 'table':'point_table'})
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat.id(),1)
- eq_(feat['name'],'test point')
- geoms = feat.geometries()
- eq_(len(geoms),1)
- eq_(geoms.to_wkt(),'Point(-122 48)')
- del ds
-
- # ensure it matches data read with just sqlite
- conn = sqlite3.connect(test_db)
- cur = conn.cursor()
- cur.execute('''SELECT * from point_table''')
- conn.commit()
- result = cur.fetchone()
- cur.close()
- feat_id = result[0]
- eq_(feat_id,1)
- name = result[2]
- eq_(name,'test point')
- geom_wkb_blob = result[1]
- eq_(str(geom_wkb_blob),geoms.to_wkb(mapnik.wkbByteOrder.NDR))
- new_geom = mapnik.Path.from_wkb(str(geom_wkb_blob))
- eq_(new_geom.to_wkt(),geoms.to_wkt())
- conn.close()
- os.unlink(test_db)
-
-if __name__ == "__main__":
- setup()
- returncode = run_all(eval(x) for x in dir() if x.startswith("test_"))
- exit(returncode)
diff --git a/tests/python_tests/sqlite_test.py b/tests/python_tests/sqlite_test.py
deleted file mode 100644
index f384fcc..0000000
--- a/tests/python_tests/sqlite_test.py
+++ /dev/null
@@ -1,421 +0,0 @@
-#!/usr/bin/env python
-
-from nose.tools import *
-from utilities import execution_path, run_all
-
-import os, mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-if 'sqlite' in mapnik.DatasourceCache.plugin_names():
-
- def test_attachdb_with_relative_file():
- # The point table and index is in the qgis_spatiallite.sqlite
- # database. If either is not found, then this fails
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- table='point',
- attachdb='scratch at qgis_spatiallite.sqlite'
- )
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['pkuid'],1)
-
- def test_attachdb_with_multiple_files():
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- table='attachedtest',
- attachdb='scratch1@:memory:,scratch2@:memory:',
- initdb='''
- create table scratch1.attachedtest (the_geom);
- create virtual table scratch2.idx_attachedtest_the_geom using rtree(pkid,xmin,xmax,ymin,ymax);
- insert into scratch2.idx_attachedtest_the_geom values (1,-7799225.5,-7778571.0,1393264.125,1417719.375);
- '''
- )
- fs = ds.featureset()
- feature = None
- try :
- feature = fs.next()
- except StopIteration:
- pass
- # the above should not throw but will result in no features
- eq_(feature,None)
-
- def test_attachdb_with_absolute_file():
- # The point table and index is in the qgis_spatiallite.sqlite
- # database. If either is not found, then this fails
- ds = mapnik.SQLite(file=os.getcwd() + '/../data/sqlite/world.sqlite',
- table='point',
- attachdb='scratch at qgis_spatiallite.sqlite'
- )
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['pkuid'],1)
-
- def test_attachdb_with_index():
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- table='attachedtest',
- attachdb='scratch@:memory:',
- initdb='''
- create table scratch.attachedtest (the_geom);
- create virtual table scratch.idx_attachedtest_the_geom using rtree(pkid,xmin,xmax,ymin,ymax);
- insert into scratch.idx_attachedtest_the_geom values (1,-7799225.5,-7778571.0,1393264.125,1417719.375);
- '''
- )
-
- fs = ds.featureset()
- feature = None
- try :
- feature = fs.next()
- except StopIteration:
- pass
- eq_(feature,None)
-
- def test_attachdb_with_explicit_index():
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- table='attachedtest',
- index_table='myindex',
- attachdb='scratch@:memory:',
- initdb='''
- create table scratch.attachedtest (the_geom);
- create virtual table scratch.myindex using rtree(pkid,xmin,xmax,ymin,ymax);
- insert into scratch.myindex values (1,-7799225.5,-7778571.0,1393264.125,1417719.375);
- '''
- )
- fs = ds.featureset()
- feature = None
- try:
- feature = fs.next()
- except StopIteration:
- pass
- eq_(feature,None)
-
- def test_attachdb_with_sql_join():
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- table='(select * from world_merc INNER JOIN business on world_merc.iso3 = business.ISO3 limit 100)',
- attachdb='busines at business.sqlite'
- )
- eq_(len(ds.fields()),29)
- eq_(ds.fields(),['OGC_FID', 'fips', 'iso2', 'iso3', 'un', 'name', 'area', 'pop2005', 'region', 'subregion', 'lon', 'lat', 'ISO3:1', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010'])
- eq_(ds.field_types(),['int', 'str', 'str', 'str', 'int', 'str', 'int', 'int', 'int', 'int', 'float', 'float', 'str', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int'])
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature.id(),1)
- expected = {
- 1995:0,
- 1996:0,
- 1997:0,
- 1998:0,
- 1999:0,
- 2000:0,
- 2001:0,
- 2002:0,
- 2003:0,
- 2004:0,
- 2005:0,
- 2006:0,
- 2007:0,
- 2008:0,
- 2009:0,
- 2010:0,
- # this appears to be sqlites way of
- # automatically handling clashing column names
- 'ISO3:1':'ATG',
- 'OGC_FID':1,
- 'area':44,
- 'fips':u'AC',
- 'iso2':u'AG',
- 'iso3':u'ATG',
- 'lat':17.078,
- 'lon':-61.783,
- 'name':u'Antigua and Barbuda',
- 'pop2005':83039,
- 'region':19,
- 'subregion':29,
- 'un':28
- }
- for k,v in expected.items():
- try:
- eq_(feature[str(k)],v)
- except:
- #import pdb;pdb.set_trace()
- print 'invalid key/v %s/%s for: %s' % (k,v,feature)
-
- def test_attachdb_with_sql_join_count():
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- table='(select * from world_merc INNER JOIN business on world_merc.iso3 = business.ISO3 limit 100)',
- attachdb='busines at business.sqlite'
- )
- eq_(len(ds.fields()),29)
- eq_(ds.fields(),['OGC_FID', 'fips', 'iso2', 'iso3', 'un', 'name', 'area', 'pop2005', 'region', 'subregion', 'lon', 'lat', 'ISO3:1', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010'])
- eq_(ds.field_types(),['int', 'str', 'str', 'str', 'int', 'str', 'int', 'int', 'int', 'int', 'float', 'float', 'str', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int'])
- eq_(len(ds.all_features()),100)
-
- def test_attachdb_with_sql_join_count2():
- '''
- sqlite3 world.sqlite
- attach database 'business.sqlite' as business;
- select count(*) from world_merc INNER JOIN business on world_merc.iso3 = business.ISO3;
- '''
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- table='(select * from world_merc INNER JOIN business on world_merc.iso3 = business.ISO3)',
- attachdb='busines at business.sqlite'
- )
- eq_(len(ds.fields()),29)
- eq_(ds.fields(),['OGC_FID', 'fips', 'iso2', 'iso3', 'un', 'name', 'area', 'pop2005', 'region', 'subregion', 'lon', 'lat', 'ISO3:1', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010'])
- eq_(ds.field_types(),['int', 'str', 'str', 'str', 'int', 'str', 'int', 'int', 'int', 'int', 'float', 'float', 'str', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int'])
- eq_(len(ds.all_features()),192)
-
- def test_attachdb_with_sql_join_count3():
- '''
- select count(*) from (select * from world_merc where 1=1) as world_merc INNER JOIN business on world_merc.iso3 = business.ISO3;
- '''
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- table='(select * from (select * from world_merc where !intersects!) as world_merc INNER JOIN business on world_merc.iso3 = business.ISO3)',
- attachdb='busines at business.sqlite'
- )
- eq_(len(ds.fields()),29)
- eq_(ds.fields(),['OGC_FID', 'fips', 'iso2', 'iso3', 'un', 'name', 'area', 'pop2005', 'region', 'subregion', 'lon', 'lat', 'ISO3:1', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010'])
- eq_(ds.field_types(),['int', 'str', 'str', 'str', 'int', 'str', 'int', 'int', 'int', 'int', 'float', 'float', 'str', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int'])
- eq_(len(ds.all_features()),192)
-
- def test_attachdb_with_sql_join_count4():
- '''
- select count(*) from (select * from world_merc where 1=1) as world_merc INNER JOIN business on world_merc.iso3 = business.ISO3;
- '''
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- table='(select * from (select * from world_merc where !intersects! limit 1) as world_merc INNER JOIN business on world_merc.iso3 = business.ISO3)',
- attachdb='busines at business.sqlite'
- )
- eq_(len(ds.fields()),29)
- eq_(ds.fields(),['OGC_FID', 'fips', 'iso2', 'iso3', 'un', 'name', 'area', 'pop2005', 'region', 'subregion', 'lon', 'lat', 'ISO3:1', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010'])
- eq_(ds.field_types(),['int', 'str', 'str', 'str', 'int', 'str', 'int', 'int', 'int', 'int', 'float', 'float', 'str', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int'])
- eq_(len(ds.all_features()),1)
-
- def test_attachdb_with_sql_join_count5():
- '''
- select count(*) from (select * from world_merc where 1=1) as world_merc INNER JOIN business on world_merc.iso3 = business.ISO3;
- '''
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- table='(select * from (select * from world_merc where !intersects! and 1=2) as world_merc INNER JOIN business on world_merc.iso3 = business.ISO3)',
- attachdb='busines at business.sqlite'
- )
- # nothing is able to join to business so we don't pick up business schema
- eq_(len(ds.fields()),12)
- eq_(ds.fields(),['OGC_FID', 'fips', 'iso2', 'iso3', 'un', 'name', 'area', 'pop2005', 'region', 'subregion', 'lon', 'lat'])
- eq_(ds.field_types(),['int', 'str', 'str', 'str', 'int', 'str', 'int', 'int', 'int', 'int', 'float', 'float'])
- eq_(len(ds.all_features()),0)
-
- def test_subqueries():
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- table='world_merc',
- )
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['OGC_FID'],1)
- eq_(feature['fips'],u'AC')
- eq_(feature['iso2'],u'AG')
- eq_(feature['iso3'],u'ATG')
- eq_(feature['un'],28)
- eq_(feature['name'],u'Antigua and Barbuda')
- eq_(feature['area'],44)
- eq_(feature['pop2005'],83039)
- eq_(feature['region'],19)
- eq_(feature['subregion'],29)
- eq_(feature['lon'],-61.783)
- eq_(feature['lat'],17.078)
-
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- table='(select * from world_merc)',
- )
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['OGC_FID'],1)
- eq_(feature['fips'],u'AC')
- eq_(feature['iso2'],u'AG')
- eq_(feature['iso3'],u'ATG')
- eq_(feature['un'],28)
- eq_(feature['name'],u'Antigua and Barbuda')
- eq_(feature['area'],44)
- eq_(feature['pop2005'],83039)
- eq_(feature['region'],19)
- eq_(feature['subregion'],29)
- eq_(feature['lon'],-61.783)
- eq_(feature['lat'],17.078)
-
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- table='(select OGC_FID,GEOMETRY from world_merc)',
- )
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['OGC_FID'],1)
- eq_(len(feature),1)
-
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- table='(select GEOMETRY,OGC_FID,fips from world_merc)',
- )
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['OGC_FID'],1)
- eq_(feature['fips'],u'AC')
-
- # same as above, except with alias like postgres requires
- # TODO - should we try to make this work?
- #ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- # table='(select GEOMETRY,rowid as aliased_id,fips from world_merc) as table',
- # key_field='aliased_id'
- # )
- #fs = ds.featureset()
- #feature = fs.next()
- #eq_(feature['aliased_id'],1)
- #eq_(feature['fips'],u'AC')
-
- ds = mapnik.SQLite(file='../data/sqlite/world.sqlite',
- table='(select GEOMETRY,OGC_FID,OGC_FID as rowid,fips from world_merc)',
- )
- fs = ds.featureset()
- feature = fs.next()
- eq_(feature['rowid'],1)
- eq_(feature['fips'],u'AC')
-
- def test_empty_db():
- ds = mapnik.SQLite(file='../data/sqlite/empty.db',
- table='empty',
- )
- fs = ds.featureset()
- feature = None
- try:
- feature = fs.next()
- except StopIteration:
- pass
- eq_(feature,None)
-
- @raises(RuntimeError)
- def test_that_nonexistant_query_field_throws(**kwargs):
- ds = mapnik.SQLite(file='../data/sqlite/empty.db',
- table='empty',
- )
- eq_(len(ds.fields()),25)
- eq_(ds.fields(),['OGC_FID', 'scalerank', 'labelrank', 'featurecla', 'sovereignt', 'sov_a3', 'adm0_dif', 'level', 'type', 'admin', 'adm0_a3', 'geou_dif', 'name', 'abbrev', 'postal', 'name_forma', 'terr_', 'name_sort', 'map_color', 'pop_est', 'gdp_md_est', 'fips_10_', 'iso_a2', 'iso_a3', 'iso_n3'])
- eq_(ds.field_types(),['int', 'int', 'int', 'str', 'str', 'str', 'float', 'float', 'str', 'str', 'str', 'float', 'str', 'str', 'str', 'str', 'str', 'str', 'float', 'float', 'float', 'float', 'str', 'str', 'float'])
- query = mapnik.Query(ds.envelope())
- for fld in ds.fields():
- query.add_property_name(fld)
- # also add an invalid one, triggering throw
- query.add_property_name('bogus')
- fs = ds.features(query)
-
- def test_intersects_token1():
- ds = mapnik.SQLite(file='../data/sqlite/empty.db',
- table='(select * from empty where !intersects!)',
- )
- fs = ds.featureset()
- feature = None
- try :
- feature = fs.next()
- except StopIteration:
- pass
- eq_(feature,None)
-
- def test_intersects_token2():
- ds = mapnik.SQLite(file='../data/sqlite/empty.db',
- table='(select * from empty where "a"!="b" and !intersects!)',
- )
- fs = ds.featureset()
- feature = None
- try :
- feature = fs.next()
- except StopIteration:
- pass
- eq_(feature,None)
-
- def test_intersects_token3():
- ds = mapnik.SQLite(file='../data/sqlite/empty.db',
- table='(select * from empty where "a"!="b" and !intersects!)',
- )
- fs = ds.featureset()
- feature = None
- try :
- feature = fs.next()
- except StopIteration:
- pass
- eq_(feature,None)
-
- # https://github.com/mapnik/mapnik/issues/1537
- # this works because key_field is manually set
- def test_db_with_one_text_column():
- # form up an in-memory test db
- wkb = '010100000000000000000000000000000000000000'
- ds = mapnik.SQLite(file=':memory:',
- table='test1',
- initdb='''
- create table test1 (alias TEXT,geometry BLOB);
- insert into test1 values ("test",x'%s');
- ''' % wkb,
- extent='-180,-60,180,60',
- use_spatial_index=False,
- key_field='alias'
- )
- eq_(len(ds.fields()),1)
- eq_(ds.fields(),['alias'])
- eq_(ds.field_types(),['str'])
- fs = ds.all_features()
- eq_(len(fs),1)
- feat = fs[0]
- #eq_(feat.id(),1)
- eq_(feat['alias'],'test')
- eq_(len(feat.geometries()),1)
- eq_(feat.geometries()[0].to_wkt(),'Point(0 0)')
-
-
- def test_that_64bit_int_fields_work():
- ds = mapnik.SQLite(file='../data/sqlite/64bit_int.sqlite',
- table='int_table',
- use_spatial_index=False
- )
- eq_(len(ds.fields()),3)
- eq_(ds.fields(),['OGC_FID','id','bigint'])
- eq_(ds.field_types(),['int','int','int'])
- fs = ds.featureset()
- feat = fs.next()
- eq_(feat.id(),1)
- eq_(feat['OGC_FID'],1)
- eq_(feat['bigint'],2147483648)
- feat = fs.next()
- eq_(feat.id(),2)
- eq_(feat['OGC_FID'],2)
- eq_(feat['bigint'],922337203685477580)
-
-
- def test_null_id_field():
- # silence null key warning: https://github.com/mapnik/mapnik/issues/1889
- default_logging_severity = mapnik.logger.get_severity()
- mapnik.logger.set_severity(mapnik.severity_type.None)
- # form up an in-memory test db
- wkb = '010100000000000000000000000000000000000000'
- # note: the osm_id should be declared INTEGER PRIMARY KEY
- # but in this case we intentionally do not make this a valid pkey
- # otherwise sqlite would turn the null into a valid, serial id
- ds = mapnik.SQLite(file=':memory:',
- table='test1',
- initdb='''
- create table test1 (osm_id INTEGER,geometry BLOB);
- insert into test1 values (null,x'%s');
- ''' % wkb,
- extent='-180,-60,180,60',
- use_spatial_index=False,
- key_field='osm_id'
- )
- fs = ds.featureset()
- feature = None
- try :
- feature = fs.next()
- except StopIteration:
- pass
- eq_(feature,None)
- mapnik.logger.set_severity(default_logging_severity)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/style_test.py b/tests/python_tests/style_test.py
deleted file mode 100644
index 9b06273..0000000
--- a/tests/python_tests/style_test.py
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import os
-from nose.tools import *
-from utilities import execution_path, run_all
-import mapnik
-
-def test_style_init():
- s = mapnik.Style()
- eq_(s.filter_mode,mapnik.filter_mode.ALL)
- eq_(len(s.rules),0)
- eq_(s.opacity,1)
- eq_(s.comp_op,None)
- eq_(s.image_filters,"")
- eq_(s.image_filters_inflate,False)
-
-if __name__ == "__main__":
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/topojson_plugin_test.py b/tests/python_tests/topojson_plugin_test.py
deleted file mode 100644
index ff1f2ed..0000000
--- a/tests/python_tests/topojson_plugin_test.py
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from nose.tools import *
-from utilities import execution_path, run_all
-import os, mapnik
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-if 'topojson' in mapnik.DatasourceCache.plugin_names():
-
- def test_topojson_init():
- # topojson tests/data/json/escaped.geojson -o tests/data/json/escaped.topojson --properties
- # topojson version 1.4.2
- ds = mapnik.Datasource(type='topojson',file='../data/json/escaped.topojson')
- e = ds.envelope()
- assert_almost_equal(e.minx, -81.705583, places=7)
- assert_almost_equal(e.miny, 41.480573, places=6)
- assert_almost_equal(e.maxx, -81.705583, places=5)
- assert_almost_equal(e.maxy, 41.480573, places=3)
-
- def test_topojson_properties():
- ds = mapnik.Datasource(type='topojson',file='../data/json/escaped.topojson')
- f = ds.features_at_point(ds.envelope().center()).features[0]
- eq_(len(ds.fields()),7)
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
-
- eq_(f['name'], u'Test')
- eq_(f['int'], 1)
- eq_(f['description'], u'Test: \u005C')
- eq_(f['spaces'], u'this has spaces')
- eq_(f['double'], 1.1)
- eq_(f['boolean'], True)
- eq_(f['NOM_FR'], u'Qu\xe9bec')
- eq_(f['NOM_FR'], u'Québec')
-
- ds = mapnik.Datasource(type='topojson',file='../data/json/escaped.topojson')
- f = ds.all_features()[0]
- eq_(len(ds.fields()),7)
-
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
-
- eq_(f['name'], u'Test')
- eq_(f['int'], 1)
- eq_(f['description'], u'Test: \u005C')
- eq_(f['spaces'], u'this has spaces')
- eq_(f['double'], 1.1)
- eq_(f['boolean'], True)
- eq_(f['NOM_FR'], u'Qu\xe9bec')
- eq_(f['NOM_FR'], u'Québec')
-
- def test_geojson_from_in_memory_string():
- ds = mapnik.Datasource(type='topojson',inline=open('../data/json/escaped.topojson','r').read())
- f = ds.all_features()[0]
- eq_(len(ds.fields()),7)
-
- desc = ds.describe()
- eq_(desc['geometry_type'],mapnik.DataGeometryType.Point)
-
- eq_(f['name'], u'Test')
- eq_(f['int'], 1)
- eq_(f['description'], u'Test: \u005C')
- eq_(f['spaces'], u'this has spaces')
- eq_(f['double'], 1.1)
- eq_(f['boolean'], True)
- eq_(f['NOM_FR'], u'Qu\xe9bec')
- eq_(f['NOM_FR'], u'Québec')
-
-# @raises(RuntimeError)
- def test_that_nonexistant_query_field_throws(**kwargs):
- ds = mapnik.Datasource(type='topojson',file='../data/json/escaped.topojson')
- eq_(len(ds.fields()),7)
- # TODO - this sorting is messed up
- eq_(ds.fields(),['name', 'int', 'description', 'spaces', 'double', 'boolean', 'NOM_FR'])
- eq_(ds.field_types(),['str', 'int', 'str', 'str', 'float', 'bool', 'str'])
-# TODO - should topojson plugin throw like others?
-# query = mapnik.Query(ds.envelope())
-# for fld in ds.fields():
-# query.add_property_name(fld)
-# # also add an invalid one, triggering throw
-# query.add_property_name('bogus')
-# fs = ds.features(query)
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/python_tests/utilities.py b/tests/python_tests/utilities.py
deleted file mode 100644
index 9d413a9..0000000
--- a/tests/python_tests/utilities.py
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from nose.plugins.errorclass import ErrorClass, ErrorClassPlugin
-
-import os, sys, inspect, traceback
-import mapnik
-
-def execution_path(filename):
- return os.path.join(os.path.dirname(sys._getframe(1).f_code.co_filename), filename)
-
-class Todo(Exception):
- pass
-
-class TodoPlugin(ErrorClassPlugin):
- name = "todo"
-
- todo = ErrorClass(Todo, label='TODO', isfailure=False)
-
-def contains_word(word, bytestring_):
- """
- Checks that a bytestring contains a given word. len(bytestring) should be
- a multiple of len(word).
-
- >>> contains_word("abcd", "abcd"*5)
- True
-
- >>> contains_word("ab", "ba"*5)
- False
-
- >>> contains_word("ab", "ab"*5+"a")
- Traceback (most recent call last):
- ...
- AssertionError: len(bytestring_) not multiple of len(word)
- """
- n = len(word)
- assert len(bytestring_)%n == 0, "len(bytestring_) not multiple of len(word)"
- chunks = [bytestring_[i:i+n] for i in xrange(0, len(bytestring_), n)]
- return word in chunks
-
-def pixel2channels(pixel):
- alpha = (pixel >> 24) & 0xff
- red = pixel & 0xff
- green = (pixel >> 8) & 0xff
- blue = (pixel >> 16) & 0xff
- return red,green,blue,alpha
-
-def pixel2rgba(pixel):
- return 'rgba(%s,%s,%s,%s)' % pixel2channels(pixel)
-
-def get_unique_colors(im):
- pixels = []
- for x in range(im.width()):
- for y in range(im.height()):
- pixel = im.get_pixel(x,y)
- if pixel not in pixels:
- pixels.append(pixel)
- pixels = sorted(pixels)
- return map(pixel2rgba,pixels)
-
-def run_all(iterable):
- failed = 0
- for test in iterable:
- try:
- test()
- sys.stderr.write("\x1b[32m✓ \x1b[m" + test.__name__ + "\x1b[m\n")
- except:
- exc_type, exc_value, exc_tb = sys.exc_info()
- failed += 1
- sys.stderr.write("\x1b[31m✘ \x1b[m" + test.__name__ + "\x1b[m\n")
- for mline in traceback.format_exception_only(exc_type, exc_value):
- for line in mline.rstrip().split("\n"):
- sys.stderr.write(" \x1b[31m" + line + "\x1b[m\n")
- sys.stderr.write(" Traceback:\n")
- for mline in traceback.format_tb(exc_tb):
- for line in mline.rstrip().split("\n"):
- if not 'utilities.py' in line and not 'trivial.py' in line and not line.strip() == 'test()':
- sys.stderr.write(" " + line + "\n")
- sys.stderr.flush()
- return failed
-
-def side_by_side_image(left_im, right_im):
- width = left_im.width() + 1 + right_im.width()
- height = max(left_im.height(), right_im.height())
- im = mapnik.Image(width, height)
- im.blend(0, 0, left_im, 1.0)
- im.blend(left_im.width() + 1, 0, right_im, 1.0)
- return im
diff --git a/tests/python_tests/webp_encoding_test.py b/tests/python_tests/webp_encoding_test.py
deleted file mode 100644
index d014594..0000000
--- a/tests/python_tests/webp_encoding_test.py
+++ /dev/null
@@ -1,162 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import sys
-import os, mapnik
-from timeit import Timer, time
-from nose.tools import *
-from utilities import execution_path, run_all
-
-def setup():
- # All of the paths used are relative, if we run the tests
- # from another directory we need to chdir()
- os.chdir(execution_path('.'))
-
-if mapnik.has_webp():
- tmp_dir = '/tmp/mapnik-webp/'
- if not os.path.exists(tmp_dir):
- os.makedirs(tmp_dir)
-
- opts = [
- 'webp',
- 'webp:method=0',
- 'webp:method=6',
- 'webp:quality=64',
- 'webp:alpha=false',
- 'webp:partitions=3',
- 'webp:preprocessing=1',
- 'webp:partition_limit=50',
- 'webp:pass=10',
- 'webp:alpha_quality=50',
- 'webp:alpha_filtering=2',
- 'webp:alpha_compression=0',
- 'webp:autofilter=0',
- 'webp:filter_type=1:autofilter=1',
- 'webp:filter_sharpness=4',
- 'webp:filter_strength=50',
- 'webp:sns_strength=50',
- 'webp:segments=3',
- 'webp:target_PSNR=.5',
- 'webp:target_size=100'
- ]
-
-
- def gen_filepath(name,format):
- return os.path.join('images/support/encoding-opts',name+'-'+format.replace(":","+")+'.webp')
-
- def test_quality_threshold():
- im = mapnik.Image(256,256)
- im.tostring('webp:quality=99.99000')
- im.tostring('webp:quality=0')
- im.tostring('webp:quality=0.001')
-
- @raises(RuntimeError)
- def test_quality_threshold_invalid():
- im = mapnik.Image(256,256)
- im.tostring('webp:quality=101')
-
- @raises(RuntimeError)
- def test_quality_threshold_invalid2():
- im = mapnik.Image(256,256)
- im.tostring('webp:quality=-1')
-
- generate = False
-
- def test_expected_encodings():
- fails = []
- try:
- for opt in opts:
- im = mapnik.Image(256,256)
- expected = gen_filepath('blank',opt)
- actual = os.path.join(tmp_dir,os.path.basename(expected))
- if generate or not os.path.exists(expected):
- print 'generating expected image %s' % expected
- im.save(expected,opt)
- im.save(actual,opt)
- try:
- expected_bytes = mapnik.Image.open(expected).tostring()
- except RuntimeError:
- # this will happen if libweb is old, since it cannot open images created by more recent webp
- print 'warning, cannot open webp expected image (your libwebp is likely too old)'
- continue
- if mapnik.Image.open(actual).tostring() != expected_bytes:
- fails.append('%s (actual) not == to %s (expected)' % (actual,expected))
-
- for opt in opts:
- im = mapnik.Image(256,256)
- im.background = mapnik.Color('green')
- expected = gen_filepath('solid',opt)
- actual = os.path.join(tmp_dir,os.path.basename(expected))
- if generate or not os.path.exists(expected):
- print 'generating expected image %s' % expected
- im.save(expected,opt)
- im.save(actual,opt)
- try:
- expected_bytes = mapnik.Image.open(expected).tostring()
- except RuntimeError:
- # this will happen if libweb is old, since it cannot open images created by more recent webp
- print 'warning, cannot open webp expected image (your libwebp is likely too old)'
- continue
- if mapnik.Image.open(actual).tostring() != expected_bytes:
- fails.append('%s (actual) not == to %s (expected)' % (actual,expected))
-
- for opt in opts:
- im = mapnik.Image.open('images/support/transparency/aerial_rgba.png')
- expected = gen_filepath('aerial_rgba',opt)
- actual = os.path.join(tmp_dir,os.path.basename(expected))
- if generate or not os.path.exists(expected):
- print 'generating expected image %s' % expected
- im.save(expected,opt)
- im.save(actual,opt)
- try:
- expected_bytes = mapnik.Image.open(expected).tostring()
- except RuntimeError:
- # this will happen if libweb is old, since it cannot open images created by more recent webp
- print 'warning, cannot open webp expected image (your libwebp is likely too old)'
- continue
- if mapnik.Image.open(actual).tostring() != expected_bytes:
- fails.append('%s (actual) not == to %s (expected)' % (actual,expected))
- # disabled to avoid failures on ubuntu when using old webp packages
- #eq_(fails,[],'\n'+'\n'.join(fails))
- except RuntimeError, e:
- print e
-
- def test_transparency_levels():
- try:
- # create partial transparency image
- im = mapnik.Image(256,256)
- im.background = mapnik.Color('rgba(255,255,255,.5)')
- c2 = mapnik.Color('rgba(255,255,0,.2)')
- c3 = mapnik.Color('rgb(0,255,255)')
- for y in range(0,im.height()/2):
- for x in range(0,im.width()/2):
- im.set_pixel(x,y,c2)
- for y in range(im.height()/2,im.height()):
- for x in range(im.width()/2,im.width()):
- im.set_pixel(x,y,c3)
-
- t0 = tmp_dir + 'white0-actual.webp'
-
- # octree
- format = 'webp'
- expected = 'images/support/transparency/white0.webp'
- if generate or not os.path.exists(expected):
- im.save('images/support/transparency/white0.webp')
- im.save(t0,format)
- im_in = mapnik.Image.open(t0)
- t0_len = len(im_in.tostring(format))
- try:
- expected_bytes = mapnik.Image.open(expected).tostring(format)
- except RuntimeError:
- # this will happen if libweb is old, since it cannot open images created by more recent webp
- print 'warning, cannot open webp expected image (your libwebp is likely too old)'
- return
- # disabled to avoid failures on ubuntu when using old webp packages
- #eq_(t0_len,len(expected_bytes))
- except RuntimeError, e:
- print e
-
-
-if __name__ == "__main__":
- setup()
- exit(run_all(eval(x) for x in dir() if x.startswith("test_")))
diff --git a/tests/run_tests.py b/tests/run_tests.py
deleted file mode 100755
index edf7974..0000000
--- a/tests/run_tests.py
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-
-try:
- import nose
-except ImportError, e:
- sys.stderr.write("Unable to run python tests: the third party 'nose' module is required\nTo install 'nose' do:\n\tsudo pip install nose (or on debian systems: apt-get install python-nose): %s\n" % e)
- sys.exit(1)
-
-import mapnik
-from python_tests.utilities import TodoPlugin
-from nose.plugins.doctests import Doctest
-
-import nose, sys, os, getopt
-
-def usage():
- print("test.py -h | --help")
- print("test.py [-q | -v] [-p | --prefix <path>]")
-
-def main():
- try:
- opts, args = getopt.getopt(sys.argv[1:], "hvqp:", ["help", "prefix="])
- except getopt.GetoptError,err:
- print(str(err))
- usage()
- sys.exit(2)
-
- prefix = None
- verbose = False
- quiet = False
-
- for o, a in opts:
- if o == "-q":
- quiet = True
- elif o == "-v":
- verbose = True
- elif o in ("-h", "--help"):
- usage()
- sys.exit()
- elif o in ("-p", "--prefix"):
- prefix = a
- else:
- assert False, "Unhandled option"
-
- if quiet and verbose:
- usage()
- sys.exit(2)
-
- if prefix:
- # Allow python to find libraries for testing on the buildbot
- sys.path.insert(0, os.path.join(prefix, "lib/python%s/site-packages" % sys.version[:3]))
-
- import mapnik
-
- if not quiet:
- print("- mapnik path: %s" % mapnik.__file__)
- if hasattr(mapnik,'_mapnik'):
- print("- _mapnik.so path: %s" % mapnik._mapnik.__file__)
- if hasattr(mapnik,'inputpluginspath'):
- print ("- Input plugins path: %s" % mapnik.inputpluginspath)
- if os.environ.has_key('MAPNIK_INPUT_PLUGINS_DIRECTORY'):
- print ("- MAPNIK_INPUT_PLUGINS_DIRECTORY env: %s" % os.environ.get('MAPNIK_INPUT_PLUGINS_DIRECTORY'))
- if hasattr(mapnik,'fontscollectionpath'):
- print("- Font path: %s" % mapnik.fontscollectionpath)
- if os.environ.has_key('MAPNIK_FONT_DIRECTORY'):
- print ("- MAPNIK_FONT_DIRECTORY env: %s" % os.environ.get('MAPNIK_FONT_DIRECTORY'))
- print('')
- print("- Running nosetests:")
- print('')
-
- argv = [__file__, '--exe', '--with-todo', '--with-doctest', '--doctest-tests']
-
- if not quiet:
- argv.append('-v')
-
- if verbose:
- # 3 * '-v' gets us debugging information from nose
- argv.append('-v')
- argv.append('-v')
-
- dirname = os.path.dirname(sys.argv[0])
- argv.extend(['-w', os.path.join(dirname,'python_tests')])
-
- if not nose.run(argv=argv, plugins=[TodoPlugin(), Doctest()]):
- sys.exit(1)
- else:
- sys.exit(0)
-
-if __name__ == "__main__":
- main()
diff --git a/tests/visual_tests/.gitignore b/tests/visual_tests/.gitignore
deleted file mode 100644
index a39b720..0000000
--- a/tests/visual_tests/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*-out.xml
diff --git a/tests/visual_tests/clean.sh b/tests/visual_tests/clean.sh
deleted file mode 100755
index d5ae9e4..0000000
--- a/tests/visual_tests/clean.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-rm -f xml_output/*-out.xml
-
diff --git a/tests/visual_tests/compare.py b/tests/visual_tests/compare.py
deleted file mode 100644
index 345067f..0000000
--- a/tests/visual_tests/compare.py
+++ /dev/null
@@ -1,85 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import os
-import sys
-import mapnik
-import platform
-
-try:
- import json
-except ImportError:
- import simplejson as json
-
-COMPUTE_THRESHOLD = 16
-
-# testcase images are generated on OS X
-# so they should exactly match
-if platform.uname()[0] == 'Darwin':
- COMPUTE_THRESHOLD = 2
-
-# returns true if pixels are not identical
-def compare_pixels(pixel1, pixel2, alpha=True):
- if pixel1 == pixel2:
- return False
- r_diff = abs((pixel1 & 0xff) - (pixel2 & 0xff))
- g_diff = abs(((pixel1 >> 8) & 0xff) - ((pixel2 >> 8) & 0xff))
- b_diff = abs(((pixel1 >> 16) & 0xff)- ((pixel2 >> 16) & 0xff))
- if alpha:
- a_diff = abs(((pixel1 >> 24) & 0xff) - ((pixel2 >> 24) & 0xff))
- if(r_diff > COMPUTE_THRESHOLD or
- g_diff > COMPUTE_THRESHOLD or
- b_diff > COMPUTE_THRESHOLD or
- a_diff > COMPUTE_THRESHOLD):
- return True
- else:
- if(r_diff > COMPUTE_THRESHOLD or
- g_diff > COMPUTE_THRESHOLD or
- b_diff > COMPUTE_THRESHOLD):
- return True
- return False
-
-# compare two images and return number of different pixels
-def compare(actual, expected, alpha=True):
- im1 = mapnik.Image.open(actual)
- im2 = mapnik.Image.open(expected)
- diff = 0
- pixels = im1.width() * im1.height()
- delta_pixels = (im2.width() * im2.height()) - pixels
- if delta_pixels != 0:
- return delta_pixels
- for x in range(0,im1.width(),2):
- for y in range(0,im1.height(),2):
- if compare_pixels(im1.get_pixel(x,y),im2.get_pixel(x,y),alpha=alpha):
- diff += 1
- return diff
-
-def compare_grids(actual, expected, threshold=0, alpha=True):
- global errors
- global passed
- im1 = json.loads(open(actual).read())
- im2 = json.loads(open(expected).read())
- # TODO - real diffing
- if not im1['data'] == im2['data']:
- return 99999999
- if not im1['keys'] == im2['keys']:
- return 99999999
- grid1 = im1['grid']
- grid2 = im2['grid']
- # dimensions must be exact
- width1 = len(grid1[0])
- width2 = len(grid2[0])
- if not width1 == width2:
- return 99999999
- height1 = len(grid1)
- height2 = len(grid2)
- if not height1 == height2:
- return 99999999
- diff = 0;
- for y in range(0,height1-1):
- row1 = grid1[y]
- row2 = grid2[y]
- width = min(len(row1),len(row2))
- for w in range(0,width):
- if row1[w] != row2[w]:
- diff += 1
- return diff
diff --git a/tests/visual_tests/data/Yosemite_L9.tfw b/tests/visual_tests/data/Yosemite_L9.tfw
deleted file mode 100644
index 700a71c..0000000
--- a/tests/visual_tests/data/Yosemite_L9.tfw
+++ /dev/null
@@ -1,6 +0,0 @@
-191.092170573681
-0.000000000000
-0.000000000000
--191.092170573681
--13383825.126807762310
-4651869.862067188136
diff --git a/tests/visual_tests/data/Yosemite_L9.tif b/tests/visual_tests/data/Yosemite_L9.tif
deleted file mode 100644
index a3fcc36..0000000
Binary files a/tests/visual_tests/data/Yosemite_L9.tif and /dev/null differ
diff --git a/tests/visual_tests/data/aerial_rgba.tiff b/tests/visual_tests/data/aerial_rgba.tiff
deleted file mode 100644
index bccfd57..0000000
Binary files a/tests/visual_tests/data/aerial_rgba.tiff and /dev/null differ
diff --git a/tests/visual_tests/data/bug1532.csv b/tests/visual_tests/data/bug1532.csv
deleted file mode 100644
index f38b6c9..0000000
--- a/tests/visual_tests/data/bug1532.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-wrap|type|wkt
-no|point|POINT(0.28436221472838974 0.2614258628766519)
-yes|point|POINT(0.1306627157552161 0.2589062249349994)
-no|line|LINESTRING(0.48404558019763577 0.22552097681732494, 0.7876650822675934 0.22426115456321344)
-yes|line|LINESTRING(0.48341566421823756 0.32315682259650147, 0.7870351662881953 0.3218970105980799)
diff --git a/tests/visual_tests/data/bug1533.csv b/tests/visual_tests/data/bug1533.csv
deleted file mode 100644
index 5c38f17..0000000
--- a/tests/visual_tests/data/bug1533.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-wkt
-"LINESTRING(0.8511083807156015 0.03967486460801543, 0.5994991376749135 0.2096131480715248)"
-"LINESTRING(0.27084293293759165 0.26302812355087024, 0.04604697152647152 0.05893796680132844)"
-"LINESTRING(0.07145061369178042 0.3118185090592599, 0.3750701157617382 0.3105586956821123)"
-"LINESTRING(0.8179010492787097 0.3099287889371784, 0.514281547208752 0.3111886023894954)"
diff --git a/tests/visual_tests/data/charplacement.dbf b/tests/visual_tests/data/charplacement.dbf
deleted file mode 100644
index c143baa..0000000
Binary files a/tests/visual_tests/data/charplacement.dbf and /dev/null differ
diff --git a/tests/visual_tests/data/charplacement.shp b/tests/visual_tests/data/charplacement.shp
deleted file mode 100644
index ccdfcf4..0000000
Binary files a/tests/visual_tests/data/charplacement.shp and /dev/null differ
diff --git a/tests/visual_tests/data/charplacement.shx b/tests/visual_tests/data/charplacement.shx
deleted file mode 100644
index 65b8dab..0000000
Binary files a/tests/visual_tests/data/charplacement.shx and /dev/null differ
diff --git a/tests/visual_tests/data/crossing-lines.csv b/tests/visual_tests/data/crossing-lines.csv
deleted file mode 100644
index 3b51da0..0000000
--- a/tests/visual_tests/data/crossing-lines.csv
+++ /dev/null
@@ -1,7 +0,0 @@
-i|wkt
-1|LINESTRING(10 0, 20 0)
-1|LINESTRING(10 10, 20 10)
-1|LINESTRING(15 5, 20 5)
-1|LINESTRING(15 5, 20 5)
-1|LINESTRING(10 5, 15 5)
-1|LINESTRING(10 5, 15 5)
diff --git a/tests/visual_tests/data/displacement.dbf b/tests/visual_tests/data/displacement.dbf
deleted file mode 100644
index 06ec320..0000000
Binary files a/tests/visual_tests/data/displacement.dbf and /dev/null differ
diff --git a/tests/visual_tests/data/displacement.shp b/tests/visual_tests/data/displacement.shp
deleted file mode 100644
index 899b163..0000000
Binary files a/tests/visual_tests/data/displacement.shp and /dev/null differ
diff --git a/tests/visual_tests/data/displacement.shx b/tests/visual_tests/data/displacement.shx
deleted file mode 100644
index 359820d..0000000
Binary files a/tests/visual_tests/data/displacement.shx and /dev/null differ
diff --git a/tests/visual_tests/data/grouped-rendering.sqlite b/tests/visual_tests/data/grouped-rendering.sqlite
deleted file mode 100644
index 277c0f5..0000000
Binary files a/tests/visual_tests/data/grouped-rendering.sqlite and /dev/null differ
diff --git a/tests/visual_tests/data/heat.tif b/tests/visual_tests/data/heat.tif
deleted file mode 100644
index 5ea60e3..0000000
Binary files a/tests/visual_tests/data/heat.tif and /dev/null differ
diff --git a/tests/visual_tests/data/heat_nodata.tif b/tests/visual_tests/data/heat_nodata.tif
deleted file mode 100644
index ed6d71e..0000000
Binary files a/tests/visual_tests/data/heat_nodata.tif and /dev/null differ
diff --git a/tests/visual_tests/data/heat_rgb.tif b/tests/visual_tests/data/heat_rgb.tif
deleted file mode 100644
index c9ad3b5..0000000
Binary files a/tests/visual_tests/data/heat_rgb.tif and /dev/null differ
diff --git a/tests/visual_tests/data/hex.dbf b/tests/visual_tests/data/hex.dbf
deleted file mode 100644
index 193ea6e..0000000
Binary files a/tests/visual_tests/data/hex.dbf and /dev/null differ
diff --git a/tests/visual_tests/data/hex.prj b/tests/visual_tests/data/hex.prj
deleted file mode 100644
index eb0befd..0000000
--- a/tests/visual_tests/data/hex.prj
+++ /dev/null
@@ -1 +0,0 @@
-PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],EXTENSION["PRO [...]
\ No newline at end of file
diff --git a/tests/visual_tests/data/hex.shp b/tests/visual_tests/data/hex.shp
deleted file mode 100644
index 094a867..0000000
Binary files a/tests/visual_tests/data/hex.shp and /dev/null differ
diff --git a/tests/visual_tests/data/hex.shx b/tests/visual_tests/data/hex.shx
deleted file mode 100644
index ad2bdf2..0000000
Binary files a/tests/visual_tests/data/hex.shx and /dev/null differ
diff --git a/tests/visual_tests/data/line-offset.csv b/tests/visual_tests/data/line-offset.csv
deleted file mode 100644
index fe557d8..0000000
--- a/tests/visual_tests/data/line-offset.csv
+++ /dev/null
@@ -1,9 +0,0 @@
-wkt,name,nr,ref
-"LineString(-5.177724 50.191914,-5.177742 50.191769,-5.17773 50.191624,-5.177689 50.191481,-5.177619 50.191343,-5.177522 50.191212,-5.177398 50.19109,-5.177251 50.190979,-5.177082 50.190882,-5.176895 50.190799,-5.176693 50.190733,-5.176479 50.190685,-5.176257 50.190654,-5.176031 50.190643,-5.175804 50.19065,-5.175581 50.190677,-5.175365 50.190722,-5.17516 50.190784,-5.17497 50.190863,-5.174797 50.190957,-5.174645 50.191065,-5.174516 50.191185,-5.174413 50.191314,-5.174337 50.191451,-5.17 [...]
-"LineString(-5.182328 50.19193,-5.182346 50.191785,-5.182334 50.19164,-5.182293 50.191497,-5.182223 50.191358,-5.182125 50.191227,-5.182002 50.191105,-5.181854 50.190995,-5.181686 50.190897,-5.181499 50.190815,-5.181297 50.190749,-5.181083 50.1907,-5.180861 50.19067,-5.180634 50.190658,-5.180408 50.190666,-5.180184 50.190692,-5.179968 50.190737,-5.179763 50.190799,-5.179573 50.190878,-5.1794 50.190973,-5.179248 50.191081,-5.179119 50.1912,-5.179016 50.19133,-5.17894 50.191467,-5.178893 5 [...]
-"LineString(-5.187052 50.191945,-5.187004 50.192087,-5.186928 50.192224,-5.186825 50.192354,-5.186696 50.192473,-5.186544 50.192581,-5.186371 50.192675,-5.186181 50.192755,-5.185976 50.192817,-5.18576 50.192862,-5.185537 50.192888,-5.18531 50.192896,-5.185084 50.192884,-5.184862 50.192854,-5.184648 50.192805,-5.184446 50.192739,-5.184259 50.192657,-5.18409 50.192559,-5.183943 50.192449,-5.183819 50.192327,-5.183722 50.192196,-5.183652 50.192057,-5.183611 50.191914,-5.183599 50.191769,-5. [...]
-"LineString(-5.191775 50.191899,-5.191728 50.192041,-5.191652 50.192178,-5.191549 50.192307,-5.19142 50.192427,-5.191268 50.192535,-5.191095 50.192629,-5.190905 50.192708,-5.1907 50.192771,-5.190484 50.192816,-5.190261 50.192842,-5.190034 50.192849,-5.189808 50.192838,-5.189586 50.192808,-5.189372 50.192759,-5.18917 50.192693,-5.188983 50.19261,-5.188814 50.192513,-5.188667 50.192402,-5.188543 50.192281,-5.188446 50.192149,-5.188376 50.192011,-5.188334 50.191868,-5.188323 50.191723,-5.18 [...]
-"LineString(-5.177742 50.191769,-5.174272 50.191738)","CCW, dy > 0",,
-"LineString(-5.182346 50.191785,-5.178875 50.191754)","CCW, dy < 0",,
-"LineString(-5.18707 50.1918,-5.183599 50.191769)","CW, dy > 0",,
-"LineString(-5.191793 50.191754,-5.188323 50.191723)","CW, dy < 0",,
\ No newline at end of file
diff --git a/tests/visual_tests/data/line.dbf b/tests/visual_tests/data/line.dbf
deleted file mode 100755
index c27e6d5..0000000
Binary files a/tests/visual_tests/data/line.dbf and /dev/null differ
diff --git a/tests/visual_tests/data/line.shp b/tests/visual_tests/data/line.shp
deleted file mode 100755
index 5297698..0000000
Binary files a/tests/visual_tests/data/line.shp and /dev/null differ
diff --git a/tests/visual_tests/data/line.shx b/tests/visual_tests/data/line.shx
deleted file mode 100755
index 60746df..0000000
Binary files a/tests/visual_tests/data/line.shx and /dev/null differ
diff --git a/tests/visual_tests/data/lines.csv b/tests/visual_tests/data/lines.csv
deleted file mode 100644
index f67763e..0000000
--- a/tests/visual_tests/data/lines.csv
+++ /dev/null
@@ -1,10 +0,0 @@
-wkt,name,nr
-"LineString(0.194483 -0.117354,0.23691 -0.137246,0.252846 -0.181313,0.232953 -0.223741,0.188886 -0.239676,0.146458 -0.219784,0.130523 -0.175717,0.150415 -0.133289,0.194483 -0.117354)","Circle",6
-"LineString(0.747335 -0.107159,0.789763 -0.127051,0.805698 -0.171118,0.785806 -0.213546,0.741739 -0.229481,0.699311 -0.209589,0.683376 -0.165522,0.703268 -0.123094,0.747335 -0.107159)","Circle with long name",7
-"LineString(0.346487 -0.240215,0.535306 -0.240215)","Short line with long name",5
-"LineString(0.347059 -0.122112,0.535878 -0.122112)","Short line",4
-"LineString(0 0,0.9 0)","Rendered @ integer pos. ABCDEFGHIJKLMNOPQRSTUVWXYZ",3
-"LineString(0.002268 0.073178,0.902268 0.073178)","Long line with long name",2
-"LineString(0.003411 0.172529,0.103411 0.172529,0.203411 0.172529,0.303411 0.172529,0.403411 0.172529,0.503411 0.172529,0.603411 0.172529,0.703411 0.172529,0.803411 0.172529,0.903411 0.172529)","Long line with long name and many points",1
-"LineString(0.002841 0.250458,0.902841 0.250458)","Short name",8
-"LineString(0 -0.051,0.9 -0.051)","Rendered @ non-integer p. ABCDEFGHIJKLMNOPQRSTUVWXYZ",9
diff --git a/tests/visual_tests/data/lines2.csv b/tests/visual_tests/data/lines2.csv
deleted file mode 100644
index 4d9b595..0000000
--- a/tests/visual_tests/data/lines2.csv
+++ /dev/null
@@ -1,17 +0,0 @@
-WKT
-"LINESTRING (0.764185269 -0.313888573,0.751190328 -0.314123131,0.737134133 -0.314376844,0.725222103 -0.314591855,0.702047791 -0.315010149,0.688792951 -0.315249398,0.67553811 -0.315488647,0.661092067 -0.315749397,0.641426389 -0.31610436,0.627370194 -0.316358073,0.597525145 -0.316896774,0.584140356 -0.317138368,0.570885515 -0.317377617,0.549747077 -0.317759164,0.533546717 -0.318051579,0.511866823 -0.318442899)"
-"LINESTRING (0.289403766 -0.004374853,0.278998818 -0.012163343,0.267744132 -0.020587892,0.258206263 -0.027727341,0.239650772 -0.041616812,0.229037724 -0.049561069,0.218424677 -0.057505325,0.206857843 -0.066163524,0.191111688 -0.077950096,0.179857002 -0.086374637,0.155960304 -0.104262178,0.145243208 -0.112284308,0.134630161 -0.120228551,0.117704778 -0.132897797,0.104733276 -0.14260742,0.087374354 -0.155601173)"
-"LINESTRING (0.374895934 -0.188749064,0.362443535 -0.270566448,0.295784263 -0.319614717,0.213966216 -0.307162504,0.164917295 -0.240503998,0.177369693 -0.158686453,0.244028965 -0.109637668,0.325847013 -0.122090041,0.374895934 -0.188749064)"
-"LINESTRING (0.892955147 -0.270397048,0.894000762 0.309916722)"
-"LINESTRING (0.055417591 0.248226176,0.059600051 -0.260986614)"
-"LINESTRING (0.777676102 0.026948692,0.765128722 0.016492544,0.747353269 0.008127625,0.731669045 0.012310084,0.719121666 0.021720618,0.708665516 0.03740484,0.697163752 0.05099783,0.685661988 0.06040836,0.666840919 0.061453974,0.646974236 0.054134673,0.627107552 0.041587299,0.608286483 0.024857463,0.59260226 0.013878507,0.574826806 0.005513587,0.559142582 0.009696047,0.546595203 0.019106581,0.536139054 0.034790803,0.524637289 0.048383794,0.513135525 0.057794324,0.494314456 0.058839938,0.4 [...]
-"LINESTRING (0.093560033 0.138666471,0.112381102 0.155396254,0.132247785 0.167943584,0.152114469 0.175262855,0.170935538 0.174217245,0.182437302 0.164806752,0.193939066 0.15121381,0.204395215 0.135529635,0.216942594 0.126119125,0.232626818 0.121936675,0.250402272 0.130301574,0.266086496 0.1412805,0.284907564 0.158010282,0.304774248 0.170557609,0.324640932 0.17787688,0.343462 0.17683127,0.354963765 0.167420778,0.366465529 0.153827838,0.376921678 0.138143665,0.389469057 0.128733156,0.40515 [...]
-"LINESTRING (0.848982597 0.288736581,0.754751857 0.220905399,0.657509669 0.293052099,0.548765717 0.208358108,0.429565615 0.301416905,0.295726905 0.205221284,0.170253114 0.303508106,0.083467075 0.248091159)"
-"LINESTRING (0.090332128 0.348151688,0.187574317 0.410887204,0.309911263 0.313646971,0.436430669 0.403568084,0.548311466 0.316783769,0.660192263 0.398340138,0.759525681 0.319920565,0.85656627 0.390823271)"
-"LINESTRING (0.613502456 -0.015963875,0.790148448 -0.024699116,0.812471843 -0.037316685,0.828971743 -0.062551817,0.830912908 -0.097492748,0.828001161 -0.133404222,0.821207084 -0.172227378,0.807618931 -0.188727197,0.760060395 -0.191638928,0.603796632 -0.185815465)"
-"LINESTRING (0.680933124 -0.244990843,0.50407624 -0.24631506,0.481071446 -0.234987473,0.463163199 -0.210731652,0.459238186 -0.175957816,0.460103038 -0.139938937,0.464678354 -0.100792195,0.477306218 -0.0835463,0.52462221 -0.077934757,0.680964265 -0.074862572)"
-"LINESTRING (0.345138881 -0.004954418,0.367100653 -0.140842741)"
-"LINESTRING (0.41651464 -0.017307915,0.393180257 -0.171040066)"
-"LINESTRING (0.45220252 -0.037897074,0.59769926 -0.042014905)"
-"LINESTRING (0.72397945 -0.139470135,0.577110099 -0.140842741)"
-"LINESTRING (0.820051288 0.095328839,0.850629325 0.095086193,0.850629325 0.072034887,0.735372668 0.072034887)"
diff --git a/tests/visual_tests/data/lower_columbia.tif b/tests/visual_tests/data/lower_columbia.tif
deleted file mode 100644
index 1a0cfa8..0000000
Binary files a/tests/visual_tests/data/lower_columbia.tif and /dev/null differ
diff --git a/tests/visual_tests/data/marker-multi-policy.csv b/tests/visual_tests/data/marker-multi-policy.csv
deleted file mode 100644
index 3b55ddf..0000000
--- a/tests/visual_tests/data/marker-multi-policy.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-i|wkt
-1|MULTIPOLYGON(((90 40,50 0,10 40,50 80,90 40)),((190 40,150 0,110 40,150 80,190 40)),((190 140,150 100,110 140,150 180,190 140)))
-2|MULTIPOLYGON(((48 130,40 122,32 130,40 138,48 130)),((40 140,20 120,0 140,20 160,40 140)),((48 150,40 142,32 150,40 158,48 150)))
diff --git a/tests/visual_tests/data/marker-on-line.csv b/tests/visual_tests/data/marker-on-line.csv
deleted file mode 100644
index 4835d65..0000000
--- a/tests/visual_tests/data/marker-on-line.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-i|wkt
-1|LINESTRING(-10 0, 0 20, 10 0, 15 5)
diff --git a/tests/visual_tests/data/overlap.dbf b/tests/visual_tests/data/overlap.dbf
deleted file mode 100644
index 566f81b..0000000
Binary files a/tests/visual_tests/data/overlap.dbf and /dev/null differ
diff --git a/tests/visual_tests/data/overlap.shp b/tests/visual_tests/data/overlap.shp
deleted file mode 100644
index 7462a5b..0000000
Binary files a/tests/visual_tests/data/overlap.shp and /dev/null differ
diff --git a/tests/visual_tests/data/overlap.shx b/tests/visual_tests/data/overlap.shx
deleted file mode 100644
index c6308ec..0000000
Binary files a/tests/visual_tests/data/overlap.shx and /dev/null differ
diff --git a/tests/visual_tests/data/pattern.png b/tests/visual_tests/data/pattern.png
deleted file mode 100644
index b1d977a..0000000
Binary files a/tests/visual_tests/data/pattern.png and /dev/null differ
diff --git a/tests/visual_tests/data/points.csv b/tests/visual_tests/data/points.csv
deleted file mode 100644
index 16b469d..0000000
--- a/tests/visual_tests/data/points.csv
+++ /dev/null
@@ -1,11 +0,0 @@
-lat,long,name,nr,color
-0,0,Test one,1,#ff0000
-0,0.1,Test two,2,red
-0,0.2,Test three,3,#00ff00
-0,0.3,Test four,4,green
-0,0.4,Test five,5,#0000ff
-0,0.5,Test six,6,blue
-0,0.6,Test seven,7,#000000
-0,0.7,Test eight,8,black
-0,0.8,Test nine,9,#ffffff
-0,0.9,Test ten,10,white
\ No newline at end of file
diff --git a/tests/visual_tests/data/repeat-labels.csv b/tests/visual_tests/data/repeat-labels.csv
deleted file mode 100644
index 2062940..0000000
--- a/tests/visual_tests/data/repeat-labels.csv
+++ /dev/null
@@ -1,10 +0,0 @@
-wkt,type,name,ref
-"POINT(-3 -0.40)",poi,,
-"POINT(3 -0.40)",poi,,
-"POINT(-3 -3.6)",poi,,
-"POINT(3 -3.6)",poi,,
-"LINESTRING(-12 2, 12 2)",motorway,First Hwy,1
-"LINESTRING(-12 1, 12 1)",motorway,First Hwy,1
-"LINESTRING(-12 3, 12 3)",motorway,Second Hwy,2
-"LINESTRING(-12 -1, 8 -1, 8 -2, -8 -2, -8 -3, 12 -3)",secondary,Main Street,
-
diff --git a/tests/visual_tests/data/satellite.png b/tests/visual_tests/data/satellite.png
deleted file mode 100644
index 0275f36..0000000
Binary files a/tests/visual_tests/data/satellite.png and /dev/null differ
diff --git a/tests/visual_tests/data/snow-cover.tif b/tests/visual_tests/data/snow-cover.tif
deleted file mode 100644
index 239fad9..0000000
Binary files a/tests/visual_tests/data/snow-cover.tif and /dev/null differ
diff --git a/tests/visual_tests/data/text-data-binding.sqlite b/tests/visual_tests/data/text-data-binding.sqlite
deleted file mode 100644
index 2348be2..0000000
Binary files a/tests/visual_tests/data/text-data-binding.sqlite and /dev/null differ
diff --git a/tests/visual_tests/data/textspacing.dbf b/tests/visual_tests/data/textspacing.dbf
deleted file mode 100644
index bd1b127..0000000
Binary files a/tests/visual_tests/data/textspacing.dbf and /dev/null differ
diff --git a/tests/visual_tests/data/textspacing.shp b/tests/visual_tests/data/textspacing.shp
deleted file mode 100644
index 60dc7c0..0000000
Binary files a/tests/visual_tests/data/textspacing.shp and /dev/null differ
diff --git a/tests/visual_tests/data/textspacing.shx b/tests/visual_tests/data/textspacing.shx
deleted file mode 100644
index 9c4767d..0000000
Binary files a/tests/visual_tests/data/textspacing.shx and /dev/null differ
diff --git a/tests/visual_tests/data/whole-centroid.csv b/tests/visual_tests/data/whole-centroid.csv
deleted file mode 100644
index f630955..0000000
--- a/tests/visual_tests/data/whole-centroid.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-i|wkt
-1|MULTIPOLYGON(((1350057.96009438 5942345.52058283,1384876.13646624 5891754.2133652,1527153.68896859 5865144.36766544,1489794.86785838 5828107.21457916,1521644.71000822 5808839.16705438,1500586.73589334 5782129.46376012,1549474.58270654 5722446.94649062,1526963.22131985 5715859.64352432,1468675.11142609 5744853.11521536,1367157.74707515 5695509.5055605,1353768.57268098 5663160.88833932,1395853.46277285 5615400.34143299,1363168.83576153 5576894.81504537,1376836.42020216 5503694.0028362,15 [...]
diff --git a/tests/visual_tests/grids/building-symbolizer-opacity-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/building-symbolizer-opacity-512-512-1.0-grid-reference.json
deleted file mode 100644
index 2e111c9..0000000
--- a/tests/visual_tests/grids/building-symbolizer-opacity-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ! ",
- " !!! ",
- " !!!!! ",
- " !!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ## !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " #### # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ###### ### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ######## ##### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########## ####### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ############ ######### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ############## ########### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "############################ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ########################## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ########################## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ############## ########### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ############ ######### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########## ####### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ######## ##### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ###### ### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " #### # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ## !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!! ",
- " !!!!! ",
- " !!! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ! ",
- " !!!! !!! ",
- " !!!!!! !!!!! ",
- " !!!!!!!! !!!!!!! ",
- " !!!!!!!!!! !!!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!!!! !!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!! !!!!!!!!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!! !!!!!!!! ",
- " !!!!!! !!!!!! ",
- " !!!! !!!! ",
- " !! !! ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/building-symbolizer-opacity-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/building-symbolizer-opacity-512-512-2.0-grid-reference.json
deleted file mode 100644
index 2e111c9..0000000
--- a/tests/visual_tests/grids/building-symbolizer-opacity-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ! ",
- " !!! ",
- " !!!!! ",
- " !!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ## !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " #### # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ###### ### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ######## ##### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########## ####### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ############ ######### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ############## ########### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "############################ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ########################## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ########################## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########################## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ############## ########### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ############ ######### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ########## ####### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ######## ##### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ###### ### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " #### # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ## !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!! ",
- " !!!!! ",
- " !!! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ! ",
- " !!!! !!! ",
- " !!!!!! !!!!! ",
- " !!!!!!!! !!!!!!! ",
- " !!!!!!!!!! !!!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!!!! !!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!! !!!!!!!!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!! !!!!!!!! ",
- " !!!!!! !!!!!! ",
- " !!!! !!!! ",
- " !! !! ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/charspacing-200-400-1.0-grid-reference.json b/tests/visual_tests/grids/charspacing-200-400-1.0-grid-reference.json
deleted file mode 100644
index 617c072..0000000
--- a/tests/visual_tests/grids/charspacing-200-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "6"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! !! !!!! ! !!! ! ",
- " ! !!!! !! ! !! !!! ",
- " ! ! ! ! ! ",
- " ! ! !! !!!!! !! ",
- " !! ! ! !! ! ",
- " !!! !! !!!! ! !!! !! ",
- " !! !!! !! ! !! ! ",
- " ! ! ! ! ",
- " !! !!!!! !! ! ",
- " ! !! ! ! ! ! ",
- " !! ! !! ! !!! ! !! ! ",
- " !!! !! ! !! ! ! ",
- " !! ! ! ! ",
- " ! !!! !!!! ! ! !! ! ",
- " ! ! !! ! ! ! ! ",
- " ! ! ! ! !! ! !!! ! !! ! ",
- " !!!! !!! ! ! !!!! ",
- " !!! ! ! ! ! !! ",
- " ! ! !! !!! !! !! ",
- " ! !! ! ! ",
- " !!! !! !! ! !!! ! !! ",
- " !! !! !!! !! !!!! ",
- " ! ! ! ! ! ! ",
- " !! ! !!! !!! ! ",
- " ! ! ! ! ! ",
- " !!!! !! ! !!! ! ! ",
- " !!!! !!! !!!! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! !!! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! !! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! !!! ! !! ! !!!! ! ",
- " ! ! ! !! ! ",
- " !! ! !! ! ! ! ! ! !! ! ",
- " !! !! ! !! ! ! !! !! ",
- " ! ! ! ! ! ",
- " !! !! ! ! ! ! ! !! ",
- " ! ! ! ! ! ! ! ",
- " !! ! !! ! ! ! ! ! ! ! ",
- " !! ! ! !! ! !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/charspacing-200-400-2.0-grid-reference.json b/tests/visual_tests/grids/charspacing-200-400-2.0-grid-reference.json
deleted file mode 100644
index 38fe2f0..0000000
--- a/tests/visual_tests/grids/charspacing-200-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "6"
- ],
- "data": {},
- "grid": [
- " ",
- " ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! !! !! !! ! ! ! ! ! ",
- " ! ! ! ! !! !! !! !! !! ! ! ! ! ! ",
- " ! ! ! !! ! ! ! ! ! ",
- " ! ! ! ! ",
- " ! !!! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ! ! ",
- " ! !! !! ! ! !! !! ! ! ! ! ! ",
- " ! ! ! !! ! ! ! ! ",
- " ! ! ! ! ",
- " ! !! ! ! ! ! ! ! ! ! ! ",
- " ! ! !! ! ! ! !! ! ! ! ! ! ! ",
- " ! ! ! !! ! !! !! ! ! ! ! ",
- " !! ! !! !! ! ! ! ",
- " ! ! ! ",
- " ! !! ! ! ! ! ! ! ! ! ! !",
- " ! ! ! ! ! !! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ! ! ! ! !",
- " ! ! !! !! ! ! ! ! ! ",
- " ! ! ! ! ",
- " ! !!! ! ! !! ! ! ! ! ! ! ! !!",
- " ! ! ! ! ! ! ! !! ! ! ! ! ! ! !!",
- " !! ! ! ! ! ! ! !! ! ! ! ! ! ! !!!",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ",
- " ! !! ! ! ! ! ! ! ! ! !! ! ",
- " ! ! ! ! ! ! ! ! !! ! !!",
- " ! ! ! ! ! ! ! !! ! ! !! ! !! ",
- " !! ! ! ! ! ! ! !!",
- " ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! !!",
- " ! ! ! !! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! !",
- " ! ! ",
- " ! !! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ",
- " ! !! ! ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !",
- " ! ! !! ! ! !! ! ! ! ! ! ! ! ! !",
- " ! ! ! !! ! ! ! ",
- " ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! !! ! ! ! ! ",
- " ! ! ! ! ",
- " ! !! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " !! ! !! !! ! ! ! ",
- " ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! !! ! !! ! ",
- " ! ! ! ",
- "! ! !! ! ! !! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ",
- "! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! !",
- "! ! ! ! ! ! ! ! ! ! ! ! ! !",
- " ! ! !! ! ! ",
- " ! ! ! ! ",
- " !! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! !! ! !! ",
- " ! ! !",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ! ! !! ! ! ",
- " ! ! ",
- " ! ! ! ! ! ",
- "! ! ! ! ! ! ",
- "! ! ! ! ! ! ! ! ",
- " ! !! ! !! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/charspacing-lines-300-300-1.0-grid-reference.json b/tests/visual_tests/grids/charspacing-lines-300-300-1.0-grid-reference.json
deleted file mode 100644
index a792e96..0000000
--- a/tests/visual_tests/grids/charspacing-lines-300-300-1.0-grid-reference.json
+++ /dev/null
@@ -1,84 +0,0 @@
-{
- "keys": [
- "",
- "6"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ! !! ! !! ! ! ! ! ",
- " ! ! ! !! ! !! ! ! ! ! ",
- " !! ! ! ",
- " !! !! ! ! ! ! ! !! !! ",
- " !! ",
- " ! ! ! ! ! !! ! !! !! ! ! ",
- " !! ! ! ! !! ! !! !! ! ! ",
- " !!! ! ! ",
- " !!!! ! ! !!!! ",
- " ! ",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! !! ! ",
- " ! ! ! ",
- " ! ! ! ! ! ",
- " ! ",
- " ! !! !!!! !!!!!! ",
- " ! !!! !!!! !!!!!! ! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !! !!!! !!!!! ! ",
- " ! ! ",
- " ! ! ! ! !!!! !!!!! ! ",
- " !!! ! !!!! !!!!! ! ! ",
- " !!! ! ! !! ",
- " ! !!! !!!! !!! ",
- " ! ! ",
- " ! !!! ! !!!! !!! ! ! ! ",
- " !!!! !!!! !!!!! !!!! ",
- " ! ! ! ! ",
- " !!! !!!! !! !! ",
- " ! ! ",
- " !!!! !!!! !!! ! !! ! ",
- " ! !! !!!! !! ! !!! ",
- " !! ! ! ! ",
- " !! !!!! ! !! ! ",
- " ! ! ",
- " ! ! !! ! !! !!! ! ! ",
- " !! !! ! !! !! !! ! !! ",
- " !! ! ! ! ",
- " ! !!!! ! ! ! !! ",
- " ! ",
- " !!!! ! !! !!!!! !! ",
- " !!!!! ! !! !! !! !!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/charspacing-lines-300-300-2.0-grid-reference.json b/tests/visual_tests/grids/charspacing-lines-300-300-2.0-grid-reference.json
deleted file mode 100644
index ec90226..0000000
--- a/tests/visual_tests/grids/charspacing-lines-300-300-2.0-grid-reference.json
+++ /dev/null
@@ -1,84 +0,0 @@
-{
- "keys": [
- "",
- "6"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ! ! ",
- " !! !! !! !! !! !! !! !! !!! ! ",
- " ! ! ! !! ! ! !! ! ! ! ! !! ",
- " ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ",
- " ! ! ",
- " !! ! !! !! ",
- " ! !! !! !! !! !!! !! !! ! !! !!! ! ",
- " ! !! ! !! ! ! !! ! ! ! ! ! ! ",
- " ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ",
- " ! ! !! !! ",
- " ! !!! !! !! !! !! !! !! !! !! ! ",
- " ! ! !! ! !! !! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! !! !! ! ! ! ! ! ! ! !! ",
- " ! ! ",
- " !! ! ! ! !! ",
- " !! !! ! !! !! !! !! ! !!! !! ! ",
- " ! ! !! ! ! ! !! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ",
- " ! ! ",
- " !! ! ! ! ! ",
- " ! !!! !! !! !! !!! !! !! ! !! !! ! ! ! ",
- " ! ! ! !!! !! ! ! !!! ! ! ! ! ! ! ! ",
- " ! !! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !! !!! !! !! !! !! !! ! !! !! ! ! ! ",
- " ! !! ! !! ! !!! ! ! ! ! ! !! ",
- " ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ",
- " ! ",
- " !! ! ! !! ! ",
- " ! !! !! !! !! !! !! !! ! !! !!! ! ! ",
- " ! ! ! !! ! ! !!! ! ! ! ! !!! ",
- " ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! !! ! ! ! ",
- " ! ! ",
- " !! ! ! !! ",
- " !!! !! !! !! !! !! !! !!! !!! ! ! ! ",
- " ! ! ! !! ! ! !!!! ! ! ! ! ! ! ! ",
- " ! !! ! !! ! ! !! ! ! ! ! ! ! ! ! ",
- " ",
- " !! ! !! ",
- " ! !! !! ! !! !! !! !! !!! !! ! ! ",
- " ! ! !!! ! ! !!!! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! !! ! ! ! !! ",
- " ! ",
- " !! ! !! !! ",
- " ! !! !! !! !! !! !! !! !!! !! ! ! ",
- " ! ! ! !! ! ! ! !!!!! ! !! ! ! ! ! ",
- " !! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ",
- " ! ! !! ! ",
- " ! !!! !! !! !! !! !! !! !! !! ! !! ",
- " ! ! !! ! !! ! ! !!! ! !! ! !! ",
- " ! !! ! ! ! ! !! ! ! !! ! !! ! ! ",
- " ! ! ",
- " !! ! ! !! ",
- " ! !! !! !! !! !! !! !!! !! !! ! ! ! ",
- " ! !! ! !! ! ! !!! ! ! !! ! ! ! !! ",
- " ! ! ! ! !! !! ! ! !! ! ! ! !! ! ",
- " ! ! ! ",
- " !! ! ! ! !! ",
- " ! !! !! ! !! !! !! !!! !! !!! ! ! ! ",
- " ! ! ! !! !! ! ! !!! ! ! ! ! ! ! ! ",
- " ! !! !! ! ! !! !! !! ! ! ! ! ! !! ! ",
- " ! ! ! ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/collision-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/collision-600-400-1.0-grid-reference.json
deleted file mode 100644
index e59d9c9..0000000
--- a/tests/visual_tests/grids/collision-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ",
- " !!! ",
- " !!!! ",
- " !!!!! ",
- " !!!!!! ",
- " !!!!! ",
- " !!!! ",
- " !!! !! ",
- " !!! ",
- " !!!! ",
- " !!!!! ",
- " !!!!!! ",
- " !!!!! ",
- " !!!! !! ",
- " !! !!! ",
- " !!!! ",
- " !!!!! ",
- " !!!!!!! ",
- " !!!! ",
- " !! ",
- " !! ",
- " !!!! ",
- " !!!!! ",
- " !!!!! ",
- " !!!!! ",
- " !!!! ",
- " !! ",
- " ",
- " !!!! ",
- " !!!! ",
- " !!! ",
- " !!! ",
- " !!! ",
- " !!! ",
- " !!!! ",
- " !!! ",
- " ",
- " !! ",
- " !!! ",
- " !!! ",
- " !!! ",
- " !!! ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " ! ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!! ",
- " ! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!! ",
- " ",
- " !!! ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!!! ",
- " !!!! ",
- " !!! !! ",
- " !!! ",
- " !!!! ",
- " !!!!!! ",
- " !!!!!! ",
- " !!!! ",
- " !! !!!! ",
- " !!!! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!!!!! !! ",
- " !! !!!! ",
- " !!!!!! ",
- " !!!!!!!! ",
- " !!!!!! !! ",
- " !! !!!! ",
- " !!!!!!!! ",
- " !!!!!!!! ",
- " !!!!! ",
- " !! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/collision-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/collision-600-400-2.0-grid-reference.json
deleted file mode 100644
index 60bcfb2..0000000
--- a/tests/visual_tests/grids/collision-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! !!!! ",
- " !!!!! ",
- " !!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!!! ",
- " !!!! ! ",
- " !!!! !! ",
- " !!! !! !!!! ",
- " !!!!! ",
- " !!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!! ",
- " !!! !!! ",
- " !! ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " !!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!! ",
- " !!!!!! ",
- " !!!!!! ",
- " !!!!!! ",
- " !!!!!! ",
- " !!!!!! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!! ",
- " !!!!!! ",
- " !!! ! ",
- " ! ",
- " ! ",
- " ! ",
- " !!!!! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!!!!! ",
- " !!!!!! ",
- " !!!!!!! ",
- " !!!!!! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!! ",
- " !!! !! ",
- " !!! ! ",
- " ! ",
- " ! !!! ",
- " ! !!!! ",
- " !!!!! ",
- " !!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!! !! !!! ",
- " !!! !! !!!! ",
- " !!! !!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!!!! ",
- " !!!!!! !!! ",
- " !!!!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/colorize-alpha1-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/colorize-alpha1-512-512-1.0-grid-reference.json
deleted file mode 100644
index 10e41a5..0000000
--- a/tests/visual_tests/grids/colorize-alpha1-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,283 +0,0 @@
-{
- "keys": [
- "",
- "66",
- "28",
- "119",
- "135",
- "168",
- "78",
- "151",
- "53",
- "58",
- "51",
- "44",
- "97",
- "99",
- "20",
- "75",
- "118",
- "42",
- "128",
- "84",
- "31",
- "56",
- "98",
- "41",
- "166",
- "108",
- "29",
- "80",
- "10",
- "72",
- "134",
- "19",
- "147",
- "169",
- "83",
- "131",
- "50",
- "3",
- "104",
- "65",
- "162",
- "59",
- "158",
- "86",
- "130",
- "76",
- "157",
- "100",
- "46",
- "161",
- "39",
- "153",
- "77",
- "1",
- "123",
- "88",
- "94",
- "74",
- "103",
- "48",
- "138",
- "90",
- "120",
- "110",
- "25",
- "106",
- "18",
- "105",
- "4",
- "122",
- "16",
- "163",
- "38",
- "137",
- "115",
- "154",
- "139",
- "91",
- "171",
- "71",
- "45",
- "174",
- "156",
- "67",
- "69",
- "141",
- "49",
- "126",
- "144",
- "117",
- "15",
- "116",
- "52",
- "87",
- "36",
- "170",
- "160",
- "61",
- "60",
- "155",
- "14",
- "33",
- "140",
- "145",
- "146",
- "124",
- "68",
- "143",
- "32",
- "27",
- "95",
- "148",
- "93",
- "34",
- "73",
- "112",
- "23",
- "64",
- "35",
- "165",
- "85",
- "47",
- "125",
- "57",
- "164",
- "127",
- "2",
- "176",
- "159",
- "142",
- "22",
- "111",
- "109",
- "9",
- "102",
- "172",
- "113",
- "177",
- "54",
- "30",
- "132",
- "26",
- "5",
- "175",
- "167",
- "121",
- "55",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ",
- " ##########!!!!!!!!!!!!!!!!!!!! $$ %%% %%% ",
- " # ###########!!!!!!!!!!!!!!!!!!!! $$ $ %% ",
- " ##### ######## !!!!!!!!!!!!!!! %%% %%%%%%%%%% %%%%% ",
- " ####### ### ###### !!!!!!!!!!!! % % %%%%%%%%%%%%%%%%%% %%%% ",
- " &&&&&&&&# ###### ######### ####### !!!!!!!!!!! $$$$%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%",
- "%%%% &&&&&&&&###################### ##### !!!!!!!! ' $((())%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " %& &&&&&&&###################### ### !!!! ''' $$((()))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&&################# ### !! $$$(( ))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ",
- " &&& &&############## ###### * $$(( +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ",
- " && &################# ####### ** ,,( -./%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ",
- " ############################ 0 ** 1223333//%%%%%%%%%%%444444%%%%%%%%%%%%%%%55%%%%%% % ",
- " ######################## # * 667228839999999%%%444444444444%%%:%::%%%%%%555%%%% % ",
- " &&&&&&&&&&&&&&#####&## ## 6666;<=>>???999%%%%44444444444445:::::::::::55555%% % ",
- " &&&&&&&&&&&&&&&##&&&&# 666<< @AA?? 9 %%% 44BB444444455555::::::5555555%% C ",
- " &&&&&&&&&&&&&&&&&&&& DEEEE <<<<FGHIIII IJ% KBKBBBBLLL55555555:5555555MM C ",
- " &&&&&&&&&&&&&&&&&& DEEE < < H IIIIIINN KKKKBBOO555555555555555 5 M C ",
- " &&&&&&&&&&&&&&&&& P QQQR SITUUNNNNNKVVVWW555555555555555 XX CCC ",
- " &&&&&&&&&&&&&& PPPQQQRR Y TUUUNNNNNVVVWWZZ555555555555555 CC ",
- " [[[[&&&&&&&&& PPQQQQQYYYYY]]]]^^^U_NNNNVVWWWZZ`55555555555555 ",
- " [[[[[[& & PPaQQQQQQYYYYY]]]]^^^^^ NNNNWWWZZZZ``bZcc5555555 ",
- " [ [[[[ d PaaeQQQQQYYYYY]]]]^^^^^^fg WWZZZZZZhZc55555555i ",
- " & [[[ [jjj kkaaeeeQQlllmmYnnnnn^^^^^^gg ZZZZZZZhcccopp55 ",
- " [[[[[[ qr aaaaeeeellllmmmnnnnn ^^^sgg ZZZZZ ctop 5 ",
- " [[[uvv wwaaaeeelllmmmmnnnnnxssss ZZZZ ctttp y ",
- " z{{ wweee|ll}}}mmmnnnnn~~xs ZZ tt\u007fp yy ",
- " { \u0080\u0081\u0081\u0081\u0081\u0082 \u0083\u0083ee\u0084\u0085\u0086}}}\u0087mmn\u0088n\u0088\u0088~~\u0089\u0089\u0089\u008a ZZ t pp y y ",
- " \u008b\u008b\u0080\u0081\u0081\u0081\u0081\u0081\u008c \u008d\u0083\u008e\u0084\u0085}}}}\u0087m\u008f\u008f\u0088\u0088\u0088\u0088~~~~\u008a \u0090 t y ",
- " \u0080\u0080\u0080\u0081\u0081\u0081\u008c\u00916 \u0092\u008e\u0084 }}\u0087\u0087\u008f\u0093\u0093\u0093\u0088\u0088\u0088~~~\u008a\u008a \u0094 \u0095 \u0095\u0095 ",
- " \u0080\u0080\u0080\u0080\u0081\u0081\u0096\u008c\u00916\u0096 \u0097\u0098\u0098\u0093\u0093\u0093\u0093\u0099\u0099\u009a\u009a\u008a\u008a \u0094\u0095\u0095 \u0095\u0095\u0094 ",
- " \u009b\u009b\u009c\u0080\u0080\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u009d\u009d\u009d\u0098\u0093\u0093\u0093\u0093\u0099\u0099\u009a\u009a\u008a \u0094\u0094 \u0094\u0094\u0094 \u0094 \u0094 ",
- " \u009c\u009c\u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u009d\u0098\u0093\u0093\u0093\u0093\u0093\u009e\u009e\u009e\u009a \u0094\u0094 \u0094\u0094 \u0094 \u0094\u0094\u0094\u0094\u0094\u009f\u009f \u009f ",
- " \u009c\u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u0093\u0093\u0093\u0093\u0093\u009e\u009e\u009e \u0094 \u0094\u009f\u009f\u009f\u009f \u009f ",
- " \u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u0093\u0093\u00a1\u00a1\u009e\u009e\u009e \u0094\u0094\u0094\u00a2 \u009f \u009f\u009f \u00a3 ",
- " \u009c\u009c\u009c\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u00a0\u00a1\u00a1\u00a1\u00a5\u009e\u00a6 \u00a7\u00a7 ",
- " \u009c\u009c\u009c\u00a4\u00a4\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u00a1\u00a1\u00a1\u00a1\u00a5\u00a6\u00a6 \u00a8 \u00a7\u00a7\u00a7\u00a7 \u00a7 \u00a9 ",
- " \u009c\u00a4\u00a4\u00a4\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00aa\u00a1\u00ab\u00ab\u00ab\u00a6\u00a6 \u00a8\u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 \u00ac",
- " \u00ad\u00a4\u00a4\u00ae\u00ae\u0096\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00af\u00af\u00ab\u00ab\u00a6 \u00a8\u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00ad\u00b0\u00ae\u00ae\u00ae\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00af\u00af\u00b1\u00b1\u00a6 \u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00ae\u0096\u0096 \u00aa\u00b1\u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u0096\u0096\u0096 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00b0\u00b0\u00b0\u00b0\u00b0\u00b2\u0096 \u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00b2 \u00b1 \u00a7\u00a7 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00b0 \u00a7\u00a7\u00a7\u00a7 \u00b3 ",
- " \u00ad\u00b0\u00b0\u00b0 \u00b3 ",
- " \u00ad\u00b0\u00b0\u00b0 \u00a7 \u00b3 ",
- " \u00ad\u00b0\u00b0 \u00b3\u00b3 ",
- " \u00ad\u00ad\u00b0\u00b0 ",
- " \u00ad\u00ad\u00b0 \u00b4 ",
- " \u00ad\u00ad\u00b0 ",
- " ",
- " ",
- " ",
- " \u00b5 \u00b5 ",
- " \u00b5 \u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 ",
- " \u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 ",
- " \u00b5 \u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 [...]
- " \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u [...]
- " \u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u0 [...]
- " \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00 [...]
- "\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u [...]
- "\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u0 [...]
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/colorize-alpha1-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/colorize-alpha1-512-512-2.0-grid-reference.json
deleted file mode 100644
index 10e41a5..0000000
--- a/tests/visual_tests/grids/colorize-alpha1-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,283 +0,0 @@
-{
- "keys": [
- "",
- "66",
- "28",
- "119",
- "135",
- "168",
- "78",
- "151",
- "53",
- "58",
- "51",
- "44",
- "97",
- "99",
- "20",
- "75",
- "118",
- "42",
- "128",
- "84",
- "31",
- "56",
- "98",
- "41",
- "166",
- "108",
- "29",
- "80",
- "10",
- "72",
- "134",
- "19",
- "147",
- "169",
- "83",
- "131",
- "50",
- "3",
- "104",
- "65",
- "162",
- "59",
- "158",
- "86",
- "130",
- "76",
- "157",
- "100",
- "46",
- "161",
- "39",
- "153",
- "77",
- "1",
- "123",
- "88",
- "94",
- "74",
- "103",
- "48",
- "138",
- "90",
- "120",
- "110",
- "25",
- "106",
- "18",
- "105",
- "4",
- "122",
- "16",
- "163",
- "38",
- "137",
- "115",
- "154",
- "139",
- "91",
- "171",
- "71",
- "45",
- "174",
- "156",
- "67",
- "69",
- "141",
- "49",
- "126",
- "144",
- "117",
- "15",
- "116",
- "52",
- "87",
- "36",
- "170",
- "160",
- "61",
- "60",
- "155",
- "14",
- "33",
- "140",
- "145",
- "146",
- "124",
- "68",
- "143",
- "32",
- "27",
- "95",
- "148",
- "93",
- "34",
- "73",
- "112",
- "23",
- "64",
- "35",
- "165",
- "85",
- "47",
- "125",
- "57",
- "164",
- "127",
- "2",
- "176",
- "159",
- "142",
- "22",
- "111",
- "109",
- "9",
- "102",
- "172",
- "113",
- "177",
- "54",
- "30",
- "132",
- "26",
- "5",
- "175",
- "167",
- "121",
- "55",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ",
- " ##########!!!!!!!!!!!!!!!!!!!! $$ %%% %%% ",
- " # ###########!!!!!!!!!!!!!!!!!!!! $$ $ %% ",
- " ##### ######## !!!!!!!!!!!!!!! %%% %%%%%%%%%% %%%%% ",
- " ####### ### ###### !!!!!!!!!!!! % % %%%%%%%%%%%%%%%%%% %%%% ",
- " &&&&&&&&# ###### ######### ####### !!!!!!!!!!! $$$$%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%",
- "%%%% &&&&&&&&###################### ##### !!!!!!!! ' $((())%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " %& &&&&&&&###################### ### !!!! ''' $$((()))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&&################# ### !! $$$(( ))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ",
- " &&& &&############## ###### * $$(( +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ",
- " && &################# ####### ** ,,( -./%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ",
- " ############################ 0 ** 1223333//%%%%%%%%%%%444444%%%%%%%%%%%%%%%55%%%%%% % ",
- " ######################## # * 667228839999999%%%444444444444%%%:%::%%%%%%555%%%% % ",
- " &&&&&&&&&&&&&&#####&## ## 6666;<=>>???999%%%%44444444444445:::::::::::55555%% % ",
- " &&&&&&&&&&&&&&&##&&&&# 666<< @AA?? 9 %%% 44BB444444455555::::::5555555%% C ",
- " &&&&&&&&&&&&&&&&&&&& DEEEE <<<<FGHIIII IJ% KBKBBBBLLL55555555:5555555MM C ",
- " &&&&&&&&&&&&&&&&&& DEEE < < H IIIIIINN KKKKBBOO555555555555555 5 M C ",
- " &&&&&&&&&&&&&&&&& P QQQR SITUUNNNNNKVVVWW555555555555555 XX CCC ",
- " &&&&&&&&&&&&&& PPPQQQRR Y TUUUNNNNNVVVWWZZ555555555555555 CC ",
- " [[[[&&&&&&&&& PPQQQQQYYYYY]]]]^^^U_NNNNVVWWWZZ`55555555555555 ",
- " [[[[[[& & PPaQQQQQQYYYYY]]]]^^^^^ NNNNWWWZZZZ``bZcc5555555 ",
- " [ [[[[ d PaaeQQQQQYYYYY]]]]^^^^^^fg WWZZZZZZhZc55555555i ",
- " & [[[ [jjj kkaaeeeQQlllmmYnnnnn^^^^^^gg ZZZZZZZhcccopp55 ",
- " [[[[[[ qr aaaaeeeellllmmmnnnnn ^^^sgg ZZZZZ ctop 5 ",
- " [[[uvv wwaaaeeelllmmmmnnnnnxssss ZZZZ ctttp y ",
- " z{{ wweee|ll}}}mmmnnnnn~~xs ZZ tt\u007fp yy ",
- " { \u0080\u0081\u0081\u0081\u0081\u0082 \u0083\u0083ee\u0084\u0085\u0086}}}\u0087mmn\u0088n\u0088\u0088~~\u0089\u0089\u0089\u008a ZZ t pp y y ",
- " \u008b\u008b\u0080\u0081\u0081\u0081\u0081\u0081\u008c \u008d\u0083\u008e\u0084\u0085}}}}\u0087m\u008f\u008f\u0088\u0088\u0088\u0088~~~~\u008a \u0090 t y ",
- " \u0080\u0080\u0080\u0081\u0081\u0081\u008c\u00916 \u0092\u008e\u0084 }}\u0087\u0087\u008f\u0093\u0093\u0093\u0088\u0088\u0088~~~\u008a\u008a \u0094 \u0095 \u0095\u0095 ",
- " \u0080\u0080\u0080\u0080\u0081\u0081\u0096\u008c\u00916\u0096 \u0097\u0098\u0098\u0093\u0093\u0093\u0093\u0099\u0099\u009a\u009a\u008a\u008a \u0094\u0095\u0095 \u0095\u0095\u0094 ",
- " \u009b\u009b\u009c\u0080\u0080\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u009d\u009d\u009d\u0098\u0093\u0093\u0093\u0093\u0099\u0099\u009a\u009a\u008a \u0094\u0094 \u0094\u0094\u0094 \u0094 \u0094 ",
- " \u009c\u009c\u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u009d\u0098\u0093\u0093\u0093\u0093\u0093\u009e\u009e\u009e\u009a \u0094\u0094 \u0094\u0094 \u0094 \u0094\u0094\u0094\u0094\u0094\u009f\u009f \u009f ",
- " \u009c\u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u0093\u0093\u0093\u0093\u0093\u009e\u009e\u009e \u0094 \u0094\u009f\u009f\u009f\u009f \u009f ",
- " \u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u0093\u0093\u00a1\u00a1\u009e\u009e\u009e \u0094\u0094\u0094\u00a2 \u009f \u009f\u009f \u00a3 ",
- " \u009c\u009c\u009c\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u00a0\u00a1\u00a1\u00a1\u00a5\u009e\u00a6 \u00a7\u00a7 ",
- " \u009c\u009c\u009c\u00a4\u00a4\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u00a1\u00a1\u00a1\u00a1\u00a5\u00a6\u00a6 \u00a8 \u00a7\u00a7\u00a7\u00a7 \u00a7 \u00a9 ",
- " \u009c\u00a4\u00a4\u00a4\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00aa\u00a1\u00ab\u00ab\u00ab\u00a6\u00a6 \u00a8\u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 \u00ac",
- " \u00ad\u00a4\u00a4\u00ae\u00ae\u0096\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00af\u00af\u00ab\u00ab\u00a6 \u00a8\u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00ad\u00b0\u00ae\u00ae\u00ae\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00af\u00af\u00b1\u00b1\u00a6 \u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00ae\u0096\u0096 \u00aa\u00b1\u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u0096\u0096\u0096 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00b0\u00b0\u00b0\u00b0\u00b0\u00b2\u0096 \u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00b2 \u00b1 \u00a7\u00a7 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00b0 \u00a7\u00a7\u00a7\u00a7 \u00b3 ",
- " \u00ad\u00b0\u00b0\u00b0 \u00b3 ",
- " \u00ad\u00b0\u00b0\u00b0 \u00a7 \u00b3 ",
- " \u00ad\u00b0\u00b0 \u00b3\u00b3 ",
- " \u00ad\u00ad\u00b0\u00b0 ",
- " \u00ad\u00ad\u00b0 \u00b4 ",
- " \u00ad\u00ad\u00b0 ",
- " ",
- " ",
- " ",
- " \u00b5 \u00b5 ",
- " \u00b5 \u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 ",
- " \u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 ",
- " \u00b5 \u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 [...]
- " \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u [...]
- " \u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u0 [...]
- " \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00 [...]
- "\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u [...]
- "\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u0 [...]
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/colorize-alpha2-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/colorize-alpha2-512-512-1.0-grid-reference.json
deleted file mode 100644
index 10e41a5..0000000
--- a/tests/visual_tests/grids/colorize-alpha2-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,283 +0,0 @@
-{
- "keys": [
- "",
- "66",
- "28",
- "119",
- "135",
- "168",
- "78",
- "151",
- "53",
- "58",
- "51",
- "44",
- "97",
- "99",
- "20",
- "75",
- "118",
- "42",
- "128",
- "84",
- "31",
- "56",
- "98",
- "41",
- "166",
- "108",
- "29",
- "80",
- "10",
- "72",
- "134",
- "19",
- "147",
- "169",
- "83",
- "131",
- "50",
- "3",
- "104",
- "65",
- "162",
- "59",
- "158",
- "86",
- "130",
- "76",
- "157",
- "100",
- "46",
- "161",
- "39",
- "153",
- "77",
- "1",
- "123",
- "88",
- "94",
- "74",
- "103",
- "48",
- "138",
- "90",
- "120",
- "110",
- "25",
- "106",
- "18",
- "105",
- "4",
- "122",
- "16",
- "163",
- "38",
- "137",
- "115",
- "154",
- "139",
- "91",
- "171",
- "71",
- "45",
- "174",
- "156",
- "67",
- "69",
- "141",
- "49",
- "126",
- "144",
- "117",
- "15",
- "116",
- "52",
- "87",
- "36",
- "170",
- "160",
- "61",
- "60",
- "155",
- "14",
- "33",
- "140",
- "145",
- "146",
- "124",
- "68",
- "143",
- "32",
- "27",
- "95",
- "148",
- "93",
- "34",
- "73",
- "112",
- "23",
- "64",
- "35",
- "165",
- "85",
- "47",
- "125",
- "57",
- "164",
- "127",
- "2",
- "176",
- "159",
- "142",
- "22",
- "111",
- "109",
- "9",
- "102",
- "172",
- "113",
- "177",
- "54",
- "30",
- "132",
- "26",
- "5",
- "175",
- "167",
- "121",
- "55",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ",
- " ##########!!!!!!!!!!!!!!!!!!!! $$ %%% %%% ",
- " # ###########!!!!!!!!!!!!!!!!!!!! $$ $ %% ",
- " ##### ######## !!!!!!!!!!!!!!! %%% %%%%%%%%%% %%%%% ",
- " ####### ### ###### !!!!!!!!!!!! % % %%%%%%%%%%%%%%%%%% %%%% ",
- " &&&&&&&&# ###### ######### ####### !!!!!!!!!!! $$$$%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%",
- "%%%% &&&&&&&&###################### ##### !!!!!!!! ' $((())%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " %& &&&&&&&###################### ### !!!! ''' $$((()))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&&################# ### !! $$$(( ))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ",
- " &&& &&############## ###### * $$(( +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ",
- " && &################# ####### ** ,,( -./%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ",
- " ############################ 0 ** 1223333//%%%%%%%%%%%444444%%%%%%%%%%%%%%%55%%%%%% % ",
- " ######################## # * 667228839999999%%%444444444444%%%:%::%%%%%%555%%%% % ",
- " &&&&&&&&&&&&&&#####&## ## 6666;<=>>???999%%%%44444444444445:::::::::::55555%% % ",
- " &&&&&&&&&&&&&&&##&&&&# 666<< @AA?? 9 %%% 44BB444444455555::::::5555555%% C ",
- " &&&&&&&&&&&&&&&&&&&& DEEEE <<<<FGHIIII IJ% KBKBBBBLLL55555555:5555555MM C ",
- " &&&&&&&&&&&&&&&&&& DEEE < < H IIIIIINN KKKKBBOO555555555555555 5 M C ",
- " &&&&&&&&&&&&&&&&& P QQQR SITUUNNNNNKVVVWW555555555555555 XX CCC ",
- " &&&&&&&&&&&&&& PPPQQQRR Y TUUUNNNNNVVVWWZZ555555555555555 CC ",
- " [[[[&&&&&&&&& PPQQQQQYYYYY]]]]^^^U_NNNNVVWWWZZ`55555555555555 ",
- " [[[[[[& & PPaQQQQQQYYYYY]]]]^^^^^ NNNNWWWZZZZ``bZcc5555555 ",
- " [ [[[[ d PaaeQQQQQYYYYY]]]]^^^^^^fg WWZZZZZZhZc55555555i ",
- " & [[[ [jjj kkaaeeeQQlllmmYnnnnn^^^^^^gg ZZZZZZZhcccopp55 ",
- " [[[[[[ qr aaaaeeeellllmmmnnnnn ^^^sgg ZZZZZ ctop 5 ",
- " [[[uvv wwaaaeeelllmmmmnnnnnxssss ZZZZ ctttp y ",
- " z{{ wweee|ll}}}mmmnnnnn~~xs ZZ tt\u007fp yy ",
- " { \u0080\u0081\u0081\u0081\u0081\u0082 \u0083\u0083ee\u0084\u0085\u0086}}}\u0087mmn\u0088n\u0088\u0088~~\u0089\u0089\u0089\u008a ZZ t pp y y ",
- " \u008b\u008b\u0080\u0081\u0081\u0081\u0081\u0081\u008c \u008d\u0083\u008e\u0084\u0085}}}}\u0087m\u008f\u008f\u0088\u0088\u0088\u0088~~~~\u008a \u0090 t y ",
- " \u0080\u0080\u0080\u0081\u0081\u0081\u008c\u00916 \u0092\u008e\u0084 }}\u0087\u0087\u008f\u0093\u0093\u0093\u0088\u0088\u0088~~~\u008a\u008a \u0094 \u0095 \u0095\u0095 ",
- " \u0080\u0080\u0080\u0080\u0081\u0081\u0096\u008c\u00916\u0096 \u0097\u0098\u0098\u0093\u0093\u0093\u0093\u0099\u0099\u009a\u009a\u008a\u008a \u0094\u0095\u0095 \u0095\u0095\u0094 ",
- " \u009b\u009b\u009c\u0080\u0080\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u009d\u009d\u009d\u0098\u0093\u0093\u0093\u0093\u0099\u0099\u009a\u009a\u008a \u0094\u0094 \u0094\u0094\u0094 \u0094 \u0094 ",
- " \u009c\u009c\u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u009d\u0098\u0093\u0093\u0093\u0093\u0093\u009e\u009e\u009e\u009a \u0094\u0094 \u0094\u0094 \u0094 \u0094\u0094\u0094\u0094\u0094\u009f\u009f \u009f ",
- " \u009c\u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u0093\u0093\u0093\u0093\u0093\u009e\u009e\u009e \u0094 \u0094\u009f\u009f\u009f\u009f \u009f ",
- " \u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u0093\u0093\u00a1\u00a1\u009e\u009e\u009e \u0094\u0094\u0094\u00a2 \u009f \u009f\u009f \u00a3 ",
- " \u009c\u009c\u009c\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u00a0\u00a1\u00a1\u00a1\u00a5\u009e\u00a6 \u00a7\u00a7 ",
- " \u009c\u009c\u009c\u00a4\u00a4\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u00a1\u00a1\u00a1\u00a1\u00a5\u00a6\u00a6 \u00a8 \u00a7\u00a7\u00a7\u00a7 \u00a7 \u00a9 ",
- " \u009c\u00a4\u00a4\u00a4\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00aa\u00a1\u00ab\u00ab\u00ab\u00a6\u00a6 \u00a8\u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 \u00ac",
- " \u00ad\u00a4\u00a4\u00ae\u00ae\u0096\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00af\u00af\u00ab\u00ab\u00a6 \u00a8\u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00ad\u00b0\u00ae\u00ae\u00ae\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00af\u00af\u00b1\u00b1\u00a6 \u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00ae\u0096\u0096 \u00aa\u00b1\u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u0096\u0096\u0096 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00b0\u00b0\u00b0\u00b0\u00b0\u00b2\u0096 \u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00b2 \u00b1 \u00a7\u00a7 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00b0 \u00a7\u00a7\u00a7\u00a7 \u00b3 ",
- " \u00ad\u00b0\u00b0\u00b0 \u00b3 ",
- " \u00ad\u00b0\u00b0\u00b0 \u00a7 \u00b3 ",
- " \u00ad\u00b0\u00b0 \u00b3\u00b3 ",
- " \u00ad\u00ad\u00b0\u00b0 ",
- " \u00ad\u00ad\u00b0 \u00b4 ",
- " \u00ad\u00ad\u00b0 ",
- " ",
- " ",
- " ",
- " \u00b5 \u00b5 ",
- " \u00b5 \u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 ",
- " \u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 ",
- " \u00b5 \u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 [...]
- " \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u [...]
- " \u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u0 [...]
- " \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00 [...]
- "\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u [...]
- "\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u0 [...]
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/colorize-alpha2-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/colorize-alpha2-512-512-2.0-grid-reference.json
deleted file mode 100644
index 10e41a5..0000000
--- a/tests/visual_tests/grids/colorize-alpha2-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,283 +0,0 @@
-{
- "keys": [
- "",
- "66",
- "28",
- "119",
- "135",
- "168",
- "78",
- "151",
- "53",
- "58",
- "51",
- "44",
- "97",
- "99",
- "20",
- "75",
- "118",
- "42",
- "128",
- "84",
- "31",
- "56",
- "98",
- "41",
- "166",
- "108",
- "29",
- "80",
- "10",
- "72",
- "134",
- "19",
- "147",
- "169",
- "83",
- "131",
- "50",
- "3",
- "104",
- "65",
- "162",
- "59",
- "158",
- "86",
- "130",
- "76",
- "157",
- "100",
- "46",
- "161",
- "39",
- "153",
- "77",
- "1",
- "123",
- "88",
- "94",
- "74",
- "103",
- "48",
- "138",
- "90",
- "120",
- "110",
- "25",
- "106",
- "18",
- "105",
- "4",
- "122",
- "16",
- "163",
- "38",
- "137",
- "115",
- "154",
- "139",
- "91",
- "171",
- "71",
- "45",
- "174",
- "156",
- "67",
- "69",
- "141",
- "49",
- "126",
- "144",
- "117",
- "15",
- "116",
- "52",
- "87",
- "36",
- "170",
- "160",
- "61",
- "60",
- "155",
- "14",
- "33",
- "140",
- "145",
- "146",
- "124",
- "68",
- "143",
- "32",
- "27",
- "95",
- "148",
- "93",
- "34",
- "73",
- "112",
- "23",
- "64",
- "35",
- "165",
- "85",
- "47",
- "125",
- "57",
- "164",
- "127",
- "2",
- "176",
- "159",
- "142",
- "22",
- "111",
- "109",
- "9",
- "102",
- "172",
- "113",
- "177",
- "54",
- "30",
- "132",
- "26",
- "5",
- "175",
- "167",
- "121",
- "55",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ",
- " ##########!!!!!!!!!!!!!!!!!!!! $$ %%% %%% ",
- " # ###########!!!!!!!!!!!!!!!!!!!! $$ $ %% ",
- " ##### ######## !!!!!!!!!!!!!!! %%% %%%%%%%%%% %%%%% ",
- " ####### ### ###### !!!!!!!!!!!! % % %%%%%%%%%%%%%%%%%% %%%% ",
- " &&&&&&&&# ###### ######### ####### !!!!!!!!!!! $$$$%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%",
- "%%%% &&&&&&&&###################### ##### !!!!!!!! ' $((())%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " %& &&&&&&&###################### ### !!!! ''' $$((()))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&&################# ### !! $$$(( ))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ",
- " &&& &&############## ###### * $$(( +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ",
- " && &################# ####### ** ,,( -./%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ",
- " ############################ 0 ** 1223333//%%%%%%%%%%%444444%%%%%%%%%%%%%%%55%%%%%% % ",
- " ######################## # * 667228839999999%%%444444444444%%%:%::%%%%%%555%%%% % ",
- " &&&&&&&&&&&&&&#####&## ## 6666;<=>>???999%%%%44444444444445:::::::::::55555%% % ",
- " &&&&&&&&&&&&&&&##&&&&# 666<< @AA?? 9 %%% 44BB444444455555::::::5555555%% C ",
- " &&&&&&&&&&&&&&&&&&&& DEEEE <<<<FGHIIII IJ% KBKBBBBLLL55555555:5555555MM C ",
- " &&&&&&&&&&&&&&&&&& DEEE < < H IIIIIINN KKKKBBOO555555555555555 5 M C ",
- " &&&&&&&&&&&&&&&&& P QQQR SITUUNNNNNKVVVWW555555555555555 XX CCC ",
- " &&&&&&&&&&&&&& PPPQQQRR Y TUUUNNNNNVVVWWZZ555555555555555 CC ",
- " [[[[&&&&&&&&& PPQQQQQYYYYY]]]]^^^U_NNNNVVWWWZZ`55555555555555 ",
- " [[[[[[& & PPaQQQQQQYYYYY]]]]^^^^^ NNNNWWWZZZZ``bZcc5555555 ",
- " [ [[[[ d PaaeQQQQQYYYYY]]]]^^^^^^fg WWZZZZZZhZc55555555i ",
- " & [[[ [jjj kkaaeeeQQlllmmYnnnnn^^^^^^gg ZZZZZZZhcccopp55 ",
- " [[[[[[ qr aaaaeeeellllmmmnnnnn ^^^sgg ZZZZZ ctop 5 ",
- " [[[uvv wwaaaeeelllmmmmnnnnnxssss ZZZZ ctttp y ",
- " z{{ wweee|ll}}}mmmnnnnn~~xs ZZ tt\u007fp yy ",
- " { \u0080\u0081\u0081\u0081\u0081\u0082 \u0083\u0083ee\u0084\u0085\u0086}}}\u0087mmn\u0088n\u0088\u0088~~\u0089\u0089\u0089\u008a ZZ t pp y y ",
- " \u008b\u008b\u0080\u0081\u0081\u0081\u0081\u0081\u008c \u008d\u0083\u008e\u0084\u0085}}}}\u0087m\u008f\u008f\u0088\u0088\u0088\u0088~~~~\u008a \u0090 t y ",
- " \u0080\u0080\u0080\u0081\u0081\u0081\u008c\u00916 \u0092\u008e\u0084 }}\u0087\u0087\u008f\u0093\u0093\u0093\u0088\u0088\u0088~~~\u008a\u008a \u0094 \u0095 \u0095\u0095 ",
- " \u0080\u0080\u0080\u0080\u0081\u0081\u0096\u008c\u00916\u0096 \u0097\u0098\u0098\u0093\u0093\u0093\u0093\u0099\u0099\u009a\u009a\u008a\u008a \u0094\u0095\u0095 \u0095\u0095\u0094 ",
- " \u009b\u009b\u009c\u0080\u0080\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u009d\u009d\u009d\u0098\u0093\u0093\u0093\u0093\u0099\u0099\u009a\u009a\u008a \u0094\u0094 \u0094\u0094\u0094 \u0094 \u0094 ",
- " \u009c\u009c\u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u009d\u0098\u0093\u0093\u0093\u0093\u0093\u009e\u009e\u009e\u009a \u0094\u0094 \u0094\u0094 \u0094 \u0094\u0094\u0094\u0094\u0094\u009f\u009f \u009f ",
- " \u009c\u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u0093\u0093\u0093\u0093\u0093\u009e\u009e\u009e \u0094 \u0094\u009f\u009f\u009f\u009f \u009f ",
- " \u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u0093\u0093\u00a1\u00a1\u009e\u009e\u009e \u0094\u0094\u0094\u00a2 \u009f \u009f\u009f \u00a3 ",
- " \u009c\u009c\u009c\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u00a0\u00a1\u00a1\u00a1\u00a5\u009e\u00a6 \u00a7\u00a7 ",
- " \u009c\u009c\u009c\u00a4\u00a4\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u00a1\u00a1\u00a1\u00a1\u00a5\u00a6\u00a6 \u00a8 \u00a7\u00a7\u00a7\u00a7 \u00a7 \u00a9 ",
- " \u009c\u00a4\u00a4\u00a4\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00aa\u00a1\u00ab\u00ab\u00ab\u00a6\u00a6 \u00a8\u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 \u00ac",
- " \u00ad\u00a4\u00a4\u00ae\u00ae\u0096\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00af\u00af\u00ab\u00ab\u00a6 \u00a8\u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00ad\u00b0\u00ae\u00ae\u00ae\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00af\u00af\u00b1\u00b1\u00a6 \u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00ae\u0096\u0096 \u00aa\u00b1\u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u0096\u0096\u0096 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00b0\u00b0\u00b0\u00b0\u00b0\u00b2\u0096 \u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00b2 \u00b1 \u00a7\u00a7 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00b0 \u00a7\u00a7\u00a7\u00a7 \u00b3 ",
- " \u00ad\u00b0\u00b0\u00b0 \u00b3 ",
- " \u00ad\u00b0\u00b0\u00b0 \u00a7 \u00b3 ",
- " \u00ad\u00b0\u00b0 \u00b3\u00b3 ",
- " \u00ad\u00ad\u00b0\u00b0 ",
- " \u00ad\u00ad\u00b0 \u00b4 ",
- " \u00ad\u00ad\u00b0 ",
- " ",
- " ",
- " ",
- " \u00b5 \u00b5 ",
- " \u00b5 \u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 ",
- " \u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 ",
- " \u00b5 \u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 [...]
- " \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u [...]
- " \u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u0 [...]
- " \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00 [...]
- "\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u [...]
- "\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u0 [...]
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/colorize-alpha3-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/colorize-alpha3-500-100-1.0-grid-reference.json
deleted file mode 100644
index c6848a7..0000000
--- a/tests/visual_tests/grids/colorize-alpha3-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,134 +0,0 @@
-{
- "keys": [
- "",
- "28",
- "66",
- "135",
- "168",
- "151",
- "119",
- "53",
- "75",
- "58",
- "44",
- "128",
- "99",
- "56",
- "42",
- "149",
- "166",
- "84",
- "108",
- "31",
- "131",
- "50",
- "80",
- "162",
- "158",
- "169",
- "130",
- "100",
- "46",
- "161",
- "65",
- "40",
- "153",
- "77",
- "76",
- "1",
- "123",
- "88",
- "83",
- "103",
- "18",
- "137",
- "94",
- "48",
- "138",
- "74",
- "120",
- "106",
- "38",
- "71",
- "110",
- "105",
- "115",
- "154",
- "139",
- "156",
- "117",
- "141",
- "116",
- "52",
- "174",
- "171",
- "126",
- "170",
- "68",
- "93",
- "60",
- "27",
- "140",
- "146",
- "95",
- "112",
- "47",
- "36",
- "23",
- "57",
- "35",
- "34",
- "165",
- "85",
- "73",
- "125",
- "164",
- "127",
- "142",
- "22",
- "2",
- "176",
- "109",
- "102",
- "9",
- "132",
- "113",
- "26",
- "177",
- "114",
- "30",
- "5",
- "175",
- "167",
- "121",
- "7"
- ],
- "data": {},
- "grid": [
- " !!!!####### ",
- " !!!!!!! ####### $$ $$$$ $$$ ",
- " $ %%%%!!!!!!!! ! ##### &'$$$$$$$$$$$$$$$$$$$$$$ ",
- " %%%%!!!!!!! !!! ## '&&($$$$$$$$$$$$$$$$$$$$$$ ",
- " % !!!!!!!!!!! )* +,-$$$$$$$$$$$$$$$$$ $ ",
- " %%%%%%!!!! ../0111$222223333344$$ ",
- " %%%%%%%% 56 77888$9:::4444444; ",
- " %%%%%%% <=> ?@ABCCDE444444 FG ",
- " HH% I J==KKKLMMCCENNOP444 ",
- " % H QR JSTUUVWWMMM NNNPX4 ",
- " Y ZTT[[VWW]^ NN X_ ` ",
- " aab cd[[eff]g h X i` ",
- " jklll mnopq rrrrr ",
- " sllllll oott rrr u v ",
- " swlll xxyyz{ ||| ",
- " w}ll ~\u007f\u0080 { |||||| \u0081 ",
- " \u0082\u0083\u0083l \u0084\u0084\u0084 |||||| ",
- " \u0082\u0083\u0085 \u0084 | ||| ",
- " \u0082\u0083 \u0086 ",
- " \u0082 ",
- " ",
- " \u0087 ",
- " \u0087\u0087 \u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087 ",
- " \u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087 \u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087 ",
- " \u0087\u0087 \u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087 "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/colorize-alpha3-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/colorize-alpha3-512-512-1.0-grid-reference.json
deleted file mode 100644
index 10e41a5..0000000
--- a/tests/visual_tests/grids/colorize-alpha3-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,283 +0,0 @@
-{
- "keys": [
- "",
- "66",
- "28",
- "119",
- "135",
- "168",
- "78",
- "151",
- "53",
- "58",
- "51",
- "44",
- "97",
- "99",
- "20",
- "75",
- "118",
- "42",
- "128",
- "84",
- "31",
- "56",
- "98",
- "41",
- "166",
- "108",
- "29",
- "80",
- "10",
- "72",
- "134",
- "19",
- "147",
- "169",
- "83",
- "131",
- "50",
- "3",
- "104",
- "65",
- "162",
- "59",
- "158",
- "86",
- "130",
- "76",
- "157",
- "100",
- "46",
- "161",
- "39",
- "153",
- "77",
- "1",
- "123",
- "88",
- "94",
- "74",
- "103",
- "48",
- "138",
- "90",
- "120",
- "110",
- "25",
- "106",
- "18",
- "105",
- "4",
- "122",
- "16",
- "163",
- "38",
- "137",
- "115",
- "154",
- "139",
- "91",
- "171",
- "71",
- "45",
- "174",
- "156",
- "67",
- "69",
- "141",
- "49",
- "126",
- "144",
- "117",
- "15",
- "116",
- "52",
- "87",
- "36",
- "170",
- "160",
- "61",
- "60",
- "155",
- "14",
- "33",
- "140",
- "145",
- "146",
- "124",
- "68",
- "143",
- "32",
- "27",
- "95",
- "148",
- "93",
- "34",
- "73",
- "112",
- "23",
- "64",
- "35",
- "165",
- "85",
- "47",
- "125",
- "57",
- "164",
- "127",
- "2",
- "176",
- "159",
- "142",
- "22",
- "111",
- "109",
- "9",
- "102",
- "172",
- "113",
- "177",
- "54",
- "30",
- "132",
- "26",
- "5",
- "175",
- "167",
- "121",
- "55",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ",
- " ##########!!!!!!!!!!!!!!!!!!!! $$ %%% %%% ",
- " # ###########!!!!!!!!!!!!!!!!!!!! $$ $ %% ",
- " ##### ######## !!!!!!!!!!!!!!! %%% %%%%%%%%%% %%%%% ",
- " ####### ### ###### !!!!!!!!!!!! % % %%%%%%%%%%%%%%%%%% %%%% ",
- " &&&&&&&&# ###### ######### ####### !!!!!!!!!!! $$$$%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%",
- "%%%% &&&&&&&&###################### ##### !!!!!!!! ' $((())%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " %& &&&&&&&###################### ### !!!! ''' $$((()))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&&################# ### !! $$$(( ))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ",
- " &&& &&############## ###### * $$(( +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ",
- " && &################# ####### ** ,,( -./%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ",
- " ############################ 0 ** 1223333//%%%%%%%%%%%444444%%%%%%%%%%%%%%%55%%%%%% % ",
- " ######################## # * 667228839999999%%%444444444444%%%:%::%%%%%%555%%%% % ",
- " &&&&&&&&&&&&&&#####&## ## 6666;<=>>???999%%%%44444444444445:::::::::::55555%% % ",
- " &&&&&&&&&&&&&&&##&&&&# 666<< @AA?? 9 %%% 44BB444444455555::::::5555555%% C ",
- " &&&&&&&&&&&&&&&&&&&& DEEEE <<<<FGHIIII IJ% KBKBBBBLLL55555555:5555555MM C ",
- " &&&&&&&&&&&&&&&&&& DEEE < < H IIIIIINN KKKKBBOO555555555555555 5 M C ",
- " &&&&&&&&&&&&&&&&& P QQQR SITUUNNNNNKVVVWW555555555555555 XX CCC ",
- " &&&&&&&&&&&&&& PPPQQQRR Y TUUUNNNNNVVVWWZZ555555555555555 CC ",
- " [[[[&&&&&&&&& PPQQQQQYYYYY]]]]^^^U_NNNNVVWWWZZ`55555555555555 ",
- " [[[[[[& & PPaQQQQQQYYYYY]]]]^^^^^ NNNNWWWZZZZ``bZcc5555555 ",
- " [ [[[[ d PaaeQQQQQYYYYY]]]]^^^^^^fg WWZZZZZZhZc55555555i ",
- " & [[[ [jjj kkaaeeeQQlllmmYnnnnn^^^^^^gg ZZZZZZZhcccopp55 ",
- " [[[[[[ qr aaaaeeeellllmmmnnnnn ^^^sgg ZZZZZ ctop 5 ",
- " [[[uvv wwaaaeeelllmmmmnnnnnxssss ZZZZ ctttp y ",
- " z{{ wweee|ll}}}mmmnnnnn~~xs ZZ tt\u007fp yy ",
- " { \u0080\u0081\u0081\u0081\u0081\u0082 \u0083\u0083ee\u0084\u0085\u0086}}}\u0087mmn\u0088n\u0088\u0088~~\u0089\u0089\u0089\u008a ZZ t pp y y ",
- " \u008b\u008b\u0080\u0081\u0081\u0081\u0081\u0081\u008c \u008d\u0083\u008e\u0084\u0085}}}}\u0087m\u008f\u008f\u0088\u0088\u0088\u0088~~~~\u008a \u0090 t y ",
- " \u0080\u0080\u0080\u0081\u0081\u0081\u008c\u00916 \u0092\u008e\u0084 }}\u0087\u0087\u008f\u0093\u0093\u0093\u0088\u0088\u0088~~~\u008a\u008a \u0094 \u0095 \u0095\u0095 ",
- " \u0080\u0080\u0080\u0080\u0081\u0081\u0096\u008c\u00916\u0096 \u0097\u0098\u0098\u0093\u0093\u0093\u0093\u0099\u0099\u009a\u009a\u008a\u008a \u0094\u0095\u0095 \u0095\u0095\u0094 ",
- " \u009b\u009b\u009c\u0080\u0080\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u009d\u009d\u009d\u0098\u0093\u0093\u0093\u0093\u0099\u0099\u009a\u009a\u008a \u0094\u0094 \u0094\u0094\u0094 \u0094 \u0094 ",
- " \u009c\u009c\u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u009d\u0098\u0093\u0093\u0093\u0093\u0093\u009e\u009e\u009e\u009a \u0094\u0094 \u0094\u0094 \u0094 \u0094\u0094\u0094\u0094\u0094\u009f\u009f \u009f ",
- " \u009c\u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u0093\u0093\u0093\u0093\u0093\u009e\u009e\u009e \u0094 \u0094\u009f\u009f\u009f\u009f \u009f ",
- " \u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u0093\u0093\u00a1\u00a1\u009e\u009e\u009e \u0094\u0094\u0094\u00a2 \u009f \u009f\u009f \u00a3 ",
- " \u009c\u009c\u009c\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u00a0\u00a1\u00a1\u00a1\u00a5\u009e\u00a6 \u00a7\u00a7 ",
- " \u009c\u009c\u009c\u00a4\u00a4\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u00a1\u00a1\u00a1\u00a1\u00a5\u00a6\u00a6 \u00a8 \u00a7\u00a7\u00a7\u00a7 \u00a7 \u00a9 ",
- " \u009c\u00a4\u00a4\u00a4\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00aa\u00a1\u00ab\u00ab\u00ab\u00a6\u00a6 \u00a8\u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 \u00ac",
- " \u00ad\u00a4\u00a4\u00ae\u00ae\u0096\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00af\u00af\u00ab\u00ab\u00a6 \u00a8\u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00ad\u00b0\u00ae\u00ae\u00ae\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00af\u00af\u00b1\u00b1\u00a6 \u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00ae\u0096\u0096 \u00aa\u00b1\u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u0096\u0096\u0096 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00b0\u00b0\u00b0\u00b0\u00b0\u00b2\u0096 \u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00b2 \u00b1 \u00a7\u00a7 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00b0 \u00a7\u00a7\u00a7\u00a7 \u00b3 ",
- " \u00ad\u00b0\u00b0\u00b0 \u00b3 ",
- " \u00ad\u00b0\u00b0\u00b0 \u00a7 \u00b3 ",
- " \u00ad\u00b0\u00b0 \u00b3\u00b3 ",
- " \u00ad\u00ad\u00b0\u00b0 ",
- " \u00ad\u00ad\u00b0 \u00b4 ",
- " \u00ad\u00ad\u00b0 ",
- " ",
- " ",
- " ",
- " \u00b5 \u00b5 ",
- " \u00b5 \u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 ",
- " \u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 ",
- " \u00b5 \u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 [...]
- " \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u [...]
- " \u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u0 [...]
- " \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00 [...]
- "\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u [...]
- "\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u0 [...]
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/colorize-alpha3-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/colorize-alpha3-512-512-2.0-grid-reference.json
deleted file mode 100644
index 10e41a5..0000000
--- a/tests/visual_tests/grids/colorize-alpha3-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,283 +0,0 @@
-{
- "keys": [
- "",
- "66",
- "28",
- "119",
- "135",
- "168",
- "78",
- "151",
- "53",
- "58",
- "51",
- "44",
- "97",
- "99",
- "20",
- "75",
- "118",
- "42",
- "128",
- "84",
- "31",
- "56",
- "98",
- "41",
- "166",
- "108",
- "29",
- "80",
- "10",
- "72",
- "134",
- "19",
- "147",
- "169",
- "83",
- "131",
- "50",
- "3",
- "104",
- "65",
- "162",
- "59",
- "158",
- "86",
- "130",
- "76",
- "157",
- "100",
- "46",
- "161",
- "39",
- "153",
- "77",
- "1",
- "123",
- "88",
- "94",
- "74",
- "103",
- "48",
- "138",
- "90",
- "120",
- "110",
- "25",
- "106",
- "18",
- "105",
- "4",
- "122",
- "16",
- "163",
- "38",
- "137",
- "115",
- "154",
- "139",
- "91",
- "171",
- "71",
- "45",
- "174",
- "156",
- "67",
- "69",
- "141",
- "49",
- "126",
- "144",
- "117",
- "15",
- "116",
- "52",
- "87",
- "36",
- "170",
- "160",
- "61",
- "60",
- "155",
- "14",
- "33",
- "140",
- "145",
- "146",
- "124",
- "68",
- "143",
- "32",
- "27",
- "95",
- "148",
- "93",
- "34",
- "73",
- "112",
- "23",
- "64",
- "35",
- "165",
- "85",
- "47",
- "125",
- "57",
- "164",
- "127",
- "2",
- "176",
- "159",
- "142",
- "22",
- "111",
- "109",
- "9",
- "102",
- "172",
- "113",
- "177",
- "54",
- "30",
- "132",
- "26",
- "5",
- "175",
- "167",
- "121",
- "55",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ",
- " ##########!!!!!!!!!!!!!!!!!!!! $$ %%% %%% ",
- " # ###########!!!!!!!!!!!!!!!!!!!! $$ $ %% ",
- " ##### ######## !!!!!!!!!!!!!!! %%% %%%%%%%%%% %%%%% ",
- " ####### ### ###### !!!!!!!!!!!! % % %%%%%%%%%%%%%%%%%% %%%% ",
- " &&&&&&&&# ###### ######### ####### !!!!!!!!!!! $$$$%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%",
- "%%%% &&&&&&&&###################### ##### !!!!!!!! ' $((())%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " %& &&&&&&&###################### ### !!!! ''' $$((()))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&&################# ### !! $$$(( ))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% ",
- " &&& &&############## ###### * $$(( +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ",
- " && &################# ####### ** ,,( -./%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ",
- " ############################ 0 ** 1223333//%%%%%%%%%%%444444%%%%%%%%%%%%%%%55%%%%%% % ",
- " ######################## # * 667228839999999%%%444444444444%%%:%::%%%%%%555%%%% % ",
- " &&&&&&&&&&&&&&#####&## ## 6666;<=>>???999%%%%44444444444445:::::::::::55555%% % ",
- " &&&&&&&&&&&&&&&##&&&&# 666<< @AA?? 9 %%% 44BB444444455555::::::5555555%% C ",
- " &&&&&&&&&&&&&&&&&&&& DEEEE <<<<FGHIIII IJ% KBKBBBBLLL55555555:5555555MM C ",
- " &&&&&&&&&&&&&&&&&& DEEE < < H IIIIIINN KKKKBBOO555555555555555 5 M C ",
- " &&&&&&&&&&&&&&&&& P QQQR SITUUNNNNNKVVVWW555555555555555 XX CCC ",
- " &&&&&&&&&&&&&& PPPQQQRR Y TUUUNNNNNVVVWWZZ555555555555555 CC ",
- " [[[[&&&&&&&&& PPQQQQQYYYYY]]]]^^^U_NNNNVVWWWZZ`55555555555555 ",
- " [[[[[[& & PPaQQQQQQYYYYY]]]]^^^^^ NNNNWWWZZZZ``bZcc5555555 ",
- " [ [[[[ d PaaeQQQQQYYYYY]]]]^^^^^^fg WWZZZZZZhZc55555555i ",
- " & [[[ [jjj kkaaeeeQQlllmmYnnnnn^^^^^^gg ZZZZZZZhcccopp55 ",
- " [[[[[[ qr aaaaeeeellllmmmnnnnn ^^^sgg ZZZZZ ctop 5 ",
- " [[[uvv wwaaaeeelllmmmmnnnnnxssss ZZZZ ctttp y ",
- " z{{ wweee|ll}}}mmmnnnnn~~xs ZZ tt\u007fp yy ",
- " { \u0080\u0081\u0081\u0081\u0081\u0082 \u0083\u0083ee\u0084\u0085\u0086}}}\u0087mmn\u0088n\u0088\u0088~~\u0089\u0089\u0089\u008a ZZ t pp y y ",
- " \u008b\u008b\u0080\u0081\u0081\u0081\u0081\u0081\u008c \u008d\u0083\u008e\u0084\u0085}}}}\u0087m\u008f\u008f\u0088\u0088\u0088\u0088~~~~\u008a \u0090 t y ",
- " \u0080\u0080\u0080\u0081\u0081\u0081\u008c\u00916 \u0092\u008e\u0084 }}\u0087\u0087\u008f\u0093\u0093\u0093\u0088\u0088\u0088~~~\u008a\u008a \u0094 \u0095 \u0095\u0095 ",
- " \u0080\u0080\u0080\u0080\u0081\u0081\u0096\u008c\u00916\u0096 \u0097\u0098\u0098\u0093\u0093\u0093\u0093\u0099\u0099\u009a\u009a\u008a\u008a \u0094\u0095\u0095 \u0095\u0095\u0094 ",
- " \u009b\u009b\u009c\u0080\u0080\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u009d\u009d\u009d\u0098\u0093\u0093\u0093\u0093\u0099\u0099\u009a\u009a\u008a \u0094\u0094 \u0094\u0094\u0094 \u0094 \u0094 ",
- " \u009c\u009c\u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u009d\u0098\u0093\u0093\u0093\u0093\u0093\u009e\u009e\u009e\u009a \u0094\u0094 \u0094\u0094 \u0094 \u0094\u0094\u0094\u0094\u0094\u009f\u009f \u009f ",
- " \u009c\u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u0093\u0093\u0093\u0093\u0093\u009e\u009e\u009e \u0094 \u0094\u009f\u009f\u009f\u009f \u009f ",
- " \u009c\u009c\u009c\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u0093\u0093\u00a1\u00a1\u009e\u009e\u009e \u0094\u0094\u0094\u00a2 \u009f \u009f\u009f \u00a3 ",
- " \u009c\u009c\u009c\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u00a0\u00a1\u00a1\u00a1\u00a5\u009e\u00a6 \u00a7\u00a7 ",
- " \u009c\u009c\u009c\u00a4\u00a4\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00a0\u00a0\u00a0\u00a1\u00a1\u00a1\u00a1\u00a5\u00a6\u00a6 \u00a8 \u00a7\u00a7\u00a7\u00a7 \u00a7 \u00a9 ",
- " \u009c\u00a4\u00a4\u00a4\u00a4\u0096\u0096\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00aa\u00a1\u00ab\u00ab\u00ab\u00a6\u00a6 \u00a8\u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 \u00ac",
- " \u00ad\u00a4\u00a4\u00ae\u00ae\u0096\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00af\u00af\u00ab\u00ab\u00a6 \u00a8\u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00ad\u00b0\u00ae\u00ae\u00ae\u0096\u0096\u0096\u0096\u0096 \u00aa\u00aa\u00aa\u00af\u00af\u00b1\u00b1\u00a6 \u00a8 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00ae\u0096\u0096 \u00aa\u00b1\u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u0096\u0096\u0096 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00b0\u00b0\u00b0\u00b0\u00b0\u00b2\u0096 \u00b1\u00b1\u00b1\u00b1 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00b2 \u00b1 \u00a7\u00a7 \u00a7\u00a7\u00a7\u00a7\u00a7\u00a7 ",
- " \u00ad\u00b0\u00b0\u00b0\u00b0\u00b0 \u00a7\u00a7\u00a7\u00a7 \u00b3 ",
- " \u00ad\u00b0\u00b0\u00b0 \u00b3 ",
- " \u00ad\u00b0\u00b0\u00b0 \u00a7 \u00b3 ",
- " \u00ad\u00b0\u00b0 \u00b3\u00b3 ",
- " \u00ad\u00ad\u00b0\u00b0 ",
- " \u00ad\u00ad\u00b0 \u00b4 ",
- " \u00ad\u00ad\u00b0 ",
- " ",
- " ",
- " ",
- " \u00b5 \u00b5 ",
- " \u00b5 \u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 ",
- " \u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 ",
- " \u00b5 \u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 [...]
- " \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u [...]
- " \u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u0 [...]
- " \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00 [...]
- "\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u [...]
- "\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u0 [...]
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/dst-over-compositing-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/dst-over-compositing-512-512-1.0-grid-reference.json
deleted file mode 100644
index 3b86856..0000000
--- a/tests/visual_tests/grids/dst-over-compositing-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,140 +0,0 @@
-{
- "keys": [
- "2",
- "",
- "6",
- "4",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "###################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "####################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "####################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "####################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "####################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "####################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "###################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/dst-over-compositing-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/dst-over-compositing-512-512-2.0-grid-reference.json
deleted file mode 100644
index c3e425b..0000000
--- a/tests/visual_tests/grids/dst-over-compositing-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,140 +0,0 @@
-{
- "keys": [
- "2",
- "",
- "6",
- "4",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "####################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "#####################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "######################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "#######################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "#######################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "########################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "########################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "########################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "########################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "########################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "#######################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "#######################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "######################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "#####################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "###################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/expressionformat-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/expressionformat-500-100-1.0-grid-reference.json
deleted file mode 100644
index 6df82cf..0000000
--- a/tests/visual_tests/grids/expressionformat-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- " ## $$$$ %%%% &&&&& '' '' (((((( (( ))) ))))) **** *** +++ ++ + ",
- " ((((((((( )) ))) ) * * * ** + + ++ + ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/expressionformat-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/expressionformat-500-100-2.0-grid-reference.json
deleted file mode 100644
index e438df9..0000000
--- a/tests/visual_tests/grids/expressionformat-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- " ",
- " !!! #### $ $$ % && && ''' ' ' ))) ) ) ) ) +++ + ",
- " $$$$ $ % % %%%% && && && ''''' '' ))) ))) ))))) )))) + ++ ++++ ++++",
- " '''' ' '''' )) ))) )) ))) + ++ ++ + ++",
- " ) ) ) + + ++ + +++ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-1-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/formatting-1-500-100-1.0-grid-reference.json
deleted file mode 100644
index 8b01aff..0000000
--- a/tests/visual_tests/grids/formatting-1-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- "! $$ $ $ &&& & && ((( ** * ",
- "! !! ! $$ $ $ $$ $$ && & && & (( ( ( ( (((( ((( ** * ** *** ",
- "! !! !! ! $$ $ $$ $ && && & & (( ( ( (((( ( ** * ** ",
- " ",
- " !!! !!!!!! $$$ $$$$ $$$ &&& &&&& & ((((( (( (((( ***** *** * ",
- " !!!! !!!!! $$$$$$$$ $$$$ &&&&& & &&& ((( (( (( *** * ** ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-1-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/formatting-1-500-100-2.0-grid-reference.json
deleted file mode 100644
index 1891e73..0000000
--- a/tests/visual_tests/grids/formatting-1-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- " ",
- " ! %%%%% %% ))))) ) ) ",
- " ! % % % ) ) ) ) ",
- " ! ! ! !! ! !! ! !! % %%%% %%% %%% %%% %%% % %% ) ))) )))))) ))) ) )))) ))))))) ",
- "! ! ! ! ! ! !!!! % % % % % % % % % % ) ) ) ) ) ) ) ) ) ) ) ) ) ",
- " ! ! ! ! ! ! ! % % %% % % % % % % ) ) )) ) ) ) ) ) ) ) ) ",
- " ! !!! !!!! ! ! !!!! % % % % % % % % % % % ) ) ) ) ) ) ) ) ) )) ) ) ) ",
- " %% %% % %% )) )) )) ) ",
- " ))) ",
- " ! %%% % % % )))) ) ) ) ) ",
- "!!! ! ! !! ! % % %% %%%% %%%% %%% ) ) )))) ) )) ))) )) ) ) "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-2-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/formatting-2-500-100-1.0-grid-reference.json
deleted file mode 100644
index 8b01aff..0000000
--- a/tests/visual_tests/grids/formatting-2-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- "! $$ $ $ &&& & && ((( ** * ",
- "! !! ! $$ $ $ $$ $$ && & && & (( ( ( ( (((( ((( ** * ** *** ",
- "! !! !! ! $$ $ $$ $ && && & & (( ( ( (((( ( ** * ** ",
- " ",
- " !!! !!!!!! $$$ $$$$ $$$ &&& &&&& & ((((( (( (((( ***** *** * ",
- " !!!! !!!!! $$$$$$$$ $$$$ &&&&& & &&& ((( (( (( *** * ** ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-2-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/formatting-2-500-100-2.0-grid-reference.json
deleted file mode 100644
index 1891e73..0000000
--- a/tests/visual_tests/grids/formatting-2-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- " ",
- " ! %%%%% %% ))))) ) ) ",
- " ! % % % ) ) ) ) ",
- " ! ! ! !! ! !! ! !! % %%%% %%% %%% %%% %%% % %% ) ))) )))))) ))) ) )))) ))))))) ",
- "! ! ! ! ! ! !!!! % % % % % % % % % % ) ) ) ) ) ) ) ) ) ) ) ) ) ",
- " ! ! ! ! ! ! ! % % %% % % % % % % ) ) )) ) ) ) ) ) ) ) ) ",
- " ! !!! !!!! ! ! !!!! % % % % % % % % % % % ) ) ) ) ) ) ) ) ) )) ) ) ) ",
- " %% %% % %% )) )) )) ) ",
- " ))) ",
- " ! %%% % % % )))) ) ) ) ) ",
- "!!! ! ! !! ! % % %% %%%% %%%% %%% ) ) )))) ) )) ))) )) ) ) "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-3-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/formatting-3-500-100-1.0-grid-reference.json
deleted file mode 100644
index 200e5df..0000000
--- a/tests/visual_tests/grids/formatting-3-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- "! $$ $ $ &&& & && ((( ** * ",
- "! !! ! $$ $ $ $$ $$ && & && & (( ( ( ( (((( ((( ** * ** *** ",
- "! !! !! ! $$ $ $$ $ && && & & (( ( ( (((( ( ** * ** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-3-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/formatting-3-500-100-2.0-grid-reference.json
deleted file mode 100644
index 02e1991..0000000
--- a/tests/visual_tests/grids/formatting-3-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- " ",
- " ! %%%%% %% ))))) ) ) ",
- " ! % % % ) ) ) ) ",
- " ! ! ! !! ! !! ! !! % %%%% %%% %%% %%% %%% % %% ) ))) )))))) ))) ) )))) ))))))) ",
- "! ! ! ! ! ! !!!! % % % % % % % % % % ) ) ) ) ) ) ) ) ) ) ) ) ) ",
- " ! ! ! ! ! ! ! % % %% % % % % % % ) ) )) ) ) ) ) ) ) ) ) ",
- " ! !!! !!!! ! ! !!!! % % % % % % % % % % % ) ) ) ) ) ) ) ) ) )) ) ) ) ",
- " %% %% % %% )) )) )) ) ",
- " ))) ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-4-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/formatting-4-500-100-1.0-grid-reference.json
deleted file mode 100644
index 8bddd01..0000000
--- a/tests/visual_tests/grids/formatting-4-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-4-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/formatting-4-500-100-2.0-grid-reference.json
deleted file mode 100644
index 8bddd01..0000000
--- a/tests/visual_tests/grids/formatting-4-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-5-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/formatting-5-500-100-1.0-grid-reference.json
deleted file mode 100644
index 8b01aff..0000000
--- a/tests/visual_tests/grids/formatting-5-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- "! $$ $ $ &&& & && ((( ** * ",
- "! !! ! $$ $ $ $$ $$ && & && & (( ( ( ( (((( ((( ** * ** *** ",
- "! !! !! ! $$ $ $$ $ && && & & (( ( ( (((( ( ** * ** ",
- " ",
- " !!! !!!!!! $$$ $$$$ $$$ &&& &&&& & ((((( (( (((( ***** *** * ",
- " !!!! !!!!! $$$$$$$$ $$$$ &&&&& & &&& ((( (( (( *** * ** ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-5-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/formatting-5-500-100-2.0-grid-reference.json
deleted file mode 100644
index 1891e73..0000000
--- a/tests/visual_tests/grids/formatting-5-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- " ",
- " ! %%%%% %% ))))) ) ) ",
- " ! % % % ) ) ) ) ",
- " ! ! ! !! ! !! ! !! % %%%% %%% %%% %%% %%% % %% ) ))) )))))) ))) ) )))) ))))))) ",
- "! ! ! ! ! ! !!!! % % % % % % % % % % ) ) ) ) ) ) ) ) ) ) ) ) ) ",
- " ! ! ! ! ! ! ! % % %% % % % % % % ) ) )) ) ) ) ) ) ) ) ) ",
- " ! !!! !!!! ! ! !!!! % % % % % % % % % % % ) ) ) ) ) ) ) ) ) )) ) ) ) ",
- " %% %% % %% )) )) )) ) ",
- " ))) ",
- " ! %%% % % % )))) ) ) ) ) ",
- "!!! ! ! !! ! % % %% %%%% %%%% %%% ) ) )))) ) )) ))) )) ) ) "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-6-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/formatting-6-500-100-1.0-grid-reference.json
deleted file mode 100644
index 8b01aff..0000000
--- a/tests/visual_tests/grids/formatting-6-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- "! $$ $ $ &&& & && ((( ** * ",
- "! !! ! $$ $ $ $$ $$ && & && & (( ( ( ( (((( ((( ** * ** *** ",
- "! !! !! ! $$ $ $$ $ && && & & (( ( ( (((( ( ** * ** ",
- " ",
- " !!! !!!!!! $$$ $$$$ $$$ &&& &&&& & ((((( (( (((( ***** *** * ",
- " !!!! !!!!! $$$$$$$$ $$$$ &&&&& & &&& ((( (( (( *** * ** ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-6-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/formatting-6-500-100-2.0-grid-reference.json
deleted file mode 100644
index 1891e73..0000000
--- a/tests/visual_tests/grids/formatting-6-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- " ",
- " ! %%%%% %% ))))) ) ) ",
- " ! % % % ) ) ) ) ",
- " ! ! ! !! ! !! ! !! % %%%% %%% %%% %%% %%% % %% ) ))) )))))) ))) ) )))) ))))))) ",
- "! ! ! ! ! ! !!!! % % % % % % % % % % ) ) ) ) ) ) ) ) ) ) ) ) ) ",
- " ! ! ! ! ! ! ! % % %% % % % % % % ) ) )) ) ) ) ) ) ) ) ) ",
- " ! !!! !!!! ! ! !!!! % % % % % % % % % % % ) ) ) ) ) ) ) ) ) )) ) ) ) ",
- " %% %% % %% )) )) )) ) ",
- " ))) ",
- " ! %%% % % % )))) ) ) ) ) ",
- "!!! ! ! !! ! % % %% %%%% %%%% %%% ) ) )))) ) )) ))) )) ) ) "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-7-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/formatting-7-500-100-1.0-grid-reference.json
deleted file mode 100644
index 8b01aff..0000000
--- a/tests/visual_tests/grids/formatting-7-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- "! $$ $ $ &&& & && ((( ** * ",
- "! !! ! $$ $ $ $$ $$ && & && & (( ( ( ( (((( ((( ** * ** *** ",
- "! !! !! ! $$ $ $$ $ && && & & (( ( ( (((( ( ** * ** ",
- " ",
- " !!! !!!!!! $$$ $$$$ $$$ &&& &&&& & ((((( (( (((( ***** *** * ",
- " !!!! !!!!! $$$$$$$$ $$$$ &&&&& & &&& ((( (( (( *** * ** ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-7-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/formatting-7-500-100-2.0-grid-reference.json
deleted file mode 100644
index 1891e73..0000000
--- a/tests/visual_tests/grids/formatting-7-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- " ",
- " ! %%%%% %% ))))) ) ) ",
- " ! % % % ) ) ) ) ",
- " ! ! ! !! ! !! ! !! % %%%% %%% %%% %%% %%% % %% ) ))) )))))) ))) ) )))) ))))))) ",
- "! ! ! ! ! ! !!!! % % % % % % % % % % ) ) ) ) ) ) ) ) ) ) ) ) ) ",
- " ! ! ! ! ! ! ! % % %% % % % % % % ) ) )) ) ) ) ) ) ) ) ) ",
- " ! !!! !!!! ! ! !!!! % % % % % % % % % % % ) ) ) ) ) ) ) ) ) )) ) ) ) ",
- " %% %% % %% )) )) )) ) ",
- " ))) ",
- " ! %%% % % % )))) ) ) ) ) ",
- "!!! ! ! !! ! % % %% %%%% %%%% %%% ) ) )))) ) )) ))) )) ) ) "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-8-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/formatting-8-500-100-1.0-grid-reference.json
deleted file mode 100644
index 8b01aff..0000000
--- a/tests/visual_tests/grids/formatting-8-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- "! $$ $ $ &&& & && ((( ** * ",
- "! !! ! $$ $ $ $$ $$ && & && & (( ( ( ( (((( ((( ** * ** *** ",
- "! !! !! ! $$ $ $$ $ && && & & (( ( ( (((( ( ** * ** ",
- " ",
- " !!! !!!!!! $$$ $$$$ $$$ &&& &&&& & ((((( (( (((( ***** *** * ",
- " !!!! !!!!! $$$$$$$$ $$$$ &&&&& & &&& ((( (( (( *** * ** ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-8-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/formatting-8-500-100-2.0-grid-reference.json
deleted file mode 100644
index 1891e73..0000000
--- a/tests/visual_tests/grids/formatting-8-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- " ",
- " ! %%%%% %% ))))) ) ) ",
- " ! % % % ) ) ) ) ",
- " ! ! ! !! ! !! ! !! % %%%% %%% %%% %%% %%% % %% ) ))) )))))) ))) ) )))) ))))))) ",
- "! ! ! ! ! ! !!!! % % % % % % % % % % ) ) ) ) ) ) ) ) ) ) ) ) ) ",
- " ! ! ! ! ! ! ! % % %% % % % % % % ) ) )) ) ) ) ) ) ) ) ) ",
- " ! !!! !!!! ! ! !!!! % % % % % % % % % % % ) ) ) ) ) ) ) ) ) )) ) ) ) ",
- " %% %% % %% )) )) )) ) ",
- " ))) ",
- " ! %%% % % % )))) ) ) ) ) ",
- "!!! ! ! !! ! % % %% %%%% %%%% %%% ) ) )))) ) )) ))) )) ) ) "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-expr-alignment-500-500-1.0-grid-reference.json b/tests/visual_tests/grids/formatting-expr-alignment-500-500-1.0-grid-reference.json
deleted file mode 100644
index 6feb073..0000000
--- a/tests/visual_tests/grids/formatting-expr-alignment-500-500-1.0-grid-reference.json
+++ /dev/null
@@ -1,145 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "10",
- "4",
- "5",
- "6",
- "11",
- "7",
- "8",
- "9",
- "12"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! !! # ## $$ $$ %% %% ",
- " !! ! # # $$ $ %% % ",
- " ! !! # ## # $ $ $ % % % ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " & & ' '' ' (( ( ) ))) ",
- " && & & '' ' ((( ( )))) ",
- " && && '' (( (( )) )) ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ** *** + ++ ,,, ,, - -- - ",
- " * + + , - - ",
- " ** * + ++ ,, , - -- ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/formatting-expr-alignment-500-500-2.0-grid-reference.json b/tests/visual_tests/grids/formatting-expr-alignment-500-500-2.0-grid-reference.json
deleted file mode 100644
index d59fb61..0000000
--- a/tests/visual_tests/grids/formatting-expr-alignment-500-500-2.0-grid-reference.json
+++ /dev/null
@@ -1,145 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "10",
- "4",
- "5",
- "6",
- "11",
- "7",
- "8",
- "9",
- "12"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! !! ! # # # ## $$ $ $ $ %% % % % ",
- " !! ! ! ### ### $ $ $$ % % %% ",
- " !! ! # # $ $$ % %% ",
- " !! !!! ## ### $$$ $$ %%% %% ",
- " ! ! !! ! # # # ## $$ $ $ $ %% % % % ",
- " !! !!! !! # ## # $$ $$ $ %% %% % ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " & & && && ' ' ' ' (( (( ( ( ) ) )) )) ",
- " && & & ''' ' ' ( ( ((( )) ) ) ",
- " && & & '' ' ' ( ( (( )) ) ) ",
- " && &&& '' ''' ((( (( )) ))) ",
- " & & & & '' ' ' ' ( ( ( (( ) ) ) ) ",
- " && & & & ' ''' ' ( ((( ( )) ) ) ) ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " * * * *** + ++++ + ,, ,, , , -- -- - -- ",
- " *** * * +++ + + , , ,,, - - --- ",
- " ** * ++ ++ , ,, - -- ",
- " ** ** ++ ++ ,, ,, --- -- ",
- " * ** * * ++ + + + , , , ,, - - - -- ",
- " ** * * * + +++ + , ,,, , - --- - ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/functional-expressions-256-256-1.0-grid-reference.json b/tests/visual_tests/grids/functional-expressions-256-256-1.0-grid-reference.json
deleted file mode 100644
index 6a6f1e7..0000000
--- a/tests/visual_tests/grids/functional-expressions-256-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " ## ##! ",
- " #### ### #### ",
- " #################### ",
- " ################### ",
- " ################## !!",
- " #################### !!! ",
- " ##################### !!! ",
- " ###################### !!! ",
- " ###################### !!! ",
- " ###################### !!! ",
- " ###################### !!! ",
- " ###################### !!! ",
- " ###################### !!! ",
- " ################################!! ",
- " #############################!! ",
- " # ################### !!! # ",
- " ################# !!! ",
- " # !!############## !!! ",
- " ###! ####### !!! ",
- " #!## ######### !!! ",
- " !!### ##########!! ",
- " !! ############## ",
- " !! ############# ",
- " !! ####!#### ",
- " !! ####!#### ",
- " !! ######### ",
- " !! ############### ",
- " !! ################### ",
- " !! ##################### ",
- " !! !##################### ",
- " !! !!##################### ",
- " !! !!! ################# ",
- " !! !!! ########### ",
- " !! !!! ",
- " !! !!! ",
- " !! !!! ",
- " !! !!! ",
- " !! !!! ",
- " !! !!! ",
- " !! !!! ",
- "!! !!! ",
- "! !!! ",
- "!!! ",
- "!! ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/functional-expressions-256-256-2.0-grid-reference.json b/tests/visual_tests/grids/functional-expressions-256-256-2.0-grid-reference.json
deleted file mode 100644
index 5f18f99..0000000
--- a/tests/visual_tests/grids/functional-expressions-256-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "1"
- ],
- "data": {},
- "grid": [
- " !!! !!!!## ",
- " !!!!!!! !!!!!!# ",
- " !!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ##",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #####",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#### ",
- "!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ##### !",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ###### ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ##### ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ##### ",
- " ##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ###### ",
- " #### !!!!!!!!!!!!!!!!!!!!!!!!!!! ##### ",
- " !!!! #### !!!!!!!!!!!!!!!!!!!!! ##### ",
- " !!!!!## !!!!!!!!!!!!! ###### ",
- " ! !!!!# !!!!!!!!!!!!!!! ##### ",
- " !!#!!!! !!!!!!!!!!!!!!!!!###### ",
- " !!##!!!! !!!!!!!!!!!!!!!!!#### ",
- " #### !!!! !!!!!!!!!!!!!!!!!!## ",
- " #### !!!!!!!!!!!!!! !!!! !!!!!!!!# ",
- " #### !!!!!!!!!!!!!! !!!! !!!!!!!! ",
- " #### !!!!!!!!!!!!! !!!! !!!!#!!! ",
- " #### !!!!!!!!!!! !!!!#!!!! !!! ",
- " #### !!!!!!!!! !!!!#!!!! !!! ",
- " #### !!!! !!!!#!!!! !!! ",
- " #### !!!!#!!!! !!!! !!! ",
- "#### !!!!#!!!! !!!! !!! ",
- "### !!!!#!!!! !!!! !!! ",
- "## #!!!! !!!! !!!! !!! ",
- "# ###!!!!!!!!!!!!!!!!!!! ",
- " #!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " #####!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ###### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ##### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ###### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ##### !!!!!!!!!!!!!!!!!!!!!!!!!!!!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/functional-expressions-length-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/functional-expressions-length-512-512-1.0-grid-reference.json
deleted file mode 100644
index 68bc7e3..0000000
--- a/tests/visual_tests/grids/functional-expressions-length-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,142 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "5",
- "4",
- "2",
- "6",
- "3"
- ],
- "data": {},
- "grid": [
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " ##### !! ",
- " ##### !! $$$$ ",
- " ###### !! $$$$ ",
- " # ##### !! $$$$$$ ",
- " # ## !! $$$ ",
- " ### !! $$$$ ",
- " ##### !! $$ ",
- " ##### !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " %%%% %%%%!! ",
- " %%%%%%% %%%%%%%% %%%%%%! ",
- " %%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " % %%%%%%%%%%%%%%%%%%%%%%%%%% %% ",
- " %%% %%%%%%%%%%%%%%%%%%%%%%%%% %% ",
- " %%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%% ",
- " %%% !! %%%%%%%%%%% ",
- " %%!! %%%%%%%%% ",
- " % %% %%%%%%%%%%% ",
- " !%%%% %%%%%%%%%%%% ",
- " !! %%%%%%%% %% %%%%% ",
- " !! %%%%%%% %% %% %% ",
- " !! %% %% %% %% %% ",
- " !! %% %% %% %% ",
- " !! %% %% %% %% ",
- " !! %% %% %% %% ",
- " !! %%%%%%%%%%%%%%%%% ",
- " !! %%%%%%%%%%%%%%%%%%%%% ",
- " !! %%%%%%%%%%%%%%%%%%%%%%%%% ",
- " !! %%%%%%%%%%%%%%%%%%%%%%%%% ",
- " !! %%%%%%%%%%%%%%%%%%%%%%%%% ",
- " !! %%%%%%%%%%%%%%%%%%%%%%%%% ",
- " !! %%%%%%%%%%%%%%%%%%%%%% ",
- " !! %%%%%%%%%%%%%%%%% ",
- " !! %%%%%%% ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! &&&& ",
- " !! ''' &&&&&& ",
- " !! '''' &&&&&& ",
- " !! '''''' &&&&&&&&&& ",
- " !! '' & &&& ",
- " !! '' &&& ",
- " !! ''' &&&& ",
- " !! &&&&&& ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- " !! ",
- "!! ",
- "! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/functional-expressions-length-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/functional-expressions-length-512-512-2.0-grid-reference.json
deleted file mode 100644
index d43a328..0000000
--- a/tests/visual_tests/grids/functional-expressions-length-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " #### ##### !!!! ",
- " ####### #######!!!! ",
- " ######### #########!!! ",
- " ########### ############ ###########!! ",
- " ############################################## ",
- " ############################################### ",
- " ############################################### ",
- " ############################################### ",
- " ############################################### ",
- " ############################################# ",
- " ############################################# ",
- " ############################################## ",
- " ################################################ ",
- " ################################################ ",
- " ################################################## ",
- " #################################################### ",
- " #################################################### ",
- " #################################################### ",
- " ###################################################### ",
- " ###################################################### ",
- " ###################################################### ",
- " ###################################################### ",
- " ###################################################### ",
- " ###################################################### ",
- " ###################################################### ",
- " ###################################################### ",
- " ###################################################### ",
- " ###################################################### ",
- " ###################################################### ",
- " ###################################################### ",
- " #################################################### ",
- " #################################################### ",
- " ############################################################################# ",
- " ### ################################################### #### ",
- " ############################################################### ",
- " #### ################################################# #### ",
- " ### ################################################ ### ",
- " # ############################################### # ",
- " ############################################# ",
- " ########################################### ",
- " ####################################### ",
- " !#################################### ",
- " #### !!!!############################### ",
- " ##### !!!! ####################### ",
- " ##### !!!! ################# ",
- " # ####!!!! ################## ",
- " # #####!! ################### ",
- " ## ##### ##################### ",
- " !##### ##################### ",
- " !!###### ###################### ",
- " !!!!################# ##### ########## ",
- " !!!! ################# ##### ########## ",
- " !!!! ################ ##### ##### #### ",
- " !!!! ############### ##### ##### #### ",
- " !!!! ############## ##### ##### #### ",
- " !!!! ##### ##### ##### ##### #### ",
- " !!!! ##### ##### ##### #### ",
- " !!!! ##### ##### ##### #### ",
- " !!!! ##### ##### ##### #### ",
- " !!!! ##### ##### ##### #### ",
- " !!!! ##### ##### ##### #### ",
- " !!!! ##### ##### ##### #### ",
- " !!!! ###################### ",
- " !!!! ############################## ",
- " !!!! ##################################### ",
- " !!!! ########################################## ",
- " !!!! ############################################# ",
- " !!!! ################################################ ",
- " !!!! ################################################## ",
- " !!!! ################################################### ",
- " !!!! ################################################### ",
- " !!!! ################################################### ",
- " !!!! ################################################## ",
- " !!!! ################################################# ",
- " !!!! ############################################### ",
- " !!!! ############################################ ",
- " !!!! ######################################## ",
- " !!!! ################################### ",
- " !!!! ########################### ",
- " !!!! ############## ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- "!!!! ",
- "!!! ",
- "!! ",
- "! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/gdal-filter-factor-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/gdal-filter-factor-600-400-1.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/gdal-filter-factor-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/gdal-filter-factor-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/gdal-filter-factor-600-400-2.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/gdal-filter-factor-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/geometry-transform-scale-500-500-1.0-grid-reference.json b/tests/visual_tests/grids/geometry-transform-scale-500-500-1.0-grid-reference.json
deleted file mode 100644
index 770df50..0000000
--- a/tests/visual_tests/grids/geometry-transform-scale-500-500-1.0-grid-reference.json
+++ /dev/null
@@ -1,134 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ! !! ",
- " !!!! !!!! ",
- " !!!!!! !!!!! ",
- " !!!!!!!! !!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!! ",
- " !!!!!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!! ",
- " ! !!!!!! ",
- " !!!!! ",
- " ! !!!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/geometry-transform-scale-500-500-2.0-grid-reference.json b/tests/visual_tests/grids/geometry-transform-scale-500-500-2.0-grid-reference.json
deleted file mode 100644
index a0491d8..0000000
--- a/tests/visual_tests/grids/geometry-transform-scale-500-500-2.0-grid-reference.json
+++ /dev/null
@@ -1,134 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ! !! ",
- " !!! !!!! ",
- " !!!!! !!!!!!!! ",
- " !!!!!!! !!!!!!!!! ",
- " !!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!! ! ",
- " !!!!!!!!! !! ",
- " !!!!!!!! ! ",
- " !!!!! ",
- " !!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/geometry-transform-scale-patterns-500-500-1.0-grid-reference.json b/tests/visual_tests/grids/geometry-transform-scale-patterns-500-500-1.0-grid-reference.json
deleted file mode 100644
index db29f66..0000000
--- a/tests/visual_tests/grids/geometry-transform-scale-patterns-500-500-1.0-grid-reference.json
+++ /dev/null
@@ -1,134 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !! !! ",
- " !!!! !!!! ",
- " !!!!!! !!!!!! ",
- " !!!!!!!! !!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!!! !!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!! ",
- " !!!!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!! ",
- " !!!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/geometry-transform-scale-patterns-500-500-2.0-grid-reference.json b/tests/visual_tests/grids/geometry-transform-scale-patterns-500-500-2.0-grid-reference.json
deleted file mode 100644
index bb7388c..0000000
--- a/tests/visual_tests/grids/geometry-transform-scale-patterns-500-500-2.0-grid-reference.json
+++ /dev/null
@@ -1,134 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!! !!!! ",
- " !!!!! !!!!!! ",
- " !!!!!!! !!!!!!!! ",
- " !!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!! ",
- " !!!!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/geometry-transform-translate-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/geometry-transform-translate-200-200-1.0-grid-reference.json
deleted file mode 100644
index 5a7be59..0000000
--- a/tests/visual_tests/grids/geometry-transform-translate-200-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/geometry-transform-translate-200-200-2.0-grid-reference.json b/tests/visual_tests/grids/geometry-transform-translate-200-200-2.0-grid-reference.json
deleted file mode 100644
index 5a7be59..0000000
--- a/tests/visual_tests/grids/geometry-transform-translate-200-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/geometry-transform-translate-patterns-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/geometry-transform-translate-patterns-200-200-1.0-grid-reference.json
deleted file mode 100644
index 5a7be59..0000000
--- a/tests/visual_tests/grids/geometry-transform-translate-patterns-200-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/geometry-transform-translate-patterns-200-200-2.0-grid-reference.json b/tests/visual_tests/grids/geometry-transform-translate-patterns-200-200-2.0-grid-reference.json
deleted file mode 100644
index 5a7be59..0000000
--- a/tests/visual_tests/grids/geometry-transform-translate-patterns-200-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/geometry-transform-translate-patterns-svg-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/geometry-transform-translate-patterns-svg-200-200-1.0-grid-reference.json
deleted file mode 100644
index 6af6173..0000000
--- a/tests/visual_tests/grids/geometry-transform-translate-patterns-svg-200-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/geometry-transform-translate-patterns-svg-200-200-2.0-grid-reference.json b/tests/visual_tests/grids/geometry-transform-translate-patterns-svg-200-200-2.0-grid-reference.json
deleted file mode 100644
index 6af6173..0000000
--- a/tests/visual_tests/grids/geometry-transform-translate-patterns-svg-200-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/group-symbolizer-1-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/group-symbolizer-1-512-512-1.0-grid-reference.json
deleted file mode 100644
index 4aef59e..0000000
--- a/tests/visual_tests/grids/group-symbolizer-1-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! !! ",
- " ! ! ",
- " !! !! ",
- " !!!!!! !!!!! ",
- " !!!!!! !!!!! ",
- " !!!!!! !!!!! ",
- " !!!!!! !!!!! ",
- " ",
- " ! ! !! !! ",
- " ! !! !!! ! !! ! ",
- " !!!! !!! ! !! !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/group-symbolizer-1-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/group-symbolizer-1-512-512-2.0-grid-reference.json
deleted file mode 100644
index 36c2574..0000000
--- a/tests/visual_tests/grids/group-symbolizer-1-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! !! ",
- " ! ! ! !! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " ",
- " !! !!!!!! ",
- " ! ! ! ",
- " !! ! !!!! !!!! ! ! ! ! !!!! ",
- " ! ! ! ! ! ! ! !!! ! ! ! ",
- " !! ! ! ! ! ! !! !! ! ! ",
- " ! ! ! ! ! ! ! !! ! !!!! ",
- " !! !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/group-symbolizer-2-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/group-symbolizer-2-512-512-1.0-grid-reference.json
deleted file mode 100644
index b0d4538..0000000
--- a/tests/visual_tests/grids/group-symbolizer-2-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/group-symbolizer-2-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/group-symbolizer-2-512-512-2.0-grid-reference.json
deleted file mode 100644
index b0d4538..0000000
--- a/tests/visual_tests/grids/group-symbolizer-2-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/group-symbolizer-3-512-256-1.0-grid-reference.json b/tests/visual_tests/grids/group-symbolizer-3-512-256-1.0-grid-reference.json
deleted file mode 100644
index ef2ac14..0000000
--- a/tests/visual_tests/grids/group-symbolizer-3-512-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/group-symbolizer-3-512-256-2.0-grid-reference.json b/tests/visual_tests/grids/group-symbolizer-3-512-256-2.0-grid-reference.json
deleted file mode 100644
index ef2ac14..0000000
--- a/tests/visual_tests/grids/group-symbolizer-3-512-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/group-symbolizer-line-1-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/group-symbolizer-line-1-512-512-1.0-grid-reference.json
deleted file mode 100644
index a766bbf..0000000
--- a/tests/visual_tests/grids/group-symbolizer-line-1-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! !!!!! !! ",
- " !!!!! !!!!! ",
- " !!!!! !!!!!!! ",
- " !!!!! !!!!! ",
- " !! !!!!! !!!!! ",
- " !! !! ",
- " !!!!!! !!!!!! ! !! !!!! ",
- " !!!!!! !!!!!!! ! !! !! !! ",
- " !!!!!! !!!!!! ",
- " !! !!!!!! !!!!!! ",
- " !! !! !!! ",
- " !!!!!! !!!!!! !!! ! !!!!! ",
- " !!!!!! !!!!!! ! !! !! !! ",
- " !!!!!! !!!!! ",
- " !!!!!!!! !!!!! ",
- " !! !! !!! ",
- " !!!!! !!!!!!! ! !!!!!! !!! ! ",
- " !!!!! !!!!! ! !! !! ! !! ! ",
- " !!!!! !!!!! ",
- " !!!!!!! !!!!! ",
- " !! !! !! ",
- " !!!!!! !!!!!!!! !!!!! !!!! ",
- " !!!!!! !!!!!! !!!!! !!!! ",
- " !!!!!! !!!!!! ! ! ! ",
- " !!!!!!! !!!!!! ",
- "!! ! !!! ",
- " ! !!! !! !!! !! ",
- " ! !! !! !!!!! ! ",
- " ! ! !! ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/group-symbolizer-line-1-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/group-symbolizer-line-1-512-512-2.0-grid-reference.json
deleted file mode 100644
index fc9aa52..0000000
--- a/tests/visual_tests/grids/group-symbolizer-line-1-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " !!!!!!!!!! !!!!!!!!!! !! ",
- " !!!!!!!!!! !!!!!!!!!! !! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!! !! !!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !! !!!!!!!!!! !!!!!!!!!! ",
- " !! ",
- " !! !! !!!!!! ",
- " !! ! ! ! ",
- " !! !! ! !!!! !!!! ! ! ! ! !!!! ",
- " !! ! ! ! ! ! ! ! !!! ! ! ! ",
- " !!!!!!!!!! !!!!!!!!!! !! !! ! ! ! ! ! !! !! ! ! ",
- " !!!!!!!!!! !!!!!!!!!!!! ! ! ! ! ! ! ! !! ! !!!! ",
- " !!!!!!!!!! !!!!!!!!!! !! !! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!! !! !!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! ",
- " !! !!!!!!!!!! !!!!!!!!!! ",
- " !! ",
- " !! !!! !!!!!! ",
- "!! ! !! ! ! ! ! !! ",
- " ! ! !!!! !!!! ! !! ! ! ! ! ",
- " ! ! ! ! !!!! ! !!! ! ! ! ",
- " !! ! ! ! ! ! !! !! ! ! ",
- " !!!! ! ! !! ! ! !! ! !!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/group-symbolizer-line-2-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/group-symbolizer-line-2-512-512-1.0-grid-reference.json
deleted file mode 100644
index d0222f1..0000000
--- a/tests/visual_tests/grids/group-symbolizer-line-2-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ###### ",
- " !!!!! ###### ",
- " !!!!! ###### ",
- " !!!!! ###### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/group-symbolizer-line-2-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/group-symbolizer-line-2-512-512-2.0-grid-reference.json
deleted file mode 100644
index 091a77c..0000000
--- a/tests/visual_tests/grids/group-symbolizer-line-2-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!! ########### ",
- " !!!!!!!!!!! ########### ",
- " !!!!!!!!!!! ########### ",
- " !!!!!!!!!!! ########### ",
- " !!!!!!!!!!! ########### ",
- " !!!!!!!!!!! ########### ",
- " !!!!!!!!!!! ########### ",
- " !!!!!!!!!!! ########### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/halo-comp-op-on-satellite-450-450-1.0-grid-reference.json b/tests/visual_tests/grids/halo-comp-op-on-satellite-450-450-1.0-grid-reference.json
deleted file mode 100644
index 3519d6d..0000000
--- a/tests/visual_tests/grids/halo-comp-op-on-satellite-450-450-1.0-grid-reference.json
+++ /dev/null
@@ -1,121 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/halo-comp-op-on-satellite-450-450-2.0-grid-reference.json b/tests/visual_tests/grids/halo-comp-op-on-satellite-450-450-2.0-grid-reference.json
deleted file mode 100644
index 3519d6d..0000000
--- a/tests/visual_tests/grids/halo-comp-op-on-satellite-450-450-2.0-grid-reference.json
+++ /dev/null
@@ -1,121 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/harfbuzz-800-200-1.0-grid-reference.json b/tests/visual_tests/grids/harfbuzz-800-200-1.0-grid-reference.json
deleted file mode 100644
index f8888e9..0000000
--- a/tests/visual_tests/grids/harfbuzz-800-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "6",
- "1",
- "3",
- "2",
- "4",
- "5",
- "7",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! !! ",
- " # # # ! !! ! ",
- " # # # # ! !! ! ",
- " # # # # # ! !! ! ",
- " ## # # # # # # ! !! ! ",
- " $ $$$ $ % % %% #### ## # # ## ### !! ! !! ! ",
- " $ $$ %%% %%%% %%%%%% %% ## ## ### # # ### # # # # ! ! ! ! ! ! ",
- " $ $$ $ $$$$ %% %% %% %% # ####### #### # ########### # !!!! !! !!!!! ! ",
- " $ $ % % % # # ## # !! !! ",
- " ## # ## !! !! ",
- " ### ## !! ",
- " ",
- " $ & % ' ( # ) * ! + ",
- " ",
- " ",
- " ",
- " $$ $$$ % %%% ## # # !! ! !! ",
- " $$ $$$$ %%% %%%%% %% %%% %% ## # ### !! !!!!! ",
- " %% % %%% %% % % %% %%% % % ",
- " %% % %%% % %%% %% %% % %% %% ",
- " % ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/harfbuzz-800-200-2.0-grid-reference.json b/tests/visual_tests/grids/harfbuzz-800-200-2.0-grid-reference.json
deleted file mode 100644
index 887ca76..0000000
--- a/tests/visual_tests/grids/harfbuzz-800-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "1",
- "3",
- "2",
- "4",
- "5",
- "6",
- "7",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ! ! ",
- " ! !! ",
- " !!! ",
- " !! ! ",
- " !! !!! !! ",
- " !! !!!! !! ",
- " !! !!!!! !! ",
- " !! !!! !! ",
- " !! !! !! ",
- " !! !! !! ",
- " !!! !! !!! !! ",
- " #### # $ $ $$$ !!! !! !!! !! ",
- " # # $ $ $ !! !! !! !! !!! !! ",
- " # # $ $ $$$$ $$$$ $$$$ $ $$$ $$$ $ $$$$ !! !! !! !! !! !! ",
- " ## ### # $ $ $ $ $$ $ $ $ $ $ $ $ $ !! !! !! !! !! !! ",
- " # ### ## ### # # $ $ $ $ $ $ $ $ $ $ $ $ $ !!! !!! !! !!! !!! !! ",
- " # ### ###### # # # $ $ $ $$ $ $$ $ $ $ $ $$ $ $ $ !!!!!!! !!!!!! !!!!!!!! !! ",
- " # ## $ $ $ $ !! !!!! ",
- " ### $$$$ !! ",
- " !!! ! !! ",
- " !!!!! ",
- " !!! ",
- " ",
- " ",
- " ",
- " # % $ & ' ( ) * ! + ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ## ## # # $ $ $ ( ( (( ( ! ! ! ! ",
- " ### # # # # $ $ $ $$$$$ $ (((( ( ( ( !!!! ! !! ! ",
- " # # ### $$$ $$ $ $ $ $$$ $$$ $ $ $$$ $ $$$$ (( ( ( (( !! ! !! ! ! ",
- " # # # # # $ $ $ $ $$$ $ $ $ $ $$ $ $ $ $ $$ $ (( ( ( ( !! ! ! ! ! ",
- " $ $ $ $ $ $$$$ $ $ $$ $$ $$ $ $ $ $$$$ $$ $ ",
- " $ $ $ $ $ $ $$ $ $ $ $ $$$ $$$ $ $ $ $ $$$ $ ",
- " $ $ $ $ $ $ $$$ $$$ $$$$ $$$$$ $$$ $ $$$ $ $ $$ ",
- " $ $ ",
- " $$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/hb-fontsets-800-200-1.0-grid-reference.json b/tests/visual_tests/grids/hb-fontsets-800-200-1.0-grid-reference.json
deleted file mode 100644
index 137ed78..0000000
--- a/tests/visual_tests/grids/hb-fontsets-800-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "6",
- "8",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! # # $ $ ",
- " ! !! # ## $ $$ ",
- " ",
- " ! !! !! %%%%% %%%%% %%%% %%%%%%%%%% ##### ## # # $ $ $$ ",
- " ! ! ! ! !! %% % % % % %% % # ## # # ## $ $ $ $ $$ ",
- " ! ! ! !!!! ! %%%%% % % % % %% % ## # # #### # $ $ $$$$ $$ ",
- " ! ! ! ! ! ! %% % % % % %% % # # # # # $ $ $ $ $$ ",
- " !!! ! ! ! ! %% % % % % %% % ## # ## # # $ $ $$ $ $$ ",
- " ! ! ! ! ! ! %% %% % % % % %% % ## ## # # ## # # $ $ $$ $ $ ",
- " ! % % % %% % ## # $ ",
- " ! !! ! %%%%% %%%% %%%%%%%%%% # # # $ $ $ ",
- " ! !! ! # # $ $ $ ",
- " ! !! ! # # $ $ $ ",
- " ! ! ## # $ $ ",
- " ! # $ ",
- " ",
- " ",
- " !! !!! ! $ $$ $$ $$ $$ ",
- " ! ! !! !! ! ! !!!! %%%%%%% %%%%% % %%%% ######## ############ $$$ $ $$ $ $ $$ $ $$$ $ ",
- " ! %%%%% % %%% % % %%%% ###### # #### # # ## ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/hb-fontsets-800-200-2.0-grid-reference.json b/tests/visual_tests/grids/hb-fontsets-800-200-2.0-grid-reference.json
deleted file mode 100644
index 83ff5b3..0000000
--- a/tests/visual_tests/grids/hb-fontsets-800-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "6"
- ],
- "data": {},
- "grid": [
- " !!!! !! ##### # ",
- " !!! !!!! ## #### ",
- " !!!!!!!! ####### ",
- " ",
- " ###### ",
- " !! !! ! ######### # ### ## ",
- " !! !!!! !!!!! !!!! ### # #### ###### #### ",
- " !!! ! ! !! !! !! ! ## ## # ## ## # # ",
- " !!!! !! !!!!! !! ## ## ## #### ## ",
- " ! !! !! !!!!!!!! ! ### ## # ######## ## ",
- " !! ! ! !! !! ! ! ## # ## ## ## ",
- " !! !! ! !! !! ! ! ## # ## ## ## ",
- " !!!!!! !! !! ! ! ### # ## ## ## ",
- " !!!!!!! !! !!! ! ! ## # #### ## ## ",
- " !! !! !! !! ! ! ! ## # ## # ## ## ",
- " ! !! !! !!! !! !! ### ## ## # #### ## ## ",
- " !! !! ! !! !!! !!!!!!!! ######## ## # ### ####### ",
- " !! #### # ",
- " !! !!!!! # ##### ",
- " !! !! !! # ## ## ",
- " !! ! !! # ## # ",
- " !! !! !! # ### # ",
- " !! !! !! # ### # ",
- " !! !! !! # ## # ",
- " !! !! # # ",
- " !! !! # # ",
- " !!!!!!!! ######## ",
- " !!! #### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! !! !! !! !! ! ",
- " !! !! !!! !! !! ! ! !! !! !! !!!! ## ## # ## # # # # ",
- " !! ! ! !!!!! ! ! !! !! ! !! !!! ## ##### ## # # ### ### # # ## ### # ",
- " ! !! ! !!! ! !! !! ! !!! !! !!! !!! # # ##### ####### ## # # # # ",
- " !! ## # ###### # # ## ## ### # ## # #### ",
- " # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/image-filters-galore-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/image-filters-galore-512-512-1.0-grid-reference.json
deleted file mode 100644
index 318d315..0000000
--- a/tests/visual_tests/grids/image-filters-galore-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,290 +0,0 @@
-{
- "keys": [
- "",
- "28",
- "66",
- "119",
- "135",
- "168",
- "78",
- "151",
- "53",
- "58",
- "99",
- "51",
- "75",
- "44",
- "128",
- "97",
- "20",
- "118",
- "42",
- "84",
- "31",
- "56",
- "98",
- "41",
- "166",
- "108",
- "29",
- "80",
- "10",
- "72",
- "134",
- "50",
- "19",
- "147",
- "169",
- "83",
- "131",
- "3",
- "104",
- "65",
- "162",
- "59",
- "158",
- "86",
- "130",
- "76",
- "157",
- "88",
- "100",
- "46",
- "161",
- "39",
- "153",
- "77",
- "1",
- "123",
- "94",
- "92",
- "74",
- "103",
- "48",
- "138",
- "90",
- "120",
- "18",
- "110",
- "25",
- "106",
- "105",
- "4",
- "122",
- "16",
- "163",
- "38",
- "137",
- "115",
- "154",
- "139",
- "91",
- "171",
- "81",
- "71",
- "45",
- "129",
- "174",
- "156",
- "126",
- "67",
- "69",
- "141",
- "49",
- "144",
- "117",
- "15",
- "116",
- "52",
- "87",
- "36",
- "170",
- "160",
- "63",
- "61",
- "60",
- "155",
- "14",
- "33",
- "140",
- "145",
- "146",
- "37",
- "124",
- "68",
- "143",
- "32",
- "27",
- "95",
- "148",
- "93",
- "34",
- "73",
- "112",
- "23",
- "64",
- "35",
- "165",
- "85",
- "47",
- "125",
- "57",
- "164",
- "127",
- "2",
- "142",
- "176",
- "159",
- "22",
- "111",
- "109",
- "102",
- "9",
- "172",
- "113",
- "177",
- "54",
- "30",
- "132",
- "26",
- "114",
- "5",
- "175",
- "167",
- "121",
- "8",
- "55",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!! ######### ",
- " !!!!!!!!!!#################### $ $$$$ %%% %%%% ",
- " !! !! !!!!!!!!!!!#################### $$$$$$ %%%%% ",
- " !!!!!!! !!!!!!!! ################## %%%%% %%%%%%%%%% %%%%% ",
- "% !!!!!!!! !!!!!!!!!!! ############# %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- "% &&&&&&&&&!!!!!!!!!!!!!!!!!!!!!!!!!!! ############ $$$$$%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%% &&&&&&&&&!!!!!!!!!!!!!!!!!!!!!! !!!!!! ######## '''' $$((())%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "% %&&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!! ##### '''' $$((()))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&&!!!!!!!!!!!!!!!!!! ! !!!!!! #### $$$(( ))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " &&&&& &&!!!!!!!!!!!!!!! !!!!!!! ** $$((( +,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " &&& &!!!!!!!!!!!!!!!!! !!!!!!!! -** ..(/%0+1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! --**2233////11%%%%%%%%%%%444444%%%%%%%%%%%%%%%55%%%%%%% %%% ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! **6673388/9999999%%%444444444444%%%:%::%%%%%%555%%%%%% ",
- " &&&&&&&&&&&&&&!!!!!&!!!!!! 66666;<=>>???999%%%%44444444444445:::::::::::55555%%%% ",
- " &&&&&&&&&&&&&&&!!&&&&!! @@6666<<<ABB?? 99%%%%44CC444444455555::::::5555555%% DD ",
- " &&&&&&&&&&&&&&&&&&&& E@@@@ <<<<FGHIIIIIIJ% KCKCCCCLLL55555555:5555555MM DD ",
- " &&&&&&&&&&&&&&&&&& E@@@ <<<<HHIIIIIIINN KKKKCCOO55555555555555555MMP DD ",
- " &&&&&&&&&&&&&&&&& EQQRRRSS< HHIITIUVVNNNNNKWWWXX5555555555555555 PPDDDD ",
- " &&&&&&&&&&&&&&& QQQRRRSSY YY ZUVVVNNNNNWWWXX[[555555555555555 DDD ",
- " ]]]]&&&&&&&&& QQQRRRRRYYYYY^^^^___V`NNNNWWXXX[[a55555555555555 ",
- " ]]]]]]& &b QQcRRRRRRYYYYY^^^^______NNNNXXX[[[[aad[ee55555555 ",
- " ]]]]]] &b QQccfRRRRRYYYYY^^^^______ghNXXXX[[[[[[i[e55555555j ",
- " && ]]]] ]]kkkk llccfffRRmmmnnYooooo______hh [[[[[[[ieeepqq555 j ",
- " & ]]]]]]] rrstu ccccffffmmmmnnnooooo ___vhh [[[[[ eewpq 5 x ",
- " ]]]]yzz {{cccfffmmmnnnnooooo|vvvvv [[[[ eewwwq x ",
- " y}~~ {{fff\u007fmm\u0080\u0080\u0080nnnooooo\u0081\u0081|vv [[ ww\u0082qq xx ",
- " ~~ \u0083\u0084\u0084\u0084\u0084\u0085 \u0086\u0087\u0087ff\u0088\u0089\u008a\u0080\u0080\u0080\u008bnno\u008co\u008c\u008c\u0081\u0081\u008d\u008d\u008d\u008e [[ w qq xxx ",
- " \u008f\u0090\u0090\u0083\u0084\u0084\u0084\u0084\u0084\u0091 \u0092\u0092\u0087\u0093\u0088\u0089\u0080\u0080\u0080\u0080\u008bn\u0094\u0094\u008c\u008c\u008c\u008c\u0081\u0081\u0081\u0081\u008e\u008e [\u0095\u0095 ww xxx ",
- " \u0083\u0083\u0083\u0083\u0084\u0084\u0084\u0091\u00966 \u0097\u0097\u0093\u0088\u0088 \u0080\u0080\u008b\u008b\u0094\u0098\u0098\u0098\u008c\u008c\u008c\u0081\u0081\u0081\u008e\u008e \u0099\u0099\u009a\u009a \u009a\u009a ",
- " \u0083\u0083\u0083\u0083\u0084\u0084\u009b\u0091\u00966\u009b \u009c\u009c\u009d\u009d\u0098\u0098\u0098\u0098\u009e\u009e\u009f\u009f\u008e\u008e \u0099\u009a\u009a \u009a\u009a\u0099\u0099\u0099\u0099\u0099 ",
- " \u00a0\u00a0\u00a1\u0083\u0083\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b \u00a2\u00a2\u00a2\u009d\u0098\u0098\u0098\u0098\u009e\u009e\u009f\u009f\u008e \u0099\u0099\u0099 \u0099\u0099\u0099\u0099\u0099\u0099\u0099\u0099\u0099 \u0099 ",
- " \u00a1\u00a1\u00a1\u00a1\u00a1\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b \u00a2\u009d\u0098\u0098\u0098\u0098\u0098\u00a3\u00a3\u00a3\u009f \u0099\u0099 \u0099\u0099\u0099\u0099\u0099 \u0099\u0099\u0099\u0099\u0099\u00a4\u00a4 \u00a4 ",
- " \u00a1\u00a1\u00a1\u00a1\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b \u0098\u00a5\u0098\u0098\u0098\u0098\u0098\u00a3\u00a3\u00a3\u00a3 \u0099\u0099\u0099\u0099 \u0099\u0099\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a6 ",
- " \u00a1\u00a1\u00a1\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b \u00a5\u00a5\u00a5\u0098\u0098\u00a7\u00a7\u00a3\u00a3\u00a3 \u0099\u0099\u0099\u0099\u0099\u00a8 \u0099\u00a4\u00a4\u00a4\u00a4 \u00a6 ",
- " \u00a1\u00a1\u00a1\u00a1\u00a9\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b \u00a5\u00a5\u00a5\u00a5\u00a7\u00a7\u00a7\u00aa\u00a3\u00ab \u00ac \u00ad\u00ad\u00ad \u00ad\u00ad ",
- " \u00a1\u00a1\u00a1\u00a9\u00a9\u00a9\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009b \u00a5\u00a5\u00a5\u00a5\u00a7\u00a7\u00a7\u00a7\u00aa\u00ab\u00ab \u00ac\u00ac\u00ac \u00ad\u00ad\u00ad\u00ad\u00ad \u00ad\u00ad \u00ae ",
- " \u00a1\u00a1\u00a9\u00a9\u00a9\u00a9\u009b\u009b\u009b\u009b\u009b\u009b\u009b \u00af\u00af\u00af\u00af\u00a7\u00b0\u00b0\u00b0\u00ab\u00ab\u00ab \u00ac\u00ac \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad \u00b1",
- " \u00b2\u00a9\u00a9\u00b3\u00b3\u009b\u009b\u009b\u009b\u009b\u009b\u009b \u00af\u00af\u00af\u00b4\u00b4\u00b0\u00b0\u00ab \u00ac\u00ac \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad \u00b5\u00b5 ",
- " \u00b2\u00b2\u00b6\u00b3\u00b3\u00b3\u009b\u009b\u009b\u009b\u009b \u00af\u00af\u00af\u00b4\u00b4\u00b7\u00b7\u00ab \u00ac\u00ac\u00ac \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad \u00b5 ",
- " \u00b2\u00b6\u00b6\u00b6\u00b6\u00b3\u009b\u009b\u009b \u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00ab \u00ac \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad ",
- " \u00b2\u00b6\u00b6\u00b6\u00b6\u009b\u009b\u009b \u00b7\u00b7\u00b7\u00b7\u00b7\u00b7 \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad ",
- " \u00b6\u00b6\u00b6\u00b6\u00b6\u00b8\u009b\u009b \u00b7\u00b7\u00b7\u00b7\u00b7 \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad ",
- " \u00b2\u00b2\u00b6\u00b6\u00b6\u00b6\u00b8\u00b8 \u00b7\u00b7\u00b7 \u00ad\u00ad\u00ad\u00ad \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad \u00b9\u00b9 ",
- " \u00b2\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6 \u00ad\u00ad\u00ad\u00ad \u00b9\u00b9",
- " \u00b2\u00b6\u00b6\u00b6\u00b6 \u00ad \u00b9\u00b9\u00b9",
- " \u00b2\u00b6\u00b6\u00b6 \u00ad \u00b9\u00b9\u00b9 ",
- " \u00b2\u00b2\u00b6\u00b6 \u00b9\u00b9\u00b9 ",
- " \u00b2\u00b2\u00b6\u00b6 \u00ba\u00ba ",
- " \u00b2\u00b2\u00b6 \u00bb\u00bb ",
- " \u00b2\u00b2\u00b6\u00b6 ",
- " ",
- " ",
- " \u00bc ",
- " \u00bc\u00bc \u00bc\u00bc\u00bc \u00bc \u00bc\u00bc \u00bc \u00bc\u00bc ",
- " \u00bc\u00bc\u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc ",
- " \u00bc\u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00b [...]
- " \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u [...]
- " \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\ [...]
- " \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc \u00bc\u00bc\u00bc\u00bc \u00bc\u00bc\u00bc\u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00b [...]
- " \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc [...]
- "\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u0 [...]
- "\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u0 [...]
- "\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u0 [...]
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/image-filters-galore-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/image-filters-galore-512-512-2.0-grid-reference.json
deleted file mode 100644
index 1ff0dfc..0000000
--- a/tests/visual_tests/grids/image-filters-galore-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,290 +0,0 @@
-{
- "keys": [
- "",
- "28",
- "66",
- "119",
- "135",
- "168",
- "151",
- "78",
- "53",
- "58",
- "99",
- "51",
- "75",
- "44",
- "97",
- "20",
- "118",
- "42",
- "128",
- "84",
- "31",
- "56",
- "98",
- "41",
- "166",
- "108",
- "29",
- "80",
- "10",
- "72",
- "134",
- "50",
- "150",
- "19",
- "147",
- "169",
- "83",
- "131",
- "3",
- "104",
- "65",
- "162",
- "59",
- "158",
- "86",
- "130",
- "46",
- "161",
- "76",
- "157",
- "100",
- "39",
- "153",
- "77",
- "1",
- "123",
- "88",
- "94",
- "48",
- "173",
- "74",
- "103",
- "138",
- "90",
- "120",
- "18",
- "110",
- "25",
- "106",
- "38",
- "105",
- "4",
- "122",
- "16",
- "163",
- "137",
- "115",
- "154",
- "139",
- "91",
- "171",
- "81",
- "71",
- "45",
- "129",
- "174",
- "156",
- "126",
- "67",
- "69",
- "141",
- "49",
- "144",
- "117",
- "36",
- "170",
- "15",
- "116",
- "52",
- "87",
- "124",
- "160",
- "63",
- "61",
- "60",
- "155",
- "14",
- "33",
- "140",
- "145",
- "146",
- "95",
- "68",
- "148",
- "143",
- "32",
- "27",
- "93",
- "34",
- "73",
- "112",
- "47",
- "23",
- "64",
- "35",
- "165",
- "85",
- "125",
- "57",
- "164",
- "127",
- "2",
- "142",
- "176",
- "159",
- "22",
- "111",
- "109",
- "102",
- "9",
- "54",
- "172",
- "113",
- "177",
- "30",
- "132",
- "26",
- "114",
- "5",
- "175",
- "167",
- "121",
- "8",
- "55",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!################ ",
- " !! !!!!!!!!!!!##################### $$$$$$$ %%% %%%%% ",
- " !!!!!!!!!!!!!!!!!#################### $$$$$$ %%% %%%%%%%% ",
- " !!!!!!!!!!!!!!!!!! ################### $ %%%%%% %%%%%%%%%%%%%% %% %%%%%%% ",
- "%% &&&& !!!!!!!!!!!!!!!!!!!!! ############## $$ %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %",
- "%% &&&&&&&&&!!!!!!!!!!!!!!!!!!!!!!!!!!! ############# $'$$$$%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%%&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ##########((((( $$'''))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%&&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!! ###### ((((( $$$''')))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&&&!!!!!!!!!!!!!!!!!! !!!!!!!! #### $$$'''))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " &&&&&&& &&&&!!!!!!!!!!!!!!!! !!!!!!! # ** $$'''++,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " &&&&& &!!!!!!!!!!!!!!!!!!!!!!!!!!! -*** ..''%/+0%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ---**1122333300%%%%%%%%%%%444444%%%%%%%%%%%%%%%55%%%%%%% %%% ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! **667228839999999%%%444444444444%%%:%::%%%%%%555%%%%%% % ",
- " &&&&&&&&&&&&&&&!!!!!&!!!!!! 66666;<=>>???999%%%%44444444444445:::::::::::55555%%%% ",
- " &&&&&&&&&&&&&&&!!&&&&!! @@6666<<ABCC??999%%%%44DD444444455555::::::5555555%%%EEE ",
- " &&&&&&&&&&&&&&&&&&&& F@@@@6<<<<GHIJJJJJJK%LLDLDDDDMMM55555555:5555555NN% EEE ",
- " &&&&&&&&&&&&&&&&&&& FF@@@ O<P<<IIJJJJJJJQQQLLLLDDRR55555555555555555NNN EE ",
- " &&&&&&&&&&&&&&&&&& FSSOOOPP< IIJJTJUVVQQQQQLWWWXX5555555555555555 YYEEEE ",
- " &&&&&&&&&&&&&&&& SSSSOOOPPZ ZZZ []UVVVQQQQQWWWXX^^555555555555555 YEEEE ",
- " _____&&&&&&&&& SSSOOOOOZZZZZ[[[[```VaQQQQWWXXX^^b55555555555555 EE ",
- " ______&& &&&c SSdOOOOOOZZZZZ[[[[``````QQQQXXX^^^^bbe^ff55555555 ",
- " ______ g&c SSddhOOOOOZZZZZ[[[[``````ijjXXXX^^^^^^k^f55555555l ",
- " && _____ __gggg mmddhhhOOnnnooZppppp``````jj ^^^^^^^^kfffqrr555 l ",
- " && ________ sstuvv ddddhhhhnnnnooopppppp```wjjj ^^^^^^ ffxqrr5 y ",
- " ____z{{ s ||dddhhhnnnooooppppp}wwwwwj ^^^^ ffxxxrr yyy ",
- " _~\u007f\u007f \u0080\u0081 ||hhh\u0082nn\u0083\u0083\u0083oooppppp\u0084\u0084}www ^^^^ xx\u0085rr yyy ",
- " \u007f\u007f\u0086\u0086\u0080\u0081\u0081\u0081\u0081\u0087 \u0088\u0089\u0089hh\u008a\u008b\u008c\u0083\u0083\u0083\u008doop\u008ep\u008e\u008e\u0084\u0084\u008f\u008f\u008f\u0090 ^^\u0091 x\u0085rrr yyyy ",
- " \u0086\u0086\u0086\u0080\u0081\u0081\u0081\u0081\u0081\u0092\u0093 \u0094\u0094\u0089\u0095\u008a\u008b\u0083\u0083\u0083\u0083\u008do\u0096\u0096\u008e\u008e\u008e\u008e\u0084\u0084\u0084\u0084\u0090\u0090 ^\u0091\u0091 xxr yyyyy ",
- " \u0080\u0080\u0080\u0080\u0081\u0081\u0081\u0092\u009366 \u0097\u0097\u0095\u008a\u008b\u008b\u0083\u0083\u008d\u008d\u0096\u0098\u0098\u0098\u008e\u008e\u008e\u0084\u0084\u0084\u0090\u0090 \u0091\u0091 \u0099\u009a\u009a\u009a \u009a\u009a\u009a yy ",
- " \u009b\u0080\u0080\u0080\u0080\u0081\u0081\u009c\u0092\u00936\u009c \u009d\u009d\u009e\u009e\u0098\u0098\u0098\u0098\u009f\u009f\u00a0\u00a0\u0090\u0090\u0090 \u0099\u0099\u009a\u009a \u009a\u009a\u0099\u0099\u0099\u0099\u0099\u0099 ",
- " \u009b\u009b\u00a1\u0080\u0080\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c \u00a2\u00a2\u00a2\u009e\u0098\u0098\u0098\u0098\u009f\u009f\u00a0\u00a0\u0090 \u0099\u0099\u0099 \u0099\u0099\u0099\u0099\u0099\u0099\u0099\u0099\u0099\u0099\u0099 ",
- " \u00a1\u00a1\u00a1\u00a1\u00a1\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c \u00a2\u00a2\u009e\u0098\u0098\u0098\u0098\u0098\u00a3\u00a3\u00a3\u00a0 \u0099\u0099\u0099\u0099\u0099\u0099\u0099\u0099\u0099\u0099\u0099\u0099\u0099\u0099\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4 ",
- " \u00a1\u00a1\u00a1\u00a1\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c \u009e\u00a5\u0098\u0098\u0098\u0098\u0098\u00a3\u00a3\u00a3\u00a3 \u0099\u0099\u0099\u0099\u0099\u0099\u0099\u0099 \u0099\u0099\u0099\u00a4\u00a4\u00a4\u00a4\u00a4\u00a4\u00a6 ",
- " \u00a1\u00a1\u00a1\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c \u00a5\u00a5\u00a5\u00a5\u0098\u0098\u00a7\u00a7\u00a3\u00a3\u00a3 \u0099\u0099\u0099\u0099\u0099\u0099\u0099\u00a8 \u0099\u00a4\u00a4\u00a4\u00a4\u00a4 \u00a6\u00a6 ",
- " \u00a1\u00a1\u00a1\u00a1\u00a9\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c \u00a5\u00a5\u00a5\u00a5\u00a5\u00a7\u00a7\u00a7\u00aa\u00a3\u00ab \u00ac\u00ac \u0099 \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad \u00a4 \u00a6\u00a6 ",
- "\u00ae \u00a1\u00a1\u00a1\u00a9\u00a9\u00a9\u009c\u009c\u009c\u009c\u009c\u009c\u009c\u009c \u00a5\u00a5\u00a5\u00a5\u00a7\u00a7\u00a7\u00a7\u00aa\u00ab\u00ab \u00ac\u00ac\u00ac \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad \u00af ",
- "\u00ae \u00a1\u00a1\u00a9\u00a9\u00a9\u00a9\u009c\u009c\u009c\u009c\u009c\u009c\u009c \u00b0\u00b0\u00b0\u00b0\u00a7\u00b1\u00b1\u00b1\u00ab\u00ab\u00ab\u00ac\u00ac\u00ac\u00ac \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad \u00af\u00af \u00ae",
- " \u00b2\u00a9\u00a9\u00b3\u00b3\u009c\u009c\u009c\u009c\u009c\u009c\u009c \u00b0\u00b0\u00b0\u00b0\u00b4\u00b4\u00b1\u00b1\u00ab\u00ab \u00ac\u00ac\u00ac \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad \u00b5\u00b5 ",
- " \u00b2\u00b2\u00b6\u00b3\u00b3\u00b3\u009c\u009c\u009c\u009c\u009c \u00b0\u00b0\u00b0\u00b4\u00b4\u00b7\u00b7\u00ab\u00ab \u00ac\u00ac\u00ac \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad \u00b5 ",
- " \u00b2\u00b6\u00b6\u00b6\u00b6\u00b3\u009c\u009c\u009c \u00b0\u00b0\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7 \u00ac\u00ac\u00ac \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad ",
- " \u00b2\u00b2\u00b6\u00b6\u00b6\u00b6\u009c\u009c\u009c\u009c \u00b0\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7 \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad ",
- " \u00b2\u00b6\u00b6\u00b6\u00b6\u00b6\u00b8\u009c\u009c \u00b7\u00b7\u00b7\u00b7\u00b7\u00b7 \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad ",
- " \u00b2\u00b2\u00b6\u00b6\u00b6\u00b6\u00b8\u00b8 \u00b7\u00b7\u00b7\u00b7\u00b7 \u00ad\u00ad\u00ad\u00ad \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad \u00b9\u00b9 ",
- " \u00b2\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6 \u00ad\u00ad\u00ad\u00ad\u00ad \u00b9\u00b9",
- " \u00b2\u00b6\u00b6\u00b6\u00b6\u00b6 \u00ad\u00ad\u00ad \u00b9\u00b9\u00b9",
- " \u00b2\u00b2\u00b6\u00b6\u00b6 \u00ad\u00ad\u00ad \u00b9\u00b9\u00b9 ",
- " \u00b2\u00b2\u00b6\u00b6\u00b6 \u00b9\u00b9\u00b9 ",
- " \u00b2\u00b2\u00b6\u00b6\u00b6 \u00ba\u00ba ",
- " \u00b2\u00b2\u00b6\u00b2 \u00bb\u00bb \u00ba\u00ba ",
- " \u00b2\u00b2\u00b2\u00b6\u00b6 ",
- " \u00b2\u00b2 ",
- " ",
- " \u00bc\u00bc\u00bc ",
- " \u00bc\u00bc\u00bc\u00bc \u00bc\u00bc\u00bc \u00bc\u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc ",
- " \u00bc\u00bc\u00bc\u00bc\u00bc \u00bc\u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc ",
- " \u00bc\u00bc\u00bc\u00bc \u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u0 [...]
- " \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\ [...]
- " \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc \u00bc\u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u [...]
- " \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc \u00bc\u00bc\u00bc\u00bc\u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\ [...]
- " \u00bc \u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u [...]
- "\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u0 [...]
- "\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u0 [...]
- "\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u00bc\u0 [...]
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/image-filters-multi-blur-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/image-filters-multi-blur-512-512-1.0-grid-reference.json
deleted file mode 100644
index ba44756..0000000
--- a/tests/visual_tests/grids/image-filters-multi-blur-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,289 +0,0 @@
-{
- "keys": [
- "",
- "28",
- "66",
- "119",
- "135",
- "168",
- "151",
- "78",
- "53",
- "58",
- "75",
- "166",
- "51",
- "44",
- "97",
- "99",
- "20",
- "118",
- "42",
- "128",
- "84",
- "31",
- "56",
- "98",
- "41",
- "108",
- "131",
- "29",
- "80",
- "10",
- "72",
- "134",
- "50",
- "149",
- "19",
- "147",
- "162",
- "169",
- "83",
- "161",
- "3",
- "104",
- "65",
- "59",
- "158",
- "86",
- "130",
- "100",
- "76",
- "157",
- "46",
- "173",
- "39",
- "153",
- "77",
- "1",
- "123",
- "88",
- "137",
- "94",
- "74",
- "103",
- "48",
- "138",
- "90",
- "120",
- "163",
- "18",
- "110",
- "25",
- "106",
- "81",
- "129",
- "105",
- "4",
- "122",
- "16",
- "126",
- "144",
- "38",
- "71",
- "141",
- "115",
- "154",
- "139",
- "91",
- "171",
- "45",
- "170",
- "174",
- "156",
- "67",
- "69",
- "124",
- "160",
- "49",
- "117",
- "15",
- "116",
- "52",
- "95",
- "87",
- "36",
- "148",
- "143",
- "61",
- "60",
- "155",
- "14",
- "33",
- "140",
- "145",
- "146",
- "68",
- "32",
- "27",
- "73",
- "23",
- "93",
- "34",
- "112",
- "125",
- "64",
- "35",
- "165",
- "85",
- "127",
- "47",
- "57",
- "164",
- "142",
- "159",
- "2",
- "176",
- "102",
- "54",
- "172",
- "22",
- "113",
- "111",
- "109",
- "9",
- "114",
- "177",
- "30",
- "132",
- "26",
- "5",
- "175",
- "167",
- "121",
- "8",
- "55",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!################ ",
- " !! !!!!!!!!!!####################### $$$$$$$$ %%%%% %%%%%%% ",
- " !!!!!!!!!!!!!!!!########################### $$$$$$$$$$ %%%%%%% %%%% %%%%%%%%%%% ",
- " !!!!!!!!!!!!!!!!!!!!!####################### $$$$$$$$$$$$ %%%%%%%%%%%%% %%%%%%%%%%%%%%%%%% %%%%%%%%% ",
- "%% &&&& !!!!!!!!!!!!!!!!!!!!######################## $$$$$$$$$$$ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %",
- "%%%%&&&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!########################## $$$$'''%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%&&&&&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!!###################(((( $'''''''%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%&&&&&&&&&&&&!&!!!!!!!!!!!!!!!!!!!!!!!!!###############(((((( $''''$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%%&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##########((((((((( $$'''$'''))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%&%&&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##########(((((((((**$$'$$''')))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%&&&&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###########((((((((+*$$$$$'''))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%&&&&&&&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!######## ((((((+*+$$$$'''',-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!###### ++*+**$$'..',,/01%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&& &&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!# ++*++**$233444411%%%%%%%%%%%555555%%%%%%%%%%%%%%%66%%%%%%%%%%%%%%%%% ",
- " &&&&&&& !&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ++++*277833994,,,,,,,%%%555555555555%%%:%::%%%%%%666%%%%%%%%%%%%%% ",
- " & !&&&&&&&&&&&&&&&&&!!!!!&!!&!!!!! ;;;;7777<=>??@@@,,,%%%%55555555555556:::::::::::66666%%%%%%%%%%% ",
- " !&&&&&&&&&&&&&&&&&!!&&&&!&!!!!! A;;;;;777==BCDD@@,,,%%%E55FF555555566666::::::6666666%%%%G%%G%% ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&!!!! ;;A;AAAAH====IJKEEEE,EL%FMFMFFFFNNN66666666:6666666OO%%%G%%GG ",
- " &&&&&&&&&&&&&&&&&&&&&&&&!! ;;P;AAAHH=HH=EK,EEEEEEQQFMMMMFFRR666666666666666O6OO%%%%GGGG ",
- " &&&&&&&&&&&&&&&&&&&&&&& ;;;P;SSSHHHHEEEETUEVWWQQQQQMXXXYY666666666666666OOZZ%GGGGG ",
- " &&&&&&&&&&&&&&&&&&&&& P[[PPPSSSHHHH]]ETTEVWWWQQQQQXXXYY^^666666666666666OOGGZGGGG ",
- " &&&&____&&&&&&&&&&&& P[[[PPSSSSS]]]]]````aaaWbQQQQXXYYY^^c66666666666666ddZZGGGG ",
- " &&&& &&______&&&&&&&&&&e P[[PPfSSSSSS]]]]]````aaaaaaQQQQYYY^^^^ccg^hh6666666dddZGGG ",
- " &&&&&& ____&____&&&&&&e&ijjjj [[[PffkSSSSS]]]]]````aaaaaalmaaYYY^^^^^^n^h66666666dodGG ",
- " &&& &&& ________&&p_qqq&jirjj [s[[ffkkkSStttuu]vvvvvaaaaaammaYY^^^^^^^nhhhwxx66doood ",
- " && &&& __________p&&&yryzryj ssffffkkkkttttuuuvvvvv{aaa{mm{aYYY^^^^^h||h|wxx6xddddd ",
- " &&&&&& ________}~~p\u007fzzzzzzz\u0080 ssssfffkkktttuuuuvvvvv\u0081{{{{{{{m^^^^^^^^h||h|||xxxxdodoo ",
- " &&&& _____p\u0082p\u0082\u0082pzzzzzzzzz sssskkk\u0083tt\u0084\u0084\u0084uuuvvvvv\u0085\u0085\u0081{{{{{{m ^^^^^\u0086\u0086hh||||\u0087xxxxoooooo ",
- " ___p\u0082\u007fp\u0082pz\u0088zzzz\u0080zzz\u00897 s\u008a\u008a\u008b\u008bkk\u008c\u008d\u008e\u0084\u0084\u0084\u008fuuv\u0090v\u0090\u0090\u0085\u0085\u0091\u0091\u0091\u0092{{ ^^\u0086^^^\u0086\u0086h|||xxxxxxoooooo ",
- " }pppp\u007f\u007f\u0088zzzzz\u0093zz\u0089\u0089 s\u008a\u008a\u008a\u008a\u008b\u0094\u008c\u008d\u0084\u0084\u0084\u0084\u008fu\u0095\u0095\u0090\u0090\u0090\u0090\u0085\u0085\u0085\u0085\u0092{\u0092\u0092 ^\u0086^^\u0086^\u0086\u0096|||xxxxxooooooo ",
- " \u0082\u007f\u007f\u007fz\u0088\u0088\u0088zzz\u0093\u00897\u0089\u00897\u0097 \u008a\u008a\u008a\u008a\u0098\u0094\u008c\u008d\u008d\u0084\u0084\u008f\u008f\u0095\u0099\u0099\u0099\u0090\u0090\u0090\u0085\u0085\u0085\u0092\u0092\u0092\u0092\u0092 ^\u0086\u0086\u0086\u0086\u0086\u0086\u0096|\u0096x\u009axxxo\u009a\u009aooooo\u0096\u0096\u0096 ",
- " \u007f\u009b\u009b\u0088\u0088\u0088\u0088zz\u0097\u0093\u00897\u0097\u00897\u0097\u0097\u0097 \u008a\u008a\u008a\u008a\u008d\u008d\u008d\u008d\u008d\u0084\u009c\u009d\u009d\u0099\u0099\u0099\u0099\u009e\u009e\u009f\u009f\u0092\u0092\u0092\u0092\u0092 ^\u0086\u0086\u0086\u0086\u0086\u0096\u0096|\u0096\u009a\u009ax\u009a\u009a\u0096ooooo\u0096\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ",
- " \u009b\u009b\u00a1\u00a1\u009b\u0088\u0088\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u0098\u0098\u0098\u0098\u0098\u008d\u008d\u0084\u00a2\u00a2\u00a2\u009d\u0099\u0099\u0099\u0099\u009e\u009e\u009f\u009f\u0092\u00a3\u0092\u0092 \u0086\u0086 \u0096\u009a|\u0096\u0096\u009a\u0096\u0096\u0096\u009a\u0096oo\u0096\u0096\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a4\u00a4\u00a4\u00a4 ",
- " \u009b\u009b\u009b\u009b\u009b\u009b\u009b\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00a2\u009c\u009c\u00a2\u009d\u0099\u0099\u0099\u0099\u0099\u00a3\u00a3\u00a3\u009f\u00a3\u00a3\u0092 \u0096\u0096\u009a\u0096\u0096\u009a\u009a\u0096\u0096\u009a\u0096\u00a5\u0096\u0096\u0096\u0096\u0096\u00a0\u00a0\u00a0\u00a0\u00a0\u00a4\u00a4\u00a4\u00a4\u00a4 ",
- " \u009b\u009b\u009b\u009b\u009b\u009b\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00a2\u00a2\u00a2\u00a6\u0099\u0099\u0099\u0099\u0099\u00a3\u00a3\u00a3\u00a7\u00a3\u00a3\u00a8\u00a8\u00a8 \u0096\u0096\u0096\u0096\u0096\u009a\u009a\u0096\u00a5\u00a5\u00a5\u0096\u00a5\u00a5\u00a0\u0096\u00a0\u00a0\u00a0\u00a0\u00a4\u00a0\u00a4\u00a4\u00a4\u00a4 ",
- "\u00a9 \u009b\u009b\u009b\u009b\u009b\u009b\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00a2\u00a2\u00a2\u00a6\u00a6\u00a6\u0099\u0099\u00a7\u00a7\u00a3\u00a3\u00a3\u00a3\u00a3\u00a8\u00a8\u00a8 \u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u00a5\u0096\u00a5\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a4\u00a4\u00a4\u00a4\u00aa\u00aa\u00aa \u00a9",
- "\u00a9\u00a9\u00a9 \u009b\u009b\u009b\u009b\u009b\u009b\u00ab\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00a6\u00ac\u00ac\u00a6\u00a6\u00a6\u00a6\u00a7\u00a7\u00a7\u00ad\u00a3\u00ae\u00a3\u00a3\u00a8\u00a8\u00a8\u00a8 \u0096\u0096\u0096\u0096\u0096\u0096\u00a5\u00a5\u00a5\u0096\u0096\u00af\u00af\u00a0\u00a0\u00a0\u00a0\u00a0\u00a4\u00a4\u00a4\u00aa\u00aa\u00aa\u00a4\u00aa\u00a9 ",
- " \u00a9\u00a9 \u009b\u009b\u009b\u009b\u009b\u009b\u00ab\u00ab\u00ab\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00ac\u00ac\u00ac\u00a6\u00a6\u00a6\u00a7\u00a7\u00a7\u00a7\u00ad\u00ae\u00ae\u00a3\u00a3\u00a8\u00a8\u00a8\u00a8 \u0096\u0096\u0096\u0096\u0096\u00a5\u00a5\u00af\u00af\u00af\u00af\u00a0\u00a0\u00af\u00a0\u00a0\u00a0\u00a4\u00a4\u00aa\u00aa\u00aa\u00b0\u00a9\u00aa ",
- " \u00a9 \u009b\u009b\u009b\u009b\u009b\u00ab\u00ab\u00ab\u00ab\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00a7\u00b1\u00b1\u00b1\u00ae\u00ae\u00b1\u00a3\u00a8\u00a8\u00a8\u00a8\u00a8 \u00af\u00af\u00af\u00af\u0096\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00a0\u00a0\u00af\u00b0\u00aa\u00aa \u00aa\u00aa\u00aa\u00a9",
- " \u00a9\u00a9 \u009b\u009b\u009b\u00b2\u00ab\u00ab\u00b3\u00b3\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00b4\u00b4\u00b1\u00b1\u00ae\u00b1\u00b1\u00ae\u00a8\u00a8\u00a8\u00a8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b0\u00b0\u00aa\u00aa\u00aa\u00aa\u00a9\u00a9",
- "\u00a9\u00a9 \u009b\u009b\u00b2\u00b2\u00b5\u00b3\u00b3\u00b3\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00ac\u00b6\u00ac\u00ac\u00ac\u00b4\u00b4\u00b6\u00b6\u00ae\u00b1\u00ae\u00ae\u00a8\u00a8\u00a8\u00a8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b0\u00b0 \u00aa\u00aa\u00b0\u00a9\u00a9",
- " \u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b5\u00b3\u0097\u0097\u00b3\u0097\u0097\u0097\u0097 \u00ac\u00b6\u00b6\u00ac\u00b6\u00b6\u00b6\u00b6\u00b6\u00b1\u00b1\u00b6\u00ae\u00a8\u00a8\u00a8\u00a8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b0 \u00b0\u00b0\u00b0 ",
- " \u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b5\u0097\u0097\u0097\u00b7\u0097\u0097\u0097 \u00ac\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b1\u00b6\u00b6\u00a8\u00a8\u00a8\u00a8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b0\u00b0\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b5\u00b5\u00b7\u0097\u00b7\u00b7\u0097 \u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6 \u00a8\u00a8\u00a8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af \u00b8\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b5\u00b7\u00b7\u00b7\u00b7\u0097 \u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af \u00b8\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b5\u00b5\u00b7\u00b7\u00b7\u00b7 \u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af \u00b8\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b7\u00b7\u00b7\u00b7\u00b7 \u00b6\u00b6\u00b6\u00b6\u00b6\u00b6 \u00af\u00af\u00af\u00af\u00af\u00af \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af \u00b8\u00b8\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b9\u00b9\u00b9\u00b9 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af \u00b8\u00b8\u00b8\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00ba\u00ba\u00ba\u00ba \u00b9\u00b9 \u00b9\u00b9 \u00af\u00af\u00af\u00af\u00af \u00b8\u00b8\u00b8\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00ba\u00b5\u00b5\u00ba\u00ba \u00b9 \u00b9 \u00af\u00af\u00af\u00af\u00af \u00b8\u00b8\u00b8\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b2\u00b5\u00ba\u00ba\u00b2\u00ba\u00ba\u00ba \u00b9\u00b9 \u00b9\u00b9 \u00b8\u00b8\u00b8\u00b8\u00b8 ",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00ba\u00ba\u00b5\u00ba\u00ba \u00b9\u00b9\u00b9\u00b9\u00b9 ",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00ba\u00ba\u00ba\u00ba\u00ba \u00b9\u00b9 ",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00bb\u00bb\u00bb \u00bb\u00bb\u00bb\u00bb\u00bb \u00bb\u00bb\u00bb \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb ",
- " \u00bb\u00b2\u00b2\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb \u00bb \u00bb\u00bb \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb ",
- " \u00bb\u00bb\u00bb\u00bb \u00bb \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u [...]
- " \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00 [...]
- " \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb \u00bb\u00bb\u00bb \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb [...]
- " \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00b [...]
- " \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb [...]
- "\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u0 [...]
- "\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u0 [...]
- "\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u0 [...]
- "\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u0 [...]
- "\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u0 [...]
- "\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u0 [...]
- "\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u0 [...]
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/image-filters-multi-blur-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/image-filters-multi-blur-512-512-2.0-grid-reference.json
deleted file mode 100644
index c3c52be..0000000
--- a/tests/visual_tests/grids/image-filters-multi-blur-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,288 +0,0 @@
-{
- "keys": [
- "",
- "66",
- "28",
- "119",
- "135",
- "168",
- "151",
- "78",
- "53",
- "166",
- "58",
- "51",
- "131",
- "44",
- "97",
- "99",
- "20",
- "75",
- "118",
- "42",
- "128",
- "84",
- "31",
- "56",
- "98",
- "41",
- "108",
- "100",
- "29",
- "80",
- "10",
- "72",
- "134",
- "161",
- "19",
- "147",
- "173",
- "169",
- "83",
- "137",
- "50",
- "3",
- "104",
- "65",
- "162",
- "59",
- "158",
- "86",
- "130",
- "150",
- "76",
- "157",
- "163",
- "46",
- "154",
- "39",
- "153",
- "77",
- "1",
- "123",
- "88",
- "94",
- "74",
- "103",
- "129",
- "141",
- "48",
- "138",
- "90",
- "120",
- "110",
- "174",
- "25",
- "106",
- "18",
- "170",
- "105",
- "4",
- "122",
- "16",
- "38",
- "143",
- "115",
- "139",
- "91",
- "171",
- "126",
- "71",
- "45",
- "156",
- "67",
- "69",
- "160",
- "148",
- "49",
- "144",
- "117",
- "15",
- "116",
- "52",
- "146",
- "87",
- "124",
- "36",
- "23",
- "61",
- "60",
- "155",
- "14",
- "33",
- "140",
- "145",
- "127",
- "125",
- "68",
- "32",
- "27",
- "95",
- "93",
- "34",
- "73",
- "112",
- "159",
- "142",
- "64",
- "35",
- "165",
- "85",
- "47",
- "57",
- "164",
- "172",
- "54",
- "176",
- "2",
- "177",
- "102",
- "113",
- "22",
- "111",
- "109",
- "9",
- "114",
- "132",
- "30",
- "175",
- "26",
- "5",
- "167",
- "121",
- "8",
- "55",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!! ",
- " ###########!!!!!!!!!!!!!!!!!!!!!! $$ %%%% %%%% ",
- " ##############!!!!!!!!!!!!!!!!!!!!!!!!!! $$$$$$$$$$$$%%%%%%%%% %%%%%%%%%% ",
- " ################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$$$$$$$$$$$%%%%%%%%%%%%%%% %%%%%%%%%%%%%% %%%%%%%% ",
- " #################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- "%%%% &&&&&&&&&&&##################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%&&&&&&&&&&&&&&&&######################!!!!!!!!!!!!!!!!!!!!!!!$$$$$'''$$''%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%&&&&&&&&&&&&&&&&&####################!!!!!!!!!!!!!!!!!!!!((((!$$$$''$$'$'''%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&&&&&&&&&&&&&&&&&&#################!!!!!!!!!!!!!!!!!!!!!!((((($$$'''''''''''%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&&&&&&&&&&&&&&&&&&###################!!!!!!!!!!!!!!!!!!!(((((($$'''''''''''''%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&&&&&&&&&&&&&#&#########################!!!!!!!!!!!!!!!(((((($$'''''''$$$$%%'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%%&&&&&&&&&&######################!!#####!!!!!!!!!!(((((((($$$'''''$'''))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&%&&&&&&&&&&&#######################!###!!!!!!!!!!(((((((((($$''''$$''')))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&&&&&&&&&&&&&#################&&&&#####&&!!!!!!!!!(((((((((($$'''$$$''*))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&&&&&&&&&&&&&&&&##############&&&&&######&&!!!!!!!(((((((((($+'''$$''***,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&&&&&&&&&&&&&&&&&#################&#######&!!!!!!!!(((((((---++'''..'**/01%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&&&&&&&&&&&&&&&&############################!!!!!!!!(((((---2-++'344555511%%%%%%%%%%%666666%%%%%%%%%%%%%%%77%%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&&&&&&&&&&&########################&#!!!!!!!! ((-----+-88944::5*******%%%666666666666%%%;%;;%%%%%%777%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#####&##&&##!!!!! ---<<--8888=>?@@AAA***%%%%66666666666667;;;;;;;;;;;77777%%%%%%%%%%%%%%% ",
- " &&&&&&&&&& #&&&&&&&&&&&&&&&&&&&&&##&&&&#&&&&##### ---<<3-B888>>*CDDAAE*E%%%F66FF666666677777;;;;;;7777777%%%%G%%%%%%%%%% ",
- " &&&&&& #&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#### ---<H-IIIIB>>>>JKLMMMMEMN%FOFOFFFFPPP77777777;7777777QQ%%%G%%%%%%%%% ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&##### -HHHH-IIIRR>**>*LEMMMMMMSSFOOOOFFTT777777777777777U7UQ%%%%G%%%%%%%% ",
- " &&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#### <HHHHHH<BVVVBWM**EEE*XMYZZSSSSSO[[[]]777777777777777UU^^%GGG%%%%GG ",
- " &&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&### HHHHHH<<<VVVBBMMM_EE**YZZZSSSSS[[[]]``777777777777777UUGG%%%%%%GG ",
- " &&&&&&&&&& &&&&&&&aaaa&&&&&&&&&&&&&&&&b HHHcccc<<VVVVV_____ddddeeeZfSSSS[[]]]``g77777777777777UUUUU%^GGGG ",
- " &&& &&&& &&&&&&aaaaaa&&&&&&&&&&&&&bbb Hcccc<<hVVVVVV_____ddddeeeeeiSSSS]]]````ggj`kk7777777QQQQQU^^GGGG ",
- " && &&&& &&&&&&a&aaaa&&&&&&lmmmmmmmbb Hccccc<hhnVVVVV_____ddddeeeeeeopiii]]``````q`k77777777UQQQQU^GGGG ",
- " &&&& & &&& &&&&&&&&aaa&&&arrrmmmmmmmmm HcccsHHhhnnnVVtttWW_uuuuueeeeeeppiie```````qkkkvww77wwwxxxxUGGG ",
- " &&& &&& aa&&&&&&aaaaaa&mmmmyzmmmmmmm cccsshhhhnnnnttttWWWuuuuuieeeippiiie]`````{wwk{vww7wwwwxxxUxx ",
- " &&& &&& aaaaa&&&&aaa|}}mmmmmmmmmmmm~\u007f ccssscchhhnnntttWWWWuuuuu\u0080iiiiiiiiie]````{{wwk{{{wwwwwxxxxUxx ",
- " &&&& &&&& aaaaaa&&&&&\u0081\u0082\u0082mmmmmmmmmmmmm\u007f\u007f ccsssccnnn\u0083tt\u0084\u0084\u0084WWWuuuuu\u0085\u0085\u0080i\u0086iiiiiie]]``g{{www{{\u0087wwwwwxxUUxxx ",
- " &&&& &&& aaaa\u0081\u0081\u0082\u0088\u0088\u0088m\u0082mm\u0089mmmm~mmmmm\u007f\u007f8\u008a ccssss\u008b\u008bnn\u008c\u008d\u008e\u0084\u0084\u0084\u008fWWu\u0090u\u0090\u0090\u0085\u0085\u0091\u0091\u0091\u0086iiiii]]]``k{{www{wwwwwwxwxUUx\u0092\u0092\u0092\u0092\u0092\u0092\u0092\u0092 ",
- " &&&&&& aaaa\u0081\u0081\u0088\u0088\u0093mm\u0088\u0088\u0089mmmmm\u0094mmmm\u007f\u007f8\u008a\u008a\u008acssss\u008ds\u008b\u0095\u008c\u008d\u0084\u0084\u0084\u0084\u008fW\u0096\u0096\u0090\u0090\u0090\u0090\u0085\u0085\u0085\u0085\u0086iiiii\u0086\u0097````\u0097{{www{wwwwwwwwxxx\u0092\u0092\u0092\u0092\u0092\u0092\u0092\u0092\u0092\u0092\u0092 ",
- " && aa\u0081\u0081\u0088\u0093\u0093mmmm\u0089\u0089\u0089mmm\u0094\u007f8mm\u007f\u007f8\u008a\u008a\u008acssss\u008d\u008d\u0098\u0095\u008cWW\u0084\u0084\u008f\u008f\u0096\u0099\u0099\u0099\u0090\u0090\u0090\u0085\u0085\u0085\u0086\u0086iiii\u0086`\u0097`````{{{w\u009aw\u009bwwww\u009b\u009bw\u009c\u009c\u009c\u009c\u0092\u0092\u0092\u0092\u0092\u009d\u009d\u009d\u009d\u009d\u009d\u009d ",
- " a\u0081\u0081\u0093\u0093\u0093mm\u0089\u0089\u0089\u0089mm\u008a\u0094\u007f8\u008am\u007f\u007f8\u008a\u008a\u008a\u008asssss\u008d\u008d\u008dssW\u008d\u008d\u009e\u009f\u009f\u0099\u0099\u0099\u0099\u00a0\u00a0\u00a1\u00a1\u0086\u0086iiii\u0086\u0086`\u0097````\u0097\u0097{{ww\u009a\u009b\u009bw\u009b\u009b\u009awx\u009c\u009c\u009c\u009c\u009c\u0092\u0092\u0092\u009d\u009d\u009d\u009d\u009d\u009d\u009d\u009d\u009d ",
- " \u00a2\u0081\u0081\u0081m\u00a2\u00a2\u0093\u0089\u0089\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u007f\u007f8\u008a\u008a\u008a\u008a\u008assss\u008d\u008d\u008d\u008ds\u008d\u008d\u00a3\u00a3\u00a3\u009f\u0099\u0099\u0099\u0099\u00a0\u00a0\u00a1\u00a1\u0086ii\u00a4\u0086\u0086\u0086 \u0097\u0097\u0097\u0097\u0097\u0097\u0097{{{ww\u009a\u009aw\u009a\u009a\u009a\u009c\u009ax\u009c\u009c\u009a\u009c\u009c\u0092\u009d\u009d\u009d\u009d\u009d\u009d\u0 [...]
- "\u00a6\u00a6\u00a6 \u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008assss\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u00a3\u009f\u0099\u0099\u0099\u0099\u0099\u00a4\u00a4\u00a4\u00a1\u00a7\u00a7\u00a0\u00a4\u0086\u0086\u0086 \u0097\u0097\u0097\u0097\u0097\u0097\u0097{{{w\u009a\u009aww\u009a\u009a\u009c\u009ax\u009a\u009a\u009a\u009a\u009a\u0092\u00 [...]
- "\u00a6\u00a6\u00a6\u00a6 \u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a ssss\u008d\u008d\u008d\u008d\u008d\u008d\u00a7\u00a8\u0099\u0099\u0099\u0099\u0099\u00a4\u00a4\u00a4\u00a9\u00a9\u00a7\u00a4\u00a4\u00a4\u0086\u00aa\u00aa \u0097\u0097\u0097\u0097\u0097\u0097\u009b{{{{{\u009a\u009b\u009c\u009c\u009cxx\u0092\u0092\u0092\u009c\u009a\u0092\u00 [...]
- "\u00a6\u00a6\u00a6\u00a6\u00a6 \u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u0098\u0098\u0098\u008c\u00ab\u0084\u0084\u00a7\u00a7\u00a8\u00a8\u00a8\u0099\u0099\u00a7\u00a7\u00a4\u00a4\u00a4\u00a9\u00a7\u00a4\u00a4\u00a4\u00aa\u00aa\u00aa \u009a\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009c\u009c\u009a\u009a\u009a\u009c\u0092\u0092\u [...]
- " \u00a6\u00a6\u00a6 \u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u00ac\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u00ab\u00ab\u00ab\u00a7\u00a7\u00a8\u00a8\u00a8\u00a8\u00a7\u00a7\u00a7\u00ad\u00a4\u00ae\u00a9\u00a9\u00a4\u00a4\u00a4\u00aa\u00aa\u00aa \u009a\u009a\u009a\u009b\u009b\u009b\u009b\u009b\u009c\u009c\u009c\u009c\u009a\u0092\u0092\u00af\u00af\u009c\u009c\u009d\u009d\u009d\ [...]
- " \u00a6\u00a6 \u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u00ac\u00ac\u00ac\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u00ab\u00ab\u00ab\u00ab\u00a7\u00a9\u00a8\u00a8\u00a8\u00a7\u00a7\u00a7\u00a7\u00ad\u00ae\u00ae\u00a9\u00a9\u00aa\u00a4\u00a4\u00aa\u00aa\u00aa \u009a\u009a\u009a\u009a\u009a\u009a\u009a\u009c\u009c\u009c\u009c\u009a\u00af\u00af\u00af\u00af\u009c\u0092\u00af\u009d\u009d\u00a5 [...]
- " \u00a6 \u0093\u0093\u0093\u0093\u0093\u00b1\u00b1\u0093\u00ac\u00ac\u00ac\u00ac\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u00ab\u00ab\u00ab\u00ab\u00a7\u00ab\u00ab\u00ab\u00ab\u00a7\u00a9\u00a9\u00a9\u00ae\u00ae\u00a9\u00a9\u00aa\u00aa\u00a4\u00ae\u00aa\u00aa\u00aa \u009a\u009a\u009a\u009a\u009a\u009a\u009a\u009c\u009c\u009c\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u0092\u009d\u009d\u00a5\u00a5\u009d\u [...]
- " \u00a6 \u0093\u0093\u0093\u0093\u00b1\u00b1\u00b2\u00ac\u00ac\u00b1\u00b1\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u00ab\u00ab\u00b3\u00a7\u00a9\u00ab\u00ab\u00ab\u00b4\u00b4\u00a9\u00a9\u00ae\u00a9\u00a9\u00a9\u00aa\u00aa\u00ae\u00ae\u00aa\u00aa\u00aa \u009a\u009a\u009a\u009a\u009a\u009c\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u0092\u009d\u00a5\u00a5\u009d\u009d\u009d\u00a5\u00a5\u0 [...]
- " \u00a6\u00a6 \u0093\u0093\u0093\u0093\u00b1\u00b1\u00b2\u00b2\u00b5\u00b1\u00b1\u00b1\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u00ab\u00b3\u00b3\u00b3\u00a7\u00ab\u00ab\u00ab\u00b4\u00b4\u00b3\u00b3\u00ae\u00a9\u00a9\u00a9\u00aa\u00ad\u00ae\u00aa\u00aa\u00aa\u00aa \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u0092\u00a5\u00a5\u009d\u009d\u00a5\u00a5\u00 [...]
- "\u00a6 \u00a6\u00a6 \u0093\u0093\u0093\u00b1\u00b1\u00b2\u00b5\u00b5\u00b5\u00b5\u00b1\u008a\u008a\u00b6\u00b6\u00b6\u008a\u008a\u008a\u008a\u008a \u00ab\u00b3\u00b3\u00b3\u00a7\u00a9\u00ab\u00b3\u00b3\u00b3\u00b3\u00b3\u00a9\u00a9\u00a9\u00a9\u00a9\u00ae\u00aa\u00aa\u00aa\u00aa \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b0\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u0 [...]
- "\u00a6 \u00a6 \u00b2\u00b2\u0093\u00b1\u00b1\u00b2\u00b5\u00b5\u00b5\u00b5\u008a\u008a\u008a\u00b6\u00b6\u00b6\u008a\u008a\u008a\u008a \u00b3\u00b3\u00b3\u00b3\u00a7\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00a9\u00a9\u00a9\u00a9\u00b3\u00ae\u00aa\u00aa\u00aa\u00aa \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b0\u00b0\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u0093\u00b1\u00b5\u00b5\u00b5\u00b5\u00b5\u00b6\u008a\u00b1\u00b1\u00b6\u00b6\u00b6\u008a\u008a\u008a \u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00a9\u00a9\u00a9\u00a9\u00b3\u00b3\u00aa\u00aa\u00aa\u00aa\u00aa \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b0\u00b0\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b6\u00b2\u00b5\u00b5\u00b5\u00b5\u00b6\u00b1\u00b1\u00b1\u00b6\u00b6\u00b6\u008a\u008a \u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00a9\u00a9\u00a9\u00a9\u00a9\u00a9\u00b3\u00b3\u00b3\u00aa\u00aa\u00aa\u00aa \u00b8\u00b8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b5\u00b5\u00b1\u00b1\u00b1\u00b6\u00b6\u00b6\u008a \u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00aa\u00aa\u00aa\u00aa \u00b8\u00b8\u00b8\u00b8\u00b8\u00b8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7 \u00b7\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b1\u00b1\u00b1\u00b1\u00b6\u00b6\u00b6\u00b6 \u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3 \u00b8\u00b8 \u00b8\u00b8\u00b8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7 \u00b7 ",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b6\u00b6\u008a\u00b6\u00b6\u00b6\u00b6 \u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3 \u00b8 \u00b8\u00b8\u00b8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7 \u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b9 \u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3 \u00b8 \u00b8\u00b8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b2\u00b2\u00b6\u00b6\u00b6\u00b6\u00b9\u00b9 \u00b3\u00b3\u00b3 \u00b8 \u00b8\u00b8 \u00af\u00af\u00af\u00af \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00b9\u00b2\u00b2\u00b9\u00b2\u00b9\u00b9\u00b9\u00b9 \u00b8 \u00b8 \u00ba\u00ba \u00ba\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00b2\u00b2\u00b2\u00b2\u00b9\u00b9\u00b9\u00b9 \u00ba \u00ba\u00ba\u00ba\u00ba\u00ba\u00b8\u00b8\u00ba\u00ba\u00ba\u00ba \u00ba\u00b8\u00b8\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b9\u00b9\u00b9\u00b2\u00b2\u00b2\u00b2\u00b9\u00b9\u00b9\u00b9 \u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b8\u00b8\u00b8\u00ba\u00ba\u00ba\u00b8\u00b8\u00b8\u00b8\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00af\u00af\u00af\u00af\ [...]
- " \u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b2\u00b2\u00b2\u00b2\u00b2\u00b9\u00b9\u00b9\u00b2\u00b2\u00b2\u00b2\u00b9\u00b9\u00b9\u00ba \u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b8\u00b8\u00b8\u00b8\u00b8\u00b8\u00b8\u00b8\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u [...]
- " \u00ba \u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b2\u00b2\u00b2\u00b2\u00b2\u00b9\u00b9\u00b2\u00b2\u00b2\u00b2\u00b9\u00b9\u00ba\u00ba \u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b8\u00b8\u00b8\u00b8\u00b8\u00b8\u [...]
- " \u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00ba\u00b9\u00b9\u00b9\u00b9\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b [...]
- " \u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b2\u00b2\u00b2\u00ba\u00b2\u00b2\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/image-filters-multi-blur-inflate-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/image-filters-multi-blur-inflate-512-512-1.0-grid-reference.json
deleted file mode 100644
index ba44756..0000000
--- a/tests/visual_tests/grids/image-filters-multi-blur-inflate-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,289 +0,0 @@
-{
- "keys": [
- "",
- "28",
- "66",
- "119",
- "135",
- "168",
- "151",
- "78",
- "53",
- "58",
- "75",
- "166",
- "51",
- "44",
- "97",
- "99",
- "20",
- "118",
- "42",
- "128",
- "84",
- "31",
- "56",
- "98",
- "41",
- "108",
- "131",
- "29",
- "80",
- "10",
- "72",
- "134",
- "50",
- "149",
- "19",
- "147",
- "162",
- "169",
- "83",
- "161",
- "3",
- "104",
- "65",
- "59",
- "158",
- "86",
- "130",
- "100",
- "76",
- "157",
- "46",
- "173",
- "39",
- "153",
- "77",
- "1",
- "123",
- "88",
- "137",
- "94",
- "74",
- "103",
- "48",
- "138",
- "90",
- "120",
- "163",
- "18",
- "110",
- "25",
- "106",
- "81",
- "129",
- "105",
- "4",
- "122",
- "16",
- "126",
- "144",
- "38",
- "71",
- "141",
- "115",
- "154",
- "139",
- "91",
- "171",
- "45",
- "170",
- "174",
- "156",
- "67",
- "69",
- "124",
- "160",
- "49",
- "117",
- "15",
- "116",
- "52",
- "95",
- "87",
- "36",
- "148",
- "143",
- "61",
- "60",
- "155",
- "14",
- "33",
- "140",
- "145",
- "146",
- "68",
- "32",
- "27",
- "73",
- "23",
- "93",
- "34",
- "112",
- "125",
- "64",
- "35",
- "165",
- "85",
- "127",
- "47",
- "57",
- "164",
- "142",
- "159",
- "2",
- "176",
- "102",
- "54",
- "172",
- "22",
- "113",
- "111",
- "109",
- "9",
- "114",
- "177",
- "30",
- "132",
- "26",
- "5",
- "175",
- "167",
- "121",
- "8",
- "55",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!################ ",
- " !! !!!!!!!!!!####################### $$$$$$$$ %%%%% %%%%%%% ",
- " !!!!!!!!!!!!!!!!########################### $$$$$$$$$$ %%%%%%% %%%% %%%%%%%%%%% ",
- " !!!!!!!!!!!!!!!!!!!!!####################### $$$$$$$$$$$$ %%%%%%%%%%%%% %%%%%%%%%%%%%%%%%% %%%%%%%%% ",
- "%% &&&& !!!!!!!!!!!!!!!!!!!!######################## $$$$$$$$$$$ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %",
- "%%%%&&&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!########################## $$$$'''%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%&&&&&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!!###################(((( $'''''''%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%&&&&&&&&&&&&!&!!!!!!!!!!!!!!!!!!!!!!!!!###############(((((( $''''$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%%&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##########((((((((( $$'''$'''))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%&%&&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##########(((((((((**$$'$$''')))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%&&&&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###########((((((((+*$$$$$'''))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%&&&&&&&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!######## ((((((+*+$$$$'''',-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&&&&&&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!###### ++*+**$$'..',,/01%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&& &&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!# ++*++**$233444411%%%%%%%%%%%555555%%%%%%%%%%%%%%%66%%%%%%%%%%%%%%%%% ",
- " &&&&&&& !&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ++++*277833994,,,,,,,%%%555555555555%%%:%::%%%%%%666%%%%%%%%%%%%%% ",
- " & !&&&&&&&&&&&&&&&&&!!!!!&!!&!!!!! ;;;;7777<=>??@@@,,,%%%%55555555555556:::::::::::66666%%%%%%%%%%% ",
- " !&&&&&&&&&&&&&&&&&!!&&&&!&!!!!! A;;;;;777==BCDD@@,,,%%%E55FF555555566666::::::6666666%%%%G%%G%% ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&!!!! ;;A;AAAAH====IJKEEEE,EL%FMFMFFFFNNN66666666:6666666OO%%%G%%GG ",
- " &&&&&&&&&&&&&&&&&&&&&&&&!! ;;P;AAAHH=HH=EK,EEEEEEQQFMMMMFFRR666666666666666O6OO%%%%GGGG ",
- " &&&&&&&&&&&&&&&&&&&&&&& ;;;P;SSSHHHHEEEETUEVWWQQQQQMXXXYY666666666666666OOZZ%GGGGG ",
- " &&&&&&&&&&&&&&&&&&&&& P[[PPPSSSHHHH]]ETTEVWWWQQQQQXXXYY^^666666666666666OOGGZGGGG ",
- " &&&&____&&&&&&&&&&&& P[[[PPSSSSS]]]]]````aaaWbQQQQXXYYY^^c66666666666666ddZZGGGG ",
- " &&&& &&______&&&&&&&&&&e P[[PPfSSSSSS]]]]]````aaaaaaQQQQYYY^^^^ccg^hh6666666dddZGGG ",
- " &&&&&& ____&____&&&&&&e&ijjjj [[[PffkSSSSS]]]]]````aaaaaalmaaYYY^^^^^^n^h66666666dodGG ",
- " &&& &&& ________&&p_qqq&jirjj [s[[ffkkkSStttuu]vvvvvaaaaaammaYY^^^^^^^nhhhwxx66doood ",
- " && &&& __________p&&&yryzryj ssffffkkkkttttuuuvvvvv{aaa{mm{aYYY^^^^^h||h|wxx6xddddd ",
- " &&&&&& ________}~~p\u007fzzzzzzz\u0080 ssssfffkkktttuuuuvvvvv\u0081{{{{{{{m^^^^^^^^h||h|||xxxxdodoo ",
- " &&&& _____p\u0082p\u0082\u0082pzzzzzzzzz sssskkk\u0083tt\u0084\u0084\u0084uuuvvvvv\u0085\u0085\u0081{{{{{{m ^^^^^\u0086\u0086hh||||\u0087xxxxoooooo ",
- " ___p\u0082\u007fp\u0082pz\u0088zzzz\u0080zzz\u00897 s\u008a\u008a\u008b\u008bkk\u008c\u008d\u008e\u0084\u0084\u0084\u008fuuv\u0090v\u0090\u0090\u0085\u0085\u0091\u0091\u0091\u0092{{ ^^\u0086^^^\u0086\u0086h|||xxxxxxoooooo ",
- " }pppp\u007f\u007f\u0088zzzzz\u0093zz\u0089\u0089 s\u008a\u008a\u008a\u008a\u008b\u0094\u008c\u008d\u0084\u0084\u0084\u0084\u008fu\u0095\u0095\u0090\u0090\u0090\u0090\u0085\u0085\u0085\u0085\u0092{\u0092\u0092 ^\u0086^^\u0086^\u0086\u0096|||xxxxxooooooo ",
- " \u0082\u007f\u007f\u007fz\u0088\u0088\u0088zzz\u0093\u00897\u0089\u00897\u0097 \u008a\u008a\u008a\u008a\u0098\u0094\u008c\u008d\u008d\u0084\u0084\u008f\u008f\u0095\u0099\u0099\u0099\u0090\u0090\u0090\u0085\u0085\u0085\u0092\u0092\u0092\u0092\u0092 ^\u0086\u0086\u0086\u0086\u0086\u0086\u0096|\u0096x\u009axxxo\u009a\u009aooooo\u0096\u0096\u0096 ",
- " \u007f\u009b\u009b\u0088\u0088\u0088\u0088zz\u0097\u0093\u00897\u0097\u00897\u0097\u0097\u0097 \u008a\u008a\u008a\u008a\u008d\u008d\u008d\u008d\u008d\u0084\u009c\u009d\u009d\u0099\u0099\u0099\u0099\u009e\u009e\u009f\u009f\u0092\u0092\u0092\u0092\u0092 ^\u0086\u0086\u0086\u0086\u0086\u0096\u0096|\u0096\u009a\u009ax\u009a\u009a\u0096ooooo\u0096\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ",
- " \u009b\u009b\u00a1\u00a1\u009b\u0088\u0088\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u0098\u0098\u0098\u0098\u0098\u008d\u008d\u0084\u00a2\u00a2\u00a2\u009d\u0099\u0099\u0099\u0099\u009e\u009e\u009f\u009f\u0092\u00a3\u0092\u0092 \u0086\u0086 \u0096\u009a|\u0096\u0096\u009a\u0096\u0096\u0096\u009a\u0096oo\u0096\u0096\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a4\u00a4\u00a4\u00a4 ",
- " \u009b\u009b\u009b\u009b\u009b\u009b\u009b\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00a2\u009c\u009c\u00a2\u009d\u0099\u0099\u0099\u0099\u0099\u00a3\u00a3\u00a3\u009f\u00a3\u00a3\u0092 \u0096\u0096\u009a\u0096\u0096\u009a\u009a\u0096\u0096\u009a\u0096\u00a5\u0096\u0096\u0096\u0096\u0096\u00a0\u00a0\u00a0\u00a0\u00a0\u00a4\u00a4\u00a4\u00a4\u00a4 ",
- " \u009b\u009b\u009b\u009b\u009b\u009b\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00a2\u00a2\u00a2\u00a6\u0099\u0099\u0099\u0099\u0099\u00a3\u00a3\u00a3\u00a7\u00a3\u00a3\u00a8\u00a8\u00a8 \u0096\u0096\u0096\u0096\u0096\u009a\u009a\u0096\u00a5\u00a5\u00a5\u0096\u00a5\u00a5\u00a0\u0096\u00a0\u00a0\u00a0\u00a0\u00a4\u00a0\u00a4\u00a4\u00a4\u00a4 ",
- "\u00a9 \u009b\u009b\u009b\u009b\u009b\u009b\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00a2\u00a2\u00a2\u00a6\u00a6\u00a6\u0099\u0099\u00a7\u00a7\u00a3\u00a3\u00a3\u00a3\u00a3\u00a8\u00a8\u00a8 \u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u00a5\u0096\u00a5\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a4\u00a4\u00a4\u00a4\u00aa\u00aa\u00aa \u00a9",
- "\u00a9\u00a9\u00a9 \u009b\u009b\u009b\u009b\u009b\u009b\u00ab\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00a6\u00ac\u00ac\u00a6\u00a6\u00a6\u00a6\u00a7\u00a7\u00a7\u00ad\u00a3\u00ae\u00a3\u00a3\u00a8\u00a8\u00a8\u00a8 \u0096\u0096\u0096\u0096\u0096\u0096\u00a5\u00a5\u00a5\u0096\u0096\u00af\u00af\u00a0\u00a0\u00a0\u00a0\u00a0\u00a4\u00a4\u00a4\u00aa\u00aa\u00aa\u00a4\u00aa\u00a9 ",
- " \u00a9\u00a9 \u009b\u009b\u009b\u009b\u009b\u009b\u00ab\u00ab\u00ab\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00ac\u00ac\u00ac\u00a6\u00a6\u00a6\u00a7\u00a7\u00a7\u00a7\u00ad\u00ae\u00ae\u00a3\u00a3\u00a8\u00a8\u00a8\u00a8 \u0096\u0096\u0096\u0096\u0096\u00a5\u00a5\u00af\u00af\u00af\u00af\u00a0\u00a0\u00af\u00a0\u00a0\u00a0\u00a4\u00a4\u00aa\u00aa\u00aa\u00b0\u00a9\u00aa ",
- " \u00a9 \u009b\u009b\u009b\u009b\u009b\u00ab\u00ab\u00ab\u00ab\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00a7\u00b1\u00b1\u00b1\u00ae\u00ae\u00b1\u00a3\u00a8\u00a8\u00a8\u00a8\u00a8 \u00af\u00af\u00af\u00af\u0096\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00a0\u00a0\u00af\u00b0\u00aa\u00aa \u00aa\u00aa\u00aa\u00a9",
- " \u00a9\u00a9 \u009b\u009b\u009b\u00b2\u00ab\u00ab\u00b3\u00b3\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00b4\u00b4\u00b1\u00b1\u00ae\u00b1\u00b1\u00ae\u00a8\u00a8\u00a8\u00a8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b0\u00b0\u00aa\u00aa\u00aa\u00aa\u00a9\u00a9",
- "\u00a9\u00a9 \u009b\u009b\u00b2\u00b2\u00b5\u00b3\u00b3\u00b3\u0097\u0097\u0097\u0097\u0097\u0097\u0097\u0097 \u00ac\u00b6\u00ac\u00ac\u00ac\u00b4\u00b4\u00b6\u00b6\u00ae\u00b1\u00ae\u00ae\u00a8\u00a8\u00a8\u00a8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b0\u00b0 \u00aa\u00aa\u00b0\u00a9\u00a9",
- " \u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b5\u00b3\u0097\u0097\u00b3\u0097\u0097\u0097\u0097 \u00ac\u00b6\u00b6\u00ac\u00b6\u00b6\u00b6\u00b6\u00b6\u00b1\u00b1\u00b6\u00ae\u00a8\u00a8\u00a8\u00a8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b0 \u00b0\u00b0\u00b0 ",
- " \u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b5\u0097\u0097\u0097\u00b7\u0097\u0097\u0097 \u00ac\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b1\u00b6\u00b6\u00a8\u00a8\u00a8\u00a8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b0\u00b0\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b5\u00b5\u00b7\u0097\u00b7\u00b7\u0097 \u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6 \u00a8\u00a8\u00a8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af \u00b8\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b5\u00b7\u00b7\u00b7\u00b7\u0097 \u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af \u00b8\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b5\u00b5\u00b7\u00b7\u00b7\u00b7 \u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af \u00b8\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b7\u00b7\u00b7\u00b7\u00b7 \u00b6\u00b6\u00b6\u00b6\u00b6\u00b6 \u00af\u00af\u00af\u00af\u00af\u00af \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af \u00b8\u00b8\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b9\u00b9\u00b9\u00b9 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af \u00b8\u00b8\u00b8\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00ba\u00ba\u00ba\u00ba \u00b9\u00b9 \u00b9\u00b9 \u00af\u00af\u00af\u00af\u00af \u00b8\u00b8\u00b8\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00ba\u00b5\u00b5\u00ba\u00ba \u00b9 \u00b9 \u00af\u00af\u00af\u00af\u00af \u00b8\u00b8\u00b8\u00b8\u00b8\u00b8\u00b8",
- " \u00b2\u00b2\u00b2\u00b2\u00b5\u00ba\u00ba\u00b2\u00ba\u00ba\u00ba \u00b9\u00b9 \u00b9\u00b9 \u00b8\u00b8\u00b8\u00b8\u00b8 ",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00ba\u00ba\u00b5\u00ba\u00ba \u00b9\u00b9\u00b9\u00b9\u00b9 ",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00ba\u00ba\u00ba\u00ba\u00ba \u00b9\u00b9 ",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00bb\u00bb\u00bb \u00bb\u00bb\u00bb\u00bb\u00bb \u00bb\u00bb\u00bb \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb ",
- " \u00bb\u00b2\u00b2\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb \u00bb \u00bb\u00bb \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb ",
- " \u00bb\u00bb\u00bb\u00bb \u00bb \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u [...]
- " \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00 [...]
- " \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb \u00bb\u00bb\u00bb \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb [...]
- " \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00b [...]
- " \u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb [...]
- "\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u0 [...]
- "\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u0 [...]
- "\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u0 [...]
- "\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u0 [...]
- "\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u0 [...]
- "\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u0 [...]
- "\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u0 [...]
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/image-filters-multi-blur-inflate-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/image-filters-multi-blur-inflate-512-512-2.0-grid-reference.json
deleted file mode 100644
index c3c52be..0000000
--- a/tests/visual_tests/grids/image-filters-multi-blur-inflate-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,288 +0,0 @@
-{
- "keys": [
- "",
- "66",
- "28",
- "119",
- "135",
- "168",
- "151",
- "78",
- "53",
- "166",
- "58",
- "51",
- "131",
- "44",
- "97",
- "99",
- "20",
- "75",
- "118",
- "42",
- "128",
- "84",
- "31",
- "56",
- "98",
- "41",
- "108",
- "100",
- "29",
- "80",
- "10",
- "72",
- "134",
- "161",
- "19",
- "147",
- "173",
- "169",
- "83",
- "137",
- "50",
- "3",
- "104",
- "65",
- "162",
- "59",
- "158",
- "86",
- "130",
- "150",
- "76",
- "157",
- "163",
- "46",
- "154",
- "39",
- "153",
- "77",
- "1",
- "123",
- "88",
- "94",
- "74",
- "103",
- "129",
- "141",
- "48",
- "138",
- "90",
- "120",
- "110",
- "174",
- "25",
- "106",
- "18",
- "170",
- "105",
- "4",
- "122",
- "16",
- "38",
- "143",
- "115",
- "139",
- "91",
- "171",
- "126",
- "71",
- "45",
- "156",
- "67",
- "69",
- "160",
- "148",
- "49",
- "144",
- "117",
- "15",
- "116",
- "52",
- "146",
- "87",
- "124",
- "36",
- "23",
- "61",
- "60",
- "155",
- "14",
- "33",
- "140",
- "145",
- "127",
- "125",
- "68",
- "32",
- "27",
- "95",
- "93",
- "34",
- "73",
- "112",
- "159",
- "142",
- "64",
- "35",
- "165",
- "85",
- "47",
- "57",
- "164",
- "172",
- "54",
- "176",
- "2",
- "177",
- "102",
- "113",
- "22",
- "111",
- "109",
- "9",
- "114",
- "132",
- "30",
- "175",
- "26",
- "5",
- "167",
- "121",
- "8",
- "55",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!! ",
- " ###########!!!!!!!!!!!!!!!!!!!!!! $$ %%%% %%%% ",
- " ##############!!!!!!!!!!!!!!!!!!!!!!!!!! $$$$$$$$$$$$%%%%%%%%% %%%%%%%%%% ",
- " ################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$$$$$$$$$$$%%%%%%%%%%%%%%% %%%%%%%%%%%%%% %%%%%%%% ",
- " #################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- "%%%% &&&&&&&&&&&##################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%&&&&&&&&&&&&&&&&######################!!!!!!!!!!!!!!!!!!!!!!!$$$$$'''$$''%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%&&&&&&&&&&&&&&&&&####################!!!!!!!!!!!!!!!!!!!!((((!$$$$''$$'$'''%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&&&&&&&&&&&&&&&&&&#################!!!!!!!!!!!!!!!!!!!!!!((((($$$'''''''''''%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&&&&&&&&&&&&&&&&&&###################!!!!!!!!!!!!!!!!!!!(((((($$'''''''''''''%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&&&&&&&&&&&&&#&#########################!!!!!!!!!!!!!!!(((((($$'''''''$$$$%%'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "%%%%&&&&&&&&&&######################!!#####!!!!!!!!!!(((((((($$$'''''$'''))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&%&&&&&&&&&&&#######################!###!!!!!!!!!!(((((((((($$''''$$''')))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&&&&&&&&&&&&&#################&&&&#####&&!!!!!!!!!(((((((((($$'''$$$''*))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&&&&&&&&&&&&&&&&##############&&&&&######&&!!!!!!!(((((((((($+'''$$''***,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&&&&&&&&&&&&&&&&&#################&#######&!!!!!!!!(((((((---++'''..'**/01%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
- "&&&&&&&&&&&&&&&&&############################!!!!!!!!(((((---2-++'344555511%%%%%%%%%%%666666%%%%%%%%%%%%%%%77%%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&&&&&&&&&&&########################&#!!!!!!!! ((-----+-88944::5*******%%%666666666666%%%;%;;%%%%%%777%%%%%%%%%%%%%%%%%%",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#####&##&&##!!!!! ---<<--8888=>?@@AAA***%%%%66666666666667;;;;;;;;;;;77777%%%%%%%%%%%%%%% ",
- " &&&&&&&&&& #&&&&&&&&&&&&&&&&&&&&&##&&&&#&&&&##### ---<<3-B888>>*CDDAAE*E%%%F66FF666666677777;;;;;;7777777%%%%G%%%%%%%%%% ",
- " &&&&&& #&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#### ---<H-IIIIB>>>>JKLMMMMEMN%FOFOFFFFPPP77777777;7777777QQ%%%G%%%%%%%%% ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&##### -HHHH-IIIRR>**>*LEMMMMMMSSFOOOOFFTT777777777777777U7UQ%%%%G%%%%%%%% ",
- " &&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#### <HHHHHH<BVVVBWM**EEE*XMYZZSSSSSO[[[]]777777777777777UU^^%GGG%%%%GG ",
- " &&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&### HHHHHH<<<VVVBBMMM_EE**YZZZSSSSS[[[]]``777777777777777UUGG%%%%%%GG ",
- " &&&&&&&&&& &&&&&&&aaaa&&&&&&&&&&&&&&&&b HHHcccc<<VVVVV_____ddddeeeZfSSSS[[]]]``g77777777777777UUUUU%^GGGG ",
- " &&& &&&& &&&&&&aaaaaa&&&&&&&&&&&&&bbb Hcccc<<hVVVVVV_____ddddeeeeeiSSSS]]]````ggj`kk7777777QQQQQU^^GGGG ",
- " && &&&& &&&&&&a&aaaa&&&&&&lmmmmmmmbb Hccccc<hhnVVVVV_____ddddeeeeeeopiii]]``````q`k77777777UQQQQU^GGGG ",
- " &&&& & &&& &&&&&&&&aaa&&&arrrmmmmmmmmm HcccsHHhhnnnVVtttWW_uuuuueeeeeeppiie```````qkkkvww77wwwxxxxUGGG ",
- " &&& &&& aa&&&&&&aaaaaa&mmmmyzmmmmmmm cccsshhhhnnnnttttWWWuuuuuieeeippiiie]`````{wwk{vww7wwwwxxxUxx ",
- " &&& &&& aaaaa&&&&aaa|}}mmmmmmmmmmmm~\u007f ccssscchhhnnntttWWWWuuuuu\u0080iiiiiiiiie]````{{wwk{{{wwwwwxxxxUxx ",
- " &&&& &&&& aaaaaa&&&&&\u0081\u0082\u0082mmmmmmmmmmmmm\u007f\u007f ccsssccnnn\u0083tt\u0084\u0084\u0084WWWuuuuu\u0085\u0085\u0080i\u0086iiiiiie]]``g{{www{{\u0087wwwwwxxUUxxx ",
- " &&&& &&& aaaa\u0081\u0081\u0082\u0088\u0088\u0088m\u0082mm\u0089mmmm~mmmmm\u007f\u007f8\u008a ccssss\u008b\u008bnn\u008c\u008d\u008e\u0084\u0084\u0084\u008fWWu\u0090u\u0090\u0090\u0085\u0085\u0091\u0091\u0091\u0086iiiii]]]``k{{www{wwwwwwxwxUUx\u0092\u0092\u0092\u0092\u0092\u0092\u0092\u0092 ",
- " &&&&&& aaaa\u0081\u0081\u0088\u0088\u0093mm\u0088\u0088\u0089mmmmm\u0094mmmm\u007f\u007f8\u008a\u008a\u008acssss\u008ds\u008b\u0095\u008c\u008d\u0084\u0084\u0084\u0084\u008fW\u0096\u0096\u0090\u0090\u0090\u0090\u0085\u0085\u0085\u0085\u0086iiiii\u0086\u0097````\u0097{{www{wwwwwwwwxxx\u0092\u0092\u0092\u0092\u0092\u0092\u0092\u0092\u0092\u0092\u0092 ",
- " && aa\u0081\u0081\u0088\u0093\u0093mmmm\u0089\u0089\u0089mmm\u0094\u007f8mm\u007f\u007f8\u008a\u008a\u008acssss\u008d\u008d\u0098\u0095\u008cWW\u0084\u0084\u008f\u008f\u0096\u0099\u0099\u0099\u0090\u0090\u0090\u0085\u0085\u0085\u0086\u0086iiii\u0086`\u0097`````{{{w\u009aw\u009bwwww\u009b\u009bw\u009c\u009c\u009c\u009c\u0092\u0092\u0092\u0092\u0092\u009d\u009d\u009d\u009d\u009d\u009d\u009d ",
- " a\u0081\u0081\u0093\u0093\u0093mm\u0089\u0089\u0089\u0089mm\u008a\u0094\u007f8\u008am\u007f\u007f8\u008a\u008a\u008a\u008asssss\u008d\u008d\u008dssW\u008d\u008d\u009e\u009f\u009f\u0099\u0099\u0099\u0099\u00a0\u00a0\u00a1\u00a1\u0086\u0086iiii\u0086\u0086`\u0097````\u0097\u0097{{ww\u009a\u009b\u009bw\u009b\u009b\u009awx\u009c\u009c\u009c\u009c\u009c\u0092\u0092\u0092\u009d\u009d\u009d\u009d\u009d\u009d\u009d\u009d\u009d ",
- " \u00a2\u0081\u0081\u0081m\u00a2\u00a2\u0093\u0089\u0089\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u007f\u007f8\u008a\u008a\u008a\u008a\u008assss\u008d\u008d\u008d\u008ds\u008d\u008d\u00a3\u00a3\u00a3\u009f\u0099\u0099\u0099\u0099\u00a0\u00a0\u00a1\u00a1\u0086ii\u00a4\u0086\u0086\u0086 \u0097\u0097\u0097\u0097\u0097\u0097\u0097{{{ww\u009a\u009aw\u009a\u009a\u009a\u009c\u009ax\u009c\u009c\u009a\u009c\u009c\u0092\u009d\u009d\u009d\u009d\u009d\u009d\u0 [...]
- "\u00a6\u00a6\u00a6 \u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008assss\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u00a3\u009f\u0099\u0099\u0099\u0099\u0099\u00a4\u00a4\u00a4\u00a1\u00a7\u00a7\u00a0\u00a4\u0086\u0086\u0086 \u0097\u0097\u0097\u0097\u0097\u0097\u0097{{{w\u009a\u009aww\u009a\u009a\u009c\u009ax\u009a\u009a\u009a\u009a\u009a\u0092\u00 [...]
- "\u00a6\u00a6\u00a6\u00a6 \u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a ssss\u008d\u008d\u008d\u008d\u008d\u008d\u00a7\u00a8\u0099\u0099\u0099\u0099\u0099\u00a4\u00a4\u00a4\u00a9\u00a9\u00a7\u00a4\u00a4\u00a4\u0086\u00aa\u00aa \u0097\u0097\u0097\u0097\u0097\u0097\u009b{{{{{\u009a\u009b\u009c\u009c\u009cxx\u0092\u0092\u0092\u009c\u009a\u0092\u00 [...]
- "\u00a6\u00a6\u00a6\u00a6\u00a6 \u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u0098\u0098\u0098\u008c\u00ab\u0084\u0084\u00a7\u00a7\u00a8\u00a8\u00a8\u0099\u0099\u00a7\u00a7\u00a4\u00a4\u00a4\u00a9\u00a7\u00a4\u00a4\u00a4\u00aa\u00aa\u00aa \u009a\u009b\u009b\u009b\u009b\u009b\u009b\u009b\u009c\u009c\u009a\u009a\u009a\u009c\u0092\u0092\u [...]
- " \u00a6\u00a6\u00a6 \u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u00ac\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u00ab\u00ab\u00ab\u00a7\u00a7\u00a8\u00a8\u00a8\u00a8\u00a7\u00a7\u00a7\u00ad\u00a4\u00ae\u00a9\u00a9\u00a4\u00a4\u00a4\u00aa\u00aa\u00aa \u009a\u009a\u009a\u009b\u009b\u009b\u009b\u009b\u009c\u009c\u009c\u009c\u009a\u0092\u0092\u00af\u00af\u009c\u009c\u009d\u009d\u009d\ [...]
- " \u00a6\u00a6 \u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u0093\u00ac\u00ac\u00ac\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u00ab\u00ab\u00ab\u00ab\u00a7\u00a9\u00a8\u00a8\u00a8\u00a7\u00a7\u00a7\u00a7\u00ad\u00ae\u00ae\u00a9\u00a9\u00aa\u00a4\u00a4\u00aa\u00aa\u00aa \u009a\u009a\u009a\u009a\u009a\u009a\u009a\u009c\u009c\u009c\u009c\u009a\u00af\u00af\u00af\u00af\u009c\u0092\u00af\u009d\u009d\u00a5 [...]
- " \u00a6 \u0093\u0093\u0093\u0093\u0093\u00b1\u00b1\u0093\u00ac\u00ac\u00ac\u00ac\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u00ab\u00ab\u00ab\u00ab\u00a7\u00ab\u00ab\u00ab\u00ab\u00a7\u00a9\u00a9\u00a9\u00ae\u00ae\u00a9\u00a9\u00aa\u00aa\u00a4\u00ae\u00aa\u00aa\u00aa \u009a\u009a\u009a\u009a\u009a\u009a\u009a\u009c\u009c\u009c\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u0092\u009d\u009d\u00a5\u00a5\u009d\u [...]
- " \u00a6 \u0093\u0093\u0093\u0093\u00b1\u00b1\u00b2\u00ac\u00ac\u00b1\u00b1\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u00ab\u00ab\u00b3\u00a7\u00a9\u00ab\u00ab\u00ab\u00b4\u00b4\u00a9\u00a9\u00ae\u00a9\u00a9\u00a9\u00aa\u00aa\u00ae\u00ae\u00aa\u00aa\u00aa \u009a\u009a\u009a\u009a\u009a\u009c\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u0092\u009d\u00a5\u00a5\u009d\u009d\u009d\u00a5\u00a5\u0 [...]
- " \u00a6\u00a6 \u0093\u0093\u0093\u0093\u00b1\u00b1\u00b2\u00b2\u00b5\u00b1\u00b1\u00b1\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u00ab\u00b3\u00b3\u00b3\u00a7\u00ab\u00ab\u00ab\u00b4\u00b4\u00b3\u00b3\u00ae\u00a9\u00a9\u00a9\u00aa\u00ad\u00ae\u00aa\u00aa\u00aa\u00aa \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u0092\u00a5\u00a5\u009d\u009d\u00a5\u00a5\u00 [...]
- "\u00a6 \u00a6\u00a6 \u0093\u0093\u0093\u00b1\u00b1\u00b2\u00b5\u00b5\u00b5\u00b5\u00b1\u008a\u008a\u00b6\u00b6\u00b6\u008a\u008a\u008a\u008a\u008a \u00ab\u00b3\u00b3\u00b3\u00a7\u00a9\u00ab\u00b3\u00b3\u00b3\u00b3\u00b3\u00a9\u00a9\u00a9\u00a9\u00a9\u00ae\u00aa\u00aa\u00aa\u00aa \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b0\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u0 [...]
- "\u00a6 \u00a6 \u00b2\u00b2\u0093\u00b1\u00b1\u00b2\u00b5\u00b5\u00b5\u00b5\u008a\u008a\u008a\u00b6\u00b6\u00b6\u008a\u008a\u008a\u008a \u00b3\u00b3\u00b3\u00b3\u00a7\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00a9\u00a9\u00a9\u00a9\u00b3\u00ae\u00aa\u00aa\u00aa\u00aa \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b0\u00b0\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u0093\u00b1\u00b5\u00b5\u00b5\u00b5\u00b5\u00b6\u008a\u00b1\u00b1\u00b6\u00b6\u00b6\u008a\u008a\u008a \u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00a9\u00a9\u00a9\u00a9\u00b3\u00b3\u00aa\u00aa\u00aa\u00aa\u00aa \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b0\u00b0\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b6\u00b2\u00b5\u00b5\u00b5\u00b5\u00b6\u00b1\u00b1\u00b1\u00b6\u00b6\u00b6\u008a\u008a \u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00a9\u00a9\u00a9\u00a9\u00a9\u00a9\u00b3\u00b3\u00b3\u00aa\u00aa\u00aa\u00aa \u00b8\u00b8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b5\u00b5\u00b1\u00b1\u00b1\u00b6\u00b6\u00b6\u008a \u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00aa\u00aa\u00aa\u00aa \u00b8\u00b8\u00b8\u00b8\u00b8\u00b8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7 \u00b7\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b1\u00b1\u00b1\u00b1\u00b6\u00b6\u00b6\u00b6 \u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3 \u00b8\u00b8 \u00b8\u00b8\u00b8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7 \u00b7 ",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b5\u00b6\u00b6\u008a\u00b6\u00b6\u00b6\u00b6 \u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3 \u00b8 \u00b8\u00b8\u00b8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7 \u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b6\u00b9 \u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3\u00b3 \u00b8 \u00b8\u00b8 \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00b5\u00b2\u00b2\u00b6\u00b6\u00b6\u00b6\u00b9\u00b9 \u00b3\u00b3\u00b3 \u00b8 \u00b8\u00b8 \u00af\u00af\u00af\u00af \u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00b9\u00b2\u00b2\u00b9\u00b2\u00b9\u00b9\u00b9\u00b9 \u00b8 \u00b8 \u00ba\u00ba \u00ba\u00af\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00b5\u00b2\u00b2\u00b2\u00b2\u00b9\u00b9\u00b9\u00b9 \u00ba \u00ba\u00ba\u00ba\u00ba\u00ba\u00b8\u00b8\u00ba\u00ba\u00ba\u00ba \u00ba\u00b8\u00b8\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00af\u00af\u00af\u00af\u00af\u00af\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7\u00b7",
- " \u00b2\u00b2\u00b2\u00b2\u00b2\u00b9\u00b9\u00b9\u00b2\u00b2\u00b2\u00b2\u00b9\u00b9\u00b9\u00b9 \u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b8\u00b8\u00b8\u00ba\u00ba\u00ba\u00b8\u00b8\u00b8\u00b8\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00af\u00af\u00af\u00af\ [...]
- " \u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b2\u00b2\u00b2\u00b2\u00b2\u00b9\u00b9\u00b9\u00b2\u00b2\u00b2\u00b2\u00b9\u00b9\u00b9\u00ba \u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b8\u00b8\u00b8\u00b8\u00b8\u00b8\u00b8\u00b8\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u [...]
- " \u00ba \u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b2\u00b2\u00b2\u00b2\u00b2\u00b9\u00b9\u00b2\u00b2\u00b2\u00b2\u00b9\u00b9\u00ba\u00ba \u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b8\u00b8\u00b8\u00b8\u00b8\u00b8\u [...]
- " \u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b2\u00b2\u00b2\u00b2\u00b2\u00b2\u00ba\u00b9\u00b9\u00b9\u00b9\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b [...]
- " \u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00b2\u00b2\u00b2\u00ba\u00b2\u00b2\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- "\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u00ba\u0 [...]
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/jalign-auto-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/jalign-auto-200-200-1.0-grid-reference.json
deleted file mode 100644
index a9ea572..0000000
--- a/tests/visual_tests/grids/jalign-auto-200-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! !! ! ! !!!!!!!! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! !! ! ! ! ! ! ! ",
- " ",
- " !! ! !! ! !!! ! ",
- " ! ! ! ! ! ! !! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! !! ! ! !!! ! !!! ! ",
- " ! !! ! ! ! ! ! !! ! ",
- " ! ",
- " !! ! !!! ! ",
- " ! ! ! !! !! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! !! ! ! !!!!!!!!!! ! !!! ! !!! ! ",
- " !!!!! ! ! ! !!!!!!! !! ! !! ! !! ! ",
- " ",
- " !! ! !! ! !!!!! ",
- " ! ! ! ! ! ! !! !! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/jalign-auto-200-200-2.0-grid-reference.json b/tests/visual_tests/grids/jalign-auto-200-200-2.0-grid-reference.json
deleted file mode 100644
index 139ef0c..0000000
--- a/tests/visual_tests/grids/jalign-auto-200-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " !! ! ! ! ! ! ",
- "! ! ! ! ! !! ! ! ! ! !! ! !!! ",
- "! ! !! !! ! ! ! !! ! ! ",
- " !! !!! ! !!! ! ! ! ! !!! !! ! !!! ! ! ",
- " ",
- " ! ! ",
- " ! ! ! ! ! ! ! ",
- "! ! ! ! ! !! ! ! ! ! !! ! ",
- "! ! ! ! !! ! ! ! !! !",
- " ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ! ! ! ",
- "! ! ! !! ! ! ! ",
- "! ! !! ! ! ",
- " ! ! ",
- " ! ",
- " !! ! !",
- " !! ! !! !! ",
- "!!! ! ! ! !!!! ",
- "! ! ! ! !! ! !",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! !!! ! ! !!! ! ",
- " !! ! ! !!! !!! ! !! !! ! !!! !!! ",
- "!!! ! ! !! ! ! ! !!! !!!! ! ! ",
- "! ! ! ! ! !! ! ! ! ! !! ! !! ",
- " ",
- " ",
- " !! ! !! ! !",
- "!!! ! !!!!!! ! !! !!! ",
- "!!! ! ! ! !!!! ! ! ! !!!! ",
- "!!! !! ! ! !!!! !! ! ! !!!! !"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/khmer-800-200-1.0-grid-reference.json b/tests/visual_tests/grids/khmer-800-200-1.0-grid-reference.json
deleted file mode 100644
index 1efb96c..0000000
--- a/tests/visual_tests/grids/khmer-800-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "keys": [
- "",
- "7",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ! ",
- " !!! !!! ! ! ! !!! !!!! !!! ! ! !!! !!!! ! !!! ! ! !!! !! !! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! ! ! !!! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ",
- " !!! !!! ",
- " ",
- " ",
- " # $ % & ' ( ! ) * + ",
- " ",
- " ",
- " ",
- " ' ' * * ",
- "# # %% ''' ' ' ' ''' '''' ** ** * *** **** ",
- "### # # # ### # # ## # # ### # %%% ' ' ' ''' ''' ' ' ** ** *** * * ",
- "# # # # # # # # ### # # # % %% % ' ''' ' ' ' ' ' ' * * * * * * * ",
- "# # # # # # # # # # # ### # % % % % ' ' ' ' ' ' ' * * * * * ",
- " # # ## % % % % ''' ** ",
- " ## ## % % %% ",
- " % % '' ** ",
- " # % % ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/khmer-800-200-2.0-grid-reference.json b/tests/visual_tests/grids/khmer-800-200-2.0-grid-reference.json
deleted file mode 100644
index edc66d6..0000000
--- a/tests/visual_tests/grids/khmer-800-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "keys": [
- "",
- "7",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ! ",
- " !! ! ",
- " ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " !!!!! !!!!! !! !!! !! !!!!! !!!!! !! !!!!! !!! !! !!!!! !!!!! !! !! !!!!!!! !! !! !!!!! !!! !!! ",
- " ! ! !! !!! ! ! ! ! ! ! !!! !!! ! ! ! ! !! ! !!! ! ! !! !! ! !!! !! ",
- " ! ! ! !! ! ! !! ! ! ! ! ! ! ! ! !! ! ! ! ! !! ! ! ! ! ! ! ! ! !! ! ! ",
- " ! ! ! !! ! ! !! ! ! ! ! ! ! ! ! !! ! ! ! ! !! ! ! ! ! ! !!!!! ! !! ! ! ",
- " ! ! ! ! !! !! ! !! !! ! ! ! ! ! ! !! !! ! !! ! ! !! ! !!! ! ! ! ! ! ! !!! ! ! ",
- " !!!! !!!!! !! !! ! !! !! !!!!! ! ! ! ! !! ! ! !! !!!!! !! ! !! ! ! ! ! ! ! !! !! ! ",
- " ",
- " !! !!! ",
- " !! ! !! ! ",
- " !!!! !!!! ",
- " ",
- " ",
- " ",
- " ",
- " # $ % & ' ( ! ) * + ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " '' * ",
- " '' ' * * * ",
- " # ''' ' '' '' ' ' ''' '''''' *** * *** * ** * **** ****** ",
- "# ## ## # # # #### # # # ## # # ## ' ' ' ' ' ' ' ' ' ' ** ** * * * * * ** * * ",
- "## # ## ## # # # ## ### ## # # # ## ## # #### ## ' '' ' ''' ' ' ' ' ' ' ' ** * * *** * * ** * ** * * ",
- " # # # # # # # #### ##### ## ## # # # ' '' ' ' ' ' ' ' ' ** ** * * * * ** * * ",
- " # # # # # ## # # # # # # ## # # # ' ' '' ' ' ' '' ' ' ** * ** * * * * ** * * ",
- " # # # # # ## # # # # # # ## # # # ''''' '' '' ' ' ' '' ' ' ***** ** * * ** * ** * * ",
- " # # # # # # # # # # # # # ## # # # # ' ' ' '' ''' ' ' ' ** * * ** *** ** * * ",
- " ## ## # # ##### # # # # # #### ## ## # ''' ' ** * ",
- " # # ' ' ' * * * ",
- " # # # ## '' '' ** ** ",
- " #### ## # ",
- " # # ' ' ** ",
- " ''' * * ",
- " # ''' ** ",
- " # "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-offset-900-250-1.0-grid-reference.json b/tests/visual_tests/grids/line-offset-900-250-1.0-grid-reference.json
deleted file mode 100644
index aca1218..0000000
--- a/tests/visual_tests/grids/line-offset-900-250-1.0-grid-reference.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "keys": [
- "",
- "3",
- "2",
- "1",
- "4",
- "8",
- "7",
- "6",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ## ",
- " !! !!!!!!!! # ######## ",
- " !!!!!!! !!!!!!!!!! !!! ####### ############# ",
- " !!!!!!!! ! ! !!!!! !!! ######## ########## ### ",
- " !! !!! !!!!!!!!!!! !!!!!!! ## #### ######## #### $$$$$$ ",
- " %% %%% !!!! !! ! !!!!! #### # ## ## ##### $$ $$$ ",
- " %% %% %%%%% % %% !!!!!!! !! !! ##### # ## ### $$ $$$$$$$$ $ ",
- " % %%%%%%% %%%%%%%% %% !!! ! !!! #### # #### $ $$$$$$$$$$ $$$ $ ",
- " % %% %%%%%%%%%%%%%%%%% % % !!! ! ! #### # # $ $$$$$$$$$$ $$$ $ ",
- " % %%%% %% %%%%% %%%% !!!!!! ! !!! ###### # # $ $$$$$ $ ",
- " % %%%%% %% %%% !!! ! ! !!! #### # #### $$$$$$ $ ",
- " %%%%% %%%% % ! ! !!! # # ##### $ $$$$ $ ",
- " % %%%% %%%% % ! ! !!! # ## $ $ $ ",
- " %%%% %%%% ! !! # ### $ ",
- " % %%% %% ! !!!!! # ## $ ",
- " % %% &&&&& & && %% %% ''''' ''''' '''''' '' !!!! # (((((( (((( ( (( ### $ $ )))))) ))))) )) $ ",
- " %% %% &&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !!! ''''''''' '' '' ! ! ### ((((((((((((( (( # $ $$$ ))))))))))))) )))))))))))) ",
- " %%%%% &&&&& &&& & & %% % !!!!! ' ! !!! ### ( ( # ### $$$ ) )) ))))) )) $ ",
- " % %%% %%% !!! !!! ### # ### $$$ $ ",
- " %%% %%%%% !!! ! ! !!! ### # ### $$$$$ $$ ",
- " %%%%% %%%% % !!! !!! #### # ### $$$ $$$$$ ",
- " %%%%% %% % !!! ! ! !!! ### # # ### $ $$$ $$$$$$$ ",
- " %%%%%% % %% % !!! ! ! !!!! ### # # ### $ $$$$ $$ $$$$$$$ ",
- " %% %% %%% %%%%%% % !!!! ! !!!!!! ### # # #### $ $$ $$$ $$ $$$$$ ",
- " % %% %%%%%%% %%%%%%%%%% % !!! ! ! ! !!!! ### # # ## ##### $ $$$$$$$$$$$$$$$$$ $ $ ",
- " % %%%%%%% %%%%%% % ! !!! ! ! !! ## ### # ## ## $$ $$$$$$ $$$$$ $$$$ $ ",
- " %% %%%% %%% %% !!! !!! !!! !! ### ## ## # ## $ $$$$$$$$$ $$ ",
- " %%% %%% !!!!!!! !!!!!!! ! !!! ###### ######### ### $$$$$ $$$$$ ",
- " !!!!! !! !!!!!!!! ###### ## ######### ",
- " !!! !!!!!!!!!! !!!!!! ## ########## ###### ",
- " !!!!!! !!! !! ##### #### ### ",
- " !!!! ! ### #### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-offset-900-250-2.0-grid-reference.json b/tests/visual_tests/grids/line-offset-900-250-2.0-grid-reference.json
deleted file mode 100644
index cf192a2..0000000
--- a/tests/visual_tests/grids/line-offset-900-250-2.0-grid-reference.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "keys": [
- "",
- "3",
- "2",
- "4",
- "1",
- "7",
- "8",
- "6",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! #### ",
- " !!!!!!!!!!! !!!!!! ########### ###### ",
- " !!! !!!!!!!!!!!!!!! !!!!! ## ############### #### ",
- " !!!! !!!!!! !!!!!!!! !!!!!!! ########## ######### ###### ",
- " !!!!!!! !!! !!!!!!!! !!!!!!!!! ####### ############ ######### ",
- " !!!!!!!!!!! !!!! !!! !!!!!!!!!!!!! ############## # ### ############# ",
- " !! !!!!! !!!!!!!!!!!!! ######### ############# ",
- " $$$$$ !!!! !!!!!!!!!!! !!!!!!!!!! #### ########## ###### #### %%%%%%% ",
- " $$$ $$$ !!! !!! !!! !!!!!! ### ### ### ######### %%%% %%% ",
- " $$ $$ !! !! !!!! ## ## #### %% %%% ",
- " $$ $$ !! !! !! # ## ## %% % ",
- " $$ $ ! ! ## # # % %% ",
- " $ $$ ! ! ## # %% % ",
- " $ $$ ! ! # # %% % ",
- " $$ $ ! ! # # % % ",
- " $ $ ! ! # # % % ",
- " $ $ ! &&&&&& & & ! # # % % ",
- " $ ''''''''' '' ''' $ ! &&&&&&&&& &&&& && & &&&& ! # (((((((((((( ( (((( # % )))))))))))) ) )))) % ",
- " $ ''''''''' '''' ' ''' '''' $ &&&&&&&&&&&&&&&&&&&&&&& &&&& &&&& ! #( ((((( (((((( ((((((( (((( (((( # % ))))))))))))) ))))))) ))) )))) % ",
- " ''''''''''''''''''''''''''''''''''''' ! && &&&&&& &&&&&& &&&& &&&& ! # ((((( (((((( (((((( ((( ((((((( % )) )) ))))))))))))))))))))))))))) ",
- " $ '''''''''' ''''''' ''''' '''' $ ! &&&&&&&&&&& &&&&&& &&& &&&& ! # (((((((((((((( (((((( (((( (((( # % ))))))))))))) )))))) )))) )))) % ",
- " $ '''''''''' ''''' '' '''' $ & && && ! # (( ((((((( ( (((((( (( # ))) ))))))))) )))))) ) )))) % ",
- " '' $ ! ! # (( % )) ",
- " $ $ !! ! # # % % ",
- " $ $ ! ! # # % % ",
- " $$ $ ! ! # # % % ",
- " $$ $ !! !! ## # % % ",
- " $ $$ !!! ! ! ### # ## %% %% ",
- " $$ $$ !!!!! !! !!! ##### ## ## %% %% ",
- " $$ $$ !!!!! !!! !!! ! ##### ### ### %%% %%% ",
- " $$$$$ $$$$$$ !! !! !!!!!!!!! !!!! # #### ########## ### %%%%%%%%%%%% ",
- " !!!!!!!!!! !!!! ######### #### ",
- " !!!!!!!!!!!! !!!!! !!!!!!! ############ ##### ####### ",
- " ! !!!!!!!!!!! !!! !!!!!!!!!!! !!!! ##### ######## ########### #### ",
- " !!!!!! !!!!!!!!! !!!!!! !!!!!! ################ ############## ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!! ##### ######### ########### ",
- " !!!! !!!!!!! !!!!!!!! ############ ######### ",
- " ! !!!!!! !!!!!! ## ####### ###### ",
- " !!! #### ## ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-opacity-multi-render-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/line-opacity-multi-render-512-512-1.0-grid-reference.json
deleted file mode 100644
index e61cb86..0000000
--- a/tests/visual_tests/grids/line-opacity-multi-render-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "61"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-opacity-multi-render-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/line-opacity-multi-render-512-512-2.0-grid-reference.json
deleted file mode 100644
index 6f52fae..0000000
--- a/tests/visual_tests/grids/line-opacity-multi-render-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "61"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-pattern-smooth-and-offset-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/line-pattern-smooth-and-offset-500-100-1.0-grid-reference.json
deleted file mode 100644
index bc60a27..0000000
--- a/tests/visual_tests/grids/line-pattern-smooth-and-offset-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !! ! !! !!!!!!!!! !!!!!!!!! !! !!! ",
- " !! !! !!!!!!!! !! !!!!! !!!!! !! !! ",
- " !! !!!!!! !!! !!! !!!! !! !! ",
- " !! ! !!!! !!! !!!!!!!! !!!! !! !! ",
- " !! !! !!! !!!!!!!!!!!!!!! !!! !!! !! ",
- " !! !!!!!! !!!!!!! !!!! !!! !!! !! !!! ",
- " !! !!!!! !!!! !!!! !! !!!! !! !! ",
- " !! !!!!!! !!!!!! !!!! !!!! !! !!!! !! ! ",
- " !! !!!!!! !! !!! !!!!!!!!!!! !!!!!!!!!! ",
- " !! !!!!! !! !!!!!!!! !! !! !! !!!! ",
- " ! !! !!!!!! !! !! ! !! !! !! !!!! ! ",
- " !!!!!!!! !! !!!!!!!! !!!!! !!! !! !! !! ",
- " !!!! !!!!! !!!! ! !! !!! !!! !!! !! !! ",
- " !!! !!!!! !!! !!!!!! !! !!!! !!! !! !! ",
- " !! !!!!!!!! !! !!!!!! !!!!!!!!! !! ",
- " !! !!! !! !!!! !!!! !! ! ",
- " !! !!! !!!!! !!!! !!!! !! !! ",
- " !! !!! !!! !!!!!! !! !!!! !! ",
- " ! !!! !!!!!!!!!!! !! !!!! !! ",
- " !! !!!!!!!!!!!!!!!!! !! !! ",
- " ! !!!!! !!!!!! !!!! !! ",
- " !!!!! !!! !! !! ! !! !! ",
- " !! !!!!!!! ! !! !!!! ",
- " !! !! !!!! ! !!!! !! ",
- " !! !! !!!!! !! !! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-pattern-smooth-and-offset-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/line-pattern-smooth-and-offset-512-512-1.0-grid-reference.json
deleted file mode 100644
index 70bccf1..0000000
--- a/tests/visual_tests/grids/line-pattern-smooth-and-offset-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " !!!!!!!! !! !! ! !!!!! ",
- " !!!!!!!!!!!!!!!!!!!! !! !!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !! !! !!! ",
- " !!!!!!!!! !!!!! !! !!!!!!!!! !! !! !!!!! !!! ",
- " !!!!!! ! !!! !!!!! !!!!!!!! !! !!! !! !! ",
- " !!!!! !! !!!!!!! !! !!!!!! !! !!!!!!!!! !! ",
- " !!!! !!!!!!! !! !! !!!!!!!!!!!!!!!!!! !! ",
- " !!!!! !! !!!! !! ! !!!!!! !!!!!! ",
- " !!!!!!! !! !!! !! !! !!!!!!! !!!!!! ",
- " !!!!!! !! ! !!! !!!!! !!!!!!!!!!!!!! !!!!! ",
- " !!!! !! ! !! !!! !!!!!!! !!!!!!!! !!!!!!!! !!!!! ",
- " !!! !! !! !!!!! !!!!!! !! !!!!!! !!!!!!!!!!!!!!!! ",
- " !!!! !!! !! !! !! !!! !! !!!!! !!!!!!!!!!!!!!!!! ",
- " !!! ! !! !! !! !!!!! !!!!! !!!!!!!!!!!!!!!!! !!! ",
- " !!! ! !!!! !!! !!! ! !!!!!! !!!!!! !!!!!!!!!! !! ",
- " !!! ! !!!!! !! !!! !! !!!!! !!! ! !!!!!!!!!!!! ",
- " !!! !!!! !! !! !!!!! !!!!! !! ! !!!!!!!!!!! ",
- " !!! !! !! !! !!! !!!! !!!!! !!!!!!!! !!!!!!!!!!! ",
- " !!! !!!! !!!!! !!!!!!! !!!!! !! !!!!!!!!! !!! !!! !!! ",
- " !! !!! !!!! !! !!!! !!!!! !! !!! !! !! !! !!!!!!!!!! ",
- " !! !!!!! !!!!! !! !! !! !!!!! !!! !!!!! !! !!! !!!!!! ",
- " !! !!!!! !!!!!!!!!!!! !!!!! !! !!!! !!!!!! !! !!!!!!! ",
- " !! !! !! !! !! !! !! !! !!!!! !!!!!!!! !!! !! !! !!!!!!! ",
- " !! !!!! !!!!!!! !! !! !!!!!! !!!!! !!!!!! !! ! !!! !!!!!!! ",
- " !! !! !!!! !! !!! !! ! !!! !!!! !! !! !! !!!!!!! ",
- " !! !!!! !! !!!! !! !!!! !!!!!! !!!! !! !!! !! !!!!!!!! ",
- " !! !!! !!!!!!! !! ! !!!! !!!!!!!!!!!!!!! !!! !!!!!!!!!!!!",
- " !! !! !! !!!! !! !!! !! !! !!!!!! !! !! !! !! !!!!!!!!",
- " !! !! !!!! !!! !!!! !! !! !!!! !!!!!!!!!!",
- " !!! !!!! !! !! !! !! !! !!! !!! ! !! !! !! !!!!",
- " !!! !! !!!! !! !! !! !!!! !!!!!!!!!!!! !! !!!!! ",
- " !! !! !!!! !! !!! !!!!!!!!!!! !! !! !! !! !!!",
- " !! ! !! !! !!! !!! !! !! !!! !! !! ! !!!! !!!",
- " !! !! !!!! !!! !! ! !!!!!!!! !! !!! !! !! !!",
- " !!! !! !!!! !!!! !! !!! !!! !!!! !!! !!!! !!",
- " !!! !! !!!!! !!!! ! !!!! !!! !!! !! !!!!",
- " !! !! !!!! !!!! !!!!!!!! !!! !!!! !",
- " !! !!! !! !!!! !!!! !! !! !! !!!",
- " !!! !!! !! !!!!! !! ! ! !! !! ",
- " !! ! !! !! !!!! !!!! !!!! ",
- " !! !!!! !! !!!!! !! !! ",
- " !! ! !! !!!!! !!!! ",
- " !! !! !! !!!!!!! ",
- " !! !! !! !!!!! !!!! ",
- " !! ! !! !!!!! !!!! ",
- " !! !! !!!!!!!! ",
- " !! !! !!!!! !! ",
- " !!! !! !! !!!!! !! ",
- " !! !! !!!!!!!! ",
- " !! !! !!!!! !! ",
- " !! !! !! !!!!!! !! ",
- " !! !!! !!!! !! !!!!!! ! ",
- "!!! !! !!!!!!!! !! ! !!! !! ",
- "!! !!! !!! !!!! !! !!!!!! !! ",
- "! ! !!!!! !!!!! !!!! !! !!!!!! ! ",
- "! !!!!!! !!! !!!! !!!! !! !! !!!!!! ",
- " !!!!!!! !! !!!!!!!! !!!! !! !!!!!! !! ",
- " !!!!!! !!!!!!!!!!!!!! !!!! !! !! !!!! !!!! ",
- "!! !!! !!!!! !!!!! !!!! !! !! ! !!!!!!! ",
- " !!!! !!!! !!!!!!! !!!!!! !!! !! !!!!!! !! ",
- "!!!! !!! !!!!!!!!!! !!!!!! !! !! !! !!!! !!!! ",
- "!!! !!! !!!! !!! !! !!! !! !! !!!! !!!! ! ",
- "!! !!! !!! !!!!! !! !! !! !! !! !! !!!! !!! ",
- "! !!!! !! !!!!!!!! !! !! ! !! !! !! !!!! ! ! ",
- " !!!! !! !!! !!! !! !!!!!! !!!! !! ! !! ",
- "!!!! !! !!! !!! !! !!!!!! !! !! !!!! !! ",
- "!!! !!! !! !!! !!!!!! !! !!!! !! !!!!! ",
- " !! !! !! !! !!!!!! !!!! !! !!!! !!! ",
- "!! !! !! !! !!!! !!!!! !!!! !! !! ",
- "!!!! !!! !! !!!! !! !! !! !!!! ",
- " !! !! !! !! !!!!! !!!!! !! !!!! ",
- " ! !! !!!!!!! !!!!!! !!!!! !!! ",
- " !! !! !!!!! !!!!! !!! ",
- " ! !! !!!!! !!!!! !!!! ",
- " !! !!!!!!!!!!! !!!! ",
- " !! !!!!!!!!! !!!!!! ",
- " !! !!! !!! !!!! !! ",
- " !! !!!!! !!!!!! ",
- " !! !!! !! ! ",
- " !!!!!!!!!!!! ",
- " !!!! !!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-pattern-smooth-and-offset-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/line-pattern-smooth-and-offset-512-512-2.0-grid-reference.json
deleted file mode 100644
index d7376ae..0000000
--- a/tests/visual_tests/grids/line-pattern-smooth-and-offset-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!! ",
- " !!!!!!!!!!!! ",
- " !!!!!!!!!!! !!! !!!!!! ",
- " !!!!!!!!!!!!!! !!! !!!! !!! !!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!! !!!!!!!! !!!!!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !! !!!!!!!! !!!!!!! !!!!!!! ",
- " !!!!!!!!!! !!!!!!! !! !! !!!! !!!!! !!!!! ",
- " !!!!!!!!!!! !!!! !!!!! !! !! !!!! !!!!!!!! !!!! !!!!! ",
- " !!!!!! !!!! !!!!!!!! !!!! ! !! !!!! !!!!!!!!! !!!!!!!! !!!! ",
- " !!!!!!! !!! !!!!!!!!!! !!! !!!! !!!!!!!!!!!!!!!!!!! !!!! ",
- " !!!!!!! !!!! !!!!! !!!!! !!!! !!!!!!!!!!!!! !!!!!! !!!! ",
- " !!!!!! !!! !!!! ! !!!! !!!! !!!!!!!!!!! !!!! !!!! ",
- " !!!!!!! !!!! !!! !!!!!!!! !!! !!!! !!!!!!!!!!! !!!! !!!!! ",
- " !!!!!! !!!! !!!! !!!!!!!!!! !!!! !!!! !!!!!!!!!!!!!!!!! !!!! ",
- " !!!!! !!! !!!!!!!!!!!!!!! !!!! !!!! !!!!!!!!!!!!!!!!!!! !!!! ",
- " !!!!!! !!!! !!! !!!! !!!!!! !!! !!!! !!!!!!!!! !!!!!!!!!!! !!!! ",
- " !!!!! !!! !!!!!!!! !!!!!!! !!! !!!! !!!!!!! !!!!!!! !!!! ",
- " !!!!!!! !!!! !!!!!!! !!!!!!! !!!! !!!! !!!!!! !!!!!! !!!!! ",
- " !!!!!!!! !!!! !!!!!!!! !!!!!! !!! !!!!! !!!!!! !!!!!! !!!!! ",
- " !!!!!!!!! !!! !!!!!!! !!!!!! !!! !!!!! !!!!! !!!!!!! !!!! ",
- " !!!!!!!!!!! !!!! !!!!!! !!!!!!! !!!! !!!!!! !!!!!! !!!!!!!!! !!!!!!! !!!! ",
- " !!!!!! !!! !!! !!!!!! !!!!!!! !!!!!!!!!!! !!!!!! !!!!!!!!!!!!! !!!!!!!!! !!!! ",
- " !!!!!!!!! !!!! !!!!!! !!!!!! !!!!!!!!! !!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !!!!! !!!! !!!! !!!!!! ! !!!!!! !!!!!! !!!!!!!!!!! !!!!!!! !!!!!! !!!!! ",
- " !!!!! !!! !!! !!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!! !!!!! !!!! ",
- " !!!!!!! !! !!!! !!!!! !!!!!!!!!!!! !!!!!!!!!! !!!!! !!!!!!! !!!! ",
- " !!!!!!!! !!! !!!!!! !!!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!! !!!! !!!!! !!!!!!!!!!!!!! !!!!!!!!!!! !!!!!! !!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!! !!!! !!!!!! !!!! !!!!! !!! !!!!!!!!!!! !!!!!!!!!! !!!! !!!!!!!!!!",
- " !!!!! !!! !!!!!! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!! !!!!! !!",
- " !!!!! !!!! !!!!! !!!! !!!!!! !!!!!!!!!!!!!!!!!! !!!!! !!!!!!! !!!! !!!!!! !",
- " !!!!! !!! !!!!!! !!!! !!!!!! !!!!!!!! !!!!!! !!!! !!!!! !!!! !!!!! ",
- " !!!!! !!! !!!!!! !!! !!!!! !!! !!!!!!! !!!! !!!!! !!!! !!!!!! ",
- " !!!!!!! !!!! !!!!!! !!!! !!!!!! !!!!!!! !!!! !!!! !!!! !!!!!! ",
- " !!!!!!!! !!! !!!!!! !!! !!!!!! !!!!!!! !!!! !!!! !!! !!!!!!!",
- " !!!!! !! !!!! !!!!!! !!!! !!!!!! !!!!!!! !!!! !!!!! !!!! !!!!!!",
- " !!!!! !!!! !!!!!! !!! !! !!!!!! !!!!!!!! !!!! !!!! !!!! !!!!!!",
- " !!!!! !!! !!!!!! !!!! !!!! !!!!!!! !!!!!!!! !!!! !!!! !!!! !!!!!",
- " !!!!! !!!! !!!!!!! !!! !!!!! !!!!!!!!!!!!!!!!! !!!! !!!! !!!! !!!!!",
- " !!!!!!! !!! !!!!!!! !!!! !!!!!! !!!!!!!!!!!!!!!! !!!! !!!! !!!! !!! ",
- " !!!!!!!!!! !!!! !!!!!! !!! !!!!!!! !!!! !!!!! !!!! !!!! !!!! !!!! !!!!",
- " !!!!! !!!!! !!!! !!!!!!! !!! !!!!!!! !!!! !!!! !!!! !!! !!!! !!!",
- " !!!!!!! !!! !!! !!!!!!! !!!! !!!! !!! !!!!! !!!!! !!!! !!!! !!! !!!",
- " !!!!!!!! !!!! !!!!!! !!! !!!! !!!! !!!!!!!!!!! !!!! !!!! !!!! !!",
- " !!!! !!!!! !!! !!!!!!! !!!! !!!! !!!! !!!!!!!!! !!!! !!!! !!! !!",
- " !!!! !!!!! !!!! !!!!!!! !!!! !!!! !!!! !!!!!! !!!! !!! !!!! !!",
- " !!!! !!!!! !!!! !!!!!!!! !!! !!!! !!!!! !!!!! !!!! !!! ",
- " !!!!!!! !!! !!! !!!!!!! !!! !!!! !!!!!! !!!!!!! !!! !!!! ",
- " !!!!! !!!!! !!!! !!! !!! !!!! !!! !!!!!!!!!!!!!!! !!!! !!!! ",
- " !!!! !!!!! !!! !!!!!!!! !!! !!!! !!!!!!!!!!!! !!! ! ",
- "!!!!!! !!!!! !!!! !!! !!! !!! !!! !!!!!!! !!!! ",
- "!!!!!!! !! !!!! !!!! !!! !!!! !!!! !!! ",
- "!! !!!! !!! !!!!!!!! !!! !!! ! ",
- "!!! !!!!! !!!! !!!! !!! !!!! !!! !!! ",
- "!!!!! !!!!!!!!!!!! !!! !!!! !!! !!!! !!!! ",
- " !!!! !!!!!!!!!!!!!! !!!! !!! !!! !!! !!! ",
- " !!!!!!!!!!!!!!!!!!!! !!!! !!!! !!!! !!! !!!! ",
- " !!!!!!! !!!!!!! !!! !!!! !!! !!!! !!!! ",
- "!!!!!!!! !!! !!!!!!! !!!! !!! !!! !!!! !!! ",
- "!!!!!!! !!!!!!!! !!!!!!! !!! !!!! !!!! !!! !!!! ",
- "!!!!!! !!!!!!!!!!! !!!!!!! !!!! !!! !!! !!!! !!!! ",
- "!!!!! !!!!!!!!!!!!!! !!!!!!! !!! !!!! !!! !!!! !!! ",
- "!!!! !!!!! !!!!!!! !!!!!!!!! !!!! !!!! !!! !!!! ",
- "!!! !!!!! !!!!!!!!!!!!! !!!!!!! !!! !!! !!!! !!!! ",
- "!! !!!!! !!!!!!!!!!!!!!!!! !!!! !!!! !!!! !!!! !!! ",
- "! !!!!!!!!!!!!!!!!!!!!!!!!!! !!!! !!! !!!! !!! !!!! ",
- " !!!!!!!!!!!! !!!!!! !!!!!!! ! !!!! !!! !!! !!! ",
- " !!!!!!!!!! !!!!! !!!!! !!! !!!! !!!! !!! ",
- "!!!!!!!!!! !!!!! !!!! !!!! !!!! !!! !!!! ",
- "!!!!!!!! !!!! !!!!! !!! !!!! !!! !!!! !!! ",
- "!!!!!!! !!!!!!! !!!! !!!! !!! !!!! !!!! !!! ",
- "!!!!!! !!!!!!!!!!! !!!! !!!! !!!! !!! !!! !!!! ",
- "! !!!! !!!!!! !!!!!! !!! !!! !!! !!!! !!!! !!! ",
- " !!!! !!!!! !!!!! !!!! !!!!!!! !!! !!!! !!!! ",
- "!!!! !!!!! !!!! !!!! !!!!!!! !!!! !!! !!!! ",
- "!!!! !!!! !! !!!! !!! !!!!!! !!!! !!!! !!!!!! ",
- "!!! !!!! !!!!! !!! !!! !!!!! !!! !!! !!!!!!! ",
- "!! !!!!! !!!!!!! !!! !!!! !!! !!!! !!!! !!!!!!! ",
- " ! !!!! !!!!!!!! !!! !!!! !!! !!!! !!!!!!!! ",
- " !!!! !!!!!!!!! !!! !!!! !!!! !!! !!!! ",
- " !!!! !!!!!! !!! !!!! !!!! !!!! !!!! !!! ",
- " !! !!!!!!!!!!!! !!!! !!!!!!!!!!!! !!!! !!!!!!! ",
- " !!!!! !!!!!!! !!!!! !!!!!!!!!!!!!!!! !!!!!!! ",
- " !!!!! !!!! !!!!! !!!!!!!!!!!!! !!!! !!! ",
- " !!! !!!!!! !!!!! !!! !!!!! !!!! !! ",
- " ! !!!!!!!! !!!!! !!!!!! !!!!!! ",
- " !! !!!!! !!!!!!!!!!!!! !!!!!!!! ",
- " !!!!!! !!!!!!!!!! !!!!! !! ",
- " !!!!!!!!! !!!!!!! !!!!! ",
- " !!! !!!!! !! !!!!!! ",
- " !!!!!!!! !!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!! !!!!!!!!!!!!! !!! ",
- " !!!! !!!!!!!!!!!! !! ",
- " ! !!!!! !!! ",
- " !!!!! !! ",
- " !!!! !!! ",
- " !!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-pattern-symbolizer-900-250-1.0-grid-reference.json b/tests/visual_tests/grids/line-pattern-symbolizer-900-250-1.0-grid-reference.json
deleted file mode 100644
index 8d2d83b..0000000
--- a/tests/visual_tests/grids/line-pattern-symbolizer-900-250-1.0-grid-reference.json
+++ /dev/null
@@ -1,78 +0,0 @@
-{
- "keys": [
- "",
- "4",
- "3",
- "2",
- "1",
- "7",
- "8",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!! ############# $$$$$$$$$$$$ %%%%%%%%%%% ",
- " !!!!!!!!!!!!!!!!! ##################### $$$$$$$$$$$$$$$$$$$$ %%%%%%%%%%%%%%%%%%% ",
- " !!!!!!!!!!!!!!!!!!!!!!! ######################### $$$$$$$$$$$$$$$$$$$$$$$$ %%%%%%%%%%%%%%%%%%%%%%% ",
- " !!!!!!!!!!! !!!!!!!!!!!! ######## ######### $$$$$$$$$ $$$$$$$$$$ %%%%%%%%%% %%%%%%%%%% ",
- " !!!!!!! !!!!!!! ####### ####### $$$$$$ $$$$$$$ %%%%%%% %%%%%%%% ",
- " !!!!!! !!!!!! ###### ###### $$$$$ $$$$$$ %%%%% %%%%%% ",
- " !!!!!! !!!!! ##### ##### $$$$$ $$$$$ %%%%% %%%%% ",
- " !!!! !!!!! ##### ##### $$$$ $$$$$ %%%% %%%%% ",
- " !!!! !!!! #### #### $$$$ $$$$ %%%% %%%% ",
- " !!!! !!!! #### #### $$$ $$$$ %%%% %%%% ",
- " !!!! !!!! #### #### $$$$ $$$ %%%% %%%% ",
- " !!! !!!! ### ### $$$$ $$$ %%%% %%% ",
- " !!! !!! #&&&&& ### $$$ $$$ %%% %%% ",
- " !!! ''''''''''''''''''''''''''''''! ### ### $$$ $$$ %%% ((((((((((((% ",
- " !!! !!! ### ### $$$$ $$$ %%% %%% ",
- " !!! !!!! #### #### $$$$ $$$ %%%% %%% ",
- " !!!! !!! ### #### $$$ $$$$ %%% %%%% ",
- " !!!! !!!! #### #### $$$$ $$$$ %%%% %%%% ",
- " !!!! !!!!! #### #### $$$$ $$$$$ %%%% %%%%% ",
- " !!!!! !!!!! ##### ##### $$$$ $$$$$ %%%%% %%%%% ",
- " !!!!! !!!!! ###### ###### $$$$$$ $$$$$$ %%%%%% %%%%% ",
- " !!!!!! !!!!!! ####### ####### $$$$$$ $$$$$$$ %%%%%%% %%%%%% ",
- " !!!!!!!! !!!!!!!! ########## ########## $$$$$$$$$ $$$$$$$$$ %%%%%%%% %%%%%%%%% ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ####################### $$$$$$$$$$$$$$$$$$$$$$$$ %%%%%%%%%%%%%%%%%%%%%%%%% ",
- " !!!!!!!!!!!!!!!!!!!!! ################### $$$$$$$$$$$$$$$$$$$$ %%%%%%%%%%%%%%%%%%%%% ",
- " !!!!!!!!!!!!!!! ########### $$$$$$$$$$$$$ %%%%%%%%%%%%%% ",
- " !!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-pattern-symbolizer-900-250-2.0-grid-reference.json b/tests/visual_tests/grids/line-pattern-symbolizer-900-250-2.0-grid-reference.json
deleted file mode 100644
index a5ba410..0000000
--- a/tests/visual_tests/grids/line-pattern-symbolizer-900-250-2.0-grid-reference.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "keys": [
- "",
- "3",
- "2",
- "1",
- "4",
- "7",
- "6",
- "8",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!! ###### $ ",
- " %%%%%%%%%%%%%%% !!!!!!!!!!!!!!!!! ################# $$$$$$$$$$$$$$$$ ",
- " %%%%%%%%%%%%%%%%%%%%% !!!!!!!!!!!!!!!!!!!!!!! ###################### $$$$$$$$$$$$$$$$$$$$$$ ",
- " %%%%%%%%%%%%%%%%%%%%%%%%% !!!!!!!!!!!!!!!!!!!!!!!!!!! ########################### $$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ############################## $$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ################################# $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ################################### $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " %%%%%%%%%%%%% %%%%%%%%%%%% !!!!!!!!!!!! !!!!!!!!!!! ############ ############ $$$$$$$$$$$$ $$$$$$$$$$$$ ",
- " %%%%%%%%%%% %%%%%%%%%% !!!!!!!!!! !!!!!!!!!! ########## ########## $$$$$$$$$$ $$$$$$$$$$ ",
- " %%%%%%%%% %%%%%%%%% !!!!!!!! !!!!!!!! ######### ######## $$$$$$$$$ $$$$$$$$$ ",
- " %%%%%%%% %%%%%%%% !!!!!!!! !!!!!!!! ####### ######## $$$$$$$$ $$$$$$$$ ",
- " %%%%%%% %%%%%%%% !!!!!!! !!!!!!! ####### ####### $$$$$$$ $$$$$$$ ",
- " %%%%%% %%%%%%% !!!!!! !!!!!! ####### ####### $$$$$$$ $$$$$$$ ",
- " %%%%%%% %%%%%% !!!!!!! !!!!!!! ###### ####### $$$$$$ $$$$$$$ ",
- " %%%%%%% %%%%%% !!!&&&&&&&&&&&&&&&&&&& !!!!!!! ###'## ###### $$$$$$ $$$$$$ ",
- " %%%(((((((((((((((((((((((((((((((((((((%%% !!!!!!! !!!!!!! ###### '''''''### $$$$$$ ))))))))))))))))))))))))))$$$ ",
- " %%%%%%% %%%%%% !!!!!!! !!!!!!! ###### ####### $$$$$$ $$$$$$$ ",
- " %%%%%%% %%%%%% !!!!!! !!!!!! ####### ####### $$$$$$ $$$$$$$ ",
- " %%%%%%% %%%%%%% !!!!!!! !!!!!!! ####### ####### $$$$$$$ $$$$$$$ ",
- " %%%%%%%% %%%%%%%% !!!!!!!! !!!!!!!! ####### ######## $$$$$$$$ $$$$$$$$ ",
- " %%%%%%%%% %%%%%%%% !!!!!!!!! !!!!!!!!! ######### ######### $$$$$$$$ $$$$$$$$$ ",
- " %%%%%%%%% %%%%%%%%%% !!!!!!!!!! !!!!!!!!!!! ######### ########## $$$$$$$$$$ $$$$$$$$$$ ",
- " %%%%%%%%%%% %%%%%%%%%%% !!!!!!!!!!!! !!!!!!!!!!!! ############ ############ $$$$$$$$$$$$ $$$$$$$$$$$ ",
- " %%%%%%%%%%%%%% %%%%%%%%%%%%%% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ################################### $$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$ ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ################################# $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ############################## $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%% !!!!!!!!!!!!!!!!!!!!!!!!!!! ########################### $$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " %%%%%%%%%%%%%%%%%%%%%%%% !!!!!!!!!!!!!!!!!!!!!! ####################### $$$$$$$$$$$$$$$$$$$$$$$ ",
- " %%%%%%%%%%%%%%%%%%% !!!!!!!!!!!!!!!!! ################# $$$$$$$$$$$$$$$$$$ ",
- " %%%%%%%%%%%% !!! ####### $$$$$$$$$$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-pattern-symbolizer-opacity-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/line-pattern-symbolizer-opacity-512-512-1.0-grid-reference.json
deleted file mode 100644
index 686cdf5..0000000
--- a/tests/visual_tests/grids/line-pattern-symbolizer-opacity-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,144 +0,0 @@
-{
- "keys": [
- "",
- "3",
- "4",
- "2",
- "1",
- "7",
- "8",
- "6",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ########## !!!!!!!!!!!!! $$$$$$$$$$$$ %%%%%%%%%%% ",
- " #### #### !!! !!! $$$ $$$ %%%% %%%% ",
- " ### ### !!! !!! $$$ $$ %% %%% ",
- " ## ## !! !! $$ $$ %% %% ",
- " ## ## !! !! $$ $$ %% %%",
- " # ## ! ! $$ $$ %% %",
- "## # !! !! $ $ % %",
- "# # !&&&& ! $ $ %% ",
- "'''''''''''''''''''''''''' !&&&&&&&&&&&&&&&&&&&&&&&&&! (((((((((((((((((((((((((( %)))))))))))))))))))))))))",
- "# # !! !! $ $ %% ",
- "# # ! ! $$ $ % %",
- "## ## !! !! $ $ %% %",
- " ## ## !! !! $$ $$ %% %%",
- " ## ## !! !! $$$ $$ %% %%% ",
- " ### ### !!! !!! $$ $$$ %%% %% ",
- " #### #### !!!!! !!!!! $$$$$ $$$$$ %%%% %%%%% ",
- " ############ !!!!!!!!! $$$$$$$$$$ %%%%%%%%%%% ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-pattern-symbolizer-opacity-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/line-pattern-symbolizer-opacity-512-512-2.0-grid-reference.json
deleted file mode 100644
index 10f611c..0000000
--- a/tests/visual_tests/grids/line-pattern-symbolizer-opacity-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,144 +0,0 @@
-{
- "keys": [
- "",
- "4",
- "3",
- "2",
- "1",
- "8",
- "7",
- "6",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!! ######### $$$$$$$$ %%%%%%% ",
- " !!!!!!!!!!!!!! ############### $$$$$$$$$$$$$$$ %%%%%%%%%%%%%% ",
- " !!!!!!!!!!!!!!!!!! ###### ###### $$$$$$$ $$$$$$$ %%%%%%%% %%%%%%%% ",
- " !!!!! !!!!! #### ##### $$$$$ $$$$$ %%%%% %%%% ",
- " !!!! !!!! ### #### $$$$ $$$$ %%%% %%% ",
- " !!! !!!! ### ### $$$$ $$$ %%% %%%",
- "!!! !!! ### ### $$$ $$ %% %%",
- "!! !!! ## ## $$ $$$ %%% %",
- "&&&&&&&&&&&&&&&&&&&&&& !!! #'''''''''''''''''''''''''# $(((((((((((((((((((((((((($ %)))))))))))))))))))))))))",
- "&&&&&&&&&&&&&&&&&&&&&&&&&&! #'''''''''''''''''''''''''# $(((((((((((((((((((((((((($ %)))))))))))))))))))))))))",
- "&&&&&&&&&&&&&&&&&&&&&&&&&&! ## ## $$$ (((((($ %% )))))))))))))))))))",
- "!! !!! ### ### $$ $$$ %%% %",
- "!!! !!! ## ## $$$ $$$ %% %%",
- " !!! !!!! #### ### $$$ $$$ %%% %%%",
- " !!!! !!!! #### #### $$$ $$$$ %%%% %%%% ",
- " !!!!! !!!!! ###### ###### $$$$$ $$$$$ %%%%% %%%%% ",
- " !!!!!!!! !!!!!!!! ################# $$$$$$$$$$$$$$$$$$ %%%%%%%%%%%%%%%%%% ",
- " !!!!!!!!!!!!!! ############# $$$$$$$$$$$$$ %%%%%%%%%%%%%% ",
- " !!!!!!! $$$ %%%%% ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-smooth-and-offset-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/line-smooth-and-offset-512-512-1.0-grid-reference.json
deleted file mode 100644
index 2d3c257..0000000
--- a/tests/visual_tests/grids/line-smooth-and-offset-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! !! ",
- " !!!!!!!!! !!!!!!!! ",
- " !!! !!!! !!!! !!! ",
- " !!! !!!!! !!! !!! !!!!! !! ",
- " !! !!!!!!!! !!! !!! !!!!!!!! !! ",
- " !!!!! ! !! !! !!! !! !! !!! !! ",
- " !! !! !!!!! !! !! !! !! !!!!! !!!!!! ",
- " !! ! !!! !!!!! !! !! !! !!! !! !! !!! ",
- " !! !! !!!!!!! !!!! !! !! !!!!!!!!! !! !! ",
- " !! !!!!!!! !! !! !! !! !!!!!!!!!!!!!! !! !! ",
- " !!!! !!!! !! ! !! !!!!!!!!! !!!!!! !! ",
- " !! !! !!! !! !!!! !! !!!!! !!!!!!!!! ",
- " !! ! !!! !!!!! ! !! !!!!!!!!!!!!!! !!!!! !!! ",
- " !! !! !!! !!!!!!! !! !!!!!!!!!!! !!!!! !!!!! !! ",
- " !! !!!!! !!!!!! !!!! !! !!!!!! !!!!!!!!! !! ",
- " !!!! !! !! !!! !!!! !! !!!!! !!!! !!!!!!!! !! ",
- " !! !! !! !! !!!!! !! !! !!!!! !!!!!!!!!! !!!! !!!!!! ",
- " !! !!!! !!! !!! ! !! !!!!!!!!! !!! !!!! !!!! !! !!! ",
- " !! !!!!! !! !!! !!!! !!! !!!!! !!! !!!! !!!!!! !! ",
- " !! !!!! !! !! !!!!! !! !!! !!!!! !! !!! !!!!!!! !! ",
- " !!!! !! !!! !!!! !!!!! !!! !!!! !!!!!!!! !!! !!!!!!! !! ",
- " !! !!!!! !! !!! !!!!! !! !!!!!!! !!!!!!!!! !!! !!! !!!!!! ",
- " !! !!!! !! !! !!!!! !! !! !!! !! !! !!! !!!!!! !!! ",
- " !! !!!!! !! !! !! !!!!! !!! !!!!! !! !!!!!! !! ",
- " !! !!!!!!! !!! !!!!! !! !!!! !!!!!! !! !!!!!!! !! ",
- " !!!! !! !! !! !!!!! !!!!!!!! !!! !! !! !!!!!!! !! ",
- " !! !!!!!!! !! !!!!!! !!!!! !!!!!! !!! !!!!!!!!!!",
- " !! !!!! !! !!! ! !!! !!!! !! !! !!!!!!! !!",
- " !! !! !!!! !! !!!!!! !!!! !! !! !!!!!!! !",
- " !! !!!!!!! !! !!!! !!!!!!!!!!!!!!! !!!!!!!! !! ",
- " !!!! !!!! !! !! !! !!!!!! !! !! !! !!!!!!!!",
- " !! !! !!!! !! !!!! !! !! !!!!!!! !!",
- " !! !!!! !! !! !! !! !!! !!! !! !! !! !",
- " !! !! !!!! !! !! !!!! !!!!!!!! !! !!!!! ",
- " !! !! !!!! !! !!!!!!!!!!! !! !! !! !!!",
- " !! ! !! !! !! !! !! !!! !! !!!! !!!",
- " !! !! !!!! !! !!!!!!!! !! !! !! !!",
- " !! !! !!!! !! !!! !!! !! !!!! !!",
- " ! !! !!!!! !! !!!! !!! !! !!!!",
- " !! !! !!!! !! !!!!!! !!!! !",
- " !! !! !!!! !! !! !!!",
- " !! !! !!!!! !! !! !! ",
- " !! !! !!!! !! !!!! ",
- " ! !! !!!!! !! !! ",
- " !! !! !!!!! !! ",
- " !! !! !!!!!!! ",
- " !! !! !!!!! !! ",
- " !! !! !!!!! !! ",
- " ! !! !!!!!!!! ",
- " !! !! !!!!! !! ",
- " !! !! !!!!! !! ",
- " !! !! !!!!!!!! ",
- " !!!!!!!! !! !! !!!!! !! ",
- " !!!! !!!!! ! !! !!!!!! !! ",
- " !!! !!!! !!!! !! !! !!!!!! ! ",
- " !! !!!!!!!! !!!! !! !! ! !!! !! ",
- " !! !!! !!!! !!!! !! !! !!!!!! !! ",
- " !! !!! !!!!! !!!! !!!! !! !! !!!!!! ! ",
- " !! !!! !!! !!!! !!!! !!!! !! !! !! !!!!!! ",
- " !! !!! !! !!!!!!!! !!!! !!!! !! !! !!!!!! !! ",
- " !! !!! !!!!!!!!!!!!!! !!!! !!! !!!! !! !!!! !! ",
- "!! !!! !!!!! !!!!! !!!! !!! !! !! !! ! !!!! ",
- "! !!! !!!! !!!!!!! !!!!!! !!! !! !! !! !!!!!! !! ",
- " !!! !!! !!!!!!!!!! !!!!!! !! !!! !! !! !!!! !! ",
- "!!! !!! !!!! !!! !! !!! !!!!! !! !!!! !!!! ",
- "!! !!! !!! !!!!! !! !! !! !! !!!! !! !!!! !! ",
- "! !!!! !! !!!!!!!! !! !! ! !! ! !! !! !!!! ! ",
- " !!!! !! !!! !!! !! !!!!!! ! !!!! !! ! !! ",
- "!!!! !! !!! !!! !! !!!!!! !! !! !!!! !! ",
- "!!! !!! !! !!! !!!!!! !! !!!! !! !!!! ",
- " !! !! !! !! !!!!!! !!!! !! !!!! !! ",
- "!! !! !! !! !!!! !!!!! !!!! !! !! ",
- "!!!! !!! !! !!!! !! !! !! !!!! ",
- " !! !! !! !! !!!!! !!!!! !! !! ",
- " ! !! !!!!!!! !!!!!! !!!!! ! ",
- " !! !! !!!!! !!!!! !! ",
- " ! !! !!!!! !!!!! !! ",
- " !! !!!!!!!!!!! !!! ",
- " !! !!!!!!!!! !!! ",
- " !! !!! !!! !!! ",
- " !! !!!!! !!! ",
- " !! !!! ",
- " !!!!!!! ",
- " !!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-smooth-and-offset-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/line-smooth-and-offset-512-512-2.0-grid-reference.json
deleted file mode 100644
index ccc7a48..0000000
--- a/tests/visual_tests/grids/line-smooth-and-offset-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!! !!!!!!!! !!!!!!!! !!!!!!!!! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! ",
- " !!!!! !!!!! !!!!!! !!!!! !!!!!! !!!!! ",
- " !!!!! !!!!!!!!!!! !!!! !!!! !!!!!!!!!!! !!!!! ",
- " !!!! !!!!!!!!!!!!!! !!!! !!!! !!!!!!!!!!!!!! !!!!! ",
- " !!!! !!!!!!! !!!!!!!! !!!! !!!! !!!!!!! !!!!!!! !!!! ",
- " !!!! !!!!! !!!!! !!! !!!! !!!!! !!!!! !!!! ",
- " !!!! !!!! !!!! !!!! !!!! !!!!! !!!! !!!! !!!!! !!!! ",
- " !!! !!!! !!!!!!!! !!!! !!! !!!! !!!! !!!!!!!! !!!! !!!! ",
- " !!!! !!! !!!!!!!!!! !!! !!! !!!! !!!! !!!!!!!!!! !!!! !!!!! ",
- " !!! !!!! !!!!! !!!!! !!!! !!!! !!!! !!!!! !!!!! !!!!!! !!!! !!!!! ",
- " !!!! !!! !!!! ! !!!! !!!! !!!! !!!!! !!!!! !!!! !!!! !!!! !!!! ",
- " !!!! !!!! !!! !!!!!!!! !!! !!!!!!!!! !!!! !!!!!!!!!! !!!! !!!!! !!!! ",
- " !!! !!!! !!!! !!!!!!!!!! !!!! !!!!!!!! !!!! !!!!!!!!!!!!!!!!! !!!! !!!! ",
- " !!!! !!! !!!!!!!!!!!!!!! !!!! !!!!!! !!!! !!!!!!!!!!!!!!!!!!! !!!! !!!!! ",
- " !!! !!!! !!! !!!! !!!!!! !!! !!! !!!! !!!!!!!!! !!!!!!!!!! !!!! !!!!! ",
- " !!! !!! !!!!!!!! !!!!!!! !!! !!!! !!!!!!! !!!!!!! !!!! !!!! ",
- " !!!! !!!! !!!!!!! !!!!!!! !!!! !!!! !!!!!! !!!!!! !!!!! !!!! ",
- " !!! !!!! !!!!!!!! !!!!!! !!! !!!!! !!!!!! !!!!!! !!!!! !!!!",
- " !!! !!! !!!!!!! !!!!!! !!! !!!!! !!!!! !!!!! !!!! !!!!",
- " !!!! !!!! !!!!!! !!!!!!! !!!! !!!!!! !!!!!! !!!!!!!!! !!!!! !!!! !!!",
- " !!! !!! !!!!!! !!!!!!! !!!!!!!!!!! !!!!!! !!!!!!!!!!!!! !!!! !!!! !!",
- " !!! !!!! !!!!!! !!!!!! !!!!!!!!! !!!!!! !!!!!!!!!!!!!!! !!!! !!!!! !",
- " !!!! !!!! !!!!!! ! !!!!!! !!!!!! !!!!!!!!!!! !!!!!!! !!!!! !!!!! ",
- " !!! !!! !!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!! !!!!! !!!! ",
- " !!! !!!! !!!!! !!!!!!!!!!!! !!!!!!!!!! !!!!! !!!!! !!!! ",
- " !!!! !!! !!!!!! !!!!!!!!!!!!! !!!!!!!!!!! !!!!! !!!! !!!!",
- " !!!!!!!! !!!!! !!!!!!!!!!!!!! !!!!!!!!!!! !!!!!! !!!!! !!!!! !!!!",
- " !!! !!!! !!!!!! !!!! !!!!! !!! !!!!!!!!!!! !!!!!!!!!! !!!! !!!!! !!!",
- " !!! !!! !!!!!! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!! !!!!! !!",
- " !!!!!!!! !!!!! !!!! !!!!!! !!!!!!!!!!!!!!!!!! !!!!! !!!!!!! !!!! !!!!!! !",
- " !!! !!! !!!!!! !!!! !!!!!! !!!!!!!! !!!!!! !!!! !!!!! !!!! !!!!! ",
- " !!! !!! !!!!!! !!! !!!!! !!! !!!!!!! !!!! !!!!! !!!! !!!!!! ",
- " !!!!!!!! !!!!!! !!!! !!!!!! !!!!!!! !!!! !!!! !!!! !!!!!! ",
- " !!!!!!! !!!!!! !!! !!!!!! !!!!!!! !!!! !!!! !!! !!!!!!!",
- " !!!!!!! !!!!!! !!!! !!!!!! !!!!!!! !!!! !!!!! !!!! !!!!!!",
- " !!!!!!!! !!!!!! !!! !! !!!!!! !!!!!!!! !!!! !!!! !!!! !!!!!!",
- " !!!!!!! !!!!!! !!!! !!!! !!!!!!! !!!!!!!! !!!! !!!! !!!! !!!!!",
- " !!!!!!! !!!!!!! !!! !!!!! !!!!!!!!!!!!!!!!! !!!! !!!! !!!! !!!!!",
- " !!!!!!! !!!!!!! !!!! !!!!!! !!!!!!!!!!!!!!!! !!!! !!!! !!!! !!! ",
- " !!!!!!! !!!!!! !!! !!!!!!! !!!! !!!!! !!!! !!!! !!!! !!!! !!!!",
- " !!!!!!! !!!!!!! !!! !!!!!!! !!!! !!!! !!!! !!! !!!! !!!",
- " !!!!!!! !!!!!!! !!!! !!!! !!! !!!!! !!!!! !!!! !!!! !!! !!!",
- " !!!!!!! !!!!!! !!! !!!! !!!! !!!!!!!!!!! !!!! !!!! !!!! !!",
- " !!!!!!! !!!!!!! !!!! !!!! !!!! !!!!!!!!! !!!! !!!! !!! !!",
- " !!!!!!! !!!!!!! !!!! !!!! !!!! !!!!!! !!!! !!! !!!! !!",
- " !!!!!!!! !!!!!!!! !!! !!!! !!!!! !!!!! !!!! !!! ",
- " !!!!!!! !!!!!!! !!! !!!! !!!!!! !!!!!!! !!! !!!! ",
- " !!!! !!!!!!!! !!! !!! !!!! !!! !!!!!!!!!!!!!!! !!!! !!!! ",
- " !!!!!!!!!!!! !!!!!!! !!!!!!!! !!! !!!! !!!!!!!!!!!! !!! ! ",
- " !!!!!!!!!!!!!!!! !!!!!!!! !!! !!! !!! !!! !!!!!!! !!!! ",
- " !!!!!!!!!!!!!!!!!!!! !!!!!!!! !!!! !!! !!!! !!!! !!! ",
- " !!!!!!! !!!!!! !!!! !!! !!!!!!!! !!! !!! ! ",
- " !!!!! !!!! !!!!! !!!! !!!! !!! !!!! !!! !!! ",
- "!!!!! !!!!!!!!!! !!!!! !!!! !!! !!!! !!! !!!! !!!! ",
- "!!!! !!!!!!!!!!!!!! !!!!! !!!! !!!! !!! !!! !!! !!! ",
- "!!! !!!!!!!!!!!!!!!!! !!!!!!!!! !!!! !!!! !!!! !!! !!!! ",
- "!! !!!!!! !!!!!!! !!!!!!!! !!! !!!! !!! !!!! !!!! ",
- "! !!!!! !!! !!!!!!!!!!!!! !!!! !!! !!! !!!! !!! ",
- " !!!!! !!!!!!!! !!!!!!!!!! !!! !!!! !!!! !!! !!!! ",
- " !!!!! !!!!!!!!!!! !!!!!!! !!!! !!! !!! !!!! !!!! ",
- "!!!!! !!!!!!!!!!!!!! !!!!!!! !!! !!!! !!! !!!! !!! ",
- "!!!! !!!!! !!!!!!! !!!!!!!!! !!!! !!!! !!! !!!! ",
- "!!! !!!!! !!!!!!!!!!!!! !!!!!!! !!! !!! !!!! !!!! ",
- "!! !!!!! !!!!!!!!!!!!!!!!! !!!! !!!! !!!! !!!! !!! ",
- "! !!!!!!!!!!!!!!!!!!!!!!!!!! !!!! !!! !!!! !!! !!!! ",
- " !!!!!!!!!!!! !!!!!! !!!!!!! ! !!!! !!! !!! !!! ",
- " !!!!!!!!!! !!!!! !!!!! !!! !!!! !!!! !!! ",
- "!!!!!!!!!! !!!!! !!!! !!!! !!!! !!! !!!! ",
- "!!!!!!!! !!!! !!!!! !!! !!!! !!! !!!! !!! ",
- "!!!!!!! !!!!!!! !!!! !!!! !!! !!!! !!!! !!! ",
- "!!!!!! !!!!!!!!!!! !!!! !!!! !!!! !!! !!! !!!! ",
- "! !!!! !!!!!! !!!!!! !!! !!! !!! !!!! !!!! !!! ",
- " !!!! !!!!! !!!!! !!!! !!!!!!! !!! !!!! !!!! ",
- "!!!! !!!!! !!!! !!!! !!!!!!! !!!! !!! !!!! ",
- "!!!! !!!! !! !!!! !!! !!!!!! !!!! !!!! !!! ",
- "!!! !!!! !!!!! !!! !!! !!!!! !!! !!! !!!! ",
- "!! !!!!! !!!!!!! !!! !!!! !!! !!!! !!!! !!! ",
- " ! !!!! !!!!!!!! !!! !!!! !!! !!!! !!!! ",
- " !!!! !!!!! !!! !!! !!!! !!!! !!! !!!! ",
- " !!!! !!!!! !!! !!!! !!!! !!!! !!!! !!! ",
- " !! !!!!! !!!! !!!! !!!!!!!!!!!! !!!! !!!! ",
- " !!!!! !!! !!!!! !!!!!!!!!!!!!!!! !!! ",
- " !!!!! !!!! !!!!! !!!!!!!!!!!!! !!!! ",
- " !!! !!!! !!!!! !!! !!!!! !!!! ",
- " ! !!!!! !!!!! !!!!!! !!!!! ",
- " !!!!! !!!!!!!!!!!!! !!!!!! ",
- " !!!!! !!!!!!!!!! !!!!! ",
- " !!!!! !!!!!!! !!!!! ",
- " !!!!! !! !!!!!! ",
- " !!!!!! !!!!!! ",
- " !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-symbolizer-expressions-256-256-1.0-grid-reference.json b/tests/visual_tests/grids/line-symbolizer-expressions-256-256-1.0-grid-reference.json
deleted file mode 100644
index 2f66b21..0000000
--- a/tests/visual_tests/grids/line-symbolizer-expressions-256-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-symbolizer-expressions-256-256-2.0-grid-reference.json b/tests/visual_tests/grids/line-symbolizer-expressions-256-256-2.0-grid-reference.json
deleted file mode 100644
index 2f66b21..0000000
--- a/tests/visual_tests/grids/line-symbolizer-expressions-256-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-symbolizer-expressions-all-256-256-1.0-grid-reference.json b/tests/visual_tests/grids/line-symbolizer-expressions-all-256-256-1.0-grid-reference.json
deleted file mode 100644
index 2f66b21..0000000
--- a/tests/visual_tests/grids/line-symbolizer-expressions-all-256-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line-symbolizer-expressions-all-256-256-2.0-grid-reference.json b/tests/visual_tests/grids/line-symbolizer-expressions-all-256-256-2.0-grid-reference.json
deleted file mode 100644
index 2f66b21..0000000
--- a/tests/visual_tests/grids/line-symbolizer-expressions-all-256-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line_break-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/line_break-800-800-1.0-grid-reference.json
deleted file mode 100644
index 00d5857..0000000
--- a/tests/visual_tests/grids/line_break-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,218 +0,0 @@
-{
- "keys": [
- "",
- "7",
- "3",
- "1",
- "2",
- "4",
- "5",
- "6",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " !!! ! ! !!!! !! ",
- " ! ! ! ! ",
- " ! ! ",
- " ! ! ! ! !! ! ",
- " ! !!! !! !!!!! ! ! !!!!!! ",
- " ",
- " ! !! ! ! ",
- " ! !!!!!!!!! ! ",
- " ### ### # ! ! ! ",
- " # # # # ",
- " ## # # # #### ####### #### # # # # #### #### !!!! ! !!!!!! !!!! ! ",
- " # ## # ## # # # # # # # # ## # # # # # # !! !!!! ! !! ! !!!!!!! ",
- " ## ## # # #### # # # # # ## ## # # # # # ! ",
- " # # ### # # # # # # ## ## # # # # # ! !!! ",
- " ##### ## #### # # # #### ## ## # # # #### ! !!!!! !! ! !!!!! !!!! ",
- " # ! ! !! !! ",
- " #### ! ! ",
- " !!! !!!! ! ! !! ",
- " # # !!!! !!! !!! ! !! ! ! ! ",
- " # # ",
- " # # ### ### ### !! ! ",
- " # # # # ## ## # !!! !!! ! !! !!! !!!! ! ",
- " # # # # ##### ## ! ! ! ",
- " # # # # # # ",
- " # # # # ## # # ! ",
- " ## ## ! ",
- " ",
- " ",
- " ",
- " $ % # & ' ( ! ) * + ",
- " ",
- " ",
- " ",
- " # # # # ## ) ) ) ) ",
- " ######## # ##### # ### # # ### ##### # ####### ####### ## )))))))) ))))) )) ))) ) ) )))) ))))) ))))) ) ",
- " ### ## ## ######## ### ### #### ## ## # ###### # ######## ####### ### # ))))))))) ) )))))) ))) )) )))) )) ))) )) )))))))) )))))))) ",
- " ",
- " # ## ### # # #### # # # ###### # ## # ## ## # # # ## ### # ## ## #### ### ) )))) ))) ) ) )))) )) ) ) )) ) ) ) ) ) ) ))))) ) )))) )) ) ))))) ) ",
- " ## ###### ####### # ## #### # ### # # # ##### ###### # ## # ))))) ) )) ) )))) )) ))) )) ) )) ) ) )) ))))))) )) )) ) ))) ) ",
- " # ) ) ",
- " ## # # # # ## # ) ) ) ) ) ) ) ) ",
- " ##### # # ### ### # # # # ## ## ### ## # # ###### )))))) ) )))))) ) )))) ))) )))) ) ) )))) )) ) ))) ) ) ",
- " ##### #### # #### ## # ########## # ## # ### # # ### # # ## ######### # # )))))))) )))))))) )) ))) ) ) ) ) ))))) )))))))) ))))))) ))))) ",
- " ",
- " ## ## # ## # # # # ####### # ############ # #### # ## ## #### # ## # ##### ) ) ))))) ))) ) ))))))) ) ) ))) )) ) ) ) ))) ) ) )))) ",
- " # # # # ## ## # # #### ######## ## # ## # # ## ###### )) ))))) ) )) )))) ) ) ))) )) ) ))) )) )) ",
- " # ",
- " # # ### ## ## # # # ) )) ) ) ) ",
- " ### # # # ## ## # # ## ## ## ### ### ##### # # # ## # # # ))))) ) ) ))) )) )))) ) )))) ) )))))))) ) )))))) ) ",
- " # ## ### # #### # # # ## ## #### # ####### ###### # # ## ##### ### # ## # ))))) )) )) ) )) )))))) ) )) )))) )))) ) ) ))))))) )))))))) ) ",
- " ",
- " ## # #### ### ######### ## # ### ######## # ## ###### # # ####### ###### ### )) ) ) )))) )))) ) ))) )))) ))))) )) )))))))) ))) ) ))) ) )) )))))) ",
- " # # ## ### # ## #### # # ### ####### # # # ##### ##### # ##### # ) ) ) ))) ))) ))))) ))))))))) ) )))) ))) ) ) ) ) ) )) ))) ",
- " # # ) ) ) ",
- " ## # # # # )) ) ) ) ) ) ",
- " ## #### #### ## #### # # ########## # ####### # # ## # ))) ))))))))) )) ))) )))))))) ) )))))))) ) ))))) ))))))) )) ",
- " # # #### #### ## # ###### # ######### ### ###### # # ## # # ## ## ) ) ))))))))) ) ) ) ))) )))))))) ) ))))))) ) ) ) ))))) ))))))) )))) ",
- " ",
- " # #### # ### ## # #### ## ### # ################ # #### ### # #### # ######## # ) ) )) ))))))) )))) ))))))) ) )))))))))))))) ) ) ))) )) ) ) ",
- " #### # # ### # # ### ### # # ##### ## # ### ## # # ####### ) ) )) )))))) ) )))) )))))))) ) ))) )) ) ) ",
- " # # ) ) ) ) ",
- " # # # # # ) ) ) ) ",
- " ### # ##### # # ## # # # # # ## # # # #### # # # ### ) ) )))) ))))))) )) ))) ) ) )))) ) ) )))))) ))))) ",
- " ### # #### # # # ## ### # # # # # ### # # ###### ## # # ## # ## ) ) )) )) ))))) ) )) ))) )) ) )) ) ) )))) )) ) ))) ) ",
- " ",
- " # #### ## ###### # ## ########## ## # # # ## # # # ## ######## ## # # # ))))))))))) ) ) ) ) ))))))))))))) ) ))) ) ) ))))))) ) )) ))))) ",
- " # # # ###### # ##### # # # #### ## ####### # # # # )))))) ))))) ) )))))))) )) )) ) )) )))))) ) ))))) ",
- " # # ) ) ) ",
- " # # # # # ))) )) ) ) ) ) ",
- " ## # ###### ### #### ######### # # # ### # ### ###### ## ### ) )) ))) )) ) ) )) ))) )) ) ) )) ))) ))))) )))) ) ) ))))))) ",
- " ### ####### ### ## # # ## #### # # # # # # # # # #### # # ### ) ) )) ) ) ) ) )))) ) )) ) ) )) ) )) )))) ))) ) ) ) )))))) ",
- " # ) ) ) ",
- " ###### # ## )))))) ) )) ))) ) ) )))) ) )))))) )) ) )) ) ))))))) ",
- " ## ## # )))))) ) ))) ) )))))))) ) )))))) )) )) ) )) ) ) )) ",
- " ",
- " ) ) ) ",
- " )) ) )))))) )) ))))) ) ) )))))) )) ) )) ))) ) ))))) )) ",
- " ) ) ) ) ) ",
- " )) ) ",
- " ) )))) )))) ) ) ) ",
- " ))))) )))))) ) ) )) ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/line_break-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/line_break-800-800-2.0-grid-reference.json
deleted file mode 100644
index 215f035..0000000
--- a/tests/visual_tests/grids/line_break-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,218 +0,0 @@
-{
- "keys": [
- "",
- "3",
- "1",
- "2",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!! !!!!!!! !! ",
- "!!!!! !! ! !! ",
- " !! ! ! ",
- " !! !! !! ! ! !!! !! !! ",
- " !! !! !! !!!!!! !!!!!!!!!!!! ! !!!!!!! !! !!! !! !! !!!!!!!! !!!!!!!! ",
- " !!! !! !! !! !! !!! ! ! !! !!! !! !!! !! !! !!! !! !! !!! ",
- " !! !! !! !! !! !! ! ! !! !! !! ! ! ! !! !! !! !! !! ",
- " !! !! !! !! ! !! ! ! !! !! !! !! !! !! !! !! !! !! !! ",
- " !!! !! !! !!!!!!!!! !! ! ! !! !! !! !! !! !! !! !! !! !! !! ",
- " !! !! !! !! !! ! ! !! !! !! !! !! !! !! !! !! !! !! ",
- " !! !!!! !! !! ! ! !! !! !! ! !!! !! !! !! !! !! ",
- " !! !!!! !! !! ! ! !!! !!! !!! !!! !! !! !! !! !!! ",
- "!!!!! !!!! !!!!!!!! !! ! ! !!!!!!! !!! !!! !! !! !! !!!!!!!! ",
- "!!! !! !!!!! !! ! ! !!!!! !! !!! !! !! !! !!! !! ",
- " !! ",
- " ! !! ",
- " !!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " !! !! ",
- " !! !! ",
- " !! ",
- " !! !! !! !!!! !!!! !!!! ",
- " !! !! !!!!!!!! !!!!!!! !!!!!!! ",
- " !! !! !!! !! !!! !!! !! ",
- " !! !! !! !! !! !! !! ",
- " !! !! !! ! !!!!!!!!! !!!! ",
- " !! !! !! ! !!!!!!!!! !!!!!! ",
- " !! !! !! ! !! !!! ",
- " !! !! !! ! !! !! ",
- " !! !! !! ! !!! ! ! !! ",
- " !! !! !! ! !!!!!!!! !!!!!!! ",
- " !!!! !!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " # $ ! % & ' ( ) * + ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ! ! ! ) ) ) ",
- " ! ! ! ! ! ) ! ) ) ) ) ",
- " ! ! ! ! ! ! !!! ! ! ! !! ! !!!!! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !) ) ) ) ) ) ) ) ) ! ) )!) )!)!)!)!) ) )) ) ) ) ))) ) ) ) ) ) )) ) ) ) )) ) ) ) ) ) ) )) ) ",
- "! ! ! ! ! ! ! !! !! !! !! ! !!!! !!!! ! ! ! !! ! !! !!! ! !!! ! !) ) ) )!))) ) ) ) ! )!!!)) )!) )!)!) ) )) )) )) )) ) ))) ) )))))) ) ) )) ) )) ))) ) ))",
- "! ! ! ! ! ! !!!!!! ! !!!! ! ! ! !!!! !!!! !! ! !!!! ! ! !! ! ! ! !!!! !! )))) ) )!) ) ) ) ) ! )))!)) )!) )!)!) )))))) ) )))) ) ) )) ))) ) ))) )) ) ))) )) ) ) )))) ) ) ))) )",
- " ! ! ) ! ) ",
- " ",
- " ! ) ) ) )! ) ) ! ",
- " ) ! ! ) ) ) ",
- " !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !! ! ! ! !) )!)!))! !)!) )! )!)!)!)!)! ) ! ) ) ! ! ! )))) )) )) ) )) ) ) )) )) ) ) ) ) ) ) ) ) ) ) ) ) ",
- "!!! !!! !! ! !! ! ! ! ! ! ! ! ! ! !!! ! !!! !! ! ! !! !!! !))) ) )!)) ))!))!)! )!) )!!!)! ))))) ) !!! )))) ) )))))) ))))) ) ) ) )) ) )) )) ) ) ) ) ) ) ) ) ) ) ))) ",
- "!!! !!! !! !!! !! !!! ! ! !!! !!! ! ! !!! ! !!! !! !!! !!!! !!! !))) ))) ))))!) ))!))))!) )!)))! !))!) ) )!) ) !)!))) )))))) )))) ) ))) )) )))))) )))) ) )))) ))) ) ) ) ))) ))) ",
- " ) ) ",
- " ",
- " ! ! ! !! !)! ) ) ) ) ) ",
- "! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ) !) )) ! )! !)!) !) !)! ) ) )! ) ! ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )",
- " ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! !)) ))!) ) ) ! !)!!)!)!)!) ) ) ! ))! )!)!)!)! ! ! ) ) ) ) ) ) ) ) ) ) ) ) )) ) ) ) ) ) ) )) ) ",
- "!! ! ! !! ! ! ! ! ! ! ! ! ! !! !! ! ! !! ! ! ! !!! ! ! ! ! ! ! ! ! !) ))! ) ) )!)!!)!!!))) ) ))!!)) !))) !)! !!! ) ) ) ) ) ) ) ) ))) )) ) )) ) ) ) )) ) ) ) ) ) )) )) )",
- "!! ! !!! !! !!!!! !!! ! ! ! !!!!!! !! !!! !! ! !!!!! !!! !!! ! !!! !!! !!!)))!))) ) !) )))!!)! !))) ) )!))))!!)))! !)!)))! ) ) ))) ) ))) ))) ))) )) ) ))) )) ))))) )) ) ) ) ))))))))) )",
- " ! ) ",
- " ",
- " !! ! ! !!) ! ! )) ) ) ) ",
- "!! !! !! ! ! ! !! !! !! ! ! ! ! ! ! !! !!!! ! !! ! !!! ! ! ! !! ! ! )) ! ) ))!)!) ))!)))!) !! ) )!))!)! )) )) ))) ) )) )) ) ) )) ) )) ) ) ) ) ) ))) )) )) ) )) ) ",
- "! ! !! ! ! ! ! !! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !! ! !! )! ) ) )!)!)! !!) )!)! !!))))!)!)! ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )) )",
- "! !! ! !! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !! ! ! !! ) )! ) ) )!)!)) !) )! ! )!!) !)! ) ) ) ) ) ) ) ) ) )) ) ) ) ) )) ) ) ) ) ) )) ) ) ) ) )",
- "! ! !!!!!! !! !!! !! !! !! ! !!!! !!! ! ! !!!!! ! ! ! ! ! !!!! !!! !!!!!! )))! ) )))!)))!))!) )!! )!!!)! )))!)! !)) ) ) ))))) )) ))) ))) ))) ) ) ) ) )))) ))) ) ) )) ) ) ))) )) )",
- " ) ) ",
- " ",
- " ! ! ! ! !! !! ) ! ! )! ) ! ! ! ! ))) ) ) ) ",
- "! !!! ! !! ! ! !!!!!! !! !! !! !! !! !! ! ! ! !! !!! ! ! !!!! !! )) ) )) ))) )!!))!))!)))) ) ))!) !! ))))!))!!!)!!)) ) )) ) )) ) )) )) )) )) )) ) ) ) ) ))) )) )) ) ",
- " !! ! ! !! ! ! ! ! ! ! !! ! ! !! ! !! !! ! !! !! ! ! ) ! )!)!)) )!!) ) ) ) )!) ) )!) ) ) ) ) ) ) ! )) )) ))) ) ) ) ) ) ) )) ) ) ) ) ) ) ) ) ) ) )",
- " ! !! ! !! ! ! ! ! ! ! ! !! ! !! ! !! !! ! !! !! ! ! ) !!)! ! ) !)) ! )!) )!) ) ) )!) ! ) ) ) ) ! ))! ) )) ) ) )) ) ))) ) ) ) ) ) ) ) ) ) ) ",
- "!!! ! ! !! ! !!! !!!!! !!! ! !!! !! !!! !! ! ! ! !! ! ! !!! !!!! ! ! ))!)!)))) !!!)!))!) )!))))) )!)!)!! !!) ) )))!! )!)) )))))) ) ) ))) ) ))) ))) )))))) )) ))) ))) ))) ))) ) ) ) )",
- " ! ! ! !!! ",
- " ",
- " ! ! ) ) !! ) ! ) )! ) ) ) ) ) ) ) ) ",
- " !! !!!!!! !! !! !!! ! ! !! ! ! !! !!! ! ! !!! ! !! !! ! !! !! ! !)!!) ))!) !!)))!))!!)) ))! !)) )) !))!)) )!)! )) !)) ) ) ) )) ) ) ) )) )) )) ))) )) )))))) ))) ))) ))) )) ",
- "! ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !! !! ! ! ! ) )) ) ) ))! ) )! ) ! ! )! !)! ) !)) )! ) !! ) )) ) ) ) ) ) ) ) )) ) ) ) ) ) ) ) ) ) ) ) ) ) ",
- "! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! !! ! ! !! ! ! ! ! )) ) ! ) ! ))! ) )) !) ! )! ) !!! !)) !)) )! ) ) )) ) ) ) )) ) ) )) ) )) ) ) ))) ) ) ) ) ) ) ) ",
- " !! ! ! !!!!! !! !!! !!! !!! !!! !! !!! !!! ! !!! !! !!! ! !! !!! !!! !)! ))!) ))) )!)))!)) ))! !)) )) !)))!)) )!)! !))!!))!))) )) ) ) ) )) ))) ) )) )) )) ))) )) )))))) ))) ) ) ))) )) ",
- " ! ! ! ! ) ) ))) ",
- " ",
- " ! ! ! ! ! ))) ! ) ) ! ! ) )) ",
- " ! !! !! !! !! !! !!!! !! !! !! !! !! !! !!! !! !!!!!! ! ! !! ) ) ))!) )) )))))) ))!)) ))) ) ) ))!!!)!) ))! ))) ) ) ))) ))) ))) )) )) )) ) ) )) )) ))) ))) )))) ) ) )) )) ",
- "! ! ! ! !! !! ! !! ! ! ! ! ! ! ! ! ! !! ! !! ! ! !! ))))! )! ) !)!)!)!)!) ) ) ) ) ))! )! ) )!) ) ) ) ) ) ) )) ) )) )) ) ) ) ) ) ) ) ) ) )) )) ) ) ) ",
- " ! ! !! !! !! ! ! ! ! ! ! ! ! !! ! ! !! ) !)! )! ) !)!)!)!)! !) ) ) ) ))! ! ) )!) ) ) ) ) ) ) ) ) ) )) ) ) ) ) ) ) ) ) ) ) )) )) ) )) ))",
- "! ! !!! ! ! !!!!!! !!! !! !! !!! !! ! ! ! !!!! !! !!!! ! ! ! !! )!! ))!)! ))!)!)!)) ))!)) ))) ))) ))) !))) )) ))) ))) ) )) )) ))) ) ) ))) )) ))) ))) )) ))) ))) )))) ))) )) )) ",
- " ! !! ! ! ) ) ) ) ",
- " ",
- " !!! ! ! ! )))) !! ! )!) !) ! ) ) )) ",
- " !! !!!!! !! !! !!! ! ! ! !! !! !! !!! !!! ! !! !! !! !!! !!!!!! !! !!!!!!! )) !))) )))))! )) !))!)!)!))!)))!))!))!))!))) ) ) )) )) ) )) ))))) )) ))))))) ) ))))) )) ))) ) ) ))) ",
- "! !! ! !! !! ! !!! ! !!! ! !! !! ! ! ! !! !! ! ! ! ! ! ! ! ! ! )) ) !))!) )!)! )!))! ))!)) !)) )!) )!!!) )!) ) ) ) ) ) )) ) ) ) ) ) ) ) ) ) )) ) ) ) ) )) ",
- "! !! ! !! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ) ) )!) )!)! )!))! !)!)) ! ) )!) ) !! )) ) ) ) ) ) ) ) )) ) ) ) ) ) ) ) ) )) ) ) ) ) ) ) ",
- " !! ! !! !!!! ! ! !!! !!!!!! !! !! ! ! !!! !!!!!!! !!! !!! !!! !! !! ! ! !)))!) !))) )!)!)! ))! ))!)!)!)) )!) ))!)) ))!!)) ))) ))) )) ) )))) ) )) ) ) ))))) ) ) ) )) ))) ))) ))) ) ",
- " ! ! ! ) ))) ",
- " ",
- " ! !! ! ! ! !! ! ! ! !) ! ! ) ) ) ))) ) )",
- " ! !!! !! !!!!! ! !!! !! !!! !!!!!! !!! !!!!!!! !! ! !! ! !!! !!!! !!!! ! )))!) )!))!)) ))!))!!))) ))))))))) !!) ) ) )) )))) )) )) )))))) )) ))) )))) ) ) ) )) ))) )) ))) ))) )",
- " ! ! ! !! ! ! ! ! ! !! ! ! !! ! ! ! ! !! ! !! ! !! ! ! ! !)) ) ))! !) ) )!)! ! ))!) )!)!) )!! ) ) ) ))) ) )) )) ) ) )) )) )) ) ))) ) )) )) ) ) ) )",
- " ! ! !! ! ! ! ! !! ! ! ! !! ! ! ! !! ! ! !! !! ! ! ! ! ! ) )!) ) ! !) ) )!)! !)!)!) )!)!)! ! ) ) ) ) ) ) )) )) ) ) ) )) ) ) ) ) ) )) ) ) ) ) )",
- "!! !! !! ! !! ! ! ! !! !!! !! !!! !!! ! ! !!! !! ! !! ! ! ! ! !! !! ! ! )))!)))!)) ))!))!)! ! )) )!)!)) ))!! ))) ) ))) ) ) )) )) ) )) )))) )) ) ))) )))))) )) )))) ) ))) )",
- " !!! !!! ) ) ",
- " ",
- " ! ! ! ! ) ) ) )))!!! ) ) )",
- "!! !!! !!!!! !! !!! !!! !! !! ! ! !!!!! !! ! ! !!! !! !!! ! !! !!! ))!!)) ))!)) )))!))) !! ) !))!))) !!) ))! !) ))) ) )))))) )))))) )) )) ))) )) )) )))))) ) ) ))) )) )) )) )",
- "!! !! ! ! ! ! ! ! ! !!! !! ! ! ! ! ! !! ! ! ! ! !!! ! ! ! ! !!))! ) ))) ) ) ) ) ! )))))))) )!! ) ))! ) ) ) ) ) ))) ))) )) ))) ))) ) )) ) ) ) ) ))) ) )) ) )",
- "!! ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! )!))!) ) ) ! ) ) ) ) ! )) !) )!! ))!) !) ) ) ) ) ) ) ) ) ) ) ) )) ) ) ) ) ) )) ) )",
- "! ! !!! ! ! ! ! !!! !! ! !! !! ! ! ! ! ! ! !! ! ! !! !! !!! !! !! ))!!)) !)!))!) ) ))) )! !)) !)) )) ! !) !))!) )) ))) ))))) )) )) ))) )) )) )) ) )) )) )) )) )) ) )) )",
- "! ! ) ) ",
- " ",
- " ! ! ! ! ! ) ) ) ) ) ! ) ) ) ) )",
- "! !!! !!! !!! !! ! !!! ! !! !! !! !!!!! ! !! ! !!! !!! !! !! !! !))!))) ))) !))))!)!)) !) !))))!) !)) !)!))) ))!) ) ) ))) ))) )) ) ))))))))) ))) )) )) ))) ))) ))))) )) )) )) )",
- " ! ! ! ! ! ! ! ! ! ! !! ! !!! ! ! ! ! ! ! ! ! ! !!!! !!!))!))) ! ) !)! ! )))! !!)) )))!) !) !)!))) !!) ) ) )) )) ) ) ) ) ))) )))))) )) ) ) )))))))) )) )",
- " ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! !! ! ! ! ! ! ! ! !! !! !) ) ) ) !)! )! ) ! )) )! ) !) !)!)!) ) !) ) ) ) ) ) ) ) ) ) ) ) )) ) ) ) ) ) ) ) ) ) )",
- " !! ! ! ! ! ! ! ! !! ! !! ! ! ! ! !! ! !!! ! !! !!! ! ! !)) ))) !!) !) )!)!)) !!)! )) ) ! ) )!))) )! )) ) )) )) )) ) ) ) )) )) ) )) ) )) ) )) )) ) ) )",
- " ! )) )) ",
- " ",
- " ! ! ! ! ) ) ) )) ) )) )))) ",
- " !! !!! !! !!! !!! ! ! !! ))) ) ))) )) ))) ))) ) )))) )) ) )))) ))) )) ) ) ))) )))) ))) )))) )) )))) ) ) ))) )))",
- " ! ! ! !! ! ! ! ! ! !!!!! ) ) )))))) ) ) ) ) ) ) )) )) ) ))))) ) ) )) )) ) ) )) ) ))) ) ) ) ) )",
- " ! ! ! ! ! ! ! ! ! ) ) ) ) )) ) ) ) ) ) ) ) ) )) ) )) ) ) ) ) ) )) )) ) ) ) )) ) ) ) ) ) ) ) ) ) ) )",
- " !! !! !! ! ) ) )) ) )) ) )) )) ) ) ) ) ) ) ) ) ) ",
- " ! ",
- " ",
- " ) ) ) ) ",
- " ))) )) )))) ) ))))) )) ))) ))) ))) ))) ) )) )) ))) ) )) )) )) ))))) ) ) )) ) ) ))))))) )))))) ))) )))))) )) )",
- " )))) ) ) ) ) ) ) )) ))) ) ) ) ) )) )) ) ) )) )) ))))) ) ) )) )) ) ) ) ) ) ))) ) )))))) ))",
- " ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )) ) ) ) ) ) )) ) ) ) ) )) ) ) ) ) ) ) ) ) ) ) ) ) ))",
- " ) ) ) ) ) ) ) ) ",
- " ) ",
- " ",
- " )) ) "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-1-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/lines-1-200-200-1.0-grid-reference.json
deleted file mode 100644
index fa9252c..0000000
--- a/tests/visual_tests/grids/lines-1-200-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "1",
- "4",
- "2",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! ! ",
- " ############################################# ",
- " ############################################# ",
- " ############################################# ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " '' '' (((((((((( ))))))) ",
- " ''''''' (((((((((( )))))))) ",
- " ''''''''' (((((((((( )))))))) ",
- " '''' '''' )))) )))) ",
- " ''' ''' ))) )))) ",
- " '''' '''' )))))))) ",
- " '''''''' ********** )))))))) ",
- " ''''''' ********** )))))) ",
- " ''' ********** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-1-200-200-2.0-grid-reference.json b/tests/visual_tests/grids/lines-1-200-200-2.0-grid-reference.json
deleted file mode 100644
index 47ab14a..0000000
--- a/tests/visual_tests/grids/lines-1-200-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "9",
- "1",
- "4",
- "2",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ############################################# ",
- " ############################################# ",
- " ############################################# ",
- " ############################################# ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " &&&&&&&&&&& '''''''''' ((((((((((( ",
- " &&&&&&&&&&& '''''''''' (((((((((((( ",
- " &&&&&&&&&&&&& '''''''''' (((((((((((( ",
- " &&&&&&&&&&&&& '''''''''' (((((((((((( ",
- " &&&&&&&&&&&& )))))))))) (((((((((((( ",
- " &&&&&&&&&&& )))))))))) (((((((((( ",
- " &&&&&&&&&&& )))))))))) (((((((((( ",
- " &&&&&&&&& )))))))))) ((((((((( ",
- " &&&&&&& )))))))))) (((( ",
- " & )))))))))) ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-1-400-400-1.0-grid-reference.json b/tests/visual_tests/grids/lines-1-400-400-1.0-grid-reference.json
deleted file mode 100644
index d3dbdbd..0000000
--- a/tests/visual_tests/grids/lines-1-400-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,117 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " # # # # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $ ",
- " ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ",
- " ",
- " ",
- " '''''' ",
- " ((((( ))))))))))))))))))) ''''''''''' ",
- " ((((((((((( ))))))))))))))))))) '''''''''''' ",
- " (((((((((((( ))))))))))))))))))) ''''' ''''' ",
- " ((((( ((((( '''' '''' ",
- " ((( ((( ''' '''' ",
- " (((( (((( '''' ''' ",
- " ((( ((( '''' '''' ",
- " ((( ((( ''' ''' ",
- " (((( (((( ''' '''' ",
- " ((( (((( '''' '''' ",
- " (((( (((( '''''''''''' ",
- " ((((((((((((( ''''''''''' ",
- " ((((((((((( ******************* '''''''' ",
- " (((((((( ******************* ''' ",
- " ((( ******************* ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-1-400-400-2.0-grid-reference.json b/tests/visual_tests/grids/lines-1-400-400-2.0-grid-reference.json
deleted file mode 100644
index 218340f..0000000
--- a/tests/visual_tests/grids/lines-1-400-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,117 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "1",
- "4",
- "2",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !! !! ! !! ",
- " ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ' ' ((((((((((((((((((( ))))) ))) ",
- " '''' '''' ((((((((((((((((((( ))))))))))))) ",
- " ''''''''''''' ((((((((((((((((((( )))))))))))))) ",
- " ''''''''''''''' ((((((((((((((((((( )))))))))))))))) ",
- " ''''''''''''''' ((((((((((((((((((( )))))))))))))))) ",
- " '''''''''''''''' ((((((((((((((((((( ))))))))))))))))) ",
- " ''''''''''''''''' ((((((((((((((((((( ))))))) ))))))) ",
- " ''''''' '''''' ))))))) ))))))) ",
- " ''''''' ''''''' )))))) ))))))) ",
- " ''''''' ''''''' ))))))) ))))))) ",
- " '''''' ''''''' )))))))) ))))))) ",
- " '''''''' ''''''' )))))))))))))))) ",
- " ''''''''''''''''' ******************* )))))))))))))))) ",
- " ''''''''''''''' ******************* ))))))))))))))) ",
- " ''''''''''''''' ******************* )))))))))))))) ",
- " '''''''''''''' ******************* ))))))))))) ",
- " ''''''''''' ******************* )))))) ",
- " ''''''' ******************* ) ",
- " ' ******************* ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-1-600-600-1.0-grid-reference.json b/tests/visual_tests/grids/lines-1-600-600-1.0-grid-reference.json
deleted file mode 100644
index 33930ab..0000000
--- a/tests/visual_tests/grids/lines-1-600-600-1.0-grid-reference.json
+++ /dev/null
@@ -1,167 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ## ## # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$ $$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " % % % % % ",
- " ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " && && & & ",
- " ",
- " ",
- " ",
- " ",
- " '''' ",
- " ( ''''''''' ",
- " ((((((( )))))))))))))))))))))))))))) '''''''''''''' ",
- " ((((((((((( )))))))))))))))))))))))))))) ''''''' '''''''' ",
- " ((((((((((((((( )))))))))))))))))))))))))))) ''''' ''''' ",
- " (((((( (((((( ''' ''' ",
- " (((( (((( '''' '''' ",
- " ((( (((( ''' ''' ",
- " (((( ((( '''' '''' ",
- " ((( ((( '''' '''' ",
- " (((( (((( ''' ''' ",
- " ((( ((( '''' ''' ",
- " ((( (((( '''' '''' ",
- " (((( ((( ''' ''' ",
- " ((( (((( '''' '''' ",
- " (((( ((( ''' ''' ",
- " (((( (((( ''''' ''''' ",
- " (((( ((( ''''''' ''''''' ",
- " (((((( (((((( ''''''''''''''' ",
- " (((((((((((((((( '''''''''' ",
- " (((((((((((( **************************** ''''' ",
- " (((((((( **************************** ",
- " ((( **************************** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-1-600-600-2.0-grid-reference.json b/tests/visual_tests/grids/lines-1-600-600-2.0-grid-reference.json
deleted file mode 100644
index d456d64..0000000
--- a/tests/visual_tests/grids/lines-1-600-600-2.0-grid-reference.json
+++ /dev/null
@@ -1,167 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$ $$$ ",
- " ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ",
- " ",
- " ",
- " ''' '' ",
- " ( ( '''''''''''' ",
- " ((((( ((( )))))))))))))))))))))))))))) ''''''''''''''''' ",
- " (((((((((((((( )))))))))))))))))))))))))))) ''''''''''''''''''' ",
- " (((((((((((((((((( )))))))))))))))))))))))))))) ''''''''''''''''''' ",
- " ((((((((((((((((((( )))))))))))))))))))))))))))) '''''''''''''''''''' ",
- " (((((((((((((((((((( )))))))))))))))))))))))))))) ''''''''' ''''''''' ",
- " ((((((((((((((((((((( )))))))))))))))))))))))))))) ''''''' ''''''' ",
- " (((((((( (((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( (((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " (((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( '''''' ''''''' ",
- " ((((((( ((((((( '''''''' '''''''' ",
- " ((((((( ((((((( ''''''''''''''''''''' ",
- " (((((((((( (((((((((( ''''''''''''''''''' ",
- " (((((((((((((((((((( **************************** ''''''''''''''''''' ",
- " ((((((((((((((((((( **************************** ''''''''''''''''' ",
- " ((((((((((((((((((( **************************** ''''''''''''' ",
- " (((((((((((((((( **************************** ''''''''' ",
- " ((((((((((( **************************** '''' ",
- " (((((( **************************** ",
- " ( **************************** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-1-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/lines-1-800-800-1.0-grid-reference.json
deleted file mode 100644
index b0febb6..0000000
--- a/tests/visual_tests/grids/lines-1-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,217 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " ### # ## # # # # ## ### ## ### # # # # # # ### # # # # ## ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $ $$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " % % % % % ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " & && & && & & && & & & & &&& & &&& && & & &&& && & &&& && & & && && & & & && & & & && & & & & &&& ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " '' ",
- " ''''''' ",
- " ( '''''''''''' ",
- " ((((((( )))))))))))))))))))))))))))))))))))))) ''''''''''''''''' ",
- " (((((((((((( )))))))))))))))))))))))))))))))))))))) '''''''' '''''''' ",
- " ((((((((((((((((( )))))))))))))))))))))))))))))))))))))) '''''' '''''' ",
- " (((((((( (((((((( '''' '''' ",
- " (((((( (((((( '''' '''' ",
- " (((( ((((( ''' ''' ",
- " (((( ((( '''' ''' ",
- " (((( ((( ''' '''' ",
- " ((( (((( '''' ''' ",
- " (((( ((( ''' '''' ",
- " ((( (((( '''' '''' ",
- " (((( (((( ''' ''' ",
- " ((( ((( '''' '''' ",
- " (((( (((( '''' ''' ",
- " (((( ((( ''' '''' ",
- " ((( (((( '''' '''' ",
- " (((( ((( '''' '''' ",
- " ((( (((( ''' '''' ",
- " ((( (((( '''' '''' ",
- " (((( (((( '''''' '''''' ",
- " (((( (((( '''''''' ''''''' ",
- " (((((( ((((( ''''''''''''''''' ",
- " (((((((( (((((((( ''''''''''''' ",
- " (((((((((((((((((( '''''''' ",
- " (((((((((((( ************************************** ''' ",
- " (((((((( ************************************** ",
- " ((( ************************************** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-1-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/lines-1-800-800-2.0-grid-reference.json
deleted file mode 100644
index 0f944e8..0000000
--- a/tests/visual_tests/grids/lines-1-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,217 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " # # # # ",
- " ### ### ## # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $ $ ",
- " $ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " ",
- " ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " '' ' ",
- " ''''''''''' ",
- " ((( (( '''''''''''''''' ",
- " ((((( (((( )))))))))))))))))))))))))))))))))))))) '''''''''''''''''''' ",
- " ((((((((((((((( )))))))))))))))))))))))))))))))))))))) ''''''''''''''''''''''' ",
- " (((((((((((((((((((( )))))))))))))))))))))))))))))))))))))) ''''''''''''''''''''''' ",
- " (((((((((((((((((((((( )))))))))))))))))))))))))))))))))))))) '''''''''''' '''''''''''' ",
- " (((((((((((((((((((((((( )))))))))))))))))))))))))))))))))))))) ''''''''' '''''''''' ",
- " ((((((((((( ((((((((((( )))))))))))))))))))))))))))))))))))))) ''''''' ''''''' ",
- " (((((((((( ((((((((( ''''''' ''''''' ",
- " ((((((( (((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' '''''' ",
- " ((((((( (((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' '''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( (((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( '''''' ''''''' ",
- " (((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( '''''''' ''''''' ",
- " ((((((( ((((((( ''''''''' ''''''''' ",
- " ((((((( ((((((( ''''''''''' ''''''''''' ",
- " ((((((((( ((((((((( '''''''''''''''''''''''' ",
- " ((((((((((( (((((((((((( '''''''''''''''''''''' ",
- " ((((((((((((((((((((((( ************************************** '''''''''''''''''''' ",
- " ((((((((((((((((((((((( ************************************** ''''''''''''''' ",
- " (((((((((((((((((((( ************************************** ''''''''''' ",
- " (((((((((((((((( ************************************** '''''' ",
- " ((((((((((( ************************************** ' ",
- " (((((( ************************************** ",
- " (( ************************************** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-2-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/lines-2-200-200-1.0-grid-reference.json
deleted file mode 100644
index 31a452b..0000000
--- a/tests/visual_tests/grids/lines-2-200-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "1",
- "4",
- "2",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! ! ! ! ",
- " ############################################# ",
- " ############################################# ",
- " ############################################# ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " '' '' (((((((((( ))))))) ",
- " ''''''' (((((((((( )))))))) ",
- " ''''''''' (((((((((( )))))))) ",
- " '''' '''' )))) )))) ",
- " ''' ''' ))) )))) ",
- " '''' '''' )))))))) ",
- " '''''''' ********** )))))))) ",
- " ''''''' ********** )))))) ",
- " ''' ********** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-2-200-200-2.0-grid-reference.json b/tests/visual_tests/grids/lines-2-200-200-2.0-grid-reference.json
deleted file mode 100644
index 47ab14a..0000000
--- a/tests/visual_tests/grids/lines-2-200-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "9",
- "1",
- "4",
- "2",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ############################################# ",
- " ############################################# ",
- " ############################################# ",
- " ############################################# ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " &&&&&&&&&&& '''''''''' ((((((((((( ",
- " &&&&&&&&&&& '''''''''' (((((((((((( ",
- " &&&&&&&&&&&&& '''''''''' (((((((((((( ",
- " &&&&&&&&&&&&& '''''''''' (((((((((((( ",
- " &&&&&&&&&&&& )))))))))) (((((((((((( ",
- " &&&&&&&&&&& )))))))))) (((((((((( ",
- " &&&&&&&&&&& )))))))))) (((((((((( ",
- " &&&&&&&&& )))))))))) ((((((((( ",
- " &&&&&&& )))))))))) (((( ",
- " & )))))))))) ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-2-400-400-1.0-grid-reference.json b/tests/visual_tests/grids/lines-2-400-400-1.0-grid-reference.json
deleted file mode 100644
index 3aa8933..0000000
--- a/tests/visual_tests/grids/lines-2-400-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,117 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ",
- " ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ",
- " ",
- " ",
- " '''''' ",
- " ((((( ))))))))))))))))))) ''''''''''' ",
- " ((((((((((( ))))))))))))))))))) '''''''''''' ",
- " (((((((((((( ))))))))))))))))))) ''''' ''''' ",
- " ((((( ((((( '''' '''' ",
- " ((( ((( ''' '''' ",
- " (((( (((( '''' ''' ",
- " ((( ((( '''' '''' ",
- " ((( ((( ''' ''' ",
- " (((( (((( ''' '''' ",
- " ((( (((( '''' '''' ",
- " (((( (((( '''''''''''' ",
- " ((((((((((((( ''''''''''' ",
- " ((((((((((( ******************* '''''''' ",
- " (((((((( ******************* ''' ",
- " ((( ******************* ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-2-400-400-2.0-grid-reference.json b/tests/visual_tests/grids/lines-2-400-400-2.0-grid-reference.json
deleted file mode 100644
index 3fc3cc1..0000000
--- a/tests/visual_tests/grids/lines-2-400-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,117 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "1",
- "4",
- "2",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !! ! ! !! ! ! ! ",
- " ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ' ' ((((((((((((((((((( ))))) ))) ",
- " '''' '''' ((((((((((((((((((( ))))))))))))) ",
- " ''''''''''''' ((((((((((((((((((( )))))))))))))) ",
- " ''''''''''''''' ((((((((((((((((((( )))))))))))))))) ",
- " ''''''''''''''' ((((((((((((((((((( )))))))))))))))) ",
- " '''''''''''''''' ((((((((((((((((((( ))))))))))))))))) ",
- " ''''''''''''''''' ((((((((((((((((((( ))))))) ))))))) ",
- " ''''''' '''''' ))))))) ))))))) ",
- " ''''''' ''''''' )))))) ))))))) ",
- " ''''''' ''''''' ))))))) ))))))) ",
- " '''''' ''''''' )))))))) ))))))) ",
- " '''''''' ''''''' )))))))))))))))) ",
- " ''''''''''''''''' ******************* )))))))))))))))) ",
- " ''''''''''''''' ******************* ))))))))))))))) ",
- " ''''''''''''''' ******************* )))))))))))))) ",
- " '''''''''''''' ******************* ))))))))))) ",
- " ''''''''''' ******************* )))))) ",
- " ''''''' ******************* ) ",
- " ' ******************* ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-2-600-600-1.0-grid-reference.json b/tests/visual_tests/grids/lines-2-600-600-1.0-grid-reference.json
deleted file mode 100644
index 7c5a0f0..0000000
--- a/tests/visual_tests/grids/lines-2-600-600-1.0-grid-reference.json
+++ /dev/null
@@ -1,167 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ## # ## # # # # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$ $ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " ",
- " ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " '''' ",
- " ( ''''''''' ",
- " ((((((( )))))))))))))))))))))))))))) '''''''''''''' ",
- " ((((((((((( )))))))))))))))))))))))))))) ''''''' '''''''' ",
- " ((((((((((((((( )))))))))))))))))))))))))))) ''''' ''''' ",
- " (((((( (((((( ''' ''' ",
- " (((( (((( '''' '''' ",
- " ((( (((( ''' ''' ",
- " (((( ((( '''' '''' ",
- " ((( ((( '''' '''' ",
- " (((( (((( ''' ''' ",
- " ((( ((( '''' ''' ",
- " ((( (((( '''' '''' ",
- " (((( ((( ''' ''' ",
- " ((( (((( '''' '''' ",
- " (((( ((( ''' ''' ",
- " (((( (((( ''''' ''''' ",
- " (((( ((( ''''''' ''''''' ",
- " (((((( (((((( ''''''''''''''' ",
- " (((((((((((((((( '''''''''' ",
- " (((((((((((( **************************** ''''' ",
- " (((((((( **************************** ",
- " ((( **************************** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-2-600-600-2.0-grid-reference.json b/tests/visual_tests/grids/lines-2-600-600-2.0-grid-reference.json
deleted file mode 100644
index 2dac93f..0000000
--- a/tests/visual_tests/grids/lines-2-600-600-2.0-grid-reference.json
+++ /dev/null
@@ -1,167 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ",
- " ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ",
- " ",
- " ",
- " ''' '' ",
- " ( ( '''''''''''' ",
- " ((((( ((( )))))))))))))))))))))))))))) ''''''''''''''''' ",
- " (((((((((((((( )))))))))))))))))))))))))))) ''''''''''''''''''' ",
- " (((((((((((((((((( )))))))))))))))))))))))))))) ''''''''''''''''''' ",
- " ((((((((((((((((((( )))))))))))))))))))))))))))) '''''''''''''''''''' ",
- " (((((((((((((((((((( )))))))))))))))))))))))))))) ''''''''' ''''''''' ",
- " ((((((((((((((((((((( )))))))))))))))))))))))))))) ''''''' ''''''' ",
- " (((((((( (((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( (((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " (((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( '''''' ''''''' ",
- " ((((((( ((((((( '''''''' '''''''' ",
- " ((((((( ((((((( ''''''''''''''''''''' ",
- " (((((((((( (((((((((( ''''''''''''''''''' ",
- " (((((((((((((((((((( **************************** ''''''''''''''''''' ",
- " ((((((((((((((((((( **************************** ''''''''''''''''' ",
- " ((((((((((((((((((( **************************** ''''''''''''' ",
- " (((((((((((((((( **************************** ''''''''' ",
- " ((((((((((( **************************** '''' ",
- " (((((( **************************** ",
- " ( **************************** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-2-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/lines-2-800-800-1.0-grid-reference.json
deleted file mode 100644
index cf372f0..0000000
--- a/tests/visual_tests/grids/lines-2-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,217 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " ## # ## # ### ### ## # # # # ## # ### # # ### ### # ### # ## # ## ## ### ## # # # # # ### ## ## ### # ### ## ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $ $ $ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " '' ",
- " ''''''' ",
- " ( '''''''''''' ",
- " ((((((( )))))))))))))))))))))))))))))))))))))) ''''''''''''''''' ",
- " (((((((((((( )))))))))))))))))))))))))))))))))))))) '''''''' '''''''' ",
- " ((((((((((((((((( )))))))))))))))))))))))))))))))))))))) '''''' '''''' ",
- " (((((((( (((((((( '''' '''' ",
- " (((((( (((((( '''' '''' ",
- " (((( ((((( ''' ''' ",
- " (((( ((( '''' ''' ",
- " (((( ((( ''' '''' ",
- " ((( (((( '''' ''' ",
- " (((( ((( ''' '''' ",
- " ((( (((( '''' '''' ",
- " (((( (((( ''' ''' ",
- " ((( ((( '''' '''' ",
- " (((( (((( '''' ''' ",
- " (((( ((( ''' '''' ",
- " ((( (((( '''' '''' ",
- " (((( ((( '''' '''' ",
- " ((( (((( ''' '''' ",
- " ((( (((( '''' '''' ",
- " (((( (((( '''''' '''''' ",
- " (((( (((( '''''''' ''''''' ",
- " (((((( ((((( ''''''''''''''''' ",
- " (((((((( (((((((( ''''''''''''' ",
- " (((((((((((((((((( '''''''' ",
- " (((((((((((( ************************************** ''' ",
- " (((((((( ************************************** ",
- " ((( ************************************** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-2-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/lines-2-800-800-2.0-grid-reference.json
deleted file mode 100644
index 76b6e32..0000000
--- a/tests/visual_tests/grids/lines-2-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,217 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $ $$ $ $ $ ",
- " $ $ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " ",
- " ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " '' ' ",
- " ''''''''''' ",
- " ((( (( '''''''''''''''' ",
- " ((((( (((( )))))))))))))))))))))))))))))))))))))) '''''''''''''''''''' ",
- " ((((((((((((((( )))))))))))))))))))))))))))))))))))))) ''''''''''''''''''''''' ",
- " (((((((((((((((((((( )))))))))))))))))))))))))))))))))))))) ''''''''''''''''''''''' ",
- " (((((((((((((((((((((( )))))))))))))))))))))))))))))))))))))) '''''''''''' '''''''''''' ",
- " (((((((((((((((((((((((( )))))))))))))))))))))))))))))))))))))) ''''''''' '''''''''' ",
- " ((((((((((( ((((((((((( )))))))))))))))))))))))))))))))))))))) ''''''' ''''''' ",
- " (((((((((( ((((((((( ''''''' ''''''' ",
- " ((((((( (((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' '''''' ",
- " ((((((( (((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' '''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( (((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( '''''' ''''''' ",
- " (((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( '''''''' ''''''' ",
- " ((((((( ((((((( ''''''''' ''''''''' ",
- " ((((((( ((((((( ''''''''''' ''''''''''' ",
- " ((((((((( ((((((((( '''''''''''''''''''''''' ",
- " ((((((((((( (((((((((((( '''''''''''''''''''''' ",
- " ((((((((((((((((((((((( ************************************** '''''''''''''''''''' ",
- " ((((((((((((((((((((((( ************************************** ''''''''''''''' ",
- " (((((((((((((((((((( ************************************** ''''''''''' ",
- " (((((((((((((((( ************************************** '''''' ",
- " ((((((((((( ************************************** ' ",
- " (((((( ************************************** ",
- " (( ************************************** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-3-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/lines-3-200-200-1.0-grid-reference.json
deleted file mode 100644
index fa9252c..0000000
--- a/tests/visual_tests/grids/lines-3-200-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "1",
- "4",
- "2",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! ! ",
- " ############################################# ",
- " ############################################# ",
- " ############################################# ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " '' '' (((((((((( ))))))) ",
- " ''''''' (((((((((( )))))))) ",
- " ''''''''' (((((((((( )))))))) ",
- " '''' '''' )))) )))) ",
- " ''' ''' ))) )))) ",
- " '''' '''' )))))))) ",
- " '''''''' ********** )))))))) ",
- " ''''''' ********** )))))) ",
- " ''' ********** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-3-200-200-2.0-grid-reference.json b/tests/visual_tests/grids/lines-3-200-200-2.0-grid-reference.json
deleted file mode 100644
index 47ab14a..0000000
--- a/tests/visual_tests/grids/lines-3-200-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "9",
- "1",
- "4",
- "2",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ############################################# ",
- " ############################################# ",
- " ############################################# ",
- " ############################################# ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " &&&&&&&&&&& '''''''''' ((((((((((( ",
- " &&&&&&&&&&& '''''''''' (((((((((((( ",
- " &&&&&&&&&&&&& '''''''''' (((((((((((( ",
- " &&&&&&&&&&&&& '''''''''' (((((((((((( ",
- " &&&&&&&&&&&& )))))))))) (((((((((((( ",
- " &&&&&&&&&&& )))))))))) (((((((((( ",
- " &&&&&&&&&&& )))))))))) (((((((((( ",
- " &&&&&&&&& )))))))))) ((((((((( ",
- " &&&&&&& )))))))))) (((( ",
- " & )))))))))) ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-3-400-400-1.0-grid-reference.json b/tests/visual_tests/grids/lines-3-400-400-1.0-grid-reference.json
deleted file mode 100644
index d3dbdbd..0000000
--- a/tests/visual_tests/grids/lines-3-400-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,117 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " # # # # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $ ",
- " ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ",
- " ",
- " ",
- " '''''' ",
- " ((((( ))))))))))))))))))) ''''''''''' ",
- " ((((((((((( ))))))))))))))))))) '''''''''''' ",
- " (((((((((((( ))))))))))))))))))) ''''' ''''' ",
- " ((((( ((((( '''' '''' ",
- " ((( ((( ''' '''' ",
- " (((( (((( '''' ''' ",
- " ((( ((( '''' '''' ",
- " ((( ((( ''' ''' ",
- " (((( (((( ''' '''' ",
- " ((( (((( '''' '''' ",
- " (((( (((( '''''''''''' ",
- " ((((((((((((( ''''''''''' ",
- " ((((((((((( ******************* '''''''' ",
- " (((((((( ******************* ''' ",
- " ((( ******************* ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-3-400-400-2.0-grid-reference.json b/tests/visual_tests/grids/lines-3-400-400-2.0-grid-reference.json
deleted file mode 100644
index 218340f..0000000
--- a/tests/visual_tests/grids/lines-3-400-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,117 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "1",
- "4",
- "2",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !! !! ! !! ",
- " ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ########################################################################################## ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ' ' ((((((((((((((((((( ))))) ))) ",
- " '''' '''' ((((((((((((((((((( ))))))))))))) ",
- " ''''''''''''' ((((((((((((((((((( )))))))))))))) ",
- " ''''''''''''''' ((((((((((((((((((( )))))))))))))))) ",
- " ''''''''''''''' ((((((((((((((((((( )))))))))))))))) ",
- " '''''''''''''''' ((((((((((((((((((( ))))))))))))))))) ",
- " ''''''''''''''''' ((((((((((((((((((( ))))))) ))))))) ",
- " ''''''' '''''' ))))))) ))))))) ",
- " ''''''' ''''''' )))))) ))))))) ",
- " ''''''' ''''''' ))))))) ))))))) ",
- " '''''' ''''''' )))))))) ))))))) ",
- " '''''''' ''''''' )))))))))))))))) ",
- " ''''''''''''''''' ******************* )))))))))))))))) ",
- " ''''''''''''''' ******************* ))))))))))))))) ",
- " ''''''''''''''' ******************* )))))))))))))) ",
- " '''''''''''''' ******************* ))))))))))) ",
- " ''''''''''' ******************* )))))) ",
- " ''''''' ******************* ) ",
- " ' ******************* ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-3-600-600-1.0-grid-reference.json b/tests/visual_tests/grids/lines-3-600-600-1.0-grid-reference.json
deleted file mode 100644
index 75b9c7f..0000000
--- a/tests/visual_tests/grids/lines-3-600-600-1.0-grid-reference.json
+++ /dev/null
@@ -1,167 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ## ## # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$ $$ $ $$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " % % % % % ",
- " ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " && && & & ",
- " ",
- " ",
- " ",
- " ",
- " '''' ",
- " ( ''''''''' ",
- " ((((((( )))))))))))))))))))))))))))) '''''''''''''' ",
- " ((((((((((( )))))))))))))))))))))))))))) ''''''' '''''''' ",
- " ((((((((((((((( )))))))))))))))))))))))))))) ''''' ''''' ",
- " (((((( (((((( ''' ''' ",
- " (((( (((( '''' '''' ",
- " ((( (((( ''' ''' ",
- " (((( ((( '''' '''' ",
- " ((( ((( '''' '''' ",
- " (((( (((( ''' ''' ",
- " ((( ((( '''' ''' ",
- " ((( (((( '''' '''' ",
- " (((( ((( ''' ''' ",
- " ((( (((( '''' '''' ",
- " (((( ((( ''' ''' ",
- " (((( (((( ''''' ''''' ",
- " (((( ((( ''''''' ''''''' ",
- " (((((( (((((( ''''''''''''''' ",
- " (((((((((((((((( '''''''''' ",
- " (((((((((((( **************************** ''''' ",
- " (((((((( **************************** ",
- " ((( **************************** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-3-600-600-2.0-grid-reference.json b/tests/visual_tests/grids/lines-3-600-600-2.0-grid-reference.json
deleted file mode 100644
index d456d64..0000000
--- a/tests/visual_tests/grids/lines-3-600-600-2.0-grid-reference.json
+++ /dev/null
@@ -1,167 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ######################################################################################################################################## ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$ $$$ ",
- " ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ",
- " ",
- " ",
- " ''' '' ",
- " ( ( '''''''''''' ",
- " ((((( ((( )))))))))))))))))))))))))))) ''''''''''''''''' ",
- " (((((((((((((( )))))))))))))))))))))))))))) ''''''''''''''''''' ",
- " (((((((((((((((((( )))))))))))))))))))))))))))) ''''''''''''''''''' ",
- " ((((((((((((((((((( )))))))))))))))))))))))))))) '''''''''''''''''''' ",
- " (((((((((((((((((((( )))))))))))))))))))))))))))) ''''''''' ''''''''' ",
- " ((((((((((((((((((((( )))))))))))))))))))))))))))) ''''''' ''''''' ",
- " (((((((( (((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( (((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " (((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( '''''' ''''''' ",
- " ((((((( ((((((( '''''''' '''''''' ",
- " ((((((( ((((((( ''''''''''''''''''''' ",
- " (((((((((( (((((((((( ''''''''''''''''''' ",
- " (((((((((((((((((((( **************************** ''''''''''''''''''' ",
- " ((((((((((((((((((( **************************** ''''''''''''''''' ",
- " ((((((((((((((((((( **************************** ''''''''''''' ",
- " (((((((((((((((( **************************** ''''''''' ",
- " ((((((((((( **************************** '''' ",
- " (((((( **************************** ",
- " ( **************************** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-3-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/lines-3-800-800-1.0-grid-reference.json
deleted file mode 100644
index 1a3a2a6..0000000
--- a/tests/visual_tests/grids/lines-3-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,217 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " ### # ## # # # # ## ### ## ### # # # # # # ### # # # # ## ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $ $$ $ $$ $ $$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " % % % % % ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " & && & && & & && & & & & &&& & &&& && & & &&& && & &&& && & & && && & & & && & & & && & & & & &&& ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " '' ",
- " ''''''' ",
- " ( '''''''''''' ",
- " ((((((( )))))))))))))))))))))))))))))))))))))) ''''''''''''''''' ",
- " (((((((((((( )))))))))))))))))))))))))))))))))))))) '''''''' '''''''' ",
- " ((((((((((((((((( )))))))))))))))))))))))))))))))))))))) '''''' '''''' ",
- " (((((((( (((((((( '''' '''' ",
- " (((((( (((((( '''' '''' ",
- " (((( ((((( ''' ''' ",
- " (((( (((( '''' ''' ",
- " (((( ((( ''' '''' ",
- " ((( (((( '''' ''' ",
- " (((( ((( ''' '''' ",
- " ((( (((( '''' '''' ",
- " (((( (((( ''' ''' ",
- " (((( ((( '''' '''' ",
- " (((( (((( '''' ''' ",
- " (((( ((( ''' '''' ",
- " ((( (((( '''' '''' ",
- " (((( ((( '''' '''' ",
- " ((( (((( ''' '''' ",
- " ((( (((( '''' '''' ",
- " (((( (((( '''''' '''''' ",
- " (((( (((( '''''''' ''''''' ",
- " (((((( ((((( ''''''''''''''''' ",
- " (((((((( (((((((( ''''''''''''' ",
- " (((((((((((((((((( '''''''' ",
- " (((((((((((( ************************************** ''' ",
- " (((((((( ************************************** ",
- " ((( ************************************** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-3-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/lines-3-800-800-2.0-grid-reference.json
deleted file mode 100644
index 8b51082..0000000
--- a/tests/visual_tests/grids/lines-3-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,217 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " # # # # ",
- " ### ### ## # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $ $ ",
- " $ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " ",
- " ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " '' ' ",
- " ''''''''''' ",
- " ((( (( '''''''''''''''' ",
- " ((((( (((( )))))))))))))))))))))))))))))))))))))) '''''''''''''''''''' ",
- " ((((((((((((((( )))))))))))))))))))))))))))))))))))))) ''''''''''''''''''''''' ",
- " (((((((((((((((((((( )))))))))))))))))))))))))))))))))))))) ''''''''''''''''''''''' ",
- " (((((((((((((((((((((( )))))))))))))))))))))))))))))))))))))) '''''''''''' '''''''''''' ",
- " (((((((((((((((((((((((( )))))))))))))))))))))))))))))))))))))) ''''''''' '''''''''' ",
- " ((((((((((( ((((((((((( )))))))))))))))))))))))))))))))))))))) ''''''' ''''''' ",
- " (((((((((( ((((((((( ''''''' ''''''' ",
- " ((((((( (((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' '''''' ",
- " ((((((( (((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' '''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( (((((( ''''''' ''''''' ",
- " ((((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( '''''' ''''''' ",
- " (((((( ((((((( ''''''' ''''''' ",
- " ((((((( ((((((( '''''''' ''''''' ",
- " ((((((( ((((((( ''''''''' ''''''''' ",
- " ((((((( ((((((( ''''''''''' ''''''''''' ",
- " ((((((((( ((((((((( '''''''''''''''''''''''' ",
- " ((((((((((( (((((((((((( '''''''''''''''''''''' ",
- " ((((((((((((((((((((((( ************************************** '''''''''''''''''''' ",
- " ((((((((((((((((((((((( ************************************** ''''''''''''''' ",
- " (((((((((((((((((((( ************************************** ''''''''''' ",
- " (((((((((((((((( ************************************** '''''' ",
- " ((((((((((( ************************************** ' ",
- " (((((( ************************************** ",
- " (( ************************************** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-4-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/lines-4-200-200-1.0-grid-reference.json
deleted file mode 100644
index 8ed6418..0000000
--- a/tests/visual_tests/grids/lines-4-200-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "12",
- "10",
- "2",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " !! ! ",
- " !!!!! !!!! !!! ",
- " !!!!!!!! !!!!!!! !!!!!! !!! ",
- " !!!!!!!!!! !!!!!!!!! !!!!!!!! !!!! ",
- " !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!! # !!!!!!!!! # !!!!!!!!! !!!!!!!! ",
- " #### !!!!!!! ### !!!!! ## !!!!!! ",
- " ###### !!! ###### !!! ##### !! ## $$$ ",
- " ########## ! ######### ######## ####$$$ ",
- " #### ##### ############ ###############$$$ ",
- " %%%## ########## ######### ######## $$$ ",
- " %%% ####### ####### ##### $$$ ",
- " %%% &&&& ##&#&& &&&&### &&&&&### $$$ ",
- " %%%&&&&&&& &&#&&& &&&&&&& &&&&&&& $$$ ",
- " %%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& $$$ ",
- " %%%&&& &&&&&&&& &&&&&&& &&&&&&& &&&&&& $$$ ",
- " %%% & &&&&& &&&&&& &&&&& &&&&& ''$$$ ",
- " %%% &&& && & '''''''$$ ",
- " %%% ((( (((( (((( ((((( '''''''$$ ",
- " %%%((((((( (((((( ((((((( (((((((''''''$$$ ",
- " %%(((((((((((((((((((((((((((((((((((( $$$ ",
- " %%%((( (((((((((((((((( ((((((( ((((( $$$ ",
- " %%% ( ((((( )((((( ((((*********** $$$ ",
- " %%% (((++ ))),,,--------************ $$$ ",
- " %%% ++++++ ))),,,--------***.*********$$$ ",
- " %%% +++++ ))),,,---.----.... ****$$$ ",
- " %%% +++++/// ))),,,............ ***$$$ ",
- " %%% +++++//////)),,,,............ ***$$$ ",
- " %%%++++////////)),,,,... 0000000 ***$$$ ",
- " %%%+++//////////),,,.... 0000000 ***$$$ ",
- " %%%+++//// //,,,... 0000**0*******$$$ ",
- " %%% /// /// .... *************$$$ ",
- " %%% /// /// .... ************ $$$ ",
- " %%% /// /// ............. *** $$$ ",
- " %%% //// /// ............ $$$ ",
- " %%% //// //// ........... $$$ ",
- " ///// ////// 111 ",
- " /////////// 1111111111111 ",
- " //////// 1111111111111 ",
- " ///// 1111111111111 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-4-200-200-2.0-grid-reference.json b/tests/visual_tests/grids/lines-4-200-200-2.0-grid-reference.json
deleted file mode 100644
index 627608c..0000000
--- a/tests/visual_tests/grids/lines-4-200-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "10",
- "14",
- "12",
- "13",
- "11",
- "2",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ! ! ",
- " !!!! !!! !! ",
- " !!!!!!!! !!!!!! !!!!!! ",
- " !!!!!!!!!! !!!!!!!!! !!!!!!!! !!! ",
- " !!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!##!!!!!!!#!# ",
- " #!!!####!!!!!!!!!#!!!!!!!!##!!!!!!!!!!# ",
- " #########!!!!!!!!!###!!!!!!#!###!!!!!!#!##$$$",
- " ##########!!!!!#######!!!!!#######!!!####$#$",
- " ###########!###########!!#################$",
- " %%%%########################################$$$",
- " %%%%&################&#####################$$$$",
- " %%%&&#&&&&##########&&&#########&&#######$$$$$$",
- " %%%&&&&&&&&#######&&&&&&######&&&&&##### $$$$$$",
- " %%%&&&&&&&&&&####&&&&&&&&####&&&&&&&&## ''$$$$",
- " %%%%&&&&&&&&&&#&&&&&&&&&&&&#&&&&&&&&&&&& '''''$",
- " %%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&'''''''''$",
- " %%%%%(&(&&&&&&&(&&&&&&&&(&&&&&&&((&&&'''''''''$",
- " %%%((((((&&&&&(((&&&&&&(((&&&&&((((&&'''''''''$",
- " %%(((((((((&((((((((((((((((((((((((('''''''''$",
- " %%%(((((((((((((((((((((((((((())))))'''''''''$",
- " %%%%((((((((((((((((((********())))))'''''''''$",
- " %%%%%((((((((((((+++((********)))))))))))))$$$$",
- " %%%%%%((((((((+++,,,,,********----))))))))))$$$",
- " %%%%%% .((((((+++,,,,,********----))))))))))$$$",
- " %%%%%%..../(//+++,,,,,********----))))))))))$$$",
- " %%%%%%...//////++,,,,,*******0000000)))))))))$$",
- " %%%%%%.////////++,,,,,,---***0000000 )))))))$$",
- " %%%%%%/////////++,,,,,,------0000000 ))))))$$$",
- " %%%%%%/////////++,,,,,,--- 0000000))))))))$$$",
- " %%%%%%//////////,,,,,,,--- 0000000))))))))$$$",
- " %%%%%%////// ///// --,--- 0000000))))))))$$$",
- " %%%%%%////// /////---------0000-))))))))))$$$",
- " %%%%%%///// /////--------------)))))))))$$$$",
- " %%%%%%////// /////--------------))))))))$$$$$",
- " %%%%%%///////////////-------------1111 $$$$$$",
- " /////////////// ------------1111 ",
- " /////////////// ----------1111 ",
- " ///////////// 1111111111111 ",
- " ////////// 1111111111111 ",
- " //////// 1111111111111 ",
- " // ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-4-400-400-1.0-grid-reference.json b/tests/visual_tests/grids/lines-4-400-400-1.0-grid-reference.json
deleted file mode 100644
index cf7f982..0000000
--- a/tests/visual_tests/grids/lines-4-400-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,124 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "10",
- "12",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " !!!! !! ",
- " !!!!!! !!!! !!! ",
- " !!!!!!!!! !!!!!!! !!!!! !! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!! !!! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!!!!!!!! !!!!! ",
- " !!!!!! !!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " !!!!! !!!!! !!!!!! !!!!!! !!!!!! !!!!! !!!!! ",
- " !!!! !!!!!! !!!!!! !!!!!! !!!!! !!!!! !!!!!! ",
- " ! !!!!! !!!!!! !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!! !!!!!!!!! !!!!!!! ",
- " # !!!!!!! # !!!!!! !!!!! ",
- " #### !!!!! #### !!! ## !!! $$$ ",
- " ####### ! ###### ! #### # $$$ ",
- " ########## ######### ####### ### $$$ ",
- " ####### ##### ###### ##### ######### ##### $$$ ",
- " ###### ###### ###### ##### ###### ##### ##### $$$ ",
- " ##### ###### ##### ###### ##### ###### ###### $$$ ",
- " %%%%#### ##### ###### ###### ##### ###### ###### $$$ ",
- " %%%% # ##### ##### ##### ###### ########## $$$ ",
- " %%%% ############ ########### ######## $$$ ",
- " %%%% ######### ######## ##### $$$ ",
- " %%%% ###### ###### ## $$$ ",
- " %%%% #### ### && $$$ ",
- " %%%% &&&& ##&&&&& &&&&&& &&&&&&& $$$ ",
- " %%%% &&&&&&&& &&&&&&&& &&&&&&&& &&&&&&&&&& $$$ ",
- " %%%% &&&&&&&&& &&&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&& $$$ ",
- " %%%% &&&&&&&&&&&& &&&&&& &&&&& &&&&&& &&&& &&&&&& &&&&& & $$$ ",
- " %%%% &&&&& &&&& &&&&&& &&&&& &&&&& &&&& &&&&& &&&&&&&&& $$$ ",
- " %%%% &&& &&&&&&&&&& &&&&&&&&&& &&&&&&&&&& &&&&&&&& $$$ ",
- " %%%% & &&&&&&&&& &&&&&&&& &&&&&&&& &&&&&& $$$ ",
- " %%%% &&&&&&& &&&&&& &&&&& &&&& $$$ ",
- " %%%% &&& & ''''' $$$ ",
- " %%%% ''''' $$$ ",
- " %%%% ''''' $$$ ",
- " %%%% ''''''''''''' $$$ ",
- " %%%% (( ((((( ((((( ((((((( ''''''''''''' $$$ ",
- " %%%% ((((((( (((((((( (((((((( ((((((((( ''''''''''''' $$$ ",
- " %%%% ((((((((( (((((((((( ((((((((((( ((((((((((( $$$ ",
- " %%%% ((((((((((( (((((( (((( (((((( ((((( (((((( (((( $$$ ",
- " %%%%(((((( ((((( (((((( (((( ((((( ((((( ((((( (((( (( $$$ ",
- " %%%% ((( ((((( ((((( (((((((((( (((((((((( ((((((((( $$$ ",
- " %%%% ( ((((((((() ((((((((( (((((((( (((((((( $$$ ",
- " %%%% ((((((()) ((((((( ((((( *** (((( $$$ ",
- " %%% (((( )))) ++++ (( ****************** $$$ ",
- " %%% )))))) ++++ ,,,, ******************** $$$ ",
- " %%% )))))) +++ ,,, --------------- ********************* $$$ ",
- " %%% ))))) +++ ,,, --------------- ***** $$$ ",
- " %%% )))))) +++ ,,, --------------- **** $$$ ",
- " %%% )))))) +++ ,,, ............... **** $$$ ",
- " %%% ))))) ++++ ,,, ...................... *** $$$ ",
- " %%% )))))) ++++ ,,,, ....................... *** $$$ ",
- " %%% )))))) +++ ,,,, ....................... *** $$$ ",
- " %%% ))))) /////// +++ ,,, .... *** $$$ ",
- " %%% )))))) //////////// +++ ,,, ... *** $$$ ",
- " %%% ))))) ///////////////+++ ,,, ... *** $$$ ",
- " %%% ))))) ////// ///////++++,,, ... 000000000000000 *** $$$ ",
- " %%%)))))) ///// ///+++,,,, ... 000000000000000 **** $$$ ",
- " %%% ))) ///// //// ,,,, ... 000000000000000 **** $$$ ",
- " %%% )) ///// ////,,,, ... *** $$$ ",
- " %%% //// /////,, ... **** **** $$$ ",
- " %%% /// //// ... *********************** $$$ ",
- " %%% /// /// ... ********************** $$$ ",
- " %%% /// /// ... ********************* $$$ ",
- " %%% /// /// .... $$$ ",
- " %%% //// /// ..... $$$ ",
- " %%% //// /// ....................... $$$ ",
- " %%% //// //// ...................... $$$ ",
- " %%% //// //// ..................... $$$ ",
- " %%% //// /// .................. $$$ ",
- " //// //// $$$ ",
- " //// ////// ",
- " //// ////// ",
- " ////////// ///// 11111111111111111111 ",
- " ////////////// 11111111111111111111111111 ",
- " //////////// 11111111111111111111111111 ",
- " //// 11111111111111111111 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-4-400-400-2.0-grid-reference.json b/tests/visual_tests/grids/lines-4-400-400-2.0-grid-reference.json
deleted file mode 100644
index 0335be4..0000000
--- a/tests/visual_tests/grids/lines-4-400-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,124 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "10",
- "12",
- "2",
- "14",
- "13",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! !! ",
- " !!!!!! !!!! !!! ",
- " !!!!!!!!! !!!!!! !!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!! !! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!! !!!!!!!!!! !!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!! ",
- " !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " !!!! # !!!!!!!!!!!!!!!!! # !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !! #### !!!!!!!!!!!!!!! ### !!!!!!!!!!!!!! # !!!!!!!!!!!!! ",
- " ####### !!!!!!!!!!!! ###### !!!!!!!!!!! #### !!!!!!!!!!! ",
- " ########## !!!!!!!!! ######### !!!!!!!! ###### !!!!!!! # $$$$$$ ",
- " ############ !!!!!!! ########### !!!!!! ######### !!!!! #### $$$$$$ ",
- " ############### !!!! ############## !!! ############ !! ##### $$$$$$ ",
- " ################## ! ################ ############## ######## $$$$$$ ",
- " #################### #################### ################# ##########$$$$$$ ",
- " ######## ########## ########### ########## ##############################$$$$$$ ",
- " %%%%%####### ########### ########## ##################### ################## $$$$$$ ",
- " %%%%%%#### ################### ################## ################ $$$$$$ ",
- " %%%%%% ## ################# ################ ############# $$$$$$ ",
- " %%%%%% ############## ############# ########## $$$$$$ ",
- " %%%%%% ############ &&########## &&&&&& ######## $$$$$$ ",
- " %%%%%% &&&&&& #######&&&& &&&&&&####### &&&&&&&&& #### $$$$$$ ",
- " %%%%%% &&&&&&&&&& ##&###&&&&& &&&&&&&&&##### &&&&&&&&&&&& ## $$$$$$ ",
- " %%%%%%&&&&&&&&&&&&& &&#&##&&&&&&& &&&&&&&&&&&&&# &&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& & $$$$$$ ",
- " %%%%%%&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&& $$$$$$ ",
- " %%%%%%&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&& $$$$$$ ",
- " %%%%%% &&& &&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&& $$$$$$ ",
- " %%%%%% & &&&&&&&&&&& &&&&&&&&&& &&&&&&&&&& &&&&&&&&&& '''''$$$$$$ ",
- " %%%%%% &&&&&&&&& &&&&&&&& &&&&&&& &&&&&& '''''''$$$$ ",
- " %%%%%% &&&&&& &&&&& && '''''''''''''''$$$$ ",
- " %%%%%% ((( ((((( '''''''''''''$$$$$$ ",
- " %%%%%% (((((( ((((((( (((((((( ((((((((( '''''''''''''''$$$$ ",
- " %%%%%% ((((((((( (((((((((( (((((((((( (((((((((((( '''''''''''''''$$$$ ",
- " %%%%%% ((((((((((( (((((((((((( ((((((((((((( (((((((((((((('''''''''''''$$$$$$ ",
- " %%%%%(((((((((((((( ((((((((((((((( ((((((((((((((( ((((((((((((((('''''''''''''''$$$$ ",
- " %%%%(((((((((((((((( (((((((((((((((( (((((((((((((((((((((((((((((((((((( $$$$$$ ",
- " %%%%%((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( (((((((((( $$$$$$ ",
- " %%%%%%(((((( ((((((((((((((((((((((((((((((((( (((((((((((((( (((((((((( $$$$$$$ ",
- " %%%%%% (((( (((((((((((((( ((((((((((((( (((((((((()()))))))))))((((( $$$$$$ ",
- " %%%%%% ( ((((((((((( (*((((((((( ((((((((()))))))))))))))))))) $$$$$$ ",
- " %%%%%% (((((((((++ ******((((((( ,,,,,,,,,,,(,,(())))))))))))))))))))) $$$$$$ ",
- " %%%%%% ((((((+++++ ******(------ ,,,,,,,,,,,,,, )))))))))))))))))))))) $$$$$$ ",
- " %%%%%% +++(+++++++ ****** ------,,,,,,,,,,,,,,, ))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% +++++++++++ ******-------,,,,,,,,,,,,,,, ))))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% ++++++++++ ******-------,,,,,,,...,............. )))))))))))))))) $$$$$$ ",
- " %%%%%% +++++++++++ *****-------,,,,,,.,,.,.,,,......... ))))))) $$$$$$ ",
- " %%%%%% +++++++++++ *****------ ........,.,..,,......... )))))) $$$$$$ ",
- " %%%%%% +++++++++//// *****------......................... )))))))$$$$$$ ",
- " %%%%%% ++++++++++///////////*****------......................... ))))))$$$$$$$ ",
- " %%%%%% ++++++++++////////////*****------......................... )))))))$$$$$$ ",
- " %%%%%% +++++++++//////////////****-------....... 000000000000000 )))))) $$$$$$ ",
- " %%%%%%+++++++++////////////////***-------...... 000000000000000 )))))) $$$$$$ ",
- " %%%%%%+++++++//////////////////***------....... 000000000000000 )))))) $$$$$$ ",
- " %%%%%%++++++///////////////////***------....... 000000000000000 )))))) $$$$$$ ",
- " %%%%%%++++++///////// //////------...... 000000000000000 )))))) $$$$$$ ",
- " %%%%%%+++++ //////// /////------...... 000000000)))000))))))))))))) $$$$$$ ",
- " %%%%%% ++ /////// //////----...... 00000000)))))))))))))))))))) $$$$$$ ",
- " %%%%%% ////// ////// ....... ))))))))))))))))))))))))) $$$$$$ ",
- " %%%%%%% /////// ////// ....... )))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% /////// /////// ....... ))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% ////// /////// ....... )))))))))))))))))))))) $$$$$$ ",
- " %%%%%% ////// /////// ......................... ))))))) $$$$$$ ",
- " %%%%%% ////// ////// ......................... $$$$$$ ",
- " %%%%%% /////// ////// ........................ $$$$$$ ",
- " %%%%%% //////// ////// ....................... $$$$$$ ",
- " %%%%%% //////// /////// ...................... $$$$$$ ",
- " //////// ///////// .................... $$$$$$ ",
- " ////////// ////////// ",
- " ////////////////////// 11111111111111111111111111 ",
- " ///////////////////// 11111111111111111111111111 ",
- " ////////////////// 11111111111111111111111111 ",
- " //////////////// 11111111111111111111111111 ",
- " ////////////// 11111111111111111111111111 ",
- " ///////// 11111111111111111111111111 ",
- " / ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-4-600-600-1.0-grid-reference.json b/tests/visual_tests/grids/lines-4-600-600-1.0-grid-reference.json
deleted file mode 100644
index 4a9d99d..0000000
--- a/tests/visual_tests/grids/lines-4-600-600-1.0-grid-reference.json
+++ /dev/null
@@ -1,174 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "12",
- "10",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !!!!! !! ",
- " !!!!!!!! !!!!! !! ",
- " !!!!!!!!!!! !!!!!!! !!!!! ! ",
- " !!!!!! !!!!! !!!!!!!!!! !!!!!!!! !! ",
- " !!!!!! !!!!! !!!!! !!!!!! !!!!!!!!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!!! !!!!! !!!!!! !!!!! !!!!! !!!!!! !!!!! ",
- " !!!!!!! !!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " !!!!!! !!!!! !!!!!! !!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!! !!!!!! !!!!! !!!!! !!!!! ",
- " !!! !!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!! !!!!!!!! ",
- " !!!!!!! !!!!!! !!!!! ",
- " ### !!!!! # !!!! !! ",
- " ##### !!! #### ! # $$$$ ",
- " ######## ###### ### $$$$ ",
- " ########## ######### ##### ## $$$$ ",
- " ###### ###### ############ ######### #### $$$$ ",
- " ###### ###### ###### ##### ########### ###### $$$$ ",
- " ###### ##### ###### ###### ##### ##### ###### $$$$ ",
- " ####### ##### ###### ###### ##### ###### ##### $$$$ ",
- " ###### ###### ##### ##### ###### ##### ###### $$$$ ",
- " ##### ###### ###### ##### ##### ###### ###### $$$$ ",
- " %%% ### ##### ###### ###### ##### ###### ###### $$$$ ",
- " %%% ##### ###### ##### ###### ##### ###### $$$$ ",
- " %%% ###### ###### ##### ###### ########## $$$$ ",
- " %%% ##### ##### ###### ##### ######## $$$$ ",
- " %%% ########### ########## ##### $$$$ ",
- " %%% ######### ####### ## $$$$ ",
- " %%% ###### #### $$$$ ",
- " %%% ### ## $$$$ ",
- " %%% &&&&& $$$$ ",
- " %%% && &&&&& &&&&&&&& &&&&&&&&& $$$$ ",
- " %%% &&&&&&&& &&&&&&&&& &&&&&&&&&&& &&&&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&&&&& &&&&&&& &&&&& &&&&&& &&&&& &&&&&& &&&&& $$$$ ",
- " %%% &&&&&& &&&& &&&&&& &&&& &&&&&& &&&& &&&&& &&&& $$$$ ",
- " %%% &&&&& &&&& &&&&& &&&& &&&&& &&&& &&&&& &&&& & $$$$ ",
- " %%% &&&&& &&&&& &&&&& &&&& &&&&& &&&& &&&&&& &&&& &&&& $$$$ ",
- " %%% &&& &&&&& &&&&&& &&&&& &&&&&& &&&&&&&&&&&&& &&&&&&&&&&&& $$$$ ",
- " %%% & &&&&&&&&&&&& &&&&&&&&&&& &&&&&&&&&& &&&&&&&&& $$$$ ",
- " %%% &&&&&&&&& &&&&&&&&& &&&&&&&& &&&&&& $$$$ ",
- " %%% &&&&&&& &&&&&& &&& & $$$$ ",
- " %%% && $$$$ ",
- " %%% '''''' $$$$ ",
- " %%% '''''' $$$$ ",
- " %%% '''''' $$$$ ",
- " %%% '''''' $$$$ ",
- " %%% ''''''''''''''''''' $$$$ ",
- " %%% ''''''''''''''''''' $$$$ ",
- " %%% ((( (((((( ((((((( ''''''''''''''''''' $$$$ ",
- " %%% ((((((( (((((((( ((((((((( ((((((((((( $$$$ ",
- " %%% (((((((((( ((((((((((( (((((((((((( ((((((((((((( $$$$ ",
- " %%% ((((((((((((( ((((((((((((( ((((((( ((((( (((((( (((( $$$$ ",
- " %%% ((((((( ((((( (((((( ((((( ((((( ((((( ((((( (((( $$$$ ",
- " %%% ((((( (((( (((((( ((((( (((((( ((((( ((((( (((( ( $$$$ ",
- " %%% ((((( (((( ((((( (((( ((((( (((( (((((( ((((( ((( $$$$ ",
- " %%% (((( (((( ((((( (((( ((((( ((((( (((((( (((((((((((( $$$$ ",
- " %%% (( (((((( (((((( ((((((((((( (((((((((( (((((((((( $$$$ ",
- " %%% ((((((((((( ((((((((( (((((((( ((((((( $$$$ ",
- " %%% (((((((( )) (((((( ((((( (( $$$$ ",
- " %%% (((( )))) *** ( +++++++ $$$$ ",
- " %%% ))))) **** +++++++++++++++++++++++++++ $$$$ ",
- " %%% )))))) **** ,,, +++++++++++++++++++++++++++++ $$$$ ",
- " %%% ))))) *** ,,,, -- +++++++++++++++++++++++++++++ $$$$ ",
- " %%% ))))) *** ,,,, ---------------------- +++++++++ $$$$ ",
- " %%% )))))) *** ,,, ---------------------- +++++ $$$$ ",
- " %%% ))))) *** ,,, ---------------------- ++++ $$$$ ",
- " %%% ))))) **** ,,, ++++ $$$$ ",
- " %%% )))))) **** ,,, ++++ $$$ ",
- " %%% ))))) **** ,,, ........................ +++ $$$ ",
- " %%% ))))) *** ,,,, ................................ +++ $$$ ",
- " %%% )))))) *** ,,,, ................................ +++ $$$ ",
- " %%% ))))) *** ,,, ................... +++ $$$ ",
- " %%% )))))) *** ,,, .... +++ $$$ ",
- " %%% )))))) //// **** ,,, .... +++ $$$ ",
- " %%% ))))) /////////// **** ,,, ... +++ $$$ ",
- " %%% )))))) ///////////////// *** ,,,, ... +++ $$$ ",
- " %%% )))))) //////////////////// *** ,,,, ... +++ $$$ ",
- " %%% ))))) ////// //////// *** ,,,, .... +++ $$$ ",
- " %%% )))))) ///// //// *** ,,, .... 00000000000000000000000 ++++ $$$ ",
- " %%% )))))) ////// ////*** ,,, .... 00000000000000000000000 ++++ $$$ ",
- " %%% ))))) ////// ///// ,,, ... 00000000000000000000000 +++ $$$ ",
- " %%% ))) ///// //// ,,, ... +++ $$$ ",
- " %%% )) //// //// ,,,, ... +++ $$$ ",
- " %%% /// //// ,,,, ... ++++ $$$ ",
- " %%% //// ///// ... ++++ $$$ ",
- " %%% //// //// ... ++++++++++++++++++++++++++++++++++ $$$ ",
- " %%% /// /// .... +++++++++++++++++++++++++++++++++ $$$ ",
- " %%% /// //// .... +++++++++++++++++++++++++++++++++ $$$ ",
- " %%% /// /// ... +++++++++++ $$$ ",
- " %%% /// /// ... $$$ ",
- " %%% /// /// .... $$$ ",
- " %%% //// /// ..... $$$ ",
- " %%% //// /// ..... $$$ ",
- " %%% /// //// ...... $$$ ",
- " %%% //// //// ............................... $$$ ",
- " %%% //// /// .............................. $$$ ",
- " %%% //// /// ............................ $$$ ",
- " %%% //// /// $$$ ",
- " //// //// $$$ ",
- " //// ///// ",
- " //// ////// ",
- " //// ////// ",
- " ///// ///// ",
- " //////// ////// ",
- " ///////////// ////// 11111111111111111111111111111111111111 ",
- " ///////////////// 11111111111111111111111111111111111111 ",
- " //////////// 11111111111111111111111111111111111111 ",
- " //// 11111111111111 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-4-600-600-2.0-grid-reference.json b/tests/visual_tests/grids/lines-4-600-600-2.0-grid-reference.json
deleted file mode 100644
index b6fb642..0000000
--- a/tests/visual_tests/grids/lines-4-600-600-2.0-grid-reference.json
+++ /dev/null
@@ -1,174 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "10",
- "12",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !!!! ! ",
- " !!!!!!!! !!!!! !! ",
- " !!!!!!!!!! !!!!!!! !!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!! !!!!!!!! ! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!! !!!!!!!!!! !!! ",
- " !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! ",
- " !!! !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " # !!!!!!!!!!!!!!! # !!!!!!!!!!!!!! !!!!!!!!!!!! ",
- " ##### !!!!!!!!!!!!! ### !!!!!!!!!!!! !!!!!!!!!! ",
- " ####### !!!!!!!!!!! ###### !!!!!!!!! ### !!!!!!!! ",
- " ########## !!!!!!! ######### !!!!!! ##### !!!!! $$$$$$ ",
- " ############# !!!!! ############ !!!! ######## !! ## $$$$$$ ",
- " ################ !! ############## ! ########### #### $$$$$$ ",
- " ################### ################ ############# ####### $$$$$$ ",
- " ##################### #################### ################ ######## $$$$$$ ",
- " ############ ########## ###################### ################### ########### $$$$$$ ",
- " ########### ########### ########### ########## ##################### ########### $$$$$$ ",
- " ########## ########## ########### ########### ########## ########### ########## $$$$$$ ",
- " ####### ########## ########### ########### ########## ########### ########### $$$$$$ ",
- " %%%%%% ###### ########### ########### ########## ########### ##################### $$$$$$ ",
- " %%%%%% ### ########## ########### ########## ########## ################## $$$$$$ ",
- " %%%%%% # ##################### #################### ################ $$$$$$ ",
- " %%%%%% ################### ################# ############# $$$$$$ ",
- " %%%%%% ################# ############## ########## $$$$$$ ",
- " %%%%%% ############# ############ ######## $$$$$$ ",
- " %%%%%% ########### ######### #### $$$$$$ ",
- " %%%%%% ######## &&&&& ####### &&&&&&&& ## $$$$$$ ",
- " %%%%%% &&&&&& #####&&&&&&& &&&&&&&&&&#### &&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&& ###&&&&&&&&& &&&&&&&&&&&&&## &&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&& && $$$$$$ ",
- " %%%%%% &&&&&&&&&&& &&&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&& &&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&& &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% && &&&&&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&& &&&&&&&&&&& &&&&&&&&&& &&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&& &&&&&&&& &&&&&&& &&&& ''''''''$$$$$$ ",
- " %%%%%% &&&&& &&& & ''''''''$$$$$$ ",
- " %%%%%% ''''''''$$$$$$ ",
- " %%%%%%% '''''''''''''''''''''$$$$$$ ",
- " %%%%%%% '''''''''''''''''''''$$$$$$ ",
- " %%%%%%% ((( (((((( '''''''''''''''''''''$$$$$$ ",
- " %%%%%%% (((((( ((((((( ((((((((( ((((((((((( '''''''''''''''''''''$$$$$$ ",
- " %%%%%%% (((((((((( (((((((((( ((((((((((( ((((((((((((( '''''''''''''''''''''$$$$$$ ",
- " %%%%%%% (((((((((((( ((((((((((((( (((((((((((((( (((((((((((((((( '''''''''''''''''''''$$$$$$ ",
- " %%%%%%% ((((((((((((((( (((((((((((((((( (((((((((((((((( ((((((((((((((((( '''''''''''''''''''''$$$$$$ ",
- " %%%%%%% ((((((((((((((((( (((((((((((((((((( ((((((((((((((((((( ((((((((((((((((((( $$$$$$ ",
- " %%%%%%% ((((((((((((((((((( (((((((((((((((((((( ((((((((((((((((((((( ((((((((((((((((((((( ( $$$$$$ ",
- " %%%%%%%(((((((((((((((((((( ((((((((((( ((((((((( (((((((((( ((((((((( ((((((((((( (((((((( (((( $$$$$$ ",
- " %%%%%%%((((((((( ((((((((( ((((((((((( (((((((((((((((((((( ((((((((((((((((((( (((((((((((((( $$$$$$ ",
- " %%%%%%% (((((( (((((((((((((((((( ((((((((((((((((( ((((((((((((((((( (((((((((((((( $$$$$$ ",
- " %%%%%%% (((( ((((((((((((((((( ((((((((((((((( ((((((((((((((( (((((((((((((( $$$$$$ ",
- " %%%%%%% (( ((((((((((((((( (((((((((((((( (((((((((((((( (((((((((((( $$$$$$ ",
- " %%%%%%% ((((((((((((()) (((((((((((( (((((((((( *****************((((((( $$$$$$ ",
- " %%%%%%% (((((((((())))) ++++++ ((((((((( ((((((( **************************** $$$$$$ ",
- " %%%%%%% (((((()))))))) ++++++ (,((( (( ****************************** $$$$$$ ",
- " %%%%%%% ()))))))))) ++++++ ,,,,,, -------------------- ******************************** $$$$$$ ",
- " %%%%%%% ))))))))))) ++++++ ,,,,,, ---------------------- ********************************* $$$$$$ ",
- " %%%%%%% ))))))))))) +++++++ ,,,,,, ---------------------- ********************************* $$$$$$ ",
- " %%%%%%% )))))))))) +++++++ ,,,,,, ---------------------- ********************** $$$$$$ ",
- " %%%%%%% ))))))))))) +++++++ ,,,,,,, ---------------------- ********* $$$$$$ ",
- " %%%%%%% ))))))))))) ++++++ ,,,,,,, ---------------------- . ******* $$$$$$ ",
- " %%%%%%% )))))))))) ++++++ ,,,,,,, .....-----------............ ******* $$$$$$ ",
- " %%%%%%% ))))))))))) ++++++ ,,,,,, ................................. ****** $$$$$$ ",
- " %%%%%%% ))))))))))) +++++++ ,,,,,, ................................. ****** $$$$$$ ",
- " %%%%%%% )))))))))) +++++++ ,,,,,, .................................. ******* $$$$$$ ",
- " %%%%%%% ))))))))))) +++++++ ,,,,,, ................................... ******* $$$$$$ ",
- " %%%%%%% ))))))))))) //////// ++++++,,,,,,, ................................... ******* $$$$$$ ",
- " %%%%%%% )))))))))) //////////////// ++++++,,,,,,, .......... ******* $$$$$$ ",
- " %%%%%%% ))))))))))) ///////////////////++++++,,,,,, ....... ******* $$$$$$ ",
- " %%%%%% ))))))))))) /////////////////////++++++,,,,,, ....... ******* $$$$$$ ",
- " %%%%%% )))))))))) ///////////////////////+++++,,,,,, ...... 00000000000000000000000 ****** $$$$$$ ",
- " %%%%%% ))))))))))) ////////////////////////++++++,,,,,, ...... 00000000000000000000000 ****** $$$$$$ ",
- " %%%%%%))))))))))) /////////// //////////////+++,,,,,, ...... 00000000000000000000000 ****** $$$$$$ ",
- " %%%%%%))))))))) ////////// ///////+/+,,,,,,, ...... 00000000000000000000000 ****** $$$$$$ ",
- " %%%%%%)))))))) ////////// /////// ,,,,,,, ...... 00000000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))))) ////////// ////////,,,,,, ...... 00000000000000000000000 ******* $$$$$$ ",
- " %%%%%% )))) //////// ///////,,,,,, ...... 00000000000000 ******* $$$$$$ ",
- " %%%%%% )) /////// //////,,,,,, ...... *********** ****** $$$$$$ ",
- " %%%%%% ////// /////// , ...... ************************************ $$$$$$ ",
- " %%%%%% ////// /////// ...... ************************************ $$$$$$ ",
- " %%%%%% ////// ///// ...... *********************************** $$$$$$ ",
- " %%%%%% /////// ////// ...... ********************************** $$$$$$ ",
- " %%%%%% /////// ////// ...... ********************************** $$$$$$ ",
- " %%%%%% /////// ////// ....... ***************************** $$$$$$ ",
- " %%%%%% ////// /////// ........ $$$$$$ ",
- " %%%%%% ////// /////// ........ $$$$$$ ",
- " %%%%%% ////// ////// ................................... $$$$$$ ",
- " %%%%%% ////// ////// .................................. $$$$$$ ",
- " %%%%%% //////// ////// ................................. $$$$$$ ",
- " %%%%%% //////// ////// ................................. $$$$$$ ",
- " %%%%%% //////// /////// ............................... $$$$$$ ",
- " %%%%%% //////// /////// ............................. $$$$$$ ",
- " //////// /////// $$$$$$ ",
- " //////// ///////// ",
- " //////// ////////// ",
- " //////// /////////// ",
- " ///////////// /////////// 1111111111 ",
- " ////////////////////////// 111111111111111111111111111111111111111 ",
- " //////////////////////// 111111111111111111111111111111111111111 ",
- " ////////////////////// 11111111111111111111111111111111111111 ",
- " /////////////////// 11111111111111111111111111111111111111 ",
- " ///////////////// 11111111111111111111111111111111111111 ",
- " ///////// 11111111111111111111111111111111111111 ",
- " / ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-4-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/lines-4-800-800-1.0-grid-reference.json
deleted file mode 100644
index cfd441f..0000000
--- a/tests/visual_tests/grids/lines-4-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "12",
- "10",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " !!!! ",
- " !!!!!!! !!! ",
- " !!!!!!!!! !!!!! !!! ",
- " !!!!!! !!!!! !!!!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!!!!!!!! !!!!!!!! ! ",
- " !!!!!! !!!!! !!!!!! !!!!! !!!!!!!!!! !!!! ",
- " !!!!!! !!!!! !!!!!! !!!!! !!!!! !!!!!! !!!!!! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!! !!!!! ",
- " !!!!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!!! !!!!! !!!!!! !!!!! !!!!! !!!!! !!!!!! ",
- " !!!!!!! !!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!! !!!!! !!!!! !!!!! !!!!!! ",
- " !!!! !!!!! !!!!! !!!!! !!!!!! !!!!!! !!!!! ",
- " ! !!!!! !!!!!! !!!!!! !!!!! !!!!!! !!!!!! ",
- " !!!!!! !!!!! !!!!!! !!!!!! !!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!! !!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!! !!!!!!! !!!!! ",
- " !!!!!! !!!! !!! ",
- " ### !!! # !! $$$ ",
- " ##### ! #### $$$ ",
- " ######## ####### ## $$$ ",
- " ########### ########## ##### # $$$ ",
- " ###### ###### ###### ##### ######## ### $$$ ",
- " ####### ##### ##### ##### ########## ##### $$$$ ",
- " ###### ##### ###### ###### ##### ##### ##### $$$ ",
- " ###### ###### ###### ###### ###### ###### ###### $$$ ",
- " ###### ###### ##### ##### ###### ###### ###### $$$ ",
- " ###### ##### ###### ##### ##### ##### ##### $$$ ",
- " ####### ##### ##### ###### ##### ###### ###### $$$ ",
- " ###### ###### ###### ##### ###### ###### ##### $$$ ",
- " #### ##### ###### ##### ##### ##### ###### $$$ ",
- " %%% ## ##### ##### ###### ##### ###### ###### $$$ ",
- " %%% ###### ###### ###### ###### ##### ##### $$$ ",
- " %%% ###### ###### ##### ###### ###### ###### $$$ ",
- " %%% ##### ###### ##### ##### ########### $$$ ",
- " %%% ##### ###### ###### ##### ####### $$$$ ",
- " %%% ###### ##### ########### ##### $$$ ",
- " %%% ########### ######## ## $$$ ",
- " %%% ######## ###### $$$ ",
- " %%% ##### #### $$$ ",
- " %%% ### # $$$ ",
- " %%% $$$ ",
- " %%% &&&&&&& $$$ ",
- " %%% &&&&&& &&&&&&&& &&&&&&&&&& $$$ ",
- " %%% &&&&&&&& &&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&& &&&&& $$$ ",
- " %%% &&&&&&&&&&&&&& &&&&&&& &&&&&& &&&&&&& &&&&& &&&&&& &&&&& $$$$ ",
- " %%% &&&&&&& &&&&& &&&&&&& &&&&& &&&&&& &&&&& &&&&& &&&&& $$$$ ",
- " %%% &&&&&& &&&& &&&&&& &&&& &&&&& &&&&& &&&&& &&&& $$$$ ",
- " %%% &&&&&& &&&&& &&&&& &&&&& &&&&&& &&&& &&&&&& &&&& $$$$ ",
- " %%% &&&&& &&&& &&&&& &&&& &&&&& &&&& &&&&& &&&& && $$$$ ",
- " %%% &&&&& &&&& &&&&& &&&& &&&&& &&&&& &&&&& &&&&& &&&&& $$$$ ",
- " %%% &&& &&&& &&&&&& &&&& &&&&& &&&&& &&&&&& &&&&&&&&&&&&&& $$$$ ",
- " %%% & &&&&&& &&&&&&& &&&&&&& &&&&&& &&&&&&&&&&&&& &&&&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&& &&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&&& &&&&&&&& &&&&&& &&&& $$$$ ",
- " %%% &&&&&&& &&&& & $$$$ ",
- " %%% && $$$$ ",
- " %%% $$$$ ",
- " %%% $$$$ ",
- " %%% '''''''' $$$$ ",
- " %%% '''''''' $$$$ ",
- " %%% '''''''' $$$$ ",
- " %%% ''' $$$$ ",
- " %%% ''''''''''''''''''''''''' $$$$ ",
- " %%% ''''''''''''''''''''''''' $$$$ ",
- " %%% (( ''''''''''''''''''''''''' $$$$ ",
- " %%% ((((((( (((((((( ''''''''''''''''''''''''' $$$$ ",
- " %%% (((((( (((((((( (((((((((( (((((((((((( $$$$ ",
- " %%% (((((((((( (((((((((((( ((((((((((((( (((((((((((((( $$$$ ",
- " %%% (((((((((((((( ((((((((((((((( (((((((( ((((( ((((((( (((( $$$$ ",
- " %%% ((((((( (((((( ((((((( (((( (((((( (((( (((((( (((( $$$$ ",
- " %%% ((((((( (((( (((((( (((( (((((( (((( ((((( (((( $$$$ ",
- " %%% (((((( (((( (((((( (((( ((((( ((((( ((((( ((((( $$$$ ",
- " %%% ((((( (((( ((((( (((( (((((( (((( (((((( (((( (( $$$$ ",
- " %%%% ((((( (((( ((((( (((( ((((( (((( ((((( (((( (((( $$$$ ",
- " %%% (((( (((( (((((( (((( ((((( (((( (((((( ((((( (((((( $$$$ ",
- " %%% (( ((((( (((((( ((((( (((((( (((((((((((((( ((((((((((((( $$$$ ",
- " %%% (((((( (((((( (((((((((((( (((((((((((( ((((((((( $$$$ ",
- " %%% ((((((((((( (((((((((( (((((((( (((((( $$$$ ",
- " %%% (((((((( )) ((((((( ((( $$$$ ",
- " %%%% (((( )))) *** ( $$$$ ",
- " %%%% ))))) *** ++++++++++++ $$$$ ",
- " %%%% )))))) *** ++++++++++++++++++++++++++++++++ $$$$ ",
- " %%%% )))))) **** ,,, +++++++++++++++++++++++++++++++++++++ $$$$ ",
- " %%%% ))))) **** ,,, +++++++++++++++++++++++++++++++++ $$$$ ",
- " %%%% )))))) *** ,,, ------ +++++++++++++++ $$$$ ",
- " %%%% )))))) *** ,,,, ----------------------------- ++++++ $$$$ ",
- " %%%% ))))) *** ,,,, ----------------------------- ++++ $$$$ ",
- " %%%% )))))) *** ,,, ----------------------------- ++++ $$$$ ",
- " %%%% )))))) **** ,,, ++++ $$$$ ",
- " %%%% ))))) **** ,,, ++++ $$$$ ",
- " %%%% )))))) *** ,,, ++++ $$$$ ",
- " %%%% )))))) *** ,,, +++ $$$$ ",
- " %%%% ))))) *** ,,,, ................................. +++ $$$$ ",
- " %%%% )))))) *** ,,,, .......................................... +++ $$$$ ",
- " %%%% )))))) **** ,,, ........................................... +++ $$$$ ",
- " %%%% ))))) **** ,,, ................. +++ $$$$ ",
- " %%%% )))))) *** ,,, ..... +++ $$$$ ",
- " %%%% )))))) *** ,,, .... +++ $$$$ ",
- " %%%% ))))) *** ,,,, ... +++ $$$$ ",
- " %%%% )))))) //////// *** ,,,, ... +++ $$$$ ",
- " %%%% )))))) /////////////// *** ,,,, .... +++ $$$$ ",
- " %%%% ))))) ////////////////////// **** ,,, .... +++ $$$$ ",
- " %%%% )))))) ////// ////////////// **** ,,, ... +++ $$$$ ",
- " %%%% )))))) ////// ///////// *** ,,, ... ++++ $$$$ ",
- " %%%% ))))) ///// //// *** ,,, ... ++++ $$$$ ",
- " %%%% )))))) ////// ///// *** ,,,, ... 00000000000000000000000000000 ++++ $$$$ ",
- " %%%% )))))) ////// //// *** ,,,, ... 00000000000000000000000000000 +++ $$$$ ",
- " %%%% ))))) ///// //// ,,, ... 00000000000000000000000000000 +++ $$$$ ",
- " %%%% ))))) ////// //// ,,, ... +++ $$$$ ",
- " %%%% ))) ////// ///// ,,, ... +++ $$$$ ",
- " %%% ) //// //// ,,, ... ++++ $$$$ ",
- " %%% /// //// ,,, ... ++++ $$$$ ",
- " %%% /// //// ,,, ... +++ $$$$ ",
- " %%% /// ///// ... ++++ $$$$ ",
- " %%% /// //// ... ++++++++++++++++ ++++ $$$$ ",
- " %%% //// /// ... ++++++++++++++++++++++++++++++++++++++++++++ $$$$ ",
- " %%% //// /// ... +++++++++++++++++++++++++++++++++++++++++++ $$$$ ",
- " %%% /// //// ... +++++++++++++++++++++++++++++++++ $$$$ ",
- " %%% /// //// ... $$$$ ",
- " %%% /// //// .... $$$$ ",
- " %%% /// /// .... $$$$ ",
- " %%% //// /// .... $$$$ ",
- " %%% //// /// ..... $$$$ ",
- " %%% /// /// .... $$$$ ",
- " %%% /// //// ..... $$$$ ",
- " %%% /// //// ...... $$$$ ",
- " %%% /// /// .......................................... $$$$ ",
- " %%% //// /// ........................................ $$$$ ",
- " %%% //// /// ...................................... $$$$ ",
- " %%% //// /// $$$$ ",
- " %%% //// /// $$$$ ",
- " //// //// $$$$ ",
- " //// ///// $$$$ ",
- " ///// ///// ",
- " //// ////// ",
- " //// ////// ",
- " //// ///// ",
- " ///// ////// ",
- " ///// ////// ",
- " /////////// ///// ",
- " /////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////// 11111111111111111111111111111111111111111111111111 ",
- " //// 1111111111 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-4-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/lines-4-800-800-2.0-grid-reference.json
deleted file mode 100644
index 04888ab..0000000
--- a/tests/visual_tests/grids/lines-4-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "10",
- "12",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!! ",
- " !!!!!! !! ",
- " !!!!!!!!! !!!!! !! ",
- " !!!!!!!!!!! !!!!!!! !!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!! !! ",
- " !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! ",
- " !!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! ",
- " ## !!!!!!!!!!!!! # !!!!!!!!!!!! !!!!!!!!!!! ",
- " ##### !!!!!!!!!!! #### !!!!!!!!!! !!!!!!! ",
- " ######## !!!!!!!!! ###### !!!!!! ## !!!!! $$$$$$ ",
- " ########## !!!!! ######### !!!! #### !! $$$$$$ ",
- " ############## !!! ############ !! ######## # $$$$$$ ",
- " ################ ############## ########## #### $$$$$$ ",
- " ################### ################## ############ ##### $$$$$$ ",
- " ##################### #################### ################ ####### $$$$$$ ",
- " ############ ########### ########### ########## ################## ########## $$$$$$ ",
- " ############ ########## ########### ########## #################### ########### $$$$$$ ",
- " ############ ########## ########### ########### ########## ########### ########### $$$$$$ ",
- " ############ ########### ########## ########## ########### ########### ########### $$$$$$ ",
- " ########### ########## ########### ########## ########## ########## ########## $$$$$$ ",
- " ######### ########## ########### ########## ########## ########### ########### $$$$$$ ",
- " ####### ########## ########### ########### ########### ########### ########### $$$$$$ ",
- " %%%%%%% ##### ########### ########### ########## ########### ########## ########### $$$$$$ ",
- " %%%%%%% ## ########## ########## ########## ########## ##################### $$$$$$ ",
- " %%%%%%% ########## ########### ########### ########## ################## $$$$$$ ",
- " %%%%%%% ########### ########### ##################### ############### $$$$$$ ",
- " %%%%%%% ##################### ################## ############# $$$$$$ ",
- " %%%%%%% ################## ################ ########## $$$$$$ ",
- " %%%%%%% ################ ############## ####### $$$$$$ ",
- " %%%%%%% ############# ########### ##### $$$$$$ ",
- " %%%%%%% ########## ######## ## $$$$$$ ",
- " %%%%%%% ####### ###### $$$$$$ ",
- " %%%%%%% ##### &&&&&&& ### &&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&& ### &&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&&& &&&&&&&&&&&& &&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&& &&&&&&&&&& &&&&&&&&&&& &&&&&&&&& &&&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&& & $$$$$$ ",
- " %%%%%%% &&&&&&&&&&& &&&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& && $$$$$$ ",
- " %%%%%%% &&&&&&&&&& &&&&&&&&& &&&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&&& &&&&& $$$$$$ ",
- " %%%%%% &&&&&&& &&&&&&&& & &&&&&&&&&& &&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&& &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% & &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&& &&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&& &&&&&&&& &&&& & $$$$$$ ",
- " %%%%%% &&&&& & '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ( ((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ((((((( ((((((((( ((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ((((((((( (((((((((((( ((((((((((((( ((((((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ((((((((((((( (((((((((((((( (((((((((((((((( (((((((((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% (((((((((((((((( ((((((((((((((((( (((((((((((((((((( ((((((((((((((((((( $$$$$$ ",
- " %%%%%% (((((((((((((((((( (((((((((((((((((((( (((((((((((((((((((( ((((((((((((((((((((( $$$$$$ ",
- " %%%%%% ((((((((((((((((((((( ((((((((((((((((((((( (((((((((((((((((((((( ((((((((((((( ((((((((( $$$$$$ ",
- " %%%%%% (((((((((((((((((((((( (((((((((((( (((((((( ((((((((((( ((((((((( (((((((((( ((((((((( $$$$$$ ",
- " %%%%%% (((((((((((( (((((((( (((((((((( (((((((( ((((((((((( ((((((( ((((((((((( (((((((( (( $$$$$$ ",
- " %%%%%% (((((((((( (((((((( (((((((((( (((((((( (((((((((( (((((((( (((((((((( (((((((( ((((( $$$$$$ ",
- " %%%%%% ((((((((( ((((((( (((((((((( ((((((((( (((((((((( ((((((((( ((((((((((( ((((((((((((((((( $$$$$$ ",
- " %%%%%% (((((( ((((((((( ((((((((((( ((((((((((((((((((((( (((((((((((((((((((( (((((((((((((((( $$$$$$ ",
- " %%%%%% (((( (((((((((((((((((((( (((((((((((((((((( ((((((((((((((((( ((((((((((((((((( $$$$$$ ",
- " %%%%%% (( (((((((((((((((((( (((((((((((((((( (((((((((((((((( ((((((((((((((( $$$$$$ ",
- " %%%%%% ((((((((((((((((()) ((((((((((((((( (((((((((((((( ((((((((((( $$$$$$ ",
- " %%%%%% ((((((((((((( )))) (((((((((((( (((((((((( * ((((((((( $$$$$$ ",
- " %%%%%% ((((((((((( )))))) +++++ ((((((((( ((((((( ********************** ((( $$$$$$ ",
- " %%%%%% (((((((( )))))))) +++++++ (((( ( ************************************* $$$$$$ ",
- " %%%%%% ( )))))))))) ++++++ , *************************************** $$$$$$ ",
- " %%%%%% )))))))))) ++++++ ,,,,,,, **************************************** $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, ------------------------ ****************************************** $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,, ----------------------------- ******************************************* $$$$$$ ",
- " %%%%%% )))))))))) +++++++ ,,,,,, ----------------------------- *************************** $$$$$$ ",
- " %%%%%% ))))))))))) +++++++ ,,,,,, ----------------------------- ********* $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,, ----------------------------- ********* $$$$$$ ",
- " %%%%%% )))))))))) ++++++ ,,,,,,, ----------------------------- ******* $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, -------------- ******** $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, ................ ******* $$$$$$ ",
- " %%%%%% )))))))))) +++++++ ,,,,,, ...................................... ******* $$$$$$ ",
- " %%%%%% ))))))))))) +++++++ ,,,,,, ........................................... ****** $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,, ............................................ ****** $$$$$$ ",
- " %%%%%% )))))))))) ++++++ ,,,,,, ............................................. ******* $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, ............................................. ******* $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, ............................................ ******* $$$$$$ ",
- " %%%%%% )))))))))) //// +++++++ ,,,,,, ............ ******* $$$$$$ ",
- " %%%%%% ))))))))))) //////////// +++++++ ,,,,,, ....... ******* $$$$$$ ",
- " %%%%%% )))))))))) //////////////////// +++++++ ,,,,,, ....... ******* $$$$$$ ",
- " %%%%%% )))))))))) //////////////////////// ++++++ ,,,,,, ...... ****** $$$$$$ ",
- " %%%%%% ))))))))))) /////////////////////////// ++++++ ,,,,,, ...... ****** $$$$$$ ",
- " %%%%%% )))))))))) //////////////////////////// ++++++ ,,,,,,, ...... ****** $$$$$$ ",
- " %%%%%% )))))))))) ///////////////////////////////++++++ ,,,,,,, ...... 00000000000000000000000000000 ****** $$$$$$ ",
- " %%%%%% ))))))))))) /////////// //////////////+++++++,,,,,, ....... 00000000000000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))))))))) ////////// ////////+++++++,,,,,, ....... 00000000000000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))))))))) /////////// ///////++++ ,,,,,, ....... 00000000000000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))))))))) /////////// //////// ,,,,,, ...... 00000000000000000000000000000 ******* $$$$$$ ",
- " %%%%%% ))))))) ////////// //////// ,,,,,,, ...... 00000000000000000000000000000 ******* $$$$$$ ",
- " %%%%%% ))))) ///////// /////// ,,,,,,, ...... 000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))) //////// //////// ,,,,,,, ...... ****** $$$$$$ ",
- " %%%%%% ) /////// ////////,,,,,, ...... ****** $$$$$$ ",
- " %%%%%% /////// //////// ,,,, ...... *** ******* $$$$$$ ",
- " %%%%%% /////// //////// ...... ***************************** *************** $$$$$$ ",
- " %%%%%% ////// //////// ...... ********************************************** $$$$$$ ",
- " %%%%%% ////// ///// ....... ********************************************** $$$$$$ ",
- " %%%%%% ////// ////// ....... ********************************************* $$$$$$ ",
- " %%%%%% ////// ////// ...... ******************************************** $$$$$$ ",
- " %%%%%% /////// ////// ...... ******************************************* $$$$$$ ",
- " %%%%%% /////// ////// ....... *************** $$$$$$ ",
- " %%%%%% ////// ////// ....... $$$$$$ ",
- " %%%%%% ////// /////// ........ $$$$$$ ",
- " %%%%%% ////// /////// ....... $$$$$$ ",
- " %%%%%% ////// ////// ......... $$$$$$ ",
- " %%%%%% /////// ////// .......... .................................. $$$$$$ ",
- " %%%%%% /////// ////// ............................................ $$$$$$ ",
- " %%%%%% /////// ////// ............................................ $$$$$$ ",
- " %%%%%% //////// /////// ........................................... $$$$$$ ",
- " %%%%%% //////// /////// ......................................... $$$$$$ ",
- " %%%%%% //////// ////// ....................................... $$$$$$ ",
- " %%%%%% //////// ////// .................................... $$$$$$ ",
- " //////// /////// $$$$$$ ",
- " //////// ///////// $$$$$$ ",
- " /////// ////////// ",
- " //////// ////////// ",
- " //////// /////////// ",
- " //////// /////////// ",
- " /////////// ////////// ",
- " ///////////////// /////////// 11111111111111111111111111 ",
- " ////////////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " /////////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " ////////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " ///////////////// 11111111111111111111111111111111111111111111111111 ",
- " ///////// 11111111111111111111111111111111111111 ",
- " / ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-5-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/lines-5-200-200-1.0-grid-reference.json
deleted file mode 100644
index c21bc9a..0000000
--- a/tests/visual_tests/grids/lines-5-200-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "7",
- "4",
- "5",
- "16",
- "6",
- "12",
- "10",
- "2",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ! ! ! !! !!! ",
- " !! !!!! !!!!! ",
- " !!!! ! ! ! ",
- " !! !!! ! ! ! ",
- " !!!!!! !!! !!!!!!!!!! !!! ",
- " !!!!!!!!!!! !!!!!!!! !!! !!!!!! !!! ",
- " !!!!!!!!!! ! !!!!!!!!! !!!!!!!! !!!! ",
- " !!!! !!!!! !!!!! !!!!!!!!!!!!!!!!!!!!! ",
- " !! # !!!!!!!!! # !!!!!!!!! !!!!!!!! ",
- " #### !!!!!!! ### !!$!!$ ## !!!!!! ",
- " ###$$# $$$$! ###### $$$$$$$## !! ## %%% ",
- " #####$#$$$$$$ ########$ $###$#### ####%%% ",
- " #### ##$##$$##########$ ###$###########%%% ",
- " &&&## $ ##$#$$#### # ##$$##$## ######## %%% ",
- " &&& $ $$############$$#$#$$ ##### %%% ",
- " &&& $$$$$ #$###$ ## $$#####$ $$$$$### %%% ",
- " &&&$$$$$$$ $##$$$ $$##$$# $$$$$$$ %%% ",
- " &&$$$$$$$$$$$$$$$$$##$$$$$$$$$$$$$$$$$ %%% ",
- " &&&$$$ $$$$$$$$ $##$$$##$$$$$$$ $$$$$$ %%% ",
- " &&& $ $$$$$ ###$$## $$$$$ $$$$$ '''%% ",
- " &&& $$$ #$$ # $ '''''''%% ",
- " &&& &((( (((( (((( ((((( ''%''%'%% ",
- " &&&(&&(&&( (((((( ((((((( (((((((''''%''%% ",
- " &&(((&(&&(((((((((((((((((((((((((((%%% %%% ",
- " &&&((& &((((((( ((((((( (((((((( ((((%% %%%%% ",
- " &&& ( &((((( ))(((( ((((***(****%%* %%%% ",
- " &&& & &&(((++ ))),,,------(-(((((**%%%%* %%% ",
- " &&& ++++++ ))),,,------((*(*.***%%%%%*%%**",
- " &&& & +&+++ ))),,,--------.... **%%*%%*",
- " &&& ++++++++ ))),,,......((.((.((( *****%*",
- " &&& +++++///+/+)),,,,.......((((. *****%*",
- " &&&++++//+++///+),,,,... (000000 ****%%*",
- " &&&++++/+++/+++/),,,.... 0000000 *****%*",
- " &&&+++/+// + //,,,... 0000000***********",
- " &&& ///+ ++ /.. ..... **************%**",
- " &&& //++++ ........ ************ %%%*",
- " &&& //+ .../.............. *** %%% ",
- " &&& //// ../.............. %%% ",
- " &&& //// /.//.. ........... %%% ",
- " ///// ///./. . 111 ",
- " //////////... . 1111111111111 ",
- " //////// ... 1111111111111 ",
- " /////// 1111111111111 ",
- " //// // 1 11111 ",
- " // // 1 1 1111 ",
- " / / // ",
- " //////// 1111 11 ",
- " //// 1 111 11 ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-5-200-200-2.0-grid-reference.json b/tests/visual_tests/grids/lines-5-200-200-2.0-grid-reference.json
deleted file mode 100644
index 9ce1813..0000000
--- a/tests/visual_tests/grids/lines-5-200-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "7",
- "8",
- "4",
- "5",
- "16",
- "6",
- "10",
- "11",
- "14",
- "12",
- "13",
- "3",
- "2",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ! ! ",
- " !!!! # # !#!# !! ",
- " !!!!!!!!# # ##!#!#!## !!!!!! ",
- " !!!!!!!!!####!#!#!!#!# # !!!!!!!! !!! ",
- " !!!!!!!!!!!! #!!!#!##!!!#!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!#!###!##!##!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!#!!#!!!!!!#!!!#!#!!!!!!!!!!!!!! ",
- " $!!!$$!#!##!#!#!!###!###!#!!!!!!!!!!!!! ",
- " $$$$$$$$$!###!!#!#$#$##!!#!#!$$$!!!!!!!!%%%%%",
- " $$$$$$$$$##!#!!$#$#$##!!!!!$$$$$!!!!!$$$%%%%",
- " $$$$$$$$##!#!###$#$$$#!!!#$$$$$$$!!$$$$$%%%",
- " &&&&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%",
- " &&&&#$$$#$$$$$$$$$$$$#$$$$$$$$$$$$$$$$$$$$$%%%%",
- " &&&##$####$$$$$$$$$$###$$$$$$$$$##$$%%%$%%%%%%%",
- " &&&########$$$$$$$######$$$$$$#####$$$$$ %%%%%%",
- " &&&##########$$$$########$$$$##%%%##%%%%%''%%%%",
- " &&&&##########$############$###%##%##%##%'''''%",
- " &&&&&##########################%%%%##%''%'''''%",
- " &&&&&(#(#######(########(#######((###'%%''''''%",
- " &&&((((((#####(((######(((####%%%%%#%%%%%'''''%",
- " &&(((((((((#(((((((((((((((((((((((((%''''''''%",
- " &&&(((((((((((((((((((((((((((())))))%''''''''%",
- " &&&&((((((((((((((*(((++++++++(%%)%))''%''''''%",
- " &&&&&((((((((((((,,*((++++++++)%))%))%%%)))%%%%",
- " &&&&&&((((****,,**--*-++++++++*%%%%))%))%)))%%%",
- " &&.&&& /((*((*,,*-**--++++++++****)))%)%%)))%%%",
- " &&&..&////.***,,*--*--++++++++%%%%%)%)))))))%%%",
- ". &&&&.&//***....,,**---+++++++000%000)%%%%))))%%",
- " . &&..../.....*..****----***+++000%000 %%%)))))%%",
- " . &&&&.&..*****..*,------******0%%%%%0%%))))))%%%",
- ". &&.&.&.........***-----*** 0000000)))%%)))%%%",
- ".. .&&&&&....***...-------*** 0000000%%))))))%%%",
- " &&...&.....** ..*** **-*** 0000000))))))))%%%",
- ".. &&&&&&....*** *..*.*********0000*)))))))))))))",
- " &...&&.....** .***.**************)))))))))%)%%",
- " . &&..&&...**. ..*****************)))))))))%)%%",
- ". &.&&.&.....*...**.*..*************)111 )%)%))",
- " . . . ....****...*.** ************)111))) ) ) ",
- " . .....*......**.*. **********)111))) ) ",
- " ... ...........*. 111111111)1)1) ) )",
- "... . . . .........** 11111111111)1 )",
- " .... ........ 1111111111111 ) ) ",
- " . .. ) )) ) )))) ",
- " . ) )) ) ) ) )",
- " . )))) ) ) ) ",
- " ) )) ) ) ) ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-5-400-400-1.0-grid-reference.json b/tests/visual_tests/grids/lines-5-400-400-1.0-grid-reference.json
deleted file mode 100644
index e8c5ab4..0000000
--- a/tests/visual_tests/grids/lines-5-400-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,124 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "10",
- "12",
- "13",
- "14",
- "3",
- "11",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " !! !!!! ! ",
- " !!! ! !!!! ! ! ",
- " ! ! ! !! ! ! !!!! ",
- " !!!! !!!!! ! ! !! ! !!! !!!! !! ",
- " ! ! !!!! ! ! !! !! !!!!! ! !!!! ",
- " !!!!!! !!! !! !!! !!!! !! !!! !!!! ! ! !!! !! ",
- " ! ! !!!!!!!!! !!!!!! !!!!!!!!!! !!!!! !!!!!!!! !!! !!! ",
- " ! !!!!!!!!!!!! !! !! !!!!!!!!!!! ! ! !!!!!!!! ! !! !!! ",
- " !!!!!! !!!!!! !!! !!!!! !!!!!! !! ! ! !!!!!!!!!!! ! !!!!! ",
- " !!!!!! !!!!! !!! !!! !!!!!! !!!!! ! ! !!!!!!!!! !!!!!! ! !!!!!!! ",
- " !!!!! !!!!! !!!! !!!!!! !!!!!!!!! !!!!!! !!!!! ! !!!!! ",
- " !!!! !!!!!! !!!!!!! !!!!!! !!!!! !!!!! !!!!!! ",
- " ! !!!!! !!!!!! !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!! !!!!!!!!! !!!!!!! ",
- " # !!!!!!! # !!!!!! !!!!! ",
- " #### !!!!! #### !!! ## !!! $$$ ",
- " ####### ! ###### ! #### # $$$ ",
- " ########## ######### ####### ### $$$ ",
- " ####### ##### ###### ##### ######### ##### $$$ ",
- " ###### ###### ###### ##### ###### ##### ##### $$$ ",
- " ##### ###### ##### ###### ##### ###### ###### $$$$$$ ",
- " %%%%#### ##### ###### ###### ##### ###### ######$$$$ $$$ ",
- " %%%% # & ##### & ##### ##### ###### ########## $$ $$$$ ",
- " %%%% & && ####&&#&#### & ######&####& ######### $$$$$$$$$ ",
- " %%%% & && &#&#&###&# &&&&&&& ####&&&& & ####### $$$ $$$ ",
- " %%%%%% & & &&&&&&&##&&&& &&&&&& ####&&&&& # ## $$ $ $$$ ",
- " %%%% % %% &&&&&& && & &&&&&& && ###&& &# # # #### $$$$$ ",
- " %%%%%% &&&& && ##&&&&& & & &&&&&&& && & &&&&&### ### $ $$$$$$ ",
- " %%%%%% &&&&&&&&&& & &&&&&&&& &&& &&& &&&&&&&& & &&& &&&&&&&&#### # $$$$$ $$$ ",
- " %%%%%% &%&&&&&&& & & &&&&&&&&&& &&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&#### $$ $$$ ",
- " %%%% %&%%&&&&&&&& &&&&&& &&&&& & &&&&&& &&&& &&&&&& &&&& # #& $$$ ",
- " %%%%%%&%%& &&&& &&&&&& &&&& &&&&& &&&& &&&&& &&&&&&&&& $$$ ",
- " %%%%%%&%% &&&&&&&&&& &&&&&&&&&& &&&&&&&&&& &&&&&&&& $$$ ",
- " %%%%%%&%% &&&&&&&&& &&&&&&&& &&&&&&&& &&&&&& $$$ ",
- " %%%%%% &&&&&&& &&&&&& &&&&& &&&& $$$ ",
- " %%%% &&& & ''''' $$$ ",
- " %%%% ''''' $$$ ",
- " %%%% ''''' $$$ ",
- " %%%% ''''''''''''' $$$ ",
- " %%%% (( ((((( ((((( ((((((( ''''''''''''' $$$ ",
- " %%%% ((((((( (((((((( (((((((( ((((((((( ''''''''''''' $$$ ",
- " %%%% ((((((((( (((((((((( ((((((((((( ((((((((((( $ $$$$ ",
- " %%%% %((((((((((( (((((( (((( (((((( ((((( ((((((( (((( $ $$$ ",
- " %%%%(%(%%( ((((( (((((( ( (((( ((((( ((((( ((((( ( ( (((( (( $$$ $$$ ",
- " %%%%%%(( (((((( ((((((((( ( (((((((((((( (((((((((( ( (((((((((( $$ $$$$$ ",
- " %%%%%%( ( (((((((((((( ( ((((((((((( (((((((( (((((((((( $$ $$$$ ",
- " %%%%%% % (((((((((())( (((((((((( ( ( ((((( *** (( ((( (((( $$$$ $$$ ",
- " %%% % %%%(( ((((((( ))))(((((++ (( ((( ( (( (( ( *(*((***((******** $$$$$$$$$ ",
- " %%%%%%%%% (( (((( )))))( (((((+ ,,,( ( ( ((((( ( *(*(***((*********** $$$$$ ",
- " %%%%% %% ( (())))))( (++( ,,( ((((----(((---(- **(***(************** $$$ ",
- " %%%%%%%% ((( ))))) +(+ ,,(((((------(((-(-- ( ***** $$$ ",
- " %%%%%% (((())) +++ ,,,((---------(--(-(( **** $$$ ",
- " %%% )((()) .+. ,,, ////////////// **** $$$ ",
- " %%% ))))) .+.+ ,,, ////////////////////// *** $$$ ",
- " %%% )))))))) ...+.+..,,,, /////////////////////// *** $$$ ",
- " %%% )))))) ) ) .. .++..,,,, /////////////////////// *** $$$ ",
- " %%% ))))) )))....... ....+...,, //// *** $$$ ",
- " %%% )))))) .))).........+.+..,, /// *** $$$ ",
- " %%% ))))) )..)............+.. ,/, /// *** $$$ ",
- " %%% ))))). ).).)). .......+.+.,,/ //// 000000000000000 ***$$$$$$ ",
- " %%%)))).). . .))). ...+++,/// /// 000000000000000 **$$$$$$$$ ",
- " %%% ))). . ..).. .... ,//// /// 000000000000000 **$$ $$$$$ ",
- " %%% )) . ....... ....,,// /// *** $$$$$$ ",
- " %%% . .... .....,/ / /// **** **** $$$$$ ",
- " %%% . ... .... // /// ***********************$ $$$$$ ",
- " %%% .. .... ...///// /// *********************$$$ $$$$$ ",
- " %%% . .. ... ... / /// ********************* $ $$$$ ",
- " %%% . ... ... //// * *** $$$$$ ",
- " %%% ...... ... ///// * *** $ $$$ ",
- " %%% .... ... ///////////////////*/// $$$ ",
- " %%% .... .... //////////////////********** $$$ ",
- " %%% .... .... ///////////////////*** * ** $$$ ",
- " %%% .... ... .. ////////////////// $$$ ",
- " .... .... . . // //// $$$ ",
- " .... ....... . / ///// ",
- " ..... ......... .. // / // ",
- " . . .......... ..... ... .. ///////1//1111111111111 ",
- " ... . .............. . . . 11111///1////1111111111111 ",
- " .. .. ............ 11111111111111111111111111 ",
- " .. . . .... ... 11111111111111111111 ",
- " . . 11 11 ",
- " .. . 11 11 ",
- " .... 1 1 11 ",
- " . 1 1111111 ",
- " 111111111 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-5-400-400-2.0-grid-reference.json b/tests/visual_tests/grids/lines-5-400-400-2.0-grid-reference.json
deleted file mode 100644
index 2a45c89..0000000
--- a/tests/visual_tests/grids/lines-5-400-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,124 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "7",
- "4",
- "5",
- "16",
- "6",
- "10",
- "12",
- "2",
- "14",
- "13",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ! ! !! !! ! !! ! !!! ! ",
- " !!! !!! ! !!!!!! ! !!! ",
- " !! ! ! ! !! ! ! ! ! ! ! ! ! ! ",
- " !! ! !! ! !!! ! ! ! ! ! ",
- " ! !! ! ! ! !!! ! !! ",
- " ! !!! ! ! !! !! ",
- " !!! ! ! !! !!! ! ",
- " !!!!!! !! ! !! ! !!!! ! ! ! ! !! !!! ",
- " !!!!!!!!! ! !! !! !!!!!! !!!!!! !!! ! !!!!! ",
- " !!!!!!!!!!!! ! !!! ! !!!!!!!!!! ! !! ! ! !!!!!!!! !! ",
- " !!!!!!!!!!!!!!! ! ! ! ! !!!!!!!!!!!! ! ! ! !!!!!!!!!! !!!! ",
- " !!!!!!!!!!!!!!!!! !!! !!!!!!!!!!!!!!! ! !! !!!!!!!!!!!!! !!!!!! ",
- " !!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " !!!! # !!!!!!!!!!!!!!!!! # !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !! #### !!!!!!!!!!!!!!! ### !!!!!!!!!!!!!! # !!!!!!!!!!!!! ",
- " ####### !!!!!!!!!!!! ###### !!$!!!!!!!! #### !!!!!!!!!!! ",
- " ######$##$ $!!!!!!!!! ######### !$!!$!!!$ $ $$$### !!!!!!! # %%%%%% ",
- " #######$#### $ $!$!$!!! ########### $$$$!$ $ $#$#$##### !!!!! #### %%%%%% ",
- " ###########$#$$$$ $ !!$! ############## $ !$$ $ $#$$#$###### !! ##### %%%%%% ",
- " #########$##$#$$$#$$ $ $ ################ $ $ $ $#$#$#$$####### ######## %%%%%% ",
- " #############$#$###$ $ #################### $$$##$############# ##########%%%%%% ",
- " ########$ #####$#### $ $########### ######$##$ ######$##$####################%%%%%% ",
- " &&&&&####### $ $##$#######$ $######### #####$#$$#$########$#$################## %%%%%% ",
- " &&&&&&#### $ $####$##$$########## ####$##$$#####$#$#$ $ ################ %%%%%% ",
- " &&&&&& ## $$ $$$###$###$######## # # # ####$$#$$$$$#$$#$ $ $ ############# %%%%%% ",
- " &&&&&& $ $$$ $#$$#$#$#$##### # ### # ###$#$$##$$##$$$$ ########## %%%%%% ",
- " &&&&&& $$ $$##$#$###### ## ## ## #$$######$$#$ $ $$$$$$ ######## %%%%%% ",
- " &&&&&& $$$$$$ $$$ $ #$######$$$ # # #$##$########$ $$$$$$$$$ #### %%%%%% ",
- " &&&&&& $$$$$$$$$$ $ ######$$$$$ # $#$#$$#$$##### $$$$$$$$$$$$ ## %%%%%% ",
- " &&&&&&$$$$$$$$$$$$$ $$####$$$$$$$ $$$$#$##$$$### $$$$$$$$$$$$$$ %%%%%% ",
- " &&&&&$$$$$$$$$$$$$$ $$$$#$$$$$$$$$$ $$$$$$##$$$$$$$ $$$$$$$$$$$$$$$$ $ %%%%%% ",
- " &&&&&$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$#####$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ %%%%%% ",
- " &&&&&&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#$#$#$$#$$$$ $$$$$$$$$$$$$$$$ $$$$$$$$$$$ %%%%%% ",
- " &&&&&&$$$$$$ $$$$$$$$$$$$$$$ $$#$$$#$#$#### # $$$$$$$$$$$$$$ $$$$$$$$$$ %%%%%% ",
- " &&&&&& $$$ $$$$$$$$$$$$$ #$####$##$#$# ## #$$$$$$$$$$$$ $$$$$$$$$$ %%%%%% ",
- " &&&&&& $ $$$$$$$$$$$ #$###$$$$$# # # $$$$$$$$$$ $$$$$$$$$$ '''''''%%%% ",
- " &&&&&& $$$$$$$$$ ##$$$$$$$ ## # $$$$$$$ $$$$$$ %%%'%'''%%%% ",
- " &&&&&& $$$$$$ #$$$$$ # $$ '''''''''''''''%%%% ",
- " &&&&&& && #(( ((((( '''%%%'%%%%%'''%%%% ",
- " &&&&&& &&&(((((( ((((((( (((((((( ((((((((( ''%''%''%''%'''%%%% ",
- " &&&&&& &&&(((((( (((((((((( (((((((((( (((((((((((( '''%%%''%''%'''%%%% ",
- " &&&&&& ((&&&(&&&&& (((((((((((( ((((((((((((( (((((((((((((('''''''''%%''''%%%% ",
- " &&&&&((&&((((((&((( ((((((((((((((( ((((((((((((((( ((((((((((((((('%%%%%'%%%%%'''%%%% ",
- " &&&&(((((&&&(((&(((( (((((((((((((((( (((((((((((((((((((((((((((((((((((( % %%%%%% ",
- " &&&&&((&&&(((((((((((((((((((((((((((((((((((((((((((((((((((((( (((((((((( % %%%%%% ",
- " &&&&&&(&((&( &&&((((((((((((( ((((((((((((((( ((((((((((((((( ((((((((%(% %%%% %%%%%% ",
- " &&&&&& &&&( &&(&(((((((((( (((((((((((( (((((((((())))())))))))(%((% %% %%%%%% ",
- " &&&&&& ( &&&(((((((((( (**(((((((( ((((((((())()()())))))))%%%))% % %%%%%% ",
- " &&&&&& &&&& (((((((((++ ******((((((( ,,,,,,,,,,,,,,(()))()()())))))))))))% %% %%%%%% ",
- " &&&&&& & &&&&&(((((+++++ ******(------ ,,,,,,,,,,,,,,( ()()(()()))))%%%%%)%)) %%%%%% ",
- " &&&&&& &&&&& +++(+++++++ ****** ------,,,,,,,,,,,,(,,( (()))(())))))))%))))%%%% %%%%%% ",
- " &&&&&& +++++++++++ ******-------,,,,,,,,,,,,(((()((())))))))))))%))))%%%) %%%%%)) ",
- " &&&&&& &&&& &&&+++++++++ ******-------,,,,,,,,,,,,,(,......... )))))%%%%%)%%%)) ))))%% ",
- " &&&&&& & & &++&+++++++ *****-------,,,,,,,,,,,,,(,......... )))))%% )%%)%)) ",
- " &&&&&& &&&&&+&&&+++++++ *****------ ........,,,,,,,..(....(.( )%%%)) )))%%%) ",
- " &&&&&& +++++++++///+++ *****------...............((.((.((..( (( )))))))%%%%%% )",
- " &&&&&& & &&&+++++++/+////+////*****------.............(.((.((..(.. ( ( ( ))))))))%%%%%))",
- " &&&&&& ++++++++++/+/+/+/+//+/*****------..............((.((.((..( ( ( ( )))))))))))%% ",
- " &&&&&& +++++++++////+/+///+//+****-------....... ((0((0000000(0( )))))) %%%%%%) ",
- " &&&&&&+++++++++//+++/+/////+//+***-------...... 0(000000000000( ( )))))) ))%)%%))",
- " &&&&&&+++++++//+/+++/+////+/+/+***------....... 000000000000000 )))))) )%%)%% )",
- " &&&&&&++++++///+/+//+///+/+/++/***------....... 000000000000000 )))))) %)))%%) ",
- " &&&&&&++++++/+/++/+// ++++++/////------...... 000000000000000 )))))))%%%%%%) ",
- " &&&&&&+++++ /++//+// + + /////------...... 000000000000000))))))))))))) )))%%) )",
- " &&&&&& ++ //+//// ++ + //////----...... 000000000))))))))))))))))))) )%%%%%))",
- " &&&&&& //////+ + + ///../........... )))))))))))))))))))))))))))%%%))))",
- " &&&&&& /////+/+ + + ...//// . ....... )))))))))))))))))))))))) %%)%)) ",
- " &&&&&& /////++ ++++ .....///. ....... ))))))))))))))))))))))) %%%%%%))",
- " &&&&&& ///+/+ ++ /..//.... ....... )))))))))))))))))))))) %%%)))))",
- " &&&&&& ////+++ + ..//////.. ......................... ))))))) %%%%%% ",
- " &&&&&& /////++ //..//.. .......................... %%%%%% ",
- " &&&&&& /////// /..///. . ........................ %%%%%% ",
- " &&&&&& //////// .//.//. . . ....................... %%%%%% ",
- " &&&&&& //////// /./..// .. . ...................... %%%%%% ",
- " //////// //////../ . .................... %%%%%% ",
- " ////////// //////.//.. . . . ",
- " //////////////////////. . . 11111111111111111111111111 ",
- " /////////////////////. . ... 11111111111111111111111111 ",
- " ////////////////// . . .. 11111111111111111111111111 ",
- " //////////////// . .. . 11111111111111111111111111 ",
- " ////////////// ... . 11111111111111111111111111 ",
- " ///////// // . . 11111111111111111111111111 ",
- " / // / / . 1 1 1 1 ",
- " /// //// / / / 1 1 11 1 1 11 ",
- " / / / / / / / 111111111 11 1 ",
- " / / / / / 1 11 1 1 1 ",
- " /// / / / 1 1 11 1 1 11 ",
- " / / / / ",
- " / / / /// 1 1 1 ",
- " // // // // / / / 1 1 11 11 11 1 ",
- " // /// // // / 11 111 11 11 ",
- " / / / / / / 1 111 11 11 1 ",
- " / 1 1 1 ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-5-600-600-1.0-grid-reference.json b/tests/visual_tests/grids/lines-5-600-600-1.0-grid-reference.json
deleted file mode 100644
index 8d2817d..0000000
--- a/tests/visual_tests/grids/lines-5-600-600-1.0-grid-reference.json
+++ /dev/null
@@ -1,174 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "10",
- "2",
- "12",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ",
- " ! ! ! !!! ! ",
- " ! !! !! !! ! ! !! !! ",
- " !!! !! !!!!! !!! ! !! !! ! ! !!! !! ! !!!! ",
- " ! !! !!! !!!!!!!!!!! !!! !!! ! !!!!! !! !! ! ! ! !! !! !! ",
- " ! !!!!!!!!!!!!!!!!!!! !! !! !!!! !!!!!!!!!!! !!! !!!!!!!!! !!! !! ",
- " ! !! !!!!!! !!!!! !!!! !! ! !!!!!!!!!!!! !!! !!! !!! !!!!!!!!! ! !!! !!! !! ",
- " !!! !!!!!! !!!!! !!! ! !!! !!!!! !!!!!! ! ! !!!!!!!!!!! ! ! !! !!!!! ",
- " !!! !!!!!! !!!!!! ! ! ! !!!!!!!!!! !!!!!!!!! !! !!!! !!!!!! !!!!! !! ! !!! !! !!!!!! ",
- " !!!!!!! !!!!! ! !!! !!!!!! !!!!!!!! !!! !!!!! !!!!!!!!! !!!! !!! !!!!! ",
- " !!!!!!! !!!!! !!!!!! !!!!!! !!!!! ! ! ! ! !!!!!! !!!!!!!!! !!!!!!! ",
- " !!!!!! !!!!! ! ! !!!!!! !!!!!! !! ! !!!!!! !!!!!!!!! !!!!!! ",
- " !!!!! !!!!!!! ! !!! !!!!! !!!!!!!!! !!! !!!!! !!!!! !! !!!!! ",
- " !!! !!!!!!! !!!!!!!!!! !!!!! ! ! !!!!!! !!!!!!!! !!!!!!! ",
- " !!!!! ! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!! !!!!! !!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!! !!!!!!!! ",
- " !!!!!!! !!!!!! !!!!! ",
- " ## !!!!! # !!!! !! ",
- " ##### !!! #### ! # $$$$ ",
- " ######## ###### ### $$$$ ",
- " ########## ######### ##### ## $$$$ ",
- " ###### ###### ###### ##### ######### #### $$$$ ",
- " ###### ###### ###### # ##### ########### ###### $$$$$$ ",
- " ###### ###### ###### # ###### ##### ##### ######$ $$$$$$ ",
- " ####### ######## ###### ## ###### ##### ###### ##### $ $$$$$$ ",
- " ###### ## ######### ##### ### ##### ###### # ##### ###### $ $$$$ ",
- " ##### ### # ###### ###### # ## ##### ##### # ###### ###### $ $$$$$$ ",
- " %%% ### ### ### ##### ####### # #### # ###### ##### # # ###### ###### ## $$ $$$$$$ ",
- " %%% # ## # ##### ###### # # ##### ###### # # ### ##### ########## $$ $$$$$$ ",
- " %%% ## ###### ######### ## ##### ###### ## ## ########## ### ## $$$$$$ ",
- " %%%%% ## ##### ##### ## #### # ###### ##### & ### ## ######## ### # $$$$$$ ",
- " %%% %%%%% & #######&### ## # # & ########## &&& ### ##### # # $$$$ ",
- " %%% %%%%% &&&& ###&&&#&# # ### &&&&&& ####### & & # # ## # # $$$$ ",
- " %%%% %% &&& & &##&#&#& #### &&&& & && #### &&&& &&&& # & # ### $$$$ ",
- " %%% %% & & & &### & ### &&&& ## & &&&&& &&& ## $$$$ ",
- " %%% %%% && && & & & & && & & & & &&&&& && & $$$$ ",
- " %%% %%% && && & & &&&&& &&&&& & & & &&&&&&&&&&&& &&& && &&&&&&&&&&&& && & && $$$$ ",
- " %%%% % &&&&&&&&&&& & && & &&& &&&&&&&&& &&& &&&&&&&&&&&&&& &&&&& & &&&&&&&&&&& & &&& $$$$ ",
- " %%% &&&&&&&&&& & && & &&&&&&&&&&&& & && & &&&&&&&&&&&&& && && &&&&&&&&&&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&&&&& &&&& & &&&&&&& &&&&&&& &&&&&& &&&&& && &&&&&& &&&&& & $$$$$$ ",
- " %%% &&&&&& &&&& && && &&&&&& &&&& && && &&&&&& &&&&& & &&&& &&&&& &&&& & & $$$$$$$$$ ",
- " %%% &&&&& &&&& && &&&&&& &&&& && &&&&&& &&&&&&&&&& &&&&& &&&& && & $$ $$$$$$ ",
- " %%% &&&&& &&&&&& && &&&&& &&&& & &&&&& &&&& & &&&&&&& &&&& & &&&& $$$$$$$$$ ",
- " %%% &&& &&&&& &&&&&& &&&&& &&&&&& &&&&&&&&&&&&& &&&&&&&&&&&& $$ $ $$$$ ",
- " %%% & &&&&&&&&&&&& &&&&&&&&&&& &&&&&&&&&& &&&&&&&&& $ $$$$$$ ",
- " %%% %% &&&&&&&&& &&&&&&&&& &&&&&&&& &&&&&& $$$$$$ ",
- " %%% %%%%% &&&&&&& &&&&&& &&& & $$$$$$ ",
- " %%%%% % && $$ $ $$$$ ",
- " %%%%% '''''' $ $$$$ ",
- " %%%%% % '''''' $$$$ ",
- " %%% %%% '''''' $$$$ ",
- " %%%%%%%%% '''''' $$$$ ",
- " %%%% %% ''''''''''''''''''' $$$$ ",
- " %%%%%%%% ''''''''''''''''''' $$$$ ",
- " %%%%%% ((( (((((( ((((((( ''''''''''''''''''' $$$$ ",
- " %%% ((((((( (((((((( ((((((((( ((((((((((( ' ' $$$$ ",
- " %%% (((((((((( ((((((((((( (((((((((((( ((((((((((((( '''' $$$$ ",
- " %%% ((((((((((((( ((((((((((((( ((((((( ((((( (((((( (((( $$$$ ",
- " %%% ((((((( ((((( (((((((((( ((((( ((((( (((( ((((((( ( (((( ''''' ' $ $$$$$$ ",
- " %%% ((((( (( ( (((( ((((((((((( ((((( ((((((((((( ((((( (((((( ( (((( ( '' ' ' $$$$$ ",
- " %%% %((((( ( (((( ((((( ((( (((( ((((((((( ( (((( (((((((( (( ( ((((( ((( $$ $ $$$$ ",
- " %%%%% (((( (( ( (((( ((((( ( (((( ((((( ( ((( ((((( ((((((( ( (( ( (((((((()()))) $$ $$$$$$ ",
- " %%%%% %( ( ( ( (((((( (((((( ( ( ((((((((((( ((( (((((((((( ( (( (( ( ((((((())) )) $$ $$$$$$ ",
- " %%% % %%% ( ((( ( ((((((((((( (((( ( ( ( ((((((((( ((( ( ( (((((((( (((( ( ((((((( ) $$ $$$$ ",
- " %%%%% %% ((( (((((((( **((( ( (((((( (( ( ((((((( ( (( (( (( (( ))))) $$ $$$$$$ ",
- " %%%%% % ( ( ((((( **** +++ (( ( (( ((((( )))())) ( ((((( )) ) )) $$$$$ ",
- " %%%%%% ( ((((( ***** ++(( ( ((( ((( (( ( ))))))))))))))()))(()))))))))) $$$$ ",
- " %%% % % ( ( ( ****** +++((( ((,,, ((( ( )))))))))))))(()))))))))))))) $$$$ ",
- " %%%%%%%% (( ***** +++(((( ((,,, -- ( ((( )))))))))))))(()))))))))))))) $$$$ ",
- " %%%%%% (( (((***** +++ ( ((,,, ----..--.-.-----------.... .. (( ))))))))) $$$$ ",
- " %%% (((****** +++ (,, ----......------------ ... . ))))) $$$$ ",
- " %%% ********* +++ ,,, ----.--.-------------- .. )))) $$$$ ",
- " %%% ***** ** ++++ ,,, .. ..... ..... ... )))) $$$$ ",
- " %%% ******** ** ++++ ,,, , .......... ..... ... )))) $$$ ",
- " %%% ***** * *** ++++ ,,,,,, .. ........................ ))) $$$$$$ ",
- " %%% ***** **** +++ ,,,,,, ,, ................................ ))) $$$$$$$$ ",
- " %%% % ****** * ** +++ ,,,, ,,, ................................ ))) $$ $$$$$ ",
- " %%% %% % ***** * * +++ ,,, , ................... ))) $$$$$$$$ ",
- " %%% %%%% ****** * +++ ,,, ,, , .... ))) $$$$$ ",
- " %%% % ****** //// ++/+ ,,,,, , .... ))) $ $$$$$ ",
- " %%% % %% ***** /////////// /+/// ,,, ,, ... ))) $$$$$ ",
- " %%% %%% ****** ////////////////// +// ,,,, , ... ))) $ $$$$$ ",
- " %%% % ****** * ///////////////////// +++ /,,,, ,,, ... ))) $$$$$$ ",
- " %%% % ***** *** ////// //////// /+/ /,,,, .... ))) $$ $$$ ",
- " %%% ****** ** ** ///// //// /// /,,, . .... 00000000000000000000000 )))) $$$ ",
- " %%% ****** *** ***////// ////+/+ /,,, .. . .... 00000000000000000000000 )))) $$$ ",
- " %%% ***** * *////// ////// / ,,,... ... 00000000000000000000000 ))) $$$ ",
- " %%% *** **** ///// //// / ,,,... ... 00 0 ))) $$$ ",
- " %%% ** * * //// //// ,,,, . ... 000 ))) $$$ ",
- " %%% ** /// //// ,,,, .. .... )))) $$$ ",
- " %%% //// ///// . ...... 0 000 0 )))) $$$ ",
- " %%% %% ////// //// .... ... )))000)0)00))))))))))))))))))))))) $$$ ",
- " %%% % %% /////// /// ...... ))))))))))))))))))))))))))))))))) $$$ ",
- " %%% %% / ///// //// .... ))))))))))))))))))))))))))))))))) $$ $$$$ ",
- " %%% % % ///////// /// ... ) )) ))))))))))) $$$ $$$ ",
- " %%% % % / // /// /// ... ) )))) ) ) ))) $$$ $$$ ",
- " %%% % %% / // /// /// .... ) ) )) $ $$$ ",
- " %%% %% / ////// /// // ..... )))) ) ) ) )) $$ $$$$ ",
- " %%% % % // ///// //// // ..... ) ) ))))))) $ $$ $$$ ",
- " %%% % ///// ///// // ...... ))))) ) $$$$ $$$ ",
- " %%% //// ////// // ............................... $$$$$ ",
- " %%% //// /// // // .............................. $$$ ",
- " %%% //// /// / / ............................. $$$ ",
- " %%% //// /// / / ... . ... . $$$ ",
- " //// ////// / . . ... $$$ ",
- " //// ///// // .. ",
- " / / ///// ////// .. ..... . ..... ",
- " // // //// ////// .... .. .. .. .. ",
- " // ////// ///// ",
- " / ////////// ////// ",
- " / //////////////// ////// 11111111111111111111111111111111111111 ",
- " / // ///////////////// 11111111111111111111111111111111111111 ",
- " / / //////////// 11111111111111111111111111111111111111 ",
- " / / //// // 11111111111111 1 1 ",
- " // ///// 1 111 11 1 111 ",
- " / / 1 111 1 1 ",
- " // 11 1 11 11 1111 ",
- " / ///// // 111111111 111111111 ",
- " // / 111111111 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-5-600-600-2.0-grid-reference.json b/tests/visual_tests/grids/lines-5-600-600-2.0-grid-reference.json
deleted file mode 100644
index 926a9b5..0000000
--- a/tests/visual_tests/grids/lines-5-600-600-2.0-grid-reference.json
+++ /dev/null
@@ -1,174 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "7",
- "5",
- "16",
- "6",
- "10",
- "2",
- "12",
- "13",
- "14",
- "3",
- "11",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ! ! ",
- " !! ! ",
- " ! ! !! ",
- " ! !!! ! ! ",
- " !! ! ! ! ",
- " !!! ! ",
- " ! ! ! !!!! !!! ! ",
- " ! !! !!!! ! ! ! ! ! ! ! ! ! ! !!! ",
- " !! !! ! ! ! ! ! ! ! ! !! ! ! ! ! !! ! ! ! ! ",
- " !! !! !!!!! !! ! ! ! ! ! ! !! ! ! ! ! ! !! ! !!! ! ",
- " ! !! !! !! ! !!!! ! ! ! ! !! ! ! ! !! ! !!!! ! ! ",
- " !!!! ! ! !! !!!! ! ! ! ! ! ! ! ! ! ! ! !!!! ! ! ",
- " !!!!!!!! ! ! !! ! ! ! ! ! ! ! !!!!! !! ! !! ! ! ! ! ",
- " !!!!!!!!!! ! ! ! ! !!!! !!!!!!! ! !! ! !!!!! ! ! ! ! ! ",
- " !!!!!!!!!!!!! !! ! !! ! !!!!!!!!!! ! ! !! ! !!!!!!!! ! !! ! ! ! ",
- " !!!!!!!!!!!!!!!! !! ! ! !!!!!!!!!!!! !!!! ! !! !!!!!!!!!! !! !! ! ! ! ! !!! ",
- " !!!!!!!!!!!!!!!!!!! ! ! ! !!!!!!!!!!!!!!! ! ! ! ! ! !!!!!!!!!!!!! !!! ! ! ! !!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! ! !! ! ! !!!!!!!!!!!!!!!!!! !! !! ! ! !! !!!!!!!!!!!!!!! ! ! ! !!! !! !!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! ! !! ! !!!!!!!!!!!!!!!!!!!! ! !! ! ! !!!!!!!!!!!!!!!!!! ! ! ! ! !!!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !! ! !!!!!!!!!!! !!!!!!!!!!! ! ! ! ! !!!!!!!!!!!!!!!!!!!!! !!! ! ! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! !! ! !!!!!!!!!!! !!!!!!!!!!! !! ! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! ",
- " !!! !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " # !!!!!!!!!!!!!!! # !!!!!!!!!!!!!! !!!!!!!!!!!! ",
- " ##### !!!!!!!!!!!!! ### !!!!!!!!!!!! !!!!!!!!!! ",
- " ####### !!!!!!!!!!! ###### !!!!!!!!! ### !!!!!!!! ",
- " ########## !!!!!!! ######### !!!!!! ##### !!!!! $$$$$$ ",
- " ############# !!!!! ############ !!!! ######## !! ## $$$$$$ ",
- " ################ !! ############## ! ########### #### $$$$$$ ",
- " ################### ################ ############# ####### $$$$$$ ",
- " ##################### #################### ################ ######## $$$$$$ ",
- " ############ ########## ########### ########## ################### ########### $$$$$$ ",
- " ########### ########### #####%##### ########## % ########## ########## ########### $$$$$$ ",
- " ########## #%######## ######%#### ########### % #####%%### ########### ########## $$$$$$ ",
- " ####### %##%######%% ######%%#%# % %%%########## %% % ###%#%#%## ########### ########### $$$$$$ ",
- " &&&&&& ###### %%%%###%#%#%#% ########%#%% % % % ##########% %####%#%%##% ##################### $$$$$$ ",
- " &&&&&& ### % %#%#%#%#%#% ########%##% %%%% % % % ########## %#%#%%#%#%% ################## $$$$$$ ",
- " &&&&&& # % %#%#%#%%%%######%##### % %%% % % ###%#%######%#%%#%#% ################ $$$$$$ ",
- " &&&&&& % % % %%%##%%#########%#%%#% % % % #%#%#%#####%##### # ############# $$$$$$ ",
- " &&&&&& %%% % %% ##%##########%#%% % %%##%######%## ## ########### $$$$$$ ",
- " &&&&&& %%% %% ############% %%%%% %%#%%%#%##### # ## ######## $$$ $$$$$$ ",
- " &&&&&& % %%% % ###########% %%% % % %%##%#### % # # ## #### $ $ $ $$$$$$ ",
- " &&&&&& %%% % % ######## % % % %%% %%%%% #%%#%%# % %%%#%#%%# # # ### $ $ $ $ $$$$$$ ",
- " &&&&&& %%%%%% %%%%%% % % #####%%%%%%% % % %% % % %%%%%%%%%%##%# %%% % %%%%#%##%%% # # ### $$ $$$$$$ ",
- " &&&&&& & %%%%%%%%%% %% %%%% ###%%%%%%%%% % %% % % %%%%%%%%%%%%%## %%% % % %%%%%%##%%%#%%## # ## # $$$$$ $$$$$ $$$$$$ ",
- " &&&&&& &&&%%%%%%%%%%%%%% % % %%%%%%%%%%%%%% % % % %%%%%%%%%%%%%%% %% % % %%%%%%%#%###%%%% # # ### $$$$$$ ",
- " &&&&&& &&&%%%%%%%%%%%%%%% % % % %%%%%%%%%%%%%%%%% %%% %%%%%%%%%%%%%%%%%% %%%% %%%%%%%%%%#####%%% # $$$$$ $ $$$$$$ ",
- " &&&&&& %&&%&&&&&%%%%%%%% %% %%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%#%%%#%%# $$$ $$$$ $$$$$$ ",
- " &&&&&& &&%%%%%%&%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%% %%%%%%%% %%%%%%%%%%% %#%#%### ##% $$ $$ $$$$$$ ",
- " &&&&&& %%&&&%%%&%% %%%%%%%%% %%%%%%%%%% %%%%%%%% %%%%%%%%%% %%%%%%%% %%%%%%%%%% %%%#%%#%###%# $$$ $ $ $$$$$$ ",
- " &&&&&& &&%%%&&&&& %%%%%%%%% %%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%% %%#%%##%%#%#% $ $ $ $$$$$$ ",
- " &&&&&& & %&%%%&& %%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%% %%%#%#%##%#%% $$$$$ $$ $$$$$$ ",
- " &&&&&& & %&%%& & %%%%%%%%%%%%%%%% %%%%%%%%%%%%%%% %%%%%%%%%%%%%%% %%%%%%%%%%%%%% $ $$$ $$$$$$ ",
- " &&&&&& %% & & %%%%%%%%%%%%%% %%%%%%%%%%%%% %%%%%%%%%%%% %%%%%%%%%%%% $ $$$ $$$$$$ ",
- " &&&&&& &&&& & %%%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%% %%%%%%%% $$$$$ $$ $$$$$$ ",
- " &&&&&& & &&&&& %%%%%%%%% %%%%%%%% %%%%%%% %%%% '''''$$'$$$$$$ ",
- " &&&&&& %%%%% %%% % ''$$$$''$$$$$$ ",
- " &&&&&& &&&&& ''''''''$$$$$$ ",
- " &&&&&&& &&& && '''''''''''''''''''''$$$$$$ ",
- " &&&&&&&& & & & '''''''''''''''''''''$$$$$$ ",
- " &&&&&&&&&&&& & & ((( (((((( '''''''''''''''''''''$$$$$$ ",
- " &&&&&&& &&(((((( ((((((( ((((((((( ((((((((((( )''''''')'''''''''''''$$$$$$ ",
- " &&&&&&&& &&& (((((((((( (((((((((( ((((((((((( ((((((((((((( )')'')'')'''''''''''''$$$$$$ ",
- " &&&&&&& (((((((((((( ((((((((((((( (((((((((((((( (((((((((((((((( )))')')')''))'''''''''$$$$$$ ",
- " &&&&&&& ((((((((((((((( (((((((((((((((( (((((((((((((((( ((((((((((((((((( ')')))'))')')''''''''$$$$$$ ",
- " &&&&&&& ((((((((((((((((( (((((((((((((((((( ((((((((((((((((((( ((((((((((((((((((( ) ))) )) ) ) $$$$$$ ",
- " &&&&&&& ((((((((((((((((((( (((((((((((((((((((( ((((((((((((((((((((( ((((((((((( (((((((( ( )) $$$$$$ ",
- " &&&&&&&(((((((((((((((((((( ((((((((((( (((((((( (((((((((( (((((((( ((((((((((( ((()()(()(((( ) $$$$$$ ",
- " &&&&&&&((((((((( (((((((( ((((((((((( (((((((((((((((((((( ( ((((((((((((((((((( (( ((()()))())()()) ) $$$$$$ ",
- " &&&&&&& (((((( (((((((((((((((((( ((((((((((((((((( ( ( ( (((((((((((((((((( ( ( (( ((()(())((())(() ))) $$$$$$ ",
- " &&&&&&& (((( (((((((((((((((( ((((((((((((((( ((( ( ((((((((((((((( ((( (( ((()())((())(()) ) ) $$$$$$ ",
- " &&&&&&& (( ((((((((((((((( (((((((((((((( ( (((((( (((((((((((((((( (( ((( ( ()()(())()(()) ) ) $$$$$$ ",
- " &&&&&&& (((((((((((((** (((((((((((( ( ( ( (((((((((( )))()))))(()(()))((((((( ))) ) $$$$$$ ",
- " &&&&&&& ((((((((((***** ++++++ ((((((((( ( ( ((( ((((((( ))))())))))()))))))))))))))) ) $$$$$$ ",
- " &&&&&&& ((((((******** ++++++ (,((( ( (( )))))))))))()()))))))))))))))) $$$$$$ ",
- " &&&&&&& (********** ++++++ ,,,,,, ---------(((-------- ))))))))))))())))))))))))))))))) $$$$$$ ",
- " &&&&&&& *********** ++++++ ,,,,,, ------(--------------- )))))(((()()))))))))))))))))))))) $$$$$$ ",
- " &&&&&&& *********** ++++.++ ,,,,,, -(((((-((------------- ))))()(())()))))))))))))))))))))) $$$$$$ ",
- " &&&&&&& ********** +++.++. ,,,,,, -((-((-(-------------- (( (( (( ( ()()))))))))))))))))))) $$$$$$ ",
- " &&&&&&& *********** +++..+. ,,,,,,, (-(-(((((((((-(--------( (( (( ( ( (( ( ))))))))) $$$$$$ ",
- " &&&&&&& && *********** +.++.+ ,,,,,,,( (((----(-(-((-(-------- ( ((( /( ( ( ))))))) $$$$$$ ",
- " &&&&&&& && ********** ++++....,,,,,,, (( (( //(/(-(---------//((/(//////((( ( ))))))) $$$$$$ ",
- " &&&&&&& &&& *********** . . +++++.. ,,.,,, ( ////////(///////////////(//////// ( ))))$$$ $ $$$$$$ ",
- " &&&&&&& &&& & *********** . . .++++.+.,.,,,, ///////////(///////////////////// )))))) $$$$$$ ",
- " &&&&&&& && & ********** *** .. .+.+++. .,..,, ////////////////////////////////// $$$)$$$$$ $$$$$$ ",
- " &&&&&&& & &&&&&********** * . ...+.+++.,.,,,, /////////////////////////////////// $))$))$) $ $$$$$$ ",
- " &&&&&&& &&& ************ *.*.*..*. ..++.+++,.,..,, /////////////////////////////////// $$$))$$ $ $$$$$$ ",
- " &&&&&&& & &&&******* *.*...*..*....... .....+,,.,,., ////////// ))))))) $$$$$$ ",
- " &&&&&&& &&& *&*&&****** *****.....*.*.........+..++..,.,.. /////// ))))$$$$$ $$$$$$ ",
- " &&&&&& **&*&&****** ***.*....***.*........++++.+,,,.,, /////// $$$$$))$ $$$$$$ ",
- " &&&&&& &********* * *..*...*.*.*..........+++.+..,,,,, ////// 00000000000000000000000 )))))$$$ $$$$$$ ",
- " &&&&&& **&**&&&&&* * **.*....**.***..........++++.+,..,,, ////// 00000000000000000000000 $$$))) $$$$$$ ",
- " &&&&&&*&&&&*&&&&& **..*....*..* ............+++.+..,,,, ////// 00000000000000000000000 $)$$)))$$$ $$$$$$ ",
- " &&&&&&********* .*.....**.* ......++++.,,..,, ////// 00000000000000000000000 $$$))$ $ $$$$$$ ",
- " &&&&&&*&*&***&&& ......**..* * ....... ,,.,,,, ////// 00000000000000000000000 )))))$$$$ $$$$$$ ",
- " &&&&&& **&**& & .....*.*.* * ........,.,,,, ////// 00000000000000000000000 $$$$$)$$ $$$$$$ ",
- " &&&&&& &&&& &&& .....**. *** .......,,,,,, ////// 00000000000000 )$)))))$$$ $$$$$$ ",
- " &&&&&& ** ...*.*.** ......,,,,,, ////// ))))))))))) $$$$$)$$$$ $$$$$$ ",
- " &&&&&& &&&& ....*.* * ....... , ////// )))))))))))))))))))))))))))))))))))$$$$ $$$$$$ ",
- " &&&&&& ..... .....** ....... ////// )))))))))))))))))))))))))))))))))))) $$$ $$$$$$ ",
- " &&&&&& .. ...... ..... ////// )))))))))))))))))))))))))))))))))))$$ $$$$$$ ",
- " &&&&&&. . ............ ...... ////// )))))))))))))))))))))))))))))))))) $$$$$$ ",
- " &&&&&&. . . ....... ...... ////// )))))))))))))))))))))))))))))))))) $$$$$$ ",
- " &&&&&& . ... ....... ...... /////// ))))))))))))))))))))))))))))) $$$$$$ ",
- " &&&&&.... . ...... ....... //////// ) ) ) $$$$$$ ",
- " &&&&.& ... ...... ....... //////// ) ) ))) ) ))) $$$$$$ ",
- " &&&&&& .. . ...... ...... /////////////////////////////////// ) ) ))) ) ) ) $$$$$$ ",
- " &&&&&&. . ... ...... ...... ////////////////////////////////// ) ) ) ) ) ) $$$$$$ ",
- " &&&&&. . . ........ ...... ///////////////////////////////// ) ))) ) ) $$$$$$ ",
- " &&&&&&. . . ......... ...... ///////////////////////////////// $$$$$$ ",
- " &&&&&& . . ........ ....... ///////////////////////////////) ) ) ) ) $$$$$$ ",
- " &&&&&&.. .. . ........ ....... /////////////////////////////) ) )) )) ))) ) $$$$$$ ",
- " . .... ........ ....... / // )) ))) )) ) $$$$$$ ",
- " ... . ........ ......... / / / // // ) ) ) ) ) )) ) ",
- " .. .... ........ .......... . // / / // / / ) ",
- " . .. ........ ........... . . / / // / / ",
- " . ............. ............ . . / /// / /// 1111111111 ",
- " .......................... . . .. . 111111111111111111111111111111111111111 ",
- " ........................ . .. . .. / /111111/111/1/1111111111111111111111111 ",
- " ...................... .. . . .. . /// ////1///1///1/1111111111111111111111111 ",
- " .................... . . . . //// /1/1/1/111/1/1111111111111111111111111 ",
- " ................. . . . . . . / // /1/1/1/1/1/111111111111111111111111111 ",
- " .......... ... . .. ... ///1/1/1///1/1111111111111111111111111 ",
- " . . . . . 1 1 ",
- " . . . . 1 111 1 1 1 ",
- " . . . . . 1 111 11 1 1 ",
- " .. . 1 1 11 1 1 ",
- " ... .. 1 ",
- " . ... 1 1 1 ",
- " .. 1 11 1 1 1 1 ",
- " .. 1 11 1 1 1 1 1 1 1 ",
- " 1111 1 1 1 1 1 ",
- " 1 1 1 1 1 111 1 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-5-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/lines-5-800-800-1.0-grid-reference.json
deleted file mode 100644
index f6522d2..0000000
--- a/tests/visual_tests/grids/lines-5-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "12",
- "14",
- "10",
- "13",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " !! ",
- " !!!! ! ",
- " !! !!! !! ",
- " ! ! ! ! ! ",
- " ! !!! !! !!! ! !! ",
- " !!!! !!! !!!! !!! !!! ",
- " !!!!!!! ! ! !!!!!! !! !! ! ",
- " ! ! !!!!!!!!! ! !!!!! !!! !!! ! !!! ! ",
- " ! ! !!!!!! !!!!! ! !!!!!!! !! ! ! ! !!!!! ! ! !!! ",
- " ! !! !!!!!! !!!!!! ! !!! !!!!!!!!!!! ! ! ! !!!!!!!! !! !!! !! !! ! ",
- " !!!! ! !!!!!!!! !!!!! ! ! ! !!! ! !!!!!! !!!!! ! ! !!!!!!!!!! !!! ! !! !!! ! !!!!! ",
- " !! ! !!!!!! !!!!! !! !!!! !! !!!!!!!!! !!!!! !!! !!!!! !!!!!! !! !!! !!!! !!!!!!!!!! ",
- " !!!!!! !!!!!! ! ! !! !!!!!!!!!! !!!!!! ! !! !!!!!!!! !!!!!!! ! ! ! !! !!!!! ",
- " !!!!!!!!!! !!!!!! ! !!! ! ! !!!!! !!!!!! !! !!!! !! !!!!!! !!!!! !!! !! !!!!!!! ",
- " ! !!!!!! !!!!! ! ! ! !!!!!!!!!! !!!!! ! ! !!!! !!!!! !!!!! !!! ! !!! !!! !!!!!! ",
- " !!!!!!! !!!!! !!! ! ! !!! !!!!!! !!!!! ! !!!! !!! ! !!!!!! !!!!!!! !! !! ! !!!!! ",
- " !!!!!! !!!!!!! ! !!! !! !!!!!!! !!!!!!!!!! ! !!! !!! !!!!!! !!!!! !!!! !!!!!! ",
- " !!!!! !!!!!!! !!!!! !!!!!! !!!!! !!! !! !!! !!!!! !!!!! ! !! !!!!!! ",
- " !!!! !!!!! ! !! ! !!!!! !!!!! ! ! !!!! !!!!!! !!!!!!! ! !!! !!!!! ",
- " ! !!!!! !! ! !! !!!!!! !!!!!!! ! ! !!!!! !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!! !!! !!!!! !!!!!! ! !!!!!!! !!!!!!!! !!!!! ",
- " !!!!!!!!! !!!!!!! !!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!! !!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!! !!!!!!! !!!!! ",
- " !!!!!! !!!! !!! ",
- " ### !!! # !! $$$ ",
- " ##### ! #### $$$ ",
- " ######## ####### ## $$$ ",
- " ########### ########## ##### # $$$ ",
- " ####### ###### ###### ##### ######## ### $$ $$$ ",
- " ################# ##### ##### ########## ##### $ $$ $$$ ",
- " ###### ### ##### ###### ###### ##### ##### ##### $ $$ $$$ ",
- " ###### ###### ###### ###### ###### ###### ###### $$ $$$ ",
- " ###### ## # ###### ##### ##### ###### # ###### ###### $ $$ $$$ ",
- " ###### # # ### ##### ###### ##### ##### ## ##### ##### ## $$ $$ $$$ ",
- " ####### # # # ## ##### ##### ## ###### ##### ## ######## ########## $$ $ $$$ ",
- " ###### ### # # ###### ########## # # # ##### ###### # ### ######### ##### ### ## $ $$$ ",
- " #### # # ### ##### ######### # ## ######### ##### ## # # # # ##### ###### ### ## $$ $$$ ",
- " %%% ## ### ### # ##### ######### # # # ###### ##### ###### #### ###### ###### # # # $$$ ",
- " %%% # # # # ######## ###### # ## # ####### ###### ### # # ## ##### ##### #### $$$ ",
- " %%% #### ## ######### ###### # # # ##### ###### # ## ## ###### ###### ### # $$$ ",
- " %%% % ### # # ##### ###### ### ### ##### ##### # # ########### # $$$ ",
- " %%% %% # ### ### ##### ###### ## # # ###### ##### # ## ####### $$$ ",
- " %%%%% % # # ###### ##### # ############# # ##### $$$ ",
- " %%% % ### ########### & && ############ & ## ### # $$$ ",
- " %%% % %% ### #####&#& &&&&&&&& ###### ### ## && #### # # $$$ ",
- " %%%%% ####& && ###### # & &&&& # # $$$ ",
- " %%%%%%%%% &&&&& & && & ## # ## & &&& &&& # ## $ $ $$$ ",
- " %%%%% % & & & & && & &&& & & # &&&& & & & ### $$ $$$ ",
- " %%%%%%%% &&& & && & & &&& && && ### & & &&&&&&&&&& && ## # $$ $ $$$ ",
- " %%%%%% & &&& &&&& & && & &&&&&& && &&&&&&&& ### &&& &&&& &&&&&&&&&& &&& $$ $$$ ",
- " %%% & &&&& &&&&&&&& && & &&& &&&&&&&&&& &&& && &&&&&&&&&&&& & & &&&&&&&&&&&&&&&& & $ $ $$$ ",
- " %%% & &&&&&&&&&&& && & & &&&&&&&&&&&&&& & && & & &&&&&&&&&&&&&& & & & &&&&&&&& &&&&& & & & $$ $ $$$ ",
- " %%% &&&&&&&&&&&&&&&&&& & && && &&&&&&& &&&&&& &&& & &&&&&&&&&&& &&&&& &&& && &&&&&&&&&& &&&&& & $$ $ $$$$ ",
- " %%% &&& &&&&&&& &&&&& &&&& && && &&&&&&& &&&&& && && & && &&&&&& &&&&& &&&&& && &&&&& &&&&& &&&& $$$$$$ ",
- " %%% &&&&&& &&&& && & &&& &&&&&&&&& &&&& && & & &&&&& &&&&&&& & &&&&& &&&& && && $$$$ ",
- " %%% &&&&&& &&&&&&& & &&&&&&&& &&&&&& & &&&&&& &&&& & & &&&&&& &&&&& && & & $$$$ ",
- " %%% &&&&& &&&& & &&& &&&&&& &&&& & &&&&& &&&& & & &&&&& &&&&& & && && $$$$ ",
- " %%% % &&&&& &&&& &&&& &&&&& &&&& & &&&&& &&&&& & & &&&&& &&&&& & &&&&&&& $$$$ ",
- " %%% %% %&&& &&&& &&& &&&&&& &&&& & &&&&& &&&&& &&&&&& &&&&&&&&&&&&&& $$$$ ",
- " %%% % & &&&&& &&&&&&& &&&&&& &&&&&& &&&&&&&&&&&&& &&&&&&&&&&& $$$$ ",
- " %%% % &&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&& &&&&&&&&& $$$$ ",
- " %%% % %% &&&&&&&&&&& &&&&&&&& &&&&&& &&&& $ $$$$ ",
- " %%% % &&&&&&& &&&& & $$ $$$$$$ ",
- " %%% %% %% && $$ $$$$$$ ",
- " %%% %% % $$ $$$$$$ ",
- " %%% %% % $$$$$$ ",
- " %%% %% ''''''''$ $$$$$$ ",
- " %%% '''''''' $$$$$$ ",
- " %%% '''''''' $$$$$ ",
- " %%% ''' $$$$$$ ",
- " %%% ''''''''''''''''''''''''' $ $$$$ ",
- " %%% ''''''''''''''''''''''''' $$$$ ",
- " %%% (( ''''''''''''''''''''''''' $$$$ ",
- " %%% ((((((( (((((((( ''''''''''''''''''''''''' ' $$$$ ",
- " %%% % (((((( (((((((( (((((((((( (((((((((((( ''' '''' '' ''' $$$$ ",
- " %%% %% %% (((((((((( (((((((((((( ((((((((((((( (((((((((((((( ' ''''' ' ' ' $$$$ ",
- " %%% % (((((((((((((( ((((((((((((((( (((((((( ((((( ((((((( (((( (((( ''' ' '' '' ' $$$$ ",
- " %%% %% ((((((( (((((( ((((((( (((( ((((((( ((((( (((( (((((( ( (((((((( ' ' ' ' ''''' ''' $$$$ ",
- " %%% %% %% ((((((( ( (((( (((((( ( (((( (((((( (((( ( (((( ((((( ((( (((( ' ' '' ''' ' $$$$ ",
- " %%% %% (((((( ( (((( (((((( (((( ((((( ((((( ((((( (( ((((( $ $ $$$$ ",
- " %%% %% %%((((( ( (((( ((((( ((( ( (((( (((((( (((( ( (((( (((((( ( ( ( (((( (( $$$$$ ",
- " %%% %% %((((( ((( ( (((( ((((( ( ((( (( ((((( ((((( ((((((((( (((( ((((((( ( ( (((( (((( (((( $$ $ $$$$ ",
- " %%% %% %(((( ( (( (( (((( (((((( ( (((( ((((((((( ((((((( ( ((( (((( (((((( (( ( ( ((( ((((( (((((( $ $$$$$$ ",
- " %%% %% (( ((( ((((( (((((( ((( (((((((( (((((( (( (( ( ((((((((((((((( ((( ( ((((((((((((( $$ $ $$$$ ",
- " %%% ( ( (((((( (((((( ((( (( (( (((((((((((( ( ((( (( ((((((((((((( (( ( ( ((((((((( $$ $ $$$$ ",
- " %%% ( ( ((((((((((( ( ((( ( ( ( (((((((((( (( ((( (( ( (((((((( ( (( ((((((( $ $$$$$$ ",
- " %%% ( (((((((( ((( )) (( (( ((((((( ( ( ( ((((( (( ((( ( ( (( (( ( $$$$$ ",
- " %%%% ( (((( ( (())) *** (( ( (((( ++ +++ ((( ( (( ((((((( , $$$$ ",
- " %%%% (((( )(()) *** ( ((( ++++++ (((( ( (,,,,,,,,,,, ( ( (( ,, $$$$ ",
- " %%%% ( ((())) *** ( (((( ,,,,,,,,,,,,,,,,,,,,(,((((((,,,, , ,, $$$$ ",
- " %%%% ( ((()))) **** --- +++ + + ( ,,,,,,,,,,,,,,,,,,,,,,,((,(,((,,,,,,, , , ,,, $$$$ ",
- " %%%% % ()())) **** --- ++ + + ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,, $$$$ ",
- " %%%%%% %% ())))) *** --- ++++++ ,,,,,,,,,,,,,,,, , ,, $$$$ ",
- " %%%%%% ))))))))) ) *** ---- +++++++++++++++++++++++++++++ ,,,,,,, ,, $$$$ ",
- " %%%%%% ))))) )) )) *** ------ - ++++++++++++++++++++++.++++++ . ,,,, , $$$$$$ ",
- " %%%%%% % )))))) ))) )) *** --- -- - +++++++++++++++++..+.+...++++ .... . ,,,,,, $$ $$$$$$ ",
- " %%%%%% )))))) ) ) ) ***** ** ------ - .... . ... ... . ,,,, $$ $ $$$$ ",
- " %%%%%% %% ))))) )))) ****** * --- - - ........ . .. . . .. ,,,, $$ $$$$$$ ",
- " %%%%%% %% )))))) ))) ) *** * ----- - . .. .......... ... . ... ,,,, $$ $ $$$$ ",
- " %%%%%% %% )))))) ) **** ** --- - . . ......... .. .. . ,,, $ $$$$$$ ",
- " %%%%%% ))))) *** * ** ----- -- . . . ................................. ,,, $$$$$$ ",
- " %%%% )))))) *** * ** --------- ............................................. ,,, $$$$$$ ",
- " %%%% )))))))) / ****** ** --- --- ............................................. ,,, $$ $ $$$$ ",
- " %%%% ))))))))) ) /// // ********* --- ................. ,,, $$$$$$ ",
- " %%%% )))))))))) ) / /// *** ** --- ..... ,,, $$$$ ",
- " %%%% )))))) ) ) /// / *** ----- .... ,,, $$$$ ",
- " %%%% ))))) ) )) / / / *** ------ - ... ,,, $$$$ ",
- " %%%% )))))) ) //////// *** ---- -- ... ,,, $$$$ ",
- " %%%% % )))))) ))) /////////////// *** ---- .... ,,, $$$$ ",
- " %%%% % %% ))))) ))) ////////////////////// **** --- -- .... ,,, $$$$ ",
- " %%%%%% )))))) ////// ////////////// **** ----- - ... ,,, $$$$ ",
- " %%%%%% )))))) ////// ///////// / //* --- -- ... ,,,, $$$$$$ ",
- " %%%%%% % ))))) ) ///// //// //*/* --- - ... ,,,, $ $$$$$$ ",
- " %%%% % ))))))))))) ////// ////////*// ---- --- ... 00000000000000000000000000000 ,,,, $ $$$$$$ ",
- " %%%%%%%%%))))))) )) ////// //// //*// ---- . ... 00000000000000000000000000000 ,,, $ $$$$ ",
- " %%%%%% %%)))) ))) )) ///// /////// // --- . ... 00000000000000000000000000000 ,,, $ $$$$$$ ",
- " %%%%%%%%%))) ) ) ) ////// //// / /--- .. ... 00 0 ,,, $$ $$$$$$ ",
- " %%%%%% ))) )))) ////// ///// // --- .. . ... 000 ,,, $$ $$$$$$ ",
- " %%% ) )))) //// //// / / --- . . ... ,,,, $$$$$$ ",
- " %%% ) ) /// ///// --- . . ... 0 000 0 ,,,, $$$$$ ",
- " %%% /// //// --- .. ... 000 0 00 ,,, $$$$ ",
- " %%% // /// ///// .. . ... ,,,, $$$$ ",
- " %%% / // /// //// .. ... ,,,,,,,,,,,,,,,, ,,,, $$$$ ",
- " %%% ////// /// ... ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, $$$$ ",
- " %%% // /////// /// ... ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, $$$$ ",
- " %%% %% // / /// //// ... ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, $$$$ ",
- " %%% %%%% // / /// //// ... , , ,,, ,, , ,,,, $$$$ ",
- " %%%%% % /// / /// //// .... , , ,,, ,,, , , , , $$$$ ",
- " %%%%% // / /// /// / .... ,, , ,, ,,, $ $$$$ ",
- " %%%%% %% ////// /// / .... ,,,,, , ,, , ,,,,,,, , ,, , $ $ $$$$ ",
- " %%% % %%% //// /// / / ..... ,, ,,,, ,,,,,,,,, ,, , $$ $$$$ ",
- " %%%%%%%%% /// /// / / .... $$ $ $$$$ ",
- " %%%%% %% /// ///// / ... ..... $ $$$$ ",
- " %%%%%%%% /// //// / / .. . ...... $ $ $$$$ ",
- " %%%%%% /// ///// / .. ........................................... $$$$$$ ",
- " %%% //// /// // . ... ........................................ $$ $ $$$$ ",
- " %%% //// /// / .. . . ...................................... $$$$$$ ",
- " %%% //// /// // . . .. . $$$$ ",
- " %%% //// /// .. .. .. ... . $$$$ ",
- " ///// //// . $$$$ ",
- " / /////// ///// .. ..... . ... . $$$$ ",
- " /// /////// ///// ......... ... . .. ",
- " // ////// ////// ",
- " // ////// ////// ",
- " /// // //// ///// ",
- " / ////// //////// ",
- " / / ///// ////// // / ",
- " /// /////////// ///// /// / ",
- " / /////////////////////// / / 11111111111111111111111111111111111111111111111111 ",
- " //////////////////// / / 11111111111111111111111111111111111111111111111111 ",
- " / //////////// / / 11111111111111111111111111111111111111111111111111 ",
- " / / /// //// /// 1111111111 1 11 1 1111 ",
- " /// / / 1 111 1 11111 1 1 11 1 ",
- " // 11 11 1 1 ",
- " /// // / 11 1 11 111 1111 1111 111 ",
- " ////// 1 1111111 11111 1 11 1 1 1 1 ",
- " 111111111 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-5-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/lines-5-800-800-2.0-grid-reference.json
deleted file mode 100644
index 1384fda..0000000
--- a/tests/visual_tests/grids/lines-5-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "10",
- "12",
- "13",
- "14",
- "3",
- "11",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! !!! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! !!!! ",
- " !!!!!! ! ! !! ! ! !! ",
- " !! ! ! ! ! ! ! ! ! !!! ! ! ",
- " ! ! ! ! ! ! ! !! ! !! ! ! ! !!! ! ",
- " ! ! ! ! ! !!! ! !!!!! ! ! ! ! ! ! ! !! ! ! ",
- " ! !!! !! ! ! ! !! ! ! !! ! ! ! !!! !! ! ! ! !!! ",
- " ! ! ! ! !!! !!!! ! ! ! !!!! ! !!! ! ! ! ! ! ! ! ",
- " ! ! ! !!!!!! ! ! !! ! !! ! ! !! ! ! ! ! ! ! ! ",
- " ! ! !!! ! !!!!!!!!! !! ! !! ! ! !!!!! !! ! ! !!! !!!! !! !!! !! ! ! !! ! ! ",
- " ! ! ! ! !!!!!!!!!!! !! ! ! ! ! ! ! ! ! !!!!!!! ! !! ! ! ! !!!!! ! !! ! !! ! ! ! ! ",
- " !! !!!! !!!!!!!!!!!!!!! ! !! ! ! ! ! !! ! ! !!!!!!!!!!! ! !! ! ! ! !! !!!!!!! ! !! ! !!!!! ! !! ! !!! ! ",
- " !! !! !!!!!!!!!!!!!!!!!! ! !! ! !!!! !!! !! !!!!!!!!!!!!! ! ! !!! ! !!!!!!!!!! ! ! ! ! !!! ! ! ! ! !! ",
- " !!! ! !!!!!!!!!!!!!!!!!!!! ! ! !! ! ! !!! !!!!!!!!!!!!!!! ! !! ! ! !!!!!!!!!!!!! ! ! ! ! !! !! !!! !!!! ",
- " !! !!!!!!!!!!!! !!!!!!!!!! ! ! ! ! ! ! !!!!!!!!!!!!!!!!!!! ! ! ! !!!!!!!!!!!!!!! ! ! ! ! !!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!!! !! !! !!!!!!!!!!!!!!!!!!!!! ! ! ! ! !!!!!!!!!!!!!!!!!! ! !! ! !!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !! ! ! ! !!!!!!!!!!! !!!!!!!!!! !!!! ! !! ! !!!!!!!!!!!!!!!!!!!! ! !! !!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! ! !!! ! ! !!!!!!!!!!! !!!!!!!!!! ! !! ! ! ! ! !!!!!!!!!!! !!!!!!!!!!! ! ! !! ! !!!!!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!! !! ! !!!!!!!!!!! !!!!!!!!!!! !! !! ! ! ! !!!!!!!!!!! !!!!!!!!!! ! !!! !! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ! ! ! ! ! ! !!!!!!!!!!! !!!!!!!!!! ! ! !! ! !! !!!!!!!!!! !!!!!!!!!! ! !! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! ! ! !!!! ! !!!!!!!!!!! !!!!!!!!!! ! ! ! ! !!!!!!!!!!! !!!!!!!!!! ! ! !!!!!!!!!! ",
- " !!!!!!!!! !!!!!!!!!! ! ! !! !!!!!!!!!!! !!!!!!!!!!! !! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!! !!!!!!!!!! ! !!!!!!!!!!! !!!!!!!!!!! ! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! ",
- " !!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! ",
- " ## !!!!!!!!!!!!! # !!!!!!!!!!!! !!!!!!!!!!! ",
- " ##### !!!!!!!!!!! #### !!!!!!!!!! !!!!!!! ",
- " ######## !!!!!!!!! ###### !!!!!! ## !!!!! $$$$$$ ",
- " ########## !!!!! ######### !!!! #### !! $$$$$$ ",
- " ############## !!! ############ !! ######## # $$$$$$ ",
- " ################ ############## ########## #### $$$$$$ ",
- " ################### ################## ############ ##### $$$$$$ ",
- " ##################### #################### ################ ####### $$$$$$ ",
- " ############ ########### ########### ########## ################## ########## $$$$$$ ",
- " ############ ########## ########### ########## #################### ########### $$$$$$ ",
- " ############ ########## ########### ########### ########## ########### ########### $$$$$$ ",
- " ############ ########### ########## ########## ########### ########### ########### $$$$$$ ",
- " ########### ########## ########### ########## ########## ########## ########## $$$$$$ ",
- " ######### ########## ########### ########## ########## ########### ########### $$ $ $$$$$$ ",
- " ###### ########## ########### ########### ########### ########### ########### $$ $$$$$$ ",
- " %%%%%%% ##### & ########### ########### ########## ########### ########## ########### $ $$$$$ $$$$$$ ",
- " %%%%%%% ## & & ########## & && ########## ########## ########## ##################### $ $ $ $$$$$$ ",
- " %%%%%%% &&&& ##########& & ########### ########### ########## ################## $ $$$ $$$$$$ ",
- " %%%%%%% & & &&& ########&#&& #&######### & ############&######## ############### $$$$ $$$$$$ ",
- " %%%%%%% & &&&&& & ####&&&&#&#&&######## & && ##########&##&###& & & # ############# $$$$$$ ",
- " %%%%%%% & && & &#&&&#&#####&##&## &&&&& & & & ########&#&#&##& & & & # ########## $$$$ $$$$$$ ",
- " %%%%%%% & & & && && & &#&##&#######&#&# & & & &&& & ##########&###& & &&& # ## ####### $$$ $$$ $$$$$$ ",
- " %%%%%%% %% & &&& && & &&&& &&&&#&#####&#&#&#& & && & & && #######&#&#& & & # ## ##### $$ $ $$$$$$ ",
- " %%%%%%% % & &&& & & & & & ####&&#&#& && & & & && ####&### && & # # # # ## ## $$$ $ $ $$$$$$ ",
- " %%%%%%% %% %%%%% & &&& &&& & & & & ##&##&& & & & & & & & ##&### & & # # # ## ## # $ $ $$$$$$ ",
- " %%%%%%% %%% % & & &&& && & & & &&##& && & & &&&&&&& &#&& & & &&&&&&#### ## # # # # # $$$$ $$$ $$$$$$ ",
- " %%%%%%% %%% % &&&&&&& & & & & &#&# &&&&&&&&& & & & & &&&&&&&&&&& &&&& & & &&&&&&&&&#&&## # # ## $ $$$ $$$$$$ ",
- " %%%%%%% % %%%%% &&&&&&&&&& &&&& & && &&&& &&&&&&&&&&&& & & & & &&&&&&&&&&&&&& & && & & &&&&&&&&&&&&##&### # $ $$ $$$$$$ ",
- " %%%%%%% % % &&&&&&&&&&&&& & & & & && &&&&&&&&&&&&&&& & & & & && &&&&&&&&&&&&&&&&& && & & & & &&&&&&&&&&&&&&&&#& # # $$$$ $ $$$$$$ ",
- " %%%%%%% % %%%&&&&&&&&&&&&&& &&& & & & & &&&&&&&&&&&&&&&&& && & && & &&&&&&&&&&&&&&&&&&& & &&& & & &&&&&&&&&&&&&&&&&#&###### # # $$ $$$$$$ ",
- " %%%%%%% %%% %&%%&&&&&&&&&&&&&&& & & && &&&&&&&&&&&&&&&&&&&& & &&& & &&&&&&&&&&&&&&&&&&&&& & &&&& &&& &&&&&&&&&&&&&&&&&&&&&&# ### # $$$$ $$$$$$ ",
- " %%%%%%% &%&%%&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&&&&&&& &&&& & & &&&&&&&&&&&&& &&&&&&&&&&&& & & &&&&&&&&&&&& &&&&&&&#& # # # $$$$$$ ",
- " %%%%%%% %&&&&&&&&&&&& &&&&&&&&&& &&&&&&&&&&& &&&&&&&&& & &&&&&&&&&&& &&&&&&&& & &&&&&&&&&&& &&&&&&&& # # # # $$$$$$ ",
- " %%%%%%% %&&&&&&&&&& &&&&&&&&& &&&&&&&&&& &&&&&&&& && &&&&&&&&&& &&&&&&&& & &&&&&&&&&& &&&&&&&& && $$$$$$ ",
- " %%%%%%% %%%%&%%%%%& &&&&&&&& &&&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&& &&&&& $$$$$$ ",
- " %%%%%% %&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% % %&&&%%% &&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% % &%& % &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% %%%% &%%% &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&& $$$$$$ ",
- " %%%%%% %%%% &&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&& &&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&& &&&&&&&& &&&& & $$$$$$ ",
- " %%%%%% &&&&& & '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ( ((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ((((((( ((((((((( ((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ((((((((( (((((((((((( ((((((((((((( ((((((((((((((( '''''''''''''''''''''''$$$$$ $$$$$$ ",
- " %%%%%% ((((((((((((( (((((((((((((( (((((((((((((((( (((((((((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% (((((((((((((((( ((((((((((((((((( (((((((((((((((((( ((((((((((((((((((( $$$ $$$$$ $$$$$$ ",
- " %%%%%% (((((((((((((((((( (((((((((((((((((((( (((((((((((((((((((( ((((((((((((((((((((( $ $$$$$$ ",
- " %%%%%% ((((((((((((((((((((( ((((((((((((((((((((( (((((((((((((((((((((( (((((((((((( ((((((((( $$$ $ $ $$$$$$ ",
- " %%%%%% %%((((((((((((((((((((( (((((((((((( (((((((( ((((((((((( ((((((((( (((((((((( ( ( (((((((( $$ $$$$$$ ",
- " %%%%%% % ((((((((((( (((((((( (((((((((( ( ( (((((((( ((((((((((( ((((((( (((((((((( ( ( (((((((( (( $$$$$ $$$$$ $$$$$$ ",
- " %%%%%% (%%((%%%%( (((((((( (((((((((( ( ( ( (((((((( (((((((((( (((((((( (((((((((( (( ( ( (((((((( ((((( $ $$$$$$ ",
- " %%%%%% %%%((((((( ((((((( (((((((((( (( (( ( (((((((( (((((((((( ((((((((( ((((((((((( (( ( ((((((((((((((((( $$$$$$ ",
- " %%%%%% %%%((((( ((((((((((( ((((((((((( ( ( (( ( ((((((((((((((((((((( (( (((((((((((((((((((( ( (( ((((((((((((((((( $$$ $$$ $$$$$$ ",
- " %%%%%% (((%%%% (( (((((((((((((((((((( ( (( (( (( ((((((((((((((((((( ( (( ((((((((((((((((( ( ((((((((((((((((((( $ $$$ $$$$$$ ",
- " %%%%%% % % (( ( (((((((((((((((((((((( (( (( (((((((((((((((( ( ( ( (((((((((((((((( (( ((((((((((((((((( $$$ $ $ $$$$$$ ",
- " %%%%%% % %%% (( ((((((((((((((((()(( ( ((((((((((((((( ( ( (( (((((((((((((( (( ((((((((((( $ $ $$$$$$ ",
- " %%%%%% %%% % ( ((( ((((((((((((( )))( (((((((((((( ( ( (( ( ( (((((((((( * (( ( ( ((( ((((((((( $$$$ $ $$$$$$ ",
- " %%%%%% %%% %%% ( ((( (((((((((((( )))))( ( ( +++++ ((((((((( ( ( ( (( ( (( (((((((( ******(***(*(((**(**(* ((( $ $$$ $$$$$$ ",
- " %%%%%% % ( ( ( (( (((((((((( )))))))) ( ( ( (+(++++ (((( ( (( ( ( ( (( ( (( (( ****(*(*(((*(****(*(***************** $ $$$ $$$$$$ ",
- " %%%%%% ((( ( (( ( ( ( ))))))))()( (( (+++++ ,( (( ( ( ( ( ( ( ( ( ( ( ( ****((*(((*(*((*(********************** $$$$ $$$ $$$$$$ ",
- " %%%%%% %%%%% %%%%% (((( ( ( ( ( )))))))))(( ( ((((+(++++ ,,,(,,( ( ( ( ( ( ((( ( ( ( **(*(*((****(**((*********************** $ $$$$$$ ",
- " %%%%%% %% ( ( ( ( ( ( )))))))))() (( (+((++ ,,,(,,( -((--(------(-((---((--( ( (( ***(((*(****(**(*(************************ $$$ $$$$$$ ",
- " %%%%%% % %%% (( ( ( ( )))))))))))((( ( ++(+(( ,,,,(, ( ((-(---------((((-(-----(-(--- ****((*******((*(************************** $$$$$$ ",
- " %%%%%% % ( ( ( )))))))))) ( ((++(++ ,,,,,,( (( -(-(--------(-(-(---------(-( (************************** $$$$$$ ",
- " %%%%%% %%%%% %%% (( (((( ()))))))))) +++++++ ,,,((,((( (-(------------((-(((---(--(-( ( ********* $$$$$$ ",
- " %%%%%% ( ((())))))))))) ++++++ ,,,,(,((( --------------(-(--(((((-((--( ********* $$$$$$ ",
- " %%%%%% %%%%% ( ()()()))))) ++++++ ,,,,,,(( (( ----------------(-(-(--((--(- ******* $$$$$$ ",
- " %%%%%% ()()()())))) +.++++ ,,,,,,,( -----(--(-(-(-( ******** $$$$$$ ",
- " %%%%%% ))((()))))) +.++.+ ,,,,,,, /////////////// ******* $$$$$$ ",
- " %%%%%% )))))))()) ....+++ ,,,,,, ////////////////////////////////////// ****** $$$$$$ ",
- " %%%%%% ))))))))))) .++.+++ ,,,,,, /////////////////////////////////////////// ****** $$$$$$ ",
- " %%%%%% ))))))))))) +.+.+. ,,,,,, //////////////////////////////////////////// ****** $$$$$$ ",
- " %%%%%% )))))))))) )) . . . +..+.. .. ,,,,,, ///////////////////////////////////////////// ******* $$$$$$ ",
- " %%%%%% )))))))))))) ) ) ... . +++.++.. ,,,,,,, ///////////////////////////////////////////// ******* $$$$$$ ",
- " %%%%%% )))))))))))) ) ) ) ) ... ...+++++. .,,,,,,, //////////////////////////////////////////// ******* $$$$$$ ",
- " %%%%%% )))))))))) ) ) )..) . ... .+++++.. ,,,,,, //////////// ******* $$$$$$ ",
- " %%%%%% ))))))))))) )))) ) ...).)...... .. ...++++...,,,,, /////// ******* $$$$$$ ",
- " %%%%%% ))))))))))) )) ) ...))).)............ ...+++.++. ,,,,,, /////// ******* $$$$$$ ",
- " %%%%%% )))))))))) ) ) )) ..)...)................. ++.+++. .,,,,, ////// ****** $$$$$$ ",
- " %%%%%% )))))))))))))))) ) ...)).).).................. ..++++ ,,,,,,///// ////// ****** $$$$$$ ",
- " %%%%%% )))))))))) ) ) ...)..)..................... ++.+.. ,,,,,,, ////// ****** $$$$$$ ",
- " %%%%%% )))))))))) ) ...)).)........................+.++.+ ,,////,///// ////// 00000000000000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))))))))). ..))..))).. ..............++..++.,,/,,/ / //////// 00000000000000000000000000000 ****** $$$$$ $$$$$$ ",
- " %%%%%% )))))))))) . .).))..).. ........++.++.+,,,//, / ///////// 00000000000000000000000000000 ****** $$$$$$ ",
- " %%%%%% ))))))...) . ...))).)).. .......++.. ,////, /////// 00000000000000000000000000000 ***$$$ $$$$$ $$$$$$ ",
- " %%%%%% ))))))).)) ... . ..).).))... ........ ,,,,,, //// ////// 00000000000000000000000000000 ******* $ $ $$$$$$ ",
- " %%%%%% ))))))... . ....)...). ........ ,,///// ////// 00000000000000000000000000000 ****$$$ $$$ $$$$$$ ",
- " %%%%%% ))).) . . .....)).. ....... ,,,,,,, /// ////// 000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))) ... . ........ ........ ,,,//,/ ////// ****** $$$$$ $$$$$$ ",
- " %%%%%% ) ... ............ ........,,,//,/ /// ////// **$$$$$ $ $$$$$$ ",
- " %%%%%% . . ....... ........ ,/// ////// *** ******* $$$$ $$$$$$ ",
- " %%%%%% .. . ....... ........ // /// ////// ***************************** *************$$$ $$$$$$ ",
- " %%%%%% . ...... ........ // ////// **********************************************$$ $$$ $$$$$$ ",
- " %%%%%% ... .... ...... ..... / / /////// *********************************************$$$ $ $ $$$$$$ ",
- " %%%%%% . . . ...... ......///// /// /////// ********************************************* $$$ $$$$$$ ",
- " %%%%%% ... .... ...... ...... ///// ////// ******************************************** $ $$ $$$$$$ ",
- " %%%%%% . .. ....... ...... // ////// ******************************************* $ $$ $$$$$$ ",
- " %%%%%% .. .. ....... ...... // ////// * * *************** $$$$ $$$ $$$$$$ ",
- " %%%%%% . ... ...... ...... /////// * ** * * $$$ $$$$$$ ",
- " %%%%%% .. ...... ....... //////// *** * * * * * $$$ $$$$$$ ",
- " %%%%%% .... ...... ....... /////// * * * * * * $$ $$$$$$ ",
- " %%%%%% ...... ...... ///////// * ** * *** $$$$$$ ",
- " %%%%%% ....... ...... ////////// ////////////////////////////////// $$$$$$ ",
- " %%%%%% ....... ...... /////////////////////////////////////*/**/*/ * * * $$$$$$ ",
- " %%%%%% ....... ...... /////////////////////////////////////*/***/*** *** *** * $$$$$$ ",
- " %%%%%% ........ ....... ///////////////////////////////////////**// * ** * * $$$$$$ ",
- " %%%%%% ........ ....... ///////////////////////////////////*/**/* ** ** * * $$$$$$ ",
- " %%%%%% ........ ...... //////////////////////////////////////** * * *** * $$$$$$ ",
- " %%%%%% ........ ...... .... //////////////////////////////////// $$$$$$ ",
- " ........ ....... . . / / / $$$$$$ ",
- " ........ ......... .. /// / / / / / $$$$$$ ",
- " ....... ............ ... / /// / / / ",
- " ........ ............ . .. / / / / /// ",
- " ........ ........... . ... ",
- " ......... ........... ... . / / / / / / ",
- " .. ........... .......... . .. . . ... / // / / // /// / ",
- " . .. ................. ........... . . . . / /// / / / / /11111111111111111111111111 ",
- " . . ................................. .... . .. 111111/1//1/1/111/111/1111111111111111111111111111 ",
- " . .. . ........................... . . . 111111/11/1///111/1///1/11111111111111111111111111 ",
- " .... . ............................. . . ... . 11111111111111111111111111111111111111111111111111 ",
- " . . . .. ........................ . . . 11111111111111111111111111111111111111111111111111 ",
- " ... . ... . ................ . .. . 11111111111111111111111111111111111111111111111111 ",
- " .. . . ... ......... . .... . 11111111111111111111111111111111111111 ",
- " . . . . . . . . . . 1 1 1 ",
- " . ... . . . .. 1 111 1 1 11 1 ",
- " ... . .. . 1 1111 1 11 ",
- " .. . . 1 111 1 1111 ",
- " . ... . ",
- " . . . . 1 1 1 ",
- " . . . 1 1 1 1 1 11 1 ",
- " . 11 11 1 1 1 1 1 ",
- " 11 111 1 1 1 ",
- " 11 1 111 1 111 1 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-6-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/lines-6-200-200-1.0-grid-reference.json
deleted file mode 100644
index 3962661..0000000
--- a/tests/visual_tests/grids/lines-6-200-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "12",
- "10",
- "2",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " !! ! ",
- " !!!!! !!!! !!! ",
- " !!!!!!!! !!!!!!! !!!!!! !!! ",
- " !!!!!!!!!! !!!!!!!!! !!!!!!!! !!!! ",
- " !!!! !!!!! !!!!! !!!!!!!!!!!!!!!!!!!!! ",
- " !! # !!!!!!!!! # !!!!!!!!! !!!!!!!! ",
- " #### !!!!!!! ### !!!!! ## !!!!!! ",
- " ###### !!! ###### !!! ##### !! ## $$$ ",
- " ########## !!######### ######## ####$$$ ",
- " #### ##### ############ ###############$$$ ",
- " %%%## ############ ######### ######## $$$ ",
- " %%% ####### ####### ##### $$$ ",
- " %%% &&&& ####&& &&&#### &&&&&### $$$ ",
- " %%%%&&&&&&& &&#&&& &&&&&&# &&&&&&& $$$ ",
- " %%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& $$$ ",
- " %%%&&& &&&&&&&&&&&&&&&& &&&&&&& &&&&&& $$$ ",
- " %%% & &&&&& &&&&&&& &&&&& &&&&& '''$$ ",
- " %%% &&& && & '''''''$$ ",
- " %%% ((( (((( (((( ((((( '''''''$$ ",
- " %%%((((((( (((((( ((((((( ((((((('''''''$$ ",
- " %%%((((((((((((((((((((((((((((((((((( $$$ ",
- " %%%((( (((((((( ((((((( ((((((( ((((( $$$ ",
- " %%% ( ((((( (()((((( ((((*********** $$$ ",
- " %%% (((++ ))),,,--------************ $$$ ",
- " %%% ++++++ ))),,,--------***.*********$$$ ",
- " %%% +++/+ ))),,,--.----..... ****$$$ ",
- " %%% +++++/// ))),,,............ ***$$$ ",
- " %%% +++++//////)),,,,............ ***$$$ ",
- " %%%++++////////)),,,,... 0000000 ***$$$ ",
- " %%%+++//////////),,,.... 0000000 ***$$$$",
- " %%%+++//// //,,,... 0000000*******$$$$",
- " %%% /// /// .... . *************$$$ ",
- " %%% /// /// .... .. ************ $$$ ",
- " %%% /// /// ............. **** $$$ ",
- " %%% //// /// ............ * $$$ ",
- " %%% //// //// ........... $$$ ",
- " ///// ////// 111 ",
- " /////////// 1111111111111 ",
- " //////// 1111111111111 ",
- " ///// 1111111111111 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-6-200-200-2.0-grid-reference.json b/tests/visual_tests/grids/lines-6-200-200-2.0-grid-reference.json
deleted file mode 100644
index 165d141..0000000
--- a/tests/visual_tests/grids/lines-6-200-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "10",
- "14",
- "12",
- "13",
- "11",
- "2",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ! ! ",
- " !!!! !!! !! ",
- " !!!!!!!! !!!!!! !!!!!! ",
- " !!!!!!!!!! !!!!!!!!! !!!!!!!! !!! ",
- " !!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " #!!!##!!!!!!!!!!##!!!!!!!!!!!!!!!!!!!!! ",
- " ##########!!!!!#!####!!!!!!!!###!!!!!#!!$$$$$",
- " ##########!!!!!#######!!!!!#####!!!!!###$$$$",
- " ###########!###########!!########!!#####$$$",
- " %%%%########################################$$$",
- " %%%%&###&############&#####################$$$$",
- " %%%&&#&&#&##########&&&#########&&#######$$$$$$",
- " %%%&&###&&&#######&&&&&&######&&&&&##### $$$$$$",
- " %%%&&&&&&&&&&####&&&&&&&&####&&&&&&&&## ''$$$$",
- " %%%%&&&&&&&&&&#&&&&&&&&&&&&#&&&&&&&&&&&& '''''$",
- " %%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&'''''''''$",
- " %%%%%(&(&&&&&&&(&&&&&&&&(&&&&&&&((&&&'''''''''$",
- " %%%((((((&&&&&(((&(&&&&(((&&&&(((((&&'''''''''$",
- " %%(((((((((&((((((((((((((((((((((((('''''''''$",
- " %%%((((((((((((((((((((((((((((())()('''('''''$",
- " %%%%((((((((((((((((((*(*(**(((()(()((((''''''$",
- " %%%%%((((((((((((+(+(((*(**(**))()())()()))$$$$",
- " %%%%%%((((((((+++,(,,,(*****((----)))))())))$$$",
- " %%%%%%((((((((+++,,,,,********----)))((())))$$$",
- " %%%%%%..../(//+++,,,,,********----))))))))))$$$",
- " %%%%%%((.//////++,,,,,*******0000000)))))))))$$",
- " %%%%%%.////////++,,,,,,---***0000000 )))))))$$",
- " %%%%%%/////////++,,,,,,------0000000 ))))))$$$",
- " %%%%%%/////////++,,,,,,--- 0000000))))))))$$$",
- " %%%%%%//////////,,,,,,,--- 0000000))))))))$$$",
- " %%%%%%////// ///// --,--- 0000000))))))))$$$",
- " %%%%%%////// /////---------0000-))))))))))$$$",
- " %%%%%%///// /////--------------)))))))))$$$$",
- " %%%%%%////// /////--------------))))))))$$$$$",
- " %%%%%%///////////////-------------1111 $$$$$$",
- " /////////////// ------------1111 ",
- " /////////////// ----------1111 ",
- " ///////////// 1111111111111 ",
- " ////////// 1111111111111 ",
- " //////// 1111111111111 ",
- " // ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-6-400-400-1.0-grid-reference.json b/tests/visual_tests/grids/lines-6-400-400-1.0-grid-reference.json
deleted file mode 100644
index f8f2350..0000000
--- a/tests/visual_tests/grids/lines-6-400-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,124 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "10",
- "12",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " !!!! !! ",
- " !!!!!! !!!! !!! ",
- " !!!!!!!!! !!!!!!! !!!!! !! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!! !!! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!!!!!!!! !!!!! ",
- " !!!!!!!! !!!!! !!!!!!! !!!!! !!!!!! !!!!!!! !!!!!! ",
- " !!!!! ! !!!!! !!!!!! ! !!!!!! !!!!!! ! !!!!! !!!!! ",
- " !!!! !!!!!! !!!!!! !!!!!! !!!!! !!!!! !!!!!! ",
- " ! !!!!! !!!!!! !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!! !!!!!!!!! !!!!!!! ",
- " # !!!!!!! # !!!!!! !!!!! ",
- " #### !!!!! #### !!! ## !!! $$$ ",
- " ####### ! ###### ! #### # $$$ ",
- " ########## ######### ####### ### $$$ ",
- " ####### ##### ###### ##### ######### ##### $$$ ",
- " ####### ###### ###### ##### ############ ##### $$$ ",
- " ##### # ###### ##### # ###### ##### # ###### ###### $$$ ",
- " %%%%#### ##### ###### ###### ##### ###### ###### $$$ ",
- " %%%% # ##### ##### ##### ###### ########## $$$ ",
- " %%%% ############ ########### ######## $$$ ",
- " %%%% ######### ######## ##### $$$ ",
- " % %%%% ###### ###### ## $$$ ",
- " %%%% #### ### && $$$ ",
- " %%%% &&&& ##&&&&& &&&&&& &&&&&&& $$$ ",
- " %%%% &&&&&&&& &&&&&&&& &&&&&&&& &&&&&&&&&& $$$ ",
- " %%%% &&&&&&&&& &&&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&& $$$ ",
- " %%%% &&&&&&&&&&&& &&&&&& &&&&& &&&&&& &&&& &&&&&& &&&& & $$$ ",
- " %%%% &&&&&& &&&& &&&&&& &&&& &&&&& &&&& &&&&& &&&&&&&&& $$$ ",
- " %%%% &&& & &&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&& &&&&&&&& $$$ ",
- " %%%% & &&&&&&&&& &&&&&&&& &&&&&&&& &&&&&& $$$ ",
- " %%%% &&&&&&& &&&&&& &&&&&& &&&& $$$ ",
- " %%%% &&& & & ''''' $$$ ",
- " %%%% ''''' $$$ ",
- " %%%% ''''' $$$$ ",
- " %%%% ''''''''''''' $$$$$ ",
- " %%%% (( ((((( ((((( ((((((( ''''''''''''' $$$ ",
- " %%%% ((((((( (((((((( (((((((( ((((((((( ''''''''''''' $$$ ",
- " %%%% ((((((((( (((((((((( ((((((((((( ((((((((((( $$$ ",
- " %%%% ((((((((((( (((((( (((( (((((( ((((( (((((( (((( $$$ ",
- " %%%%(((((((( ((((( (((((( (((( ((((( ((((( ((((( (((( (( $$$ ",
- " %%%% ((( ( ((((( ((((( ((((((((((( (((((((((( ((((((((( $$$ ",
- " %%%% ( ((((((((() ( ((((((((( (((((((( (((((((( $$$ ",
- " %%%% ((((((()) ((((((( (((((((*** (((( $$$ ",
- " %%% (((( )))) ++++ (( (****************** $$$ ",
- " %%% )))))) ++++ ,,,, ******************** $$$ ",
- " %%% )))))) +++ ,,, --------------- ********************* $$$ ",
- " %%%% ))))) +++ ,,, --------------- * ***** $$$ ",
- " %%%%% )))))) +++ ,,, --------------- * **** $$$ ",
- " %%% )))))) +++ ,,, .............. **** $$$ ",
- " %%% ))))) ++++ ,,, ...................... *** $$$ ",
- " %%% )))))) ++++ ,,,, ....................... *** $$$ ",
- " %%% )))))) +++ ,,,, ....................... *** $$$ ",
- " %%% ))))) /////// +++ ,,, .... *** $$$ ",
- " %%% )))))) //////////// +++ ,,, .... *** $$$ ",
- " %%% ))))) ///////////////+++ ,,, ... *** $$$ ",
- " %%% ))))) ////// ///////++++,,, ... 000000000000000 *** $$$ ",
- " %%%)))))) ///// ///+++,,,, ... 000000000000000 **** $$$ ",
- " %%% ))) )) ///// //// ,,,, ... 000000000000000 **** $$$ ",
- " %%% )) ///// ////,,,, ... *** $$$ ",
- " %%% ///// /////,, ... **** **** $$$ ",
- " %%% /// //// ... *********************** $$$ ",
- " %%% /// /// ... ********************** $$$ ",
- " %%% /// /// ... ********************* $$$$ ",
- " %%% /// /// .... $$$$$ ",
- " %%% //// /// ..... * $$$ ",
- " %%% //// /// ......................... $$$ ",
- " %%% //// //// ...................... $$$ ",
- " %%% //// //// ..................... $$$ ",
- " %%% //// /// .................. $$$ ",
- " //// //// $$$ ",
- " //// ////// ",
- " //// ////// ",
- " ////////// ///// 11111111111111111111 ",
- " ////////////// 11111111111111111111111111 ",
- " //////////// 11111111111111111111111111 ",
- " //// 11111111111111111111 ",
- " 1 ",
- " 1 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-6-400-400-2.0-grid-reference.json b/tests/visual_tests/grids/lines-6-400-400-2.0-grid-reference.json
deleted file mode 100644
index 401b0cc..0000000
--- a/tests/visual_tests/grids/lines-6-400-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,124 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "10",
- "12",
- "2",
- "14",
- "13",
- "3",
- "11",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! !! ",
- " !!!!!! !!!! !!! ",
- " !!!!!!!!! !!!!!! !!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!! !! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!! !!!!!!!!!! !!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!! ",
- " !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " !!!! # !!!!!!!!!!!!!!!!! # !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !! #### !!!!!!!!!!!!!!! ### !!!!!!!!!!!!!! # !!!!!!!!!!!!! ",
- " ####### !!!!!!!!!!!! ###### !!!!!!!!!!! #### !!!!!!!!!!! ",
- " ########## !!!!!!!!! ######### !!!!!!!! ###### !!!!!!! # $$$$$$ ",
- " ############ !!!!!!!! ########### !!!!!! ######### !!!!! #### $$$$$$ ",
- " ############### !!!!!! ############## !!! ############ !! ##### $$$$$$ ",
- " ################## ! !!############### ############## ######## $$$$$$ ",
- " #################### #!!################# ################# ##########$$$$$$ ",
- " ######## ########## ########### ########## ##############################$$$$$$ ",
- " %%%%%####### ########### ########## # ##################### ################## $$$$$$ ",
- " %%%%%%#### ################### ## ################## ################ $$$$$$ ",
- " %%%%%% ## ################# ## ################ ############# $$$$$$ ",
- " %%%%%% ############## ############# ########## $$$$$$ ",
- " %%%%%% ############ &&########## &&&&&& ######## $$$$$$ ",
- " %%%%%% &&&&&& #######&&&& &&&&&######## &&&&&&&&& #### $$$$$$ ",
- " %%%%%% &&&&&&&&&& ######&&&&& &&&&&&&&&##### &&&&&&&&&&&& ## $$$$$$ ",
- " %%%%%%&&&&&&&&&&&&& &&##&#&&&&&&& &&&&&&&&&&&### &&&&&&&&&&&&&& $$$$$$ ",
- " %%% %%%%%&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& & $$$$$$ ",
- " %%%%%%%%%&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&& $$$$$$ ",
- " %%%%%%&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&& $$$$$$ ",
- " %%%%%% &&& &&&&&&&&&&&&& & &&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&& $$$$$$ ",
- " %%%%%% & &&&&&&&&&&& & & &&&&&&&&&& &&&&&&&&&& &&&&&&&&&& '''''''$$$$ ",
- " %%%%%% &&&&&&&&& && &&&&&&&& &&&&&&& &&&&&& '''''$$$$$$ ",
- " %%%%%% &&&&&& &&&&& && '''''''''''''''$$$$ ",
- " %%%%%% ((( ((((( '''''''''''''''$$$$ ",
- " %%%%%% (((((( ((((((( (((((((( ((((((((( '''''''''''''''$$$$ ",
- " %%%%%% ((((((((( (((((((((( (((((((((( (((((((((((( '''''''''''''''$$$$ ",
- " %%%%%% ((((((((((( (((((((((((( ((((((((((((( (((((((((((((('''''''''''''''$$$$ ",
- " %%%%%(((((((((((((( ((((((((((((((( ((((((((((((((( ((((((((((((((('''''''''''''''$$$$ ",
- " %%%%%((((((((((((((( (((((((((((((((( (((((((((((((((((((((((((((((((((((( $$$$$$ ",
- " %%%%%((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( (((((((((( $$$$$$ ",
- " %%%%%%(((((( (((((((((((((((( ((((((((((((((( (((((((((((((( (((((((((( $$$$$$ ",
- " %%%%%% (((( (((((((((((((( ( (((((((((((( (((((((((()))))))))))))((((( $$$$$$ ",
- " %%%%%% ( ((((((((((( ( ( (**(((((((( ((((((((()))))))))))))))))))) $$$$$$ ",
- " %%%%%% (((((((((++ ((****((((((( ,,,,,,,,,,,,(((())))))))))))))))))))) $$$$$$ ",
- " %%%%%% ((((((+++++ (*****(------ ,,,,,,,,,,,,,, )))))))))))))))))))))) $$$$$$ ",
- " %%%%%% +++(+++++++ ****** ------,,,,,,,,,,,,,,, ))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% +++++++++++ ******-------,,,,,,,,,,,,,,, ))))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% ++++++.+++ ******-------,,,,,,,,,,,,,,,///////// )))))))))))))))) $$$$$$ ",
- " %%%%%% +++++++..++ *****-------,,,,/,,,,,,,,,////////// ))))))) $$$$$$ ",
- " %%%%%% ++++++++++. *****------ ////////,//,//////////// )))))) $$$$$$ ",
- " %%%%%% +++++++++.... *****------///////////////////////// )))))))$$$$$$ ",
- " %%%%%% ++++++++++...........*****------///////////////////////// )))))))$$$$$$ ",
- " %%%%%% ++++++++++............*****------///////////////////////// )))))))$$$$$$ ",
- " %%%%%% +++++++++..............****-------/////// 000000000000000 )))))) $$$$$$ ",
- " %%%%%%+++++++++................***-------////// 000000000000000 )))))) $$$$$$ ",
- " %%%%%%+++++++..................***------/////// 000000000000000 )))))) $$$$$$ ",
- " %%%%%%++++++...................***------/////// 000000000000000 )))))) $$$$$$ ",
- " %%%%%%++++++......... ......------////// 000000000000000 )))))) $$$$$$ ",
- " %%%%%%+++++ ........ .....------////// 000000000000000))))))))))))) $$$$$$$ ",
- " %%%%%% ++ ....... ......----////// 000000000))))))))))))))))))) $$$$$$ ",
- " %%%%%% ...... ...... /////// / ))))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% ....... ...... /////// // )))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% ....... ....... /////// // ))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% ...... ....... /////// // )))))))))))))))))))))) $$$$$$ ",
- " %%%%%% ...... ....... ///////////////////////// )))))))) $$$$$$ ",
- " %%%%%% ...... ...... ///////////////////////// ))) $$$$$$ ",
- " %%%%%% ....... ...... //////////////////////// ) $$$$$$ ",
- " %%%%%% ........ ...... /////////////////////// )) $$$$$$ ",
- " %%%%%% ........ ....... ////////////////////// $$$$$$ ",
- " ........ ......... //////////////////// $$$$$$ ",
- " .......... .......... ",
- " ...................... 11111111111111111111111111 ",
- " ..................... 11111111111111111111111111 ",
- " .................. 11111111111111111111111111 ",
- " ................ 11111111111111111111111111 ",
- " .............. 11111111111111111111111111 ",
- " ......... 11111111111111111111111111 ",
- " . ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-6-600-600-1.0-grid-reference.json b/tests/visual_tests/grids/lines-6-600-600-1.0-grid-reference.json
deleted file mode 100644
index 2fed4d6..0000000
--- a/tests/visual_tests/grids/lines-6-600-600-1.0-grid-reference.json
+++ /dev/null
@@ -1,174 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "12",
- "10",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !!!!! !! ",
- " !!!!!!!! !!!!! !! ",
- " !!!!!!!!!!! !!!!!!! !!!!! ! ",
- " !!!!!! !!!!! !!!!!!!!!! !!!!!!!! !! ",
- " !!!!!! !!!!! !!!!! !!!!!!! !!!!!!!!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!!! !!!!! !!!!!! !!!!! !!!!! !!!!!! !!!!! ",
- " !!!!!!! !!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " !!!!!!! !!!!! !!!!!! !!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!! ! !!!!!! !!!!! !!!!!! !!!!! !!!!! !!!!! ",
- " !!! !!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!! !!!!!!!!! ",
- " !!!!!!! !!!!!! !!!!! ",
- " ## !!!!! # !!!! !! ",
- " ##### !!! #### ! # $$$$ ",
- " ######## ###### ### $$$$ ",
- " ########## ######### ##### ## $$$$ ",
- " ###### ###### ############ ######### #### $$$$ ",
- " ###### ###### ###### ##### ########### ###### $$$$ ",
- " ###### ##### ###### ###### ##### ##### ###### $$$$ ",
- " ####### ##### ###### ###### ##### ###### ##### $$$$ ",
- " ####### ###### ##### ##### ###### ##### ###### $$$$ ",
- " ##### # ###### ###### ##### ##### ###### ###### $$$$ ",
- " %%% ### ##### ###### ###### ##### ###### ###### $$$$ ",
- " %%% ##### ###### ##### ###### ##### ###### $$$$ ",
- " %%% ###### ###### ##### ###### ########### $$$$ ",
- " %%% ##### ##### ###### ##### ## ######## $$$$ ",
- " %%%%% ########### ########### ##### $$$$ ",
- " %%% ########### ####### # ## $$$$ ",
- " %%% ###### #### $$$$ ",
- " %%% ### ## $$$$ ",
- " %%% &&&&& $$$$ ",
- " %%% && &&&&& &&&&&&&& &&&&&&&&& $$$$ ",
- " %%% &&&&&&&& &&&&&&&&& &&&&&&&&&&& &&&&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&&&&& &&&&&&& &&&&& &&&&&& &&&&& &&&&&& &&&&& $$$$ ",
- " %%% &&&&&& &&&& &&&&&& &&&& &&&&&& &&&&& &&&&& & &&&& $$$$$ ",
- " %%% &&&&& &&&& &&&&& &&&& &&&&& &&&&&&& &&&&& &&&& & $$$$ ",
- " %%% &&&&&& &&&&& &&&&& &&&& &&&&& &&&& &&&&&& &&&& &&&& $$$$ ",
- " %%% &&& & &&&&& &&&&&& &&&&& &&&&&& &&&&&&&&&&&&& &&&&&&&&&&&& $$$$ ",
- " %%% & &&&&&&&&&&&& &&&&&&&&&&& &&&&&&&&&& &&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&& &&&&&&&&& &&&&&&&& &&&&&& $$$$ ",
- " %%% &&&&&&&&& &&&&&&& &&& & $$$$ ",
- " %%% && & & $$$$ ",
- " %%% '''''' $$$$ ",
- " %%% '''''' $$$$ ",
- " %%% '''''' $$$$ ",
- " %%% '''''' $$$$ ",
- " %%% ''''''''''''''''''' $$$$ ",
- " %%% ''''''''''''''''''' $$$$ ",
- " %%% ((( (((((( ((((((( ''''''''''''''''''' $$$$ ",
- " %%% ((((((( (((((((( ((((((((( ((((((((((( ' $$$$ ",
- " %%%%% (((((((((( ((((((((((( (((((((((((( ((((((((((((( ' $$$$ ",
- " %%%% ((((((((((((( ((((((((((((( ((((((( ((((( (((((( (( (((( $$$$ ",
- " %%% ((((((( ((((( (((((( ((((( ((((( ((((( ((((( ( (((( $$$$ ",
- " %%% ((((( (((( (((((( ((((( (((((( ( ((((( ((((( (((( ( $$$$ ",
- " %%% (((((( (((( ((((( (((( ((((( (((( (((((( ((((( ((( $$$$ ",
- " %%% (((( ( (((( ((((( (((( ((((( ((((( (((((( (((((((((((( $$$$ ",
- " %%% (( (((((( (((((( ((((((((((( (((((((((( (((((((((( $$$$ ",
- " %%% ((((((((((( ((((((((( (((((((( ((((((( $$$$ ",
- " %%% ((((((((( )) ((((((( ((((( (( $$$$ ",
- " %%% (((( ()))) *** ( ( +++++++ $$$$ ",
- " %%% ))))) **** +++++++++++++++++++++++++++ $$$$ ",
- " %%% )))))) * **** ,,, +++++++++++++++++++++++++++++ $$$$ ",
- " %%% ))))) *** ,,,, -- +++++++++++++++++++++++++++++ $$$$ ",
- " %%% ))))) *** ,,,, ---------------------- +++++++++ $$$$$ ",
- " %%% )))))) *** ,,, ---------------------- + +++++ $$$$ ",
- " %%% ))))) *** ,,, ---------------------- ++++ $$$$ ",
- " %%% ))))) **** ,,, - ++++ $$$$ ",
- " %%% )))))) **** ,,, - ++++ $$$ ",
- " %%% ))))) **** ,,, ........................ +++ $$$ ",
- " %%% ))))) *** ,,,, ................................ +++ $$$ ",
- " %%% )))))) *** ,,,, ................................ +++ $$$ ",
- " %%% ))))) *** ,,, ................... +++ $$$ ",
- " %%% )))))) *** ,,, .... +++ $$$ ",
- " %%% )))))) //// **** ,,, .... . +++ $$$ ",
- " %%% ))))) /////////// **** ,,, ... +++ $$$ ",
- " %%% )))))) ///////////////// *** ,,,, ... +++ $$$ ",
- " %%%%% )))))) //////////////////// *** ,,,, ... +++ $$$ ",
- " %%% ))))) ) ////// // //////// *** ,,,, .... +++ $$$ ",
- " %%% )))))) ///// / //// *** ,,, .... 00000000000000000000000 ++++ $$$ ",
- " %%% )))))) ////// ////*** ,,, .... 00000000000000000000000 ++++ $$$ ",
- " %%% ))))) ////// ///// ,,,, ... 00000000000000000000000 +++ $$$ ",
- " %%% ))) ///// //// ,,,,, ... 00 +++ $$$ ",
- " %%% )) //// //// ,,,, ... 0 +++ $$$ ",
- " %%% /// //// ,,,, ... ++++ $$$ ",
- " %%% //// ///// ... +++++ $$$ ",
- " %%% //// //// ... ++++++++++++++++++++++++++++++++++ $$$ ",
- " %%% /// /// .... +++++++++++++++++++++++++++++++++ $$$ ",
- " %%% /// //// .... +++++++++++++++++++++++++++++++++ $$$ ",
- " %%% /// /// ... ++ +++++++++++ $$$ ",
- " %%% /// /// .... ++ $$$ ",
- " %%% //// /// .... $$$ ",
- " %%% //// / /// ..... $$$ ",
- " %%% //// /// ..... $$$ $ ",
- " %%% /// //// ...... $$$$ ",
- " %%% //// //// ............................... $$$ ",
- " %%% //// /// .............................. $$$ ",
- " %%% //// /// ............................ $$$ ",
- " %%% //// /// . $$$ ",
- " ///// //// . $$$ ",
- " ////// ///// ",
- " //// ////// ",
- " //// ////// ",
- " ///// ///// ",
- " //////// ////// ",
- " ///////////// ////// 11111111111111111111111111111111111111 ",
- " ////////////////// 11111111111111111111111111111111111111 ",
- " //////////// / 11111111111111111111111111111111111111 ",
- " //// 11111111111111 ",
- " 1 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-6-600-600-2.0-grid-reference.json b/tests/visual_tests/grids/lines-6-600-600-2.0-grid-reference.json
deleted file mode 100644
index 221811e..0000000
--- a/tests/visual_tests/grids/lines-6-600-600-2.0-grid-reference.json
+++ /dev/null
@@ -1,174 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "10",
- "12",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !!!! ! ",
- " !!!!!!!! !!!!! !! ",
- " !!!!!!!!!! !!!!!!! !!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!! !!!!!!!! ! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!! !!!!!!!!!! !!! ",
- " !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!! ",
- " !!!!!!!!!!!! ! ! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! ",
- " !!! !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " # !!!!!!!!!!!!!!! # !!!!!!!!!!!!!!! !!!!!!!!!!!! ",
- " ##### !!!!!!!!!!!!! ### !!!!!!!!!!!!!! !!!!!!!!!! ",
- " ####### !!!!!!!!!!! ###### !!!!!!!!! ! ! ### !!!!!!!! ",
- " ########## !!!!!!! ######### !!!!!! !! ##### !!!!! $$$$$$ ",
- " ############# !!!!! ############ !!!! ! ######## !! ## $$$$$$ ",
- " ################ !! ############## ! ########### #### $$$$$$ ",
- " ################### ################ ############# ####### $$$$$$ ",
- " ##################### #################### ################ ######## $$$$$$ ",
- " ############# ########## ########### ########## ################### ########### $$$$$$ ",
- " ########### ############ ########### ########## ########## ########## ########### $$$$$$ ",
- " ########## # # ########## ########### ########### ########## ########### ########## $$$$$$ ",
- " ####### ########## ########### ########## ########## ########### ########### $$$$$$ ",
- " %%%%%% ###### ########### ########### ########## ########### ##################### $$$$$$ ",
- " %%%%%% ### ########## ########### ########## ########## ################## $$$$$$ ",
- " %%%%%% # ##################### #################### ################ $$$$$$ ",
- " %%%%%% ################### ################# ############# $$$$$$ ",
- " %%%%%% ################# ############## ########## $$$$$$ ",
- " %%%%%% ############# ############ ######## $$$$$$ ",
- " %%%%%% ########### ########### #### $$$$$$ ",
- " %%%%%% ######## &&&&& ######## &&&&&&&& ## $$$$$$ ",
- " %%%%%% &&&&&& #####&&&&&&& &&&&&&&&&&#### # &&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&& ###&&&&&&&&& &&&&&&&&&&&&&## # &&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&& &&&&&&&& && $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&& & &&&&&&&& &&&&&&&&&& &&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&& &&&&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&& &&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&& && &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% && &&&&&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&& &&&&&&&&&&& &&&&&&&&&& &&&&&&&& $$$$$$ ",
- " %% %%%%%%% &&&&&&&&& &&&&&&&& &&&&&&& &&&& ''''''''$$$$$$ ",
- " % %%%%%%% &&&&& &&& & ''''''''$$$$$$ ",
- " %%%%%%% ''''''''$$$$$$ ",
- " %%%%%%% '''''''''''''''''''''$$$$$$ ",
- " %%%%%%% '''''''''''''''''''''$$$$$$ ",
- " %%%%%%% ((( (((((( '''''''''''''''''''''$$$$$$ ",
- " %%%%%%% (((((( ((((((( ((((((((( ((((((((((( '''''''''''''''''''''$$$$$$ ",
- " %%%%%%% (((((((((( (((((((((( ((((((((((( ((((((((((((( '''''''''''''''''''''$$$$$$ ",
- " %%%%%%% (((((((((((( ((((((((((((( (((((((((((((( (((((((((((((((( '''''''''''''''''''''$$$$$$ ",
- " %%%%%%% ((((((((((((((( (((((((((((((((( (((((((((((((((( ((((((((((((((((( '''''''''''''''''''''$$$$$$ ",
- " %%%%%%% ((((((((((((((((( (((((((((((((((((( ((((((((((((((((((( ((((((((((((((((((( $$$$$$ ",
- " %%%%%%% ((((((((((((((((((( (((((((((((((((((((( ((((((((((((((((((((( ((((((((((( (((((((( ( $$$$$$ ",
- " %%%%%%%(((((((((((((((((((( ((((((((((( (((((((( (((((((((( (((((((((( ((((((((((( (((((((( (((( $$$$$$ ",
- " %%%%%%%((((((((( ((((((((((( ((((((((((( (((((((((((((((((((( ((((((((((((((((((((( (((((((((((((( $$$$$$ ",
- " %%%%%%% (((((( (((((((((((((((((((( ((((((((((((((((( (( ((((((((((((((((( (((((((((((((( $$$$$$ ",
- " %%%%%%% (((( ((( (((((((((((((((( ((((((((((((((( ((((((((((((((( (((((((((((((( $$$$$$ ",
- " %%%%%%% (( ((((((((((((((( (((((((((((((( (((((((((((((( (((((((((((( $$$$$$ ",
- " %%%%%%% ((((((((((((()) (((((((((((( (((((((((( *****************((((((( $$$$$$ ",
- " %%%%%%% (((((((((())))) ++++++ ((((((((( ((((((( **************************** $$$$$$ ",
- " %%%%%%% (((((()))))))) ++++++ (,((( (( ****************************** $$$$$$ ",
- " %%%%%%% ()))))))))) ++++++ ,,,,,, -------------------- ******************************** $$$$$$ ",
- " %%%%%%% ))))))))))) ++++++ ,,,,,, ---------------------- ********************************* $$$$$$ ",
- " %%%%%%% ))))))))))) +++++++ ,,,,,, ---------------------- ********************************* $$$$$$ ",
- " %%%%%%% )))))))))) +++++++ ,,,,,, ---------------------- ********************** $$$$$$ ",
- " %%%%%%% ))))))))))) +++++++ ,,,,,,, ---------------------- ********* $$$$$$ ",
- " %%%%%%% ))))))))))) ++++++ ,,,,,,, ---------------------- . ******* $$$$$$ ",
- " %%%%%%% )))))))))) ++++++ ,,,,,,, .....-----------............ ******* $$$$$$ ",
- " %%%%%%% ))))))))))) ++++++ ,,,,,, ................................. ****** $$$$$$ ",
- " %%%%%%% ))))))))))) +++++++ ,,,,,, ................................. ****** $$$$$$ ",
- " %%%%%%% )))))))))) +++++++ ,,,,,, .................................. ******* $$$$$$ ",
- " %%%%%%% ))))))))))) +++++++ ,,,,,, ................................... ******* $$$$$$ $ ",
- " %%%%%%% ))))))))))) //////// ++++++,,,,,,, ................................... ******* $$$$$$$ $$ ",
- " %%%%%%% )))))))))) //////////////// ++++++,,,,,,, .......... ******* $$$$$$$ $ ",
- " %%%%%%% ))))))))))) ///////////////////++++++,,,,,, ....... ******* $$$$$$ ",
- " %%%%%% ))))))))))) /////////////////////++++++,,,,,, ....... ****** $$$$$$ ",
- " %%%%%% )))))))))) //////////////////////++++++,,,,,, ...... 00000000000000000000000 ****** $$$$$$ ",
- " %%%%%% ))))))))))) ////////////////////////++++++,,,,,, ...... 00000000000000000000000 ****** $$$$$$ ",
- " %%%%%%))))))))))) /////////// ////////////+++++,,,,,, ...... 00000000000000000000000 ****** $$$$$$ ",
- " %%%%%%))))))))) ////////// //////++++,,,,,,, ...... 00000000000000000000000 ****** $$$$$$ ",
- " %%%%%%)))))))) ////////// /////// ,,,,,,, ...... 00000000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))))) ////////// ////////,,,,,, ...... 00000000000000000000000 ******* $$$$$$ ",
- " %%%%%% )))) //////// ///////,,,,,, ...... 00000000000000 ******* $$$$$$ ",
- " %%%%%% )) /////// //////,,,,,, ...... *********** ****** $$$$$$ ",
- " %%%%%% ////// /////// , ...... ************************************ $$$$$$ ",
- " %%%%%% /////// /////// ...... ************************************ $$$$$$ ",
- " %%%%%% ////// ///// ...... *********************************** $$$$$$ ",
- " %%%%%% /////// ////// ...... ********************************** $$$$$$ ",
- " %%%%%% //////// // ////// ...... . ********************************** $$$$$$ ",
- " %%%%%% /////// ////// ....... .. ***************************** $$$$$$ ",
- " %%%%%% ////// /////// ........ . *** $$$$$$ ",
- " %%%%%% ////// /////// .......... * $$$$$$ ",
- " %%%%%% ////// ////// ................................... $$$$$$ ",
- " %%%%%% ////// ////// .................................. ** $$$$$$ ",
- " %%%%%% //////// ////// ................................. $$$$$$ ",
- " %%%%%% //////// ////// ................................. $$$$$$ ",
- " %%%%%% //////// /////// ............................... $$$$$$ ",
- " %%%%%% //////// /////// ............................. $$$$$$ ",
- " //////// /////// $$$$$$ ",
- " //////// ///////// ",
- " //////// ////////// ",
- " //////// /////////// ",
- " /////////////// /////////// 1111111111 ",
- " // /////////////////////////// 111111111111111111111111111111111111111 ",
- " /// //////////////////////// 111111111111111111111111111111111111111 ",
- " ////////////////////// 11111111111111111111111111111111111111 ",
- " /////////////////// 11111111111111111111111111111111111111 ",
- " ///////////////// 11111111111111111111111111111111111111 ",
- " ///////// 11111111111111111111111111111111111111 ",
- " / ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-6-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/lines-6-800-800-1.0-grid-reference.json
deleted file mode 100644
index 45ddfc0..0000000
--- a/tests/visual_tests/grids/lines-6-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "12",
- "10",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " !!!! ",
- " !!!!!!! !!! ",
- " !!!!!!!!! !!!!! !!! ",
- " !!!!!! !!!!! !!!!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!!!!!!!! !!!!!!!! ! ",
- " !!!!!! !!!!! !!!!!! !!!!!! !!!!!!!!!! !!!! ",
- " !!!!!! !!!!! !!!!!! !!!!! !!!!! !!!!!!! !!!!!! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ! !!!!! !!!!! ",
- " !!!!!!! !!!!!!! !!!!! !!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!!! ! !!!!! !!!!!! !!!!! !!!!! !!!!! !!!!!! ",
- " !!!!!!! !!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!! ! !!!!!! !!!!!! !!!!! !!!!! !!!!! !!!!!! ",
- " !!!! ! !!!!! !!!!! !!!!! !!!!!! !!!!!! !!!!! ",
- " ! !!!!! !!!!!! !!!!!! !!!!! !!!!!! !!!!!! ",
- " !!!!!! !!!!! !!!!!! !!!!!! !!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!! !!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!! !!!!!!! !!!!!! ",
- " !!!!!! ! !!!! !!! ! ",
- " ### !!! # !! $$$ ",
- " ##### ! #### ! $$$ ",
- " ######## ####### ## $$$ ",
- " ########### ########## ##### # $$$ ",
- " ###### ###### ############ ######## ### $$$ ",
- " ####### ##### ##### # ##### ########## ##### $$$ ",
- " ###### ##### ###### ###### ###### ##### ##### $$$ ",
- " ###### ###### ###### ###### ###### # ###### ###### $$$ ",
- " ###### ###### ##### ##### ###### ###### ###### $$$ ",
- " ###### ##### ###### ##### ##### ##### ##### $$$ ",
- " ####### ###### ##### ###### ##### ###### ###### $$$ ",
- " ####### # ###### ###### ##### ###### ###### ##### $$$ ",
- " #### ##### ###### ##### ##### ##### ###### $$$ ",
- " %%% ## ##### ##### ###### ##### ###### ###### $$$ ",
- " %%% ###### ###### ###### ###### ##### ##### $$$ ",
- " %%% ###### ###### ##### ###### ###### ###### $$$ ",
- " %%%%% ##### ###### ##### ##### ########### $$$ ",
- " %%%% ##### ###### ###### ##### ####### $$$ ",
- " %%% ###### ###### ########### ##### $$$ ",
- " %%% ########### ######## ## $$$ ",
- " %%% ######## ###### # $$$ ",
- " %%% ##### #### $$$ ",
- " %%% ### # $$$ ",
- " %%% $$$ $ ",
- " %%% &&&&&&& $$$ ",
- " %%% &&&&&& &&&&&&&& &&&&&&&&&& $$$ ",
- " %%% &&&&&&&& &&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&&& $$$ ",
- " %%% &&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&& &&&&& $$$ ",
- " %%% &&&&&&&&&&&&&& &&&&&&& &&&&&& &&&&&&& &&&&& &&&&&& &&&&& $$$$ ",
- " %%% &&&&&&& &&&&& &&&&&&& &&&&&& &&&&&& &&&&& &&&&& &&&&& $$$$ ",
- " %%% &&&&&& &&&& &&&&&& & &&&& &&&&& &&&&& &&&&& &&&& $$$$ ",
- " %%% &&&&&& &&&&& &&&&& &&&&& &&&&&&& &&&& &&&&&& &&&& $$$$ ",
- " %%% &&&&&& &&&& &&&&& &&&& &&&&& & &&&& &&&&& &&&& && $$$$ ",
- " %%% &&&&& & &&&& &&&&& &&&& &&&&& &&&&& &&&&& &&&&& &&&&& $$$$ ",
- " %%% &&& &&&& &&&&&& &&&& &&&&& &&&&& &&&&&& &&&&&&&&&&&&&& $$$$ ",
- " %%% & &&&&& &&&&&&& &&&&&& &&&&&& &&&&&&&&&&&&& &&&&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&& &&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&&& &&&&&&&& &&&&&& &&&& $$$$ ",
- " %%% &&&&&&& &&&& &&& $$$$ ",
- " %%% &&& & $$$$ ",
- " %%% & $$$$ ",
- " %%% $$$$ ",
- " %%%%% '''''''' $$$$ ",
- " %%% '''''''' $$$$ ",
- " %%% '''''''' $$$$ ",
- " %%% ''' $$$$ ",
- " %%% ''''''''''''''''''''''''' $$$$ ",
- " %%% ''''''''''''''''''''''''' $$$$ ",
- " %%% (( ''''''''''''''''''''''''' $$$$ ",
- " %%% ((((((( (((((((( ''''''''''''''''''''''''' $$$$ ",
- " %%% (((((( (((((((( (((((((((( (((((((((((( $$$$ ",
- " %%% (((((((((( (((((((((((( ((((((((((((( (((((((((((((( ' $$$$ ",
- " %%% (((((((((((((( ((((((((((((((( (((((((( ((((( ((((((( ((((( $$$$ $ ",
- " %%% ((((((( (((((( ((((((( ((((( (((((( (((( (((((( ( (((( $$$$ ",
- " %%% ((((((( (((( (((((( ( (((( (((((( (((( ((((( (((( $$$$ ",
- " %%% (((((( (((( (((((( (((( ((((( ((((( ((((( ((((( $$$$ ",
- " %%% (((((( (((( ((((( (((( (((((((( (((( (((((( (((( (( $$$$ ",
- " %%% (((((( (((( ((((( (((( ((((( (((( ((((( (((( (((( $$$$ ",
- " %%% (((( ( (((( (((((( (((( ((((( (((( (((((( ((((( (((((( $$$$ ",
- " %%% (( ((((( (((((( ((((( (((((( (((((((((((((( ((((((((((((( $$$$ ",
- " %%% (((((( (((((( (((((((((((( (((((((((((( ((((((((( $$$$ ",
- " %%% ((((((((((( (((((((((( (((((((( (((((( $$$$ ",
- " %%% (((((((( )) ((((((( (((( $$$$ ",
- " %%%% (((( )))) *** ( ( $$$$ ",
- " %%%% ))))) *** ++++++++++++ $$$$ ",
- " %%%% )))))) *** ++++++++++++++++++++++++++++++++ $$$$ ",
- " %%%% )))))) **** ,,, +++++++++++++++++++++++++++++++++++++ $$$$ ",
- " % %%%% ))))) **** ,,, ++++++++++++++++++++++++++++++++++ $$$$ ",
- " %%%% )))))) **** ,,, ------ + +++++++++++++++ $$$$ ",
- " %%%% )))))) ***** ,,,, ----------------------------- ++ ++++++ $$$$ ",
- " %%%% ))))) *** ,,,, ----------------------------- + ++++ $$$$ ",
- " %%%% )))))) *** ,,, ----------------------------- ++++ $$$$ ",
- " %%%% )))))) **** ,,, ++++ $$$$ ",
- " %%%% ))))) **** ,,, - ++++ $$$$ ",
- " %%%% )))))) *** ,,, ++++ $$$$ ",
- " %%%% )))))) *** ,,, +++ $$$$ ",
- " %%%% ))))) *** ,,,, ................................. +++ $$$$ ",
- " %%%% ))))))) *** ,,,, .......................................... +++ $$$$ ",
- " %%%% )))))) ) **** ,,, ........................................... +++ $$$$ ",
- " %%%% ))))) **** ,,, ................. .. +++ $$$$ ",
- " %%%% )))))) *** ,,, ..... . +++ $$$$ ",
- " %%%% )))))) *** ,,, .... +++ $$$$ $ ",
- " %%%% ))))) *** ,,,, ... +++ $$$$ ",
- " %%%% )))))) //////// *** ,,,, ... +++ $$$$ ",
- " %%%% )))))) /////////////// *** ,,,, .... +++ $$$$ ",
- " %%%% ))))) ////////////////////// **** ,,, .... +++ $$$$ ",
- " %%%% )))))) ////// ////////////// **** ,,, ... +++ $$$$ ",
- " %%%% )))))) ////// ///////// *** ,,, ... ++++ $$$$ ",
- " %%%% ))))) ///// //// *** ,,, ..... ++++ $$$$ ",
- " %%%% )))))) ////// ///// *** ,,,, ..... 00000000000000000000000000000 ++++ $$$$ ",
- " %%%% )))))) ////// //// *** ,,,, , ... 00000000000000000000000000000 +++ $$$$ ",
- " %%%% ))))) ///// //// ,,, ... 00000000000000000000000000000 +++ $$$$ ",
- " %%%% )))))) ////// //// ,,, ... 00 +++ $$$$ ",
- " %%%% ))) ) ////// ///// ,,, ... 0 +++ $$$$ ",
- " %%% ) ///// //// ,,, ... ++++ $$$$ ",
- " %%% /// / //// ,,, ... ++++ $$$$ ",
- " %%% /// //// ,,, ... +++ $$$$ ",
- " %%% /// ///// ... ++++ $$$$ ",
- " %%% /// //// ... ++++++++++++++++ ++++ $$$$ ",
- " %%% //// /// .... ++++++++++++++++++++++++++++++++++++++++++++ $$$$ ",
- " %%% //// /// ..... +++++++++++++++++++++++++++++++++++++++++++ $$$$ ",
- " %%% ///// //// ... + +++++++++++++++++++++++++++++++++ $$$$ ",
- " %%% //// //// ... + + $$$$ ",
- " %%% /// //// .... + $$$$ ",
- " %%% /// /// .... $$$$ ",
- " %%% //// /// .... $$$$ ",
- " %%% //// /// ..... $$$$ ",
- " %%% /// /// .... $$$$ ",
- " %%% /// //// ..... $$$$ ",
- " %%% /// //// ...... $$$$ ",
- " %%% /// /// .......................................... $$$$$ ",
- " %%% //// /// ........................................ $$$$ ",
- " %%% //// /// ...................................... $$$$ ",
- " %%% //// /// .. $$$$ ",
- " %%% //// /// . $$$$ ",
- " //// //// $$$$ ",
- " //// ///// $$$$ ",
- " ///// ///// ",
- " //// ////// ",
- " //// ////// ",
- " //// ////// ",
- " ///// //////// ",
- " ///// ////// / ",
- " /////////// ///// ",
- " /////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////// 11111111111111111111111111111111111111111111111111 ",
- " //// 1111111111 11 ",
- " 1 1 ",
- " 1 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-6-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/lines-6-800-800-2.0-grid-reference.json
deleted file mode 100644
index efb0798..0000000
--- a/tests/visual_tests/grids/lines-6-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "10",
- "12",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!! ",
- " !!!!!! !! ",
- " !!!!!!!!! !!!!! !! ",
- " !!!!!!!!!!! !!!!!!! !!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!! !! ",
- " !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!! ! ! !!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !! !!!!!!!!!!! !!!!!!!!!!! ! ! !!!!!!!!!! !!!!!!!!!! !! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !! !!!!!!!!!! !!!!!!!!!!! ! !!!!!!!!!! !!!!!!!!!!! ! !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! ",
- " !!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! ",
- " ## !!!!!!!!!!!!! # !!!!!!!!!!!! !!!!!!!!!!! ",
- " ##### !!!!!!!!!!! #### !!!!!!!!!! !!!!!!! ",
- " ######## !!!!!!!!! ###### !!!!!! ## !!!!! $$$$$$ ",
- " ########## !!!!! ######### !!!! #### !! $$$$$$ ",
- " ############## !!! ############ !! ######## # $$$$$$ ",
- " ################ ############## ########## #### $$$$$$ ",
- " ################### ################## ############ ##### $$$$$$ ",
- " ##################### #################### ################ ####### $$$$$$ ",
- " ############ ########### ########### ########## ################## ########## $$$$$$ ",
- " ############## ########## ########### ########## #################### ########### $$$$$$ ",
- " ############## ########## ########### ########### ####################### ########### $$$$$$ ",
- " ############ # ########### ########### # ########## ########### # ########### ########### $$$$$$ ",
- " ########### # ########## ########### ### ########## ########## # ########## ########## $$$$$$ ",
- " ######### ########## ########### ## ########## ########## ## ########### ########### $$$$$$ ",
- " ###### ########## ########### ########### ########### ########### ########### $$$$$$ ",
- " %%%%%%% ##### ########### ########### ########## ########### ########## ########### $$$$$$ ",
- " %%%%%%% ## ########## ########## ########## ########## ##################### $$$$$$ ",
- " %%%%%%% ########## ########### ########### ########## ################## $$$$$$ ",
- " %%%%%%% ########### ########### ##################### ############### $$$$$$ ",
- " %%%%%%% ##################### ################## ############# $$$$$$ ",
- " %%%%%%% ################## ################ ########## $$$$$$ ",
- " %%%%%%% ################ ############## ####### $$$$$$ ",
- " % %%%%%%%% ############# ########### ##### $$$$$$ ",
- " % %%%%%%%% ########## ######## ## $$$$$$ ",
- " %%%%%%%% ####### ###### $$$$$$ ",
- " %%%%%%% ##### &&&&&&& ### &&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&& ### &&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&& &&&&&&&&&&&& &&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&& &&&&&&&&&& &&&&&&&&&&& &&&&&&&&& &&&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&& & $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&& &&&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& && $$$$$$ ",
- " %%%%%%% &&&&&&&&&& & &&&&&&&& &&&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&& &&&&& $$$$$$ ",
- " %%%%%% &&&&&&& & &&&&&&&& &&&&&&&&&& &&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&& && &&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&& &&&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% & &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&& &&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&& &&&&&&&& &&&& & $$$$$$ ",
- " %%%%%% &&&&& & & '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% ''''''''''''''''''''''''''' $$$$$$ $$ ",
- " %%%%%% ''''''''''''''''''''''''''' $$$$$$$ $$ ",
- " %%%%%% ( ((((((( ''''''''''''''''''''''''''' $$$$$$$$ $ ",
- " %%%%%% ((((((( ((((((((( ((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ((((((((( (((((((((((( ((((((((((((( ((((((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ((((((((((((( (((((((((((((( (((((((((((((((( (((((((((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% (((((((((((((((( ((((((((((((((((( (((((((((((((((((( ((((((((((((((((((( $$$$$$ ",
- " %%%%%% (((((((((((((((((( (((((((((((((((((((( (((((((((((((((((((( ((((((((((((((((((((( $$$$$$ ",
- " %%%%%% ((((((((((((((((((((( ((((((((((((((((((((( (((((((((((((((((((((( (((((((((((( ((((((((( $$$$$$ ",
- " %%%%%% (((((((((((((((((((((( (((((((((((( (((((((( ((((((((((( ((((((((( (((((((((( (((((((( $$$$$$ ",
- " %%%%%% ((((((((((( ( (((((((( (((((((((( (((((((( ((((((((((( ((((((( (((((((((( (((((((( (( $$$$$$ ",
- " %%%%%% (((((((((( (( (((((((( (((((((((( (((((((( (((((((((( (((((((( (((((((((( (((((((( ((((( $$$$$$ ",
- " %%%%%% ((((((((( ( ((((((( (((((((((( ((((((((( (((((((((( ((((((((( ((((((((((( ((((((((((((((((( $$$$$$ ",
- " %%%%%% (((((( (( ((((((((( ((((((((((( ( ((((((((((((((((((((( (((((((((((((((((((( (((((((((((((((( $$$$$$ ",
- " %%%%%% (((( (((((((((((((((((((( ( (((((((((((((((((((( ((((((((((((((((( ((((((((((((((((( $$$$$$ ",
- " %%%%%% (( (((((((((((((((((( (( (((((((((((((((( (((((((((((((((( ((((((((((((((( $$$$$$ ",
- " %%%%%% ((((((((((((((((()) ((((((((((((((( ((((((((((((((( ((((((((((( $$$$$$ ",
- " %%%%%% ((((((((((((( )))) (((((((((((( (((((((((( ((* ((((((((( $$$$$$ ",
- " %%%%%% ((((((((((( )))))) +++++ ((((((((( ((((((( ( (********************** ((( $$$$$$ ",
- " %%%%%% (((((((( )))))))) +++++++ (((( ( (************************************* $$$$$$ ",
- " %%%%%% ( )))))))))) ++++++ , *************************************** $$$$$$ ",
- " %%%%%% )))))))))) ++++++ ,,,,,,, **************************************** $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, ------------------------ ****************************************** $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,, ----------------------------- ******************************************* $$$$$$ ",
- " %%%%%% )))))))))) +++++++ ,,,,,, ----------------------------- *** *************************** $$$$$$ ",
- " %%%%%% ))))))))))) +++++++ ,,,,,, ----------------------------- * * ********* $$$$$$ ",
- " % % %%%%%% ))))))))))) ++++++ ,,,,,, ----------------------------- ********* $$$$$$ ",
- " %% %%%%%%% )))))))))) ++++++ ,,,,,,, ----------------------------- ** ******* $$$$$$ ",
- " %%%%%%%% ))))))))))) ++++++ ,,,,,,, -------------- ******** $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, ............... ******* $$$$$$ ",
- " %%%%%% )))))))))) +++++++ ,,,,,, ...................................... ****** $$$$$$ ",
- " %%%%%% ))))))))))) +++++++ ,,,,,, ........................................... ****** $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,, ............................................ ****** $$$$$$ ",
- " %%%%%% )))))))))) ++++++ ,,,,,, ............................................. ******* $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, ............................................. ******* $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, ............................................ ******* $$$$$$ ",
- " %%%%%% )))))))))) //// +++++++ ,,,,,, ............ ******* $$$$$$ ",
- " %%%%%% ))))))))))) //////////// +++++++ ,,,,,, ........ ******* $$$$$$ ",
- " %%%%%% )))))))))) //////////////////// +++++++ ,,,,,, ....... ******* $$$$$$ ",
- " %%%%%% )))))))))) //////////////////////// ++++++ ,,,,,, ....... . ****** $$$$$$ ",
- " %%%%%% ))))))))))) /////////////////////////// ++++++ ,,,,,, ........ . ****** $$$$$$ ",
- " %%%%%% )))))))))) //////////////////////////// ++++++ ,,,,,,, ...... ****** $$$$$$ ",
- " %%%%%% )))))))))) ///////////////////////////////++++++ ,,,,,,, ...... 00000000000000000000000000000 ****** $$$$$$ ",
- " %%%%%% ))))))))))) /////////// //////////////+++++++,,,,,, ....... 00000000000000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))))))))) ////////// ////////+++++++,,,,,, ....... 00000000000000000000000000000 ****** $$$$$$ ",
- " %%%%%% ))))))))))) /////////// ///////++++ ,,,,,, ....... 00000000000000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))))))))))) /////////// //////// ,,,,,, ...... 00000000000000000000000000000 ******* $$$$$$ ",
- " %%%%%% ))))))) )) ) ////////// //////// ,,,,,,, ...... 00000000000000000000000000000 ******* $$$$$$ ",
- " %%%%%% ))))) )) ///////// /////// ,,,,,,, ...... 000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))) ) //////// //////// ,,,,,,, ...... ****** $$$$$$ ",
- " %%%%%% ) /////// / ////////,,,,,, ...... ****** $$$$$$ ",
- " %%%%%% ////////// //////// ,,,, ...... *** ******* $$$$$$ ",
- " %%%%%% //////// / //////// ...... ***************************** *************** $$$$$$ ",
- " %%%%%% ////// / //////// ...... ********************************************** $$$$$$ ",
- " %%%%%% ////// ///// ....... ********************************************** $$$$$$ ",
- " %%%%%% ////// ////// ....... ********************************************* $$$$$$ ",
- " %%%%%% ////// ////// ...... ******************************************** $$$$$$ ",
- " %%%%%% /////// ////// ...... ******************************************* $$$$$$ ",
- " %%%%%% /////// ////// ...... ** *************** $$$$$$ $$ ",
- " %%%%%% ////// ////// ....... * * $$$$$$$ $$ ",
- " %%%%%% ////// /////// ........ $$$$$$$$ $ ",
- " %%%%%% ////// /////// . ....... ** $$$$$$ ",
- " %%%%%% ////// ////// . .......... $$$$$$ ",
- " %%%%%% /////// ////// .............. .................................. $$$$$$ ",
- " %%%%%% /////// ////// ............................................ $$$$$$ ",
- " %%%%%% /////// ////// ............................................ $$$$$$ ",
- " %%%%%% //////// /////// ........................................... $$$$$$ ",
- " %%%%%% //////// /////// ......................................... $$$$$$ ",
- " %%%%%% //////// ////// ....................................... $$$$$$ ",
- " %%%%%% //////// ////// .................................... $$$$$$ ",
- " //////// /////// $$$$$$ ",
- " //////// ///////// $$$$$$ ",
- " /////// ////////// ",
- " //////// ////////// ",
- " //////// /////////// ",
- " //////// /////////// ",
- " /////////// ////////// ",
- " ///////////////// /////////// 11111111111111111111111111 ",
- " ////////////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " /////////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " ////////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " / //////////////// 11111111111111111111111111111111111111111111111111 ",
- " / ///////// 11111111111111111111111111111111111111 ",
- " / 11 ",
- " 1 ",
- " 11 ",
- " 1 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-7-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/lines-7-200-200-1.0-grid-reference.json
deleted file mode 100644
index aea58aa..0000000
--- a/tests/visual_tests/grids/lines-7-200-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " !!! ",
- " ! !! ",
- " ! ",
- " ! !! ! ",
- " ! !!!! ! !! ",
- " !! ! ! ! ",
- " ! ! ! ",
- " ! ! !!! ! ! ! !! ! ",
- " ! ! ! ! !! !! ! ",
- " ! !! !! !! ! !! ! ",
- " ! ! !! !! !! !!!!! ! ",
- " ! !! ! !! ! ! ",
- " ! !! !!! !! ! ",
- " ! ! !!!! !!! !! ! ! ",
- " ! ! !! !!!! ",
- " ! ! !! ! ! ! !! !! !",
- " ! !! ! ! ! ! ! !! ",
- " ! ! !! ! !! ! ! ! !! ",
- " ! ! !! ! ! !! !! !! ! !",
- " ! ! ! ! ! ! !! !! ! ",
- " !! ! ! !!! ! !! !! ",
- " !! ! !!! ! ! ! !! ",
- " ! !! ! ! ! ! ! ! ! ",
- " ! !! !! ! !!! ! ! ! ",
- " ! ! ! !!!! ! ! ! ! ",
- " !! ! !! ! ! ",
- " ! ! ! ! !! ",
- " !! ! !! !! ! ! ",
- " ! !! ! ! !! ! ! !! ! ",
- " !! !! ! !!! !! !! ! ! !! ",
- " ! !! ! !!! !! ! ! ! ! ",
- " !!! ! !! !! ! ! ! ",
- " ! ! ! !! ! ",
- " ! ! ! ! ! ! ! !! ",
- " ! ! ! ! ! !! ",
- " !!!!! ! ! !! ! ! ! ",
- " ! ! !! ! ! ! !! ! ! ! ",
- " ! ! !! ! !! !! !! ! ! ",
- " ! ! ! ! ! !! ! !! ! ",
- " ! !! ! ! ! ! ! ! ! ! ! ",
- " ! ! !!! ! !! ! ! ",
- " !! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! !! ! ",
- " ! ! ! ! !!! !!!! ",
- " ! ! ! ! ! ",
- " ! ! ",
- " ! !! ! ",
- " !! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-7-200-200-2.0-grid-reference.json b/tests/visual_tests/grids/lines-7-200-200-2.0-grid-reference.json
deleted file mode 100644
index c1f8d6e..0000000
--- a/tests/visual_tests/grids/lines-7-200-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ! !! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! !! ! ! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " !! ! !! ! ! ! ! ",
- " !! ! ! !! ! ! ",
- " !! ! !!!! !!!! ! ! ! ! ",
- " ! ! ! ! !! ! ",
- " !!! !!! ! !!!! ! ",
- " !! !!! ! ! !! ! ! ",
- " ! ! ! !! ! ! ! ! ! ",
- " ! ! ! !! !! ! ! ",
- " ! ! ! ! !!! ! ! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ! ! ! ",
- " ! ! ! !!!!!! ! ! ! ",
- " ! ! !!!! ! ! ",
- "!! ! ! ! !! ! ! ! ! ! ! ! ",
- " ! !!!! ! ! !!!! ! ! ! !! ! ! !",
- " ! ! ! !!!!! ! ! ! ! ! ! ! !",
- " ! ! ! !!!!!!! ! !! ! ! ! ! !",
- " ! ! !! ! !! ! ! ! ! ! !",
- " ! ! ! ! ! ! ! ! !",
- "! ! ! ! ! ! ! ! ! ! ! ! ",
- "! ! ! ! ! ! ! ! ! ! ! !!!! ! ! ",
- "! ! ! ! ! ! !! ! ! !!!! ! ! ! ",
- "! ! !!! ! !!! ! ! ! !! !!! ! ! ",
- "! ! ! !! ! ! ! ! ! ! ! ",
- " ! ! !! !! ! !! !! ! ",
- " ! ! ! ! ! ! !! ! ! ",
- "! ! ! ! ! ! !!!! ! ! ! ",
- " ! ! !! ! ! ! ! ",
- " ! !!!! ! ! !!!! ! ",
- " !!! ! ! !! ! ! ! ",
- " ! ! ! !!! ! ! ",
- " ! ! !! ! ! ",
- " ! !! ! ! ! ",
- " ! !! ! ! ! ",
- " ! !! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-7-400-400-1.0-grid-reference.json b/tests/visual_tests/grids/lines-7-400-400-1.0-grid-reference.json
deleted file mode 100644
index e1949e5..0000000
--- a/tests/visual_tests/grids/lines-7-400-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ! ",
- " !!! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ",
- " !! ! ! ! !! !! ",
- " ! ! ! ! ! !!! !! !! ! ",
- " ! ! ! !! ! ! !! !! ! ! ",
- " ! ! ! ! !!! !! ! ! !!!!! ! ",
- " ! ! ! ! !!!! ! ! ! ! ! ",
- " !! ! ! ! !! !!! ! ! ! ",
- " !! !!! ! ! ! ! ! ",
- " ! ! ! ! ! !!!!! ! ",
- " ! !! !! !!! ! ! !! ! ",
- " ! !! ! ! ! ! !! ! ",
- " !! ! !!! !!! ! !! !! ",
- " ! ! ! !! !!!!! !! ",
- " ! ! ! ! ! !! ! !! ! ! ",
- " ! ! ! ! ! !! ! ! !! ",
- " !! !! !! ! !! ",
- " ! ! !!! ! ! ! ",
- " ! !! ! ! !! ",
- " ! ! ! !! ! ! ",
- " !! !! ! ! ! ! ! ! !! ! ",
- " ! !!!!! ! !!! ! !! !! ! ",
- " ! !!! !!! ! ! ! !! ! ",
- " ! ! ! ! !!! ! ",
- " !! !! ! ! ! ! !! ! ",
- " ! !!!!! !!!! ! ! ! ",
- " !! !! !! !!! ! ! ",
- " ! !! ! ! !! !! !!!!!!! ",
- " !! !! !! ! ! ! !! ! ",
- " ! ! ! ! ! !! ! ! !! ",
- " ! ! ! !!! !! !! ! ! ! ! ",
- " ! ! ! !! !! !! ! ! ",
- " !! ! !! ! ! !! ! ",
- " !! !! ! ! ! ! !! ! ! ",
- " !! !! ! ! ! ! ! ! !!! ",
- " ! !! ! !! ! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! ",
- " ! ! ! !! ! ",
- " ! ! ! ! !!! ! ! ",
- " ! !!! !!! ! ! !! ",
- " ! !! !! ! ! !! !! ! ",
- " ! ! !! ! !!! ! !! ! ! ",
- " !! ! ! ! !!!! ! ! ! !! ",
- " ! !! ! !! ! ! ! ! ",
- " !! ! ! ! ! ! ",
- " ! !! ! !! ! !! !!! ! ",
- " ! !! ! ! !! ! ! !! !! ! ",
- " ! ! ! !!! !! !! ! ! !! ",
- " ! ! ! !!! !! ! ! ! ! ",
- " !! !! !! ! ! ",
- " !! ! ! ! ! ",
- " !! ! !! ! ! ! ! !! ! ",
- " !! ! !!! ! ! !! ! ! !!! ",
- " ! ! !! ! !! ! ! ! ",
- " ! ! !! ! ! !! ! ",
- " ! ! ! ! ! !! ",
- " ! ! ! ! ! !! !! ",
- " ! !!!! !! ! ! !! !! ! ",
- " ! ! !!! !! !! ! ",
- " ! !! !! ! !!!! ! !! ! ",
- " !! ! !! !! ! ! ! ",
- " ! !! !! ! ! ! ! !! !! ",
- " !! !! !! ! ! ! !! !! ! !! ",
- " !! !! !!!! ! !! ! ! ",
- " ! ! ! !! !! ! !! ",
- " !! !! ! ! !! !! ",
- " ! !! !! ! !! ",
- " ! ! ! ! ! !! !! ! ! ",
- " !! ! ! ! ! !! !! ! ",
- " !! ! !! ! !! ! !! ! ! ",
- " !! ! !! ! ! ! !! !! ",
- " !! ! ! !! ! ",
- " ! ! !! ! ! ! ! ! ",
- " ! ! !! ! ! !! ! ! ",
- " !! ! ! ! ! ! ! ! !! ",
- " ! !! !!!! ! ! ! ! ! ! ",
- " ! ! !! ! !!! ! ! ! ! ",
- " ! ! !! ! ! ! ! ! !!! ",
- " !! ! ! !! !! ! !!! !!! ! ",
- " ! !! ! ! ! !!! !! ! ",
- " ! !! ! ! ! ! ! ! ! ! ! ",
- " ! !!! ! !! !! ! ! ! ",
- " ! !! ! ! ! !! ",
- " ! !!! !!!!! ! ! ",
- " ! ! !!! ! ! ",
- " ! !! ! ",
- " !! !! ",
- " ! ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-7-400-400-2.0-grid-reference.json b/tests/visual_tests/grids/lines-7-400-400-2.0-grid-reference.json
deleted file mode 100644
index 4c9571c..0000000
--- a/tests/visual_tests/grids/lines-7-400-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " !!! ! ",
- " !! !!! ! ",
- " !! !!! ",
- " ! !! !! ",
- " ! !! ! ",
- " ! ! ! ",
- " ! !! ! ! ! ",
- " ! ! !!!! ! ! ",
- " ! !!! ! ! ! !!! ! ! ! ",
- " ! !! ! !! ! !! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! ! ",
- " ! ! ! ! !! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! !!! ! ! ! ! ",
- " ! ! !! ! ! ! ! !!!! ! ",
- " ! ! ! ! ! ! !!! !! ! ",
- " ! ! ! ! ! ! ! !!! ! ! !!!! ",
- " ! ! ! !!! ! !! !! ! ! !!!!",
- " ! !! ! !! ! ! ! ! !! ! ",
- " !!! ! ! ! !!!!! ! !!! ! !! !!! ! !!!!!",
- " ! ! !!! ! ! ! !! !!! ! ! !!!! ! ",
- " !!! !! ! !! ! ! !! ! ! ! ! !!!!!",
- " ! ! !! !!!! ! !! ! ! ! ! ! ",
- " !! ! ! !! ! ! ! ! ",
- " !!! !!!! ! ! !! ! ! ! ! ",
- " ! ! ! !! ! ! !! ! ! ! ! ! ! ",
- " ! ! ! ! ! !! ! !!! ! ! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! !! !! ! ! !!!!!!! ! ",
- " ! ! ! !! ! ! ! ! ! !! !!! ",
- " ! ! ! ! !!!! ! ! ! ! ! !",
- " !!!! ! ! ! ! ! ! ! ! !",
- " ! !!!! ! ! ! ! ! ! ! !",
- " ! ! ! !! ! ! ! ! ! ! ! !",
- " ! ! ! !!! ! !! !! ! ! ! ! ! !",
- " ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ! ! !! !!! !!! ! ",
- " ! ! ! ! ! ! ! !! ! ! ! !! ",
- " ! ! ! !! !! !! !!! ! ",
- " !!!! ! ! ! !! !! ! ! ! ! ! ! ! !! ! ",
- " ! !!! ! ! !! !! !!!! ! !! ! ",
- " !!!! ! ! ! !! ! ! ! ! !!! !!! ! ",
- " ! !!! ! ! !! ! ! ! ! ! ! !! ",
- " !!! !! !! ! ! ! ! ! ! !!! ! ",
- " !!! ! ! ! ! ! ! ! ",
- " ! ! !! ! ! ! ! ! ! ! ! ! ",
- " ! !! ! !! ! ! ! ! ! !! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ! ! ! ",
- " ! ! ! ! !! ! ! ! ! ! ! ",
- " ! ! !! ! ! ! ! ! !! ! ",
- " ! ! ! !! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! !! ! !!! ! ",
- " ! ! ! ! ! ! ! ! ! !! ! !!!! ",
- " ! ! ! ! ! ! ! !! !!! !!! ! ! ",
- " ! ! ! ! ! ! ! ! !! ! ! ! !!!!! ",
- " !!!! ! ! !! !! ! ! ! ! ",
- " !!! ! ! ! ! ! ! ! ! !!! ",
- " ! ! !!! ! ! !!! !!!! !!! ! ! ! ! ! ",
- " !! ! ! !!!! !! ! ! ! ! ! ! ! ! ",
- " ! !! ! ! !!!! !!! ! ! ! ! ",
- " !!! ! !!!!! ! ! !! ! ! ! ! ! ",
- " !!! ! ! !! !!! ! !!! ! ! ! ",
- " ! !!! ! ! ! ! !!!!! ! ! ! ! ",
- " ! ! ! ! ! ! ! !!!! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! !!!! ",
- " ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ! ! ! ",
- " !! ! ! ! ! ! ! !!! ! ! ! ! ! ",
- " !!!!!! ! ! ! ! ! !!! ! ! ! ",
- " ! ! !!! ! !! !!! !!! !! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ! !!! !!! ! ! ",
- " ! ! ! ! ! ! !!! !! !!! ! !!! ! ",
- " ! ! ! ! ! ! ! !! ! ! !! ! !!! ! ! ",
- " ! ! ! ! ! ! ! !!! ! !!!! ! !!! ",
- " ! ! ! ! ! !!!! ! ! ! !!!! ! ! ",
- " ! ! ! ! !!!! ! ! ! ! !!! ! ",
- " !!! !! ! ! ! ! ! ! ! ! ! !!! ! ! ",
- " ! !!! !!! ! ! !! ! ! ! ",
- " !!! ! ! ! !! ! ! ! !! ! ! ! ",
- " ! ! ! ! !!! ! ! ! ! !! ! ! ! ",
- " !!!! ! ! ! ! ! ! !! !! ! ! ",
- " ! !!! !!! ! ! ! !!! ! ! ",
- " ! ! ! !! ! ! ! ! ! ! ",
- " ! !!! ! ! ! !! ! ! ! ",
- " ! ! ! ! ! ! !!! ! ",
- " !! ! !! !!! ! ! ",
- " ! ! ! ! ! !! ! !! ! ",
- " ! ! !! ! ! !! !! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ",
- " ! !! ! ",
- " ! !!! ! ",
- " ! !!!! !!! ",
- " ! ! ! ",
- " ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-7-600-600-1.0-grid-reference.json b/tests/visual_tests/grids/lines-7-600-600-1.0-grid-reference.json
deleted file mode 100644
index 90581f8..0000000
--- a/tests/visual_tests/grids/lines-7-600-600-1.0-grid-reference.json
+++ /dev/null
@@ -1,159 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! !!! ",
- " ! !!! ",
- " ! ! ! ",
- " ! !! ! ! ! ",
- " ! ! ! ! ! !!! ! ! ! ",
- " ! ! ! !!! ! !! ! ! ",
- " ! !! !!!! ! !! ! !! !! ! !! ",
- " ! !! ! !! ! ! !! ! !! ",
- " !! !! !!! ! !!! !! !! ",
- " ! ! ! !! !! ! ! !! ! ! ",
- " ! !!! ! ! !! ! ! ",
- " ! ! ! ! ! ! ! !! ! !! ! ! ",
- " ! ! ! ! !! !! ! ! !! !!!! ",
- " !! ! !! ! ! ! ! ! !! ",
- " !! ! ! ! ! ! ! !! ",
- " ! !! ! ! !! ! ! ",
- " ! ! !! ! ! !!! !! !! ! ",
- " ! ! !!! ! !! !! ! !! ",
- " ! ! ! ! !! ! ! ! !!! ",
- " ! !!! ! ! ! ",
- " !! ! ! ! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! ! ",
- " !! ! ! ! !! ! ! ! ! ",
- " ! !! !!! ! ! !! ! ! !! ! ",
- " ! ! !! ! ! ! !! !! ",
- " ! ! ! ! !! !! ! ",
- " !! ! !! ! ! ! ! !! ! ",
- " !! !! !! ! ! ",
- " ! !!! ! ! ! ! ! ",
- " ! !! ! ! !!! ! ! !! !! ",
- " !! ! !! ! ! !!!!! ",
- " !! !!! ! ! ! ! ! ! ! !! ",
- " !! !! !!! ! ! ! ! ! ! ! ",
- " ! !! ! !! !! ! ",
- " ! !! !! !! !! ! !! ! ",
- " ! ! ! ! ! ! ! !! ",
- " ! ! ! ! !! !! ! ",
- " ! ! !! ! ! !! ! ",
- " ! !! ! ! !!! ! ! ! ",
- " !! ! ! !! ! ! ! ! ",
- " !! !! !! ! ! ",
- " ! ! ! ! !! !! ! ",
- " ! ! !! ! !! !! !! ! ! ",
- " ! ! !! ! ! ! !! ! ! ",
- " ! ! ! ! ! !! ! !!! ",
- " !! ! !!! !! ! ! !!! ",
- " ! !! ! ! ! ! ! ! !! ",
- " ! ! !! ! ! ! ! ! ",
- " !! ! !! ! ! !!! ! ",
- " !!! ! ! ! ! ! !!! ",
- " !! ! ! ! !! ! ! ! ",
- " ! !! ! ! ! ! ! !! !! ",
- " ! !! !!! ! ! ! !!!!! !! ",
- " ! ! ! ! ! ! ! ! !! ",
- " ! !! ! !! !! ",
- " ! ! !! !!! ",
- " !! !! !! ! ",
- " !! !! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! !! !! !! ! !! ! ! ! ",
- " ! !! !! !! ! ! ! ",
- " ! ! ! ! !! !! !! !! ",
- " ! ! ! !! !! ! !! !!! ",
- " !!!! !! ! ! ! ! !! ",
- " ! ! !!!! ! ! ! !! ",
- " ! ! ! ! ! ! ! ! !! ",
- " ! ! ! ! !! ! ! ! ",
- " ! ! ! !! !! ! !!! ! ",
- " !! ! !! ! !! !! ! ! ",
- " !! ! !! !! !! ! ! !! ! ",
- " ! ! !! !! ! ! ! !!! ! !! ",
- " ! ! ! !!!! ! ! ! !! ! ",
- " ! ! !! ! !! ",
- " ! !!! ! !!! ",
- " !!!! ! ! ",
- " !! ! ! !!! ! ! ! ! ",
- " !! ! !! ! ! !! ! ! ! ",
- " !! ! !! !! !!!! ! ! ! ",
- " !! ! !! !! ! ",
- " ! ! ! ! !! !! !! ",
- " ! ! ! ! !! ! !! !! ! ",
- " !!! ! ! !! !! ! !! ! ",
- " ! ! !!!! ! ! ! ! ",
- " ! ! !! ! ! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ",
- " !! ! ! !! ! !!!! ",
- " !! !!! ! ! !! ! ! !! ",
- " !! ! !! !! ! ! ! ! ",
- " ! ! !!! ! ! !! ! ! ! ",
- " ! ! ! ! !! ! ! ! ! ",
- " ! ! ! ! ! ! ! !! !! ! ",
- " ! ! ! ! ! !! ! ! !! ! ",
- " ! !! ! !! ! ",
- " ! ! ! ! ! ",
- " !! !! !! ! ! ! ! ",
- " ! !!! ! !! ! ! ! ! ",
- " ! !! !! ! !! !! !! ! !! ! ",
- " ! ! !! !! ! ! !! !! ",
- " ! ! !! ! ! !! !! ! ",
- " ! ! ! ! ! ! ! !! !! ",
- " !! ! ! ! ! ! !! ",
- " ! ! ! ! ! ",
- " ! ! ! !! !!! !! ! !! ",
- " ! ! ! !!! !! ! !! ! ",
- " ! !! ! !! !!! ! ! !! ",
- " !! !! ! ! !! ! ! !! ! ! ",
- " ! !! ! ! !! ! !! ! !! ",
- " ! !! ! !! ! !! ! !! ! ! ",
- " ! ! !! ! !! !! ! ",
- " ! !! ! ! !! ! ! ",
- " !! ! ! !! !! ",
- " !! ! ! ! ! ! ",
- " !! !! ! ! !! !! ! ! ! ",
- " !! !! ! ! ! ! ! ! !! ! ",
- " !!!!! ! ! !! ! !! ! ",
- " ! ! ! ! !! !! !! ! ",
- " ! ! ! ! ! ! !! ",
- " ! ! ! ! ! !! !!! ",
- " !!!!! ! ! ! !! !! ! !! ",
- " ! ! !! ! !! ! !! ",
- " ! !! ! ! ! ! !!! ! ",
- " ! ! !! ! !!! ! ! ! !! ! ",
- " !!!!! !! ! ! ! ! !! ! ! !! ",
- " !! ! ! !! ! ! ! ! !! ! !! ! ",
- " ! ! !! ! ! ! ! !!!!! !!!! ",
- " ! ! ! ! ! ! !!! ! ",
- " ! ! ! ! ! !! ",
- " ! ! ! !!!!! !!! ",
- " ! ! ! ",
- " !! ! ",
- " !! !! !!! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-7-600-600-2.0-grid-reference.json b/tests/visual_tests/grids/lines-7-600-600-2.0-grid-reference.json
deleted file mode 100644
index cd82d0a..0000000
--- a/tests/visual_tests/grids/lines-7-600-600-2.0-grid-reference.json
+++ /dev/null
@@ -1,159 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ",
- " ! ",
- " !!!! !!! ! ",
- " ! ! !!! ",
- " !! !! ! ",
- " ! ! !!!!!! !! !! ",
- " !! !!! !! ",
- " !! ! ! ! ! ",
- " !! ! ! !! !! ! ! ! ! ",
- " ! ! ! ! !!! ! ! ! ! ",
- " !!! ! ! !! ! ! ! ! ",
- " ! !! ! ! !! ! ! ! ",
- " ! ! ! !! ! ! ! ! !! ! ! ",
- " ! !! ! ! !! ! !!! ! ! ",
- " ! !! ! !!! ! !! ! ! !! !!! ",
- " ! ! ! ! !! !! ! !!! ! ! ! ",
- " ! !!!! ! ! ! ! ! ! ! !!!! !! ! ",
- " ! ! ! ! ! ! !!! ! ! ! ! ",
- " ! !! ! ! ! ! ! ! ! ! ! !!! !! ",
- " ! !! ! !!! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! !! ! !! ! !! ! ! ! ! ",
- " ! ! ! !! !! !! !! !!! ! ! ! ",
- " ! ! !!! !!! ! !! ! !! ! ! ! ",
- " ! ! ! ! ! ! !! !! ! ! ! ! ",
- " ! ! !!! ! ! !!! !! !! !!!!!! ! ! ! ! ",
- " ! ! ! ! !!!! !!! !!! ! !!!!!!! ! ",
- " !! !! ! !! !! !!! ! ! ! ! ! !!!! ",
- " !!! ! ! !! ! !! ! ! ! ! ! ! ! ! ",
- " !! ! !! ! ! ! ! ! ! ! ! ",
- " !!! ! ! ! !!! ! ! ! ! ! ! ",
- " !!! !! !!!! ! ! ! ! ! ! ! ",
- " !! ! ! !! ! ! ! ! ! ! ! ! ! ! ",
- " ! !!! !!!! ! ! ! ! ! !! !!!! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! !!! ! ! !!!! ! ! ",
- " ! ! ! ! !!!! ! ! !! ! !!! ! !!!! ",
- " ! ! ! ! !! ! ! ! ! !!! ! ",
- " ! ! ! ! !! ! ! ! !! ! !! !!!! ",
- " ! ! ! ! ! ! !! ! ! ! ! ! !!!! ! ! ",
- " !!! ! ! ! ! ! ! ! ! ! ! ! !!!!! ",
- " !!!! ! ! ! ! ! !!! ! !!! ",
- " ! !!!! ! ! ! !!! ! ! ! ",
- " ! ! ! ! ! ! ! ! !!! !! ! ! ! ",
- " ! ! ! ! ! !!! ! ! !! !!! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ! ",
- " ! ! ! ! ! !! !!!! !!! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " !!! ! ! ! ! ! !!! !!!! ",
- " !! ! ! ! ! ! ! ! ! ! !!! ! ",
- " ! !!! ! ! ! !! !!! ! !!! ! ! ",
- " !!! ! ! ! ! ! ! !! ! ",
- " ! ! !!! ! ! ! ! ! !! ! !! !!! ",
- " !!! ! ! ! ! ! !! ! ! ",
- " ! !!! !!!! ! ! !! ! ! !!! ! ",
- " !! !! ! ! ! ! ! !!! ! ",
- " ! !!! !!!! ! ! ! ! !! ",
- " ! ! ! ! !! !! ! ! ! ! ! ",
- " ! ! ! ! !! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! ! ! ",
- " ! !!! !! !! ! ! ! ! ",
- " ! ! !! !! ! ! ! ! !!! ! ! ! ",
- " ! ! ! !! !! !!!! !! ! ! ! ",
- " ! !!! ! !! ! ! ! ! ! ! !!!!! ! ",
- " !! !! ! !! ! ! ! ! ! ! ! ! !!!! ",
- " ! !!! ! ! ! ! ! ! ! ! ! ! ",
- " !! ! ! !!! ! ! ! ! ! ! ! ",
- " ! !! !! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " !!! ! !!! ! ! ! ! ! ! !! ! ! ! ! ! ",
- " ! ! !!! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! !!! ! ! ! !! ! ! ! ! !!! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! ! !!! !! ",
- " ! ! ! ! !! ! ! ! !! !! ! ",
- " ! ! ! ! ! !! ! ! ! ! ! ! ! ! !! ",
- " ! ! ! ! ! ! ! ! ! ! ! !!!! ! !! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! !!! !!! ",
- " !!! ! ! ! ! ! ! ! !! ! ! !!!! ",
- " !!!!!! ! ! ! ! ! ! !! ! !!! ! ",
- " ! !! !! ! ! ! !! !! ! ",
- " ! ! ! ! !! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !!! !!!! !!! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ! ! ! ",
- " ! ! ! ! ! !!!! !!! ! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ! ",
- " ! ! ! ! ! !! !!!! ! ! ",
- " ! ! !! ! ! ! ! !!! !!! ! ",
- " !! ! ! ! ! ! ! ! ! ! ! ",
- " !!! ! ! ! ! ! ! !! ! !!!! ! ",
- " ! ! !! ! ! ! ! ! !! !!! ",
- " !!! ! ! ! ! ! ! !!! !!!! ! ! ",
- " !!!! !! ! ! ! ! ! ! ! !! ! ",
- " ! !!! ! !! !! ! ! !!! ! ! ",
- " ! !!!! ! !!!! ! ! ! ! ! !!! ",
- " ! ! ! ! ! !!!! ! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! ",
- " ! ! ! !! !! !! ! ! ! ! ! ",
- " ! ! ! !!! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! !! ! !!! ! ! ! ! ",
- " ! !!!! ! ! ! ! !! ! ! ",
- " ! ! ! ! ! !!! ! ! ",
- " ! !!!! ! !! ! ! ! ! ! ! ! ! !!! ! ",
- " !!!! ! ! ! ! ! ! ! ! ! ! !!! ",
- " ! ! !!! ! ! ! ! ! ! !! ! ! ! ! ",
- " !!!! ! ! ! ! ! !!! ! ! ! ! ",
- " ! !!!! ! ! ! ! ! !! ! ! ! ! ! ! ! ",
- " !!!! ! !!!! ! ! ! !! ! ! !!! ! ! ! ! ",
- " !!! ! ! ! !! ! ! ! ! ! ! ! ",
- " ! ! !! ! !! ! ! ! !! !!! ! ! ",
- " ! ! ! ! !! ! ! ! !! ! !! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! !! ! !!!! ! !! ",
- " ! ! ! ! ! ! ! ! ! ! ! !! !!! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! !!!! !! ! ",
- " ! ! ! ! ! ! !!! !! ! !! !!! ! ",
- " !!!! ! ! ! ! ! ! !!! !! !!! ! !! ",
- " !!!!!! ! ! ! !! !!! !! ! ! ",
- " ! !!!!!! ! !!! !! ! ! !! !! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! !!! ! ! ",
- " ! ! ! ! ! !!! !! ! ! !! !!!! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! !!! ! ! ",
- " ! ! ! ! ! ! ! ! ! !!! !! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! !!! ! ",
- " !!! ! ! ! ! !! ! ! ! ! ! ",
- " ! !!! ! ! ! ! ! ! ! !!! ",
- " ! !!! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! !!! ! !! ! ! ! ! ! !!! ! ",
- " ! ! ! !!!! ! !!! ! !!!! ! !! ! ",
- " !! !! ! ! ! ! ! ! !!! ! ",
- " ! ! !!!!! ! !!! ! ! ! ",
- " ! ! ! ! ! ! !! ! ",
- " ! ! ! ! ! !! ! ! ! ",
- " ! ! ! ! !! ! ! ! !!! ",
- " ! ! !! !!! ! !! ! ",
- " ! !!!!!! ! !!! ! ",
- " ! ! ! ! ! !! ",
- " !! !! ! !!!! ",
- " !!! ! ! ! ! ",
- " !! !!! ! ",
- " ! !!! !!! ",
- " ! ! !!!!!!!!! ! ",
- " !! ! ! ! ",
- " ! ! ! ",
- " ! ! ",
- " ! ",
- " !! !! ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-7-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/lines-7-800-800-1.0-grid-reference.json
deleted file mode 100644
index dc7ae1a..0000000
--- a/tests/visual_tests/grids/lines-7-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,209 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ",
- " !!! !! ",
- " !! !! ",
- " !! ! ! ",
- " ! !! !! !!! ! ! ! ! ",
- " ! ! !! !!!! ! ! ! ! ! ",
- " !! ! !! ! !! !! ! ! ",
- " !! !! !! !! !! ! ! ! !! ",
- " ! !!! ! !!! !! ! !! !! ",
- " ! ! ! !!!! !! !! ! ! ! !! ",
- " !! ! ! !!! ! ! ! ! ! ",
- " ! !!!! ! ! !! ! ! ",
- " ! ! !! ! ! ! !! !! !! ",
- " !! !! ! !! ! ! !! ! ! !!! ",
- " ! ! !! ! !! ! ! ! ! !! ",
- " !! !! !! ! !! ! !! ! ! ! ! ",
- " ! !! !!! ! ! ! ! ! ",
- " ! !! ! ! !! ! ! ! !! ",
- " ! ! ! !! !! ! ! ! !! ",
- " ! !! ! ! ! ! ! !!! ",
- " ! ! !! ! ! ! ! !! ",
- " ! ! ! ! ! ! ! ! ",
- " !! ! ! ! ! ! !!! ! ! ! ",
- " !! !! !! ! !! !! ! ! ! ",
- " !! !! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! !! !!! ! ! !! !! ",
- " ! ! ! !! ! ! ! !! ",
- " ! ! ! !! ! ! !! ",
- " ! ! ! ! !! ! ! ! ",
- " ! ! ! !! ! ! !! !! ",
- " !! ! !! ! ! !!! ! !! ",
- " !! ! ! ! ! !! ! ! !!! ",
- " !!! ! ! ! ! ! ! ! ! ",
- " ! ! !!! ! ! ",
- " ! !! ! ! ! ! ! ! ! ",
- " ! ! !! !! ! !!! ",
- " !! ! ! ! ! ! ! !! ",
- " ! !! !! ! ! ! ! ! ! !!! ",
- " ! ! !! ! ! !! ! !! ! ",
- " ! ! ! !! !! ! ! ! ",
- " ! ! !! ! ! ! ! ! ",
- " !! ! ! ! ! !! ! ",
- " ! ! ! ! !! ! !! ",
- " ! ! ! ! !! ! !! ",
- " ! ! !! ! !!! !! ",
- " ! ! ! ! ! ! ! !! !!! ",
- " ! ! ! ! ! ! ! ! !! ",
- " ! !! ! !! ! ! ! ! !! ",
- " ! !! ! !! !! !!! ! ! ! ",
- " !! !! ! ! ! !! !! !! !!! ",
- " ! !! !! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! !!! ! !! ",
- " !! !! ! ! ! !! ! !!! ",
- " ! !!!! ! ! !! ! !! ",
- " ! !!! ! ! !! ! ! !! ",
- " ! ! ! ! ! ! ! ",
- " !! ! ! ! ! ! ",
- " ! !! ! ! ! ! ",
- " !! !! !! ! ! ",
- " !! !! ! ! !! !! !! ! ! ",
- " ! !! !! !! ! !! ! !! ",
- " ! !! ! !!!!! !! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! !! ! !! ! ! ",
- " !! !! ! ! !! !! ! ! ",
- " !! ! ! !! !! !! !!! ! ",
- " !!! ! !!! ! ! ! ! !!!! ",
- " ! !! ! ! ! ! ! ! !! ",
- " ! ! !! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! !! ! ",
- " !!! ! ! !! !!! ",
- " ! !!! ! ! ! !! !! ! !! ",
- " ! !! !! ! !! ! ! ! !!! ",
- " ! ! !! !! ! ! ! ! ! ",
- " !! ! ! ! ! ! ! ! ! ! ",
- " !! !! ! ! !! ! ! ! ",
- " ! !! ! ! !! ! ",
- " ! !! ! ! ! !! !! ! ! ! ",
- " ! !! ! !! ! !! ! ! ",
- " ! ! ! ! ! ! !! ! !!! ",
- " ! ! ! !! ! !! ! ! !!! ",
- " !! !! ! ! ! ! ! ",
- " !! ! ! !! ! !! ! ",
- " !! ! ! ! ! ! !!! ! ",
- " !!! ! !!! ! ! ! ! ! !! ",
- " ! ! !! ! ! ! !! ",
- " ! ! ! ! ! ! ! ! !! ",
- " ! ! ! ! ! !! ! ! ",
- " !!! ! !! !! ! !! ",
- " ! !! !!! ! !! !! !! ! !! ",
- " ! ! !! !! !! ! ! !!! ",
- " ! ! !! ! ! ! ! ! ! ",
- " !! ! ! !!!! ! ! ! ! ! ",
- " !! ! ! ! ! ! ",
- " !! ! ! ! ! ! ! ",
- " ! ! !!! !! ! ! ! !! ",
- " ! !! ! ! ! ! ! !! ! ! ",
- " ! ! ! ! ! !! ! !!! ! ",
- " ! ! ! !! !! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " !! ! !! ! ! ! ! !!! ! ",
- " !! ! !!! ! ! ! ! !! ! ",
- " ! ! !! ! ! ! !! ",
- " ! ! !! ! ! ! ! ! ! ",
- " ! ! ! ! !! ! !! ! ",
- " !!! ! !! !! ! !! !! ",
- " ! !!!! !! !! !! !! ! ! ! ",
- " ! ! ! !! !! ! ! ! !! ",
- " ! ! !! !! ! ! ! ! ",
- " !!! ! !! !! ! ! ",
- " ! ! !! ! !! ",
- " !! !! ! !!!! ! !! !! ! ",
- " !!! !!!! ! ! !! !! ! ",
- " ! ! ! !! !! ! ",
- " ! ! ! ! ! !! ! ! ! ",
- " ! ! ! ! !! ! ! ! ",
- " ! !! ! !!! ! ! ! !! ",
- " !! ! ! ! ! ! !! ! !! ",
- " !! ! ! !! !! !! ! ! ",
- " !! ! ! ! ! !! ",
- " ! ! ! ! ! ! !! ! ",
- " ! ! ! !! ! !! ! !! ",
- " ! !! !! !! !! !! !! ! ! ",
- " !!!!! !! !! !! ! !! !! ! ",
- " ! ! !!!! ! !! ! ! !! ! ",
- " ! ! ! ! ! ! !! ! ! !! !!! ",
- " ! !! ! ! ! ",
- " ! ! ! !!! ",
- " !! !! ! !!!! ! ! ! ",
- " !! ! !! !! ! !! ! ! ",
- " ! ! !!! ! !! !! ! ! ",
- " ! ! ! !! !! !! ! !! ",
- " ! ! ! ! ! ! ! ! ! !! ! ",
- " ! ! ! ! ! ! ! ! !! ",
- " !! !! !! ! ",
- " ! ! ! ! ! !! ! ",
- " !! !! ! ! ! ! ! !! ",
- " !! ! ! ! ! !! ! ",
- " ! ! !! ! !! !!! ! ! ",
- " ! ! !! ! !! ! ! ! ! ! ",
- " ! ! !! !! !! ! ! ! ! ",
- " !!!!! ! ! ! ! !! ! ",
- " !! ! ! ! ! ! !!! ",
- " ! ! !! ! !! ! ! ! ",
- " ! ! ! ! ! ! ",
- " !!! ! ! !! ! ! ",
- " !! ! !!! !! ! !! ! !! ! ",
- " !! ! ! ! ! ! ! ! ! !!! ! ",
- " ! ! !! ! !! !! !! !! !! ",
- " ! ! ! ! ! ! ! !! !!! ",
- " ! !! ! ! ! !! ",
- " ! !! !! ! ! ",
- " ! ! ! ! ! !! ",
- " ! !! ! ! ! ! ! ! ",
- " !! !! ! ! ! !! !! ! !!!! ",
- " !! !! ! ! ! ! !! ! ! ",
- " ! ! !! ! !!! ! ! !! !! ! ",
- " ! ! ! !! ! ! ! !! ! ! ",
- " ! ! ! ! ! ! ! !! ! ! ! ",
- " !!!! ! !! ! ! ! ! !! ",
- " ! ! !! !! ! ! ! ! ! ",
- " ! ! ! ! ! !! !!! ! ",
- " ! ! ! ! ! !!! ! !! ! ",
- " !!! ! !! ! ! ! !!! ! !! ! ",
- " !! ! !! ! !!! ! !! ! !!!! ",
- " !! ! ! ! !!! !!!!!! ! !! ! ",
- " ! ! !! ! !! ! ! ! ",
- " ! !!! ! ! ! ! ",
- " ! !!!!!! !! ! ",
- " ! !! ! !! ",
- " ! ! ! ! ! ",
- " !!!! ! ",
- " ! ! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-7-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/lines-7-800-800-2.0-grid-reference.json
deleted file mode 100644
index 2dfc75e..0000000
--- a/tests/visual_tests/grids/lines-7-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,209 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! !!!! ",
- " !! !! ",
- " ! !!!! ! ",
- " !!!! ! !! ",
- " !! !! ! ",
- " ! ! ! ! ",
- " ! ! !!!!!!! ! ! ! ",
- " !! ! !!! !! !! ! ! ! ",
- " ! ! !! ! ! !! ! ! ! ",
- " !!! ! !! ! !! !! ! !!! ! ",
- " !! ! ! !!! ! ! ! ! !! ! ",
- " ! !!! ! ! ! ! ! !! ! ! ",
- " ! !! ! ! !!!! !!!! ! ! ! !!! ",
- " ! ! !! ! ! !!! !! ! !!! ! !! ! ",
- " ! ! !!! ! ! ! !! ! !!! ! ! ! ! !!!! ",
- " ! ! ! ! !! ! !!!! !! ! ! ! !! ! ",
- " !!! ! ! ! ! !!!!!! ! ! ! ! ! ! ! !!!!! ",
- " !! ! ! !! !!!! !! ! ! ! ! ! ! ! ",
- " !! ! ! ! ! !!! ! ! ! !!! ! ! ! ! ",
- " !! ! ! !! ! ! ! ! ! !!! ! ! ! ",
- " !! ! !!! ! ! ! ! ! !! ! ! ! ! ",
- " !!! !! ! ! ! ! !! ! ! ! ! ! ! ",
- " ! ! ! ! ! !!! ! ! ! ! ! ! ",
- " ! ! !! ! ! ! ! ! ! ! ! !!!!!!!! ! ! ! ",
- " ! ! !! ! ! ! ! ! ! ! ! !!!!!!!! ",
- " ! !! ! ! !! ! ! !!! ! ! ! !!! ! ! ! ! ! ",
- " ! !! !! !! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! !!! ! ! ! ! ! !! ! ! ! ",
- " ! ! ! !! ! ! ! !! ! ! ! ! ! ! ",
- " ! ! ! ! !! !!! ! ! ! ! ! ",
- " ! ! ! ! !! !!! ! !!! ! ! ! ! ! ",
- " ! ! ! !!! !! ! ! !!! ! ",
- " ! ! ! ! !! !!! ! !!!! ! ! ! ",
- " !!! !! ! ! !!!! ! ! ! !!!! !! ",
- " ! ! !! ! ! ! !! ! !!! !! ! ! ",
- " !!!! ! ! ! !! ! !!!! ! ! ",
- " ! ! !! !!!! ! ! ! ! !!! ",
- " !!! !!! ! ! ! ! ! ! !!! ! ",
- " ! !! !!!! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! !!! ! !! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! !! !!!! ! ! ! ",
- " ! ! ! ! ! ! ! ! !! !! ",
- " !! ! ! ! ! !! !! ! ! !!!! ",
- " !!!! ! ! !!!! ! ! ! ! !! ! ! ",
- " ! !!!! ! ! ! !! !! ! ! ! !! ! ",
- " ! ! ! !!!! ! !!!! ! ! ! ! ! ! !!!! ",
- " ! ! !!!! !! ! ! ! !! !! ! ! ",
- " ! ! ! !! ! ! ! ! !!! ! !!!!! ",
- " ! ! ! ! ! ! ! ! ! ! ! !!! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! !! ! ! !!! ",
- " !! ! ! ! ! ! ! !!! ! ! ! ",
- " !!! ! ! ! !!!! ! ! ! ! ! ! ",
- " ! !!! ! ! ! ! ! ! !!! ! ! ! ! ! ! ! ",
- " !!! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! !!! !!!! !!! ! ! ! ! ! ! ! ! ",
- " !!! ! ! !!! ! ! ! ! ! ! ! ! ! ! ",
- " ! !! !!! ! ! ! ! !!!!!! ! ",
- " ! ! !! ! ! ! ! ! ! !!! ! !! !! ",
- " ! !! !!!! ! ! ! ! ! ! ! ! ! !! ",
- " ! ! ! ! ! ! !! !! ! ! ! ! ! ",
- " ! ! ! !!! ! ! ! ! ! ! ! ",
- " ! ! ! !! ! ! !! ! ! ! ! ! ! ",
- " ! ! ! !! !! ! !!! ! ! ! ! ",
- " ! ! ! !! ! ! ! ",
- " ! ! ! !!!! !! ! ! !!!! ! ! ! ",
- " ! ! ! ! ! ! !!! !! ! ",
- " !! ! !! !!!!! !!! !!!! ! ! ! ",
- " !!! ! ! ! ! ! ! !!!! !!! ",
- " !! ! !!!! ! ! ! !!! ! ! ! ",
- " !! !! ! !! ! ! !!!! !! ! ",
- " !!! !! !! ! ! ! ! !!! ",
- " ! ! !! !!!! ! ! ! !!!! ",
- " ! !!! ! ! !! !! ! ! ! ",
- " ! ! ! !!!! ! !! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! ! ",
- " ! ! ! ! !!! !! !! ! ",
- " ! ! ! ! !! ! ! ! ! ! ! ",
- " !!! ! ! ! ! !! !! ! !!! ! ",
- " !!!!! ! ! ! ! !! ! ! ! !!!! ! ! ",
- " ! ! !!!! ! !! ! ! ! ! ! !!! ! ",
- " ! ! !!!!! ! ! ! ! ! !!!! !! !!! ",
- " ! ! ! ! ! ! ! !!! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! !!!!! !!! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! !! ! !!!! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ! !! ",
- " ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ",
- " !! ! ! ! ! !! ! ! ! ! ! ! ! ",
- " ! !! ! ! ! !! ! ! ! ! ! ! ",
- " !!! ! !!!! !! ! ! ! ! ! ! ! ! ! ",
- " ! ! !!! ! ! ! ! ! ! ! ! ! ! ! ",
- " !!! ! !!!! ! ! ! ! ! ! !!!! ! ! ! ! ",
- " ! !!!! ! ! ! ! ! ! !! ! !!!!! ! ! ! ",
- " ! !!!!! ! ! ! ! ! !! ! ! ! ! !! ",
- " ! !!!! ! ! !! !! ! ! !! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! !!! !!!! !!! ! ! ! ! ! ",
- " ! ! ! !! ! ! ! ! ! ! ! ! ",
- " ! ! ! !!!! !!! ! ! ! ! ! ! ! ",
- " ! ! ! ! !! ! !!! ! ! ",
- " ! !! !!!! ! !!! ! ! ",
- " ! !!! ! ! ! !!! ! ! !! ! ",
- " !! ! ! ! ! ! ! ! !! ! ! ",
- " ! !! ! ! ! ! !! ! !! ! ! ",
- " !! ! !! !!!! ! ! ! ! ! ! ! ",
- " !! !! ! ! ! ! ! ! ! !! ! ",
- " !! !!!!! ! ! !! ! ! !!! ",
- " ! ! !!! ! !!! !! ! ! ! ! ",
- " ! ! !!!! ! !! ! !! ! ! ! ",
- " ! ! ! ! ! !!!! !!! ! ! ! ",
- " ! ! ! ! ! ! ! ! !!! ! ",
- " ! ! ! ! !!! !!! ! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ! ! ",
- " ! ! ! ! !!! !!! ! ! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! !!! !!!! ! ",
- " !!!! !! ! ! ! !! ! ! ! ! ! ! ! ",
- " ! ! !!!!!! ! ! ! ! ! !!!! !!!! ",
- " ! ! ! ! ! ! ! ! ! ! ! !!! ",
- " ! ! ! ! ! ! ! !! !!! !!! ! ! ",
- " ! ! ! ! ! ! ! ! !! ! ! ! !!! ! ",
- " ! ! ! ! !!! ! ! ! ! ! ! ",
- " ! ! ! ! !! ! ! ! ! ! !! ",
- " ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ",
- " ! ! !! ! ! ! !! ! ! ! ! ! ! ! ",
- " ! ! ! !! ! ! ! ! ! ! ! ! ! ",
- " !!! ! ! ! ! ! ! !!! ! ! ! ! ",
- " ! ! !! ! !!! ! ! ! ! !!! ! ! ! ! ! ",
- " !!! !! ! ! ! ! ! ! ! !! ! !!! ! ! ! ",
- " !!!! !! ! ! ! !! !! ! ! !!! ! ",
- " ! ! !! ! ! ! ! ! !! ! ",
- " ! !!! ! ! !! !!! !!! ! ! ! ! ! !!! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! !!! !!! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! !! !!! ! !!! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! !!! ! ! ",
- " ! ! ! !!! !! ! ! ",
- " ! !!!! ! ! ! ! ! ! !! ! ",
- " !!! ! ! ! ! !!! !!!! ! ! ",
- " ! ! !!! ! ! ! !! ! ! !!! ",
- " !! ! ! !!!! ! !! !!! ! !!! ! ! ",
- " ! !!! ! ! ! !!!! ! !! ! !! !!! ! ",
- " !!! ! !!!!! ! ! ! ! ! ! !!! ! ! ",
- " ! !!! ! ! ! !! ! !! ! ! ",
- " ! !!! ! ! ! ! ! ! ! ",
- " ! ! !! !! ! ! ! ! ! ",
- " ! ! ! ! ! !!! !! ! ! !! ! ! ",
- " ! ! ! ! ! !! ! ! ! ! ! ",
- " ! ! ! ! ! ! !!!! ! ! ! !! ! !! ! ",
- " ! ! ! ! ! ! !! ! ! !! ! !! ! ",
- " ! ! ! ! ! !! ! ! ! ! !! !!! !! ! ",
- " !!!!!!! ! ! ! ! !! ! ! ! ! ! ",
- " ! ! !!!!! ! ! ! ! !! ! ! !! ",
- " ! ! ! ! !! ! ! ! !! ! ! ! ",
- " ! ! ! ! ! ! ! ! !!! ! ! ! ! !! !! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ! !! ! ",
- " ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! !!! ",
- " ! ! ! ! ! ! ! ! ! ! !!! !!! ! ! ! ! !! ",
- " ! ! ! ! !! ! ! ! ! !!! !! ! ! !! ",
- " !!! !!! ! ! ! ! !! ! !! ! ! ! !! ",
- " ! ! !!! ! ! ! !! !!!!! ! ! ! ! ",
- " !!! ! ! ! !! !!! ! ! ! !! ! ! ! ",
- " ! ! ! ! !!! ! ! ! !! ! !! ! ! !!! ! ! ",
- " !!!! ! !! ! ! ! !! ! !! ! ! ! ! ",
- " ! ! ! !!! ! ! !!! !!! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ! ! ! ! ",
- " ! !!! ! !!!! ! ! ! ! ! !!! ! ",
- " ! ! ! !! !! ! ! !!! ! ! ",
- " ! ! ! !!! ! !! !! !!!! ! ! ! ",
- " ! !!!!!! ! ! ! ! ",
- " ! ! ! ! !! ! ",
- " !! ! ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! !! ! ! ",
- " !!! !!! ! ! ",
- " !!!!!! ! ! ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-1-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-1-800-800-1.0-grid-reference.json
deleted file mode 100644
index 40aadd6..0000000
--- a/tests/visual_tests/grids/lines-multi-layout-1-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "10",
- "2",
- "12",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " !! ",
- " !!! !!! !!!!!! ",
- " !!! !! ! !!!! ! !! !!!!!!! ",
- " !!!!!!! !!!!!! !!! ! !!!!!! !!!! ! ",
- " ! !!! !! !!!!!!!! !!!!!!! !! !!! !!!!!! ! ",
- " ! !! !!! !!!!! !!!! !!!! !! !! !!!! !!! !!!! !! !! !! ",
- " !!!! !! !!!!! ! !! !! !!! !!!!!!! !!!! !!!!!!!!! !!!! !! ",
- " !!!! !! !! !!!!!! !! !!!!!!!! !!!!!!!!! !!!!!!!!!!!! !! ! !!!! ! ",
- " !!!!! !!!!!! !!!!!!!!!!!! !!!!!! !!! !!!!!! ! !! !! !!!!!! ! ! !!! ! !!!! ",
- " !!!!!!!!!!! !!! !!!!! !! !!!!!!!!!!! !!!! ! !!! ! !!!!!!!! !!!!!! !!!! !! ",
- " !!!!!!!!!!!! !!! !! ! !!!! !!!!!! !!!!!!!!!!!! !! !! !!!!! !! !!! !!!! ! !! ",
- " !! !!!!!!!! !! ! !! !! !!!!!!!!!! !!!! !!!!! !! !! !!!!!!! !!!! !!!!!! ",
- " !! !! !!! !! !!!!!!!!!!! !!!!!! !! !! !! !!! !!!! !!!! !!!!!! ",
- " !! ! !! !!! !! !! !! !!!! !! ! !! !! !!!!!!! !!!!!!!! ! !!!!!!!!!! !! ",
- " !!!!!! !!!! !! !! !! !!! !!!! !! !!!!!! ! !! !!!!!!!!!!!! ",
- " !! !!! !!!! !! !! !!!! !! !!! !!!!! !!!!! !! !!!!!!! ",
- " !!!!!!!! ! !! ! !!!!!! !! !!!!!! !!!!!! !! !! !! ",
- " !!! !!!!! !! !!!!!! ! !! !!!!!!!!!! !! ",
- " !!!!! !!!! !! !!!!!! !!!!!!! !! ! ",
- " !!!!!! !! !!!!!!!! !! ! ",
- " !!!!!!! !!!!!!!! ",
- " # !!!!!!!! !!!!!!!! ## $ ",
- " #### # ## !!!!!! !! ## !! !!!! ### $ ",
- " ##### ## # #### !!! ! ## ### #### !!! ### $ ",
- " ####### ## ## #### !!! #### ## ## ### ##### # $ ",
- " ######### ## ## #### ##### ## ## ###### ####### #### # # $ ",
- " ########## ### #### ###### ####### # ## ## ## #### ######## ### ## #### ## $$ $ ",
- " # ### ######## #### # ######## #### ###### ### #### ########## ### ##### ### # ## ##### ## $$ $ ",
- " ## ##### #### ######### ####### ####### ### ## ### # #### # #### ## ### #### ## ## $$ $ ",
- " ###### #### ## ## # # ##### #### #### # ## ###### ### ## #### ######## ## ## $$ $$$ ",
- " ## ##### ### # ## ## # #### ## # ### ## ###### ########## #### $ $$$$$$ ",
- " ####### #### ## ## #### ###### ## #### ## ## # ###### ## ## ## #### $$ $$$$$$ ",
- " ## ##### ## #### ## #### # #### ## ## #### ### ## ### ### ## # ## $$ $$$$$$ ",
- " # ### ## ## ## ####### ### ## ### ## ####### #### ##### # ## #### $$ $$$$$$ ",
- " % ## #### # #### ### ## #### #### ## ######## ## ## #### #### ## #### $$ $$$$$$ ",
- " % ### ## ####### ## ### ## ## ##### ## ####### # #### $$ $$$$$ ",
- " % # ## ##### ## # # ## ## #### ## ####### $$ $$$ ",
- " % ## #### ## ## ## ## # # ## ## ## #### $$ $$$ ",
- " % ## ###### ## ## ####### ## ### #### ## $$ $ ",
- " %%%% ####### # # ## ######## ### # $$ $ ",
- " %%%% ## ####### # # ###### ## $ ",
- " %%%%%% ## # ###### ##### #### $ ",
- " %%%%%% #### # ## ## #### #### $ ",
- " %%%%%% #### ### ####### && $ ",
- " %%%%%%%%% ####### & &&&&& #### &&&&&&& $ ",
- " %%%%%%%%% &&&&& ###& &&&&& && &&&&& &&&&&&&&& $ ",
- " %% %%%%%% &&&&&&& &&&& &&&& &&&&&& &&&&&& &&&&& $ ",
- " %% %%%%%% &&&& &&&& &&&&& &&&& &&&& &&&&&&& &&&&&&&&& & & $ ",
- " %% %%%% &&&&& &&&&&& &&&&& &&&& && &&&&& &&&&&& & &&&&&&&&&&&& && & $ ",
- " %%%%%% &&&&&&&&&&& && &&&&&&& &&&& && &&&&&&&&&&&& & & &&& &&&&&&&& & &&& $$ $ ",
- " %%%%%% &&&& &&&&&&& && && &&&&&& &&&&&& && && && &&&&&&&& & &&& &&&&&&&& & &&&&& $$ $ ",
- " %%%% &&&&&&&&&& &&&&& &&&&&&&&&&& & &&& &&&&&& &&& &&&& &&&&&&&&&&& &&&& $$ $ ",
- " %%%% &&&&&& &&& & &&& & &&&&&&&& & && && &&&&&&&& &&&& && &&&&&&& &&&&& && $$ $$$ ",
- " % %% & &&&&&&&& &&&&& & && &&&&& &&&& && && & &&& & &&&& &&& && &&& & &&& &&&&&& $ $$$ $ ",
- " % & & &&&& &&&&&& &&& && && &&&&&& &&&&& && & &&&&&&&&& && &&&&&&&&&&&&&& $$ $$$$$$ ",
- " % & & &&&&&&&&&&&& & &&&&&&&& & &&& &&&&&& && &&&&&&&& & && $$ $$$$$ ",
- " % && &&&&&&& && &&&&&&& & && &&&&& & &&& &&&&&&& && $$ $$$$$ ",
- " % &&&&& && && &&&&&&& &&& &&&&&&&&&& &&&&& && $$ $$$$$$ ",
- " % &&&&&&&&&& &&& &&&& &&&&& & &&&&&&&& $$ $$$$$ ",
- " % &&&&&&& &&&&&&& &&&&&&& &&&& &&& $$ $$$ ",
- " % &&&&&&& &&& &&&& &&& &&& &&& $$ $$$ ",
- " % &&&&&&&& &&&&&& &&&& && $$ $ ",
- " % &&&&& &&&& && $$ $ ",
- " % &&& ''' ' ' ' $$ $ ",
- " % ''''''''''''''''' $ ",
- " % %% '''''''''' ' $ ",
- " % %% ( (((( ''''' ' $ ",
- " %%% %% ((( (((( (((((( ''''' ' $ ",
- " %%% %% ( ((((( ((((((( ((((((( '''''''''''''''''''''''' $ ",
- " %%%%% %% ((( (((((( ((((( (( (((((((( $ ",
- " %%%%%% %% ((((( ((((( ((( ((((((((( (((((((( ''''''''' ''''' $ ",
- " %%%%%% %% (((( (( ((((((((( (((((( ((((( ( ((( (((((((( ''''''''' ''''' $ ",
- " %%%%%% %% ((((((((( ((((( ( ((( ((((((( ((((( (( (( (( (( ( $$ $ ",
- " %%%%%% %% (( (((( ((( (( (( ((( (( (( ( (( ((((( (( (( (( ((((((( (( (( $$ $ ",
- " %% %%% % (( (( (((((( (( ((( (( ( (((( ( ((( (( ((( ((((( (( (((( (( (((( (((( (( ((( ( $$ $ ",
- " %%% %% (( ((((((( ((( (( (( ((((((((( (( ((( (( ( (((((( ( (( ((( (( (( ((((( ( ((((((( $$ $$$ ",
- " % %% (( (((( ( ((((( ((( (( ((((( (( (((((((( (((((((( ( ((((((( (( (((( ( (((((( $$ $$$ ",
- " % %% ( ((((( ((( (((((((((( ( ((((( ( (((((( ((((((( ( ((((((( ((((((( (( ( (((((( $$ $$$$$ ",
- " % %% ( (((( ((( (((((((((( ( (((( ( ((((( (( ((( ((( (((( (( (( (((((((((( (( $$ $$$$$ ",
- " % ( (((( ((( ((((( ( (( (( ((((((((( (( ( (( ((((((( ( ( ((( (( ((( (( $$ $$$$$ ",
- " % (((( (((((((( (( ( (((((( (((( ( ((( (( ((( (( ((( (( ( ((( $$ $$$$$ ",
- " % (( ((((((( (( (((((( (( (( ((( ((( (( (((( ((((( $$ $$$$$ ",
- " % (((( (( ((( (((( ((((( (((( (( (((((( ( $$ $$$ ",
- " % ( (( ((( ((((( (( (((((((((( ))) (( ((((( $$ $$$ ",
- " % ((((( ** + ((((((((( (((((((( ))))))))))))))) ( (()() $$ $ ",
- " % ((( ** ** + (( ((( ( ( ))))))))))))))) ))))))))) ) $$ $ ",
- " % ***** ** + ))))))))) ))) ))))))))) )) $$ $ ",
- " % ***** ** + , ))))))))))))))))))))))) ))))) $ ",
- " % ****** * + , ----- - ---- )))))))))) )))))))))))) $ ",
- " % *********** ** + , --------- ----- )))))))))) )))))))))))) $ ",
- " % %% ******* ******* ++++ , -- - ------- ----- ))))) ))))))))))) $ ",
- " % %% ** *** * **** ++++ , ---------------------------- )))))) ))) ))) ) $ ",
- " %%% %% ** ** * + ++ , ------- - ))) ))))) ) )) $ ",
- " %%% %% ** **** +++ ++ , --------- )))) ) $ ",
- " %%% %% * ***** ++++++ , ------- ) $ ",
- " %%%%% %% ******* ++++++ , ,, . - ---- ... . . ...... )) $$ $ ",
- " %%%%% %% ****** +++++++++ , ,, . ...........------ ......... ..... ) $$ $ ",
- " %%%%% %% * **** +++++++++ ,,, ,,,, ......... ..... ......... .... ) $$ $ ",
- " %%%%% %% ** * ++ +++ ++ ,,, , ,, ....... ................................ ) $$ $$$ ",
- " %%%%% ** ++ +++ ++ ,, ,,, , ......... . .......... ) )) $$ $$$ ",
- " %%%%%% ** * +++++++++,, ,,, ,, .. ......... ......... ) )) $$$$$ ",
- " %% %%% **** ** +++++++,,,,,, ,, . ......... ........ )) ) )) $$ $$$$$ ",
- " %%% *** ** /// // ++ +++ ,,,, ,,,, .. .... ... ..... )) )))) $$ $$$$$ ",
- " %%% ****** * ///// ///// +++,,,,, , ,, . . .... ..... )) )))))) $$ $$$$$ ",
- " %%% ******** ** ** /////// ///// +++,,, ,,,,, . .... )))))) )) $$ $$$$$ ",
- " % ******* ******* //// ////// // + ,,, , ,, . 0 )))) )))) $$ $$$ ",
- " % ** *** * **** /// ///// /////// //// ++ , ,, . 0000000000 ))))) ) )) $$ $$$ ",
- " % ** ** * /////////// ///////// + ,,,, . 0000000000 )))) )))) $$$ $$$ ",
- " % ******* ////////// ///// + ,,,, ... 000 0 ))))) )))) $$ $ ",
- " % * ***** / //////// /// /// + , ... 00000 ))) )))) $$ $ ",
- " % ******* // / ///// //// // + , .... 00000 ))) ) )) $ ",
- " % ******* // // // //// + , ...... 00000000000000000000000000000 ) )) $ ",
- " % * *** // ///////// , . ... 000 0 0 0 00 )))) $ ",
- " % ** * // // / ///// // , . ... .. 000000000000000 )))) $ ",
- " % * // // ////////// , .. ... .. 000000000000000 ) $ ",
- " %%%% /// // /////// , .. ... .. ))) ) ) ) )) $ ",
- " %% % ///// // /////// , .. ...... ))))))))) ))))))))) ) $ ",
- " %%%% /////// / , .. ...... ) ))) ))) ))))))))) ) $ ",
- " %%%%%% // /// / / .. ... ))))) )))))) )) $$$ ",
- " %%%%%%% // ////// // .. ... ))))) ) )))) ) $$$ ",
- " %%%%%%%% // ///// // .... ))))))))))))) ))))) ) $$$ ",
- " %%%% %%%% ///////// / .... ))))))))))))))))))))))))))))) $$$ $$ ",
- " %%%%%%%% /// //// / .. . ))))))))) )) ) ) ) )))) ) $$$$$$ ",
- " %%%% %%%% ///////// // . ))))))))) ))))) ))))))))) ))))) $ $$$$ ",
- " %%%%%%%% ////// / . ) ))))) ))))))))) ))))) $$$$$$$$ ",
- " %%%% % % // /// / .. .. $$$ $$$$ ",
- " %%%%%%% // / / . ... $$$$$$$$$ ",
- " %%% /// / . ........ .......... $$$ $$$$ ",
- " %%% / / . ....... .......... $$$$$$$$ ",
- " %%% / / .. .. ...... $$$$$$ ",
- " % / / .. ..... ...... $$$$$$$ ",
- " % / / . .. ... ..... $$$ ",
- " % // / .... ..................................... $$$ ",
- " % // / ..... . ... . . .... $ ",
- " % / / ............. ......... ..... $ ",
- " % / / ........... ......... ..... $ ",
- " // // $ ",
- " / / $ ",
- " / / ",
- " / // ",
- " // // 1 ",
- " / // 1111111111 1111111111 ",
- " / // 111111111 111111111 ",
- " / // 11111111 11111 ",
- " /// // 11111 11111 ",
- " /////// // 11111 111 ",
- " /////// // 11111111111111111111111111111111111111111111111 ",
- " /// 111 111 1 1 1 11 ",
- " 111111111 11111 111111111111111 ",
- " 111111111 11111 111111111111111 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-1-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-1-800-800-2.0-grid-reference.json
deleted file mode 100644
index 74daf77..0000000
--- a/tests/visual_tests/grids/lines-multi-layout-1-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "6",
- "16",
- "10",
- "2",
- "12",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " !!!! !!!!!! ",
- " !!!!! !!!!!!!!!! ",
- " ! !!!!!!!! !!!!!!!!!! ",
- " !!!! !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!! !!!!!!! !!! !!! !!!!!!!!! ",
- " !!! !!! !!!!! !!!!! !!! !!!!!! ",
- " !!! !!! !!! !! !!!! !!! !!! !!!!! !!!!!!!!! ",
- " !!! !!! !!!! !!! !!! !! !!!!! !!!! !!! !!!!!!! !! ",
- " !!! !!! !!!!!!!! !!! !!! !!!! !!!!!!!! !!! !! !!! !!!!!! ! !!! ",
- " !!!! !!! !!!!!!!! !!!!!! !!! !!!! !!!!!!!!!! !!!!!!! !!! !!!! !!!! !!! ",
- " !!! !!! !!!!!!!!! !!! !!! !!! !!!!!!! !!!!!!! !!!!!!!!!!!! !!! !!! !!! !!! ",
- " !!!! !!! !!!!!! !!!! !!!!! !!! !!!!!!! !!!!!! !!! !!!!!!!!!! !!! !!!!! !!! ",
- " !!! !!! !!!!!!!!! !!! !!!!!!!! !!! !!!!!!!! !!! !! !!! !!!!!!!!!! !!! !!!!!!! !!! ",
- " !!!! ### !!! !!!!!!!! !!! !!!!!!! !!! !!!!!!! !!!! !!! !!!!!!!!!!!!!!! !!!!!! !!! ",
- " !!! ###### !!! !!!!!!!!! !!! !!!!!!!! !!! !!!!!!!!!!!!!! !!! !! !!!!!!! !!! !!!!!!! !!! ",
- " !!! ###### !!! !! !!!!!! !!! !!!!!! !!! !!!!!!!!!!! !!!!!! !!!! !!!!!!! !!! !!!!!! !!! ",
- " ######## !!! !!!!!! !!!!!!!!!!!! !!!! !!! !!!!!!!!! !!! !!! !!!!!!! !!!!!!! !!! !!!! !!!! ",
- " ######### !!! !!!! !!! !!!!!!!! !!!!!! ## !!! ! !! !!!!!!!!!! !!!!!!! !!!!!! !!! !!! ",
- " ####### !!! !!! !!!!!!!!!!! !!!!!!!! #### !!! !! !!! !!!! !!! !!!!!!!!! !!!!! !!! !!! ",
- " ############ !!! !!! !!!!!!!!!!!!!!!!! #### !!! !!! !!!!!! !! !!!!! !!! !!! !!! ",
- " ############ !!! !!! !!!!!!!!!!!!!!! ####### !!! !!!!!!!!!!!! !!!! !!!!! ",
- " ## ## ####### !!!!!!! !!!! !! !!!! ####### !!!! !!!!!!! !! !!! ",
- " ####### ####### !!! !! !!!!! ######## !!!!!!!!!!! !!! ## ",
- " ####### ###### ! !!! ####### !!!!!!!!!! !!!!!! #### $$ ",
- " ### ####### ##### # ######## # !!!!!!!! !!!!!!! #### # ### $$ ",
- " ###### ##### ### ## #### ########### !!!!!!!!!!!!!!!! ####### #### $$ ",
- " ### ### #### # #### ### ### ##### ####### !!!! !!!!!!!!! ## ######## ######## $$ ",
- " #### ### ## ###### ### #### ### ###### ######## !!!!!!! ##### ############### # $$ ",
- " ### ### ####### #### ### ### ####### ####### !!!! ### ### ############# #### $$ ",
- " #### ## ## ### ####### ######## ### ## ### ###### ###### !!! ### ### ########## ### $$ ",
- " ### ######## ### ############## ### ##### # ### ####### ### ### ### ##### ### $$ ",
- " ### ########## ### ############ ### ########## ### ###### ## ### ### ### ## ### $$ ",
- " #### ########### ### ### ######### #### ########### ### ### ### ### #### #### ### $$ ",
- " ### ######### ### #### ### ## ## ### ############## ### ## ### #### ########### #### $$ ",
- " #### ########## ## #### ### ## # ## ### #### ###### ### ### ## ### ########### ### $$ ",
- " ## ######### ##### ### ### #### ### ## ######### ### ### #### ### ######### ### $$ ",
- " % # ## ##### ####### ### ########## ### ### ####### ### ### ###### #### #### ### $$ ",
- " % ###### ####### ### ## ####### #### ##### ######## ### ### ####### ### ### $$ ",
- " % #### ###### ### ######## ### ######## ### #### ### ### ####### ### #### $$$$ $$ ",
- " % # #### ### ####### ### ######### ## #### ### ### ####### #### ### ### $$$$ $$ ",
- " % ### ### # ### ######## ##### ### ### ######## ##### ##### $$$$ $$ ",
- " % ### ### ######## ####### ### ### ######### ## ######## $$$$ $$ ",
- " % ### #### ### ### ###### ###### ####### ########## $$$$ $$ ",
- " % && ## ##### #### ## ###### #### ################ $$$$ $$ ",
- " % &&&&&& && #### ### ######## ##### # && ############## $$$$$ $$ $$$$ ",
- " % &&&&&&&&&&& #### #### ### &&& #### &&&&& ###### #### $$$$$ $$$$$$$ ",
- " % && &&&&&&&&&&& ################ && &&&&& && &&&&&&&& ##### ## $$$$$ $$ $$$$ ",
- " % %%%%% &&&&&&&&&&&&&& ############## &&&& &&&&&&&& &&&& &&&&&&&&&& ### $$ $$ $$$$ $$$$",
- " % %% % &&&& &&&&&&&&& ############# &&&&& &&&&&&&&&& &&& &&&&& &&&&&&&&& &&&&&&& $$ $ $$ $$$$ $$$$",
- " % %%%% && &&&&& #########&&&&&& &&&&&&& &&&&&&&& &&&&&&&&& &&&&&&& &&&&&&& &&&&&&&&&&& $$$$$ $$$$$$$ $$$$",
- " % %%%%%% &&&&&&&& &&& &&& ### ##&&&&&&&& &&&&&&& &&&& &&&&& &&& &&&&&& &&& && &&&& &&& $$$$$ $$ $$ $$$$",
- " %%%%%% %%%%%% &&&& &&& &&&&&& &&&& &&& &&&&& &&& && &&& &&& &&&&& &&& &&&& &&& $$$$ $$ $$$$ $$$$",
- " %%%%%% %%%%% &&&&&& &&&& && &&&&&&& && &&& && &&&&&&& &&&&& &&& &&& &&&&&&&&&&&&&& &&& &&& $$$$ $$ $$$$ $$$$",
- " %% %%% %%%%% &&&&&&&&&&&&&& && && &&& &&& &&&& && &&&&&&&&&&&&& &&& &&&&&&&&&&&&&&&&& &&&& && $$$$$ $$$$$$$ $$$$",
- " %%%% % %%%% &&& &&&&&&&&&&& &&& &&&&&&&&&& &&& &&&&&&&&&&&&&&& && &&& && &&&&&&&&&&& && &&& && $$$$$ $$ $$$$$$$$$",
- " %%%%%% %%%%% &&& && &&&&&&&&&&&&& &&&&&&&&&& &&& && &&&&&&&&& &&& &&&& && &&&&&&&&& &&& &&&&&& && & $$$ $$ $$$$$$ $$",
- " %%%%%%%%%%%%%%%% &&& &&&&&&&&&&&&&&&& && &&&& & &&& && &&&& && &&&&&&&&&&& &&& & && & &&&&&&&&&&& &&& &&& $$$$ $$ $$$$$$$$$",
- " %%%%%%%%% %% %%%% && &&& &&&&& && &&&& &&&& &&& && && &&& &&&&&&& &&& &&& &&&&&& &&& &&& $$$$$ $$$$$$$$$$$ ",
- " %% %%%%%% %% %%%%% &&&&&& &&&&&&&&& &&& &&& &&&& &&&&&&& &&&& &&&&&&&&&&&&& &&&&&&&&& $$$$$ $$ $$$$ ",
- " %%%%%%%%%%%% %%%%% &&&&&&&& && &&&&&&& &&&& &&&&&&&&&&&&&&&& &&&&&&& &&&&&&& &&&&& $$$$ $$$$$$$ ",
- " %%%% %%%%%%% %%%% &&&&&&&&&&&&&&& &&&&&&& &&&&&& &&&&&&& &&& &&&&&&&&&&& &&& $$$$ $$$$ $$ ",
- " %%%% %%%% %%%% %% &&&&&&&&& && &&& &&&&&&&&&&&& &&&& &&&&&&&&&&& &&&& $$$$$ $$$$$$$ ",
- " %%%% %%%% %% % %% && &&&&& && &&&&&&&&&& &&&&&& ' & &&&&&&&&&&&&&&& '''''' $$$$$ $$ ",
- " %%%% %%%%%%% %%%% &&& ''' & &&&&&&&&&&&&&& '''' & &&&&&&&&&&&&&& '''''' $$$$ $$ ",
- " %%%% %%%%%%% % %% & '''' ' &&&&&&&&&&&&&&& ''''''' &&&&&&&&&&&&&& '''''''''' $$$$$ $$ ",
- " %%%% %%%% %% '''''' &&& &&&&&& '''''' && &&&& '''''''''' ((((((( $$$$$ $$ ",
- " %%%% %%%% %% % ''''''' &&&& ''''''''' &&&&& ''''''''''' ((((((( $$$$$ $$ ",
- " %%%%%%% %%%% '''''''''' &&&& ''''''''' &&&& ''''''''''' ( $$ ",
- " %%%%%%% %%%% ''''''' '''''''' ''''' '''''' ( $$ ",
- " % %% %% %%%% ''''''''' '''''''''''' '' ''' '''''' ( $$ ",
- " %% %%%% ''''' ''''''' '''' ''''''''' ''''''' '''''''(((((((((((((((((((( $$ ",
- " %% %%%% '' '' ''''''''' ''''' '''''''' ''''''' ''''''(((((((((((((((((((( $$ ",
- " %% %%%% ''''''' ''''''''' '''''' ''''''''' ''''' '''''' ''''' $$ ",
- " %% %%%% ''''' '''''' ''''''''' ''''''' '''' ''''''' ''''''''' ''''' '' $$ ",
- " %% %%%% ''''''' '''''''' '''''' ''' ''''''''''' ''''' ''' ''''' '' '''' ' $$ ",
- " %% %%% '''''''''' '''' ''' ''''' ''' '''' '' ''''' ''' ' '' '' $$ ",
- " %% '''' ''' ''' ' ''' '''' '''' '' '' '''' ''' ''' '' $$ ",
- " %% ''' '' '''' ''' '' '''' ''' '''''' '' '' ''' '''''''''' '' $$ ",
- " %% '''' '' ''' '''''''' '' '' ''' ''''''''' ''' ''' ''''''''''' ''' $$ ",
- " %% ''' '' ''' ''''''''''' '' '' '' '''''''''''' '' '' ''''''''''''' '' ' $$ ",
- " %% ''' ''' ''' ''''''''''''''' ''' ''' ''''''''''''''' '' ''' ''''''''' ''' '' '' ''' $$ ",
- " %% ''' '' ''' ''''''''''''''' '' ''' '''''''' ''''''' '' ''' '''''''' '' '' ''' '''' $$ ",
- " %% ' '' '''' '''''''' '' '' ''' ''' '''''''' '' '' ''' '''' ''''''''' '''' '''' '''' $$ ",
- " %% ''' '''' '''''''' '' '' '''' '''' '''''' '''' '''''''' ''' ''' ''''' ')))))) $$ ",
- " %% ''''''''' ''''' ''''' ''''''' '''' ''''' '''' ''''' '''''' )))))))))))))) $$ ",
- " %% ''''' ''' ''''' '' ''' ''''''' ''' ''''''' )) ))))))))))) $$ ",
- " %% *'* +' ''''' ''''''' '''''')))))))))))))))))) $$ ",
- " %% *** + '''''''' ''''''' ' ''''))))))))))))))))))) $$ ",
- " %% *** *** ++ '''''' '''''' ))))))))))))))))) ''' )))))))))) $$ ",
- " %% *** *** ++ '''' , '''' ))))))))))))))))))))))))))))))))))) )))) ))) $$ ",
- " %% ******** *** ++ '' , ,,, ))))))))))))))))) )) )))) $$ ",
- " %% ******** *** ++ ,, ,,,, )))))) )) ))) ))))) $$ ",
- " %% ******* *** ++ ,, ,,,, --------------- )))))))))) )))) ))))) $$ ",
- " %% ******* *** + ,, ,,,, ----------------------------- )))))))))))))))) ))))) $$ ",
- " %% *********** *** ++,,,, ,, ,,,, .. .. ....--- )))))))))))))) )) ))))) $$ ",
- " %% ********* **** *** * +,,,,, ,, ,,,, .. ........... .......... ))) ))))))))))) )) ))))) $$ ",
- " %% **************** *** **** +,,,,, , ,,,,, ................... ......... )))) )))))) )) ))))) $$$$ $$ ",
- " %% %%%%% ***************** *** ***** +,, ,, ,, ,,,,, .. ................ ......... )))))) )) ))))) )))) $$$$ $$ ",
- " %% %%%%% *************** *** ******** +,,,,,,,,, ,, ,,,,, .................. ..... ... ))))))) )))))))) $$$$ $$ ",
- " %% %% %% ***** * **** *** ********* ,,,,, ,,,, ,, ,, ........ .. ))))))) )))) )) $$$$ $$ ",
- " %% %%%%% *** **** *** ******** ,,,,, ,,,, ,, .. ................................... ))))))))))) )) $$$$ $$ ",
- " %% %%%%% ** **** *** * **** ,,, ,,,, ,, , ,, ............................ ))))) )) $$$$ $$ ",
- " %%%%%%% %%%%% *** *** ** ,,,, ,,,, ,, ,,,,, ...... .. .. .. .. ))) ) $$$$$ $$ $$$$ ",
- " %%%%%%% %%%% *** ***** ,,,,,,,,, , ,,,, .. ................... ) $$$$$ $$$$$$$ ",
- " %% %%%% %%%% *** ******** ,,,,,,,,, ,, ,,,, .. ............... .. ) $$$$$ $$ $$$$ ",
- " %%%%%%% %%%%% *** ******* ,,,,,,,,, ,, ,,,, .. .. ................ ) $$ $$ $$$$ $$$$",
- " %%%%%%% %%%%% *** ********* / ,,,,,, ,, ,, ,,,,, .. ................... ) $$ $ $$ $$$$ $$$$",
- " %%%%%%%%%%% %%%% *** ******* ///////// ,,,,,,,,,, ,, ,,,, .. .. .... .. .. )) $$$$$ $$$$$$$ $$$$",
- " %%%%%%%%% %% %%%% *** ****** /// //////////// ,,,,, ,,,, ,, ,,,, .. ........... )) $$$$$ $$$$$$$ $$$$",
- " %%%%%%%%% %% %%%%% *** ******** /// //////// ,,,,+ , ,,,,, .. .. ........ )) $$$$ $$ $$$$ $$$$",
- " %%%%%%%%%%% %%%%% *** ******** /// /// ,, ,, ,, ,,,, .. ........... )) $$$$ $$ $$$$ $$$$",
- " %%%% %%%%%%% %%%% *** ******** /// // ,,,,, ,, ,,,, .. ......... )) $$$$$ $$$$$$$ $$$$",
- " %%%% %%%% %% %%%% *** ******* /// ///,,,,++ ,, ,,,, . 000000)))))) )) ) ))))) )) $$$$$ $$$$$$$$$$$$",
- " %%%% %%%% %% %%%%% *** **** /// // ++ ,, ,,,, . 000000000000000000000000))))))))))))))))))) )) $$ $$ $$$$$$ $$",
- " %%% %%%%%%% %%%%%*** *** /// // ,, ,,,,, .. ))))))))))))))))))) ) $$$$ $$ $$$$$$$$$",
- " %%%%%%%%%%%% %%%%*** //// // ,, ,,,,, .. ))))))))))) ))))) )) $$$$ $$$$$$$$$$$ ",
- " %%%%%%%%% %% * /// /// , ,,,,, .. ..... ))) ))))))) ))))) )) $$$$$ $$$$$$$ ",
- " %%% %%%% %% %% // // ,, ,,, , .. ..... )))) )) $$$$ $$$$$$$ ",
- " %%%%%%% %%%%% // // ,, ,,,,, .. .. .. ))))))))))) )) $$$$ $$$$ $$ ",
- " %%%%%%% %%%%% / // ,, ,, .. ..... )) )))))))) )) $$$$$ $$$$$$$ ",
- " %% % %% %%%%% // /// .. ..... ))))))))))) )) $$$$$ $$ ",
- " %% %%%% // // .. ..... )))))))))) )) $$$$$ $$ ",
- " %% %%%% // // . .... ))))))))))))))))))))))) )))))) $$$$$ $$ ",
- " %% %%%% // // . ..... .. .. )))))))))))))))))))))))))))))))))))))))) $$$$$ $$ ",
- " %% %%%% // // .. ............ )))) $$$$$ $$ ",
- " %% %%%% / // .. ........... ))))) ) ) ))) $$ ",
- " %% %%%% / // .. ........... ))))))))))))) ))) )))))))))) $$ ",
- " %% // // .. .............. )))))))))))))))))) ))))))))) $$ ",
- " %% // / .. ..... ))))))))) ) ))) ) ))))))))) $$ ",
- " %% // // ... ........... ))))))))))) )))))) ))))))))) $$ ",
- " %% // // .. ........... )))) $$ ",
- " %% // // .. .. .. ....... $$ ",
- " %% / // .... ... . ..... $$ ",
- " %% /// // ...... .... . $$ ",
- " %% // // ....... ...................................... $$ ",
- " %% // / ....... .. $$ ",
- " %% /// // ....... .. $$ ",
- " %% // // .......... .... ......... 111 1 1 1 11 $$ ",
- " // // .............. .........111111111111111111 $$ ",
- " // /// ....... . .........111111111111111111 $$ ",
- " /// /// ......... .........11111111111 1111111 ",
- " // /// .. 11111111111 1111111 ",
- " // /// 1111 ",
- " // /// 11111111111 ",
- " /// //// 11 11111111 ",
- " // /// 1111111111 ",
- " ///// /// 111 111111 ",
- " /////////// //// 111111111111 ",
- " ////////////// 11111111111111111111111111111111111111111111111111 ",
- " ////// 111111111111111111111111 ",
- " 11 11111 ",
- " 111111 11 111111111111111111 ",
- " 1111111111111111111 111111111 ",
- " 11 111111111111 11 111111111 ",
- " 1111111111111111111 111111111 ",
- " 11111111 11111 1 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-2-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-2-800-800-1.0-grid-reference.json
deleted file mode 100644
index 9f99439..0000000
--- a/tests/visual_tests/grids/lines-multi-layout-2-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,209 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ",
- " !!!! ",
- " !!! !!!!!!!! ! ",
- " ! ! ! ! !! ! ",
- " !!!! ! !! ! ! ",
- " !! !! !! ! ! !! ! ",
- " ! ! !! ! ! ! ",
- " !! ! !!!! ! ! ",
- " !!! ! !! ! ! !!! ",
- " !!!!!! !!! ! ! ! ",
- " ! ! ! ! !! ! ",
- " !! ! !! ! ! ",
- " ! ! !! ! ! ! ",
- " ! ! !! !! ! !! ",
- " ! !! ! ! ",
- " ! ! ! !!!! ",
- " ! ! ! !!!!! ",
- " ! ! ! ",
- " ! ! ! !! ",
- " !! ! ! ",
- " ! !! ! ! ",
- " ! ! ! ! ",
- " !! ! ! ! ",
- " ! ! !!! ! ",
- " ! ! ! ! ",
- " ! ! !!! ! ! ",
- " ! ! !! ! !! !! ",
- " ! ! !! ! ! ",
- " ! !!!! !! ! ",
- " ! ! ! !!!! ! ! ",
- " ! ! ! !! !! ! ",
- " !!! !! ! ",
- " ! ! ! ! !! ! ",
- " ! ! ! ! ! ! ",
- " !! !! ! !! !!!! ",
- " ! ! ! ! ! !! ! ",
- " ! ! !! ! !! ! ",
- " ! !! ! !! ! ! ",
- " ! ! !! ! ",
- " ! !!! ! !! ! ",
- " ! !! !!! ! ! ! ",
- " ! !! ! !! ! ! ",
- " ! !!! ! ! !! ",
- " ! ! ! ! ! ",
- " ! !! ! ! ! ",
- " ! ! !!! ! ! ",
- " !! ! !! ! ! ",
- " ! ! ! ! ! ! ",
- " !! ! ! !! ",
- " ! ! !!!!! ! ",
- " !!! !! ! ! ",
- " !! ! !!! ! ",
- " ! ! ! ! ! ",
- " ! !! ! ! ! ",
- " ! ! ! !!! ! ",
- " !!! ! ! ",
- " !!!! ! ! ! ! ",
- " !!!! ! ! ! ! ! ",
- " !!! ! ! ! ! ",
- " !!! ! ! ! ! ",
- " !!!! !! ! ",
- " !! ! ! ! ! ! ",
- " ! ! ! !!! ",
- " ! !! ! ! ",
- " ! ! ! !!! ",
- " ! ! ! !!! ",
- " ! !! ! ",
- " ! ! ! !! ",
- " ! ! ! ! ",
- " ! !!!!! !! ",
- " ! ! !! ! !! ",
- " ! ! !! ! ! ",
- " ! !! !! ! ",
- " ! ! !! ! ",
- " ! !!!! !!!! ",
- " !! !! !! ! ! ! ",
- " ! ! ! ! ",
- " ! !!! ! ! !! ",
- " ! !! ! ! !!!! ",
- " !!! ! ! ! ",
- " ! ! ! ! ",
- " ! !! !!! ! ! ",
- " ! ! ! !! !! ",
- " ! ! ! !! ! !! ",
- " ! ! !! !! ! ",
- " ! !! ! !!!! ",
- " ! ! !!!! ",
- " ! !! ! ! !!! ! ",
- " ! ! ! ! ! !!!! ",
- " ! !! !!! !!!! ",
- " ! ! ! ! !! ! ",
- " !! ! ! ! ",
- " !! ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! !! ! ",
- " !! ! !!! ! ! ",
- " ! ! ! ",
- " ! ! ! ! ",
- " !! !! ! !! ",
- " !! !!! ! ! ",
- " ! !! ! ! ",
- " ! ! ! ! ",
- " ! ! !! ! ! ",
- " !! ! ! ! ",
- " !! ! ! ! ",
- " !!! ! ! !!! ",
- " !!!! ! ! !! ",
- " !!!! ! !!! ",
- " !! ! ! ! ",
- " !! ! ! ! !! ",
- " ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! !! ! ",
- " ! ! ! !! ",
- " ! ! ! ",
- " ! !!!!! ! !!! ",
- " ! ! ! ! !! ",
- " ! ! !! ! !! ",
- " ! !!! !! ! ",
- " ! ! !! ! ! ",
- " ! !!!! ! ! ",
- " ! !!!! ! ! ",
- " ! ! !! !!!! ",
- " ! !! !!!! ! ",
- " ! ! ! ! !! ! ",
- " ! !! ! ! ! ",
- " ! !! !!!!! !!!! ",
- " ! !!! ! ! !! ",
- " ! !! ! ! ! ! ",
- " ! ! ! !! ! ",
- " ! ! ! !! ! ",
- " ! !! !! ! ",
- " !! !!! ! !! ! ",
- " ! ! ! ! !!!! ",
- " ! ! ! !! ! ",
- " ! !! ! ! !! ! ",
- " ! !! !! !! !!! ! ",
- " ! !!! !!! ! ! !! ",
- " ! ! ! !! ! !! ",
- " !!!! ! ! ! ",
- " !!!! ! ! ",
- " ! ! !!! ! ! ",
- " !!! !! ! ! ",
- " ! !! ! ! !! ! ",
- " ! ! !! ! ! ",
- " ! ! !! ! ",
- " !! ! ! ! ! ! ",
- " ! ! ! !! ! ",
- " ! ! ! ! ! ",
- " ! ! !! !! ",
- " ! ! ! ",
- " ! !! ! ",
- " !!! ! ! ",
- " !!!! !! ! ",
- " !! ! ! ! ",
- " !!! ! ! ! ! ! ",
- " !!! ! !! !! ! ! ",
- " !! ! ! ! ! ! ",
- " ! ! ! !! ! ! ",
- " !! !!!! ! ! ",
- " ! ! ! ! ! ! ",
- " ! !!! ! ! !! ",
- " ! ! ! !! ! ",
- " ! ! ! ! !! ! ",
- " ! !! ! !!!! ! !! ",
- " ! !! !!!! !! !! ",
- " ! !! !! !! ! ",
- " ! !!!!!! ! !! ",
- " !!!! ",
- " ! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-2-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-2-800-800-2.0-grid-reference.json
deleted file mode 100644
index 34efbf1..0000000
--- a/tests/visual_tests/grids/lines-multi-layout-2-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,209 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ",
- " !!!!!!!!! !! ",
- " !!!! !!!! ! ",
- " !!! !!! ! ",
- " !!! ! !!! !! ",
- " ! !! ! ! !!! !! ",
- " !! !!! !! ! !! !!! !! ",
- " ! !!! ! !! ! !! ! !!! !! ",
- " ! ! !! !!! !!! ! !! !! ",
- " !!! !! ! !!! !!! !! !! !! ",
- " ! ! !! ! ! ! ! !! ! !! ! ",
- " ! ! !! ! ! ! !! ! ",
- " !! ! !! !! ! !! !! ",
- " !!!! !! ! !! !! ",
- " !! !! !! !! ",
- " ! ! !! !! ! !! !! ",
- " !!!! !! ! !!! !! !! ",
- " !! !! !! !! !! ",
- " !! ! ! !! !! ! ! ",
- " !! ! !! !! ! !!!!! ",
- " !!! !! !! ! !! ! ",
- " ! ! !! !! ! !! !! !!!! ",
- " ! !! ! ! !! !! ! ",
- " !!! !! ! !!!! !! !! !!!! ",
- " !! !! !!! !! !! !! ! ",
- " ! !!! ! !!!! !! !! !!! ",
- " !!!! ! !! !! !!! ",
- " !!! !!! !! !! ! ! ! ",
- " ! ! !! !! !! !! ! !!! ! ",
- " !!! !! !! !! !! ! ",
- " !!! !! ! !! !! !!!! ",
- " !! !! ! !! !! ",
- " ! !! !! !! !!!!! ",
- " !!!! !! !! !! ! ! ",
- " ! ! !! !! !! !!! ",
- " !! ! !! ! !!! ",
- " !! !! ! ! ",
- " !! !! !! ",
- " !! !! !! ",
- " !! !! !! !!!! ",
- " !! !! !! ! ",
- " !! !! !! !!! ",
- " !! !! !! ",
- " !! !! ! !!!!! ",
- " !! !! !! ! ! ! ",
- " !! !! !! ! ! ! ",
- " !! !! !! !!!! ",
- " ! !! !! ! ! ",
- " !! !! !! !! ",
- " !! !! !! !!! ",
- " !! !! !! !! ",
- " ! !! ! ! ",
- " !! ! !!!!!! !! !!!! ",
- " !! !! ! !! !! !! ! ",
- " !! !! !!! !! !! ",
- " !! !! !! !! ! !! ! ",
- " ! !! ! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! ! !!!! ! ",
- " !! !! !!! !! ",
- " !! !! !!! !! ! !! ",
- " ! !! !! ! ! ! ! !! ",
- " !! !!! !! !!! !! ",
- " !! !!!!!!! !! ",
- " !! !! !! ! !! ",
- " !! !! !! ! ! ! ",
- " ! !! ! !!!! !! ",
- " !! !! !!! !! ",
- " !! !! !! ",
- " !! !! !! ",
- " !! !! !! !!!! !! ",
- " ! !! !!! ! ! ",
- " !! !! ! ! !! ",
- " !! !! ! !! !! ",
- " !! !! !!! !! !! ",
- " !! !! ! !! ! !!!!! ",
- " !! !! ! !! ! !!! ",
- " ! ! !! ! !! !!! !!! ",
- " !! !!!!! !! !!! ! ! ",
- " !! !! !!! !! !!!! !! ",
- " !! !!!! !! !! !! !! ",
- " !! !! !!!! !!!! !! ",
- " ! !!! !! ! !! ",
- " ! ! !! !!!!! !! ",
- " !! !!! !! ! ! ! ",
- " !! ! !! !! !!! !! ",
- " !! ! ! !! !! !! ",
- " !! !!!!! !!!!!! !! !! ",
- " ! ! ! ! !! !! ",
- " !! !!! !! !! !! ",
- " !! !! ! !! ! ",
- " !! !! !! !!! !! !! ",
- " !! ! ! ! ! !! !! ",
- " !! !!!! !!! !! !! ",
- " !! !! ! !! !! ",
- " ! !! ! !! ! ",
- " !! !! !! !! ",
- " !! ! !!!! !! !! ",
- " !! !!!! !! !! !! ",
- " !! ! !!! !! !! ",
- " !! !!! ! ! !! !! ",
- " ! !! !! ! ",
- " !! !!!! !! !! !! ",
- " !! ! !! !! !! ",
- " !! ! ! ! !! !! ",
- " !! !! ! !!!! !! !! ",
- " !! ! !! !! ! ! !! ! ",
- " !! !! !!! !! !! ",
- " ! !!!! ! ! !! ",
- " !! ! !! ! !! !! ",
- " !! !! !! !! !! ",
- " !! !!!! ! ! !! ! ",
- " !! !! ! !! ! !! !! ",
- " ! !! !! ! ! !! !! ",
- " !!! ! !! ! !!!!!! !! !! ",
- " ! ! !! ! !!! !! !! !! ",
- " !!! !! !!! !! ! ",
- " !!!! !! ! ! !! !! ",
- " !! !! !! !! ",
- " !!! ! !! !! ! !! !! ",
- " ! ! ! !! !!! !! ! ",
- " !!! !! ! ! !! !! ",
- " ! ! !! !! ",
- " ! ! !! !! ",
- " ! !! !! ! ",
- " !!!! !! !! !! ",
- " !! !! !! ",
- " !! !! !! ",
- " !! !! ! ",
- " !!!! !! !! !! ",
- " ! ! !! !! ",
- " !! ! !! !! ",
- " !! !! !! ! !!! ! ",
- " !! !! !! !! !! ",
- " !!!!! !! !! !! ",
- " ! !!! !! !! ! !! ",
- " !!! !!! !! !! !! ",
- " !! !! !! !!! ",
- " !!!! ! !! !! ! ",
- " !! !! !! !! !!!!! ",
- " !!!! !! !! !!!!!! !! ! ! ! ",
- " ! !! !! ! ! !! !!!! ! ",
- " !!!! !! !! !! ! !! ! ",
- " !! ! !! !! ! ! !! !!! ",
- " !! !! !! ! !!! !! ! ",
- " ! !! !! !! ! !! ! !!!! ",
- " ! !!! !! !! ! ! ",
- " ! !! ! ! !! !!! ",
- " !! !! !! ! !! !! ",
- " !! !! ! ! !! ",
- " !! !!! !!!! !! ",
- " !! !!!!! ! !! !! ",
- " !! !! !! ! !! ! !! ",
- " !! !! ! ! !! !! ",
- " !! !! !! !! !!! ",
- " ! !! ! !! ! ",
- " !! !! !! !! ! !! ",
- " !! !!! !! !! ! !! ",
- " !! !! !! !! ! !!!!! ",
- " !! !! ! ! !!! !! ! ! ",
- " !! !!! ! !! ! ! !!! !! !! ",
- " !! !!! !!!!!! ! !! !! ",
- " !! !!! ! ! ! !! !! ! !! ",
- " ! !!! !! ! !! !!!! ",
- " ! !!! ! !!! ! ! ",
- " !! !!! !!! !! ",
- " !! !!!!! !!!! ! ",
- " !! !!!!!!!! ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-shield-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-shield-800-800-1.0-grid-reference.json
deleted file mode 100644
index 006209b..0000000
--- a/tests/visual_tests/grids/lines-multi-layout-shield-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,217 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "4",
- "2",
- "1",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! ",
- " !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! !!!!!!!!! ",
- " !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! ",
- " !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! !!!!! ",
- " !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! ",
- " !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! ",
- " !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ",
- " ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ",
- " ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ######### ",
- " ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ",
- " #################################################################################################################################################################################### ",
- " ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ",
- " ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ",
- " #### #### #### #### #### #### #### #### #### #### #### #### ",
- " #### #### #### #### #### #### #### #### #### #### #### #### ",
- " #### #### #### #### #### #### #### #### #### #### #### #### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$ ",
- " $$ $$ $$$ $$ $$ $$$ $$ $$ $$$ $$ $$ $$$ $$ $$ $$$ $$ $$ $$$ $$ $$ $$$ $$ $$ $$$ $$ $$ $$$ $$ $$ $$$ $$ $$ $$$ $$ $$ $$$ ",
- " $$$ $ $$$ $$$ $ $$$ $$$ $ $$$ $$$ $ $$$ $$$ $ $$$ $$$ $ $$$ $$$ $ $$$ $$$ $ $$$ $$$ $ $$$ $$$ $ $$$ $$$ $ $$$ $$$ $ $$$ ",
- " $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ ",
- " $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ ",
- " $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ ",
- " $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% ",
- " %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% ",
- " %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% ",
- " %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% %%%%%% ",
- " %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% ",
- " %% % %% % %% % %% % %% % %% % %% % %% % %% % %% % %% % %% % ",
- " %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% %%%%% ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ''''''''' ''''''' ' ((((((( ( ",
- " '''''' '' ''''''''' (((((((((( ( ((((((((( ",
- " )))) )))) '''''' '' ''''''' ' (((((((( (((( ((( (( (( ((( ",
- " )))) )))) ) ))))))))) '''''' '''''' ((((((((( ((((( ( ((( ",
- " ))))))))) )))))) ))))))))) '''''''''''''''''''''''''''''''''''''' (((((( ((((((( ",
- " )))))))) )))))))))) '''''' '''''' (((((( ((((( ",
- " )))))) ))))))) '''''' '''''' (((((( ((((( ",
- " ))))) )))))) ''''' ''''' ((((( ((((( ",
- " ))))) )))))) '''' '''' (( ( ((((( ",
- " )))) )))))) ((((( (((( ",
- " )))) )))) ( (( ",
- " )))) ))) ) (( ( ",
- " ) ) ( ( ",
- " ) ) ( ( ",
- " )) ) ( ( ",
- " ) ) ( (( ",
- " ) ) ( ( ",
- " ) ) ( ( ",
- " ) )) ((((((((( ((((((((( ",
- " ) ) (((((( (( ((((((((( ",
- " ))))))))) )))))))) (((((( ((((((((( ",
- " ))))))))) ))))))))) (((((( ((((( ",
- " ))))) ))))))))) (((((( ((((( ",
- " ))))) )))))) ((((((( ((((( ",
- " ))))) )))))) ********* ********** ( ((( (( (((((((( ",
- " )))))) )))))) ****** * ******** * (((( (( ((( (((( ",
- " )))) ))) )))))))) ****** ****** (((( (( (((( ",
- " ))) ) ))) ))) )))) ****** ****** (((( ",
- " ))))) )) )) ) ************************************** ",
- " ))))) ****** ****** ",
- " ****** ****** ",
- " **** ** * ",
- " **** **** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-multi-layout-shield-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/lines-multi-layout-shield-800-800-2.0-grid-reference.json
deleted file mode 100644
index b1e7321..0000000
--- a/tests/visual_tests/grids/lines-multi-layout-shield-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,217 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "4",
- "2",
- "1",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ################## ################## ################## ################## ################## ################## ",
- " ################## ################## ################## ################## ################## ################## ",
- " ################## ################## ################## ################## ################## ################## ",
- " ################## ################## ################## ################## ################## ################## ",
- " ################## ################## ################## ################## ################## ################## ",
- " ################## ################## ################## ################## ################## ################## ",
- " ########## ########## ########## ########## ########## ########## ",
- " ########## ########## ########## ########## ########## ########## ",
- " ########## ########## ########## ########## ########## ########## ",
- " #################################################################################################################################################################################### ",
- " #################################################################################################################################################################################### ",
- " ########## ########## ########## ########## ########## ########## ",
- " ########## ########## ########## ########## ########## ########## ",
- " ########## ########## ########## ########## ########## ########## ",
- " ######### ######### ######### ######### ######### ######### ",
- " ######### ######### ######### ######### ######### ######### ",
- " ###### ## ###### ## ###### ## ###### ## ###### ## ###### ## ",
- " ######### ######### ######### ######### ######### ######### ",
- " ######### ######### ######### ######### ######### ######### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ",
- " ",
- " ",
- " ",
- " %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% ",
- " %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% ",
- " %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% ",
- " %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% ",
- " %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% ",
- " %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% ",
- " %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%% ",
- " %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% ",
- " %%%%%%%%%% %%%%%%%%%% %%%%%%%%%% %%%%%%%%%% %%%%%%%%%% %%%%%%%%%% ",
- " %%%%%%%%%% %%%%%%%%%% %%%%%%%%%% %%%%%%%%%% %%%%%%%%%% %%%%%%%%%% ",
- " %%%%%% %% %%%%%% %% %%%%%% %% %%%%%% %% %%%%%% %% %%%%%% %% ",
- " %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% ",
- " %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% %%%%%%%%% ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " ",
- " ",
- " ",
- " ",
- " '''''''''''''''''' ",
- " ''''''''''''''''''' ",
- " ''''''''''''''''''' ",
- " ''''''''''''''''''' ",
- " ''''''''''''''''''' ",
- " ''''''''''''''''''' ",
- " ''''''''''' ((( ",
- " ''''''''''' (((((((( ",
- " ))) ''''''''''' (((((( ((((( ",
- " )))))))) '''''''''''''''''''''''''''''''''''''' (((((((((((((((((( ((((( ",
- " ))))) )))) '''''''''''''''''''''''''''''''''''''' (((((((((((((((((( ((((((((((((((((((( ",
- " ))))))))))))))))))) )))) ''''''''''' (((((((((((((((((( ((((((((((((((((((( ",
- " ))))))))))))))))))) )))))))))))))))))) ''''''''''' (((((((((((((((((( ((((((((((((((((((( ",
- " ))))))))))))))))))) )))))))))))))))))) ''''''''''' (((((((((((((((((( ((((((((((((((((((( ",
- " ))))))))))))))))))) )))))))))))))))))) ''''''''' (((((((((( ((((((((((((((((((( ",
- " ))))))))))))))))))) )))))))))))))))))) '''''''''' (((((((((( (((((((((((((( ",
- " ))))))))))) )))))))))))))))))) ''''''''' (((((((((( ((((((((((( ",
- " ))))))))))) ))) )))))))))))))) ''''''''' (((((((((( ((((((((((( ",
- " ))))))))))) )))))))))) ''''''''' (((((((((( ((((((((((( ",
- " ))))))))))) )))))))))) (((((((((( ((((((((((( ",
- " ))))))))))) )))))))))) (((((((((( ((((((((((( ",
- " ))))))))))) )))))))))) (((((((((( ((((((((((( ",
- " ))))))))))) )))))))))) (((((((((( ((((((((((( ",
- " ))))))))))) )))))))))) ((((((((( ((((((((((( ",
- " ))))))))))) )))))))))) ******************* ((((((((( (((((((((( ",
- " )))))))))) )))))))))) ******************* (((((( (( (((((((((( ",
- " )))))))))) ))))))))) ******************* ((((((((( (((((((( ",
- " ))))) )) ))))))))) ******************* (( (((((((( ((((((((( ",
- " ))))))))) )))))) )) ******************* (((( ((((((((((( ",
- " ))))))))))) ))))))))) *********** (((( ((((( ",
- " )))) )))))))))))) *********** ((((((((( ",
- " )))) )))))) *********** (((( ",
- " ))))))))) *********** ",
- " )))) ************************************** ",
- " *********** ",
- " *********** ",
- " *********** ",
- " *********** ",
- " ********** ",
- " ********** ",
- " ******** ",
- " ********* ",
- " ********* ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-shield-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/lines-shield-200-200-1.0-grid-reference.json
deleted file mode 100644
index d04aaf7..0000000
--- a/tests/visual_tests/grids/lines-shield-200-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
- "keys": [
- "",
- "7",
- "6",
- "5",
- "4",
- "1",
- "2",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! !!! ! !!! ! !!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !! !! !! !! !! !! ",
- " ! ! ! ",
- " ",
- " ",
- " ############################################# ",
- " ",
- " $ $ $ ",
- " $$ $$ $$ $$ $$ $$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$ $ $$$ $ $$$ $ ",
- " ",
- " ",
- " ",
- " %% ",
- " &&& %%%%%%%%%% ' '' ",
- " && & %% '' ' ",
- " & && '''' ' ",
- " & &&&&& '' '' ",
- " &&& &&& ' ' ",
- " & && (( ''' ",
- " & (((((((((( ",
- " (( ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-shield-200-200-2.0-grid-reference.json b/tests/visual_tests/grids/lines-shield-200-200-2.0-grid-reference.json
deleted file mode 100644
index 2c93b66..0000000
--- a/tests/visual_tests/grids/lines-shield-200-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " # # # ",
- " #### #### #### ",
- " ### ### ### ",
- " ############################################# ",
- " ### ### ### ",
- " ### ### ### ",
- " # # # # # # # # # ",
- " # # # ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " % % % % % % % % % ",
- " %%% %%% %%% ",
- " %%% %%% %%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%% %%% %%% ",
- " % %%% % %%% % %%% ",
- " % % % ",
- " ",
- " & ",
- " ''' (((((((((( & && ",
- " ' ' & & ",
- " ' ' ' & ",
- " '' ' '' ) ) && && ",
- " ' ''' ) ) & && & ",
- " ''''' )) &&&&&&&& ",
- " '''''''' )))))))))) && ",
- " ''' ))) & & ",
- " ' ''' ) ) && & ",
- " ' ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-shield-400-400-1.0-grid-reference.json b/tests/visual_tests/grids/lines-shield-400-400-1.0-grid-reference.json
deleted file mode 100644
index 810ade5..0000000
--- a/tests/visual_tests/grids/lines-shield-400-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,117 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "4",
- "2",
- "1",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ! ! ! ! ",
- " ! !! ! !! ! !! ! !! ! !! ! !! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! ",
- " ",
- " ",
- " ",
- " ",
- " # # # # # # ",
- " # ## # ## # ## # ## # ## # ## ",
- " # ## # ## # ## # ## # ## # ## ",
- " ### ### ### ### ### ### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$ $ $$$ $ $$$ $ $$$ $ $$$ $ $$$ $ ",
- " $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ ",
- " $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ ",
- " $$$ $ $ $$$ $ $ $$$ $ $ $$$ $ $ $$$ $ $ $$$ $ $ ",
- " ",
- " ",
- " ",
- " % % % % % % ",
- " %% %% %% %% %% %% %% %% %% %% %% %% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " % %%% % %%% % %%% % %%% % %%% % %%% ",
- " ",
- " & & & & & & ",
- " && && && && && && && && && && && && ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " && &&& && &&& && &&& && &&& && &&& && &&& ",
- " & & & & & & ",
- " ",
- " ",
- " ",
- " '' ' (( (((( ((( ",
- " ))) ))) ''''''''''''''''''' (((( ((( ",
- " ))))) ))) '' ' (( ( ",
- " )) )) ( ((( ",
- " )) ) ( ( ",
- " ( ",
- " ) ) ",
- " ) ) ( ( ",
- " ) (( ",
- " ) ) (( (( ",
- " )) )) (((( (((( ",
- " )))) )))) * (((( (((( ",
- " )) ) ) )) ** ** ( ",
- " ) ) ******************* ",
- " ** * ",
- " * ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-shield-400-400-2.0-grid-reference.json b/tests/visual_tests/grids/lines-shield-400-400-2.0-grid-reference.json
deleted file mode 100644
index b904e17..0000000
--- a/tests/visual_tests/grids/lines-shield-400-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,116 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "5",
- "9",
- "4",
- "2",
- "1",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " # # # # # # ",
- " # ### # ### # ### # ### # ### # ### ",
- " ### ### ### ### ### ### ",
- " ## ## ## ## ## ## ",
- " ## ## ## ## ## ## ",
- " ### ### ### ### ### ### ",
- " # ### # ### # ### # ### # ### # ### ",
- " # # # # # # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $ $ $ $ $ $ $ $ $ $ $ $ ",
- " $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ ",
- " $$ $$ $$ $$ $$ $$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$ $$$ $$$ $$$ $$$ $$$ ",
- " $ $ $ $ $ $ $ $ $ $ $ $ ",
- " ",
- " ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " ",
- " ",
- " & ",
- " & ",
- " &&& ",
- " &&& '''' ",
- " (((( &&&&&&&&&&&&&&&&&&& '' '' ",
- " (( (( &&& ' ' ' ",
- " ( ( (( &&&&& '''' ' ' ",
- " ((((( ((( ( & & & ''' '' ' ",
- " ((( (((( & '' '' ",
- " ( (( '' '''''''' ",
- " ((( (((((((( '''' ''' ",
- " ((( ((( ' ''' ' ' ",
- " ( ((( (( ( ) ' ' ",
- " (( ((( ( ) ) ) '' '' ",
- " ( ( ( ))) '' '' ",
- " (( ((( ))) ' ",
- " ( ))))))))))))))))))) ",
- " ))) ",
- " ))))) ",
- " ) ",
- " ) ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-shield-600-600-1.0-grid-reference.json b/tests/visual_tests/grids/lines-shield-600-600-1.0-grid-reference.json
deleted file mode 100644
index 9103620..0000000
--- a/tests/visual_tests/grids/lines-shield-600-600-1.0-grid-reference.json
+++ /dev/null
@@ -1,167 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " !! ! !! ! !! ! !! ! !! ! !! ! !! ! !! ! !! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " # # # # # # # # # ",
- " ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ",
- " ######################################################################################################################################## ",
- " ## ### ## ### ## ### ## ### ## ### ## ### ## ### ## ### ## ### ",
- " # # # # # # # # # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $ $ $ $ $ $ $ $ $ ",
- " $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$ $$$ $$ $$$ $$ $$$ $$ $$$ $$ $$$ $$ $$$ $$ $$$ $$ $$$ $$ $$$ ",
- " $ $ $ $ $ $ $ $ $ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " % % % % % % % % % ",
- " %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%% % %%% % %%% % %%% % %%% % %%% % %%% % %%% % %%% % ",
- " ",
- " ",
- " ",
- " ",
- " &&& & &&& & &&& & &&& & &&& & &&& & &&& & &&& & &&& & ",
- " & && & && & && & && & && & && & && & && & && ",
- " & && & && & && & && & && & && & && & && & && ",
- " &&& &&& &&& &&& &&& &&& &&& &&& &&& ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ' '' ' ",
- " ( )) )) ))) '' '' ",
- " (( ( (( (( )))))))))))))))))))))))))))) '''' '' ",
- " (((( (((( )) )) )) ''' ' ",
- " ( ((( ((( ) ) ' ' ",
- " ( ( ",
- " ( '' ' ",
- " ((( ( '''' '' ",
- " ( (( ' '' ",
- " (( (((( ' ' ",
- " (( (( ' ",
- " ( ( ' ",
- " ( ' ' ",
- " ( ''' ",
- " ( ( ' '' ",
- " ( ( ( ' '''' ",
- " ((((( ( ' ' ' ",
- " ((( (( ' ' '' ",
- " ( ( ((( ( * * ''' ",
- " ((( ( ** ** * '' ",
- " (((( **************************** ",
- " ( *** ** *** ",
- " * * ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-shield-600-600-2.0-grid-reference.json b/tests/visual_tests/grids/lines-shield-600-600-2.0-grid-reference.json
deleted file mode 100644
index f99f5b7..0000000
--- a/tests/visual_tests/grids/lines-shield-600-600-2.0-grid-reference.json
+++ /dev/null
@@ -1,166 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "4",
- "2",
- "1",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ! ! ! ! ! ! ! ",
- " !! ! !! ! !! ! !! ! !! ! !! ! !! ! !! ! !! ! ",
- " !!! !!! !!! !!! !!! !!! !!! !!! !!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !! !! !! !! !! !! !! !! !! ",
- " !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " # # # # # # # # # # # # # # # # # # ",
- " # # # # # # # # # # # # # # # # # # ",
- " ## ## ## ## ## ## ## ## ## ",
- " ######################################################################################################################################## ",
- " ### ### ### ### ### ### ### ### ### ",
- " # # # # # # # # # # # # # # # # # # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $ $ $ $ $ $ $ $ $ ",
- " $$$ $ $$$ $ $$$ $ $$$ $ $$$ $ $$$ $ $$$ $ $$$ $ $$$ $ ",
- " $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ ",
- " $$ $$ $$ $$ $$ $$ $$ $$ $$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ ",
- " $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ ",
- " $ $ $ $ $ $ $ $ $ ",
- " $ $ $ $ $ $ $ $ $ ",
- " ",
- " ",
- " % % % % % % % % % ",
- " % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
- " %%% %%% %%% %%% %%% %%% %%% %%% %%% ",
- " %%% %%% %%% %%% %%% %%% %%% %%% %%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%% %%% %%% %%% %%% %%% %%% %%% %%% ",
- " % %%% % %%% % %%% % %%% % %%% % %%% % %%% % %%% % %%% ",
- " % % % % % % % % % ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " & & '' ",
- " && ' '' '' ",
- " ( ((((( &&&&&&&&&&&&&&&&&&&&&&&&&&&& '''''' '' ' ",
- " ( ( ((( (( ( && ''' '''' ",
- " ((( (( ((( & & ' '' ",
- " ((( ((( && & ''' '''''''' ",
- " ((((((((( (( ''' '' ",
- " ((( (((((((( ''' ' ' '' ",
- " ((((( ((( ' ' ' ''' ",
- " ( ( ((( ' '' ",
- " ( ( (( ' ' ",
- " ( ( ' ' ",
- " ( ( ' ' ",
- " ( ( ' ' ",
- " ( ( ' ' ",
- " ( ' ' ' ",
- " ( ( ( '' ' '' '' ",
- " (( ( ((( ) ) '' ''' '' ",
- " (( ((( (( )) ) '''''''' ",
- " ((((((( )) '' ",
- " (((((((( )))))))))))))))))))))))))))) ' '' ",
- " ((( ))) ' ''' ",
- " ( (( ) ) ' ",
- " ( ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-shield-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/lines-shield-800-800-1.0-grid-reference.json
deleted file mode 100644
index 1b59466..0000000
--- a/tests/visual_tests/grids/lines-shield-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,217 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "2",
- "1",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " # ### # ### # ### # ### # ### # ### # ### # ### # ### # ### # ### # ### ",
- " # # # # # # # # # # # # # # # # # # # # # # # # ",
- " ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ",
- " # # # # # # # # # # # # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$ $$ $$$ $$ $$$ $$ $$$ $$ $$$ $$ $$$ $$ $$$ $$ $$$ $$ $$$ $$ $$$ $$ $$$ $$ $$$ $$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ $$ ",
- " $ $ $ $ $ $ $ $ $ $ $ $ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " % % % % % % % % % % % % ",
- " %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " % %%% % %%% % %%% % %%% % %%% % %%% % %%% % %%% % %%% % %%% % %%% % %%% ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " & & & & & & & & & & & & ",
- " && && && && && && && && && && && && && && && && && && && && && && && && ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " && && && && && && && && && && && && && && && && && && && && && && && && ",
- " & & & & & & & & & & & & ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ' ",
- " '''' ' '' ",
- " ( ))) ) ))) ) ) ''' ''''' ",
- " ( ( ( (( ) ) ) ) ) ' ' ''' ",
- " (((( (((( )) )) )) )) )) ' ' ' ",
- " (( ((( (((( ) ) ''' ' ",
- " ( (( ' ''' ",
- " (( '' ''''' ",
- " ( (( ' '' ",
- " (( ( ' ' ",
- " ( (( ' ",
- " ( ' ' ",
- " ( ",
- " '' '' ",
- " ( ( '''' '' ",
- " (( ' '''' ",
- " (((( (( ' ''' ",
- " (( (((( '' ",
- " (( ' ' ",
- " ( ' ' ",
- " ( ( ' ' ' ",
- " ( '''' '' ",
- " ((( ( ''' ''''' ",
- " (( ((( '' ' ' ''' ",
- " ((( (((( '''''' ' ",
- " ( ( (( (( * * * '''' ",
- " ((( ( * ** ** ** ** ''' ",
- " (((( ************************************** ",
- " ( *** ** *** * *** ",
- " * * * ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/lines-shield-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/lines-shield-800-800-2.0-grid-reference.json
deleted file mode 100644
index 31bca18..0000000
--- a/tests/visual_tests/grids/lines-shield-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,217 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "7",
- "6",
- "5",
- "9",
- "4",
- "2",
- "1",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! ",
- " !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! ",
- " ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ! !!! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " # # # # # # # # # # # # ",
- " #### #### #### #### #### #### #### #### #### #### #### #### ",
- " ### ### ### ### ### ### ### ### ### ### ### ### ",
- " #################################################################################################################################################################################### ",
- " ### ### ### ### ### ### ### ### ### ### ### ### ",
- " ### ### ### ### ### ### ### ### ### ### ### ### ",
- " # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ",
- " # # # # # # # # # # # # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $ $ $ $ $ $ $ $ $ $ $ $ ",
- " $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ ",
- " $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ ",
- " $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ $$$$ ",
- " $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
- " $ $ $ $ $ $ $ $ $ $ $ $ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " % % % % % % % % % % % % % % % % % % % % % % % % ",
- " % %% % %% % %% % %% % %% % %% % %% % %% % %% % %% % %% % %% ",
- " %% %% %% %% %% %% %% %% %% %% %% %% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%% %%% %%% %%% %%% %%% %%% %%% %%% %%% %%% %%% ",
- " % % % % % % % % % % % % % % % % % % % % % % % % ",
- " ",
- " ",
- " ",
- " ",
- " & & & & & & & & & & & & & & & & & & & & & & & & ",
- " & & & & & & & & & & & & & & & & & & & & & & & & ",
- " && && && && && && && && && && && && ",
- " &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ",
- " &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& ",
- " & & & & & & & & & & & & & & & & & & & & & & & & ",
- " & & & & & & & & & & & & & & & & & & & & & & & & ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ' ( ",
- " ' '' ' ' ( ( (( (( ( ",
- " ) ) ''' ''' ((( (( (( (((( ",
- " ))) ) ))) )) ) '''''''''''''''''''''''''''''''''''''' (((( ((((( ",
- " ))) ))) )) )) ) '' '' (( (((((((( ",
- " ))) ))))) '''' ' ' (( ( ((( ",
- " ))) )))))))) ' ' ' ' '' ( ( (((( ",
- " ))) )) ' ( ( ((( ",
- " ))) ) )))) ( (( ",
- " ) ) ) ))) ( ",
- " ) ) ) ( ",
- " ) ) ( ( ",
- " ) ) ( ",
- " ) ) ( ( ",
- " ) ) ( ( ",
- " ) ) ( ( ",
- " ) ) ( ( ",
- " ) ) ( ( ( ",
- " ) ) ((((( ( ( ",
- " )) ) ((( ((((( ",
- " ))) ) ) (( ((( ",
- " ))) ) ) (((((((( (( ",
- " )) )))) ((((( (((( ",
- " )))))))) )) ( (( (( ((( ((( ",
- " ))))) ))) * ** * * ( (( (( ( ( ( ",
- " ))) ) )) )) )))) ** * * * ( ( ",
- " ) )) ))) ) ) ** ** ",
- " ) ************************************** ",
- " *** ** ",
- " * * * * ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/list-100-100-1.0-grid-reference.json b/tests/visual_tests/grids/list-100-100-1.0-grid-reference.json
deleted file mode 100644
index 382f499..0000000
--- a/tests/visual_tests/grids/list-100-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "5",
- "7",
- "9",
- "1",
- "3",
- "4",
- "6",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "! !! !!!! # $ $ % ",
- "!!!! !! ## $$ %% ",
- " ",
- " & ! ' ( # ) $ * % +",
- " ",
- " ",
- "& & && & )) ** ++",
- " && && )) ** ++",
- "& &&& && ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/list-100-100-2.0-grid-reference.json b/tests/visual_tests/grids/list-100-100-2.0-grid-reference.json
deleted file mode 100644
index 7487207..0000000
--- a/tests/visual_tests/grids/list-100-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "8",
- "1",
- "3",
- "4",
- "5",
- "6",
- "7",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ### ## ",
- "! !! !!! !! !! # # # ",
- "! ! !!! ## # ",
- "!!!! ! ! ! !! ###### ",
- " ",
- " ",
- " ",
- " $ ! % & ' ( ) # * +",
- " ",
- " ",
- " ",
- " ",
- " * * ",
- "$ $$$ $$$ $$$ * * ",
- " $ $ $ $ $ $ ** ",
- " $ $ $ $ $$$$ ** ",
- " $ $ $ $ $ ",
- "$ $$$ $ $ $$$ ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/list-150-100-1.0-grid-reference.json b/tests/visual_tests/grids/list-150-100-1.0-grid-reference.json
deleted file mode 100644
index b79ab5f..0000000
--- a/tests/visual_tests/grids/list-150-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "4",
- "5",
- "7",
- "8",
- "9",
- "1",
- "3",
- "6",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! !! !!!! # $ % & '' ",
- " !! ! ! ! ## $$ %%% & ' ",
- " ",
- " ( ! ) # $ * % & ' + ",
- " ",
- " ",
- "(( ( ( ( * ++",
- " ( ((( *** * * * * ++ ",
- " ( (( ((( ****** ***** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/list-150-100-2.0-grid-reference.json b/tests/visual_tests/grids/list-150-100-2.0-grid-reference.json
deleted file mode 100644
index 2f15b49..0000000
--- a/tests/visual_tests/grids/list-150-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "6",
- "8",
- "1",
- "3",
- "4",
- "5",
- "7",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ### ## $$ $$ ",
- "!!! !! !!! !! !! # ## $ $$ ",
- "!!! ! !!!! ! ## # $ $ ",
- "!!! !! ! ! ! !! ### ## $$ $$ ",
- " ",
- " ",
- " ",
- " % ! & ' ( # ) $ * + ",
- " ",
- " ",
- " ",
- " ",
- " ) ** ",
- "% %%% %%%% %%% ) * * ",
- " % % %% % % % ) * ",
- " % %% % %%%%% ) ** ",
- " %% % % % %% ",
- "% %%% % % %%% ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/list-250-100-1.0-grid-reference.json b/tests/visual_tests/grids/list-250-100-1.0-grid-reference.json
deleted file mode 100644
index 52abcd3..0000000
--- a/tests/visual_tests/grids/list-250-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "4",
- "6",
- "7",
- "9",
- "1",
- "3",
- "5",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! !!!! ! ## ## ### # $$$ $$ % && && &&& & ",
- " ! !! ! !!! ## # ## $$ $ $$%%% &&&& && ",
- " ",
- " ' ! ( # ) $ % * & + ",
- " ",
- " ",
- "' ' ' '' ' ( ) * * * ",
- "' ' '' ''' (( ))) ) )))))) ***** * **** ** +++ ",
- "' ' ''' '' ))) ) ) ) ) )) * ***** *** *** * ",
- " * ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/list-250-100-2.0-grid-reference.json b/tests/visual_tests/grids/list-250-100-2.0-grid-reference.json
deleted file mode 100644
index e7f7575..0000000
--- a/tests/visual_tests/grids/list-250-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "5",
- "7",
- "9",
- "1",
- "3",
- "4",
- "6",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!! ! ## ## $$$$$$ %% %% ",
- " !! !!!! !!!! !!!! # ## $ $ % ",
- " !!!!! ! !!!!! ! # $ $ % %% ",
- " !!!!! ! !! !! !!! ## ## $$$ $ %% %% ",
- " ",
- " ",
- " ",
- " & ! ' ( # ) $ * % + ",
- " ",
- " ",
- " ",
- " ",
- "& ( )) ** ++ + +",
- "&&& &&& &&& &&& (( ))) ** + + +",
- "& & & & & & & ((( ) ) * * + + +",
- "& & & & &&&&&& ( )) ** ++ ++ ",
- "& & && & & & ",
- " && &&& & & &&&& ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/list-300-100-1.0-grid-reference.json b/tests/visual_tests/grids/list-300-100-1.0-grid-reference.json
deleted file mode 100644
index 4ccb771..0000000
--- a/tests/visual_tests/grids/list-300-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "3",
- "5",
- "6",
- "8",
- "10",
- "1",
- "4",
- "7",
- "9"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!! !! ! # $$ $$ $$$$ % &&&&& & && & '''''' '",
- " ! !!!!! ## $$$$$ % & && && &&& ' '' ' ",
- " ",
- " ( ! # ) $ % * & + ' ",
- " ",
- " ",
- " ((( ( ( ( ) ) * * **** ** ** ***** ++ ",
- "((( ( ((( ))))) ) )) ***** * * ** *** ++ ",
- "(((( (( ((( ))))) ) ) )))) * ****** **** * *** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/list-300-100-2.0-grid-reference.json b/tests/visual_tests/grids/list-300-100-2.0-grid-reference.json
deleted file mode 100644
index c0047b1..0000000
--- a/tests/visual_tests/grids/list-300-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "4",
- "5",
- "7",
- "8",
- "9",
- "1",
- "3",
- "6",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!! ! ## # $$$ $$ %%%%%% && && ''' '' ",
- " !! !!!! !!!! !!!! # ## $ $ % % & & ' ' ' ",
- " !! !! ! !!! ! ! # ### $ $ % % & & & ' '' ",
- " !! !! ! !!! ! !!! ## # $$$$$$ %%% % && && ''' '' ",
- " ",
- " ",
- " ",
- " ( ! ) # $ * % & ' + ",
- " ",
- " ",
- " ",
- " ",
- " ( ***** * * + ++ ",
- "((( ((( (((( ((( * ** *** *** *** * * * + +",
- " ( ( ( ( ( ( ( * * * * * * * ** + +",
- " ( ( ( ( ( (((( * **** *** * ** * ** ++ ++ ",
- " ( ( ( ( ( ( * * * * * * ** ",
- " (( ((( ( ( ((( * **** *** *** *** * * * ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/list-400-100-1.0-grid-reference.json b/tests/visual_tests/grids/list-400-100-1.0-grid-reference.json
deleted file mode 100644
index 2edaf85..0000000
--- a/tests/visual_tests/grids/list-400-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "4",
- "6",
- "8",
- "10",
- "1",
- "3",
- "5",
- "7",
- "9"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ! ! # ## ##### $$ $$ $ $ %%% % %%% &&& && &",
- " ! ! !!!! #### ### $$$$ $ $ % % %%%% &&& ",
- " ",
- " ' ! ( # ) $ * % + & ",
- " ",
- " ",
- "' ''' ' '' ' ( ( (( ) * *** ** * * * * + + ",
- "''' ' '''''' ((((( ( (( ((((((( ))))) )))))) ***** **** **** * +++++ + +++ +++ ",
- "''' ' ' '' ' ( ((((( (( (( (((( ))))) ) ))))) ****** **** * ** * +++++++ ++ +++ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/list-400-100-2.0-grid-reference.json b/tests/visual_tests/grids/list-400-100-2.0-grid-reference.json
deleted file mode 100644
index c61c1df..0000000
--- a/tests/visual_tests/grids/list-400-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "4",
- "6",
- "8",
- "10",
- "1",
- "3",
- "5",
- "7",
- "9"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ! ! ## # $$$ $ %% %% &&&& & ",
- " ! !! !!!! ! ! !! # ## $ $$ $$$$ $$ $$ % %% && &&&& &&&",
- " !!!! !!! ! ! ! #### $ $$ $$$ $$ $ % % &&&&& & &",
- " ! !! !!!! ! ! ! !! ### # $ $$ $$$$ $$ $$ %%% %% &&&&& & &&&",
- " ",
- " ",
- " ",
- " ' ! ( # ) $ * % + & ",
- " ",
- " ",
- " ",
- " ",
- " ' ((( ))))) ) )) ) *++++++ + + ",
- "'''' ''' ''' ''' ( ) )) ))) ))) )))))) ) ))) * + ++ ++++++ + ++ + +++ ",
- " ' ' '' ' ' '' ' ( ) ) ) ) ) ) ) ) ) )) ) * + + +++ + ++ + + + + +",
- "' ' ' ' ' ''''' (( ) )))) ))) ) ) ) ) ) ))))) ++++++ ++ + + + + + + +",
- "' ' ' '' ' ' ) ) ) ) ) ) ) ) ) + + + + + + + + + +",
- "' '' ''' ' ''' ) )))) ))) ))) ) ) ) ))) + ++++++++ ++ + + + + + +",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/list-600-100-1.0-grid-reference.json b/tests/visual_tests/grids/list-600-100-1.0-grid-reference.json
deleted file mode 100644
index faf2a84..0000000
--- a/tests/visual_tests/grids/list-600-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "4",
- "6",
- "8",
- "10",
- "1",
- "3",
- "5",
- "7",
- "9"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! !!!!! ! #### ## # $$$ $$$ %% %% %%%%%% && && &&&& ",
- " ! !! ! # ### # $ $ $$ %%%% % %%% &&&&& && ",
- " % ",
- " ' ! ( # ) $ * % + & ",
- " ",
- " ",
- "' ' ''' '''' '' ( ( ( ) ) * * * * * * * * ** + ",
- "''''' ' '' '' ((((( ( (( ((((( ))) ) )) )) *** * * * **** *** ++++ + ++++++ ",
- "' ''''' ''' '' ((((( ( (((( (( (( )))))) )) ) )) *** *** * ** * *** +++++ + + +++ ++ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/list-600-100-2.0-grid-reference.json b/tests/visual_tests/grids/list-600-100-2.0-grid-reference.json
deleted file mode 100644
index b3fe114..0000000
--- a/tests/visual_tests/grids/list-600-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "3",
- "5",
- "6",
- "8",
- "10",
- "1",
- "4",
- "7",
- "9"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!! ! ! ## ### $$$$ $$$ %% %% &&& & & & ''' ' ' ",
- " !!!!!! ! !!! !!!!! # # $$$$$$$ $$$$ $ $$ % %% &&&&&& && && &&&&&&&& ' '' '''' '' '' ",
- " !!!!!! ! ! !!!!! ! # # $$$$$ $ $ $$$$ %% % &&&&&& & &&& & && && '''' ''' ' '' ",
- " !!!!!! ! !! !! !!! ###### $$$$$ $ $ $ $ $$ %%%%%% &&&&&& && && &&&& &&& ' ''''''' ' '' ",
- " && ",
- " ",
- " ",
- " ( ! # ) $ % * & + ' ",
- " ",
- " ",
- " ",
- " ",
- " ))))) ) )) ***** * ++ ",
- "((( ((( (( (((( ((( ) )) )))))) ))) )) ) ) ) ) * *** *** *** *** *** * * *** **** + + ",
- "( ( ( ( ( ( ( ) ) )) ) ) )) ) ) ) )) * * * * * * * * * * * * ** * + ",
- " (( ( ( ( ( (((( ) )))) )) ) ) ) ) ) ) ) * **** *** * *** **** * * ****** * ++ ",
- " ( ( ( ( ( ( ( ) ) ) ) ) ) ) ) ) ) * * * * * * ** ** * * ",
- "((( (( (( ( ( ((( ) )))))))) )) ) ))) ))) ) * *** *** *** **** *** * *** * * ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/list-800-100-1.0-grid-reference.json b/tests/visual_tests/grids/list-800-100-1.0-grid-reference.json
deleted file mode 100644
index e25bf53..0000000
--- a/tests/visual_tests/grids/list-800-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ! !!! ",
- " ! ! !!!! ",
- " ",
- " # $ % & ' ( ) ! * + ",
- " ",
- " ",
- " # # ### # ## # $ $ $$$ $$$$$ $ % % %% & & ' ( ) ))) )) ) ) ) ) * * + + +++ + + ++ ",
- " ##### # ###### $$$ $ $$$$ %%%%% % %% %%%%%%% &&& & && &&& ''''' '''''' ((((( ( ( ))))) )))) )))) ) ***** * *** *** +++++ + ++++++ ",
- " ##### # # ## # $$$$$ $ $$ $$$ % %%%%% %% %% %%%% &&&&&& & &&&& ''''' ' ''''' ((((( ( (( ( )))))) )))) ) )) ) ******* ** *** + +++++ + ++++ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/list-800-100-2.0-grid-reference.json b/tests/visual_tests/grids/list-800-100-2.0-grid-reference.json
deleted file mode 100644
index 81dffb1..0000000
--- a/tests/visual_tests/grids/list-800-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "4",
- "6",
- "8",
- "10",
- "1",
- "3",
- "5",
- "7",
- "9"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ! ! #### # # $$$ $ %%% % % &&&& & ",
- " ! !! !!!! ! ! !! ###### # ###### ### $ $$ $$$$ $$ $$ % %% %%%% %% % %% %% % && &&&& &&&&&&&&",
- " !!!! !!! ! ! ! ###### # # # ## ## $ $$ $$$ $$ $ % %% %% %%%%% % % &&&&& & &&&& &",
- " ! !! !!!! ! ! ! !! ###### # # ####### $ $$ $$$$ $$ $$ % %% %% % %%%% %% % &&&&& & &&&&&& &",
- " %% ",
- " ",
- " ",
- " ' ! ( # ) $ * % + & ",
- " ",
- " ",
- " ",
- " ",
- " ' (((((( ( ( ( ))))) ) )) ) ***** * ++++++ + + ",
- "' '''''' ''' ''' ''' ( (( (((((( ((( ((( ((( (( (( ) )) ))) ))) )))))) ) ))) * *** *** *** *** *** * * ** *** + ++ ++++++ + ++ + +++ ++ ",
- " ' ' ' ' '' ' ' '' ' ( ( (( ( ( ( (( ( ( ( ( ( ) ) ) ) ) ) ) ) ) )) ) * * * * * * * * * * * * * * + + +++ + ++ + + + + + + ",
- "'' ''' ' ' ' ' ''''' ( (((( (( ( ( ( ( ( (((( (((( ) )))) ))) ) ) ) ) ) ))))) * **** ** * *** **** *** **** * * ++++++ ++ + + + + + + ++++ ",
- " ' ' ' '' ' ' ( ( ( ( ( ( ( ( ( ( ) ) ) ) ) ) ) ) ) * * * * ** ** * * * + + + + + + + + + + ",
- "'' ''' '' ''' ' ''' ( (((((((( (( (( ( ( ( (((( (((( ) )))) ))) ))) ) ) ) ))) * *** *** ** *** *** ** *** * * + ++++++++ ++ + + + + + ++++ ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/map-background-image-compositing-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/map-background-image-compositing-512-512-1.0-grid-reference.json
deleted file mode 100644
index fb6e635..0000000
--- a/tests/visual_tests/grids/map-background-image-compositing-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/map-background-image-compositing-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/map-background-image-compositing-512-512-2.0-grid-reference.json
deleted file mode 100644
index 2228ead..0000000
--- a/tests/visual_tests/grids/map-background-image-compositing-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-collide-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/marker-collide-512-512-1.0-grid-reference.json
deleted file mode 100644
index f592264..0000000
--- a/tests/visual_tests/grids/marker-collide-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " !!!!! ",
- " !!!!! ",
- " !!!! ",
- " !!! ",
- " !!! ",
- " !!!! ",
- " !!!!! ",
- " !!!!!! ",
- " !!!!!! ",
- " !!!! ",
- " ! ! !! ",
- " !!!! ",
- " !!!!! ",
- " !!!!! ",
- " !!!!! ",
- " !!!! ",
- " !!! ",
- " ! ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " !!! ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " !! ",
- " !!! ",
- " !!! ",
- " !!! ",
- " !!! ",
- " !!! ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " !! ",
- " !!!! ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!!! ",
- " !!!! ",
- " !!!! ",
- " ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " !!! ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " !!! ",
- " ! ",
- " !! ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " ! ! ",
- " ! ",
- " !!! ",
- " !!!! ",
- " !!!!! ",
- " !!!!!! ",
- " !!!!! ",
- " !!!! ",
- " ! !!! ",
- " !!!!! ",
- " !!!!!!!! ",
- " !!!!!! ",
- " !!!!! !! ",
- " !! !!!! ",
- " !!!!!! ",
- " !!!!!!!! ",
- " !!!!!! !! ",
- " !!! !!!! ",
- " !!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!! ",
- " !!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-collide-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/marker-collide-512-512-2.0-grid-reference.json
deleted file mode 100644
index 6e5c5cf..0000000
--- a/tests/visual_tests/grids/marker-collide-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! !!!! ",
- " !!!!! ",
- " !!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!!! ",
- " !!!! ! ",
- " !!!! !! !!!! ",
- " !!!!! ",
- " !!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!! ",
- " !!! !! ",
- " !!!!!!!! ",
- " !!!!!!! ",
- " ! ",
- " ! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!!!!! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!!!!! ",
- " !!!!!! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!! ",
- " !!!!!! ",
- " !!! ! ",
- " ! ",
- " ! ",
- " !!!!! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!! !!! ",
- " ! ",
- " ! !! ",
- " ! !!!! ",
- " !!!!! ",
- " !!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!! !!! ",
- " !!!!!! !! !!!! ",
- " !!!! ! !!!! ",
- " !!! !!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!! ",
- " !!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-interior-position-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/marker-interior-position-600-400-1.0-grid-reference.json
deleted file mode 100644
index 1c614a3..0000000
--- a/tests/visual_tests/grids/marker-interior-position-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-interior-position-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/marker-interior-position-600-400-2.0-grid-reference.json
deleted file mode 100644
index 10926da..0000000
--- a/tests/visual_tests/grids/marker-interior-position-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-multi-policy-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/marker-multi-policy-600-400-1.0-grid-reference.json
deleted file mode 100644
index 5523119..0000000
--- a/tests/visual_tests/grids/marker-multi-policy-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,110 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " # ! ",
- " # # # ! ",
- " # # # # ! ",
- " # # # # ! ",
- " # # # # ! ",
- " # # # # ! ",
- " # ## # ! ",
- " # ## # ! ",
- " # ## # ! !!!!! ",
- " # ## # ! !!!!!! ",
- " # ## ## ! !!!!!!!! ",
- " # ### # ! !!!!!!!! ",
- " # ## # ! !!!!!!!! ! ",
- " # # # ! !!!!!!! ! ",
- " # # # ! !!!!!! ! ",
- " # # # ! ! ",
- " # # # ! ! ",
- " # # # # ! ! ",
- " # # # # ! ! ",
- " # # # # ! ! ",
- " # # # # ! ! ",
- " # # # ! ! ",
- " # ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! !! ",
- " ! !!! ! ! ",
- " ! !!!!! ! ! ",
- " ! !!!!! ! ! ",
- " ! !!!!! ! ! ",
- " ! !!!! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! !!! ! !!! ! ",
- " ! !!!!!! ! !!!!!! ! ",
- " ! !!!!!!! ! !!!!!!!! ! ",
- " ! !!!!!!! ! !!!!!!!! ! ",
- " ! !!!!!!!! ! !!!!!!!! ! ",
- " ! !!!!!!! ! !!!!!!!! ! ",
- " ! !!!!!!! ! !!!!!! ! ",
- " ! !!!!! ! !!!! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-multi-policy-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/marker-multi-policy-600-400-2.0-grid-reference.json
deleted file mode 100644
index 0131d6c..0000000
--- a/tests/visual_tests/grids/marker-multi-policy-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,110 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " !! ",
- " ! !! ",
- " ! !! ",
- " ! !! ",
- " ! !! ",
- " ! !! ",
- " ! !! ",
- " ! !! ",
- " ! !! ",
- " ! !! ",
- " ! !! ",
- " # ! !! ",
- " # # # ! !! ",
- " # # ### ! !! ",
- " # # ## # ! !! ",
- " # # ## # ! !!!!!! !! ",
- " # # ## # ! !!!!!!!!!! !! ",
- " # ## # ! !!!!!!!!!!!! !! ",
- " # ## # ! !!!!!!!!!!!!!! !! ",
- " # ## # ! !!!!!!!!!!!!!! !! ",
- " # #### ## # ! !!!!!!!!!!!!!!! !! ",
- " # ##### ## ! !!!!!!!!!!!!!!!! !! ",
- " # ##### # ! !!!!!!!!!!!!!!!! !! ",
- " # ##### ## ! !!!!!!!!!!!!!!!! ! ",
- " # #### #### ! !!!!!!!!!!!!!!! ! ",
- " # ### # ! !!!!!!!!!!!!!! ! ",
- " # ### # ! !!!!!!!!!!!!!! ! ",
- " # ### # ! !!!!!!!!!!!! ! ",
- " # ### ## ! !!!!!!!!!! ! ",
- " # ## # ## ! !!!!!!! ! ",
- " # ## # ## ! ! ",
- " # ## # ## ! ! ",
- " # ## ## ! ! ",
- " ## ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! !!!!!!! ",
- " !!! !!!!!!!!! !! ",
- " ! !! !!!!!!!!! ! ! ",
- " ! !! !!!!!!!!!!! ! ! ",
- " ! !! !!!!!!!!!!! ! ! ",
- " ! !! !!!!!!!!!!! ! ! ",
- " ! !! !!!!!!!!!! ! ! ",
- " ! !! !!!!!!!!! ! ! ",
- " ! !! !!!!!!! ! ! ",
- " ! !! !!!! ! ! ",
- " ! !! ! ! ",
- " ! !! ! ! ",
- " ! !! ! ! ",
- " ! !! ! ! ",
- " ! !! ! ! ",
- " ! ! !! ! !! ! ",
- " ! !!!!!!!! !! ! !!!!!!!! ! ",
- " ! !!!!!!!!!!! !! ! !!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!! !! ! !!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!! !! ! !!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!!! !! ! !!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!!! !! ! !!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!!! !! ! !!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!!! ! !! !!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!!! ! !! !!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!!! ! !! !!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!! ! !! !!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!! ! !! !!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!! ! !! !!!!!!!!!!!! ! ",
- " ! !!!!!!!!! ! !! !!!!!!!!! ! ",
- " ! !!!!! ! !! !!!!! ! ",
- " ! ! !! ! ",
- " ! ! !! ! ",
- " ! ! !! ! ",
- " ! ! !! ! ",
- " ! ! !! ! ",
- " ! ! !! ! ",
- " ! ! !! ! ",
- " ! ! !! ! ",
- " ! ! !! ! ",
- " ! ! !! ! ",
- " ! ! !! ! ",
- " ! ! !! ! ",
- " ! ! !! ! ",
- " ! ! !!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-hex-grid-257-256-1.0-grid-reference.json b/tests/visual_tests/grids/marker-on-hex-grid-257-256-1.0-grid-reference.json
deleted file mode 100644
index 3754d9a..0000000
--- a/tests/visual_tests/grids/marker-on-hex-grid-257-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!! !!!! !!!! !!!! !!!! !!!! ",
- " ! ! ! ! ! ! ! ",
- " ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ",
- " ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ",
- " ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ",
- " ",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ",
- " ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! !!!! !!!! !!!! !!!! !!!! !!!! ",
- " ! ! ! ",
- " ! ! ! ! ! ! ",
- " !!!! !!!! !!!! !!!! !!!! !!!! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! !!!! !!!! !!!! !!!! !!!! !!!! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ",
- " !!!! !!!! !!!! !!!! !!!! !!!! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ",
- " ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ",
- " ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ",
- " ",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ",
- " ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " !!!! !!!! !!!! !!!! !!!! !!!! ! ",
- " ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! !!!! !!!! !!!! !!!! !!!! !!!! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " !!!! !!!! !!!! !!!! !!!! !!!! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-hex-grid-257-256-2.0-grid-reference.json b/tests/visual_tests/grids/marker-on-hex-grid-257-256-2.0-grid-reference.json
deleted file mode 100644
index a3c42b2..0000000
--- a/tests/visual_tests/grids/marker-on-hex-grid-257-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!! !!!! !!!! !!!! !!!! !!!! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ",
- " ",
- " ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ",
- " ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ",
- " ",
- " ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ",
- " ! ",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! !!!! !!!! !!!! !!!! !!!! !!!! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " !!!! !!!! !!!! !!!! !!!! !!!! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! !!!! !!!! !!!! !!!! !!!! !!!! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ",
- " !!!! !!!! !!!! !!!! !!!! !!!! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ",
- " ",
- " ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ",
- " ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ",
- " ",
- " ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ",
- " ! ",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " !!!! !!!! !!!! !!!! !!!! !!!! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! !!!! !!!! !!!! !!!! !!!! !!!! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " !!!! !!!! !!!! !!!! !!!! !!!! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-hex-grid-400-600-1.0-grid-reference.json b/tests/visual_tests/grids/marker-on-hex-grid-400-600-1.0-grid-reference.json
deleted file mode 100644
index bb8f370..0000000
--- a/tests/visual_tests/grids/marker-on-hex-grid-400-600-1.0-grid-reference.json
+++ /dev/null
@@ -1,159 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ! ! ",
- " !! ! !! ! ! !! ! !! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- "! ! ! ! ! ! ! ! ! ",
- "! !!!! !!!! ! !!! ! !!!! !!!! !!!! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! !! ! ! ! !! ! !! ! ",
- " ! ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " !! ! !! ! ! ! !! !! ! !",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- "! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! !! ! ! ",
- " ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ! ! ! ",
- " !!!! !!!! ! !!!! ! !!! !!!! !!!! ",
- " ! ! ! ! ! ! !! ! !",
- " !! ! ! ! ! !! ! !! ",
- " ! ! ! ! ! ! ! ! ! ",
- "! ! ! ! ! ! ! ! ! ! ",
- "! ! ! ! ! ! ! ! ! ! ",
- " !! ! !! ! ! ! !! ! !! ! ",
- " ! ! ! !! ! !! ! ",
- " ! ! ! ! ! ! ! ! ! !",
- " !!!! !!!! ! !!!! ! !!! !!!! !!!! ",
- " ! ! ! ! ! ! ! ",
- " !! ! ! ! ! !! ! !! ! !",
- " ! ! ! ! ! ! ! ",
- "! ! ! ! ! ! ! ! ! ! ",
- "! !!!! ! !!!! ! !!!! !!!! !!!! !!!! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! !! ! ! ",
- " ! ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " !! ! !! ! ! ! !! !! ! !",
- " !! ! ! ! ! !! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- "! !!!! ! !!!! ! !!! ! !!!! !!!! !!!! ",
- " ! ! ! ! ! ! ! ! ",
- " ! !! ! ! ! ! ! !! ! !! ! ",
- " ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ! ! !",
- " !! ! ! ! ! ! !! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ",
- "! ! ! ! ! ! ! ! ! ! ",
- "! ! ! ! ! ! ! ! ! ! ! ! ",
- " !! ! !! ! ! ! !! ! !! ! ",
- " !! ! ! !! ! !! ! ",
- " ! ! ! ! ! ! ! ! !",
- " !!!! !!!! ! !!!! ! !!! !!!! !!!! ",
- " ! ! ! ! ! ! ! ! ! ",
- " !! ! !! ! ! ! !! ! !! ! !",
- " ! ! ! ! ! ! ! ",
- "! ! ! ! ! ! ! ! ! ! ",
- "! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ",
- " ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " !! ! !! ! ! ! ! !! !! ! !",
- " !! ! ! ! ! !! !! ",
- " ! ! ! ! ! ! ! ! ! ! ",
- "! !!!! !!!! ! !!! ! !!!! !!!! !!!! ",
- " ! ! ! ! ! ! ! ",
- " ! !! ! !! ! ! !! ! !! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ! ",
- " !! ! ! ! ! ! !! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- "! ! ! ! ! ! ! ! ! ! ! ",
- " !! ! ! ! ! ! !! ! ! ",
- " !! ! ! !! ! !! !! ",
- " ! ! ! ! ! ! ! ! ! !",
- " ! ! !! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " !! ! !! ! ! ! !! ! !! ! !",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- "! !!!!!! !!!!!! !!!!!! !!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ",
- " ! ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ! ! !! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! !",
- " ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-hex-grid-400-600-2.0-grid-reference.json b/tests/visual_tests/grids/marker-on-hex-grid-400-600-2.0-grid-reference.json
deleted file mode 100644
index 67f9164..0000000
--- a/tests/visual_tests/grids/marker-on-hex-grid-400-600-2.0-grid-reference.json
+++ /dev/null
@@ -1,159 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ",
- "! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- "! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !",
- " ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- "! ! ! ! ! ! ",
- "! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! !",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- "! !!!!!! !!!!!! !!!!!! !!!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !",
- " ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- "! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! !",
- " ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- "! ! ! ! ! ! ",
- "! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- "! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- "! ! ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- "! ! ! ! ! ! ",
- "! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- "! !!!!!! !!!!!! !!!!!! !!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! !",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-hex-grid-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/marker-on-hex-grid-600-400-1.0-grid-reference.json
deleted file mode 100644
index 70e9164..0000000
--- a/tests/visual_tests/grids/marker-on-hex-grid-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " ! !! !! ! !! ! ! !! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! !! !! ! ! ! ! !! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! !! !! ! ! ! ! !! ",
- " ! ! ! !! !! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! !! ! ! ! ",
- " ! ! ! ! !! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! !! ! ! ! ! ! ! ",
- " ! ! ! !! !! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " !! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! !! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " !!!! !!!! ! !!! ! !!!! !!!! !!!! ",
- " ! ! !! ! ! ! ! ! ! ",
- " ! ! ! ! !! !! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! !!!! !!!! !!!! ! !!!! ! !!!! !!!! ",
- " ! ! ! !! !! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! !! !! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! !! !! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! !! !! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! !! !! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! !! !! ! ! ! ! ",
- " ! ! ! ! !! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! !! ! !! ! ! ! ! ! ! ",
- " ! ! ! !! !! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! !! ! ! ! ",
- " ! ! ! ! !! !! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! !!!! !!!! !!!! ! !!! ! !!!! !!!! ",
- " ! ! ! ! ! !! ! ! ! ! ! ! ",
- " ! ! ! ! ! !! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " !!!! !!!! ! !!! ! !!!! !!!! !!!! ",
- " ! ! !! !! !! ! ! !! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " !! ! ! ! ! ! ! !! ! ! ",
- " ! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-hex-grid-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/marker-on-hex-grid-600-400-2.0-grid-reference.json
deleted file mode 100644
index 0f4089f..0000000
--- a/tests/visual_tests/grids/marker-on-hex-grid-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-line-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-600-400-1.0-grid-reference.json
deleted file mode 100644
index 49e2771..0000000
--- a/tests/visual_tests/grids/marker-on-line-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ! ",
- " !! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! !!! ",
- " ! !!! ",
- " ! !! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " ! ! ! ",
- " ! ! ",
- " ! ! ! ",
- " ! ! ",
- " ! ! ! ",
- " ! ! ",
- " ! ! ! ",
- " ! ! ",
- " ! ! ! ",
- " ! ! ",
- " ! ! ! ",
- " ! ! ",
- " ! ! ! ",
- " ! ! ",
- " ! ! ! ",
- " ! ! ",
- " ! ! ! ",
- " ! ! ",
- " ! ! ! ",
- " ! ! ",
- " ! ! ! ",
- " ! ! ",
- " ! ! ! ",
- " ! ! ",
- " ! !! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-line-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-600-400-2.0-grid-reference.json
deleted file mode 100644
index 3b8ff42..0000000
--- a/tests/visual_tests/grids/marker-on-line-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ! ",
- " !! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! !! ",
- " ! !!!! ",
- " ! !!!!! ",
- " ! !!!!! ",
- " ! !!!!! ",
- " ! !!! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! !! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-line-and-avoid-edges-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-and-avoid-edges-512-512-1.0-grid-reference.json
deleted file mode 100644
index 6edc4b7..0000000
--- a/tests/visual_tests/grids/marker-on-line-and-avoid-edges-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!! ",
- " !!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! !",
- " ! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! ",
- "! !!!!!!!!! ! !!!!!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!! ",
- " !!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-line-and-avoid-edges-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-and-avoid-edges-512-512-2.0-grid-reference.json
deleted file mode 100644
index 4bf2218..0000000
--- a/tests/visual_tests/grids/marker-on-line-and-avoid-edges-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!! ",
- " !!!! ! !!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " ! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- "! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- "! !!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-line-and-line-placement-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-and-line-placement-600-400-1.0-grid-reference.json
deleted file mode 100644
index 6d60c09..0000000
--- a/tests/visual_tests/grids/marker-on-line-and-line-placement-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!!!! ",
- " ! !! !!!! !! ",
- " ! ! !!! ! ! ",
- " ! ! !! ! !!! ",
- " ! ! !!! ! !! ",
- " ! ! ! ! ! ",
- " ! ! ! ! !! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! ! !!! ! !! ",
- " !! ! !!! !! ",
- " ! !! ! ! ! ",
- " ! ! ! !! ",
- " ! ! ! ! ! !!! ",
- " ! ! ! ! !!! ",
- " ! ! ! ! ! ! !! ! ",
- " ! ! ! ! !!! ",
- " !! ! ! ! ! ! !!! ",
- " !! ! ! ! !! ! ",
- " ! !! ! ! !!! ! ",
- " ! !!!!! ! !! ! ",
- " !! !! ! ! ! ",
- " ! ! ! !! !! ! ",
- " ! ! !!! ! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! !! ! ! ",
- " ! ! ! ! !!! ! ! ! ",
- " ! ! ! !! ! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! !!! ",
- " ! ! ! ! !!!! ",
- " ! ! !!! ! ",
- " !! ! ! ! !!!! ",
- " !!! ! ! !!!!! ",
- " !! !!! ! ! !! ",
- " ! !!!!!! ! !!! ",
- " !!!!! !! !!!! ! ",
- " ! ! ! !!! ! ! ",
- " ! ! ! !! !!!! ",
- " ! ! ! !!!!! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! !! ! ",
- " ! ! ! ",
- " ! ! ! !! ",
- " ! ! !! ! ",
- " ! ! ! !!!! ",
- " ! ! ! ! ",
- " !! ! ! ! ",
- " ! ! ! !! ",
- " ! ! ! ! ",
- " !! ! !! ",
- " ! ! !!!! ",
- " ! !! ! !!! ",
- " !! !! ! !!!! ",
- " !! !!! ! !!!! ",
- " !! !!! !! !!! ",
- " ! !!! !!! !! ",
- " !!! !!! !!!! ",
- " ! ! ! !!! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! !! ",
- " ! ! ! ! ",
- " ! ! !! ",
- " ! !! ",
- " ! ! ! ! !! !! ",
- " ! ! ! !!! !!! ",
- " ! ! ! !!! !!! ",
- " ! ! ! ! !!! ",
- " ! ! ! !! ! ! ! ",
- " !!! ! ! ! !! ",
- " ! !! ! ! !! ! ",
- " ! !!! ! ! ! !!! ",
- " ! !!! !! ! ! !!! ! ",
- " ! !!!! ! ! !! ",
- " ! ! ! !!! ! !! ! ! !!! ",
- " ! ! !!!! !!! ! ! !!! ",
- " !!! ! !!!! !!! ! ! ",
- " !!!!! !! ! ! ",
- " !!!!! !! !! !! ! ! ! ",
- " !!!!! !!! !!! ! ! ! ",
- " !!!! !!!! !!! ! ! ! ",
- " ! !! ! ! ! ! ",
- " !!! ! ! ! ! ",
- " !! ! ! ! !!! ! ",
- " !! ! !!! ! !! ! ! ",
- " ! ! ! !! ! ",
- " !! ! !! ! ! ! ! ",
- " ! ! !! ! ! ! ! ",
- " ! ! !!! ! ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-line-and-line-placement-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-and-line-placement-600-400-2.0-grid-reference.json
deleted file mode 100644
index 8615c78..0000000
--- a/tests/visual_tests/grids/marker-on-line-and-line-placement-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!!!!! ",
- " !!!! !! ! !! ",
- " ! ! ! ! ! ! ",
- " !! ! ! ! ! !! ",
- " ! ! ! ! ! ! ",
- " ! ! ! !!!!!!! !! ",
- " ! ! ! !! ! ! !! ",
- " ! ! !! ! ! ! ",
- " ! ! !! ! ! !! ",
- " ! ! !! ! ! ! ! ",
- " !! ! !! !!!! ! !!! ",
- " ! ! ! ! !!!!! ! ! ! ",
- " ! ! ! ! !!!!! !!! ! ! ",
- " ! ! ! ! !!!! !!!!! ! ",
- " ! ! ! ! !! !!!!! ! ! ",
- " ! ! !! ! ! !!!!! ! ! ",
- " ! ! ! ! ! !!!! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ",
- " ! !! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! !! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ",
- " ! !! ! ! ! ! ! ",
- " ! !! ! ! ! ! ! ",
- " ! !! ! ! ! ! ! ",
- " !!! !!! ! ! ! ! ! ",
- " !!!!! !!!!! ! !!!!! ! ! ! ",
- " !!!!! !!!!! ! !!!!! ! ! ",
- " !!!!! !!!!!!!!! !!!!!! ! ! ! ",
- " !!!! !!!!!!!!!!! !!!!!! ! ! ! ",
- " !! !!! !!!!!!! !!! ! ! ! ! ",
- " ! !!!!! !!!!!!! ! ! ! ",
- " ! !!!!! !!!!!! ! ! ! ",
- " ! !!!!! ! !!! ! ! ! ! ",
- " ! !!!! ! ! ! ! ",
- " ! !! ! ! ! ! ! ",
- " ! !! ! ! ! ! ",
- " ! ! ! ! !! ! ",
- " ! !! ! ! ! ! ",
- " ! !! ! ! !! ",
- " ! ! ! !! ! ",
- " ! !! ! ! ! ! ",
- " ! ! ! ! ! !! ! ",
- " !! ! ! !! ",
- " ! ! ! ! ! ! ! ",
- " ! ! ! !!!!! ! ",
- " ! !! ! !!!!!! ",
- " ! ! ! ! !!!!! ! ",
- " ! ! ! !!!!! ! ",
- " ! ! ! ! !!! ! ",
- " ! ! ! ! !! !!!! ",
- " ! ! ! !!!!!!!! ",
- " ! ! ! ! !!!!!!!! ",
- " ! ! ! ! !!!!!!!! ",
- " ! ! ! ! !!!!!!! ",
- " ! ! ! ! !!!! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! !! ",
- " ! ! ! ! !! ! ",
- " ! ! !! !! ! ",
- " ! ! ! ! !! ! ",
- " ! ! !! !! ! ",
- " ! ! !! ! ! ",
- " ! !! !! ! ",
- " ! !! ! ! ",
- " ! ! ! ! ! ",
- " ! ! !! !!!! ",
- " ! ! ! ! ",
- " ! ! !!!! ",
- " ! ! ! ! !! ",
- " ! ! ! !!!! ",
- " !!!!!! !! !!!!! ",
- " !!!!!!!!! !!!!!! ! ",
- " !!!!!!!!! !!!!!!! !! ",
- " !!!!!!!!!!! !!!!!! !! ",
- " !!!!!!!!!!! ! !! !!! ",
- " ! !!!!!!!!! ! !! !!! ",
- " ! ! !!!!!!! ! !! ! !! ! ",
- " ! ! !!!!! ! ! ! !! ! ",
- " ! ! !!!!!! ! !! ! ! ! ! ",
- " ! ! ! !!! !!!! ! !! ! ",
- " ! ! ! !! ! ! ! ! ",
- " ! ! ! ! !!!! ! ! ! ! ",
- " ! !! ! ! !! ! ! ! ! ",
- " !! ! ! !!!! ! !! ! ! ",
- " !! ! ! !! ! ! ! ",
- " ! ! !!!! ! ! ! ! ",
- " !!! ! !!! ! ! ! ! ",
- " !!! ! !!!! !!! ! ! ! ",
- " !!! ! !!! !!!!! ! ! ",
- " !!! !!! !!!!!!! ! ",
- " !! ! !!! ! !!!!! ! ! ",
- " !! ! !!! ! !!!! ! ! ",
- " !! ! !! !!!! ! ! ! ",
- " !! ! !!!!!!! ! ! ! ",
- " ! ! !!!!!! !! ! ! ",
- " ! ! !!!!!!! ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-line-and-vertex-first-placement-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-and-vertex-first-placement-600-400-1.0-grid-reference.json
deleted file mode 100644
index 84f2841..0000000
--- a/tests/visual_tests/grids/marker-on-line-and-vertex-first-placement-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,111 +0,0 @@
-{
- "keys": [
- "",
- "3",
- "2",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !!! ! !! ! !! ",
- " !!! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ## ",
- " ############################################################################################################################### ",
- " ## ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$ ",
- " $$$ ",
- " $ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-line-and-vertex-first-placement-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-and-vertex-first-placement-600-400-2.0-grid-reference.json
deleted file mode 100644
index 8f6bea0..0000000
--- a/tests/visual_tests/grids/marker-on-line-and-vertex-first-placement-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,111 +0,0 @@
-{
- "keys": [
- "",
- "3",
- "2",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! !! ! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! !! ",
- " !!!!!! !! !! !! !! ",
- " !!!!!! !!!! !!!! ",
- " !!!!!! ",
- " !!!!! ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " #### ",
- " ##### ",
- " ################################################################################################################################ ",
- " ##### ",
- " #### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$ ",
- " $$$$ ",
- " $$$$$$ ",
- " $$$$$$ ",
- " $$$$$ ",
- " $$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-line-and-vertex-last-placement-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-and-vertex-last-placement-600-400-1.0-grid-reference.json
deleted file mode 100644
index 8f0444c..0000000
--- a/tests/visual_tests/grids/marker-on-line-and-vertex-last-placement-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,111 +0,0 @@
-{
- "keys": [
- "",
- "3",
- "2",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ! !!! ",
- " !! ! !! ! !!!! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " !! ! !! ! !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ## ",
- " ############################################################################################################################## ",
- " ## ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$ ",
- " $$$ ",
- " $ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-line-and-vertex-last-placement-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-and-vertex-last-placement-600-400-2.0-grid-reference.json
deleted file mode 100644
index 12a46e0..0000000
--- a/tests/visual_tests/grids/marker-on-line-and-vertex-last-placement-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,111 +0,0 @@
-{
- "keys": [
- "",
- "3",
- "2",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!! ",
- " !!!!! ",
- " !! !! !!!!!! ",
- " !! !! !! !! !!!!! ",
- " !! !! !! !! !! !!!! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !! !! !! !! ",
- " !! !!!! !!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " #### ",
- " ##### ",
- " ################################################################################################################################ ",
- " ##### ",
- " #### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$ ",
- " $$$$ ",
- " $$$$$$ ",
- " $$$$$$ ",
- " $$$$$ ",
- " $$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-line-spacing-eq-width-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-spacing-eq-width-600-400-1.0-grid-reference.json
deleted file mode 100644
index faa0d55..0000000
--- a/tests/visual_tests/grids/marker-on-line-spacing-eq-width-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ",
- " !!! !!!!! !",
- " !! !!!!! !!!!! ",
- " !!!! !!!!! !!!!! ",
- " !!!! !!!!!!!!!!!! !!!! ",
- " !!!! !!!!!!!!!!!! !!!! ",
- " !!! !!!!! !!!!!! !!!! ",
- " !!! !!!!! !!!!!! !!!! !! ",
- " ! !!!!! !!!!! !!!!! !!! ",
- " !!!!! !!!!!!!!!!! !!!! ",
- " !!!! !!!!!!!!!!! !!!! ",
- " !!! !!!!! !!!!! !!!!! ",
- " !! !!!!! !!!!! !!!!! ! ",
- " !! !!!! !!!!! !!!!! !!! ",
- " !!!! !!!!!! !!!!! !!! ",
- " !!!! !!!!!!!!!!!! !!!! ",
- " !!!! !!!!! !!!!!! !!!! ",
- " !!! !!!!! !!!!!! !!!! ",
- " !!! !!!!! !!!!! !!!!! !! ",
- " !!!!! !!!!! !!!!! !!! ",
- " !!!! !!!!!!!!!!! !!!! ",
- " !!!! !!!!!!!!!!! !!!! ",
- " !!!! !!!!! !!!!! !!!!! ",
- " !! !!!!! !!!!! !!!!! ! ",
- " !! !!!! !!!!!! !!!!! !!! ",
- " !!!! !!!!!! !!!!! !!!! ",
- " !!!! !!!!!!!!!!!! !!!! ",
- " !!! !!!!! !!!!! !!!! ",
- " !!! !!!!! !!!!! !!!!! !! ",
- " !!!!! !!!!! !!!!! !! ",
- " !!!!! !!!!! !!! ",
- "!!!!!! !!! ",
- " !!!!! ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-line-spacing-eq-width-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-spacing-eq-width-600-400-2.0-grid-reference.json
deleted file mode 100644
index 8ff5cfe..0000000
--- a/tests/visual_tests/grids/marker-on-line-spacing-eq-width-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ",
- " !!!!!!! ",
- " !! !!!!!!!!! ",
- " !!!!!! !!!!!!!!!! !",
- " !!!!!!!! !!!!!!!!!!! ",
- " !!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!! ",
- " !!! !!!!!!!!! !!!!!!!!!! !!!!!!!!! ",
- " !!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!! ",
- " !!!!! !!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!! !!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!! ",
- " !!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!! !!!!!!!!!! !!!!!!!!! !!!!!! ",
- " !!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!! ",
- " !!!! !!!!!!!!! !!!!!!!!!! !!!!!!!!! !!! ",
- " !!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!! ",
- " !!!!!! !!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!! ",
- " !!!! !!!!!!!!! !!!!!!!!!!! !!!!!!!!! !! ",
- " !!!!!!!! !!!!!!!!!! !!!!!!!!!!!! !!!!!!!! ",
- " ! !!!!!!!!! !!!!!!!!!! !!!!!!!!! !!!!! ",
- " !!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!! ",
- " !!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!! !! ",
- " !!!!!!! !!!!!!!!!!!!!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!! ",
- " !!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !!!!!! ",
- " !!!!!!!!!!! !!!!!!!!! ",
- "!!!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!! !!!! ",
- " !!!!!!!!! ",
- " !!!!! ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-line-spacing-eq-width-overlap-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-spacing-eq-width-overlap-600-400-1.0-grid-reference.json
deleted file mode 100644
index faa0d55..0000000
--- a/tests/visual_tests/grids/marker-on-line-spacing-eq-width-overlap-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ",
- " !!! !!!!! !",
- " !! !!!!! !!!!! ",
- " !!!! !!!!! !!!!! ",
- " !!!! !!!!!!!!!!!! !!!! ",
- " !!!! !!!!!!!!!!!! !!!! ",
- " !!! !!!!! !!!!!! !!!! ",
- " !!! !!!!! !!!!!! !!!! !! ",
- " ! !!!!! !!!!! !!!!! !!! ",
- " !!!!! !!!!!!!!!!! !!!! ",
- " !!!! !!!!!!!!!!! !!!! ",
- " !!! !!!!! !!!!! !!!!! ",
- " !! !!!!! !!!!! !!!!! ! ",
- " !! !!!! !!!!! !!!!! !!! ",
- " !!!! !!!!!! !!!!! !!! ",
- " !!!! !!!!!!!!!!!! !!!! ",
- " !!!! !!!!! !!!!!! !!!! ",
- " !!! !!!!! !!!!!! !!!! ",
- " !!! !!!!! !!!!! !!!!! !! ",
- " !!!!! !!!!! !!!!! !!! ",
- " !!!! !!!!!!!!!!! !!!! ",
- " !!!! !!!!!!!!!!! !!!! ",
- " !!!! !!!!! !!!!! !!!!! ",
- " !! !!!!! !!!!! !!!!! ! ",
- " !! !!!! !!!!!! !!!!! !!! ",
- " !!!! !!!!!! !!!!! !!!! ",
- " !!!! !!!!!!!!!!!! !!!! ",
- " !!! !!!!! !!!!! !!!! ",
- " !!! !!!!! !!!!! !!!!! !! ",
- " !!!!! !!!!! !!!!! !! ",
- " !!!!! !!!!! !!! ",
- "!!!!!! !!! ",
- " !!!!! ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-on-line-spacing-eq-width-overlap-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/marker-on-line-spacing-eq-width-overlap-600-400-2.0-grid-reference.json
deleted file mode 100644
index 8ff5cfe..0000000
--- a/tests/visual_tests/grids/marker-on-line-spacing-eq-width-overlap-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ",
- " !!!!!!! ",
- " !! !!!!!!!!! ",
- " !!!!!! !!!!!!!!!! !",
- " !!!!!!!! !!!!!!!!!!! ",
- " !!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!!!!!!!!!!!! ",
- " !!! !!!!!!!!! !!!!!!!!!! !!!!!!!!! ",
- " !!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!! ",
- " !!!!! !!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!! !!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!! ",
- " !!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!! !!!!!!!!!! !!!!!!!!! !!!!!! ",
- " !!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!! ",
- " !!!! !!!!!!!!! !!!!!!!!!! !!!!!!!!! !!! ",
- " !!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!! ",
- " !!!!!! !!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!! ",
- " !!!! !!!!!!!!! !!!!!!!!!!! !!!!!!!!! !! ",
- " !!!!!!!! !!!!!!!!!! !!!!!!!!!!!! !!!!!!!! ",
- " ! !!!!!!!!! !!!!!!!!!! !!!!!!!!! !!!!! ",
- " !!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!! ",
- " !!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!! !! ",
- " !!!!!!! !!!!!!!!!!!!!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!! ",
- " !!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !!!!!! ",
- " !!!!!!!!!!! !!!!!!!!! ",
- "!!!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!! !!!! ",
- " !!!!!!!!! ",
- " !!!!! ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-path-expression-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/marker-path-expression-500-100-1.0-grid-reference.json
deleted file mode 100644
index 20f9c8f..0000000
--- a/tests/visual_tests/grids/marker-path-expression-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-path-expression-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/marker-path-expression-500-100-2.0-grid-reference.json
deleted file mode 100644
index c637689..0000000
--- a/tests/visual_tests/grids/marker-path-expression-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ",
- " !!!!! ",
- " !!!!! ",
- " !!!!! ",
- " !!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-recenter-collide-256-128-1.0-grid-reference.json b/tests/visual_tests/grids/marker-recenter-collide-256-128-1.0-grid-reference.json
deleted file mode 100644
index 31b1530..0000000
--- a/tests/visual_tests/grids/marker-recenter-collide-256-128-1.0-grid-reference.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! # ",
- " !!!!!!! # ",
- " ! # ",
- " ",
- " ! ",
- " ! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-recenter-collide-256-128-2.0-grid-reference.json b/tests/visual_tests/grids/marker-recenter-collide-256-128-2.0-grid-reference.json
deleted file mode 100644
index 7b1e68c..0000000
--- a/tests/visual_tests/grids/marker-recenter-collide-256-128-2.0-grid-reference.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # ",
- " !!! # ",
- " !!! # ",
- " !!!!!!!!!!!!!! # ",
- " !!! # ",
- " !! # ",
- " ! ",
- " ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-svg-empty-g-element-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/marker-svg-empty-g-element-500-100-1.0-grid-reference.json
deleted file mode 100644
index a6ae153..0000000
--- a/tests/visual_tests/grids/marker-svg-empty-g-element-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-svg-empty-g-element-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/marker-svg-empty-g-element-500-100-2.0-grid-reference.json
deleted file mode 100644
index 7710c5b..0000000
--- a/tests/visual_tests/grids/marker-svg-empty-g-element-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !!!! ",
- " !!!! ",
- " !!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-svg-opacity-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/marker-svg-opacity-500-100-1.0-grid-reference.json
deleted file mode 100644
index c9c95ba..0000000
--- a/tests/visual_tests/grids/marker-svg-opacity-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "keys": [
- "",
- "4",
- "3",
- "2",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " !!! ",
- " !!! ",
- " !!! ",
- " ",
- " ",
- " ### ",
- " ### ",
- " ### ",
- " ",
- " ",
- " $$$ ",
- " $$$ ",
- " $$$ ",
- " ",
- " ",
- " %%% ",
- " %%% ",
- " %%% ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-svg-opacity-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/marker-svg-opacity-500-100-2.0-grid-reference.json
deleted file mode 100644
index 9c34bf4..0000000
--- a/tests/visual_tests/grids/marker-svg-opacity-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "keys": [
- "",
- "4",
- "3",
- "2",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " !!!!! ",
- " !!!!! ",
- " !!!!! ",
- " !!!!! ",
- " !!!!! ",
- " ##### ",
- " ##### ",
- " ##### ",
- " ##### ",
- " ##### ",
- " $$$$$ ",
- " $$$$$ ",
- " $$$$$ ",
- " $$$$$ ",
- " $$$$$ ",
- " %%%%% ",
- " %%%%% ",
- " %%%%% ",
- " %%%%% ",
- " %%%%% ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-svg-opacity2-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/marker-svg-opacity2-500-100-1.0-grid-reference.json
deleted file mode 100644
index 20f9c8f..0000000
--- a/tests/visual_tests/grids/marker-svg-opacity2-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-svg-opacity2-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/marker-svg-opacity2-500-100-2.0-grid-reference.json
deleted file mode 100644
index c637689..0000000
--- a/tests/visual_tests/grids/marker-svg-opacity2-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ",
- " !!!!! ",
- " !!!!! ",
- " !!!!! ",
- " !!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-symbolizer-expressions-all-256-256-1.0-grid-reference.json b/tests/visual_tests/grids/marker-symbolizer-expressions-all-256-256-1.0-grid-reference.json
deleted file mode 100644
index 2f66b21..0000000
--- a/tests/visual_tests/grids/marker-symbolizer-expressions-all-256-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-symbolizer-expressions-all-256-256-2.0-grid-reference.json b/tests/visual_tests/grids/marker-symbolizer-expressions-all-256-256-2.0-grid-reference.json
deleted file mode 100644
index 2f66b21..0000000
--- a/tests/visual_tests/grids/marker-symbolizer-expressions-all-256-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-vs-point-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/marker-vs-point-512-512-1.0-grid-reference.json
deleted file mode 100644
index 26209b6..0000000
--- a/tests/visual_tests/grids/marker-vs-point-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,139 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ",
- " !!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!! ",
- " !!!!!!!!! ",
- " !!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ####### ",
- " ########### ",
- " ############# ",
- " ############### ",
- " ################# ",
- " ################# ",
- " ################### ",
- " ################### ",
- " ################### ",
- " ################### ",
- " ################### ",
- " ################### ",
- " ################### ",
- " ################# ",
- " ################# ",
- " ############### ",
- " ############# ",
- " ########### ",
- " ####### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$ ",
- " $$$$$$$$$$ ",
- " $$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$ ",
- " $$$$$$$$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-vs-point-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/marker-vs-point-512-512-2.0-grid-reference.json
deleted file mode 100644
index f184698..0000000
--- a/tests/visual_tests/grids/marker-vs-point-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,139 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!! ",
- " ####### ",
- " ############## ",
- " ################## ",
- " ##################### ",
- " ######################## ",
- " ########################### ",
- " ############################# ",
- " ############################## ",
- " ############################### ",
- " ################################# ",
- " ################################## ",
- " ################################### ",
- " #################################### ",
- " ##################################### ",
- " ##################################### ",
- " ##################################### ",
- " ###################################### ",
- " ###################################### ",
- " ###################################### ",
- " ####################################### ",
- " ###################################### ",
- " ###################################### ",
- " ###################################### ",
- " ##################################### ",
- " ##################################### ",
- " ##################################### ",
- " ################################### ",
- " ################################### ",
- " ################################# ",
- " ################################# ",
- " ############################### ",
- " ############################# ",
- " ############################ ",
- " ########################## ",
- " ####################### ",
- " ##################### ",
- " ################# ",
- " ############# ",
- " # ",
- " $$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$ ",
- " $$$$$$$$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-whole-multi-polygon-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/marker-whole-multi-polygon-512-512-1.0-grid-reference.json
deleted file mode 100644
index e384685..0000000
--- a/tests/visual_tests/grids/marker-whole-multi-polygon-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,332 +0,0 @@
-{
- "keys": [
- "",
- "71",
- "24",
- "245",
- "238",
- "154",
- "207",
- "189",
- "60",
- "82",
- "132",
- "205",
- "142",
- "101",
- "103",
- "51",
- "72",
- "102",
- "153",
- "163",
- "98",
- "30",
- "242",
- "136",
- "206",
- "110",
- "231",
- "191",
- "106",
- "58",
- "105",
- "65",
- "182",
- "170",
- "171",
- "89",
- "133",
- "233",
- "236",
- "210",
- "186",
- "138",
- "237",
- "200",
- "94",
- "165",
- "86",
- "140",
- "68",
- "5",
- "202",
- "93",
- "199",
- "117",
- "74",
- "84",
- "194",
- "96",
- "88",
- "31",
- "162",
- "12",
- "2",
- "50",
- "139",
- "190",
- "83",
- "114",
- "107",
- "175",
- "97",
- "150",
- "120",
- "155",
- "32",
- "13",
- "235",
- "116",
- "226",
- "118",
- "244",
- "41",
- "234",
- "113",
- "18",
- "214",
- "137",
- "215",
- "126",
- "36",
- "188",
- "99",
- "131",
- "79",
- "240",
- "224",
- "42",
- "220",
- "193",
- "172",
- "158",
- "90",
- "78",
- "173",
- "181",
- "230",
- "75",
- "38",
- "127",
- "225",
- "11",
- "167",
- "208",
- "152",
- "56",
- "73",
- "164",
- "212",
- "183",
- "197",
- "185",
- "26",
- "229",
- "63",
- "95",
- "39",
- "77",
- "87",
- "35",
- "40",
- "119",
- "223",
- "121",
- "157",
- "59",
- "104",
- "52",
- "49",
- "21",
- "198",
- "67",
- "27",
- "28",
- "204",
- "92",
- "161",
- "174",
- "166",
- "156",
- "203",
- "177",
- "148",
- "201",
- "195",
- "43",
- "64",
- "232",
- "6",
- "29",
- "227",
- "20",
- "221",
- "144",
- "217",
- "218",
- "17",
- "123",
- "141",
- "108",
- "115",
- "149",
- "9",
- "151",
- "61",
- "122",
- "146",
- "125",
- "222",
- "124",
- "196",
- "33",
- "160",
- "216",
- "180",
- "169",
- "228",
- "8",
- "219",
- "159",
- "178",
- "179",
- "143",
- "209",
- "62",
- "147",
- "243",
- "145"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " # !!!!!!! ",
- " ###### !!!!!!!!!!! ",
- " ####### !!!!!!!!!!!! ",
- " ########## !!!!!!!!!!!!!!! ",
- " ########### !!!!!!!!!! ! !!! $$$$ ",
- " ############ !!!!!!!!!!!!!!!!! $$$$$$$ $$ ",
- " ###########!!!!!!!!!!!!!!!!!!! %% $$$$$$$$$ $$$ $$$$ ",
- " #### ######!!!!!!!!!!!!!!!!!!! %%%%%%%% $$$$$$$$ $$$ $$$ ",
- " ############!!!!!!!!!!!!!!!!!!! %% %%%%%%%%% $$$$$$$ $ $$$$$ ",
- " ########## !!!!!!!!!!!!!!!!!! %%%%%%%%%%% $$$$$$ $$$ $$$$$$ ",
- " ## ## ######## !!!!!!!!!!!!!!!!!! %%%%%%%%% $$$ $$$$$$ ",
- " ### ############!!!!!!!!!!!!!!!!!!!! %%%%%%%%% $$$$$$$$ ",
- " ################!!!!!!!!!!!!!!!!!!!!! %%%%%%%% $$ $$$ $$$$ ",
- " ################!!!!!!!!!!!!!!!!!!!!!! %%%%% $$$$$$$$ $$$ $ $$ ",
- " ################# !!!!!!!!!!!!!!!!!!!!! %%%%% $$ $ $$$$$$$$$$$$$ $ $$$$$ ",
- " ###################!!!!!!!!!!!!!!!!!!!!! %%% $$$$ $$$ $$$$$$$$$ $$$$$$$$ ",
- " ################# !!!!!!!!!!!!!!!!!!! $$$ $$$$$$$$$$$$$ $$$$$$$$$ ",
- " ## ############ !!!!!!!!!!!!!!!! %% $$$ $$$$$$$$$$$$$$$$ $ $$$ $$ ",
- " #### ######### ## !!!!!!!!!!!!!!!! %% $$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ################### !!!!!!!!!!!!!!! $$ $$$$$$$$$$$$$$$$$$$$$$$$$ $$ ",
- " $$ #################### !!!!!!!!!!!!!!! $$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$ ",
- " $$ ###################### !!!!!!!!!!!!!! %%% &&&& $$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$ $",
- " $$ ''''' ########################### !!!!!!!!!!!!! %%% &&&&&&$ $$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $",
- " ''''''''############################ !!!!!!!!!!!!! &&&&&&&$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " '''''''''############################# !!!!!!!!!!!!! &&&(&)$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " '''''''''############################# !!!!!!!!!!! &&((())$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " $$$''''''''###################### #######!!!!!!!!!! ** &&&((())$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " $$$$''''''''##############################!!!!!!!!! **** &&((()))$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " $$''''''''''############################# !!!!!!! *** &&&(((())$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " ''''''''''''############################# !!!!!! ++ &&&&(((())$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " ''''''''''''################### ######### !!!!!! +++,,&&&&(((-)$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$ ",
- " '''''''''''''#'############### ######### !!!! +,,,&&&&(((-$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$ ",
- " '''''''''''' '''############# ########## !!! ,,,,,&&((((((.$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$ ",
- " ''' '''''' ''''############# ########## ,,,, &(((((/.$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$ $$$$ ",
- " '''''''' ''''########################## 0,,, 111($$$/2$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$ ",
- " ''''''''' '''########################### 00,,,,33314$$$/2$$$$$$$$$$$$$5$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$'''",
- "''''''' ############################## 0,,,,333144$422$$$$$$$$$$$555555$$$$$$$$$$$$$$$66$$$$$$$ $$ '''",
- "''''' ###''######################## ,777338114449999$$$$$55$$5555555$$$$$$::$$$$$$66$$$$$$$ $$$ '''",
- "' #''''''''''''############;;## ,7778<<=>??999999$$$55555555555555$::::::::::6666$$$$$$ $$$$ ",
- " '''''''''''''''#####'###;;;# @@7@@<<<AA?BC9999$$$$$5555555555556:::::::::::66666$$D$$$$$ ",
- " ''''''''''''''''##''''##;;# @@EE<<FFGGGB999$$$$$$5HH55555555666::::::::66666$$$DD$$$$ ",
- " '''''''''''''''#'''''### IIIEEJJKKGGGLL $$$$5HHHH5555566666::::::66666M$$$DD$$$ ",
- " '''''''''''''''''''''# NNNN NNIIIIIOKKPPLLLLLLLLQRSSSSHHHHHT6666666666666666MM$$ DDD$ ",
- " '''''''''''''''''''' NNNNN NIIIIIUUUVOWLLLLLLLLXXSSSSSHHYY6666666666666666ZZZZZDDD ",
- " ''''''''''''''''''' NNNN IIIIIUUUUVWWWLLLLL[[XSSXSSS]YY^666666666666666ZZZZZDDD ",
- " ''''''''''''''''''' ___ N NNN IIII`UUUUVWWWWabcc[[XXXXX]]]^^dd666666666666666ZZZDDDD ",
- " ''''''''''''''''' ___ NNI eee```UUf ffWabbbg[hhhXXX]]^^^d6666666666666666ZZZDDDDD ",
- "iii jjjjjj'''''''''' _ IIIIee`````fffffaaggggggggXXX^^^^^ddkkklld6666666666DDD DDD ",
- "i''''' jjjjjjj'''''''''mm IInno``````fffffaagggggggpppqX^^^dddkkkddd666666rrrDDDD DDD DD ",
- " '''''''' jjjjjj'' j'''stt Innnou`````fffffaaaggggggpppq ^^^ddddddddv666w6xrrrrDDD DDD DD ",
- " '''''' jjjjjjjjjjj'''ttt y onnnouuu``zzz{ff||||||gggpppqq^^dddddddddvv}wwwxrrrrDDD D~~ DD ii ",
- " ii '''' jjjjjjjjjjjjj\u007f''tty\u0080\u0080\u0081 \u0082\u0082\u0082ooooouuuuzzzz{{{||||||gg\u0083ggqqq ddddddddvv\u0084\u0084wwwxx\u0085rr ~~~ iii ",
- " ii '' jjjj jjjjj\u0086\u0086\u0087'\u0088\u0089y\u0080\u0080\u0081 ii \u0082\u0082\u0082\u0082\u008a\u008aooouuuzzzz{{{|||||\u0083\u0083\u0083\u0083\u0083qqq ddddd vdd\u0084\u0084www \u0085\u0085\u0085\u0085 ~~~ \u008b\u008b\u008b ",
- " ii \u008c\u007f\u0086\u0086\u0086\u008d \u008e\u008f\u008f\u0081\u0081\u0081\u0090 \u0082\u0082\u0082\u0091\u008a\u008a\u008au\u0092\u0092\u0092z\u0093zz{{{|||||\u0094\u0083\u0083\u0083\u0083\u0083\u0083\u0083 dddddd ddd\u0084\u0084wwww \u0085\u0085\u0085\u0085 \u0095~~ \u008b\u008b\u008b\u008b\u008b ",
- " \u007f\u0086\u0096\u0096\u0096\u008d\u0097\u008f\u008f\u0097\u0097\u0097 \u0091\u0091\u0098\u0098u\u0092\u0092\u0092\u0099\u0093\u0093\u0093\u0093{{|||||\u0094\u0094\u0083\u0083\u009a\u0083\u0083\u0083 dddd\u009b dd\u0084\u0084wwwww\u0085\u0085\u0085\u0085\u0085 \u009c\u009d\u009d~~\u009d\u009d \u008b\u008b\u008b\u008b\u008b ",
- " \u009e \u009f\u0096\u0096\u0096\u0096\u0097\u0097\u0097\u0097\u0097\u0097\u00a0 \u0091\u0098\u0098\u0098\u00a1\u0099\u0099\u0099\u0093\u0093\u0093\u00a2\u00a3\u00a3\u00a3||||\u0094\u0094\u0094\u009a\u009a \u00a4\u00a4\u00a4\u009b\u009b\u009b d\u00a5\u00a5\u0084ww\u00a5w\u00a6\u0085\u0085\u0085\u00a5\u00a5\u009c\u009c\u009c\u009c\u009d\u009d\u009d\u009d\u009d\u009d\u009d\u008b\u008b\u008b\u008b\u008b\u008b ",
- " \u009e\u009e\u009e \u0096\u0096\u0096\u008d\u008d\u008d\u0097\u0097\u0097\u0097\u00a7\u00a7\u00a8 \u0098\u0098\u00a9\u00a1\u00a1\u0099\u0099\u0093\u0093\u00aa\u00a3\u00a3\u00a3\u00a3\u00a3|||\u0094\u0094\u009a\u009a\u009a \u00a4\u00a4\u00a4\u009b\u009b\u009b d\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a6\u00a5\u00a5\u00a5\u00a5\u00a5\u009c\u009c\u009c \u009d\u009d\u009d\u009d\u009d\u009d\u009d\u009d\u009d\u008b\u008b\u008b\u008b ",
- "iii \u009ei\u009e\u009e \u00ab\u00ab \u008d\u008d\u008d\u008d\u008d\u0097\u0097\u00a0\u00a7\u00a7\u00a7\u00a8\u00ac \u009e \u00a1\u00a1 \u00ad\u00ad\u00ae\u00a2\u00af\u00b0\u00b0\u00b0\u00b0\u00b1\u00b1\u00b2\u00b2\u009a\u009a \u00a4\u00a4\u00a4 \u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u009c\u009c\u00a5 \u009d\u009d \u009d\u009d\u008b\u008b\u008b\u009e ",
- "iii\u009e iii\u009e \u00ab\u00ab\u00ab\u00ab \u00ab\u00ab\u00b3\u008d\u008d\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac \u009e \u00ad\u00ad\u00ad\u00ae\u00ae\u00af\u00b0\u00b0\u00b0\u00b4\u00b1\u00b1\u00b2\u00b2\u009a \u00a4\u00a4\u00a4 \u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b6\u00b6\u00b6\u009e\u009e\u009e",
- " ii\u009e\u009e iii\u009e\u009e \u00ab\u00ab\u00ab \u00ab\u00ab\u00b3\u00b3\u00b3\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac \u00ac\u00ac \u00aa\u00ad\u00ad\u00ae\u00ae\u00b0\u00b0\u00b0\u00b0\u00b4\u00b7\u00b7\u00b7\u00b7\u00b7 \u00b8\u00b8 \u00b9\u00b9\u00a4 \u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5 \u00b6\u00b6\u009e\u0 [...]
- " \u00bb\u00bb\u009e \u00bc\u009e\u009e\u009e \u00bd\u00bd\u00bd \u00b3\u00b3\u00b3\u00b3\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac \u00be\u00be \u00bf\u00bf\u00b0\u00b0\u00b0\u00b0\u00b0\u00c0\u00b7\u00b7\u00b7\u00b7\u00b7\u00b8 \u00b8\u00b8\u00b8\u00b8 \u00b9\u00b9\u00b9 \u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00c1\u00c1\u00a5\u00a5\u00a5\u00a5\u00a5\u00b5\u00b5\u00b5\u00b5\u00b5\u00 [...]
- " \u00bb\u00bb\u00bb\u00bc\u00bc\u00bc\u009e\u009e\u009e\u009e \u00bd\u00bd\u00bd \u00b3\u00b3\u00b3\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac \u00be\u00be\u00be \u00bf\u00bf\u00bf\u00bf\u00b0\u00b0\u00c3\u00c3\u00b7\u00b7\u00b7\u00b7\u00b8\u00b8\u00b8\u00b8\u00b8\u00b8 \u00b9\u00b9\u00b9 \u00c4 \u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00a5\u00c1\u00c1\u00c1\u00c1\u00a5\u00a5\u00a5\u00a5\u00b5\u00b5\u00b5\u00b5 [...]
- "\u00c5\u00c5\u00c6\u00c6\u00bb\u00bc\u00bc\u00bc\u00bc\u009e\u009e\u009e \u00bd\u00bd\u00bd \u00b3\u00b3\u00b3\u00c7\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac \u00be \u00bf\u00bf\u00bf\u00b0\u00c3\u00c3\u00c3\u00c8\u00b7\u00b7\u00c9\u00b8\u00b8\u00ca\u00cb\u00cb\u00cb \u00c4\u00c4\u00c4 \u00cc\u00cc \u00a5\u00a5\u00a5\u00c1\u00c1\u00c1\u00a5\u00a5\u00cd\u00a5\u00a5\u00b5\u00b5\u00b5\u00b5\u00b5\u00b5\u00c2\u00ce\ [...]
- "\u00c5\u00c5\u00c6\u00c6\u00c6\u00bc\u00bc\u00bc \u009e\u009e\u00bd\u00bd\u00bd \u00bd \u00b3\u00b3\u00b3\u00c7\u00c7\u00c7\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac \u00be\u00be\u00be \u00bf\u00bf\u00bf\u00bf\u00c3\u00c3\u00c3\u00c3\u00c8\u00c8\u00d0\u00d1\u00c9\u00c9\u00ca \u00cb \u00c4\u00c4 \u00cc \u00a5\u00a5\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd \u00b5\u00b5\u00b5\u00c2\u00c2\u00ce\u00ce\u00ce \u00cf\u00cf",
- "\u00c5\u00c5\u00c6\u00c6\u00d2\u00bc\u00bc\u00bc\u00bc\u00bd\u00bd\u00bd\u00bd\u00bd \u00b3\u00b3\u00c7\u00c7\u00c7\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac \u00be\u00be\u00be \u00bf\u00bf\u00bf\u00bf\u00bf\u00c3\u00c3\u00d3\u00d3\u00c8\u00d0\u00d1\u00d1\u00d1\u00ca\u00ca \u00cb\u00cb \u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd \u00d4\u00d4\u00ce\u00ce\u00ce\u00ce\u00cf\u00cf",
- "\u00cf\u00d5\u00d5\u00d5\u00d2\u00bc\u00bc\u00bc\u00bc\u00bd\u00bd\u00bd\u00bd\u00bd\u00bd\u00bd \u00d6\u00c7\u00c7\u00d7\u00d7\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac \u00ac\u00ac\u00ac \u00be \u00bf\u00d8\u00d8\u00d8\u00d9\u00d3\u00d3\u00d3\u00d0\u00d0\u00d1\u00d1\u00d1\u00ca\u00ca\u00da\u00da\u00cb\u00cb\u00cb \u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd \u00d4\u00d4\u00d4\u00ce\u00ce\u00ce\u0 [...]
- "\u00cf\u00d5\u00d5\u00d5\u00d2 \u00bc\u00bc\u00bc\u00bd\u00bd\u00bd\u00bd\u00bd\u00bd\u00bd\u00bd\u00db\u00db\u00db\u00db \u00d6\u00c7\u00c7\u00d7\u00d7\u00d7\u00ac\u00ac\u00ac\u00ac\u00ac \u00ac\u00ac\u00ac \u00d8\u00d8\u00d8\u00d9\u00d9\u00d3\u00d3\u00d0\u00d0 \u00ca\u00ca \u00da\u00da\u00cb\u00cb\u00cb \u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd \u00d4\u00d4\u00d4\u00d4\u00ce\u00ce\u00d4\u00cf",
- " \u00d5 \u00bc\u00bc\u00bd\u00bd\u00bd\u00bd\u00bd\u00bd\u00bd\u00bd\u00db\u00db\u00db\u00db \u00d6\u00d6\u00d6 \u00d6\u00d6 \u00d6\u00dc\u00dc\u00d7\u00d7\u00d7\u00ac\u00ac\u00ac\u00ac\u00ac \u00be \u00d8\u00d8\u00d8\u00d9\u00d9\u00dd\u00dd\u00dd\u00d0 \u00ca \u00da \u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd \u00d4\u00d4\u00d4\u00d4 ",
- "\u00de\u00de \u00bd\u00bd\u00bd\u00bd \u00db\u00db\u00db\u00db \u00d6\u00d6\u00d6\u00d6 \u00d6\u00d6 \u00d6\u00dc\u00dc\u00dc\u00d7\u00d7\u00ac\u00ac\u00ac\u00ac \u00be \u00d8\u00d8\u00df\u00e0\u00dd\u00dd\u00dd \u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd \u00e1\u00e1 ",
- "\u00de\u00de \u00bd\u00bd\u00bd \u00d6\u00d6 \u00d6 \u00d6\u00dc\u00dc\u00dc\u00dc\u00e2\u00ac\u00ac\u00ac \u00df\u00df\u00df\u00e0\u00e0\u00dd \u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd \u00e1\u00e1 ",
- "\u00de\u00de \u00d6\u00d6\u00d6\u00d6 \u00d6\u00dc\u00dc\u00dc\u00e2\u00e2\u00e2 \u00df\u00df\u00e0\u00e0 \u00cd\u00cd\u00cd\u00cd\u00cd\u00cd \u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd \u00cd\u00cd \u00e1\u00e1\u00de\u00de ",
- " \u00d6\u00d6\u00d6\u00d6\u00d6\u00d6\u00d6\u00dc\u00dc\u00e2\u00e2\u00e2 \u00be\u00be \u00df \u00cd\u00cd\u00cd\u00cd\u00cd\u00cd \u00cd\u00cd\u00cd\u00cd\u00cd\u00cd\u00cd \u00cd\u00cd \u00de\u00de\u00de\u00de",
- " \u00d6\u00d6 \u00d6\u00d6\u00dc\u00dc\u00dc\u00dc \u00be\u00be \u00d1\u00d1 \u00cd\u00cd\u00cd\u00cd \u00cd\u00cd\u00cd\u00cd\u00cd\u00cd \u00de\u00de\u00de",
- " \u00d6\u00dc\u00dc\u00dc\u00dc\u00dc \u00be\u00be\u00be \u00d1\u00d1 \u00cd\u00cd\u00cd\u00cd \u00de\u00de\u00de",
- " \u00d6\u00d6\u00d6\u00dc\u00dc\u00dc \u00be\u00be \u00d1\u00d1 \u00cd\u00cd\u00cd\u00cd \u00de\u00de\u00de",
- "\u00de\u00de\u00de \u00d6\u00d6\u00d6\u00d6\u00dc\u00dc \u00be \u00cd\u00cd\u00cd \u00de\u00de\u00de\u00de ",
- "\u00de\u00de\u00de \u00d6\u00d6\u00d6\u00d6\u00dc \u00df\u00df \u00d1\u00d1\u00d1 \u00cd\u00cd \u00de\u00de\u00de\u00de ",
- " \u00d6\u00d6\u00d6\u00d6\u00dc \u00df\u00df\u00df \u00d1\u00d1\u00d1 \u00d1\u00d1 \u00de\u00de\u00de \u00de",
- " \u00d6\u00d6\u00d6\u00dc\u00dc \u00e3 \u00df\u00df \u00d1\u00d1\u00d1\u00d1 \u00de\u00de\u00de \u00de",
- " \u00d6\u00d6\u00d6\u00d6 \u00e3\u00e3\u00e3\u00e3 \u00d1\u00d1\u00e4 \u00de\u00de\u00de\u00de \u00de",
- " \u00d6\u00d6\u00d6\u00d6\u00d6\u00e3\u00e3\u00e3\u00e3 \u00e5\u00e5 \u00e6 \u00e4\u00e4\u00e4 \u00cd \u00de\u00de\u00de\u00de ",
- " \u00d6\u00d6\u00d6\u00d6\u00d6\u00e3\u00e3 \u00e5\u00e5\u00e5 \u00e5 \u00e6\u00e6\u00e6 \u00e4\u00e4\u00e4 \u00cd\u00cd \u00de ",
- " \u00d6\u00d6\u00d6\u00d6\u00d6\u00dc \u00e5\u00e5 \u00e5\u00e5\u00e5 \u00e6\u00e6\u00e6 \u00cd\u00cd ",
- " \u00d6\u00d6\u00d6 \u00e5\u00e5\u00e5 ",
- " \u00e5\u00e5\u00e5 ",
- " \u00e5\u00e5\u00e5 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-whole-multi-polygon-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/marker-whole-multi-polygon-512-512-2.0-grid-reference.json
deleted file mode 100644
index a19629a..0000000
--- a/tests/visual_tests/grids/marker-whole-multi-polygon-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,295 +0,0 @@
-{
- "keys": [
- "",
- "71",
- "24",
- "245",
- "238",
- "154",
- "207",
- "189",
- "82",
- "60",
- "132",
- "205",
- "51",
- "103",
- "153",
- "98",
- "241",
- "242",
- "206",
- "30",
- "231",
- "191",
- "182",
- "110",
- "233",
- "236",
- "237",
- "165",
- "210",
- "94",
- "186",
- "194",
- "96",
- "199",
- "200",
- "93",
- "202",
- "89",
- "12",
- "190",
- "150",
- "117",
- "74",
- "139",
- "97",
- "162",
- "83",
- "155",
- "107",
- "175",
- "118",
- "84",
- "31",
- "32",
- "244",
- "120",
- "235",
- "114",
- "2",
- "226",
- "234",
- "50",
- "188",
- "214",
- "131",
- "240",
- "116",
- "42",
- "113",
- "126",
- "220",
- "193",
- "181",
- "36",
- "230",
- "158",
- "225",
- "208",
- "152",
- "172",
- "73",
- "164",
- "224",
- "11",
- "167",
- "183",
- "197",
- "119",
- "229",
- "63",
- "95",
- "75",
- "79",
- "77",
- "40",
- "223",
- "212",
- "157",
- "59",
- "198",
- "204",
- "56",
- "26",
- "49",
- "21",
- "185",
- "166",
- "104",
- "67",
- "177",
- "156",
- "161",
- "38",
- "87",
- "203",
- "148",
- "201",
- "195",
- "64",
- "232",
- "28",
- "174",
- "227",
- "52",
- "217",
- "218",
- "43",
- "6",
- "221",
- "144",
- "151",
- "17",
- "222",
- "115",
- "149",
- "160",
- "216",
- "146",
- "169",
- "9",
- "61",
- "125",
- "228",
- "33",
- "124",
- "196",
- "122",
- "108",
- "8",
- "219",
- "143",
- "159",
- "209",
- "180",
- "178",
- "179",
- "62",
- "147",
- "243",
- "145"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!! ",
- " ### !!!!!! ",
- " ##### !!!!!!!!!! ",
- " ####### !!!!!!!!!!!! ",
- " ######## !!!!!!!!!!!!!!!! $$ ",
- " #############!!!!!!!!!!!!!!!!! $$$$$$ ",
- " ############# !!!!!!!!!! !!!!!! $$$$$$$$ $$ $$$$ ",
- " ##########!!! !!!!!!!!!!!!!!!!! %%%% $$$$$$$$$$ $$$$$$$$$ ",
- " ###########!!!!!!!!!!!!!!!!!!!!!! %%%%%%%%%%$$$$$$$$$$$$$$$$$$$$$$ ",
- " ###########!!!!!!!!!!!!!!!!!!!!!! %%%%%%%%%%%%$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ############!!!!!!!!!!!!!!!!!!!!!! %%%%%%%%%%%%%$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ################!!!!!!!!!!!!!!!!!!!!! %%%%%%%%%%%%%$$$$$$$$$ $$$$$$$$$$$$$$ ",
- " ################## !!!!!!!!!!!!!!!!!!!! %%%%%%%%%%%%% $$$$$$$ $$$$$$$$$$$$$$$ ",
- " ################!!!!!!!!!!!!!!!!!!!!!!! %%%%%%%%%%%% $$ $$$$$$$$$$$$$$$ $$ ",
- " ################!!!!!!!!!!!!!!!!!!!!!!!!! %%%%%%%%%%% $$$$$$$$$$$$$$ $$$$$$ ",
- " #################!!!!!!!!!!!!!!!!!!!!!!!!! %%%%%%%%% $$$ $$$$$$$$$$$$$$$$ $$$$$$$$$$ ",
- " ##################!!!!!!!!!!!!!!!!!!!!!!!! %%%%%% $$$$$$ $$$$$$$$$$$$$$$$ $$$$$$$$$$$$ ",
- " ###################!!!!!!!!!!!!!!!!!!!!!!! %%%%%% $$$$$ $$$$$$$$$$$$$$$$ $$$$$$$$$$$$ ",
- " ###################!!!!!!!!!!!!!!!!!!!!!!! %%%%%% $$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ####################!!!!!!!!!!!!!!!!!!!!!! %%%%% $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ###################### !!!!!!!!!!!!!!!!!!! %%%%% $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- "$$$$ ###################### !!!!!!!!!!!!!!!!!! %%%%& $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- "$$$$ ######################## !!!!!!!!!!!!!!!!!%%%% &&&&&& $$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$ $$",
- "$$$$$ #############################!!!!!!!!!!!!!!!!!%%%%% &&&&&&$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$",
- "$$$$ '''''##############################!!!!!!!!!!!!!!!! %%%%% &&&&&&$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$ ''''''''############################!!!!!!!!!!!!!!!!!%%%%% &&&&&&&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " ''''''''''#############################!!!!!!!!!!!!!!! %% &&&&(&&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " $$$$''''''''#############################!!!!!!!!!!!!!))) &&&&(((*&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " $$$$$$'''''''#############################!!!!!!!!!!!!))))) &&&&(((**$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$'''''''#############################!!!!!!!!!!!!))))) ++ &&&(((((($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$'''''''#############################!!!!!!!!!!! )))))++++&&&&((((((*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " $$$$''''''''''############################!!!!!!!!!! )))+++,,,,&&((((($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " '$$''''''''''''''##########################!!!!!!!! ++,,,,,,&(((($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- "'''''''''''''''''''#########################!!!!!!!! ,,,,,,,,((((($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ''''''''''''''''''##########################!!!!!! ,,,,,,,(((((($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " '''''''''''''''''''############ #############!!!!! ,,,,,,,((($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- "'''''''''''' ''''''########################### -,,,,,,,((($$$$$.$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'",
- "'''''''''''' ''''''########################### -,,,,,,,//($$$$$$$$$$$$$$$$$$$0$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$'",
- "''''''''''' '''''''######################### --,12222///$$$$$3$$$$$$$$$$$000000$$$$$$$$$$$$$$$44$$$$$$$$$$$$$$$$$''",
- "''''''''' #'''''''####################555## -,22222,667$$$3333$$$$$00$$0000000$$$$$$88$$$$$$44$$$$$$$$$$$$$$$$'''",
- "''''' ##'''''''''''''########''#55555# ,2222266997::33333$$$$$$00000000000$88888888884444$$$$$$$$$$$$ ''''",
- "'' #''''''''''''''''####''''55555# ,2222269;;::::3333$$$$$$00000000000488888888888444$$$$$$$$$$$$ '",
- " '''''''''''''''''#''''''55555 <22269;;;;:::333$$$$$$$=====0000044488888888444>$$$$$$$$$$$$ ",
- " '''''''''''''''''#'''''''555 <<<<< <<????6;;;;;:::33333$$$$$=====@@0044444888888444>A$$$$$$$$$$$ ",
- " '''''''''''''''''''''''### <<<<<<< <<????B;;;;;:::C33CC$$$$$=======@D4444444444444AAA$$$$$$$$$$ ",
- " ''''''''''''''''''''''''## <<<<<<<<<?????BB;;;;::CCCCCCC$$EEE====@@@D4444444444444AAAA$$$FF$$$ ",
- " ''''''''''''''''''''''GG <<<<<<<<<?????BBB;;BCCCCCCCCHHEEEEE==@@@@44444444444444AAAAAAAFFF ",
- " I '''''''''''''''''''''GGGG <<<<<????????BBBBBBJKCLCCCCHHMEEEEEN@@@OOPP444444444444AAAAAAFFFF ",
- "I''' '''''''''''''''''''''GGGG <<?????????BBBBBBQQKLRHHHHRRRRSTUNNNNNPPPPVV44444444WWAAAAFFFFF ",
- "''''''' ''''XXX''''''''''''GGGGG ???YYYY??Z[BBBBQQQKRRRHHRR]]]]]NNNNNNPPPPPVO444444WWWWAAFFFFFFFFFF ",
- "'''''''''' X''XXXX''''''''''^^^^GG ??YYYYYZZ[[[[QQQQQ_RRR``RR]]]]]]NNNNOPPPPPOO44aaaWWWWWWFFFFFbbFFFFF ",
- "''''''''''' XXXXXXX'''''''''^^^^^cc ?YYYYYd[[[[[QQQQQ_R`````]]]]]]]NNNNOPPPPOOV4aaaaWWWWWWFFFFbbbbFFFFIII ",
- "'''''''''''' XXXXXXX''''X'''^^^^cccc eedYYYYYdff[ggggQQQ``````hh]]]]]NNNNNOOPPOOOOiaaaaWWWWWWFFFbbbbbbFFIIIII ",
- " I''''''''' XXXXXXXXXXXX'''^^^cccccc II eeedjYYYddffgggggkkk````hhhh]]]]]NNNNOOOOOOOOiiaaaaaWWWWWFFFbbbbbbFFIllll ",
- " IIII'''''' XXXXXXXXXXXmmm''^^cccccnIII eeedjjjjjoooogpggkkk````hhhhhhhhhS OOOOOOOOOOiiaaaaaqWWWqq rbbbbb lllllll ",
- " IIIII ''' XXXXX XXmsss'nnncccctuI eeevjwwwoooooxppgkk`````hhhhhhhhhS OyyOOOOOOiiaaaaaaaqqqqqzzbbbbbb{lllllll ",
- " IIII||| }~mssssnnnncctt\u007f eeevjwwwoooooxppp\u0080\u0080`````hhhhhhhhh OyyyyyOOO\u0081\u0081\u0081\u0081aa\u0081\u0081a\u0081\u0081q\u0081\u0081zzzzzbbb{lllllllll",
- " ||||| ~ssssssnnnn\u0082\u0082\u0082\u0083\u0083\u0084 evwwwwwoooo\u0085\u0085pp\u0080\u0080\u0080``\u0086\u0086\u0087hhhhhhhh yyyyy\u0088\u0088O\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081zzzzzzbbb{{llllllll",
- "IIII |III|| \u0089\u0089\u0089sssss\u0082nn\u0082\u0082\u0082\u0082\u0083\u0083\u0084\u008a wwwwwxoo\u0085\u0085\u0085\u0085p\u0080\u0080\u0080\u0080\u0086\u0086\u0086\u0086\u008bh\u008b\u008bhh yyyyy\u0088\u0088O\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081zzzzzz\u008c\u008c\u008c{{llllllll",
- "IIII|IIIII| \u0089\u0089\u0089\u0089sssss\u0089\u0082\u0082\u0082\u0082\u0082\u0083\u0083\u0083\u0084\u008a\u008a||\u008a\u008a wwww\u008dx\u0085\u0085\u0085\u0085\u0085\u0085\u008e\u0080\u0080\u0086\u0086\u0086\u0086\u0086\u008b\u008b\u008b\u008b\u008b\u008f\u008f yyyyy\u0088\u0088 \u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081zzzzz\u0081\u008c\u008c\u008c\u008c\u008c\u008c\u0090llllll",
- "IIII|IIIII| \u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0091\u0089\u0092\u0082\u0082\u0083\u0083\u0083\u0083\u0083\u0084\u008a\u008a|||\u008a\u008a \u008d\u008d\u0093\u0093\u0085\u0085\u0085\u0085\u0085\u0085\u008e\u0080\u0080\u0086\u0086\u0086\u0086\u0086\u0094\u0094\u008b\u008b\u008f\u008f\u008f\u008f \u0095\u0095\u0095\u0095y \u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081zzz\u0081\u0081\u008c\u008c\u008c\u008c\u008 [...]
- "I\u0097\u0097\u0097\u0097IIIII||\u0098\u0098\u0098\u0098 \u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0091\u0091\u0091\u008a\u008a\u008a\u008a\u0083\u0084\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u0099\u0099\u0099\u0099 \u0085\u0085\u0085\u0085\u0085\u008e\u008e\u009a\u009b\u009b\u0086\u0086\u0086\u0086\u0094\u0094\u0094\u008f\u008f\u008f\u008f\u008f\u008f\u0095\u0095\u0095\u0095\u0095\u0095 \u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0 [...]
- "I\u0097\u0097\u0097\u0097\u0097III||||\u0098\u0098\u0098\u0098 \u0089\u0089\u0089\u0089\u0089\u0091\u0091\u0091\u0091\u0091\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u0099\u0099\u0099\u0099\u0099 \u009d\u0085\u0085\u0085\u008e\u008e\u009a\u009a\u009a\u009b\u0094\u0086\u0086\u0094\u0094\u0094\u0094\u008f\u008f\u008f\u008f\u008f\u008f\u0095\u0095\u0095\u0095\u0095\u0095 \u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u00 [...]
- "\u009e\u009f\u009f\u009f\u009f\u0097\u00a0||||||\u0098\u0098\u0098\u0098\u0098 \u0089 \u0089\u0091\u0091\u0091\u0091\u0091\u0091\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u0099\u0099\u0099\u0099\u0099 \u009d\u00a1\u00a1\u00a1\u00a1\u009a\u00a2\u00a2\u00a2\u00a2\u0094\u0094\u0094\u0094\u0094\u008f\u008f\u008f\u008f\u008f\u008f\u0095\u0095\u0095\u0095\u0095\u0095 \u00a3\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u009c\u [...]
- "\u009e\u009f\u009f\u009f\u009f\u009f\u00a0|||||||\u0098\u0098\u0098\u0098 \u0091\u0091\u0091\u0091\u0091\u00a5\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u0099\u0099\u0099\u0099\u0099\u0099\u0099 \u00a1\u00a1\u00a1\u00a1\u00a1\u00a2\u00a2\u00a2\u00a2\u00a2\u0094\u0094\u0094\u0094\u008f\u008f\u008f\u008f\u008f\u008f \u0095\u0095\u0095\u0095 \u00a3\u00a3\u00a3\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u009c\u009c\u009c\u009c\u00 [...]
- "\u009f\u009f\u009f\u009f\u009f\u009f\u00a0\u00a0|||||\u0098\u0098\u0098\u0098 \u0091\u0091\u0091\u0091\u00a5\u00a5\u00a5\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u0099\u0099\u0099\u0099\u0099\u0099\u0099 \u00a1\u00a1\u00a1\u00a1\u00a1\u00a1\u00a2\u00a6\u00a6\u00a6\u00a6\u0094\u0094\u0094\u008f\u008f\u008f\u00a7\u008f\u00a7\u00a7\u00a7\u00a7\u0095\u0095 \u00a3\u00a3\u00a3\u00a3\u00a8\u00a8\u0081\u0081\u0081\u0081\u0081\u009c\u009c [...]
- "\u009e\u009f\u009f\u009f\u009f\u009f\u00a0\u00a0\u0098|||\u0098\u0098\u0098\u0098\u0098 \u0091\u0091\u00a5\u00a5\u00a5\u00a9\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u0099\u0099\u0099\u0099\u0099 \u00a1\u00a1\u00a1\u00aa\u00aa\u00aa\u00a2\u00a6\u00a6\u00a6\u00a6\u00ab\u00ab\u00ab\u008f\u008f\u00ac\u00ac\u00ac\u00ac\u00a7\u00a7\u00a7 \u00a3\u00a3\u00a3\u00a3\u00a8\u00a8\u00ad\u00ad\u00ad\u0081\u0081\u0081\u0081\u00ad\u00ad\u [...]
- "\u009e\u009e\u009f\u009f\u009f\u00af\u00af\u00a0\u0098\u0098\u0098\u0098\u0098\u0098\u0098\u0098\u0098\u00b0\u00b0\u00b0\u00b0\u00b0 \u00b1\u00a5\u00a9\u00a9\u00a9\u00a9\u00a9\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u0099\u0099\u0099\u0099\u0099 \u00a1\u00a1\u00aa\u00aa\u00aa\u00aa\u00a6\u00a6\u00a6\u00a6\u00a6\u00a6\u00ab\u00ab\u00ab\u00ab\u00ac\u00ac\u00ac\u00ac\u00ac\u00a7\u00a7\u00a7 \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00 [...]
- "\u00b3\u00b3\u00b3\u00b3\u00b3\u00af\u00a0\u0098\u0098\u0098\u0098\u0098\u0098\u0098\u0098\u0098\u00b0\u00b0\u00b0\u00b0\u00b0\u00b0 \u00b1\u00b1\u00b1\u00b1\u00b1 \u00b1\u00b1\u00b1\u00b1 \u00b1\u00a5\u00a9\u00a9\u00a9\u00a9\u00a9\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a\u008a \u0099\u0099\u0099 \u00a1\u00aa\u00aa\u00aa\u00aa\u00aa\u00a6\u00a6\u00a6\u00a6\u00b4\u00ab\u00ab\u00ab\u00b5\u00ac\u00ac\u00ac\u00ac\u00ac\u00a7\u00a7 \u00ad\u00ad\u00ad\u00 [...]
- "\u00b3\u00b3\u00b3\u00b3\u00b3\u00af\u00a0\u00a0\u0098\u0098\u0098\u0098\u0098\u0098\u0098\u0098\u00b0\u00b0\u00b0\u00b0\u00b0\u00b0\u00b0\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1 \u00b1\u00b1\u00b1\u00b1\u00b1 \u00b1\u00b6\u00a9\u00a9\u00a9\u00a9\u00a9\u008a\u008a\u008a\u008a\u008a \u008a\u008a\u008a\u008a \u0099\u0099 \u00aa\u00aa\u00aa\u00aa\u00aa\u00a6\u00a6\u00a6\u00a6\u00b7\u00b4\u00b5\u00b5\u00b5\u00ac\u00ac\u00ac\u00ac\u00a7\u00a7\u00a7 \u00ad\u00ad\u00ad\u00 [...]
- "\u00b9\u00b3\u00b3\u00b3 \u00a0\u00a0\u0098\u0098\u0098\u0098\u0098\u0098\u0098\u0098\u00b0\u00b0\u00b0\u00b0\u00b0\u00b0 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b6\u00a9\u00a9\u00ba\u00ba\u00ba\u008a\u008a\u008a\u008a\u008a \u0099\u0099 \u00aa\u00aa\u00aa\u00bb\u00b7\u00b7\u00b7\u00b7\u00b7\u00b4 \u00ac\u00ac \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\ [...]
- "\u00b9\u00b9\u00b9\u00b9 \u0098\u0098\u0098\u0098\u0098\u0098\u00b0\u00b0\u00b0\u00b0\u00b0\u00b0 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b6\u00ba\u00ba\u00ba\u00ba\u00ba\u008a\u008a\u008a \u00bc\u00bc\u00bd\u00b7\u00b7\u00b7\u00b7\u00b7 \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00b8\u00b8\u00b8\u00b9\u00b9\u00b9 ",
- "\u00b9\u00b9\u00b9\u00b9 \u0098\u0098\u0098\u0098 \u00b1\u00b1\u00b1\u00b1 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00ba\u00ba\u00ba\u00ba\u00ba\u008a\u008a \u0099\u0099 \u00bc\u00bd\u00bd\u00b7\u00b7\u00b7 \u00ab\u00ab \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00b8\u00b9\u00b9\u00b9\u00b9\u00b9",
- "\u00b9\u00b9\u00b9 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00ba\u00ba\u00ba\u00ba\u00ba \u0099\u0099\u0099\u0099 \u00bc\u00bc\u00bd\u00bd\u00bd \u00ab\u00ab\u00ab\u00ab \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad \u00ad\u00ad\u00ad\u00ad\u00b9\u00b9\u00b9\u00b9\u00b9",
- " \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00ba\u00ba\u00ba\u00ba \u0099\u0099\u0099\u0099\u0099\u0099 \u00ab\u00ab\u00ab\u00ab\u00ab \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad \u00b9\u00b9\u00b9\u00b9\u00b9",
- "\u00b9\u00b9\u00b9 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b6\u00b6\u00b6\u00b6 \u0099\u0099\u0099\u0099\u0099 \u00ab\u00ab\u00ab\u00ab\u00ab\u00ab \u00ad\u00ad\u00ad\u00ad\u00ad \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad \u00b9\u00b9\u00b9\u00b9",
- "\u00b9\u00b9\u00b9\u00b9 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b6\u00b6\u00b6\u00b6 \u0099\u0099\u0099\u0099\u0099 \u00ab\u00ab \u00ab\u00ab\u00ab\u00ab \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad \u00b9\u00b9\u00b9\u00b9\u00b9\u00b9",
- "\u00b9\u00b9\u00b9\u00b9 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b6\u00b6\u00b6 \u0099\u0099\u0099\u0099 \u00bc\u00bc\u00bc\u00bc\u00ab\u00ab\u00ab\u00ab\u00ab \u00ab\u00ab\u00ab\u00ab \u00ad\u00ad\u00ad\u00ad\u00ad\u00ad\u00ad \u00b9\u00b9\u00b9\u00b9\u00b9\u00b9\u00b9",
- "\u00b9\u00b9\u00b9\u00b9 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1 \u0099\u0099 \u00bc\u00bc\u00bc\u00bc\u00bc\u00ab\u00ab\u00ab\u00ab\u00ab \u00ab\u00ab\u00ab\u00ab \u00ad\u00ad\u00ad\u00ad\u00ad \u00b9\u00b9\u00b9\u00b9\u00b9\u00b9\u00b9",
- "\u00b9\u00b9\u00b9\u00b9 \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1 \u00be\u00be \u00bc\u00bc\u00bc\u00bc\u00bc\u00ab\u00ab\u00ab\u00ab\u00ab\u00ab\u00ab\u00ab\u00ab\u00ab\u00ab\u00ab \u00ad\u00ad\u00ad\u00ad \u00b9\u00b9\u00b9\u00b9\u00b9\u00b9\u00b9",
- " \u00b9\u00b9 \u00b1\u00b1\u00b1\u00b1\u00b1\u00be\u00be\u00be\u00be\u00be\u00be \u00bc\u00bc\u00bc\u00bc\u00bc\u00ab\u00ab\u00ab\u00ab\u00ab \u00ab\u00ab\u00ab\u00bf\u00bf\u00bf \u00b9\u00b9\u00b9\u00b9\u00b9\u00b9\u00b9",
- " \u00b1\u00b1\u00b1\u00b1\u00b1\u00be\u00be\u00be\u00be\u00be\u00be \u00c0\u00c0\u00c0 \u00c1\u00c1\u00c1 \u00bc\u00bc\u00bc \u00ab\u00ab\u00ab \u00ab\u00ab\u00bf\u00bf\u00bf\u00bf\u00bf \u00ad\u00b9\u00b9\u00b9\u00b9\u00b9\u00b9\u00b9",
- " \u00b1\u00b1\u00b1\u00b1\u00b1\u00be\u00be\u00be\u00be\u00be\u00be \u00c0\u00c0\u00c0\u00c0\u00c0\u00c0\u00c0 \u00c1\u00c1\u00c1\u00c1\u00c1 \u00ab\u00bf\u00bf\u00bf\u00bf\u00bf \u00ad\u00ad\u00b9\u00b9\u00b9\u00b9\u00b9\u00b9\u00b9",
- " \u00b1\u00b1\u00b1\u00b1\u00b1\u00be\u00be\u00be\u00be\u00be\u00be \u00c0\u00c0\u00c0\u00c0\u00c0\u00c0\u00c0\u00c0 \u00c1\u00c1\u00c1\u00c1\u00c1 \u00bf\u00bf\u00bf\u00bf\u00bf \u00ad\u00ad\u00ad\u00ad\u00b9\u00b9\u00b9\u00b9\u00b9 ",
- " \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00be\u00be\u00be \u00c0\u00c0\u00c0\u00c0\u00c0\u00c0\u00c0\u00c0 \u00c1\u00c1\u00c1\u00c1\u00c1 \u00bf\u00bf\u00bf\u00bf\u00bf \u00ad\u00ad\u00ad\u00ad\u00ad\u00b9\u00b9\u00b9 ",
- " \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b6 \u00c0\u00c0\u00c0\u00c0\u00c0\u00c0\u00c0\u00c0\u00c0 \u00c1\u00c1\u00c1 \u00ad\u00ad\u00ad\u00ad ",
- " \u00b1\u00b1\u00b1\u00b1 \u00c0\u00c0\u00c0\u00c0\u00c0\u00c0 ",
- " \u00c0\u00c0\u00c0\u00c0\u00c0 ",
- " \u00c0\u00c0\u00c0\u00c0 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-with-background-image-257-256-1.0-grid-reference.json b/tests/visual_tests/grids/marker-with-background-image-257-256-1.0-grid-reference.json
deleted file mode 100644
index 65e3606..0000000
--- a/tests/visual_tests/grids/marker-with-background-image-257-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!!!!!! ",
- " !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-with-background-image-257-256-2.0-grid-reference.json b/tests/visual_tests/grids/marker-with-background-image-257-256-2.0-grid-reference.json
deleted file mode 100644
index 188ba47..0000000
--- a/tests/visual_tests/grids/marker-with-background-image-257-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "keys": [
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-with-background-image-400-600-1.0-grid-reference.json b/tests/visual_tests/grids/marker-with-background-image-400-600-1.0-grid-reference.json
deleted file mode 100644
index f2542d6..0000000
--- a/tests/visual_tests/grids/marker-with-background-image-400-600-1.0-grid-reference.json
+++ /dev/null
@@ -1,159 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-with-background-image-400-600-2.0-grid-reference.json b/tests/visual_tests/grids/marker-with-background-image-400-600-2.0-grid-reference.json
deleted file mode 100644
index 4e13fbe..0000000
--- a/tests/visual_tests/grids/marker-with-background-image-400-600-2.0-grid-reference.json
+++ /dev/null
@@ -1,159 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-with-background-image-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/marker-with-background-image-600-400-1.0-grid-reference.json
deleted file mode 100644
index 0d1bf21..0000000
--- a/tests/visual_tests/grids/marker-with-background-image-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-with-background-image-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/marker-with-background-image-600-400-2.0-grid-reference.json
deleted file mode 100644
index 06038d0..0000000
--- a/tests/visual_tests/grids/marker-with-background-image-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-257-256-1.0-grid-reference.json b/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-257-256-1.0-grid-reference.json
deleted file mode 100644
index 65e3606..0000000
--- a/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-257-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!!!!!! ",
- " !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-257-256-2.0-grid-reference.json b/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-257-256-2.0-grid-reference.json
deleted file mode 100644
index 188ba47..0000000
--- a/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-257-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "keys": [
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-400-600-1.0-grid-reference.json b/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-400-600-1.0-grid-reference.json
deleted file mode 100644
index f2542d6..0000000
--- a/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-400-600-1.0-grid-reference.json
+++ /dev/null
@@ -1,159 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-400-600-2.0-grid-reference.json b/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-400-600-2.0-grid-reference.json
deleted file mode 100644
index 4e13fbe..0000000
--- a/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-400-600-2.0-grid-reference.json
+++ /dev/null
@@ -1,159 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-600-400-1.0-grid-reference.json
deleted file mode 100644
index 0d1bf21..0000000
--- a/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-600-400-2.0-grid-reference.json
deleted file mode 100644
index 06038d0..0000000
--- a/tests/visual_tests/grids/marker-with-background-image-and-hsla-transform-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-with-background-image-linear-comp-op-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/marker-with-background-image-linear-comp-op-500-100-1.0-grid-reference.json
deleted file mode 100644
index c246577..0000000
--- a/tests/visual_tests/grids/marker-with-background-image-linear-comp-op-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker-with-background-image-linear-comp-op-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/marker-with-background-image-linear-comp-op-500-100-2.0-grid-reference.json
deleted file mode 100644
index 96e3a03..0000000
--- a/tests/visual_tests/grids/marker-with-background-image-linear-comp-op-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "keys": [
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker_line_placement_on_points-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/marker_line_placement_on_points-500-100-1.0-grid-reference.json
deleted file mode 100644
index 6e3fccb..0000000
--- a/tests/visual_tests/grids/marker_line_placement_on_points-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
- "keys": [
- "",
- "4",
- "3",
- "6",
- "5",
- "7",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " !!!!!! ###### ",
- " !!!!! ##### ",
- " !! ## ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$ ",
- " $$$$$$ ",
- " $$$$$$$ ",
- " $$$$$$ ",
- " %%%$$%% ",
- " %%&&&&% ",
- " &&&&&& ",
- " &&&&&&& ",
- " &&&&&& ",
- " && ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ''' ((( ",
- " ''''' ((((( "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/marker_line_placement_on_points-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/marker_line_placement_on_points-500-100-2.0-grid-reference.json
deleted file mode 100644
index 472e243..0000000
--- a/tests/visual_tests/grids/marker_line_placement_on_points-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "keys": [
- "",
- "4",
- "3",
- "5",
- "1",
- "2"
- ],
- "data": {},
- "grid": [
- " !!!!!!!!!!! ########### ",
- " !!!!!!!!!!! ########### ",
- " !!!!!!!!!! ########## ",
- " !!!!!!!! ######## ",
- " !!!! #### ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$$$$$ ",
- " $$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$ ",
- " $$$$$$$$$$$ ",
- " $$$$$$$$ ",
- " ",
- " ",
- " ",
- " ",
- " %%%%% &&&&& ",
- " %%%%%%%%% &&&&&&&&& ",
- " %%%%%%%%%%% &&&&&&&&&&& ",
- " %%%%%%%%%%% &&&&&&&&&&& "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/orientation-800-200-1.0-grid-reference.json b/tests/visual_tests/grids/orientation-800-200-1.0-grid-reference.json
deleted file mode 100644
index a614346..0000000
--- a/tests/visual_tests/grids/orientation-800-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "2",
- "1",
- "8",
- "3",
- "4",
- "5",
- "6",
- "7",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ! ",
- " ! ",
- " # !! ",
- " $ ### %% %%% ! ",
- " $ # % % % !! ",
- " $ $$ # & & && %% % % !!! ",
- " $$$ $ ## & & & ' ( )) * % ! ++ + + ",
- " $ $ &&& &&& ( )) + + ++ ",
- " $$$ ### '' ( ) + + ++ ",
- " $ ### ' ' ( ( ) * * ** ",
- " '' ' ' ( ( )) * * * ",
- " '' ' ''' ( *** *** ",
- " ' '' ''' (( )) ",
- " ' ' '' ( ) ) ",
- " ' ' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/orientation-800-200-2.0-grid-reference.json b/tests/visual_tests/grids/orientation-800-200-2.0-grid-reference.json
deleted file mode 100644
index 7479bb6..0000000
--- a/tests/visual_tests/grids/orientation-800-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "8",
- "3",
- "4",
- "5",
- "6",
- "7",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ## # ",
- " !! # # # $ $$$ $$$$$$ ",
- " ! ! # # # $$ $ $$ $ $$ ",
- " ! ! # ## $$ $$$ $ ",
- " ! ! !! # # %%%%% % % % $$ $ $ ",
- " ! !!! ## % % % %% $$$ $ $ ",
- " ! ! !! ## %% % % % $ $ $ $ ",
- " !!! ! #### %% % % & ' ( ) $ * +++++ + + ++ ",
- " ! ! ## % % % % % ' (( ( + + + ++ ",
- " ! ! # % %% % % % '' ( ( ( ++ + +++ ",
- " !!!! # # ' ' ( ((( ++ + + ",
- " !!!!! ## ## ' ' ' ( (( + + + + + ",
- " ! ## ' ' ' ( ))))) ) ) ) +++++++ ++ + ++ ",
- " ! ## # ' '' (( ) ) ) ) ",
- " ! # # '' ' ' (( )) ) ))) ",
- " ' '' (((( )) ) ) ",
- " ' ' ( ) ) ) ) ) ",
- " ' ( )))))) )))) )) ",
- " ''''' ( ( ",
- " ' '' (( ( ",
- " ' (( ",
- " ' ( (( ",
- " ( ( ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/point-symbolizer-expressions-256-256-1.0-grid-reference.json b/tests/visual_tests/grids/point-symbolizer-expressions-256-256-1.0-grid-reference.json
deleted file mode 100644
index 2f66b21..0000000
--- a/tests/visual_tests/grids/point-symbolizer-expressions-256-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/point-symbolizer-expressions-256-256-2.0-grid-reference.json b/tests/visual_tests/grids/point-symbolizer-expressions-256-256-2.0-grid-reference.json
deleted file mode 100644
index 2f66b21..0000000
--- a/tests/visual_tests/grids/point-symbolizer-expressions-256-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/point-symbolizer-expressions-all-256-256-1.0-grid-reference.json b/tests/visual_tests/grids/point-symbolizer-expressions-all-256-256-1.0-grid-reference.json
deleted file mode 100644
index 2f66b21..0000000
--- a/tests/visual_tests/grids/point-symbolizer-expressions-all-256-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/point-symbolizer-expressions-all-256-256-2.0-grid-reference.json b/tests/visual_tests/grids/point-symbolizer-expressions-all-256-256-2.0-grid-reference.json
deleted file mode 100644
index 2f66b21..0000000
--- a/tests/visual_tests/grids/point-symbolizer-expressions-all-256-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/point-symbolizer-overlap-placement-expr-500-500-1.0-grid-reference.json b/tests/visual_tests/grids/point-symbolizer-overlap-placement-expr-500-500-1.0-grid-reference.json
deleted file mode 100644
index f0e53b1..0000000
--- a/tests/visual_tests/grids/point-symbolizer-overlap-placement-expr-500-500-1.0-grid-reference.json
+++ /dev/null
@@ -1,157 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "5",
- "7",
- "8",
- "9",
- "10",
- "11",
- "13",
- "15",
- "16",
- "17",
- "18",
- "19",
- "21",
- "22",
- "23",
- "25",
- "26",
- "27",
- "29",
- "30",
- "31"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!### $$$ %%% &&''' ",
- " !!!##### $$$$$ %%%%% &&''''' ",
- " !!!##### $$$$$ %%%%% &&''''' ",
- " !!!##### $$$$$ %%%%% &&''''' ",
- " !!!### $$$ %%% &&'''' ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " (()))) **** ++++ ,,,---- ",
- " ((())))) ***** +++++ ,,----- ",
- " ((())))) ***** +++++ ,,----- ",
- " (())))) ***** +++++ ,,,---- ",
- " (())) *** +++ ,,,-- ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " .../// 000 11222 333 ",
- " ...///// 00000 1122222 33333 ",
- " ...///// 00000 1122222 33333 ",
- " ...///// 00000 1122222 33333 ",
- " .../// 000 112222 333 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " 445555 6666 7778888 9999 ",
- " 44455555 66666 7788888 99999 ",
- " 44455555 66666 7788888 99999 ",
- " 4455555 66666 7778888 99999 ",
- " 44555 666 77788 999 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/point-symbolizer-overlap-placement-expr-500-500-2.0-grid-reference.json b/tests/visual_tests/grids/point-symbolizer-overlap-placement-expr-500-500-2.0-grid-reference.json
deleted file mode 100644
index ee39ee6..0000000
--- a/tests/visual_tests/grids/point-symbolizer-overlap-placement-expr-500-500-2.0-grid-reference.json
+++ /dev/null
@@ -1,157 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "5",
- "7",
- "8",
- "9",
- "10",
- "11",
- "13",
- "15",
- "16",
- "17",
- "18",
- "19",
- "21",
- "22",
- "23",
- "25",
- "26",
- "27",
- "29",
- "30",
- "31"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!###### $$$$$$ %%%%%% &&&'''''' ",
- " !!######## $$$$$$$$ %%%%%%%% &&&'''''''' ",
- " !!!######### $$$$$$$$$ %%%%%%%%% &&'''''''''' ",
- " !!########## $$$$$$$$$$ %%%%%%%%%% &&&'''''''''' ",
- " !!########## $$$$$$$$$$ %%%%%%%%%% &&&'''''''''' ",
- " !!########## $$$$$$$$$$ %%%%%%%%%% &&&'''''''''' ",
- " !!!######### $$$$$$$$$ %%%%%%%%% &&'''''''''' ",
- " !!######### $$$$$$$$$ %%%%%%%%% &&&'''''''' ",
- " !!####### $$$$$$$ %%%%%%% &&&'''''' ",
- " !!!### $$$ %%% &&'''' ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " (())))) ***** +++++ ,,,---- ",
- " ((())))))) ******* +++++++ ,,------- ",
- " ((())))))))) ********* +++++++++ ,,--------- ",
- " (()))))))))) ********** ++++++++++ ,,,---------- ",
- " (()))))))))) ********** ++++++++++ ,,,---------- ",
- " (()))))))))) ********** ++++++++++ ,,,---------- ",
- " (()))))))))) ********** ++++++++++ ,,,---------- ",
- " ((())))))))) ********* +++++++++ ,,--------- ",
- " ((())))))) ******* +++++++ ,,-------- ",
- " ((())))) ***** +++++ ,,------ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ..////// 000000 111222222 333333 ",
- " ..//////// 00000000 11122222222 33333333 ",
- " ...///////// 000000000 112222222222 333333333 ",
- " ..////////// 0000000000 1112222222222 3333333333 ",
- " ..////////// 0000000000 1112222222222 3333333333 ",
- " ..////////// 0000000000 1112222222222 3333333333 ",
- " ...///////// 000000000 112222222222 333333333 ",
- " ..///////// 000000000 11122222222 333333333 ",
- " ../////// 0000000 111222222 3333333 ",
- " .../// 000 112222 333 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " 4455555 66666 7778888 99999 ",
- " 4445555555 6666666 778888888 9999999 ",
- " 444555555555 666666666 77888888888 999999999 ",
- " 445555555555 6666666666 7778888888888 9999999999 ",
- " 445555555555 6666666666 7778888888888 9999999999 ",
- " 445555555555 6666666666 7778888888888 9999999999 ",
- " 445555555555 6666666666 7778888888888 9999999999 ",
- " 444555555555 666666666 77888888888 999999999 ",
- " 4445555555 6666666 7788888888 9999999 ",
- " 44455555 66666 77888888 99999 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/polygon-symbolizer-expressions-256-256-1.0-grid-reference.json b/tests/visual_tests/grids/polygon-symbolizer-expressions-256-256-1.0-grid-reference.json
deleted file mode 100644
index 2f66b21..0000000
--- a/tests/visual_tests/grids/polygon-symbolizer-expressions-256-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/polygon-symbolizer-expressions-256-256-2.0-grid-reference.json b/tests/visual_tests/grids/polygon-symbolizer-expressions-256-256-2.0-grid-reference.json
deleted file mode 100644
index 2f66b21..0000000
--- a/tests/visual_tests/grids/polygon-symbolizer-expressions-256-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/polygon-symbolizer-expressions-all-256-256-1.0-grid-reference.json b/tests/visual_tests/grids/polygon-symbolizer-expressions-all-256-256-1.0-grid-reference.json
deleted file mode 100644
index 2f66b21..0000000
--- a/tests/visual_tests/grids/polygon-symbolizer-expressions-all-256-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/polygon-symbolizer-expressions-all-256-256-2.0-grid-reference.json b/tests/visual_tests/grids/polygon-symbolizer-expressions-all-256-256-2.0-grid-reference.json
deleted file mode 100644
index 2f66b21..0000000
--- a/tests/visual_tests/grids/polygon-symbolizer-expressions-all-256-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/polygon-winding-order-300-300-1.0-grid-reference.json b/tests/visual_tests/grids/polygon-winding-order-300-300-1.0-grid-reference.json
deleted file mode 100644
index 2d2a4af..0000000
--- a/tests/visual_tests/grids/polygon-winding-order-300-300-1.0-grid-reference.json
+++ /dev/null
@@ -1,84 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/polygon-winding-order-300-300-2.0-grid-reference.json b/tests/visual_tests/grids/polygon-winding-order-300-300-2.0-grid-reference.json
deleted file mode 100644
index 2d2a4af..0000000
--- a/tests/visual_tests/grids/polygon-winding-order-300-300-2.0-grid-reference.json
+++ /dev/null
@@ -1,84 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/postgis-inline-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/postgis-inline-512-512-1.0-grid-reference.json
deleted file mode 100644
index 4d3e1df..0000000
--- a/tests/visual_tests/grids/postgis-inline-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!! ",
- " !!! !! ! ",
- " !! ! !! ! ",
- " ! ! ! ! ",
- " ! ! ! ",
- " ! !!!!! ! ",
- " ! ",
- " ! !! ",
- " ! ",
- " ! ",
- " ! ",
- " !! ",
- " ! !!!!! ",
- " ! ! ",
- " ! ! ! ",
- " ! ! ",
- " ",
- " ! ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! !!!!!! !!!! ! ",
- " ! ! !!! !!! ",
- " !! !!!! ",
- " ! !!!!!! ",
- " ! !!!! ",
- " ",
- " ! ",
- " ",
- " ! ",
- " ",
- " ! ",
- " ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ",
- " ! ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ",
- " ",
- " ",
- "! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/postgis-inline-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/postgis-inline-512-512-2.0-grid-reference.json
deleted file mode 100644
index 04ce50f..0000000
--- a/tests/visual_tests/grids/postgis-inline-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!! ",
- " !!!! !!! !! ",
- " !! ! !!! ! ",
- " ! ! !! !! ",
- " ! ! ! ! ",
- " ! !!!!! ! ",
- " ! !! ",
- " ! !!! ",
- " !! !",
- " ! ",
- " ! ",
- " !! ! ",
- " ! !!!!!! ",
- " !! ! ",
- " !! ! ! ",
- " ! ! !!! ",
- " ! !!!! ",
- " ! ! !!!!! ",
- " ! ! !!!!! ",
- " ! ! !!!!! ",
- " ! ! !!!!!!!!!!!!!! !!!!!!! ",
- " ! !! !!! !!!! !!!!!!!!! ",
- " !! !!!!!!! ",
- " ! !! !!!!!! ",
- " ! !! ",
- " ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ",
- " ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ! ",
- " ",
- " ! ",
- "! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/raster-color-to-alpha1-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/raster-color-to-alpha1-512-512-1.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/raster-color-to-alpha1-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/raster-color-to-alpha1-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/raster-color-to-alpha1-512-512-2.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/raster-color-to-alpha1-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/raster-color-to-alpha2-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/raster-color-to-alpha2-512-512-1.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/raster-color-to-alpha2-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/raster-color-to-alpha2-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/raster-color-to-alpha2-512-512-2.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/raster-color-to-alpha2-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/raster-color-to-alpha3-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/raster-color-to-alpha3-512-512-1.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/raster-color-to-alpha3-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/raster-color-to-alpha3-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/raster-color-to-alpha3-512-512-2.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/raster-color-to-alpha3-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/raster-color-to-alpha4-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/raster-color-to-alpha4-512-512-1.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/raster-color-to-alpha4-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/raster-color-to-alpha4-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/raster-color-to-alpha4-512-512-2.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/raster-color-to-alpha4-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/raster-color-to-alpha5-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/raster-color-to-alpha5-512-512-1.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/raster-color-to-alpha5-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/raster-color-to-alpha5-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/raster-color-to-alpha5-512-512-2.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/raster-color-to-alpha5-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/raster_colorizer-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/raster_colorizer-512-512-1.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/raster_colorizer-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/raster_colorizer-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/raster_colorizer-512-512-2.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/raster_colorizer-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/raster_symbolizer-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/raster_symbolizer-512-512-1.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/raster_symbolizer-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/raster_symbolizer-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/raster_symbolizer-512-512-2.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/raster_symbolizer-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/repeat-labels-1-750-250-1.0-grid-reference.json b/tests/visual_tests/grids/repeat-labels-1-750-250-1.0-grid-reference.json
deleted file mode 100644
index 77d5e13..0000000
--- a/tests/visual_tests/grids/repeat-labels-1-750-250-1.0-grid-reference.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "keys": [
- "",
- "7",
- "5",
- "6",
- "1",
- "2",
- "8",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " #### #### ##### #### #### #### ",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- " #### #### # ##### # #### # #### # #### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " % & ",
- " %%% &&& ",
- " %%% &&& ",
- " ",
- " ",
- "'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ",
- " ",
- " ( ) ",
- " ((( ))) ",
- " ((( ))) ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/repeat-labels-1-750-250-2.0-grid-reference.json b/tests/visual_tests/grids/repeat-labels-1-750-250-2.0-grid-reference.json
deleted file mode 100644
index 9204c76..0000000
--- a/tests/visual_tests/grids/repeat-labels-1-750-250-2.0-grid-reference.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "keys": [
- "",
- "7",
- "5",
- "6",
- "1",
- "2",
- "8",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!! !! !! !! ! !! ! ! ! ! !!! !!! !! !! ! !! ! ! ! ! ! ",
- " ! !! ",
- " ",
- " ######## ######## ",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- " ######## # # ######## ",
- " # # ",
- " ",
- " ",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%% &&& ",
- " %%%%% &&&&& ",
- " %%%%% &&&&& ",
- " %%%%% &&&&& ",
- " %%%% &&&&& ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '''' ",
- " '''' ",
- " '''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '''' ",
- " '''' ",
- " '''' ",
- " '''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ((( ))) ",
- " ((((( ))))) ",
- " ((((( ))))) ",
- " ((((( ))))) ",
- " (((( ))))) ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/repeat-labels-2-750-250-1.0-grid-reference.json b/tests/visual_tests/grids/repeat-labels-2-750-250-1.0-grid-reference.json
deleted file mode 100644
index 792acf9..0000000
--- a/tests/visual_tests/grids/repeat-labels-2-750-250-1.0-grid-reference.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "keys": [
- "",
- "7",
- "5",
- "6",
- "1",
- "2",
- "8",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ",
- " ",
- " #### #### ##### #### #### #### ",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- " #### #### ##### #### #### #### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " % & ",
- " %%% &&& ",
- " %%% &&& ",
- " ",
- " ",
- "'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ",
- " ",
- " ( ) ",
- " ((( ))) ",
- " ((( ))) ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/repeat-labels-2-750-250-2.0-grid-reference.json b/tests/visual_tests/grids/repeat-labels-2-750-250-2.0-grid-reference.json
deleted file mode 100644
index 8731edd..0000000
--- a/tests/visual_tests/grids/repeat-labels-2-750-250-2.0-grid-reference.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "keys": [
- "",
- "7",
- "5",
- "6",
- "1",
- "2",
- "8",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ",
- " ",
- " ",
- " ######## ######## ",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- " ######## ######## ",
- " ",
- " ",
- " ",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%% &&& ",
- " %%%%% &&&&& ",
- " %%%%% &&&&& ",
- " %%%%% &&&&& ",
- " %%%% &&&&& ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '''' ",
- " '''' ",
- " '''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '''' ",
- " '''' ",
- " '''' ",
- " '''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ((( ))) ' ' ",
- " ((((( ))))) ",
- " ((((( ))))) ",
- " ((((( ))))) ",
- " (((( ))))) ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/repeat-labels-3-750-250-1.0-grid-reference.json b/tests/visual_tests/grids/repeat-labels-3-750-250-1.0-grid-reference.json
deleted file mode 100644
index e3ae328..0000000
--- a/tests/visual_tests/grids/repeat-labels-3-750-250-1.0-grid-reference.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "keys": [
- "",
- "7",
- "5",
- "6",
- "1",
- "2",
- "8",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!! ! ! !!!! ! ! !!!!! ! ! ! !!!! ! ! ! ! !!!! ! ! ! ! !!!!! ",
- " ",
- " ",
- " ",
- " ",
- " #### #### ##### #### #### #### ",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- " #### #### # ##### # #### # #### # #### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " % & ",
- " %%% &&& ",
- " %%% &&& ",
- " ",
- " ",
- "'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ",
- " ",
- " ( ) ",
- " ((( ))) ",
- " ((( ))) ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/repeat-labels-3-750-250-2.0-grid-reference.json b/tests/visual_tests/grids/repeat-labels-3-750-250-2.0-grid-reference.json
deleted file mode 100644
index 761e4f6..0000000
--- a/tests/visual_tests/grids/repeat-labels-3-750-250-2.0-grid-reference.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "keys": [
- "",
- "7",
- "5",
- "6",
- "1",
- "2",
- "8",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!! !!!!!!!! !!!!!!!! ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!! !! !! !! ! !! ! ! ! ! ! !!!!!!!! !!! !!! !! !! ! !! ! ! ! ! ! !!!!!!!! ",
- " ! !! ",
- " ",
- " ######## ######## ######## ",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- " ######## # ######## # ######## ",
- " # # ",
- " ",
- " ",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%% &&& ",
- " %%%%% &&&&& ",
- " %%%%% &&&&& ",
- " %%%%% &&&&& ",
- " %%%% &&&&& ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '''' ",
- " '''' ",
- " '''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '''' ",
- " '''' ",
- " '''' ",
- " '''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ((( ))) ' ' ' ",
- " ((((( ))))) ",
- " ((((( ))))) ",
- " ((((( ))))) ",
- " (((( ))))) ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/repeat-labels-4-750-250-1.0-grid-reference.json b/tests/visual_tests/grids/repeat-labels-4-750-250-1.0-grid-reference.json
deleted file mode 100644
index 80e62ed..0000000
--- a/tests/visual_tests/grids/repeat-labels-4-750-250-1.0-grid-reference.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "keys": [
- "",
- "7",
- "5",
- "6",
- "1",
- "2",
- "8",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!! ! ! ! !!!! ! ! ! !!!!! ! ! ! !!!! ! ! ! ! !!!! ! ! ! ! !!!! ",
- " ",
- " ",
- " ",
- " ",
- " #### #### ##### #### #### #### ",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- " #### # #### # ##### # #### # #### # #### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " % & ",
- " %%% &&& ",
- " %%% &&& ",
- " ",
- " ",
- "'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '' ",
- " '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ",
- " ",
- " ( ) ",
- " ((( ))) ",
- " ((( ))) ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/repeat-labels-4-750-250-2.0-grid-reference.json b/tests/visual_tests/grids/repeat-labels-4-750-250-2.0-grid-reference.json
deleted file mode 100644
index 761f2aa..0000000
--- a/tests/visual_tests/grids/repeat-labels-4-750-250-2.0-grid-reference.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "keys": [
- "",
- "7",
- "5",
- "6",
- "1",
- "2",
- "8",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!! !!!!!!!! !!!!!!!! ",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!! !!! !! !! !! ! !! ! ! ! ! !!!!!!!! !!! !! !!! !! ! ! !!! ! ! ! !!!!!!!! ",
- " ! ! ",
- " ",
- " ######## ######## ######## ",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- "############################################################################################################################################################################################",
- " ######## # ######## # ######## ",
- " # # ",
- " ",
- " ",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%% &&& ",
- " %%%%% &&&&& ",
- " %%%%% &&&&& ",
- " %%%%% &&&&& ",
- " %%%% &&&&& ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- "''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '''' ",
- " '''' ",
- " '''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ",
- " '''' ",
- " '''' ",
- " '''' ",
- " '''' ",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",
- " ((( ))) ' ' ' ' ",
- " ((((( ))))) ",
- " ((((( ))))) ",
- " ((((( ))))) ",
- " (((( ))))) ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/road-casings-grouped-rendering-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/road-casings-grouped-rendering-500-100-1.0-grid-reference.json
deleted file mode 100644
index 24cbf90..0000000
--- a/tests/visual_tests/grids/road-casings-grouped-rendering-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,344 +0,0 @@
-{
- "keys": [
- "",
- "836",
- "840",
- "690",
- "525",
- "523",
- "528",
- "490",
- "472",
- "415",
- "599",
- "598",
- "154",
- "159",
- "153",
- "100",
- "102",
- "108",
- "122",
- "110",
- "113",
- "737",
- "481",
- "473",
- "57",
- "1",
- "72",
- "200",
- "269",
- "228",
- "173",
- "174",
- "687",
- "483",
- "551",
- "583",
- "480",
- "479",
- "401",
- "421",
- "389",
- "749",
- "774",
- "179",
- "851",
- "586",
- "620",
- "548",
- "535",
- "582",
- "325",
- "324",
- "445",
- "393",
- "839",
- "440",
- "268",
- "482",
- "633",
- "634",
- "466",
- "671",
- "462",
- "448",
- "333",
- "326",
- "146",
- "16",
- "25",
- "356",
- "261",
- "238",
- "248",
- "767",
- "849",
- "577",
- "484",
- "471",
- "469",
- "332",
- "378",
- "225",
- "188",
- "175",
- "585",
- "668",
- "665",
- "550",
- "485",
- "570",
- "562",
- "575",
- "131",
- "354",
- "284",
- "285",
- "553",
- "850",
- "739",
- "587",
- "486",
- "632",
- "373",
- "133",
- "41",
- "358",
- "260",
- "177",
- "641",
- "615",
- "95",
- "121",
- "376",
- "56",
- "788",
- "359",
- "236",
- "686",
- "786",
- "692",
- "578",
- "614",
- "579",
- "673",
- "50",
- "92",
- "58",
- "357",
- "212",
- "847",
- "827",
- "664",
- "645",
- "607",
- "505",
- "743",
- "493",
- "841",
- "439",
- "438",
- "214",
- "213",
- "254",
- "835",
- "165",
- "647",
- "626",
- "494",
- "39",
- "5",
- "54",
- "158",
- "317",
- "252",
- "753",
- "838",
- "769",
- "223",
- "784",
- "631",
- "621",
- "674",
- "77",
- "36",
- "304",
- "118",
- "52",
- "773",
- "224",
- "255",
- "727",
- "139",
- "624",
- "628",
- "666",
- "453",
- "295",
- "292",
- "3",
- "123",
- "732",
- "830",
- "771",
- "845",
- "623",
- "613",
- "629",
- "580",
- "144",
- "459",
- "294",
- "23",
- "27",
- "125",
- "844",
- "184",
- "545",
- "507",
- "616",
- "606",
- "681",
- "65",
- "48",
- "35",
- "37",
- "63",
- "831",
- "740",
- "842",
- "221",
- "166",
- "501",
- "142",
- "506",
- "680",
- "26",
- "444",
- "730",
- "742",
- "826",
- "556",
- "117",
- "755",
- "20",
- "699",
- "822",
- "701",
- "808",
- "311",
- "780",
- "170",
- "234",
- "33",
- "569",
- "516",
- "713",
- "705",
- "744",
- "725",
- "350",
- "310",
- "349",
- "192",
- "719",
- "185",
- "552",
- "559",
- "546",
- "643",
- "684",
- "24",
- "706",
- "750",
- "795",
- "818",
- "712",
- "351",
- "683",
- "206",
- "190",
- "689",
- "105",
- "32",
- "34",
- "759",
- "810",
- "819",
- "791",
- "707",
- "852",
- "290",
- "235",
- "160",
- "536",
- "98",
- "44",
- "541",
- "346",
- "811",
- "297",
- "778",
- "169",
- "162",
- "163",
- "752",
- "748",
- "809",
- "805",
- "341",
- "18",
- "167",
- "168",
- "109",
- "112",
- "67",
- "537",
- "829",
- "828",
- "496",
- "540",
- "561",
- "709",
- "340",
- "70",
- "161",
- "176",
- "754",
- "432",
- "306",
- "164",
- "178",
- "824"
- ],
- "data": {},
- "grid": [
- " !#$ %%%& ' ( ) *+,---./01112233344555555555 ",
- " # 6 %%%' (( 7) 8 ****./911:; <=> ?? @ ",
- " !#A$ BB%%(( C77DEF GH /I9JK:L <> ? @@ ",
- " # M$NN OO( PCQQR 8S TU/V9W:XL <Y> ?? @ ",
- " !#M$NB BOZ[]^^_`8abcd/e99fgL <hh ij? @ ",
- " k#lM6N mmnQop^88qaqrre9fffL <<s> ? tt u ",
- " # MM6 vm ZwQxyz{|}~//e9ff\u007fgL <\u0080> \u0081tuuu ",
- " \u0082 ! l\u0083\u0084 \u0085\u0085v ))\u0086\u0087 \u0088\u0089~/\u008a9fff\u007f\u008bL <\u0080>\u008c \u0081\u0081 \u008d\u008d\u008d ",
- " \u0082\u0082 !# NA$\u008e \u0085v \u008fz \u0089\u0089\u0090\u0091\u0092\u0093ff\u0094\u007f\u0095 LLL\u0096\u0096\u0096\u0081\u0081\u008d\u008d\u0097\u0097\u0098\u0099\u0098 ",
- " \u0082\u0082 !# N\u009am $$ \u0085\u0085\u008f\u009b\u009c \u009d\u0089\u009e\u009f\u00a0\u0093\u0093ffK\u007f\u00a1\u007f\u00a2 \u0097\u0098\u0099\u0098\u0099\u0099 \u00a3\u00a4 ",
- " \u0082 !#\u009a\u00a5\u00a6\u00a7\u00a8 \u00a9\u00a9 \u008f\u008f\u00aa }\u0089\u009e\u009e\u009f\u009f\u0093\u0093f\u00ab\u0094\u00ac\u00ad\u00a2\u00ae\u00af\u00b0\u00b1\u0098\u0097\u0098\u0099 \u00a3\u00a4\u00a4\u00b2\u00b2 ",
- " \u0082\u0082 ! \u00b3\u00a5\u00b4\u00b4\u00a8 A$\u008f\u00b5\u00aa \u0089\u0089\u00b6\u00b7\u009f\u009f\u00b8\u00b8\u00b9\u00ba\u0094K \u007f\u00bb\u00bc\u00bd\u00be\u00bf\u0099\u0099 \u00c0\u00a3\u00a4\u00a4\u00b2\u00b2 ",
- " \u0082\u0082 !#\u00a7\u00a5\u00c1 \u00c2\u00a8\u008f\u00c3\u00c4\u00c4\u0089\u0089\u009e\u00c5\u00c6\u00c6\u00c7\u00b8\u00c8\u00b9#\u00c9\u0094\u00b1\u00bc\u00bb\u00bb\u00ca\u00cb\u00cb\u0099\u00a3\u00c0\u00a3\u00a4\u00b2\u00b2 ",
- " \u0082 \u00cc#\u00cd\u00ce \u00cf\u00c2\u008f\u00d0\u00c4\u00c4\u0089\u0089\u009e\u00c5\u00d1\u00d2\u00d3\u00c7\u00d4\u00d4\u00d5#\u00d6\u00d7\u00d8\u00be \u00cb\u00cb\u00cb\u00c0\u00d9\u00a3\u00a4 \u00b2\u00b2 ",
- " \u0082\u0082 \u00cc#\u00cd\u00da\u00db\u00dc \u00c4\u00c4\u00dd\u0089\u009e\u00de\u00df\u00e0\u00d2\u00d2\u00c7\u00e1\u00e2\u00e3\u00d6\u00d6\u00d7\u00d8\u00cb\u00cb \u00e4\u00e4\u00a3\u00a4\u00e5\u00b2\u00b2 ",
- " \u0082\u0082\u00e6 \u00cc!\u00cd\u00e7\u00e8 \u00e9\u00ea\u00eb\u0089\u0089\u00ec\u00de\u00de\u00df\u00ed\u00ee\u00ef\u00e2\u00e2\u00e3\u00d6\u00d6 \u00f0\u00f1\u00c0\u00a3\u00a4\u00f2\u00f3\u00f3\u00e5\u00f4 ",
- " \u0082\u00e6\u00e6k#\u00f5\u00f6\u00f7\u00e9\u00f8\u0089\u0089\u00ec\u00ed\u00de\u00de\u00ee\u00ee##\u00f9\u00e2\u00e2\u00fa\u00fb \u00fc\u00fd\u00fd \u00f2\u00e5 \u00f4 ",
- " \u0082\u0082\u00e6\u00f5\u00f5\u00fe\u00f6\u00f6\u00f6\u0089\u00ec\u00ed\u00ed\u00ed\u00ff##\u0100\u00be\u00be\u0101\u0102\u0103\u0104\u0105\u0105\u0106\u00fd\u0107 \u00f2\u0108\u0108\u0108\u0108\u0109\u0109 ",
- " \u0082\u0082\u00e6k\u00fe!#\u010a\u010a\u00ed\u010b\u010c##\u010d\u00be\u00be \u010e\u010f\u0110\u0110\u0103\u0111\u0112\u0113\u0114\u00f0\u0115\u00f2\u0116 \u00f4 ",
- " \u0117 \u0118\u0119\u011a\u011b\u011c\u010a\u010a###\u011d\u00be\u00be\u010e\u010e\u00cc\u011e\u011f\u0120\u0121\u0121\u0122\u0123\u0123\u0124\u0125\u0126\u00f2\u0116\u0116\u00f4\u00f4 \u0127\u0127\u0127 ",
- " \u0117\u0117\u0118 \u0082\u0082\u0128\u010a\u010a\u0129\u012a\u012a\u011d\u011d\u011e\u011e\u011b\u011e\u012b\u012c\u012d\u0121\u012e\u012f\u0130\u0131\u0131\u0131\u0123\u0123\u00f0\u00f2\u0116\u0116 \u0127\u0127\u0132\u0132\u0132\u0132\u0132 ",
- " \u0117\u0118\u0118\u0133\u0133\u0134\u0135\u0135\u012a\u0136\u011e\u011e\u011e\u011d \u0137\u0138\u011f\u012d\u0139\u013a\u012f\u012f\u0101\u013b\u013b\u013b\u013b\u0131\u00f0\u0107\u00f2\u013c\u013d\u013d\u0132\u0132\u0132\u0132 ",
- " \u0117\u0118\u0118\u0133\u0133\u0134\u0135\u0135\u0135\u012a\u013e\u013f \u0140\u0140\u0141\u012d\u0139\u013a\u013a\u0142\u0101\u0101\u0143\u0144 \u0145\u013b\u0131\u0146\u0147\u0147\u013d\u013d\u0148\u0148 ",
- " \u0117\u0117\u0118\u0149\u0149 \u0135\u0135\u0135\u014a\u014b\u014c\u014c\u014d\u014e \u0140\u012b\u011f\u012d\u0139\u013a\u014f\u0150 \u0151\u0101\u0101\u0144 \u0145 \u0152\u0147\u0147\u0107 \u0153\u0148\u0148\u0148\u0148\u0148 ",
- " \u0117\u0117\u0118 \u0149\u0128\u0135\u0135\u014a\u0154\u014c\u014c \u014e\u014d\u012b\u011f\u012d\u012d\u013a\u013a\u0155\u0156\u0156\u0156\u0156\u0101\u0101\u0144\u0144\u0145\u0157\u0152\u0158 \u0159\u0107 \u0153 \u0148\u0148\u0148 "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/road-casings-grouped-rendering-600-600-1.0-grid-reference.json b/tests/visual_tests/grids/road-casings-grouped-rendering-600-600-1.0-grid-reference.json
deleted file mode 100644
index f731710..0000000
--- a/tests/visual_tests/grids/road-casings-grouped-rendering-600-600-1.0-grid-reference.json
+++ /dev/null
@@ -1,888 +0,0 @@
-{
- "keys": [
- "",
- "330",
- "155",
- "74",
- "57",
- "749",
- "788",
- "201",
- "202",
- "181",
- "691",
- "774",
- "228",
- "46",
- "523",
- "73",
- "530",
- "384",
- "286",
- "385",
- "1",
- "156",
- "644",
- "361",
- "531",
- "43",
- "449",
- "93",
- "328",
- "527",
- "605",
- "589",
- "288",
- "215",
- "635",
- "532",
- "588",
- "154",
- "138",
- "287",
- "637",
- "638",
- "529",
- "576",
- "362",
- "348",
- "45",
- "639",
- "497",
- "300",
- "329",
- "237",
- "600",
- "137",
- "534",
- "636",
- "595",
- "103",
- "14",
- "180",
- "232",
- "593",
- "104",
- "353",
- "526",
- "592",
- "594",
- "136",
- "352",
- "327",
- "323",
- "203",
- "490",
- "415",
- "442",
- "342",
- "258",
- "528",
- "596",
- "599",
- "157",
- "343",
- "331",
- "257",
- "598",
- "412",
- "313",
- "335",
- "277",
- "89",
- "597",
- "344",
- "431",
- "276",
- "126",
- "113",
- "108",
- "107",
- "591",
- "590",
- "407",
- "414",
- "147",
- "99",
- "369",
- "413",
- "337",
- "97",
- "124",
- "122",
- "110",
- "174",
- "406",
- "75",
- "82",
- "83",
- "72",
- "278",
- "173",
- "472",
- "481",
- "336",
- "159",
- "153",
- "100",
- "102",
- "96",
- "200",
- "266",
- "265",
- "263",
- "269",
- "231",
- "446",
- "66",
- "409",
- "410",
- "315",
- "179",
- "182",
- "419",
- "392",
- "391",
- "390",
- "525",
- "417",
- "411",
- "183",
- "479",
- "473",
- "146",
- "475",
- "474",
- "401",
- "421",
- "445",
- "356",
- "483",
- "480",
- "551",
- "583",
- "325",
- "324",
- "476",
- "582",
- "364",
- "389",
- "393",
- "839",
- "724",
- "440",
- "227",
- "620",
- "462",
- "477",
- "268",
- "267",
- "225",
- "464",
- "16",
- "271",
- "535",
- "463",
- "299",
- "693",
- "261",
- "270",
- "247",
- "548",
- "467",
- "465",
- "422",
- "241",
- "466",
- "238",
- "239",
- "246",
- "489",
- "634",
- "671",
- "333",
- "326",
- "488",
- "482",
- "633",
- "448",
- "243",
- "248",
- "461",
- "460",
- "332",
- "378",
- "577",
- "484",
- "471",
- "381",
- "25",
- "188",
- "470",
- "565",
- "469",
- "334",
- "379",
- "355",
- "284",
- "279",
- "175",
- "667",
- "562",
- "380",
- "665",
- "550",
- "373",
- "354",
- "632",
- "485",
- "570",
- "363",
- "575",
- "673",
- "585",
- "131",
- "404",
- "285",
- "587",
- "78",
- "145",
- "85",
- "41",
- "739",
- "478",
- "87",
- "121",
- "40",
- "358",
- "226",
- "260",
- "283",
- "687",
- "690",
- "486",
- "133",
- "672",
- "95",
- "322",
- "321",
- "195",
- "264",
- "194",
- "177",
- "396",
- "359",
- "402",
- "55",
- "686",
- "619",
- "15",
- "382",
- "397",
- "319",
- "735",
- "212",
- "236",
- "282",
- "280",
- "618",
- "615",
- "614",
- "403",
- "376",
- "59",
- "204",
- "786",
- "640",
- "641",
- "375",
- "374",
- "400",
- "320",
- "58",
- "773",
- "199",
- "692",
- "584",
- "377",
- "395",
- "405",
- "398",
- "56",
- "579",
- "670",
- "31",
- "357",
- "505",
- "493",
- "784",
- "741",
- "743",
- "50",
- "92",
- "38",
- "213",
- "847",
- "492",
- "841",
- "254",
- "747",
- "827",
- "568",
- "39",
- "53",
- "439",
- "224",
- "607",
- "5",
- "61",
- "158",
- "840",
- "438",
- "214",
- "835",
- "753",
- "223",
- "626",
- "22",
- "13",
- "838",
- "302",
- "54",
- "52",
- "708",
- "769",
- "697",
- "165",
- "118",
- "62",
- "494",
- "491",
- "301",
- "9",
- "222",
- "622",
- "423",
- "296",
- "317",
- "318",
- "252",
- "631",
- "495",
- "304",
- "710",
- "36",
- "123",
- "308",
- "760",
- "762",
- "630",
- "621",
- "674",
- "2",
- "3",
- "253",
- "255",
- "846",
- "77",
- "316",
- "771",
- "628",
- "453",
- "291",
- "383",
- "830",
- "722",
- "564",
- "295",
- "292",
- "365",
- "845",
- "617",
- "624",
- "666",
- "662",
- "581",
- "42",
- "294",
- "726",
- "694",
- "627",
- "654",
- "661",
- "456",
- "48",
- "47",
- "716",
- "732",
- "836",
- "623",
- "507",
- "629",
- "606",
- "651",
- "571",
- "580",
- "574",
- "572",
- "293",
- "837",
- "613",
- "457",
- "65",
- "459",
- "23",
- "764",
- "144",
- "125",
- "758",
- "834",
- "831",
- "719",
- "780",
- "844",
- "184",
- "616",
- "679",
- "681",
- "458",
- "833",
- "825",
- "166",
- "139",
- "682",
- "17",
- "511",
- "509",
- "29",
- "832",
- "770",
- "772",
- "766",
- "768",
- "689",
- "842",
- "220",
- "610",
- "675",
- "518",
- "63",
- "26",
- "27",
- "713",
- "219",
- "221",
- "506",
- "677",
- "120",
- "498",
- "680",
- "35",
- "30",
- "714",
- "730",
- "738",
- "678",
- "676",
- "573",
- "37",
- "443",
- "740",
- "717",
- "502",
- "642",
- "130",
- "444",
- "703",
- "826",
- "501",
- "503",
- "142",
- "117",
- "18",
- "28",
- "742",
- "731",
- "745",
- "767",
- "90",
- "569",
- "70",
- "20",
- "715",
- "808",
- "170",
- "727",
- "515",
- "514",
- "521",
- "755",
- "191",
- "185",
- "684",
- "557",
- "516",
- "513",
- "522",
- "311",
- "234",
- "556",
- "519",
- "517",
- "701",
- "310",
- "545",
- "450",
- "699",
- "696",
- "733",
- "350",
- "211",
- "520",
- "303",
- "725",
- "729",
- "702",
- "822",
- "210",
- "64",
- "820",
- "349",
- "524",
- "140",
- "744",
- "746",
- "815",
- "813",
- "189",
- "192",
- "190",
- "555",
- "135",
- "24",
- "705",
- "698",
- "712",
- "707",
- "193",
- "553",
- "538",
- "546",
- "643",
- "33",
- "34",
- "510",
- "345",
- "721",
- "818",
- "539",
- "750",
- "795",
- "817",
- "351",
- "559",
- "603",
- "601",
- "604",
- "794",
- "793",
- "783",
- "683",
- "206",
- "544",
- "76",
- "734",
- "819",
- "781",
- "789",
- "32",
- "706",
- "805",
- "785",
- "787",
- "297",
- "12",
- "711",
- "235",
- "105",
- "44",
- "542",
- "759",
- "765",
- "807",
- "791",
- "852",
- "290",
- "347",
- "289",
- "536",
- "51",
- "757",
- "728",
- "811",
- "810",
- "425",
- "160",
- "430",
- "169",
- "778",
- "704",
- "504",
- "541",
- "779",
- "709",
- "134",
- "98",
- "4",
- "346",
- "809",
- "339",
- "305",
- "685",
- "148",
- "752",
- "341",
- "167",
- "162",
- "163",
- "149",
- "754",
- "748",
- "340",
- "10",
- "168",
- "67",
- "828",
- "540",
- "824",
- "782",
- "688",
- "109",
- "554",
- "763",
- "756",
- "428",
- "112",
- "68",
- "496",
- "127",
- "229",
- "128",
- "161",
- "761",
- "829",
- "132",
- "249",
- "176",
- "561",
- "306",
- "537",
- "111",
- "171",
- "307",
- "432",
- "309",
- "19",
- "164",
- "250",
- "178",
- "695",
- "129",
- "116",
- "804",
- "775",
- "197",
- "360",
- "21",
- "802",
- "800",
- "806",
- "803",
- "801",
- "799",
- "797",
- "798",
- "217",
- "216",
- "718",
- "69",
- "150",
- "7",
- "790",
- "338",
- "843",
- "720",
- "152",
- "151",
- "86",
- "8",
- "207",
- "796",
- "233",
- "88",
- "218",
- "560",
- "209",
- "6",
- "777",
- "452",
- "208",
- "172",
- "776",
- "558",
- "451"
- ],
- "data": {},
- "grid": [
- " ! ##$ %%&'' ( )) *** ",
- " ! ##$ %%+', ( ))) ** - ",
- " !! #.$ %%&+' ( ))) ** - ",
- " / 0 ! #.$ %%&', ( ))) ** - ",
- " / 1 0 ! #.$ 2 %%&+', ( ))3 *** - ",
- " / 1 00 !! #.$ 4 2 %%&', ( )) 33 ** -- ",
- " / 1 000 ! #.$ 4 222 %%&+',55 ( )) 3 ** -- ",
- " / 1 66700 ! 8888 ##.$4 22 %%&',555 ( )) 3 ** -- ",
- " / 1 99667000 ! 888 #..$4 222 :%%+',55; ( )) 33*** -- ",
- " / 1 99 667700 ! 8 ##.$$4 22 :%%&', 55 ( )) 33** -- ",
- " / 1 99 66770<0 ! 8 ##.$=422 :%%+',55; ( )) **3 -- ",
- " />>> ? 1 9@@ 667<<000 !! 8 #..$=422 :%%&',,55; ( )) A**3 ------- BBBB ",
- " / C>>>> ? D 9 @E EE66F 0000 ! 8 ##.GG=42 ::%%+',555 ( ) H 3--- BB BB ",
- " / CI J>>KKK DDDD 9 E EEE ELFFF 000 ! MMMMMMNN #OGG= ::%%&+ ,55; ( ) * 3- B ",
- " //PPPPPJ Q DDDDD99 E EE L FFF 000 ! R R N## GGS: :::%&+',555 ( )) **TT BB ",
- " / PC IJPPQ DD EE EE UUU FFF 0000 ! R R #VVGS.::::%%&' ,55; () TT - BBBBBBBBB ",
- "W/ PXXIJP Q EE E YYUUU FFF 000 ! R R ZZ VSS[:::%%&+', 55 ) TT] - BB ^ ",
- "//PPP JP Q E E __YYY UU FFF 000 ! R R ZZ``Saa[[ %%&' ,555 ))TT] - BB ^ ",
- "bb C PPPPQ E E c __ YY U dFF ee0 ! R RR Z``fg [[[%%&',,55 hh T ] - B ^^ ",
- "/bbbb J Q EE LLLcc ___YY dd FFF e000 ! RRR ZZ``fg [[%&+',555 hhiT ] - B ^^ ",
- " bbbbQ j kkk ccc__ d FFFe 000 !!l ZZ`mmmmm [%%&+ ,555 hh iT ] - B nnn ",
- " o jj kkkccc d p qFFF 00r lll Z``stttmm[%%+', 55 hh iT ]]- B uun ",
- " o jj kkkk d vvppq FFFF rr00llllll wZ` sx tm%%&+',55;y hh iT ]z-- B ^ u {{{{{{{{{{",
- " oo jjjjj kkd ||vvvqpp FFFr 0000llll ZZ` s}}}m[%%&'~,55 yyh iT \u007f\u007f\u007f zzzzzz--- B {{{{{{\u0080{{{{{{{{{{{{{\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081",
- " o j kk|||qvv pp rrFF 00000l Z`` ssssm[%%&',555 hh iT\u007f\u007f \u0082\u0082\u0082\u0082\u0082\u0082\u0082\u0083\u0083{{{{{{{{{{\u0081\u0081\u0081\u0081\u0081\u0080\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081 ",
- " o j kkk q| vv\u0084\u0085\u0086\u0087 FFF\u0088\u0088\u008800000Z`\u0089\u008a\u008bx \u008cm%%&+',5\u008d\u008e\u008eh\u0082\u0082\u0082\u0082\u0082\u0082\u0082\u0082\u0082\u0082\u0082\u0082\u0082\u008f\u008f\u008f\u008f\u008f\u008f\u008f\u008f\u008f\u0090\u0090\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0091\u0081\u0081 ",
- " o j kq |||\u0084\u0084\u0092\u0087\u0086\u0086 \u0093\u0088\u0088\u0088\u0088\u0088\u0088\u0094\u0095`\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u008e\u008e\u0082\u0082\u0082\u0082\u0082\u0096\u0096\u0096\u008f\u008f\u008f\u008f\u008f\u008f\u008f\u008f\u008f\u008f\u008f\u008f\u0097 -- \u0098 \u0091 ",
- " o jj \u0099\u009a\u0099 kkk| \u009b\u0087\u0092\u0092 \u0086\u0086 \u0093\u0093\u009c\u009c\u0088\u0088\u009d\u009e\u009e\u009e\u009e\u009e\u009e\u009e\u009f\u009f\u009f\u009f\u009f\u009f\u009f\u009f\u009f\u0096\u0096\u00a0\u0096\u0096\u0096\u0096 \u00a1\u00a2\u00a3\u00a4\u00a4\u00a5 \u00a6\u00a6\u00a6\u00a6--- \u0098\u0098 \u0091 ",
- " o jj \u0099\u0099\u009a \u0099\u0099\u0099 k \u0087\u009b \u0092 k\u00a7\u009c\u009c\u00a8\u009d\u00a9\u00a9\u00aax\u00ab %%%&',55 \u00ac \u00a1\u00a2 \u00ad\u00ad\u00a5\u00a6-- \u0098 \u0091 ",
- " o j \u0099 \u009a \u0099 kkkkkkkkkk\u00aekkk \u009c\u009c\u009d\u009d\u00af\u00b0 x\u00b1 %%&&',55 \u00ac \u00a1\u00a2 \u00ad - \u0098\u0098 \u0091 ",
- "\u00b2\u00b2\u00b2 o j \u0099 \u009a \u00b3 \u00b4\u00a7\u009c\u009d\u009d\u00af\u00b0x \u00ab\u00b1 %%&+',55 \u00ac \u00a1\u00a2\u00b5\u00ad - \u0098 \u0091 ",
- " \u00b2\u00b2\u00b2o j \u0099\u0099 \u009a\u009a \u00b6\u00b7 \u00b3 \u00b4\u00a7\u00b8\u009d \u00af\u00b0x\u00ab \u00b1%%%&+',55 \u00ac \u00a1\u00a2\u00b5\u00ad - \u0098 \u0091 ",
- " \u00b2\u00b2\u00b2 jj \u0099\u0099 \u009a \u00b9\u00ba \u00b6\u00b7\u00b7\u00b7 \u00bb\u00bb\u00bb\u00bb\u00bc \u00bd\u00b8\u00b8\u009d\u00af \u00b0x\u00ab\u00b1 %%%&+',5\u00be \u00ac \u00a1 \u00a2\u00b5\u00ad - \u0098 \u0091 ",
- "\u00bf \u00b2\u00b2\u00b2 jj \u0099 \u009a \u00b9 \u00ba\u00ba\u00ba \u00c0 \u00b7\u00b7 \u00bb\u00bb\u00bb \u00bc \u00bd\u00b8\u009d\u009d\u00af\u00b0 x\u00ab\u00b1 %% &+'55\u00be \u00ac \u00a1\u00a1\u00a2\u00b5\u00b5\u00ad - \u0098 \u0091 ",
- " \u00bf\u00bf \u00b2\u00b2 j \u0099\u00c1 \u009a\u009a\u009a\u00b9 \u00c2\u00c2\u00c0\u00b6 \u00b7 \u00c3 \u00c4 \u00bd\u00bd\u00b8\u009d \u00af\u00b0x\u00ab\u00ab\u00b1 %% &+'55\u00be \u00ac \u00a1\u00a2\u00a2\u00b5\u00b5\u00ad- \u0098 \u0091 ",
- " \u00bf\u00bf j \u0099\u0099\u00c1 \u009a\u00c5\u00c5 \u00c6 \u00b6\u00b6\u00b6\u00b6\u00b6\u00b7 \u00c3 \u00c4 \u00bd\u00c7\u00b8\u009d \u00c8\u00c8\u00b0\u00c9\u00b1\u00b1 %% \u00ca\u00cb,55 \u00cc \u00ac \u00a1 \u00a2 \u00b5\u00cd\u00cd- \u0098 \u0091 ",
- " \u00bf\u00ce\u00ce\u00ce jj j \u0099\u0099\u00c1\u00c1\u00cf\u00cf\u00cf\u00cf\u00cf\u00b9\u00cf \u00d0\u00c5 \u00c6 \u00b7 \u00c3 \u00c4\u00c4 \u00bd\u00b8\u00b8\u009d \u00b0\u00c9\u00b1 %%%&\u00ca',55 \u00cc \u00ac \u00a1\u00a1\u00d1\u00d1\u00d2\u00d3 -- \u0098 \u0091 ",
- " \u00bf\u00bf\u00ce\u00cej jj \u0099\u00cf\u00cf\u00c1 \u00d4\u00cf\u00cf\u00d0 \u00c5\u00c6 \u00b7 \u00c3 \u00c4 \u00bd\u00b8\u009d\u009d x\u00c9\u00ab \u00d5%%&\u00ca',55 \u00cc \u00ac\u00ac \u00a1\u00d6\u00d1 \u00d3\u00d3 - \u0098 \u0091 ",
- " \u00bf\u00bf \u00ce\u00ce \u0099\u00cf\u00cf \u00c1\u00c1\u00d7\u00d7\u00d7\u00d7\u00d7\u00d7\u00d8 \u00cf\u00cf\u00c6 \u00b7 \u00c3 \u00c4 \u00d9\u00bd\u00b8\u009d x\u00c9\u00ab %%%&\u00da',55\u00cc\u00be \u00ac \u00a1\u00a1\u00db\u00dc \u00d3 - \u00dd\u00dd\u0098\u0098 \u0091 ",
- " \u00bf\u00bf \u00ce\u00ce \u0099\u00de\u00cf \u00d7\u00d7 \u00df \u00d7\u00d7\u00d7 \u00e0\u00cf\u00cf \u00b7 \u00c3 \u00e1\u00c4 \u00bd\u00b8\u00b8\u009d x\u00c9\u00ab \u00d5%% &\u00da',55 \u00be \u00ac \u00a1 \u00dc\u00dc \u00d3 - \u00e2\u00dd \u0098 \u0091 ",
- " \u00bf \u00ce\u00ce \u0099\u0099\u00cf\u00de\u00de\u00de \u00e3\u00e3\u00df\u00e3 \u00d7\u00e0 \u00cf \u00b7 \u00c3 \u00c4 \u00bd\u00b8\u00b8\u009d x\u00c9\u00ab \u00d5%% &\u00ca',55 \u00be \u00ac \u00a1\u00a1 \u00db\u00db \u00d3 -- \u00e4\u00e5\u00e6 \u0098\u0098 \u0091 ",
- " \u00bf \u00e7 \u0099 \u00cf\u00e8\u00e8\u00e8 \u00e3 \u00e3\u00e3 \u00e9\u00d7\u00d7 \u00cf \u00b7 \u00ea\u00ea \u00eb \u00bd\u00b8\u009d\u009d x\u00c9\u00ab \u00d5%% &\u00da',55 \u00be \u00ac \u00a1 \u00db\u00db\u00db -- \u00e4\u00e4\u00e5\u00e6 \u0098 \u0091 ",
- " \u00bf\u00bf \u00e7\u00ec \u00ed\u0099 \u00cf\u00ee\u00ee\u00d7 \u00e3\u00e3 \u00e9\u00e3 \u00d7\u00d7 \u00cf\u00cf \u00b7 \u00ef\u00ef\u00ea\u00ea\u00ea \u00eb \u00bd\u00b8\u009d\u009d x\u00c9\u00ab \u00d5%% &\u00ca',55 \u00be \u00ac \u00a1 \u00db\u00db\u00db\u00db- \u00e4\u00f0\u00f1\u00f1\u00f1\u0098 \u0091 ",
- " \u00bf \u00ec\u00ec\u00ed\u00ed \u0099\u00cf\u00f2\u00ee\u00d7 \u00e3 \u00e3 \u00d7\u00f3\u00f3\u00cf \u00b7 \u00f4\u00f4\u00ef\u00ef\u00ef\u00ea\u00ea \u00eb \u00f5\u00bd\u00b8\u009d x\u00c9\u00ab \u00d5%% &\u00da' 55 \u00be \u00ac \u00a1\u00a1 \u00d3\u00d3 - \u0098 \u0091 ",
- " \u00bf \u00f6\u00ed\u00f7\u00f7\u00f7\u00f7\u0099\u00cf \u00d7 \u00f8\u00e3 \u00e3 \u00d7\u00f3 \u00cf \u00b7 \u00f4\u00f4\u00ef\u00ef\u00ea \u00eb \u00f9\u00f5\u00f5\u00f5\u00f5\u00f5 x\u00c9\u00ab \u00d5\u00d5%% &\u00ca' \u00fa\u00fa \u00be \u00ac\u00ac \u00a1\u00a1 \u00d3 - \u0098 \u00fb ",
- " \u00f6\u00f6\u00f6 \u00f7\u0099\u00cf \u00d7\u00f8 \u00e3\u00e3 \u00e3 \u00d7 \u00cf\u00b7\u00b7 \u00f4\u00ef\u00ea\u00eb\u00eb \u00f9\u00bd\u00b8\u009d\u00f5\u00f5 x\u00c9\u00ab \u00d5\u00d5%% &\u00cb'\u00fa\u00fa\u00fa \u00be \u00ac \u00a1\u00a1 \u00d3 - \u0098 \u00fb ",
- " \u00f6 \u00ed\u00ed\u00f7\u00f7\u0099 \u00cf \u00d7 \u00e3\u00fc\u00e3\u00e3 \u00e3\u00e3 \u00d7 \u00cf\u00b7 \u00f4\u00f4 \u00bd\u00b8\u009d\u00f5 x\u00c9\u00ab\u00ab \u00d5%% &\u00cb'\u00fa\u00fa\u00fa \u00be\u00be \u00ac \u00a1 \u00d3 - \u0098 \u00fb ",
- " \u00f6\u00f6 \u00ed\u00f7\u0099 \u00cf\u00cf \u00fd\u00d7\u00d7\u00fc\u00fc \u00fe \u00d7 \u00b7\u00b7 \u00ff \u00b8\u00b8\u009d\u0100 x\u00c9\u00ab \u00d5%% &\u00cb,\u00fa\u00fa\u0101\u0101 \u00be \u00ac \u00a1 \u0102\u0102\u0103 - \u0098 \u00fb \u0104\u0104\u0104",
- " \u00f6\u00f6 \u00ed\u00ed \u00cf\u00cf\u0105 \u00d7\u00d7\u00d7 \u00fe \u00d7\u00d7 \u00cf\u00b7 \u0106 \u00ff \u00b8\u00b8\u009d\u0107xxx\u00c9\u00ab \u00d5%% &\u00cb'\u00fa\u00fa \u0101 \u00be \u00ac \u00a1\u0102\u0102\u0102\u0103\u00d3 -- \u0098 \u00fb \u0104\u0104\u0104\u0104 ",
- " \u00f6 \u0099\u0099 \u00cf \u00d7\u0108\u00d7\u00d7\u00d7 \u0109 \u00cf\u00b7\u00b7 \u0106\u010a \u00ff \u00bd\u00b8\u009d\u009d \u00c9\u00ab \u00d5%% &\u00cb\u00fa\u00fa\u00fa\u010b\u010b \u00be \u00ac \u00a1\u00a1 \u0102\u00d3 - \u0098 \u00fb\u00fb \u0104\u0104\u0104\u0104 ",
- " \u00f6 \u0099\u0099 \u0108\u010c\u010c \u0109 \u00cf\u010d \u010e\u010a\u010a\u010a\u010a\u010f \u0110 \u0111\u0111\u00b8\u009d\u009d \u00c9\u00c9\u00ab \u00d5\u00d5%% &\u00cb\u00fa\u00fa\u010b \u010b \u00be\u00be \u00ac \u00a1 \u0102\u00d3 - \u0098\u00fb\u00fb \u0104\u0104\u0104\u0104 ",
- " \u00f6\u0112 \u0099\u0099 \u010c \u00cf\u0109\u010d \u010e \u010a\u010a\u0110 \u0111\u0113\u0113\u0113\u00b8\u00b8\u009d \u0114\u00ab \u00d5%%% &\u00fa\u00fa\u00fa\u010b \u010b \u00be \u00ac \u00a1 \u0102\u00d3 - \u0115\u00fb\u0104\u0104\u0104\u0104 ",
- " \u00f6\u0116\u0116\u0112\u0112 \u0099 \u010c\u00b7\u00b7\u010d\u010d \u010a\u010a \u010a\u010a \u0110 \u0111\u0113\u0113\u0113\u0117\u0118\u0119\u009d\u011a\u011a \u0114 \u00ab\u00ab\u00d5%% &\u00fa\u00fa \u010b \u010b \u00be \u00ac \u00a1 \u0102\u00d3 -- \u0115\u0115\u0104 ",
- "\u011b \u00f6 \u0116\u0116\u0112\u0112 \u0099\u0099 \u011c\u00b7\u00b7\u00b7\u00b7 \u010d\u010d \u010a\u010a\u010a \u0110 \u0111\u0113\u0113\u0117\u0117\u0117\u0118\u011d\u011e\u011a\u011a\u011f\u011f\u0114 \u00d5\u00d5%% \u00fa\u00fa\u00fa,\u010b \u010b\u010b \u00be\u0120\u0120\u0120 \u00ac \u00a1 \u0102\u0102\u0121\u00d3\u00d3--\u0122\u0122\u0123 \u0115\u0115 ",
- "\u0124\u0125\u0125 \u00f6 \u0116\u0112\u0112 \u0099\u0099 \u011c\u0126\u0126 \u010d \u010a\u010a \u0110\u0111\u0127\u0113\u0117\u0128\u0128\u0128\u0129\u011e\u011e\u012a\u012b\u011f\u011f\u011f\u00d5\u00d5\u00d5\u00d5%% \u00fa\u00fa\u00fa', \u010b \u010b\u010b\u00be\u00be \u00ac\u00ac \u00a1 \u0102\u0121 \u012c\u012d\u012e\u0123 \u0115\u0115 \u012f\u012f",
- " \u0124\u0125\u0125 \u00f6 \u0116\u0116\u0112\u0112 \u0099\u011c\u0126 \u0126 \u010d \u0110 \u0127\u0127\u0128 \u0129\u0129\u011e\u011e\u0130\u012b\u012b\u011f\u011f\u00d5\u00d5\u00d5%% \u00fa\u00fa\u00fa', \u010b \u010b \u0131 \u00ac\u00ac\u00ac \u00a1 \u0121 \u012c \u012e\u012e \u0115\u0115 \u012f\u012f\u012f\u012f ",
- " \u0124\u0125 \u00f6\u00f6 \u0116\u0116\u0112\u0112 \u011c\u0126\u0126\u0126\u0126\u010d\u010d \u0110\u0111\u0127\u0128 \u0129\u0129\u011e\u011e \u0132\u012b\u012b %% \u00fa\u00fa\u0133\u00da', \u010b \u0131 \u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac \u00a1 \u0121 \u012d \u0123 \u0115\u0115 \u012f\u012f\u012f\u012f\u012f \u0134",
- " \u0135 \u0124\u0125\u0125 \u0116\u0112\u0112 \u0099\u0126\u0126\u010d\u010d \u0110\u0111\u0127\u0127\u0136\u0136\u0137\u0137 \u0129\u0129\u011e\u011e \u0138 \u0132\u012b %%% \u00fa\u00fa\u00fa\u0139\u013a\u00cb, \u010b \u013b\u010b \u00ac\u00ac\u00ac\u00ac\u013c\u013c\u013c \u013d \u013e \u0115\u0115 \u012f\u012f\u012f\u012f\u012f \u0134\u0134\u0134\u0134 ",
- " \u013f \u0135 \u0124\u0125\u0125 \u0116\u0116\u0112 \u0140\u0141\u0126 \u0110\u0111\u0127\u0127\u0136\u0136\u0136\u0136\u0137\u0137\u0129 \u011e \u0142\u0143\u0132\u0132\u012b\u0144%% \u00fa\u00fa\u00fa\u0133\u0139\u00da', \u010b \u013b \u010b \u013c\u013c\u013c\u013c\u013c\u013c\u013c\u013c\u013c\u013c\u0145\u0145\u0115\u0115 \u012f\u012f\u012f\u012f \u0134\u0134\u0134\u0134 \u0146\u0146\u0146\u0146",
- "\u00bf \u013f \u00f6 \u0147\u0124\u0125\u0148 \u0116\u0116\u0112\u0112 \u0140\u0141\u0141 \u0110\u0110\u0127\u0127\u0128\u0149\u0149\u014a\u0136\u0136\u0137\u0129 \u011e\u0143\u0143\u0143\u014b\u0132\u014c\u014d\u014d% \u00fa\u00fa\u0133\u0139 \u013a\u014e' \u010b\u010b \u013b\u013b \u010b\u010b \u014f\u014f \u012f\u012f\u012f\u012f \u0134\u0134\u0134\u0146\u0146\u0146\u0146\u0150\u0150\u0150 ",
- "\u00bf \u00f6\u00f6 \u0147\u0124\u0125\u0148 \u0116\u0112\u0112 \u0140\u0140\u0141 \u0151\u0151 \u0110\u0111\u0127\u0128\u0149\u0149\u014a\u014a\u0136\u0136 \u0129\u0152\u0143\u0143\u011e\u011e\u0153\u0154\u0155\u014d\u0156\u0156%\u00fa\u00fa\u0133 \u0139 &\u014e', \u010b \u013b\u013b \u010b\u010b \u012f\u012f\u012f \u0134\u0134\u0134\u0134\u0146\u0146\u0150\u0146\u0150\u0150 ",
- " \u00f6\u00f6 \u0124\u0125\u0125 \u0116\u0116\u0112 \u0140\u0141 \u0151\u0157 \u0158\u0111\u0127\u0128\u014a\u0149\u014a\u014a\u0136\u0159\u0159\u0159\u0129\u0152 \u011e\u011e\u0154\u014d\u014d\u0156\u0156\u00fa\u00fa\u00fa\u0133 \u0139 \u00da\u014e', \u010b \u015a\u013b \u010b\u010b \u0134\u0134\u0134\u0134\u0146\u0146\u0146\u0146\u0150\u0150 ",
- "\u015b \u00f6 \u0147\u0124\u0125 \u0116\u0116\u0112\u0112 \u0140\u0141\u0141 \u0157\u015c \u0110\u0111\u0127\u0127\u0128 \u014a\u0159\u0159\u0159\u0159\u0159\u0159\u0129 \u014d\u014d\u014d\u0156\u0156\u0156\u00fa\u00fa\u0133 \u0139 &\u014e\u00cb, \u010b\u015a\u015a\u013b\u013b \u013b\u013b\u013b \u0134\u0134\u0134\u0146\u0146\u0146\u0146\u0150\u0150\u0150 \u015d",
- "\u015b\u00f6 \u0147\u015e\u015f\u0148 \u0116\u0116\u0112\u0112 \u0140\u0141\u0141 \u015c\u015c \u015c \u0110\u0111\u0127\u0127\u0128\u0160\u0160\u0160\u0159\u0159\u0159\u0159 \u0161\u0161\u0162\u0162\u0162\u014d\u014d\u014d\u014d\u014d\u0156\u0156\u00fa\u00fa\u0133\u014c\u014c & ',, \u010b\u015a \u013b\u013b \u013b\u013b\u0163\u013b\u013b \u0134\u0134\u0134\u0146\u0146\u0146\u0146\u0150\u0150\u0150 \u015d\u0164\u0164",
- " \u015b \u0124\u0125\u0125 \u0116\u0116\u0140\u0140\u0141 \u015c\u015c \u015c\u0165 \u0110\u0111\u0127\u0128\u0160\u0160\u0160\u0160\u0162\u0162\u0162\u0162\u0162\u0161\u0161\u0162\u0162\u0162\u014d\u014d\u014d \u0156\u0156\u0156\u00fa\u00fa\u0133 \u014c \u0166 \u014e', \u010b\u010b \u013b\u013b \u013b\u0163\u0163\u0163\u013b\u013b\u013b \u0167\u0167\u0167\u0134\u0134\u0134\u0134\u0146\u0146\u0146\u0146 \u0150\u0150\u0150 \u01 [...]
- "\u016a \u015b\u015b \u0124\u015f\u0125 \u0116\u0140\u0141 \u015c \u0165\u0165 \u0110\u0111\u0127\u0128\u0160\u0160\u0160\u016b\u016b\u016b\u016b\u016b\u016b\u016b\u0161\u0161\u016b\u0162\u0162 \u016c\u0156\u00fa\u00fa\u0133\u0154\u0155\u014c\u014c \u0166\u00da\u014e',\u016d \u010b\u010b \u013b\u013b \u013b \u0163\u0163\u0167\u0167\u0167\u0167\u0167\u0167\u0167\u0167\u0167\u0134\u0134\u0134\u0146\u0146\u0146\u0146\u016e\u016e \u0150\u0150 [...]
- "\u016f\u016a \u015b\u015b \u0147\u015f\u0125\u0148 \u0140\u0141 \u015c \u0110\u0111\u0127\u0127\u0160\u0160\u016b\u016b\u016b\u016b\u016b\u0170\u0170\u0170\u016b\u016b\u0161\u016b\u016b\u016b \u016c\u0171\u0171\u0133\u0172\u0172\u0154\u0155\u014c \u0173\u00da\u014e' ,\u016d \u0174\u0174\u010b\u010b \u013b\u013b\u0175 \u0167 \u0176\u0177\u0134\u0177\u0146\u0146\u0146 \u0178\u016e \u0150\u0150 \u015d\u0164\u0164\u0168\u0169\u0 [...]
- "\u016f\u016a\u016a \u0179\u015b \u0147\u0124\u0125\u0125 \u0140\u0141\u0141 \u015c \u0110\u0111\u0127\u0127\u0160\u0160\u016b\u016b\u016b\u0170\u0170\u0170\u0170\u0170\u0170\u0170\u0170\u0161\u016b\u016b\u016b\u016b\u016b \u016c\u016c\u0171\u0171\u017a\u017b\u0172\u0172\u0155\u014c \u0166\u00da \u014e',\u016d\u016d\u0174\u0174 \u0174\u0174\u0174\u010b \u0175\u0175\u0175 \u0167 \u0176\u0176\u0176\u0177\u017c\u0146\u0146 \u0178\u0178\u0178\u016e \u0150 [...]
- "\u016f \u016a\u016a\u0179 \u015b \u0124\u0124\u0125 \u0140\u0140\u0141 \u015c\u015c \u0110\u0110\u0111\u0127\u0160\u0160\u016b\u016b\u0170\u0170 \u017d\u017d \u0161\u0161\u0170\u016b\u016b\u016b\u016b\u017e\u017e\u017f\u017a\u017a\u017b\u017b\u0172\u0154\u014c \u0166\u00da \u014e',,\u016d\u0174 \u010b\u010b \u0167\u0167\u0167\u0176\u0176\u0176\u0180\u0177\u0181\u017c \u0178\u0178\u0178 \u016e \u0150 \u015d\u015d\u0164\u0182\u0168\u0 [...]
- "\u016f\u016a\u016a\u0179\u0179 \u015b\u015b \u0147\u0125\u0125\u0148 \u0140\u0140\u0141 \u015c\u015c \u0110\u0111\u0127\u0160\u0160\u0160\u016b\u0170\u0170 \u017d \u017d\u017d\u017d\u017d \u0184\u0184\u0170\u0185\u0185\u016b\u016b\u017e\u017e\u017f\u017a\u017a\u017b\u017b\u0172\u0172\u0155\u014c \u0173\u00da \u014e', \u016d \u010b\u010b \u0167\u0167\u0167\u0176\u0176\u0176\u0180\u017c\u017c\u0181 \u0178\u0178\u0178 \u016e\u016e \u0150 \u015 [...]
- " \u016a\u0179\u0179 \u015b\u015b \u0147\u0124\u0125\u0148\u0140\u0141 \u0186\u0187 \u0110\u0111\u0127\u0127\u0160\u0160\u016b\u0170\u0170 \u017d\u017d\u0188 \u017d\u017d\u0189\u0184\u0189\u0185\u0185 \u017e\u017e\u017f\u017f\u017a\u017a \u017b\u017b\u0172\u0155\u014c \u0173\u00da \u014e',, \u016d \u010b\u010b\u0167\u0176\u0176\u0176\u0180\u0180\u017c\u017c\u0181 \u0178\u0178 \u018a\u018a\u016e \u0150 \u015d\u0164\u0164\u0168\u0168\u0169\ [...]
- "\u016a \u0179\u018b \u015b\u015b \u0124\u0148\u0148\u0141 \u0186 \u0187 \u0111\u0127\u0127\u0160\u0160\u016b\u0170\u0170 \u017d\u017d \u0188\u0188\u0188\u0188\u0188 \u018c\u0184\u0189\u0185\u0185\u0185\u017e\u017e\u017f\u017f\u017a\u017a \u017b\u017b\u0172\u0155\u014c\u018d\u018e\u018e\u018e\u018f\u014e\u00cb', \u016d \u0190\u0190\u0176\u0180\u0177\u017c\u017c\u0181 \u0178\u0178\u0178 \u018a\u018a\u018a\u016e\u016e\u0150 \u015d\u0164\u0164\ [...]
- " \u0191 \u015b\u015b \u0140\u0147\u0141 \u0192 \u0187 \u0111\u0111\u0127\u0160\u0160\u016b\u016b\u0170 \u017d\u017d \u0193\u0193 \u0188\u0188\u0188\u017d\u0184\u0184\u0189\u0185\u0185\u017e\u017e\u017f\u016b\u017a\u017a\u017a\u017b\u017b\u0172\u018d \u0173\u0194 \u018f\u018f\u014e',, \u016d \u0176\u0176 \u0190\u0190\u0190\u017c\u0181 \u0178\u0178\u0178 \u018a\u018a \u016e\u0150\u0150 \u015d\u0164\u0164\u0168\u0169\u0169\u0169 \u0183\ [...]
- "\u0179 \u015b\u015b \u0140\u0140\u0141 \u0192\u0192\u0187\u0187 \u0111\u0127\u0160\u0160\u0160\u016b\u0170\u0195\u0195\u0195\u0193\u0193 \u0193\u0193\u0193 \u0188\u017d \u0184\u0189\u0185\u0185\u017e\u017e\u017f\u016b\u016b\u017a\u017a\u017b\u017b\u0196\u0197 \u0173\u0194 \u018f\u014e\u00cb', \u016d\u016d \u0176\u0176 \u0198\u0177\u0199\u017c\u0190\u0190 \u016e\u016e\u016e\u016e\u018a\u018a\u018a \u016e \u0150 \u015d\u0164\u0164\u0168\u0169\u0 [...]
- "\u019a \u019b\u019b\u015b \u0140\u0141 \u019c\u019c\u019c\u019c\u019c \u0111\u0127\u0127\u0160\u0160\u016b\u0170\u0195\u0195\u0195 \u0193\u0193\u0193\u0193 \u0184\u0189\u0189\u0185\u019d\u019e\u019e\u016b\u016b\u017a\u017a\u017b\u017b\u0196\u0197 \u0173\u00da \u018f \u014e',, \u016d \u0176\u0176 \u0180\u0177\u017c\u017c\u0181\u0181 \u019f\u019f \u016e\u016e\u016e\u016e\u01a0\u01a0\u016e\u016e\u0150 \u015d\u0164\u0164\u01a1\u0168\u0169\u0169 [...]
- " \u019b \u015b \u0140\u0141\u0141 \u019c\u019c\u01a2\u01a2\u01a2\u01a2 \u0111\u0127\u0127\u0160\u0160\u016b\u016b\u0195\u0195\u0195 \u0193 \u0184\u0184\u0189\u0185\u019d\u019e\u019e\u016b\u016b\u017a\u017a\u017b\u017b\u0196\u0197 \u0173 \u0194 \u01a3\u014e\u00cb',\u01a4\u0176\u0176 \u0180\u0177\u017c\u017c\u0181\u0181 \u01a0\u01a0 \u0150\u0150 \u015d\u0164\u0164\u01a1\u0168\u0169\u0169 \u0183\u0183 ",
- " \u01a5 \u019b \u015b\u015b\u0140\u0141\u0141 \u01a2\u01a2\u01a2\u01a2\u01a2\u01a2\u01a2\u01a2 \u0111\u0127\u0127\u0160\u0160\u016b\u016b\u0195\u0195\u0195 \u01a6\u01a6\u01a7\u01a7\u01a7\u01a7 \u01a8\u01a8\u0184\u0189\u0185\u019d\u019e\u019e\u016b\u016b\u017a\u017a\u017b\u0196\u0196 \u0173 \u0194 \u01a9\u01aa\u01a4\u01a4 \u0180\u0177\u017c\u017c \u0181\u0181 \u01a0\u01a0 \u0150 \u015d\u0164\u0164\u01a1\u0169\u0169\u0169 \u0183\u0183 [...]
- " \u01a5\u01a5\u01ab\u01ab\u01ab \u015b\u0140\u0141 \u01a2\u01a2\u01a2 \u01a2\u01a2 \u0111\u0127\u0160\u0160\u0160\u016b\u0195\u0195\u0195 \u01a7\u01ac\u01a7 \u01a7\u01a7\u01a7 \u01ad\u01ad\u01ae\u01ae\u0184\u0184\u0185\u019d\u019e\u019e\u016b\u016b\u017a\u017a\u017b\u0196\u0197 \u0173 \u0194\u00da \u01a9\u01a9\u01aa\u01a4\u01a4\u017c\u017c \u0181\u0181 \u01a0\u01a0 \u0150 \u015d\u0164\u0164\u01af\u01af\u0169\u0169 \u0183\u0183\u0183 [...]
- "\u01b0\u01b1 \u019b\u019b\u01ab \u01ab\u01ab\u01ab \u015b\u015b\u01b2\u01b3 \u019c\u01a2\u01a2\u01b4\u01b4\u01b4\u01b4 \u01a2\u01a2\u0127\u0127\u0160\u0160\u01b5\u0195\u0195 \u01b6\u01a7 \u01ac\u01ac \u01a7\u01ad\u01ad \u01ae\u0184\u0184\u0185\u019d\u019e\u019e\u016b\u016b\u017a\u017a\u017b\u0196 \u0173\u0173 \u0194\u00da \u0176\u0176\u01a9\u01b7\u01aa\u01a4\u01a4 \u0181\u0181 \u01a0\u01a0\u01a0\u01a0\u01a0 \u01b8\u0150\u015d\u015d\u0164\u01af\u0168\u01 [...]
- "\u01b1\u01b0\u01b0 \u01b9\u01b9 \u01ab \u01ba\u01bb\u01b2\u019c\u01a2\u01a2\u01b4\u01b4 \u01b4 \u01bc\u0111\u0127\u0127\u01bd\u0160\u01be\u01b5\u01b5 \u01a7\u01b6\u01b6\u01b6 \u01ac\u01ac \u01a7 \u01ae\u0184\u0185\u019d\u019e\u019e\u016b\u016b\u017a\u017a\u0196\u0196 \u0173 \u01bf\u01c0\u01c1\u0176 \u0180\u0180\u01a9\u01a9\u01aa\u01a4\u01a4\u0181 \u01a0\u01a0\u01a0\u01a0 \u01a0\u01a0\u01a0 \u01b8\u0164\u0164\u01af\u01af\u0169 \u0183\u0183 [...]
- "\u016a\u016a\u01c2\u01b0 \u01c3 \u01c4\u01ab \u01c5\u01c6\u01c7\u01a2\u01a2 \u01b4 \u01c8 \u01c9\u01ca\u0111\u0127\u0127\u0128\u01bd\u01bd\u01be\u01b5 \u01cb\u01cb \u01b6\u01b6 \u01ac\u01ac\u01ac\u01a7 \u01ae\u0184\u0184\u019d\u019d\u019e\u019e\u016b\u017a\u017b\u0196\u0197 \u0173\u0173 \u01bf\u01c0\u01c0\u01cc\u0180\u017c\u017c\u01a9\u01b7\u01aa\u01a4\u01a4 \u01a0\u01a0 \u01a0\u01a0\u0164\u0164\u0164\u0168\u01af\u0169 \u0183\u0183 [...]
- " \u016a\u016a \u01cd\u01c3 \u019b\u01c4\u01c4 \u01c5\u01ce\u01a2\u01cf\u01b4 \u01c8 \u01c8\u01c9 \u0111\u0127\u0128\u01bd\u01bd\u01be\u01b5\u01b5 \u01d0\u01a7 \u01cb\u01cb \u01b6\u01b6 \u01ac\u01ac \u01ae \u0184\u0185\u019d\u019e\u01d1\u01d1\u01d1 \u0196 \u0173\u0173 \u01c1\u01c1\u01bf\u01c0\u01c0\u01d2\u017c \u0181\u0181\u01a9\u01b7\u01aa\u01a4 \u01a0\u01a0 \u01a0\u015d\u015d\u0164\u0164\u0182\u0169\u0169 \u0183\u0183 ",
- " \u016a \u01cd\u01cd\u019b\u019b\u01ab\u01ab \u01c5\u01ce \u01cf\u01cf\u01cf\u01c8 \u0111\u0127\u0128\u01bd\u01bd\u01be\u01b5\u01b5\u01d3\u01d3\u01a7\u01a7\u01d0\u01d0 \u01cb\u01cb \u01b6\u01b6 \u01a7 \u01ae \u0184\u0184\u019d\u01d1\u01d1\u01d1\u01d1\u0196\u01d4\u0173\u0173\u01c1\u01c1\u01d5\u01d6\u01bf\u01c0\u01c0 \u0181\u0181\u0181 \u01d7\u01d8\u01d9\u01d9\u01a0\u01a0\u01a0\u01a0\u01a0 \u01a0\u015d\u01da\u0164\u0164\u0168\u0169\u0169 \u01db\u01d [...]
- " \u016a \u01c3\u01dc\u019b \u01ab \u01c5\u01ce\u01dd\u01de\u01dd\u01cf\u01cf\u01cf \u0111\u0127\u0127\u01bd\u01bd\u01bd\u01b5\u01b5 \u01d3\u01df\u01df \u01d0\u01d0 \u01cb\u01cb \u01b6\u01b6\u01a7 \u01ae \u0184\u01d1\u01d1\u01d1\u01d1\u016b\u01d4\u01d4\u0173\u01c1\u01d5\u01e0\u01d6\u01d6\u01bf\u01c0\u01c0\u0181\u0181 \u01d7\u01d8\u01d9\u01a0 \u01a0\u01da\u0164\u0164\u0164\u01e1\u0169\u0169\u01b8 \u01db\u01db \u01e2 ",
- "\u01e3 \u016a \u01c3 \u01dc\u01ab \u01c5\u01ce\u01dd\u01de\u01e4\u01dd\u01dd\u01cf\u01cf \u0111\u0127\u0127\u0128\u01bd\u01bd\u01be\u01e5 \u01e6 \u01e7\u01d3\u01df\u01df \u01d0\u01d0 \u01cb\u01cb\u01a7\u01a7 \u01ae \u01d1\u01d1\u01d1\u01d1\u01e8\u01e8\u01d4\u01d4\u01e9\u01e0\u01ea\u01eb\u01ec\u01ed\u01bf\u01bf\u01c0 \u01d7\u01ee\u01d8\u01d9\u01a0 \u01a0\u015d\u0164\u0164\u0168\u01e1\u01e1\u0169 \u01ef \u01f0\u01f0 \u01db\u01db\u01db \u01e2 [...]
- "\u01e3\u01e3\u016a \u01c3 \u01ab\u01ab\u01ab \u01f1\u01f1\u01dd\u01de \u01e4\u01f2\u01dd\u01dd\u01cf\u01cf\u0127\u0127\u0128\u01bd\u01bd\u01be\u01e5\u01e5\u01f3\u01e6\u01e6\u01e7\u01d3\u01d3 \u01df\u01df \u01d0\u01d0\u01a7\u01a7\u01cb\u01a7 \u01ae\u01f4\u01f4\u01d1\u01d1\u01f5\u01f6\u01f6\u01e8\u01d4\u01d4\u01ea\u01eb\u01f7\u01ed\u0181\u0181\u01bf\u01c0\u01c0 \u01ee\u01d8\u01d9\u01d9 \u01a0\u015d\u0164\u0164\u0168\u0169\u0169\u0169 \u01ef \u01f8\u01f0\u01f [...]
- " \u01e3\u01e3 \u01c3\u01fa \u01ab \u01c5\u01f1\u01dd\u01de\u01e4\u01e4\u01f2\u01fb \u01dd\u01cf\u0127\u0128\u01bd\u01bd\u01be\u01e5\u01e5 \u01f3\u01e7\u01e6 \u01e5\u01d3 \u01a7\u01a7\u01df\u01a7\u01a7\u01a7 \u01f4\u01f4\u01f4\u01f4\u01f4\u01fc\u01f5\u01f5\u01f6\u01f6\u01d4\u01d4\u01ed\u01ec\u0181\u0181\u0181 \u01bf \u01d7\u01d7\u01d8\u01d9\u01a0 \u01a0\u01a0\u015d\u0164\u0164\u0168\u0169\u0169 \u01ef \u01f8\u01f8\u01f9\u01f9\u01f0 \u01e2 [...]
- " \u01e3\u01e3 \u01fd\u01fa\u01fa \u01ab \u01c5\u01c5\u01ce \u01fe\u01e4\u01f2\u01f2\u01fb\u01dd \u0127\u0128\u01bd\u01bd\u01bd\u0170\u01e5\u01e5\u01e5 \u01f3\u01e5\u01e5\u01e5\u01d3\u01e5 \u01ff\u01ff\u01f4\u01f4\u01f4\u01f4 \u0173\u01fc\u01fc\u01f5\u01f6\u01f6\u0200\u01d4\u01ec\u0181\u0181 \u0201\u0202 \u01d7\u01ee\u01d8\u0203\u0203\u0203\u0164\u0164\u0168\u0169\u0169 \u01ef \u01f8\u01f8 \u01e2 ",
- "\u0173 \u01e3\u01e3\u01e3 \u01fa\u01ab \u01c5\u01ce \u01fe \u0204\u0205\u0206\u01dd\u01dd\u0127\u0127\u01bd\u01bd\u01bd\u0170\u0170 \u01e5\u01e5\u01e5\u01e5\u01e5\u01e5\u01e5\u01d3\u01d3 \u01ff\u01ff\u01ff\u01ff\u01ff\u0207\u0207\u0207\u0207\u01f4 \u0173\u0173\u01c1\u01e9\u01fc\u01f5\u01f6\u01f6\u01f6\u01d4\u0181 \u0208\u0208 \u0201\u0202 \u0203\u0203\u0209\u0209\u020a\u0168\u0169\u0169 \u01ef \u01db\u01db \u01e2 ",
- "\u0173\u0173 \u020b\u01e3\u01e3\u01e3 \u01fa\u01fa\u01fa \u01c5\u01ce\u01fe\u01fe\u0204 \u0205\u020c\u01dd\u0127\u0127\u0128\u01bd\u01bd\u01be\u0170 \u01e5\u01e5\u01e5\u01e5\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u0207\u0207\u0207\u0207\u0207\u0207\u0207 \u0173\u0173\u01c1\u01e9\u01d6\u01d6\u01fc\u01fc\u01f5\u01f6\u01f6\u01d4\u020d \u0208\u0208\u020e \u0201\u0202 \u020f\u0203\u0209\u020a\u0210\u0210\u0210 \u01ef\u01db \ [...]
- "\u01c1\u0173\u0173 \u0211\u0212\u01e3\u01e3\u0213\u0213 \u01fa\u01fa\u01fa \u01c5\u01ce\u01fe\u01fe\u0204 \u0205 \u020c\u0127\u0127\u0128\u01bd\u01bd\u01bd\u0170 \u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u0214\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u0207\u0207\u0207\u0207\u0207\u0207\u0207 \u0173\u0173\u01c1\u01e9\u01d6\u0177\u0177\u01f7 \u01fc\u01f5\u01f5\u0215\u0216\u020d\u0208\u0208 \u020e \u0201\u0202 \u020f\u020f\u0217\u0218\u0219\u0210\u0210\u0210\u01d9 \u01e [...]
- "\u021a\u021a\u01c1\u0173\u0211 \u0212\u0212\u021b\u0213\u0213\u0213\u0213 \u01fa\u01fa\u01fa\u01c5\u01ce\u01fe\u0204\u0204\u0205 \u020c \u0127\u0128\u01bd\u01bd\u01bd\u0170 \u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u01ff\u021c\u0214\u0214 \u0207\u0207\u0207\u0207\u0207 \u0173\u0173\u01c1\u01e9\u01d6\u0177\u0177\u01f7 \u0181\u0181\u01fc\u021d\u021e\u021e\u0215\u020d\u020d \u0201\u0202 \u020f\u0217\u0217\u021f\u0218\u0220\u0220\u0210\u01d7\u01ee\u01d8\u01d9 [...]
- "\u0222\u021a\u021a\u0211\u0211\u0173 \u0212\u0212 \u021b\u0213\u0213\u0213\u0213 \u01c5\u01fa\u020c\u020c\u0204\u0205\u0205\u020c \u0127\u0127\u01bd\u01bd\u01bd\u0170\u01ff\u01ff\u01ff\u01ff\u01ff\u0223\u0224\u0224\u0225\u021c\u021c\u021c\u0214\u0214 \u0207\u0207\u0207\u0207\u0207 \u0173\u0173\u01c1\u01e9\u0226\u0177\u01d6\u01f7 \u0181\u0181 \u021d\u021e\u021e\u0215\u0215\u020d\u0197 \u0201\u0202 \u020f\u0217\u0217\u021f\u0220\u0220\u0220\u0227\u0227\u0227 \u01ee\u01ee\u01d8 [...]
- "\u0229\u0222\u021a\u0211\u0211\u0173\u0173 \u0212\u0212\u022a\u021b\u021b\u0213\u0213\u0213\u0213 \u020c\u0205\u020c \u0127\u0127\u0128\u01bd\u01bd\u01be\u01ff\u01ff\u01ff\u01ff\u01ff\u022b\u0223 \u021c\u021c\u021c\u022c\u022d \u0214\u0214\u0207\u0207\u0207 \u0173\u01c1\u01c1\u01e9\u0226\u01d6\u0177\u01f7 \u0181\u0181 \u021d\u021d\u021e\u021e\u0215\u020d\u020d \u0201\u0202 \u020f\u0217\u0217\u021f\u0220\u0220\u0220 \u022e \u0227 \u01d7\u01ee\u01d8\u01d9 \u01ef \u0 [...]
- " \u0229\u0229\u0222\u021a\u0211\u01c1\u0173\u0173 \u0230 \u021b\u021b\u0213\u0213\u0213\u0213 \u020c\u0127\u0127\u0128\u01bd\u01bd\u01bd\u01ff\u01ff\u01ff\u0231\u0232\u0232\u022b\u021c\u021c\u0224\u0224\u0225 \u022c\u022d \u0214\u0214\u0207 \u0173\u01c1\u01c1\u01e9\u01e9\u01d6\u0177\u01f7\u01f7\u0181\u0181 \u021d\u021e\u021e\u0215\u0215\u020d\u0197 \u0233\u0233\u0217\u0217\u021f\u0220\u0220\u0220 \u0234\u022e \u0227 \u01ee\u01ee\u01d8\u01d9 \u01ef \u0228 [...]
- "\u0235\u0235 \u0229\u0222\u021a\u021a \u01c1\u0173\u0230\u0230 \u021b\u021b\u0213\u0213\u0213\u0213\u0127\u0128\u01bd\u01bd\u01bd\u01ff\u01ff\u01ff \u0231 \u021c\u021c\u022b\u0223 \u0224\u0225\u0225\u022c\u022d\u0236 \u0173\u01c1\u01c1\u01e9\u01e9\u01d6\u01d6\u0177\u01f7\u0181\u0181 \u021d\u021d\u021e\u021e\u0215\u020d\u020d\u0237\u0238\u0239\u0239\u0239\u021f\u0220\u0220\u0220 \u023a \u0234 \u022e \u023b\u023b\u0227 \u01d7\u01ee\u01d8\u01d9 \u01ef \u0228 [...]
- " \u0235\u0235 \u0229\u0222\u021a\u021a\u0230\u0230\u0173\u0173\u0173 \u021b\u021b\u021b\u0213\u0213\u01bd\u01bd\u01bd\u01ff\u01ff\u01ff \u023c\u021c\u021c\u0232 \u022b \u0223\u0224 \u0225\u0236 \u0173\u01c1\u01c1\u01e9\u01e9\u01d6\u01d6\u01f7\u01f7\u0181\u0181 \u023d\u021d\u021e\u021e\u0215\u0237\u0237\u0237\u023e\u023f\u0240\u0241\u0220\u0220 \u023a\u023a \u0234 \u0242\u022e\u023b \u0227\u0227 \u01ee\u01ee\u01d8\u01d9 \u01ef \u0228 \u01e2 [...]
- " \u0235\u0235 \u0229\u0222\u0230\u0230 \u01c1\u01c1\u0173\u0173 \u021b\u0127 \u0243\u0243\u01ff\u01ff\u01ff \u023c\u0231 \u0232\u022b\u022b\u0223\u0236\u0224 \u0173\u0173\u01c1\u01e9\u01e9 \u01f7\u01f7\u01f7\u0181\u0181 \u023d\u023d\u023d \u021d\u0237\u0237\u0237\u0237\u023e\u023e\u023e\u0241\u0241\u0244 \u023a\u023a \u0234 \u0245\u0242\u0242 \u0227 \u01d7\u01ee\u01d8\u01d9 \u01ef \u0228 \u01e2 ",
- "\u0246\u0246\u0246\u0246\u0246\u0235\u0235 \u0230\u0222\u021a\u021a\u021a\u01c1\u01c1\u0173\u0173\u0173 \u0247 \u0243\u0243\u0170\u01ff\u01ff \u023c \u0231\u0232 \u022b\u0236 \u0173\u0173\u01c1\u01e9\u01e9\u01e9\u01f7\u01f7\u01f7\u0181\u0181 \u023d\u023d\u0248 \u0249\u0237\u0237\u0237\u023e\u023e\u023e\u024a\u024a\u024b\u0244 \u023a\u023a \u0245 \u024c\u024c \u024d\u024e \u01d7\u01ee\u01d8\u01d9 \u01ef \u0228 \u01e2 ",
- " \u0235\u0235\u024f \u0229\u0229\u0222\u021a\u021a\u021a\u01c1\u0173\u0173\u0250\u0250\u0251\u0243\u0243\u01ff\u01ff \u023c\u0231\u0236\u0232 \u0173\u0173\u01c1\u01e9\u01e9\u01e9\u01f7\u01f7 \u0181\u0181\u0181 \u0252\u0252\u0252\u0252\u0252\u0248\u0248\u0249 \u023e\u023e\u0253\u024a\u024a\u024b\u024b\u0254\u0255 \u023a \u0234 \u0256\u024d \u024e \u01d7\u01ee\u01d8\u01d9 \u01ef\u01ef \u0228 \u01e2 ",
- "\u0257 \u0258\u0258\u0258 \u0259\u025a\u025a\u025a \u0229\u0229\u0222\u0222\u021a\u0250\u0250\u0251\u0251\u025b\u025b\u025c\u01ff \u025d\u025d \u023c\u0236 \u0173\u0173\u01c1\u01e9\u01e9\u01e9\u01f7\u01f7 \u0181\u0181\u0181 \u0252\u0252\u0252\u0252\u0252\u0252 \u025e\u0248\u0248 \u0222\u0222\u025f\u024a\u0260\u024b\u024b\u024b\u0254\u0254\u0255\u023a \u0256\u0256\u0256\u0256\u0256\u024c \u024e \u01d7\u01ee\u01d8\u01d9 \u01ef \u0228\u0228 \u01e2 [...]
- "\u0257\u0257\u0258\u0258\u0258 \u0259\u0261 \u025a\u025a\u025a \u0229\u0229\u0250\u0251\u0251\u025b\u025b\u025c\u025c \u025d\u025d\u025d\u025d \u0173\u0173\u0173\u01c1\u01e9\u01e9\u01e9\u01f7\u01f7 \u0181\u0181\u0181 \u0252\u0252\u0252\u0252 \u025e\u0222\u0222\u0222\u0262\u0263\u0264\u0260\u0260\u024b\u024b\u0215\u0254\u0254\u0255\u0265 \u024c \u024e\u024e \u01ee \u01d9\u01d9 \u01ef \u0228\u0228 \u01e2 ",
- " \u0266\u0257 \u0259\u0267 \u0268\u0269 \u0250\u0250\u0251\u025b\u025b\u025c\u025c\u0181\u01c1\u0173\u0173\u01c1\u0173\u0173\u0173\u0173\u01c1\u0173\u01c1\u01c1\u01e9\u01e9\u01f7\u01f7\u01f7 \u0181\u0181\u0181 \u0252\u0252\u0252\u0252 \u0222\u0222\u0222\u0222\u0262\u0262\u026a\u0263\u026b\u026c\u024b\u024b\u021e\u021e\u0215\u0254\u0255\u0255\u0265\u0265\u0265\u0265 \u026d\u026d\u026d\u026d\u026d \u026e \u024e\u024e \u01d7\u01d7 \u01d9\u01d9\u01ef\u01ef \u0 [...]
- "\u0266 \u0257\u0257 \u0261\u0261\u0267 \u026f \u0270\u0270\u0251\u025b\u025b\u025b\u025c\u0229\u0229\u0222\u0222\u0181\u0181\u0181 \u01e9\u01e9\u0271\u01f7\u01f7\u0181\u0181\u0181 \u0252\u0252\u0252 \u0222\u0222\u0222\u0222\u0262\u0262\u0262\u0262\u0272\u0272\u0263\u0273\u026c\u0274 \u021d\u021d\u021e\u0254\u0254\u0255\u020d\u020d\u0265 \u026d\u026d\u026d\u026d\u026d \u026d\u026d\u026e\u026d\u026d\u026d \u024e\u024e \u01d7\u01ee \u01d9 \u01ef \u0228 \ [...]
- "\u0266 \u0257\u0257 \u0261 \u0267 \u026f \u0270\u0270\u0275\u0275\u025b\u025b\u025c\u025c \u0229\u0229\u0222\u0181\u0181\u0181\u0181\u0181\u0181\u0181\u0181\u0181\u0181\u0276\u0276\u0276\u0252\u0252 \u0222\u0222\u0222\u0222\u0222\u0222\u0229\u0262\u0262\u0262 \u0272\u0277\u0263\u026b\u0278\u026c\u0279 \u027a\u021d\u021d\u0254\u0255\u0255\u027b\u020d\u027c \u026d\u026d\u026d \u027d\u027d\u027d\u027d\u027d\u027d\u027d\u027d\u027d \u026e \u026d\u026d\u026d \u01d7\u01d7 [...]
- " \u0257\u0257\u0261 \u0267 \u026f \u0270\u0270\u0275\u0275\u027f\u027f\u025c\u025c\u0280 \u0281\u0282\u0229\u0229\u0222\u0222\u0222\u0276\u0276\u0276\u0276\u0276\u0222\u0222\u0222\u0222\u0222\u0222\u0222\u0222\u0229\u0262\u0262\u0262\u0262\u0262\u0262 \u0283\u0283\u0272\u0277\u0277\u026b\u0278\u0279\u0284\u0274 \u027a \u0254\u0254\u0255\u0215\u027c\u027c\u027c\u0285\u0286\u0287\u0288\u0288\u027d \u027d\u027d\u027d\u027d \u026d\u026d \u01d7\u01ee\u01d8\u01d9\u [...]
- " \u0289\u0257 \u0267 \u026f \u0270\u0275\u0275\u027f\u027f\u028a\u028a \u0280 \u0281\u0281\u028b\u028b\u028b \u028c\u0276\u0276\u0276\u0276\u0229\u0229\u0262\u0262\u0262\u0262\u0262\u0262\u0262\u0262 \u0283\u028d\u028e\u0272\u0277\u0263\u0273\u0278\u0279\u0284\u0274 \u027a \u0254\u0255\u0255\u027c\u027c\u0285\u0285\u0286\u028f \u0288 \u027d\u027d\u027d \u026d\u026d \u01d7\u01ee\u01d8\u01d9\u01ef \u0228\u0228 \u01e2 \u027e\u027e\ [...]
- " \u0289 \u0257\u0257 \u026f \u0270\u0270\u0275\u027f\u027f\u027f\u028a \u0280 \u0281\u0281\u028b\u028b \u028c\u028c\u028c \u0262\u0262\u0262\u0262\u0262\u0262 \u0283\u028d\u028d\u028d\u028e\u0277\u026b\u026b\u0278\u0279\u0284\u0274\u027a\u027a \u0254\u0255\u027c\u0285\u0285\u0286\u0286\u020d\u020d\u0291\u0292 \u027d\u027d\u027d \u026d \u01ee\u01ee\u01d8\u01ef\u01ef \u0228\u0228\u01e2\u01e2 \u027e\u027e\u027e\u027e\u027e\u027e\ [...]
- " \u0289\u0289 \u0257\u0257 \u0270\u0270\u0275\u027f\u027f\u027f\u028a \u0280\u0281\u0281\u028b\u028b \u028c\u0262\u0262\u0262\u0262\u0262 \u0283\u028d\u028d\u028d\u028e\u0277\u0277\u0263\u0273\u0278\u0279\u0284\u0274\u027a\u027a \u0293\u0294\u027c\u0285\u0285\u0286\u021e\u0215\u027b\u020d\u0291\u0292 \u027d\u027d \u026d\u026d\u01d7\u01ee\u01d8\u01ef \u0228\u0228 \u027e\u027e\u027e\u027e\u027e\u027e\u0290\u0290\u0290\u0290\ [...]
- " \u0289\u0289 \u0295\u0295\u0257\u0270\u0270\u0275\u0275\u027f\u027f\u028a\u028a \u0296\u028b\u028b \u028c\u028c\u0262\u0262\u0262 \u028d\u028d\u028e\u028e\u0277\u0277\u0297\u026c\u0278\u0284\u0284 \u027a\u027a \u0293\u0294\u0298\u0298\u0286\u0286\u021e\u021e\u021e\u0215\u020d\u020d\u0291\u0292\u0292\u0292\u0292 \u027d \u026d\u026d\u01d7 \u01d8\u01ef \u01e2 \u027e\u027e\u0299\u027e\u027e\u027e\u0290\u0290\u0290\u0290\u0290\u02 [...]
- " \u0289 \u0295\u0295 \u029a\u029a\u0275\u0275\u027f\u027f\u029b\u029b \u0281\u0281\u028b\u0296 \u028c\u0262\u0262\u0262 \u029c\u029d\u028e\u028e\u0277\u0277\u026b\u026c\u0278\u0284\u0284 \u027a\u027a \u0293\u0298\u0298\u0286\u029e\u029f\u021d\u021e\u021e\u021e\u0215\u020d \u0292\u0292\u0292\u0292\u0292\u0292\u0292 \u027d\u027d \u026d\u01d7\u01d7\u01d8\u02a0\u01ef \u01e2\u01e2 \u02a1\u02a1\u02a1\u02a1\u027e\u0290\u0290\u0290\u0290\u02 [...]
- " \u0289 \u0295\u0295 \u029a\u0275\u0275\u027f\u027f\u029b\u029b \u0281\u0281\u028b \u02a2\u02a2\u0262\u0262 \u029c\u029d\u028e \u0277\u0263\u0297\u026c\u0278\u0284\u0284 \u027a \u0293\u0298\u0298\u02a3 \u029f\u029f\u021d\u021d\u021e\u021e\u0215\u0215\u020d \u02a4 \u0292\u0292\u0292\u0292\u0292\u0292\u0292 \u027d\u027d \u026d\u01d7\u01d8\u01ef\u01ef \u02a5\u02a1\u02a1\u02a1\u02a6\u02a6\u02a6\u02a7\u02a7\u0290 ",
- " \u0289 \u0295\u029a\u029a\u0275\u027f\u027f\u027f\u029b \u0281\u0281\u028b \u02a8\u02a9\u02a9\u02a9 \u029c\u029d\u028e \u0277\u0263\u026b\u026c\u0279\u0284\u0274\u027a\u027a \u0293\u0298\u0298 \u02aa\u029f \u021d\u02ab\u021e\u021e\u0215\u020d \u02a4 \u02ac\u0292\u0292\u0292\u0292\u0292\u0292\u027d\u027d \u01d7\u01ee\u01d8\u02a0 \u02a5\u02a5\u02a5\u02a5\u02a6\u02a6\u02a6\u02a6\u02a6\u02ad\u02ad ",
- "\u0289\u0289 \u029a\u029a\u0275\u0275\u027f\u027f\u029b \u0281\u028b \u02ae\u02ae \u02a9\u02af \u029d\u028e\u028e\u02af\u0277\u026b\u0273\u026c\u0279\u0284\u0274\u027a\u027a \u0293\u0298 \u02aa\u02aa \u021d\u021d\u021e\u021e\u0215\u0215\u020d \u02a4 \u02ac \u027d\u027d \u026d\u02b0\u02b1\u02b2\u02b3\u02b3\u02b3\u02a5\u02a6\u02a6\u02a6 \u02ad\u02ad ",
- "\u0289 \u029a\u029a\u0275\u0275\u027f\u027f\u029b\u02b4 \u02b5\u02b6 \u02a8\u02ae\u02ae \u02af \u029c\u029d\u028e\u028e\u0277\u0277\u0263\u026b\u0278\u0279\u0284\u0274\u027a\u027a \u0293\u0293\u0298 \u02aa\u02aa\u029f \u021d\u021d\u021e\u021e\u0215\u020d\u02b7 \u02a4 \u02ac \u027d \u026d\u02b3\u02b3\u02b8\u02b8\u02b8\u02b9 \u02ad\u02ad\u02ad\u02ad ",
- " \u029a\u0275\u0275\u027f\u027f\u029b\u02b4\u02b4 \u02b5\u02b6 \u02a8\u02a8 \u02ba\u02af \u029c\u029d\u028e\u028e\u0277\u0263\u026b\u0273\u0278\u0284\u0284\u0274\u027a\u027a \u0293\u0293\u0298 \u02aa\u02aa \u029f \u02ab\u021d\u021e\u021e\u0215\u0215\u02bb \u02a4\u02a4 \u02ac \u027d \u02b3\u02b3\u02b8\u02b8\u02b8\u02b8\u01d9\u02bc\u02bc \u02ad\u02ad\u02ad\u02ad\u02ad ",
- " \u029a\u029a\u0275\u027f\u027f\u029b\u02b4\u02b4 \u02b5\u02b5 \u02ae\u02ae \u02ba\u02ba \u02af \u029c\u029d\u028e\u02af\u0277\u0277\u0297\u0273\u0278\u0284\u0284 \u027a \u0293\u0293\u0298 \u02aa\u02aa \u029f \u021d\u02bd\u021e\u021e\u0215\u02bb\u02b7 \u02a4 \u02ac \u02be\u02b3\u02b8\u02b8\u02b8\u02b0\u02b2\u01d9\u01d9 \u02ad\u02ad\u02ad\u02ad\u02ad ",
- " \u029a\u029a\u0275\u027f\u027f\u027f\u029b\u02b4 \u02bf\u02c0 \u02a8\u02ae \u02ba\u02ba \u02af \u029c\u029d\u028e\u02af\u0277\u0263\u026b\u026c\u0278\u0284\u0284\u027a\u027a \u0293\u0298\u0298 \u02aa\u02aa \u029f \u02bd\u021e\u021e\u0215\u0215\u02b7 \u02a4 \u02ac \u02be\u02be\u02be\u02c1\u02b8 \u026d\u02b0\u02b2\u01d9\u01d9 \u02c2\u02c3 \u02ad\u02ad\u02ad\u02ad\u02ad ",
- " \u029a\u029a\u0275\u027f\u027f\u027f\u029b\u02b4 \u02c0 \u02a8\u02ae \u02ba\u02ba \u02af\u02af \u029c\u029d\u028e\u02af\u0277\u026b\u026b\u026c\u0279\u0284\u0274\u027a\u027a \u0293\u0293\u0298 \u02aa\u02aa \u029f\u029f \u02bd\u02bd\u021e\u021e\u0215\u02bb \u02a4 \u02ac \u02be\u02be\u02c1\u02c1 \u02b0\u02b1\u02b2\u01d9\u01d9 \u02c3\u02c3 \u02ad\u02ad\u02ad\u02ad ",
- " \u029a\u0275\u0275\u027f\u027f\u029b\u02b4 \u02bf\u02c0\u02a8\u02ae \u02ba \u02af\u02af \u02c4\u02c4 \u029c\u029d\u028e\u028e\u0277\u0277\u0263\u0297\u0278\u0279\u0284\u0274\u027a\u027a \u0293\u0293\u0298 \u02aa\u02aa \u029f \u02bd\u021e\u021e\u0215\u02bb \u02a4 \u02ac \u02be\u02be\u02be\u02c1\u02c1 \u02b0\u02b0\u02b2\u01d9\u01d9 \u02c3 \u02ad\u02ad\u02ad\u02ad ",
- " \u029a\u029a\u0275\u027f\u027f\u029b\u02b4\u02b4 \u02bf\u02c0\u02a8\u02ae \u02ba \u02af\u02c4\u02c4 \u029c\u029d\u028e\u028e\u0277\u0263\u026b\u0273\u0278\u0279\u0284\u0274\u027a\u027a \u0293\u0298\u0298 \u02aa\u02aa \u02c5\u02c5\u02c5\u02c5\u02c5 \u02bd\u021e\u021e\u0215 \u02a4 \u02ac \u02be\u02be\u02be\u02c1\u02c1 \u026d\u02b1\u02b2\u01d9 \u02c3 \u02ad\u02ad\u02ad\u02ad",
- "\u02c6\u02c6 \u029a\u029a\u0275\u027f\u027f\u029b\u029b\u02b4 \u02bf\u02c0\u02a8\u02ae \u02ba \u02af \u029c\u029d\u028e\u028e\u0277\u0277\u0263\u0273\u0278\u0279\u0284\u0274\u027a \u0293\u0298 \u02aa \u02c5\u02c5 \u02c5\u02c5 \u02bd\u021e\u021e\u0215\u02b7 \u02a4\u02a4\u02a4\u02a4\u02a4\u02a4\u02a4 \u02ac \u02be\u02be\u02c7\u02c1\u02c8 \u026d\u02b0\u02b2\u02b2\u01d9 \u02c3 \u02ad",
- " \u02c6\u029a\u029a\u0275\u027f\u027f\u027f\u029b\u02b4 \u02c0 \u02ae \u02ba\u02ba \u02af\u02af \u029c\u029d\u028e\u02af\u0277\u0263\u0297\u026c\u0278\u0284\u0284\u0274\u027a \u0293\u0293\u0298 \u02aa\u02c9 \u02c5\u02c5\u02c5 \u02c5 \u02bd\u021e\u02bb\u02bb \u02a4\u02a4\u02a4\u02a4\u02a4\u02be\u02be\u02be\u02c7\u02c7 \u02c8\u02c8 \u026d\u02b1\u02b1 \u01d9 \u02c3 ",
- " \u029a\u029a\u0275\u0275\u027f\u027f\u029b\u02b4 \u02bf\u02c0\u02ae\u02ae \u02ba\u02ba \u02af\u02af\u02af\u029c\u029d\u028e\u02af\u0277\u0263\u026b\u026c\u0279\u0284\u0284\u027a\u027a \u0293\u0293 \u02ca\u02ca \u02cb\u02cb\u02c5\u02c5 \u02c5 \u02bd\u02bd\u02bb\u02cc \u02cd\u02cd\u02be\u02c7\u02c7 \u02ce\u02c8\u02cf\u02cf \u026d\u02b0\u02b2 \u01d9 \u02c3\u02c3 ",
- " \u029a\u029a\u0275\u027f\u027f\u029b\u02b4\u02b4 \u02c0\u02c0\u02a8\u02ae \u02ba\u02ba \u029c\u028e\u028e\u02af\u0277\u0263\u0297\u026c\u0278\u0284\u0284\u027a\u027a \u0293\u02d0 \u02ca \u02cb \u02c5 \u02c5\u02d1\u02d1\u02bb \u02cd\u02cd\u02d2\u02d2 \u02ce\u02ce\u02ce \u02c8 \u02cf \u026d\u02b1\u02b2\u01d9\u01d9 \u02c3\u02c3 ",
- "\u029a\u029a\u0275\u027f\u027f\u029b\u029b\u02b4 \u02bf\u02c0\u02a8\u02ae \u02ba\u02ba \u029d\u028e\u028e\u0277\u0277\u02d3\u026b\u026c\u0279\u0284\u0274\u027a\u027a \u0293\u02d4\u02d0 \u02ca \u02c5\u02c5 \u02c5\u02c5\u02c5\u02bd\u02bd\u02bb\u02b7 \u02cd\u02cd\u02c7\u02c7\u02d5 \u02c8\u02cf\u02cf \u02b0\u02b0\u02b2\u01d9\u01d9 \u02c3 ",
- "\u029a\u0275\u027f\u027f\u027f\u029b\u02b4 \u02c0\u02a8\u02ae \u02ba\u02ba \u029d\u028e\u028e\u0277\u0277\u02d3\u0273\u0278\u0279\u0284\u0274\u027a\u027a \u0293\u0293\u02d0 \u02d6\u02d6\u02ca \u02c5\u02c5\u02c5 \u02d7\u02bd\u02bd\u02bb \u02cd\u02cd\u02c7\u02c7 \u02d5 \u02c8\u02c8\u02cf\u02cf \u026d\u02b1\u02b2\u01d9 \u02c3 ",
- "\u0275\u027f\u027f\u027f\u029b\u02b4 \u02bf\u02c0\u02ae \u02ba\u02ba \u02af\u029d\u028e\u028e\u0277\u0277\u02d3\u02d8\u02d9\u0279\u0284\u0274\u027a \u0293\u02d0 \u02d6\u02d6\u02ca \u02d7\u02bd\u02bb\u02bb \u02cd\u02cd\u02c7\u02c7 \u02d5 \u02c8\u02c8\u02cf \u02b0\u02b2\u02b2\u01d9 \u02c3 ",
- "\u0275\u027f\u027f\u029b\u02b4\u02b4 \u02c0\u02c0\u02a8\u02ae \u02ba \u02af\u02af\u029d\u029d\u028e\u02da\u0277\u02db\u02dc\u02d9\u02dd\u0284\u0274\u027a \u0293\u0293\u02d0 \u02d6\u02d6 \u02ca \u02d7\u02bd\u02bd\u02bb\u02b7 \u02cd\u02cd\u02c7\u02c7 \u02d5 \u02c8 \u02cf \u02b1\u02b2 \u01d9 \u02c3\u02c3 ",
- "\u027f\u027f\u029b\u02b4\u02b4 \u02bf\u02c0\u02ae\u02ae \u02ba \u02af\u02af \u029d\u028e\u028e\u02da\u0277\u02d8\u02dc\u02dd\u02de\u02df\u027a\u027a \u0293\u0293\u02d0 \u02d6 \u02ca\u02ca \u02d7\u02bd\u02bd\u02bb\u02b7\u02b7\u02cd\u02cd\u02c7\u02c7 \u02d5 \u02c8 \u02cf \u02b0\u02b0\u02b2\u01d9\u01d9 \u02c3\u02c3 ",
- "\u027f\u029b\u029b\u02b4 \u02bf\u02c0\u02a8\u02ae \u02ba \u02af \u029d\u028e\u028e\u02da\u0277\u02d8\u02dc\u02dd\u02df\u02df\u027a\u027a \u0293\u0293\u02d0 \u02d6 \u02ca \u02d7\u02d7\u02bd\u02bd\u02bb\u02bb\u02cd\u02cd\u02c7\u02c7\u02e0\u02e0\u02e1 \u02d5 \u02c8 \u02cf \u02b0\u02b1\u02e2\u01d9\u01d9 ",
- "\u027f\u029b\u02b4 \u02bf\u02c0\u02ae \u02ba\u02ba \u02af \u029d\u028e\u028e\u02da\u0277\u02dc\u02d9\u02dd\u02df \u027a\u027a \u0293\u0293\u02d0 \u02d6\u02d6 \u02ca \u02d7\u02d7\u02bd\u02cc\u02e3\u02cd\u02e4\u02c7 \u02e1\u02e1\u02e1\u02d5\u02d5\u02d5\u02d5\u02d5 \u02c8\u02c8\u02e5\u02cf \u02b0\u02b1\u02b2\u01d9 ",
- "\u029b\u02b4 \u02c0\u02c0\u02a8 \u02ba\u02ba \u02af\u029d\u028e\u02da\u02da\u0277\u02d9\u02dc\u02df\u02df \u027a\u027a \u0293\u02e6\u0293 \u02d6\u02d6 \u02ca \u02e7 \u02d7\u02bd\u02bd\u02e3\u02cc\u02e4\u02c7 \u02d5\u02d5\u02d5\u02d5\u02d5\u02d5\u02d5\u02c8\u02c8\u02e5\u02cf \u02e8\u02b1\u02e9\u01d9 ",
- "\u02b4\u02b4 \u02bf\u02c0\u02ae\u02ae \u02ba\u02ba \u02af\u02af\u02da\u02da\u0277 \u02d9\u02de\u02de \u027a\u027a \u0293\u02e6\u02d0 \u02d6\u02d6 \u02ca\u02ca \u02e7\u02e7 \u02d7\u02ea\u02ea\u02cc\u02eb\u02c7 \u02d5\u02c8\u02e5\u02e5\u02cf \u02b0\u02b2\u02e2\u01d9 ",
- "\u02b4 \u02bf\u02c0\u02a8\u02ae \u02da\u0277\u0277 \u02dd\u02de \u027a\u027a \u02e6\u02e6\u02d0 \u02d6\u02d6 \u02ca\u02ca \u02e7 \u02ec\u02ea\u02ea\u02ea\u02cc\u02cc\u02ed \u02ee\u02c8\u02e5\u02cf\u02cf \u02b0\u02e8\u02e9\u02e9\u01d9 ",
- " \u02bf\u02a8\u02ae \u02da\u0277\u0277 \u02dd\u02ef \u027a\u027a\u0293\u0293\u02d0 \u02d6 \u02ca\u02ca \u02e7 \u02ec\u02ec\u02f0\u02f1\u02f1\u02d7\u02ed\u02ed\u02ed\u02ed \u02ee \u02c8\u02e5\u02cf\u02cf \u02f2\u02f2 \u02b0\u02e8\u02b2\u01d9\u01d9 ",
- " \u02c0\u02c0\u02a8 \u02da\u0277\u02f3\u02ef\u02dd \u027a\u0293\u0293\u02d0 \u02d6\u02d6 \u02ca\u02ca \u02e7 \u02ec\u02ec\u02f1\u02f1\u02f4\u02f5\u02f5\u02ed\u02ed\u02ed\u02ed\u02ed\u02ed \u02ee \u02c8\u02c8\u02e5\u02cf\u02cf\u02f2\u02f2 \u02e8\u02b1\u02e9\u01d9\u01d9 ",
- " \u02bf\u02c0\u02ae \u02da\u02da\u0277\u02f3\u02f6\u02ef\u027a\u027a\u0293\u0293\u0293 \u02d6\u02d6 \u02ca \u02e7 \u02f7\u02ec\u02ec\u02f1 \u02f4\u02f5\u02f5\u02f5\u02ed\u02ed\u02ed\u02ed\u02ed\u02ed\u02ed\u02ed\u02ed\u02ed\u02ed\u02ed\u02ed\u02f8\u02ed \u02f9\u02e5\u02e5\u02f2\u02f2 \u02b0\u02b1\u02e2\u01d9\u01d9 ",
- "\u02bf\u02c0\u02a8\u02ae \u02da\u02da\u0277\u02f3\u02f6\u02fa\u02fb\u02fb\u0293\u0293\u02d0 \u02d6\u02d6 \u02ca\u02ca \u02e7 \u02fc\u02f7\u02ec\u02f1\u02f1 \u02f4\u02f5\u02f5\u02f5\u02f5\u02ed\u02ed\u02ed\u02ed\u02ed\u02ed\u02ed\u02ed\u02ed\u02f8\u02f8\u02ed\u02ed\u02ed\u02ed\u02ed\u02ed\u02f9\u02e5\u02e5\u02cf \u02b0\u02b0\u02b2\u02e2\u01d9\u01d9 ",
- "\u02bf\u02ae\u02ae \u02da\u0277\u0277\u02f6\u02f6\u02fa\u02fb\u0293\u0293\u02d0 \u02d6\u02d6 \u02ca\u02ca \u02e7 \u02f7\u02f7\u02f7\u02ec\u02f1 \u02f4\u02f4\u02f5\u02f5\u02f5\u02f5\u02f5\u02f5\u02f5\u02f5\u02f5\u02f5\u02f5\u02f8\u02f5\u02f5\u02ed\u02ed\u02ed\u02ed\u02ed\u02f9\u02ed\u02e5\u02e5\u02cf \u02b0\u02b0\u02b2\u02e2\u01d9 ",
- "\u02a8\u02ae \u02da\u0277 \u02f6\u02f6\u02fa\u02fb\u0293\u0293 \u02d6 \u02ca\u02ca \u02fc \u02f1\u02f1 \u02f4\u02f4\u02f4\u02f4\u02f5\u02f4\u02f4\u02f4\u02f4\u02f4\u02f8\u02f5\u02f5\u02f5\u02f5\u02f5\u02f5\u02f5\u02ed\u02ed\u02f9\u02ed\u02ed\u02e5\u02cf \u02b0\u02b1\u02b2 \u01d9 ",
- "\u02ae \u02da\u02da\u0277 \u02fa\u02fa\u02fb\u0293\u02d0 \u02ca\u02ca \u02f5\u02f5\u02f5\u02f9\u02ed\u02ed\u02ed\u02cf\u02cf \u02b0\u02b1\u02b2 \u01d9 ",
- "\u02ae \u02da\u02da\u0277 \u02fa\u02fa\u02fb\u0293\u02d0 \u02ca \u02f9\u02f5\u02ed\u02ed\u02ed\u02ed\u02cf \u02b0\u02b2\u02b2\u01d9\u01d9 ",
- " \u02da\u0277\u0277 \u02fa\u02fa\u0293\u0293\u02d0 \u02ca\u02ca \u02f5\u02f5\u02f5\u02ed\u02ed\u02ed\u02cf \u02b0\u02b0\u02b2\u02b2\u01d9\u01d9 ",
- " \u02da\u02da\u0277 \u02fa\u02fa\u0293\u0293 \u02ca\u02ca \u02f5\u02f5\u02ed\u02ed\u02ed\u02cf \u02b0\u02b1\u02b2\u02b2\u01d9 ",
- " \u02da\u02da\u0277 \u02fa\u02fb\u0293\u02d0 \u02ca\u02ca \u02f5\u02f5\u02ed\u02ed\u02ed\u02cf \u02b0\u02b1\u02b2 \u01d9 ",
- " \u02da\u0277 \u02fa\u02fb\u0293\u02d0 \u02ca\u02ca \u02f5\u02f5\u02ed\u02ed\u02ed\u02cf \u02b0\u02b1\u02b2 \u01d9 ",
- " \u02da \u02fa\u02fa\u02fb\u0293\u02d0 \u02f5\u02ed\u02ed\u02ed\u02cf \u02b0 \u02b2\u01d9\u01d9 ",
- " \u02fa\u02fa\u0293\u0293\u02d0 \u02f5\u02ed\u02ed\u02ed\u02cf \u02b0\u02b1\u02b2\u02b2\u01d9 ",
- " \u02fa\u02fa\u0293\u0293\u02d0 \u02f5\u02ed\u02ed\u02ed\u02cf \u02b0\u02b1\u02b2 \u01d9 "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/road-casings-grouped-rendering-600-600-2.0-grid-reference.json b/tests/visual_tests/grids/road-casings-grouped-rendering-600-600-2.0-grid-reference.json
deleted file mode 100644
index 47f94f0..0000000
--- a/tests/visual_tests/grids/road-casings-grouped-rendering-600-600-2.0-grid-reference.json
+++ /dev/null
@@ -1,847 +0,0 @@
-{
- "keys": [
- "",
- "330",
- "155",
- "74",
- "57",
- "788",
- "774",
- "201",
- "202",
- "181",
- "228",
- "691",
- "523",
- "73",
- "749",
- "530",
- "385",
- "384",
- "286",
- "1",
- "156",
- "531",
- "361",
- "45",
- "43",
- "93",
- "46",
- "527",
- "589",
- "288",
- "215",
- "605",
- "138",
- "532",
- "588",
- "154",
- "362",
- "348",
- "328",
- "639",
- "635",
- "637",
- "638",
- "529",
- "497",
- "576",
- "300",
- "329",
- "237",
- "636",
- "600",
- "103",
- "534",
- "595",
- "137",
- "232",
- "593",
- "136",
- "104",
- "14",
- "180",
- "526",
- "592",
- "594",
- "323",
- "490",
- "327",
- "203",
- "256",
- "258",
- "528",
- "415",
- "442",
- "342",
- "596",
- "157",
- "343",
- "331",
- "257",
- "89",
- "598",
- "599",
- "367",
- "344",
- "335",
- "277",
- "597",
- "276",
- "275",
- "107",
- "126",
- "113",
- "369",
- "108",
- "590",
- "407",
- "414",
- "147",
- "99",
- "97",
- "124",
- "122",
- "110",
- "472",
- "591",
- "153",
- "100",
- "102",
- "173",
- "174",
- "481",
- "336",
- "406",
- "75",
- "159",
- "96",
- "72",
- "200",
- "266",
- "265",
- "263",
- "269",
- "231",
- "419",
- "179",
- "182",
- "525",
- "371",
- "370",
- "391",
- "313",
- "390",
- "183",
- "417",
- "411",
- "392",
- "315",
- "473",
- "479",
- "446",
- "146",
- "475",
- "474",
- "401",
- "421",
- "445",
- "483",
- "551",
- "480",
- "356",
- "476",
- "583",
- "324",
- "389",
- "839",
- "462",
- "655",
- "325",
- "393",
- "724",
- "440",
- "267",
- "227",
- "620",
- "477",
- "582",
- "268",
- "535",
- "464",
- "299",
- "16",
- "271",
- "259",
- "225",
- "247",
- "463",
- "693",
- "270",
- "548",
- "467",
- "465",
- "422",
- "418",
- "261",
- "489",
- "633",
- "466",
- "238",
- "244",
- "246",
- "482",
- "634",
- "671",
- "333",
- "326",
- "239",
- "248",
- "488",
- "448",
- "245",
- "484",
- "460",
- "332",
- "378",
- "25",
- "577",
- "461",
- "471",
- "381",
- "188",
- "565",
- "470",
- "469",
- "334",
- "379",
- "355",
- "284",
- "279",
- "175",
- "668",
- "550",
- "562",
- "373",
- "665",
- "354",
- "632",
- "485",
- "570",
- "575",
- "673",
- "131",
- "404",
- "587",
- "585",
- "549",
- "663",
- "41",
- "285",
- "739",
- "478",
- "40",
- "262",
- "690",
- "78",
- "145",
- "358",
- "226",
- "260",
- "283",
- "687",
- "486",
- "133",
- "672",
- "95",
- "121",
- "322",
- "195",
- "264",
- "177",
- "396",
- "321",
- "359",
- "15",
- "402",
- "55",
- "686",
- "619",
- "641",
- "615",
- "397",
- "59",
- "236",
- "282",
- "204",
- "786",
- "618",
- "614",
- "376",
- "58",
- "773",
- "212",
- "692",
- "584",
- "400",
- "56",
- "199",
- "375",
- "374",
- "31",
- "405",
- "640",
- "579",
- "670",
- "319",
- "357",
- "505",
- "743",
- "493",
- "50",
- "92",
- "38",
- "784",
- "847",
- "320",
- "841",
- "213",
- "568",
- "741",
- "492",
- "39",
- "840",
- "254",
- "747",
- "827",
- "607",
- "53",
- "398",
- "439",
- "753",
- "224",
- "158",
- "438",
- "214",
- "835",
- "223",
- "626",
- "5",
- "54",
- "61",
- "119",
- "838",
- "302",
- "62",
- "52",
- "22",
- "165",
- "494",
- "13",
- "769",
- "622",
- "491",
- "301",
- "423",
- "118",
- "252",
- "222",
- "631",
- "317",
- "318",
- "495",
- "36",
- "304",
- "697",
- "630",
- "123",
- "760",
- "621",
- "674",
- "2",
- "253",
- "255",
- "846",
- "77",
- "453",
- "3",
- "710",
- "771",
- "708",
- "628",
- "291",
- "383",
- "308",
- "830",
- "726",
- "617",
- "625",
- "564",
- "581",
- "295",
- "292",
- "365",
- "722",
- "845",
- "624",
- "656",
- "666",
- "42",
- "294",
- "732",
- "694",
- "623",
- "627",
- "606",
- "580",
- "456",
- "47",
- "716",
- "507",
- "629",
- "654",
- "653",
- "293",
- "23",
- "613",
- "65",
- "48",
- "144",
- "459",
- "836",
- "780",
- "184",
- "457",
- "125",
- "844",
- "139",
- "616",
- "679",
- "681",
- "682",
- "458",
- "29",
- "833",
- "834",
- "831",
- "719",
- "825",
- "842",
- "166",
- "511",
- "26",
- "27",
- "30",
- "772",
- "219",
- "220",
- "610",
- "675",
- "17",
- "518",
- "509",
- "63",
- "770",
- "768",
- "689",
- "221",
- "506",
- "677",
- "35",
- "37",
- "120",
- "766",
- "738",
- "680",
- "678",
- "730",
- "740",
- "676",
- "443",
- "714",
- "745",
- "832",
- "755",
- "11",
- "444",
- "703",
- "717",
- "826",
- "501",
- "142",
- "642",
- "117",
- "713",
- "130",
- "742",
- "767",
- "503",
- "20",
- "18",
- "731",
- "808",
- "185",
- "170",
- "727",
- "90",
- "521",
- "569",
- "70",
- "191",
- "234",
- "515",
- "513",
- "522",
- "701",
- "311",
- "545",
- "684",
- "556",
- "517",
- "516",
- "514",
- "733",
- "211",
- "141",
- "519",
- "699",
- "350",
- "310",
- "210",
- "64",
- "520",
- "303",
- "725",
- "729",
- "524",
- "450",
- "744",
- "822",
- "349",
- "192",
- "135",
- "746",
- "815",
- "813",
- "820",
- "189",
- "190",
- "546",
- "643",
- "24",
- "33",
- "34",
- "510",
- "705",
- "721",
- "712",
- "193",
- "553",
- "538",
- "555",
- "817",
- "707",
- "559",
- "539",
- "795",
- "818",
- "351",
- "603",
- "604",
- "76",
- "750",
- "794",
- "683",
- "206",
- "544",
- "706",
- "819",
- "779",
- "783",
- "787",
- "789",
- "711",
- "32",
- "807",
- "805",
- "793",
- "297",
- "852",
- "235",
- "105",
- "44",
- "542",
- "759",
- "791",
- "290",
- "347",
- "289",
- "160",
- "536",
- "51",
- "757",
- "728",
- "811",
- "781",
- "785",
- "169",
- "810",
- "778",
- "541",
- "504",
- "98",
- "709",
- "148",
- "134",
- "748",
- "809",
- "704",
- "426",
- "163",
- "149",
- "4",
- "752",
- "346",
- "341",
- "305",
- "167",
- "162",
- "754",
- "12",
- "109",
- "67",
- "828",
- "540",
- "340",
- "10",
- "168",
- "824",
- "112",
- "554",
- "763",
- "68",
- "756",
- "428",
- "106",
- "229",
- "829",
- "496",
- "128",
- "127",
- "161",
- "249",
- "761",
- "782",
- "176",
- "132",
- "688",
- "561",
- "537",
- "306",
- "19",
- "432",
- "307",
- "309",
- "111",
- "171",
- "129",
- "164",
- "250",
- "178",
- "695",
- "21",
- "116",
- "804",
- "775",
- "197",
- "360",
- "803",
- "802",
- "800",
- "806",
- "801",
- "799",
- "798",
- "797",
- "217",
- "216",
- "718",
- "150",
- "843",
- "720",
- "790",
- "338",
- "152",
- "69",
- "151",
- "7",
- "86",
- "8",
- "207",
- "218",
- "796",
- "451",
- "88",
- "6",
- "172",
- "777",
- "558",
- "452",
- "209",
- "208",
- "776"
- ],
- "data": {},
- "grid": [
- " !! ##$$ %%%%&&' (( )))) *** + ",
- " !! ##$$ %%%,&& (( )))) **** ++ ",
- " - . !! ###$$ %%%/,'' (( )))) **** ++ ",
- " -- ... !! ###$$ %%//&' (( )))) **** +++ ",
- " -- 00 ... !! ###$$1 22%%%/&&' (( )))33 *** +++ ",
- " -- 00 .... !! ###$$1 222%%%,&&44 (( )))33 **** ++ ",
- " -- 00 5.... !! ###$$1 222%%%/,'4444 (( ))))33 **** +++ ",
- " -- 00 655.... !! 7777777 8##$$112229%%//&'4444 (( ))) 333**** ++++ ",
- " -- 00 65555.... !! 7777777 ###$$112229%%/&&'4444 ( ))) 33*** ++++ ",
- " -- 00 66 5555...:. !! 77 ##;$$12229%%%,&&4444 ( )) 33** ++++ ",
- " << 00 66= 5555.:::. !! 77 ###$$$12229%%%,&'4444 (( ))>>*33* ++++++ ? ",
- " <<<<<< @ 0 66=== 5555::.... !! 77 ###A$$1229%%//,''444 ( )) >>333++++++++ ???? ",
- " -- <<<<<<@ BBB 666 ==C CC555D...... !! 77 EEEEF ###AAAG1299%%/&&'4444 ( )))*>*33+++ ??? ???? ",
- " --HHIJJK<<LLLBBBBBB 66 CCCCCCCC55DDD..... !! EEEEEEFFF###AAAG229%%%/&&'4444 (( )) **33+ ??? ?? ",
- " --HHHHHHHMM BBBBBBB6 CC CC NNNDDDDD ..... !! O OOFF##AAAP9999%%%,&'4444 (()) *QQQ3 ???? ",
- " --HRJJHHHMM BBB CC CC SSSS DDDDD...... !! OO OO T##AAAP999%%%%,&'4444 ()))QQQQ+ ?????????? ",
- "U-HHRJJKHHMM CC CCC NVVSSSSDDDDD ..... !! OO OO TTWWPP9999%%/%&''444 ))QQQ ++ ?????XX ? ",
- "UUHHHHHKHMM CCCCCC YYVVVSSSSDDDDD ....Z !! OO OOTTT[[PP]]]]%%/&&'4444 ))QQ^^++ ??? XX ",
- "___IHHHHHMM CCCCC N`YYYVVVSSSaDDDDD..ZZ.. !! OOOOOO TT[[[P ]]]%%%,&'4444 bbQQ ^^++ ??? XX ",
- "-_____KHHM CCC cNN```YYYVVV aaDDDDDZZZ.... ! OOOO T[[[dd ]]]%%%,&'4444 bbbeQQ ^++ f?? XXggg ",
- "- _____hM cciii````YYY aa DDDDDDZ.....!!jj TT[[[kkkk]%%%/,&'4444 bbbeeQQ ^++ f?? gggg ",
- " _hh cc iiii``` aa lllDDDDDDD..mm.jjjj TT[[nnook]%%//&'4444 bbb eeQ ^++ ?? ppgg qqq",
- " hh c cc iiii`iaa rrllssDDDDDmmm...jjjjjjtT[[[uuuok]%%/&&'444v bbb eeQ ^+www++++++ ?? XXgpqqqqqqqqqqqqqqqqqqq",
- " hh cccccc iiiaixxrrsslllDDDmmm.....jjjjTT[[[uuuuu%%%%&&4444vvb eeQyyyywwwwwwwz+{+qqqqqqqqqqqqqq||qqqq}}}}}}}}}}}}}}}}}",
- " hh ccc c aiixxxssrrlllDmmDDD.......TT[[~nnnnn%%%,,'4444bv \u007f\u007f\u007fe\u007f\u007f\u007f\u007f\u007f\u007f\u007f\u007f\u007f\u007f\u007f\u007f\u007f{{{}}}}}}}}}}}}}}|||}}}}}}}}}}}}}}}}}}}}",
- " hh ccc iiiixsxrrrr\u0080\u0081\u0082DDDDD\u0083\u0083\u0083\u0083..T[[[\u0084\u0084\u0084\u0084\u0084\u0084\u0085\u0085\u0085\u0085\u0085\u0085\u0085\u0085\u0085\u0086\u0086\u007f\u007f\u007f\u007f\u007f\u007f\u007f\u007f\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0088\u0088\u0088}}}}}}}}}}}}}}||}}}}}}}}}}}}} ",
- " hh cc \u0089 iisxxxrr\u008a\u0082\u0082\u0081\u0081\u0081D\u0083\u0083\u0083\u0083\u0083\u0083\u0083\u0083\u008b\u008b\u008c\u0084\u0084\u0084\u0084\u008c\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u0086\u0086\u007f\u007f\u007f\u007f\u007f\u007f\u007f\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0087\u0088\u0088\u0088}}}}}\u008e}}}} \u008f\u008f ",
- " h cc \u0089\u0090\u0089\u0089 iiiixx\u0091\u0082\u0082\u0092\u0081\u0081\u0081 \u0093\u0093\u0083\u0094\u0094\u0083\u0083\u008b\u008b\u008c\u008c\u008c\u008c\u008c\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u0095\u0095\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0096\u0097\u0098\u0099\u009a\u009a\u009b\u009b\u009c\u009c\u009c\u009c\u009c\u009c++ \u008e\u008e \u008f ",
- " hh cc \u0089\u0089\u0090\u0089\u0089\u0089\u0089 ii \u0091\u0082\u0091\u0092\u0092i\u009diii\u0093\u0094\u0094\u0094\u008b\u008b\u008b\u008c\u008c\u008c\u008c\u008c\u008c\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u008d\u008d \u009e\u009e \u0097\u0097\u0098\u0099\u009f\u009f\u009b\u009b\u009b\u009c+++++ \u008e\u008e \u008f\u008f ",
- "\u00a0 hh ccc \u0089\u0089\u0089\u0090 \u0089\u0089\u0089 iiiiiiiiii\u009diiii\u00a1\u0094\u0094\u008b\u008b\u008b\u00a2\u00a3\u00a4\u00a5\u00a5%%%%,,4444 \u009e\u009e \u0097\u0097\u0098\u00a6\u009f\u009f\u009f+ \u008e\u008e \u008f\u008f ",
- "\u00a0\u00a0\u00a0\u00a0hh ccc \u0089\u0089\u0089\u0090\u0090 iii \u00a7\u00a7 \u00a8\u0094\u0094\u0094\u008b\u00a9\u00a3\u00a4\u00aa\u00a5\u00a5%%%/&&'444 \u009e\u009e \u0097\u0097\u0098\u0098\u009f + \u008e\u008e \u008f\u008f ",
- " \u00a0\u00a0\u00a0hh cc \u0089\u0089 \u0090\u0090 \u00ab\u00ac\u00ab\u00ab \u00a7\u00a7 \u00ad\u00ae\u0094\u008b\u008b\u00a9\u00a3\u00a4\u00aa\u00a5%%%%/&&'444 \u009e \u0097\u0098\u0098\u009f\u009f ++ \u008e\u008e \u008f\u008f ",
- " h\u00a0\u00a0\u00a0\u00a0 cc \u0089\u0089 \u0090\u0090 \u00af\u00af\u00b0\u00b0 \u00ac\u00ac\u00ab\u00ab\u00ab\u00ab \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b2\u00b2 \u00b3\u00ae\u008b\u008b\u008b\u00a9\u00a3\u00a4\u00aa\u00a5%%%%/&&'444 \u009e\u009e \u0097\u0097\u0098\u00a6\u009f ++ \u008e\u008e \u008f ",
- "\u00b4\u00b4 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cc \u0089\u00b5\u0089 \u0090\u0090 \u00af\u00af\u00b0\u00b0\u00b0\u00b0 \u00b6\u00b6 \u00ab\u00ab\u00ab\u00ab \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b2\u00b2 \u00b3\u00b3\u00ae\u008b\u008b\u00a9\u00a3\u00a3\u00aa\u00aa\u00a5%%%%/,&444\u00b7 \u009e\u009e \u0097\u0097\u0098\u00a6\u00a6\u009f++ \u008e\u008e \u008f\u008f ",
- "\u00b4\u00b4\u00b4 \u00a0\u00a0\u00a0\u00a0 ccc \u0089\u0089\u00b5\u00b5 \u0090\u0090\u0090\u0090\u00b8 \u00b0\u00b9\u00b9\u00b6\u00b6\u00ac\u00ac\u00ac \u00ab\u00ab \u00b1\u00b1 \u00ba\u00b1 \u00b3\u00ae\u00ae\u008b\u008b\u00bb\u00a3\u00a3\u00aa\u00aa\u00a5%%%%\u00bc,&444\u00b7 \u009e\u009e \u0097\u0097\u0098\u0098\u00a6\u00a6\u009f++ \u008e\u008e \u008f\u008f ",
- " \u00b4\u00b4\u00b4\u00b4 \u00a0 ccc \u0089\u00b5\u00b5 \u00bd\u00bd\u0090\u0090\u0090\u00b8\u00b8 \u00b9\u00be\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ab \u00bf\u00bf \u00ba\u00ba \u00b3\u00ae\u008b\u008b\u008b\u00bb\u00bb\u00a3\u00c0\u00c0\u00a5%%%/\u00bc\u00c1'444\u00c2 \u009e \u0097\u0097\u0098\u0098\u00c3\u00c4++ \u008e\u008e \u008f\u008f ",
- " \u00b4\u00c5\u00c5\u00c5\u00c5 cccccc \u0089\u0089\u00b5\u00b5\u00bd\u00bd\u00bd\u00bd\u00bd\u00af\u00bd\u00b8\u00c6\u00c6\u00b8\u00c7\u00c7 \u00ac\u00ac\u00ac \u00bf\u00bf \u00ba\u00ba \u00b3\u00ae\u008b\u008b\u008b \u00a3\u00a3\u00c0\u00a5%%%%\u00bc\u00bc&&444\u00c2 \u009e\u009e \u0097\u0097\u00c8\u00c8\u00c3\u00c3 ++ \u008e\u008e \u008f\u008f ",
- " \u00b4\u00b4\u00c5\u00c5\u00c5\u00c5cccc \u0089\u0089\u00bd\u00bd\u00b5\u00b5\u00c9\u00c9\u00c9\u00ca\u00ca\u00bd\u00c6\u00c6\u00b8\u00b8\u00c7\u00c7 \u00ab \u00bf \u00ba\u00ba \u00cb\u00b3\u00ae\u008b\u008b \u00a4\u00c0\u00c0\u00aa\u00cc%%%\u00bc\u00bc&'444\u00c2\u00b7 \u009e\u009e \u0097\u0097\u00cd\u00c8\u00ce\u00cf\u00cf+++ \u00d0\u008e\u008e \u008f ",
- " \u00b4\u00b4\u00b4\u00c5\u00c5\u00c5 \u0089\u0089\u00bd \u00b5\u00b5\u00c9\u00c9\u00c9\u00c9\u00c9\u00c9\u00c9\u00d1\u00bd\u00c7\u00c7 \u00ab\u00ab \u00bf\u00bf \u00ba \u00b3\u00ae\u00ae\u008b\u008b \u00a4\u00c0\u00c0\u00aa\u00cc%%%\u00bc\u00d2&4444\u00c2\u00b7 \u009e\u009e \u0097\u0097\u00d3\u00d3 \u00cf\u00cf+++ \u00d0\u00d0\u00d0\u008e\u008e \u008f\u008f ",
- " \u00b4\u00b4\u00b4\u00c5\u00c5\u00c5 \u00d4\u00d4\u00d4\u00d4\u00c9\u00c9\u00b5 \u00d5\u00c9\u00c9\u00c9\u00c9\u00c9\u00d6\u00d6\u00bd\u00bd \u00ab\u00ab \u00bf\u00bf \u00d7\u00d7\u00d8 \u00b3\u00ae\u008b\u008b\u008b \u00a4\u00c0\u00aa\u00cc\u00cc%%%\u00bc\u00d2&4444\u00b7\u00b7 \u009e\u009e \u0097\u0097\u00d9\u00d3\u00d3\u00cf\u00cf\u00cf+++ \u00d0\u00d0 \u008e\u008e \u008f\u008f ",
- " \u00b4\u00b4\u00b4\u00c5\u00c5\u00da \u0089\u0089\u00d4\u00db\u00d4\u00d4\u00c9 \u00dc\u00dc\u00dc\u00d5\u00dc\u00dc \u00c9\u00c9\u00c9 \u00bd\u00bd\u00bd \u00ab\u00ab \u00bf\u00bf \u00d7\u00d8 \u00b3\u00ae\u008b\u008b\u008b \u00a4\u00a4\u00c0\u00aa\u00cc%%%%\u00bc\u00bc&'444\u00b7\u00b7 \u009e\u009e \u0097\u0097\u00d9\u00d3\u00d9\u00d9\u00cf\u00cf+++ \u00dd\u00de\u00df\u00df \u008e\u008e \u008f\u008f ",
- " \u00b4\u00b4 \u00da\u00da\u00da \u00e0\u00e0\u0089\u00bd\u00e1\u00e1\u00e1 \u00dc\u00dc\u00dc \u00dc\u00dc\u00dc\u00e2\u00e2\u00c9\u00c9 \u00bd\u00bd\u00bd \u00ab\u00ab \u00e3\u00e3\u00e3\u00e3 \u00e4\u00e4 \u00b3\u00ae\u008b\u008b \u00a4\u00c0\u00c0\u00aa\u00cc%%%%\u00bc\u00bc&'444 \u00b7\u00b7 \u009e\u009e \u0097\u0097 \u00d9\u00d9\u00d9\u00d9\u00d9\u00d9+\u00d9 \u00dd\u00e5\u00df\u00df \u00e6\u008e \u008f\u008f ",
- " \u00b4\u00b4 \u00da\u00da\u00e7\u00e7 \u00e0\u00e0\u00e0\u0089\u00bd\u00db\u00db\u00c9 \u00dc\u00dc \u00dc\u00e2\u00e2 \u00c9\u00c9 \u00bd\u00bd \u00ab\u00ab \u00bf\u00e8\u00e8\u00e3\u00e3\u00e3 \u00e4\u00e4 \u00ae\u00ae\u008b\u008b \u00a4\u00c0\u00c0\u00aa\u00cc%%%%\u00bc\u00bc&'444 \u00b7\u00b7 \u009e\u009e \u0097\u0097 \u00d9\u00d9\u00d9\u00d9\u00d9\u00d9 \u00dd\u00e9\u00e6\u00e6\u00e6\u008e\u008e \u008f ",
- " \u00b4\u00b4 \u00e7\u00e7\u00e7\u00ea\u00ea\u00ea\u0089\u00bd\u00db\u00db\u00c9 \u00dc\u00dc \u00dc\u00dc\u00dc\u00c9\u00c9\u00eb\u00eb\u00bd \u00ab\u00ab \u00ec\u00ec\u00e8\u00e8\u00e8\u00e3\u00e3 \u00e4 \u00ed\u00ed\u00ed\u008b\u008b\u008b \u00a4\u00c0\u00aa\u00cc\u00cc%%%%\u00bc\u00d2&4\u00ee\u00ee4 \u00b7\u00b7 \u009e\u009e \u0097\u0097 \u00cf\u00cf ++ \u00dd\u00dd\u00e6\u00e6 \u008e\u008e \u008f\u008f ",
- " \u00b4\u00b4 \u00ef\u00ef\u00e0\u00ea\u00ea\u00ea\u00ea\u0089\u00bd\u00f0\u00c9\u00c9\u00f1\u00f1\u00dc \u00dc\u00dc \u00c9\u00c9\u00eb\u00bd\u00ab\u00ab \u00ec\u00ec\u00ec\u00e8\u00e8\u00e3\u00e4\u00e4 \u00f2\u00ed\u00ed\u00ed\u00ed\u00ed \u00a4\u00a4\u00c0\u00aa\u00cc\u00cc%%%%\u00bc\u00d2&\u00ee\u00ee\u00ee4 \u00b7\u00b7 \u009e\u009e \u0097\u0097 \u00cf\u00cf ++ \u008e\u008e \u00f3\u00f3 ",
- " \u00ef\u00ef\u00ef\u00ef\u00e0 \u00ea\u00ea\u0089\u00bd\u00bd\u00c9\u00c9\u00f1\u00f1\u00dc\u00dc\u00dc \u00dc\u00dc \u00c9\u00c9 \u00bd\u00ab\u00ab \u00ec\u00e8\u00e8\u00e3\u00e4\u00e4 \u00f2\u00b3\u00ae\u008b\u00ed\u00ed \u00a4\u00c0\u00c0\u00aa\u00cc\u00cc%%%%/\u00c1\u00ee\u00ee\u00ee\u00ee\u00ee \u00b7\u00b7 \u009e\u009e \u0097\u0097 \u00cf\u00cf ++ \u008e\u008e \u00f3\u00f3\u00f3 ",
- " \u00ef\u00ef \u00e0\u00e0\u00e0\u00ea\u00ea\u0089\u00bd\u00bd \u00c9\u00c9\u00f4 \u00dc\u00f5\u00dc\u00dc\u00f6\u00f6\u00dc\u00dc \u00c9\u00c9 \u00bd\u00ab \u00ec\u00ec\u00ec\u00e4 \u00ae\u00ae\u008b\u00ed\u00ed \u00a4\u00c0\u00c0\u00aa\u00cc\u00cc%%% /\u00c1\u00ee\u00ee\u00ee\u00ee\u00ee \u00b7\u00b7 \u009e \u0097\u0097 \u00cf\u00cf + \u008e\u008e \u00f3\u00f3\u00f3 ",
- " \u00ef\u00ef \u00e0\u00ea\u00ea\u0089\u0089 \u00bd\u00bd \u00f4\u00f4\u00c9\u00f5\u00f5\u00dc\u00dc\u00f6\u00f6\u00dc \u00c9\u00c9 \u00bd\u00ab\u00ab \u00f7\u00f7 \u00ae\u008b\u008b\u008b\u00f8 \u00a4\u00c0\u00c0\u00aa\u00cc\u00cc%%% /\u00c1\u00ee\u00ee\u00ee\u00ee\u00f9 \u00b7\u00b7 \u009e\u009e \u0097\u0097\u00fa\u00fa\u00fa\u00fb\u00fb ++ \u008e\u008e \u00f3\u00f3\u00f3 \u00fc\u00fc\u00fc\u00fc\u00fc",
- " \u00ef\u00ef \u00e0\u00e0\u0089 \u00bd\u00fd\u00fd \u00c9\u00c9\u00c9\u00c9\u00c9\u00f6\u00f6\u00c9\u00fe\u00fe\u00c9 \u00bd\u00ab \u00ff\u00ff\u0100 \u00f7\u00f7 \u00b3\u00ae\u008b\u008b\u008b\u00a4\u00a4\u00a4\u00c0\u00aa \u00cc%%%% /\u00ee\u00ee\u00ee\u00ee\u00ee\u00f9 \u00b7 \u009e\u009e \u0097\u0097\u00fa\u00fa\u00fa\u00cf ++ \u008e\u008e \u00f3\u00f3\u00f3 \u00fc\u00fc\u00fc\u00fc\u00fc\u00fc\u00fc\u00fc ",
- " \u00ef\u00ef\u00ef \u0089\u0089\u0089 \u00fd\u00bd \u00c9\u00c9\u0101\u00c9\u00c9\u00c9\u00fe\u00fe \u00bd\u00ab\u00ab \u00ff\u00ff\u0100\u0100 \u00f7\u00f7 \u00ae\u00ae\u008b\u008b\u008b\u00a4\u00a4\u00c0\u00c0\u00aa \u00cc%%%% /\u00ee\u00ee\u00ee\u00ee\u00ee\u00f9\u0102 \u00b7\u00b7 \u009e\u009e \u0097\u0097 \u00fa\u00fa\u00cf ++ \u008e\u008e \u00f3\u00f3 \u00fc\u00fc\u00fc\u00fc\u00fc\u00fc\u00fc\u00fc ",
- " \u00ef\u00ef\u00ef \u0089\u0089\u0089 \u0101\u0101\u0103\u0103 \u00fe\u00fe\u0104\u0104 \u0105\u00ff\u0100\u0100\u0100\u0100\u0106\u0106 \u0107\u0108\u00ae\u00ae\u008b\u008b \u0109\u00c0\u00aa\u00cc\u00cc%%%% /\u00ee\u00ee\u00ee\u00ee \u0102\u0102 \u00b7\u00b7 \u009e\u009e \u0097\u0097 \u00fa\u00fa\u00cf + \u008e\u00f3\u00f3 \u00fc\u00fc\u00fc\u00fc\u00fc\u00fc\u00fc\u00fc ",
- " \u010a\u010b\u010b \u0089\u0089\u0089 \u010c\u010d \u0103\u0103\u00bd\u00fe\u00fe\u0104\u0104 \u0105\u0105 \u0100\u0100\u0106\u0106\u0107\u0108\u0108\u0108\u0108\u00ae\u008b\u008b\u008b\u010e \u0109\u0109\u00aa\u00cc\u00cc%%%% \u00ee\u00ee\u00ee\u00ee\u00ee \u0102\u0102 \u00b7\u00b7 \u009e\u009e \u0097 \u00fa\u00fa\u00cf ++ \u010f\u010f\u00fc\u00fc\u00fc\u00fc\u00fc\u00fc ",
- "\u0110 \u00ef\u010a\u010a\u010b\u010b \u0089\u0089\u0089 \u0111\u00ab\u00ab\u0103\u0103\u00ab\u00ab\u0104\u0104 \u0100\u0100\u0100\u0100\u0100\u0106\u0106\u0107\u0108\u0108\u0108\u0108\u0108\u00ae\u008b\u008b\u008b\u010e\u010e\u0112\u0109\u00aa\u00aa\u00cc%%%% \u00ee\u00ee\u00ee\u00ee\u00ee\u0102 \u0102\u0102 \u00b7 \u009e\u009e \u0097\u0097\u00fa\u00fa\u00cf\u00cf ++ \u0113 \u010f\u010f\u00fc\u00fc\u00fc ",
- "\u0114\u0114 \u00ef\u00ef \u010a\u010a\u010a\u010b\u010b \u0089\u0089\u0089 \u00ab\u0111\u00ab\u00ab\u00ab\u0103\u00ab\u0104\u0104 \u0100\u0100\u0100\u0100\u0106\u0106\u0108\u0108\u0108\u0108\u0115\u0116\u0116\u0116\u008b\u010e\u010e\u010e\u0112\u0112\u0112\u00cc\u00cc%%%% \u00ee\u00ee\u00ee\u00ee\u00ee\u0102\u0102 \u0102\u0102 \u0117\u0117\u0117\u0117 \u009e\u009e \u0097\u0097 \u00fa\u00fa\u0118\u00cf\u00cf++\u0119\u0119\u011a\u011a \u010f\u010f [...]
- "\u011b\u0114\u0114 \u00ef\u00ef\u00ef \u010a\u010a\u010a\u010b\u010b \u0089\u0089\u0089\u0111\u011c\u011c\u011c\u011c \u0104\u0104\u0104 \u0100\u0100\u0106\u0106\u0107\u011d\u011d\u0108\u0115\u011e\u011f\u011f\u0120\u0120\u0121\u010e\u0112\u0112\u00cc\u00cc\u00cc\u00cc%%%%\u00ee\u00ee\u00ee\u00ee\u00ee'\u0102\u0102 \u0102\u0102\u0117\u0117\u0117 \u009e\u009e \u0097\u0097 \u00fa\u00fa\u00fa\u00cf \u0122\u0123\u0123\u011a\u011a \u010f\u010f [...]
- " \u011b\u0114\u0114\u0114 \u00ef\u00ef \u010a\u010a\u010a\u010b\u010b \u0089\u0089\u0111\u011c\u011c\u011c\u011c\u0104\u0104\u0104 \u0106\u0107\u011d\u011d\u011d\u011e \u011f\u011f\u0120\u0120\u0125\u0126\u0126\u0126\u00cc\u00cc\u00cc%%%%\u00ee\u00ee\u00ee\u00ee\u00ee\u00ee' \u0102\u0102 \u0102\u0102\u00b7\u0127 \u009e\u009e\u009e\u009e\u009e \u0097\u0097 \u0118\u0118\u0118 \u0123\u0123\u0123\u011a\u011a \u010f\u010f \u0124\u0124 [...]
- " \u011b\u011b\u0114\u0114\u00ef\u00ef \u010a\u010a\u010a\u010b \u0089\u0111\u011c\u011c\u011c\u011c\u0104\u0104 \u0106\u0107\u011d\u011d\u011d\u0128\u0128 \u011f\u011f\u0120\u0120 \u0129\u0126\u0126\u0126\u00cc\u00cc%%%\u00ee\u00ee\u00ee\u00ee\u00ee\u012a&' \u0102\u0102 \u0102\u0127\u0127 \u009e\u009e\u009e\u009e\u009e\u009e\u009e\u009e\u009e\u009e\u009e \u0097 \u0118\u0118 \u0123\u0123\u0123\u011a\u011a \u010f\u010f \u0124\u0124\u01 [...]
- " \u012c\u011b\u011b\u0114\u0114\u012d \u010a\u010a\u010a\u010b\u010b \u0089\u012e\u012e\u0104\u0104 \u0106\u0106\u011d\u011d\u011d\u0128\u0128\u0128\u0128\u011f\u011f\u011f\u0120\u0120\u0120\u012f\u0129\u0126\u0126\u0126\u0130%%%\u00ee\u00ee\u00ee\u00ee\u00ee\u012a&' \u0102\u0102 \u0102\u0102\u0102 \u009e\u009e\u009e\u009e\u009e\u009e\u0131\u0131\u0131\u0131\u0131 \u0132\u0132 \u011a\u011a \u0133\u010f\u010f\u010f \u0124\u0124\u0124\u0 [...]
- "\u00b4\u0135\u012c\u012c\u012c\u0114\u0114\u0114\u012d \u010a\u010a\u010a\u010b\u010b \u012e\u012e\u012e\u0136\u0104 \u0106\u011d\u011d\u011d\u0128\u0128\u0128\u0128\u0128\u011f\u011f\u011f\u0120\u0120\u0120\u0137\u0137\u0137\u0126\u0138\u0138\u0138%\u00ee\u00ee\u00ee\u00ee\u00ee\u012a\u0139&&' \u0102\u0102 \u013a\u013a\u0102\u0102\u0102 \u0131\u0131\u0131\u0131\u0131\u0131\u0131\u0131\u0131\u0131\u0131\u0131\u0131\u0133\u010f\u010f\u010f [...]
- "\u00b4\u0135\u0135\u0135\u00ef\u00ef\u011b\u011b\u0114\u0114 \u010a\u010a\u010b\u010b \u012e\u012e\u0136\u013c \u0106\u0107\u011d\u011d\u011d\u0128\u0128\u0128\u0128\u0128\u011f\u011f\u011f\u0120\u0137\u0137\u0137\u0137\u013d\u0138\u0138\u013e\u013e\u0138\u00ee\u00ee\u00ee\u00ee\u012a/\u00d2&&' \u0102\u0102\u013a\u013a\u013a \u0102\u0102\u0102 \u0131\u0131\u0131\u0131\u0131\u0131 \u013f\u013f\u013f\u0124\u0124\u0124\u0124\u0124\u0124\u0 [...]
- "\u00b4 \u00ef\u00ef \u011b\u011b\u0114\u0114 \u010a\u010a\u010a\u010b\u010b \u012e\u012e\u0136\u0136\u013c\u013c \u0106\u0107\u011d\u011d\u011d\u011e\u0140\u0141\u0128\u0128\u0142\u011f\u011f\u0137\u0137\u0137\u0137\u0120\u0143\u0138\u0138\u013e\u013e\u013e\u013e\u00ee\u00ee\u00ee\u012a\u012a//\u00c1&' \u0102\u0102 \u013a\u013a \u0102\u0102\u0102 \u013f\u0124\u0124\u0124\u0124\u0124 \u012b\u012b\u012b\u012b\u012b\u0134\u0134\u013 [...]
- "\u00b4 \u00ef\u00ef \u0144\u0114\u0114\u0114\u012d \u010a\u010a\u010a\u010b\u010b \u012e\u012e\u0136\u0136 \u013c\u013c\u0145 \u0146\u0146\u011d\u011d\u011d\u011e\u0140\u0128\u0142\u0142\u0142\u0142\u011f\u011f\u0142\u0137 \u0120\u0138\u0138\u0138\u0138\u013e\u013e\u013e\u013e\u00ee\u00ee\u00ee\u012a\u0147//\u00c1&' \u0102\u0102\u0102\u013a\u0148\u0148 \u0102\u0102\u0102\u013a \u012b\u012b\u012b\u012b\u0134\u0134\u0134\u0134\u0134\u [...]
- "\u0149\u00ef\u00ef\u00ef \u0144\u011b\u011b\u0114\u014a \u010a\u010a\u010b\u010b \u012e\u012e\u0136\u0136 \u014b\u0145\u0145\u014b \u0106\u011d\u011d\u011d\u011e\u014c\u014c\u0142\u0142\u0142\u0142\u0142\u014d\u014d\u0142\u014e\u014e\u0138\u0138\u0138\u0138\u0138\u013e\u013e\u013e\u00ee\u00ee\u00ee\u012a\u0147\u0147 /\u0139&'' \u0102\u0102\u0148\u0148\u013a\u013a \u013a\u013a\u013a\u013a \u012b\u012b\u012b\u012b\u012b\u0134\u0134\u0134\u0 [...]
- "\u0149\u00ef\u00ef \u011b\u0114\u014a\u014a \u010a\u010a\u010a\u010b\u010b\u012e\u012e\u0136 \u014b\u014b\u014b\u014b\u014b \u0106\u0107\u011d\u011d\u011d\u014c\u014c\u014c\u014c\u014e\u014e\u014e\u014e\u014d\u014d\u014e\u014e\u0138\u0138\u0138\u0138\u0138\u013e\u013e\u013e\u013e\u00ee\u00ee\u012a\u0151\u0147 \u0152\u00d2\u0139&&' \u0148\u0148 \u013a\u013a \u013a\u013a\u0153\u0153\u013a\u013a\u013a \u012b\u012b\u012b\u012b\u0134\u0134\u012b\u0 [...]
- "\u0154\u0149\u0149\u0149 \u0144\u0155\u014a\u014a\u012d \u010a\u010a\u010a\u012e\u012e\u0136\u0136 \u014b\u014b \u014b\u014b\u0156 \u0106\u0107\u011d\u011d\u011d\u014c\u014c\u014c\u014c\u014c\u0157\u0157\u0157\u0157\u014d\u014d\u014d\u014e\u0138\u0138\u0138\u0138\u0138\u013e\u013e\u013e\u00ee\u00ee\u012a\u012a\u0151\u0151 \u0152\u0158\u0139&&' \u0102\u0102 \u013a\u013a\u013a \u013a\u0153\u0153\u0153\u0153\u0153\u0153\u0153\u0159\u0159\u0159\u0159\u0159\u0159\u0 [...]
- "\u015c \u0149\u0149\u0149 \u0144\u014a\u011b\u0114\u0114 \u010a\u012e\u012e\u0136\u0136 \u014b\u014b \u0156\u0156\u0106\u0106\u011d\u011d\u011d\u014c\u014c\u014c\u014c\u0157\u0157\u0157\u0157\u0157\u0157\u014d\u014d\u014d\u0157\u014e\u0138\u0138\u0138\u015d\u013e\u013e\u013e\u00ee\u00ee\u012a\u015e\u0151\u0151 \u0152\u0158/\u00c1\u00c1''\u015f \u0102\u0102 \u013a\u013a\u013a\u013a\u013a\u013a \u0153\u0153\u0153\u0159\u0159\u0159\u0159\u0159\u0159\u0159\u0159\u [...]
- "\u015c\u0154 \u0149\u0149\u0149 \u014a\u0114\u0114\u0114 \u012e\u012e\u0136\u0136 \u014b\u014b\u014b \u0156\u0106\u011d\u011d\u011d\u014c\u014c\u014c\u014c\u0157\u0157\u0157\u0157\u0157\u0157\u0157\u014d\u014d\u014d\u0157\u0157\u0157\u0157 \u015d\u013e\u013e\u00ee\u00ee\u012a\u012a\u0162\u0151\u0151 \u0152\u0152/\u0139&''\u015f \u0163\u0163\u0163\u0102\u0163 \u013a\u013a\u013a\u0164\u0164 \u0159\u0159 \u0165\u0165\u012b\u012b\u0134\u0160\u0134\u0134\u0134\ [...]
- "\u015c\u015c\u0154\u0154\u0167\u0167\u0149\u0149 \u011b\u0114\u0114\u0114\u012d \u012e\u012e\u012e\u0136 \u014b\u014b\u014b \u0106\u0107\u011d\u011d\u011d\u014c\u014c\u0157\u0157\u0157\u0157\u0168\u0168\u0168\u0168\u0168\u014d\u014d\u014d\u0157\u0157\u0157\u0157\u0157\u0169\u0169\u016a\u016a\u012a\u016b\u0162\u0162\u0143\u0151\u0151 \u0152\u00d2\u0139\u0139&''\u015f\u0163\u0163\u0163\u0163\u0163\u0163\u0102\u0102 \u0164\u0164\u0164\u0164\u0164 \u0159\u0159\u0159\u0 [...]
- "\u015c\u015c\u0154\u0154\u0167\u0167\u0149\u0149\u0149 \u0144\u0114\u011b\u0114\u012d \u012e\u012e\u0136 \u014b\u014b \u0106\u0107\u011d\u011d\u011d\u014c\u014c\u0157\u0157\u0157\u0168\u0168\u016d\u016d\u016d\u0168\u0168\u014d\u014d\u014d\u0157\u016e\u0157\u0157\u0169\u0169\u0169\u0169\u016f\u0170\u0170\u0162\u0162\u0162\u0151\u0151 \u0152\u00d2 \u0139&&'\u015f\u015f \u0102\u0102\u0102 \u0164\u0159\u0159\u0165\u0165\u0165\u0165\u016c\u0160\u016c\u016c\u016c \ [...]
- "\u015c\u0154\u0154\u0167\u0167 \u0149\u0149\u0149 \u0144\u011b\u0114\u0114\u0114 \u012e\u012e\u0136\u0136 \u0172\u014b \u0106\u0107\u011d\u011d\u011d\u014c\u014c\u014c\u0157\u0168\u0168\u016d\u016d\u016d\u016d\u016d\u016d\u016d \u014d\u014d\u016e\u016e\u016e\u0157\u0169\u0169\u0169\u0169\u016f\u0170\u0170\u0173\u0162\u0162\u0151\u0151 \u0158/ \u0139&&'\u015f\u015f\u015f \u0102\u0102\u0102\u0102\u0159\u0159\u0159\u0165\u0165\u0165\u0165\u0160\u016c\u016c\u0174\u016 [...]
- "\u015c\u0175\u0167\u0167 \u0149\u0149\u0149 \u011b\u0114\u0114\u0114\u012e\u0136\u0136 \u0172\u0172\u0176\u0176 \u0106\u0106\u011d\u011d\u011d\u014c\u014c\u014c\u0157\u0168\u0168\u016d\u016d\u0177\u0177\u0177 \u016d\u016d\u0178\u0179\u0179\u0179\u016e\u016e\u0169\u0169\u0169\u0169\u016f\u016f\u0170\u0170\u0173\u0162\u0162\u0162\u0151\u0158\u0158/ \u00c1&''\u015f\u015f \u0102\u017a\u017a\u0102\u0165\u0165\u0165\u0165\u016c\u0160\u016c\u016c\u0174 \u0166\u0166\u0 [...]
- "\u017c\u017c\u0167\u0175\u0175 \u0149\u0149\u0149 \u0144\u0114\u0114\u012d\u0136 \u0172\u0172\u0172\u0176\u0176 \u0106\u0107\u011d\u011d\u011d\u014c\u014c\u0157\u0168\u0168\u016d\u016d\u0177\u0177\u0177\u0177\u0177\u0177 \u0178\u0179\u0179\u0179\u016e\u016e\u0169\u0169\u0169\u0169\u016f\u016f\u0170\u0170\u0173\u0162\u0162\u0162\u0151\u017d\u017d\u017d\u017d\u017e\u0139&&' \u015f\u015f \u017a\u017a\u017a\u017a\u0160\u016c\u016c\u016c\u016c\u0174\u0166\u0166\u0166 [...]
- "\u017c\u017c\u0167\u0175\u0175 \u0149\u0149\u0149 \u0144\u0144\u012d \u017f\u0172\u0176\u0176 \u0107\u011d\u011d\u011d\u014c\u014c\u0157\u0157\u0180\u0180\u0181\u0181\u0181\u0181\u0181\u0181\u0177\u0177\u0177\u016d\u016d\u0179\u0179\u016e\u016e\u0169\u0169\u0169\u0169\u016f\u0157\u0170\u0170\u0173\u0173\u0162\u0162\u0151\u0158\u017d\u017d\u017e\u017e\u0139\u0139&''\u015f\u015f \u0165\u0165\u0165\u0165\u017a\u017a\u017a\u016c\u0174\u0174\u0161\u0166\u0166\u0166\ [...]
- "\u0183\u0167 \u0149\u0149\u0149 \u012e\u012e\u0136\u0136 \u017f\u017f\u0176\u0176 \u0107\u011d\u011d\u011d\u014c\u014c\u014c\u0157\u0180\u0180\u0180\u0181\u0181\u0181\u0181\u0181\u0181\u0181\u0181\u0177\u0177\u016d\u0179\u0179\u0179\u016e\u0169\u0169\u0169\u0169\u016f\u0157\u0170\u0170\u0173\u0173\u0184\u0184 \u0158\u0158\u00d2 \u017e\u0139&&' \u015f\u015f \u0165\u0165\u0165\u0165\u0185\u016c\u016c\u017a\u017a\u017a\u017a \u0161\u0161\u0161\u0161\u0161\u017b\u01 [...]
- "\u0183 \u0186\u0186\u0149\u0149 \u012e\u012e\u0136\u0136 \u0187\u0187\u0187\u0187\u0187 \u0107\u011d\u011d\u011d\u014c\u014c\u014c\u0157\u0180\u0180\u0180\u0180 \u0181\u0181\u0181\u0181\u0181\u0179\u0179\u0179\u016e\u0188\u0169\u0169\u016f\u016f\u0157\u0170\u0170\u0170\u0184\u0184\u0184 \u0158\u0158\u00d2\u00d2 \u017e\u0139\u00c1\u00c1''\u015f\u015f\u0165\u0165\u0165\u0165\u0160\u0160\u0160\u016c\u0174\u0174 \u017a\u017a\u0189 \u0161\u0161\u0161\u0161\u018a\u0 [...]
- " \u0186\u0186\u0186\u0149\u0149\u0149 \u012e\u012e\u0136\u0136 \u0187\u018c\u018c\u018c\u018c\u018c\u018c\u018c \u0107\u011d\u011d\u011d\u014c\u014c\u0157\u0180\u0180\u0180\u0180\u018d \u0181\u0181\u0181\u0179\u0179\u016e\u0188\u018e\u018e\u018e\u018e\u0157\u0157\u0170\u0170\u0184\u0184\u0184 \u0158\u0158\u018f\u00d2 \u017e\u0139&&\u0190\u0190\u0190\u0165\u0165\u0191\u016c\u016c\u016c\u016c\u0174\u0174 \u018a\u018a\u018a\u018a \u013b\u013b \u014f\u0 [...]
- " \u0192\u0192\u0186\u0186 \u0149\u0149\u0149\u012e\u012e\u0136 \u0187\u018c\u018c\u018c\u018c\u018c\u018c\u018c\u018c\u018c \u0107\u011d\u011d\u011d\u014c\u014c\u0157\u0157\u0180\u0180\u0180\u0180\u018d\u018d\u0193\u0193\u0193\u0193\u0193 \u0181\u0194\u0179\u0179\u0179\u0188\u018e\u018e\u018e\u018e\u0157\u0157\u0170\u0170\u0184\u0184\u0195 \u0158\u0158\u018f\u00d2 \u0139\u0196\u0197\u0190\u0190\u0190\u0191\u0160\u016c\u016c\u016c\u0174\u0174\u0174 \u018a\u018 [...]
- "\u0198 \u0192\u0192\u0199\u019a\u019a\u019a \u012e\u012e\u0136\u0136 \u018c\u018c\u018c\u018c\u019b\u019b \u018c\u018c\u018c\u018c\u018c\u011d\u011d\u011d\u014c\u014c\u014c\u0157\u0180\u0180\u0180 \u019c\u019c\u019c\u0193\u0193\u0193\u0193\u0193 \u019d\u019d\u019d\u019e\u019e\u0179\u0179\u0188\u018e\u018e\u018e\u018e\u0157\u0157\u0170\u0184\u0184\u0184 \u0158\u0158 \u018f\u00d2 \u0196\u0196\u0196\u019f\u0190\u0190\u0190\u016c\u016c\u0174\u0174\u0174 \u018a\u018a [...]
- "\u0198\u01a1 \u0186\u0199\u0199\u019a\u019a\u019a\u019a\u019a \u0136\u01a2\u01a3\u01a3 \u018c\u018c\u018c\u019b\u019b\u019b\u019b\u019b \u018c\u018c\u011d\u011d\u011d\u014c\u014c\u014c\u01a4\u0180\u0180\u0180 \u0193\u01a5\u0193\u019c\u019c\u019c\u019c \u0193\u019d\u019d\u019d \u019e\u0179\u0179\u0188\u018e\u018e\u018e\u018e\u0157\u0157\u0170\u0184\u0184\u0184 \u0158\u0158 \u018f\u01a6 \u0165\u0165\u0196\u0196\u0196\u019f\u0190\u0190\u0190\u0174\u0174\u0174 \u018a\u018a\u [...]
- "\u01a1\u01a1\u01a8 \u0186\u01a9\u01a9 \u019a\u019a \u01aa\u01a2\u01a3\u01a3\u018c\u018c\u018c\u019b\u019b \u01ab\u019b\u019b\u019b\u01ac\u011d\u011d\u011d\u014c\u014c\u014c\u01ad\u01a4\u0180\u0180 \u0193\u0193\u01a5\u01a5\u01a5 \u019c\u019c\u019c\u019c \u019d\u0193 \u019e\u0179\u0179\u0188\u0188\u018e\u018e\u018e\u0157\u0157\u0170\u0184\u0184 \u0158\u0158 \u01ae\u01ae\u01a6\u01a6\u0165\u0165\u0160\u0196\u0196\u0197\u0190\u0190\u0190\u0190 \u018a\u018a\u018a\u018a\u018a\ [...]
- "\u0154\u0154\u01a8\u0198\u0198\u01af \u01b0\u01b0\u0186\u019a \u01b1\u01b2\u018c\u018c\u018c\u019b\u019b \u01ab\u01ab\u01ab\u019b\u019b\u0107\u011d\u011d\u011d\u014c\u014c\u014c\u01a4\u01a4\u01a4 \u0193\u01b3\u01b3\u01b3\u01a5\u01a5\u01a5\u01a5 \u019c\u019c\u019c\u0193\u0193 \u019e\u019e\u0179\u0179\u0188\u018e\u018e\u01b4\u01b4\u01b4\u0184\u0184\u0184 \u0158\u0158 \u01ae\u01ae\u01a6\u01a6\u01a6\u0160\u016c\u0196\u0196\u0197\u0197\u0190\u0190\u0190 \u018a\u018a\u018a\u01 [...]
- " \u0154\u0154\u0198\u01b5\u01b5 \u0186\u01b0\u01b0 \u01aa\u018c\u018c\u01b6\u01b6\u019b\u01ab\u01ab\u01ab\u01ab\u01ab\u0107\u011d\u011d\u011d\u01b7\u01b7\u01b7\u01b8\u01b8\u01b8 \u01b9\u01b9\u0193\u01b3\u01b3\u01b3 \u01a5\u01a5\u01a5\u01a5\u019c\u019c\u019c\u019c \u019e\u0179\u0179\u0188\u018e\u01b4\u01b4\u01b4\u01b4\u01b4\u0184\u0184\u0158\u0158\u01ba\u01ba\u01ae\u01ae\u01ae\u01a6\u01a6\u016c\u016c\u0174\u0196\u0196\u019f\u019f\u0190\u01bb \u018a\u018a\u018a\u018a\u018a\ [...]
- " \u0154 \u01b5\u01b5\u01b5\u0186\u0186\u019a\u019a \u01aa\u01aa\u01bd\u01b6\u01b6\u01b6\u01b6\u01ab\u01ab \u0107\u011d\u011d\u011d\u01b7\u01b7\u01b7\u01ad\u01b8\u01b8\u01b8\u0193\u01b9\u01b9\u01b9 \u01b3\u01b3\u01b3 \u01a5\u01a5\u01a5\u01a5\u0193\u0193 \u019e\u019e\u0179\u0188\u01b4\u01b4\u01b4\u01b4\u01b4\u01be\u01be\u0158\u0158\u01ba\u01ba\u01ba\u01a6\u01ae\u01a6\u01a6\u01a6\u0174\u0174\u0174\u0174\u019f\u019f\u019f\u01bb\u01bb\u018a\u018a\u018a\u018a\u018a \u018 [...]
- "\u01c0 \u0154 \u01af\u01b5\u0186\u01c1\u019a\u019a \u01aa\u01aa\u01c2\u01c3\u01c4\u01b6\u01b6\u01b6\u01b6 \u011d\u011d\u011d\u01b7\u01b7\u01b7\u01b7\u01a4\u01a4\u01b8\u01b8\u01b8\u01c5 \u01b9\u01b9\u01b9 \u01b3\u01b3\u01b3\u01b3 \u01a5\u01a5\u01a5 \u019e\u019e\u0179\u01b4\u01b4\u01b4\u01b4\u01c6\u01c6\u01be\u01be\u0158\u01ba\u01c7\u01c8\u01c8\u01ae\u01ae\u01a6\u01a6\u01a6\u0174\u0174 \u01c9\u01c9\u01ca\u01bb\u01bb \u018a\u014f\u01bf\u0150\u0150\u015a\u01cb\u01c [...]
- "\u01c0\u01c0\u0154 \u01af\u01af \u01c1\u01c1\u01c1 \u01aa\u01aa\u01c2\u01c3\u01c3\u01c4\u01c4\u01b6\u01b6\u01b6\u01b6\u0107\u011d\u011d\u011d\u01b7\u01b7\u01b7\u01ad\u01a4\u01ce\u01ce\u01b8\u01b8\u01b8\u01c5\u01c5\u01b9\u01b9\u01b9\u01b9 \u01b3\u01b3\u01b3\u0193\u0193\u01a5 \u019e\u019e\u01b4\u01b4\u01b4\u01cf\u01d0\u01d0\u01d1\u01be\u01be\u01ba\u01c7\u01c8\u01c8\u01d2\u01ae\u01ae\u01a6\u01a6\u01a6 \u01c9\u01c9\u01bb\u01bb\u018a \u018a\u014f\u014f\u014f\u0150\u01 [...]
- "\u01c0\u01c0\u0154 \u01af\u01af \u01c1\u01c1\u019a \u01d5\u01d5\u01c2\u01c3\u01c3\u01c4\u01d6\u01c2\u01b6\u01b6\u01b6\u011d\u011d\u011d\u01b7\u01b7\u01b7\u01ad\u01d7\u01d8\u01ce\u01ce\u01d9\u01b8\u01b8\u01c5\u01c5\u01c5\u01c5\u01b9\u01b9\u01b9\u0193\u0193\u01b3\u0193 \u01da\u01da\u01da\u01b4\u01b4\u01cf\u01d0\u01d0\u01d0\u01d0\u01be\u01be\u01d1\u01db\u01dc\u01dc\u0174\u01ae\u01a6\u01a6\u01a6\u01a6 \u01c9\u01dd\u01dd\u01bb\u01bb\u018a \u018a\u014f\u0150\u0150\u014f\ [...]
- "\u01c0\u01c0\u01c0\u01c0\u01af\u01af\u01df \u019a\u019a \u01aa\u01aa\u01d5\u01c2\u01c3\u01c4\u01c4\u01d6\u01e0\u01c2\u01b6\u011d\u011d\u011d\u01b7\u01b7\u01b7\u01ad\u01d7\u01d7\u01d8\u01d8\u01ce\u01d7\u01b8\u01b8\u01b8\u0193\u01c5\u01c5\u0193\u0193\u01b9\u0193\u0193 \u01e1\u01e2\u01da\u01da\u01da\u01da\u01b4\u01b4\u01e3\u01cf\u01d0\u01d0\u01d0\u01be\u01be\u01d1\u01e4\u0174\u0174\u0174\u0174 \u01a6\u01a6 \u01c9\u01c9\u01ca\u01bb\u01e5\u01e5\u018a\u014f\u014f\u014f\u01 [...]
- " \u01c0\u01c0\u01c0\u01c0\u01af\u01df\u01df\u01df\u019a\u019a \u01aa\u01aa\u01bd\u01e6\u01c3\u01c4\u01e7\u01d6\u01e0\u01c2\u011d\u011d\u011d\u01b7\u01b7\u01b7\u01b7\u01d7\u01d7\u01d7\u01d7\u01d7\u01d7\u01d7\u01d7\u01b8\u01b8\u0193\u0193 \u01e1\u01e1\u01e1\u01e2\u01e1\u01e2\u01e2\u01e2\u01da\u01da\u01da\u01da\u0158\u0158\u01e3\u01cf\u01d0\u01d0\u01d0\u01d0\u01be\u01d1\u0174\u0174\u0174 \u01e8\u01e8 \u01c9\u01e5\u01e5\u01e9\u01e5\u01e9\u0150\u015a\u0150\u015b\u015b\u [...]
- "\u0158 \u01c0\u01c0\u01c0\u01c0\u01c0\u01df\u01df\u019a \u01aa\u01bd\u01bd\u01e6\u01e6\u01e7\u01ea\u01e0\u01c2\u011d\u011d\u011d\u01b7\u01b7\u01b7\u01b7\u0168\u01d7\u01d7\u01d7\u01d7\u01d7\u01d7\u01d7\u01d7\u01b8\u01b8\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u01da\u01da\u0158\u0158\u0158\u0158\u01e3\u01cf\u01cf\u01d0\u01d0\u01d0\u01be\u01be\u0174 \u01eb\u01eb\u01eb \u01ec\u01e8 \u01e5\u01e9\u01e9\u01e9\u01e9\u01ed\u015b [...]
- "\u0158\u0158 \u01c0\u01c0\u01c0\u01c0\u01c0\u01c0\u019a\u01df\u01df\u01df \u01aa\u01aa\u01bd\u01e6\u01e6\u01e7\u01e7\u01ea\u01e0\u01c2\u011d\u011d\u011d\u01b7\u01b7\u01b7\u01ad\u0168\u01d7\u01d7\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01b8\u01b8\u01e1\u01e1\u01e1\u01e1\u01e1\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u0158\u0158\u01ba\u01ba\u01ee\u01ef\u01c8\u01e3\u01cf\u01d0\u01d0\u01d0\u01d0\u01be\u01f0\u01eb\u01f1\u01f1 \u01e8\u01e8 \u01f2\u01f2\u01e9\u01f3 [...]
- "\u01ba\u0158\u0158\u0158\u01f5\u01c0\u01c0\u01c0\u01f6\u01f6\u01f6\u01df\u01df\u01df\u01df\u01df \u01aa\u01aa\u01e6\u01e6\u01e7\u01e7\u01ea\u01ea\u01f7\u011d\u011d\u011d\u01b7\u01b7\u01b7\u01b7\u0168\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01f8\u01f8\u01e1\u01e1\u01e1\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u0158\u0158\u0158\u0158\u01ba\u01c8\u01ef\u0160\u01f9\u01e3\u01cf\u01cf\u01d0\u01d0\u01d1\u01d1\u01fa\u01eb \u01f1\u01f1 \u01e8\u01e8 \u01f2 [...]
- "\u01fc\u01fc\u01ba\u01f5\u01f5\u01fd\u01fd\u01c0\u01f6\u01f6\u01f6\u01f6\u01f6\u01f6\u01df\u01df\u01aa\u01aa\u01bd\u01e6\u01e7\u01e7\u01ea\u01ea\u01f7\u011d\u011d\u011d\u01b7\u01b7\u01b7\u01b7\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01f8\u01f8\u01e1\u01e1\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u0158\u01ba\u01ba\u01ba\u01ee\u01c8\u01c8\u01c8\u0160\u0174\u0174\u01e3\u01e3\u01cf\u01cf\u01fe\u01fe\u01ff\u01fa\u01f0 \u01ec\u01e8 \u01f2\u01f2\ [...]
- "\u0204\u01fc\u01ba\u01f5\u01f5\u0158\u0158\u01fd\u01fd\u0205\u01f6\u01f6\u01f6\u01f6\u01f6\u01f6\u01aa\u01aa\u01f7\u01e7\u01e7\u01ea\u01ea\u01f7\u011d\u011d\u011d\u01b7\u01b7\u01b7\u01b7\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u0206\u0207\u0207\u0207\u01f8\u01f8\u01f8\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2\u01e2 \u0158\u0158\u0158\u0158\u01ee\u01c8\u01ef\u0160\u01f9\u0174\u0174\u0174\u0174 \u0208\u01fe\u01fe\u01fe\u01fe\u01ff\u01fa\u01fa \u01ec\u01e8 \u01f2\u01fb\u01fb\u01fb\ [...]
- "\u0204\u0204\u01fc\u01f5\u01f5\u01f5\u0158\u0158\u01fd\u01fd\u01fd\u0205\u01f6\u01f6\u01f6\u01f6\u01f6\u01f6\u01f6\u01e7\u01ea\u01ea\u01f7\u01f7\u011d\u011d\u011d\u01b7\u01b7\u01b7\u01e1\u01e1\u01e1\u01e1\u01e1\u01e1\u020b\u020b\u0207\u0207\u0207\u020c\u020d\u01f8\u01f8\u01f8\u01f8\u01e2\u01e2\u01e2\u01e2 \u0158\u01ba\u0158\u01ba\u01ef\u01c8\u01c8\u01c8\u0160\u0174\u0174\u0174\u0174 \u0208\u0208\u01fe\u01fe\u01fe\u01fe\u01ff\u01fa\u01fa \u020e\u020e\u01e8\u01f2\u01f2\u01fb\u01fb\u0 [...]
- "\u0210\u0211\u0204\u0204\u01f5\u01f5\u01f5\u01ba\u0158\u0158\u0212\u0212 \u0205\u0205\u01f6\u01f6\u01f6\u01f6\u01f6\u01f6\u01f7\u01f7\u011d\u011d\u011d\u01b7\u01b7\u01b7\u01b7\u01e1\u01e1\u01e1\u01e1\u0213\u0214\u0207\u0207\u0207\u0215\u0206\u020c\u020d\u020d\u01f8\u01f8\u01f8\u01e2\u01e2 \u0158\u0158\u0158\u01ba\u01ee\u01ee\u01ef\u01f9\u01f9\u01f9\u0174\u0174\u0174 \u0208\u01fe\u01fe\u01fe\u01fe\u01ff\u01ff\u01fa \u0216\u020e\u020e\u01fb\u01fb\u0201\u0201\u0201\u0201 \u020f\u [...]
- "\u0210\u0210\u0211\u0211\u0204\u01fc\u01fc\u01ba\u01ba\u0212\u0212\u0212 \u0205\u0218\u0218\u01f6\u01f6\u01f6\u01f6\u01f6\u01f6\u011d\u01b7\u01b7\u01b7\u01b7\u01e1\u01e1\u01e1\u0219\u0219\u0207\u0207\u0207\u020b\u020b\u0215\u0206\u0206\u020c\u020d\u020d\u01e2\u01f8\u01e2\u0158\u0158\u0158\u0158\u01ba\u01c8\u01c8\u01c8\u0160\u01f9\u0174\u0174\u0174 \u0208\u0208\u01fe\u01fe\u01fe\u01fe\u021a\u021a\u021a\u021a\u0216\u0216\u0216\u01fb\u0201\u0201\u0201 \u021b\u021b \u021c\u020f\ [...]
- " \u0210\u0210\u0210\u0211\u0204\u0211\u0204\u01fc\u0212\u0212\u01ba\u0158\u0158\u0158 \u0205\u0205\u0205\u01f6\u01f6\u01f6\u01f6\u021e\u021e\u01b7\u01b7\u01e1\u01e1\u01e1\u021f\u0207\u0207\u0207\u0213\u0214\u020b\u020b\u0215\u0215\u0206\u020c\u020c \u0158\u0158\u0158\u01ba\u01ee\u01ee\u01c8\u01c8\u01f9\u01f9\u0174\u0174\u0174 \u0220\u0208\u021a\u021a\u021a\u021a\u021a\u021a\u021a\u0221\u0216\u0216\u0222\u020e\u0201 \u021b\u021b\u021b\u021b \u021c\u021c\u020f\u020f\u0217 \u [...]
- "\u0223\u0223\u0223\u0210\u0210\u0210\u0211\u0204\u01fc\u0212\u0212\u01ba\u01ba\u0158\u0158\u0158\u0158 \u0205\u011d\u011d\u021e\u021e\u021e\u021e\u01e1\u01e1\u01e1\u01e1\u0207\u0207\u0219\u0219\u0213\u0214\u0214\u020b\u020b\u0215\u0224 \u0158\u0158\u0158\u0158\u01ba\u01ee\u01ee\u01f9\u01f9\u01f9\u0174\u0174\u0174 \u0220\u0220\u0225\u0220\u0220\u0208\u021a\u021a\u021a\u021a\u0221\u0221\u0221\u0221\u0226\u0226\u0226 \u021b\u021b\u021b\u021b \u021c\u0227\u0227\u0227\u021d \ [...]
- "\u0223\u0223\u0223\u0223\u0210\u0210\u0210\u0210\u0211\u0212\u0212\u0204\u0204\u01fc\u01ba\u0158\u01ba\u0158\u0158\u0158\u0229\u0229\u021e\u021e\u021e\u021e\u01e1\u01e1\u01e1\u01e1 \u021f\u021f\u0219\u0213\u0213\u0214\u020b\u020b \u0158\u0158\u01ba\u01ba\u01ee\u01ee\u01ee\u01f9\u01f9\u0174\u0174\u0174\u0174 \u0220\u0220\u0220\u0225\u022a\u022a\u022a\u021a\u021a\u021a\u0221\u0221\u0221\u022b\u022b\u022c\u022d\u0226\u022d\u021b\u021b \u0227\u0227\u0227\u021d\u022e\u022e\u [...]
- " \u0210\u0210\u0230\u0231\u0211\u0211\u0204\u01fc\u01fc\u01fc\u01ba\u01ba\u0158\u0229\u0229\u0232\u0232\u0233\u0233\u0234\u01e1\u01e1\u0235 \u021f\u021f\u0219\u0219\u0213\u0224 \u0158\u0158\u0158\u0158\u01ba\u01ee\u01ee\u01f9\u01f9\u01f9\u0174\u0174\u0174 \u0236\u0236\u0236\u0236\u0236\u0236\u0236\u0236\u0225\u0225\u022a\u022a\u0221\u0221\u0221\u0237\u022b\u022b\u022b\u022c\u0238\u0238\u021b\u021b \u021c\u021c\u0239 \u022e\u0239\u0239\u0228\u022f\u022f\u022f\u01c9\ [...]
- "\u023a \u023b\u023b\u023b\u023b\u0230\u023c\u0231\u0231\u0231\u0231\u0211\u0204\u0211\u0204\u0204\u01fc\u0229\u0232\u0232\u0233\u0233\u0233\u0234\u01e1\u01e1\u0235\u0235 \u0235\u021f\u0219\u0224 \u0158\u0158\u01ba\u0158\u01ee\u01ee\u01ee\u01f9\u01f9\u0174\u0174\u0174\u0174 \u0236\u0236\u0236\u0236\u0236\u0236\u0236\u0236\u0236\u0236\u0236\u0236\u0236\u0236\u0225\u0225\u0204\u0204\u0221\u0221\u023d\u023d\u023d\u022c\u022b\u022c\u0238\u0238\u023e\u021b \u0239\u0239\u0239\u02 [...]
- "\u023a\u023f\u023b\u023b\u023b\u023b \u0230\u0230\u0240 \u0231\u0231\u0231\u0231\u0231\u0211\u0204\u0229\u0229\u0232\u0233\u0233\u0233\u0233\u0234\u0158\u0158\u0235\u0235\u0235\u0235\u0235\u0235\u0158\u0158\u0158\u0158\u0158\u0158\u01ba\u01ee\u01ee\u01f9\u01f9\u0174\u0174\u0174\u0174 \u0236\u0236\u0236\u0236\u0236\u0236\u0236\u0236 \u0204\u0204\u0204\u0225\u0211\u0211\u0241\u023d\u0242\u0242\u022c\u022c\u022c\u0238\u0238\u023e\u0238 \u0243 \u022e\u022e\u022e \u022f\u [...]
- "\u023f\u023f\u023a\u023a \u0230\u0230\u0244\u0244 \u0231\u0231\u0245\u0246\u0229\u0232\u0233\u0233\u0233\u0233\u0234\u0234\u0158\u0158\u0158\u0158\u01ba\u0158\u0158\u0158\u0158\u01ba\u0158\u01ba\u01ee\u01ee\u01f9\u01f9\u01f9\u0174\u0174\u0174\u0174\u0236\u0236\u0236\u0236\u0236\u0236 \u0204\u0204\u0204\u0211\u0204\u0204\u0247\u0247\u0248\u0248\u0241\u0242\u022c\u022c\u022c\u022c\u0238\u0238\u023e\u0238\u023e\u0243\u0243\u0243\u0243 \u0249\u0249\u0249\u0249\u0249\u0249\u02 [...]
- "\u023f\u023f\u023a\u023a\u023a \u0240\u0244\u0244 \u024b\u024b\u0246\u0246\u0229\u0232\u0233\u0233\u0233\u0233\u0234\u0234\u0204\u0204\u01ba\u0174\u0174\u0174\u01ba\u01ba\u01ba\u01ee\u01ee\u01ee\u01ee\u01f9\u0174\u024c\u024c\u0174\u0174\u0236\u0236\u0236\u0236\u0236 \u0204\u0204\u0204\u0204\u0204\u0204\u0247\u0247\u0247\u024d\u024d\u024d\u024e\u024f\u0250\u0251\u022c\u022c\u022c\u0238\u0238\u0238\u0238\u023e\u01fa\u0252\u0243 \u0249\u0249\u0249\u0249\u0249\u0249\u0249\u0249\ [...]
- "\u023f \u023a\u023a\u023a \u0240\u0240\u0244\u0244 \u024b\u024b\u024b\u0246\u0253\u0253\u0233\u0233\u0233\u0233\u0234\u0234 \u0211\u0204\u0211\u0204\u0174\u0204\u0174\u0174\u0174\u0174\u0174\u0174\u024c\u024c\u024c\u024c\u024c\u0236\u0236\u0236 \u0204\u0204\u0204\u0204\u0204\u0204\u0204\u0204\u0247\u0247\u0211\u0247\u0247\u0247\u024d\u0254\u0254\u0255\u0241\u0256\u0250\u0251\u0251\u0257\u0208\u0208\u0238\u0238\u0238\u023e\u0252\u0252\u0258\u0252\u0249\u0249\u0249\u0249\u0259\u025 [...]
- " \u023a\u023a\u023a \u0244\u0244 \u024b\u024b\u024b\u0246\u0253\u0253\u025b\u025b\u0233\u0233\u0234\u0234\u025c \u0211\u025d\u025d\u025d\u0211\u0204\u0204\u0204\u0204\u024c\u024c\u024c\u024c\u024c\u0211\u0204\u0204\u0204\u0204\u0211\u0204\u0204\u0247\u0247\u0247\u0211\u0247\u0247\u0247\u0247\u0247\u0254\u0254\u024d\u024d\u024d\u0255\u0241\u0256\u025e\u025e\u0251\u0257\u0257\u0257\u0238\u0238\u0238\u023e\u0238\u0258\u0252\u0258\u0258\u025f\u0260\u0261\u0261\u0259\u0259\u0259\u0 [...]
- " \u0263\u023a\u023a\u023a\u0244\u0244\u024b\u024b\u024b\u0246\u0246\u0253\u025b\u025b\u025b\u025b\u0264\u0264\u025c\u025c \u025d\u025d\u025d\u025d\u0265\u0265 \u0211\u0266\u0266\u024c\u024c\u024c\u024c\u024c\u0211\u0211\u0247\u0247\u0247\u0247\u0247\u0247\u0247\u0247\u0247\u0247 \u0254\u0254\u0267\u0267\u024d\u0241\u0255\u0268\u0269\u025e\u025e\u025e\u0257\u0257\u0257 \u0238\u0238\u0238\u023e\u0252\u0258\u0258\u0258\u0258\u025f\u026a\u0261 \u0259\u0259\u0259\u0259\ [...]
- " \u0263\u0263\u0263\u023a\u023a\u023a\u0244\u024b\u024b\u0246\u0246\u0253\u025b\u025b\u025b\u025b\u025b\u0264 \u025c\u025c \u025d\u025d\u025d\u0265\u0265\u0265 \u0266\u0266\u0266\u0266\u0247\u024c\u024c\u024c\u0247\u0247\u0247\u0247\u0247 \u0254\u0267\u0267\u0267\u0267\u026b\u0255\u0241\u0241\u0269\u025e\u025e\u025e\u0257\u0257\u0257 \u026c\u023e\u023e\u0252\u0258\u0258\u0258\u025f\u0258\u01fa\u026a\u026a \u0259\u0259\u0259 \u0249\u0249\u0249\u01c9\u01dd\u [...]
- " \u0263\u0263 \u023a\u023a\u024b\u0246\u0246\u0253\u0253\u025b\u025b\u025b\u025b\u0264\u0264 \u025c\u026d\u025d\u025d\u025d\u0265\u0265 \u0266\u0266\u0247\u0247\u0247\u0247\u0247\u0247\u0247 \u0254\u0254\u0267\u0267\u026b\u026b\u026b\u0255\u0241\u0256\u0250\u025e\u025e\u0251\u0257\u0257 \u026c\u026c\u0252\u0258\u0258\u025f\u025f\u0258\u01ff\u01fa\u01fa\u026a\u026a \u0259\u0259\u0259\u0259 \u0249\u0249\u01c9\u01c9\u01dd\u01ca\u01cc\u01cc \u0202\u0 [...]
- " \u0263\u0263 \u026e\u023a\u023a\u026f\u0253\u0253\u025b\u025b\u025b\u025b\u0264\u0264 \u025d\u026d\u026d\u0265\u0265 \u0266\u0247\u0247\u0247\u0247\u0247\u0247 \u0267\u0267\u0267\u026b\u026b\u026b\u0255\u024e\u024f\u0250\u025e\u025e\u0251\u0257\u0257 \u026c\u026c\u0270\u0258\u0258\u025f\u0258\u01fe\u01fe\u01fe\u01ff\u01fa\u026a\u026a\u026a\u026a\u026a\u026a\u026a\u026a \u0259\u0259\u0259 \u0249\u0249\u01c9\u01ca\u01bb\u01cc\u01cc \u01cd\u01cd [...]
- " \u0263\u0263 \u026e\u026e \u026f\u026f\u0253\u025b\u025b\u025b\u025b\u0264\u0264 \u025d\u025d\u026d\u026d\u0273\u0266\u0266\u0266\u0247\u0247\u0247 \u0274\u026b\u026b\u026b\u0255\u0255\u0241\u024f\u0250\u025e\u025e\u0251\u0257\u0257 \u026c\u0275\u0270\u0270\u025f\u025f\u0258\u01fe\u01fe\u01fe\u01fe\u01ff\u01ff\u01fa\u0276\u026a\u026a\u026a\u026a\u026a\u026a\u026a\u026a\u026a\u026a\u026a\u026a \u0259\u0259\u0259 \u0249\u0249\u01c9\u01ca\u01bb\u01cc [...]
- " \u0263\u0263\u0263 \u026e\u026e\u026f\u026f\u0253\u025b\u025b\u025b\u025b\u0279\u0279 \u025d\u025d\u025d\u0265\u027a\u027a\u027a\u0247\u0247 \u027b\u0274\u0274\u026b\u026b\u0255\u0255\u0256\u0256\u0250\u025e\u025e\u0251\u0257\u0257 \u026c\u026c\u026c\u0270\u027c\u027c\u027d\u027d\u0208\u01fe\u01fe\u01fe\u01fe\u01ff\u01fa\u01fa \u027e\u026a\u026a\u026a\u026a\u026a\u026a\u026a\u026a\u026a\u026a\u026a \u0259\u0259\u0259 \u0249\u01c9\u01c9\u01ca\u01ca\u [...]
- " \u0263\u0263 \u026f\u026f\u0253\u025b\u025b\u025b\u025b\u025b\u0279\u0279 \u025d\u0265\u0265\u0280\u027a\u027a\u027a\u0273 \u027b\u0274\u026b\u026b\u026b\u0255\u0255\u0256\u0269\u025e\u025e\u025e\u0251\u0257\u0257 \u026c\u026c\u026c\u0270 \u027c\u027c\u027d \u0208\u0208\u01fe\u01fe\u01fe\u01fe\u01ff\u01fa\u0281 \u027e \u026a\u026a\u026a\u026a\u026a\u026a\u026a\u026a\u0259\u0259 \u0249\u01c9\u01c9\u01ca\u01cc\u01cc\u0282\u0282\u027f\u0277\u0277 [...]
- "\u0263\u0263 \u026f\u026f\u0253\u0253\u025b\u025b\u025b\u025b\u0279\u0279 \u025d\u0265\u0265\u0280\u0284\u0280\u0273\u027a\u0273\u0285 \u027b\u0274\u026b\u026b\u0255\u0255\u0241\u0268\u0269\u025e\u025e\u025e\u0257\u0257\u0257 \u026c\u0275\u0270\u0270 \u0286\u0286\u027d \u0287\u0208\u01fe\u01fe\u01fe\u01fe\u01ff\u01fa\u0281 \u027e\u027e \u0288\u0288 \u026a\u026a\u0259\u0259 \u0249\u01c9\u0289\u0282\u0282\u028a\u028a\u027f\u0277\u0277\u0277\u02 [...]
- "\u0263 \u026f\u0253\u0253\u025b\u025b\u025b\u025b\u028b\u0279 \u028c\u028c\u0265\u0284\u0284\u0284\u0284 \u0273\u0285\u0285\u0285 \u027b\u0274\u026b\u026b\u0255\u0255\u0241\u0256\u0269\u025e\u025e\u0251\u0257\u0257 \u026c\u026c\u0270\u0270 \u0286\u0286\u027d\u027d \u0208\u0208\u01fe\u01fe\u01fe\u01fe\u01ff\u01fa \u027e\u027e \u0288\u0288 \u0259\u0259\u0259 \u0282\u0282\u028a\u028a\u028a\u028a\u028a\u028d\u0277 \u0283\u0283\u0283\u0283 [...]
- "\u0263 \u026f\u026f\u0253\u025b\u025b\u025b\u025b\u028b\u028b \u028c\u028c\u028e\u0280\u0280\u0284 \u0285\u0285\u0285 \u027b\u0274\u026b\u026b\u0255\u0255\u0256\u0256\u0250\u025e\u025e\u0251\u0257\u0257 \u026c\u026c\u026c\u0270\u0270 \u0286\u0286\u027d\u027d \u0287\u0208\u0208\u01fe\u01fe\u01fe\u01ff\u01ff\u028f \u027e\u027e \u0288\u0288 \u0259\u0259\u0290\u0282\u028a\u028a\u028a\u028a\u028a\u028a\u0291\u0291 \u0283\u0283\u0283\u028 [...]
- " \u026f\u026f\u0253\u025b\u025b\u025b\u025b\u028b\u028b \u0292\u028e\u0280\u0280\u0280\u0284 \u0293\u0293\u0285\u0285\u0285 \u027b\u0274\u026b\u026b\u026b\u0255\u0241\u0268\u024f\u0250\u025e\u025e\u0251\u0257\u0257 \u026c\u0275\u026c\u0270\u0270\u0286\u0286\u0286\u027d\u027d\u027d \u0287\u0294\u01fe\u01fe\u01fe\u01fe\u01ff\u0295 \u027e\u027e \u0288\u0288 \u0296\u0282\u028a\u028a\u028a\u028a\u028a\u0289\u01bb\u01bb\u0291 \u0297 \u0283 [...]
- " \u026f\u026f\u0253\u025b\u025b\u025b\u025b\u025b\u028b\u0279 \u0298\u0292\u0292\u0284\u0284\u0284 \u0293\u0293\u0293 \u0285\u0285 \u027b\u0274\u0274\u026b\u026b\u0255\u0255\u0241\u024f\u0250\u025e\u025e\u0251\u0257\u0257 \u026c\u026c\u0270\u0270 \u0286\u0286\u0286 \u027d\u027d \u0287\u0294\u0294\u01fe\u01fe\u01fe\u01ff\u0295 \u027e\u027e \u0288\u0288 \u0296\u0296\u0296\u0296\u028a\u028a\u028a\u0249\u0249\u0289\u0299\u01bb\u01bb \u0297\u029 [...]
- " \u026f\u026f\u0253\u0253\u025b\u025b\u025b\u025b\u028b\u028b \u0298\u0298\u0292\u0280\u0284\u0284 \u0293\u0293\u0293 \u0285\u0285 \u027b\u0274\u026b\u026b\u026b\u0255\u0256\u0256\u0269\u025e\u025e\u025e\u0251\u0257 \u026c\u026c\u026c\u0270 \u0286\u0286\u0286 \u027d\u027d \u0294\u01fe\u01fe\u01fe\u01fe\u01ff \u027e \u0288 \u0296\u0296\u0296\u0296\u029b\u029b \u0249\u0289\u0289\u029c\u01bb\u01bb \u029a\u029a \u0283\u0283\u0283\u [...]
- " \u026f\u026f\u0253\u025b\u025b\u025b\u025b\u028b\u028b \u0298\u0292\u0292\u0280\u0280\u0284 \u0293\u0293\u0293 \u0285\u0285 \u029d\u029d \u027b\u0274\u026b\u026b\u0255\u0241\u024e\u0268\u0269\u025e\u025e\u025e\u0251\u0257 \u026c\u0275\u026c\u0270\u0270 \u0286\u0286\u0286 \u027d\u027d \u0294\u01fe\u01fe\u01fe\u01fe\u01ff\u01ff \u027e\u027e \u0288\u0288 \u0296\u0296\u0296\u0296\u0296\u029b\u029b \u0249\u0289\u029c\u0299\u01bb\u01bb \u029a\u0 [...]
- "\u029e \u026f\u026f\u0253\u025b\u025b\u025b\u025b\u028b\u028b \u0292\u0292\u0284\u0280\u0284 \u0293\u0293\u0293 \u0285\u029d\u029d \u027b\u0274\u026b\u026b\u0255\u0255\u0241\u024f\u0269\u025e\u025e\u025e\u0257\u0257 \u026c\u026c\u0270\u0270\u0270\u0286\u0286\u0286 \u029f\u029f\u029f\u029f\u029f\u029f\u029f \u0294\u01fe\u01fe\u01fe\u01ff\u01ff \u027e\u027e\u027e\u027e \u0288\u0288 \u0296\u0296\u0296\u0296\u029b\u029b\u029b \u0249\u0249\u0289\u01bb [...]
- "\u029e\u029e\u026f\u026f\u0253\u025b\u025b\u025b\u025b\u028b\u028b\u0279 \u0298\u0292\u0292\u0284\u0284 \u0293\u0293\u0293 \u0285\u029d\u0285 \u0274\u0274\u026b\u026b\u0255\u0255\u0241\u0256\u0250\u025e\u025e\u0251\u0257\u0257 \u026c\u026c\u026c\u0270 \u0286\u0286\u0286 \u029f\u029f\u029f\u029f\u029f\u029f\u029f\u029f\u029f\u029f \u0294\u01fe\u01fe\u01fe\u01fe\u01ff\u02a0\u027e\u027e\u027e\u027e\u027e\u027e\u027e\u027e\u0288\u0288 \u0296\u0296\u0296\u0296\u029 [...]
- " \u029e\u026f\u0253\u025b\u025b\u025b\u025b\u025b\u028b\u028b \u0298\u0298\u0280\u0284\u0284 \u0293\u0293\u0293 \u0285\u0285\u0285 \u027b\u0274\u0274\u026b\u026b\u0255\u0255\u024e\u024f\u0250\u025e\u025e\u0251\u0257\u0257 \u026c\u026c\u0270\u0270 \u02a1\u0286\u02a2\u02a3\u029f\u029f\u029f\u029f \u029f\u029f\u029f \u0294\u01fe\u01fe\u01fe\u0295\u02a0 \u027e\u027e\u027e\u0288\u0288\u027e\u027e\u0296\u0296\u0296\u0296\u02a4\u02a4\u02a5\u02a5 \u0249\ [...]
- " \u026f\u0253\u0253\u025b\u025b\u025b\u025b\u028b\u028b \u0298\u0292\u0292\u0280\u0284 \u0293\u0293\u0293 \u0285\u0285\u0285\u027b\u0274\u026b\u026b\u026b\u0255\u0255\u0241\u024f\u0250\u025e\u025e\u0251\u0257\u0257 \u026c\u026c\u0270\u0270 \u02a1\u02a1\u02a1\u02a1\u02a3\u02a3\u029f\u029f\u029f \u029f\u029f\u029f \u0294\u0294\u0294\u02a6\u02a6\u02a0 \u02a7\u02a7\u02a7\u0296\u02a4\u02a4\u02a4\u02a8\u02a8\u02a5\u02a9\u02a9\u02a9 \u0289\u0289\u02 [...]
- "\u026f\u026f\u0253\u025b\u025b\u025b\u025b\u028b\u028b \u0292\u0292\u0284\u0284 \u0293\u0293 \u0285\u0274\u026b\u026b\u026b\u0255\u0241\u0256\u0256\u0250\u025e\u025e\u0251\u0257 \u026c\u026c\u026c\u02aa \u02a1\u02a1\u02a1\u02a3\u02a3\u02a3 \u029f\u029f\u029f \u02ab\u0294\u02a6\u02a6\u02a6\u02a0 \u02a7\u02a7\u02a7\u02a7\u02ac\u02a4\u02a8\u02a8\u02a8\u02a8\u02a9\u02a9\u02a9\u02a9 \u0249\u0249\u0249\u0299\u01bb\u01bb \u029a\u029a [...]
- "\u026f\u0253\u025b\u025b\u025b\u025b\u028b\u028b \u0298\u0292\u0284\u0284 \u0293\u0293 \u0285\u0274\u026b\u026b\u0255\u02ad\u02ad\u0256\u0269\u025e\u025e\u025e\u0251\u0257 \u026c\u026c\u02ae \u02a1\u02a1\u02a1 \u02a3\u02a3 \u029f\u029f\u029f\u029f\u029f\u029f\u029f\u029f\u02a6\u02a6\u0294\u0295\u02a0 \u02a7\u02a7\u02a7\u02a7\u02ac\u02ac\u02af \u02a5\u02a5\u02a9\u02a9 \u0249\u0289\u0289\u029c\u01bb\u01bb \u029a\u029a ",
- "\u0253\u025b\u025b\u025b\u025b\u025b\u028b\u028b \u0298\u0298\u0280\u0284\u0284 \u0293\u0293\u0293 \u0285\u0274\u026b\u026b\u0255\u0255\u02ad\u0268\u0269\u025e\u025e\u025e\u0257\u0257 \u026c\u02aa\u02aa \u02b0\u02a1\u02a1\u02a1 \u029f\u029f\u029f\u029f\u029f\u029f\u02ab\u0294\u0294\u0294\u0295\u028f \u02a7\u02a7\u02a7\u02a7\u02a4\u02a4\u02af\u02af \u02a5\u02a5\u02a9\u02a9 \u0249\u0289\u0299\u029c\u01bb\u01bb \u029a\u029a\u029a [...]
- "\u0253\u025b\u025b\u025b\u025b\u028b\u028b \u0298\u0292\u0280\u0280\u0284 \u0293\u0293\u0293 \u0285\u0285\u0274\u026b\u026b\u0255\u0255\u02b1\u02b2\u02b3\u025e\u025e\u0251\u0257\u0257 \u026c\u026c\u026c\u02ae\u02b0\u02b0\u02b0\u02a1\u02a1 \u02ab\u0294\u0294\u0294\u0295\u02a0 \u02a7\u02a7\u02a7\u02a7\u02a4\u02a4 \u02af\u02af \u02a5\u02a5\u02a9\u02a9 \u0289\u0289\u0289\u01bb\u01bb\u01bb \u029a\u029a\u029a ",
- "\u025b\u025b\u025b\u025b\u028b\u028b \u0292\u0292\u0284\u0284 \u0293\u0293\u0293 \u0285\u0285\u0285\u0274\u026b\u026b\u02b4\u02b4\u02b1\u02b5\u02b6\u02b6\u025e\u0251\u0257\u0257 \u026c\u026c\u02aa\u02aa\u02b0\u02b0\u02b0\u02a1\u02a1 \u02ab\u02ab\u0294\u0294\u0294\u0295\u02a0 \u02a7\u02a7\u02a7\u02a7\u02a4\u02a4 \u02af\u02af \u02a5\u02a5\u02a9\u02a9 \u0289\u0249\u0299\u01bb\u01bb \u029a\u029a ",
- "\u025b\u025b\u025b\u028b\u028b \u0298\u0292\u0284\u0284 \u0293\u0293\u0293 \u0285\u0285\u0285\u0285\u0274\u026b\u026b\u02b4\u02b4\u02b2\u02b3\u02b3\u02b7\u02b7\u02b7\u0257\u0257 \u026c\u026c\u02aa\u02aa \u02b0\u02b0\u02b0 \u02a1\u02a1 \u02ab\u02ab\u0294\u0294\u0295\u0295\u028f\u02a7\u02a7\u02a7\u02a4\u02a4 \u02af\u02af \u02a5\u02a5\u02a9\u02a9\u02a9 \u0289\u0289\u029c\u01bb\u01bb \u029a\u029a ",
- "\u025b\u025b\u028b\u028b \u0298\u0298\u0280\u0284 \u0293\u0293\u0293 \u0285\u0285\u0285 \u026b\u026b\u02b4\u02b4\u0255\u02b2\u02b2\u02b3\u02b8\u02b7\u02b7\u0257\u0257 \u026c\u026c\u026c\u026c\u02aa \u02b0\u02b0\u02b0 \u02a1\u02a1 \u02ab\u02ab\u0294\u0294\u0294\u0295\u02a7\u02a7\u02a7\u02a4\u02a4\u02b9\u02b9\u02ba\u02ba\u02ba\u02af \u02a5\u02a5\u02a9\u02a9\u02a9 \u0289\u0289\u02bb\u01bb\u01bb \u029a ",
- "\u025b\u025b\u028b\u028b \u0298\u0292\u0280\u0280\u0284 \u0293\u0293\u0293 \u0285 \u0274\u026b\u026b\u02b4\u0255\u02b5\u02b5\u02b6\u02b7\u02b7\u0257\u0257 \u026c\u026c\u02aa\u026c\u02aa \u02b0\u02b0\u02b0 \u02a1 \u02ab\u02ab\u0294\u0294\u0294\u02a7\u02a7\u02bc\u02bc\u02a4\u02b9\u02b9\u02ba\u02ba\u02ba\u02af\u02af\u02af\u02af\u02af\u02af\u02af\u02af \u02a5\u02a5\u02a9\u02a9\u02a9 \u02bd\u02bd\u02be\u01bb\u01bb ",
- "\u025b\u028b\u028b \u0298\u0292\u0292\u0284\u0284 \u0293\u0293\u0293 \u0285\u0274\u026b\u026b\u02b4\u0255\u02b3\u02b5\u02b6\u02b7\u02b7\u0257\u0257\u0257\u026c\u02bf\u02bf\u02aa \u02b0\u02b0 \u02a1\u02a1 \u02c0\u02c0 \u02ab\u02ab\u0294\u02c1\u02c1\u02c2\u02bc\u02bc\u02a4 \u02af\u02af\u02af\u02af\u02af\u02af\u02af\u02af\u02af\u02af\u02af\u02af\u02a9\u02a9\u02a9 \u02bd\u02bd\u02bd\u02be\u01bb\u01bb ",
- "\u028b\u028b \u0298\u0292\u0284\u0284 \u0293\u0293 \u0285\u026b\u02b4\u02b4\u0255\u02b3\u02b3\u02b8\u02b7\u0257\u0257\u0257\u02bf\u02bf\u02bf\u02bf \u02b0\u02b0\u02b0 \u02a1\u02a1 \u02c0\u02c0 \u02ab\u02ab\u0294\u02c1\u02c1\u02c1\u02c1\u02c3\u02a0\u02a0 \u02af\u02af\u02af\u02af\u02a5\u02a5\u02a9\u02a9\u02c4 \u0289\u02bd\u029c\u01bb\u01bb\u01bb ",
- "\u028b \u0298\u0298\u0280\u0284 \u0293 \u02b4\u02b4\u02b4\u0255\u02b6\u02b6\u02b8\u02b8\u0257\u0257\u02bf\u02bf\u02bf\u02aa\u02aa \u02b0\u02b0\u02b0 \u02a1\u02a1 \u02c0\u02c0 \u02ab\u02c5\u02c1\u02c1\u02c1\u02c1\u02c1\u02c6\u02c6\u02c6\u02c6 \u02c7\u02c4\u02a5\u02a5\u02a9\u02a9\u02c4 \u02c8\u02c8 \u0289\u0289\u02bb\u02bb\u01bb ",
- "\u028b \u0298\u0292\u0280\u0280 \u02b4\u02b4\u02b4\u0255\u02b6\u02b6\u02b6\u0257\u0257\u026c\u026c\u026c\u02bf\u02aa \u02b0\u02b0\u02b0 \u02a1\u02a1 \u02c0\u02c0\u02c0 \u02c5\u02c5\u02c1\u02c1\u02c1\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6 \u02c7\u02c7\u02c7\u02a5\u02a5\u02c4\u02a9\u02a9\u02c4 \u02c8\u02c8\u02c8 \u02bd\u02bd\u02be\u01bb\u01bb ",
- " \u0298\u0292\u0292\u0284\u0284 \u02b4\u02b4\u0255\u0255\u02c9\u02c9\u02b6\u0257\u026c\u026c\u02aa\u026c\u02aa \u02b0\u02b0\u02b0 \u02a1\u02a1\u02a1 \u02c0\u02c0\u02c0 \u02ca\u02c5\u02c5\u02cb\u02cb\u02cc\u02cc\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c7\u02c7 \u02a5\u02cd\u02c4\u02a9\u02a9\u02c8\u02c8\u02c8 \u0289\u02bd\u0299\u02be\u01bb\u01bb ",
- " \u0298\u0292\u0284\u0284 \u02b4\u02b4\u0255\u0255\u02ce\u02c9\u02c9\u02cf\u026c\u026c\u026c\u02aa \u02b0\u02b0\u02b0 \u02a1\u02a1\u02a1 \u02c0\u02c0 \u02ca\u02d0\u02c5\u02cb\u02cb\u02cb\u02d1\u02cc\u02cc\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02d2\u02c6\u02c6\u02c6\u02c6\u02c6\u02cd\u02cd\u02c4\u02c8\u02c8 \u0289\u0289\u0299\u02bb\u02bb\u01bb ",
- "\u0298\u0298\u0280\u0284 \u02b4\u02b4\u02b4\u0255\u02d3\u02ce\u02cf\u026c\u02aa\u026c\u026c \u02b0\u02b0 \u02a1\u02a1\u02a1 \u02c0\u02c0 \u02ca\u02ca\u02d0\u02c5\u02cb\u02cb\u02cb \u02cc\u02cc\u02cc\u02cc\u02cc\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02d2\u02d2\u02c6\u02c6\u02c6\u02c6\u02c6\u02cd\u02cd\u02c4\u02a9\u02a9\u02a9 \u0289\u0289\u029c\u02bb\u02bb\u01bb ",
- "\u0292\u0280\u0280 \u02b4\u02b4\u02b4\u0255\u02ce\u02ce\u02ce\u02cf\u026c\u026c\u02aa\u02aa \u02b0\u02b0\u02b0 \u02a1\u02a1\u02a1 \u02c0\u02c0 \u02d0\u02d0\u02d0\u02cb\u02cb\u02cb \u02cc\u02cc\u02cc\u02cc\u02cc\u02cc\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02d2\u02d2\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02cd\u02cd\u02c6\u02a9\u02a9\u02c4 \u0289\u0289\u0299\u01bb\u01bb\u01bb ",
- "\u0292\u0284 \u02b4\u02b4\u02b4\u0255\u02ce\u02ce\u02d3\u026c\u026c\u026c\u02aa \u02b0\u02b0 \u02a1\u02a1\u02a1 \u02c0\u02c0 \u02ca \u02c5\u02cb\u02cb\u02cb \u02cc\u02d1\u02cc\u02cc\u02cc\u02cc\u02cc\u02cc\u02cc\u02cc\u02cc\u02d2\u02d2\u02cc\u02cc\u02cc\u02c6\u02c6\u02c6\u02c6\u02cd\u02cd\u02c6\u02c6\u02c6\u02a9\u02c4 \u0289\u0289\u029c\u01bb\u01bb\u01bb ",
- "\u0284\u0284 \u02b4\u02b4\u02b4\u0255\u02ce\u02d3\u02d3\u026c\u02aa\u026c\u02aa \u02a1\u02a1\u02a1 \u02cb\u02cb \u02d1\u02d1\u02d1\u02d1\u02d1\u02d1\u02d1\u02d1\u02d2\u02cc\u02cc\u02cc\u02cc\u02cc\u02cc\u02cc\u02cc\u02c6\u02cd\u02cd\u02c6\u02c6\u02c6\u02a9\u02c4 \u0289\u0289\u0299\u029c\u01bb\u01bb\u01bb ",
- "\u0284 \u02b4\u02b4\u02b4 \u02d3\u02d3\u026c\u026c\u02aa \u02a1\u02a1\u02a1 \u02cc\u02cc\u02cc\u02cd\u02cd\u02c6\u02c6\u02c6\u02c6\u02c6\u02c4 \u0289\u0289\u029c\u029c\u01bb\u01bb ",
- " \u02b4\u02b4\u0255 \u02d3\u02d3\u02d3\u026c\u026c\u026c \u02a1\u02a1\u02a1 \u02cc\u02cd\u02cd\u02c6\u02c6\u02c6\u02c6\u02c6\u02c6\u02c4 \u0289\u0289\u0299\u029c\u01bb\u01bb ",
- " \u02b4\u02b4\u0255 \u02d3\u02d3\u02d3\u026c\u026c\u02aa \u02a1\u02a1 \u02cc\u02cc\u02cc\u02c6\u02c6\u02c6\u02c6\u02c6\u02c4\u02c4 \u0289\u0289\u029c\u029c\u01bb\u01bb ",
- " \u02b4\u02b4\u0255 \u02d3\u02d3\u026c\u026c\u02aa\u02aa \u02a1\u02a1 \u02cc\u02cc\u02c6\u02c6\u02c6\u02c6\u02c6\u02c4\u02c4 \u0289\u0289\u0299\u029c\u01bb\u01bb\u01bb ",
- " \u02b4\u02b4\u02b4 \u02d3\u02d3\u026c\u026c\u026c\u02aa \u02a1\u02a1 \u02cc\u02cc\u02c6\u02c6\u02c6\u02c6\u02c6\u02c4 \u0289\u0289\u0289\u029c\u01bb\u01bb ",
- " \u02b4\u02b4\u02b4 \u02d3\u02d3\u026c\u026c\u02aa \u02a1 \u02cc\u02cc\u02c6\u02c6\u02c6\u02c6\u02c6\u02c4 \u0289\u0289\u0299\u029c\u01bb\u01bb ",
- " \u02b4\u02b4 \u02d3\u02d3\u026c\u02aa\u02aa \u02cc\u02cc\u02c6\u02c6\u02c6\u02c6\u02c6\u02a9 \u0289\u0289\u029c\u029c\u01bb\u01bb ",
- " \u02d3\u02d3\u02d3\u026c\u026c\u026c \u02cc\u02cc\u02c6\u02c6\u02c6\u02c6\u02c6\u02a9 \u0289\u0289\u029c\u01bb\u01bb "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/road-casings-non-grouped-rendering-600-600-1.0-grid-reference.json b/tests/visual_tests/grids/road-casings-non-grouped-rendering-600-600-1.0-grid-reference.json
deleted file mode 100644
index 8daef1b..0000000
--- a/tests/visual_tests/grids/road-casings-non-grouped-rendering-600-600-1.0-grid-reference.json
+++ /dev/null
@@ -1,892 +0,0 @@
-{
- "keys": [
- "",
- "330",
- "155",
- "74",
- "57",
- "749",
- "788",
- "201",
- "202",
- "181",
- "691",
- "774",
- "228",
- "46",
- "523",
- "73",
- "530",
- "384",
- "286",
- "385",
- "1",
- "156",
- "644",
- "361",
- "531",
- "43",
- "449",
- "93",
- "328",
- "527",
- "605",
- "589",
- "288",
- "215",
- "635",
- "532",
- "588",
- "154",
- "138",
- "287",
- "637",
- "638",
- "529",
- "576",
- "362",
- "348",
- "45",
- "639",
- "497",
- "300",
- "329",
- "237",
- "600",
- "137",
- "534",
- "636",
- "595",
- "103",
- "14",
- "180",
- "232",
- "593",
- "104",
- "353",
- "526",
- "592",
- "594",
- "136",
- "352",
- "327",
- "323",
- "203",
- "490",
- "415",
- "442",
- "342",
- "258",
- "528",
- "596",
- "599",
- "157",
- "343",
- "331",
- "257",
- "598",
- "412",
- "313",
- "335",
- "277",
- "89",
- "597",
- "344",
- "431",
- "276",
- "126",
- "113",
- "108",
- "107",
- "591",
- "590",
- "407",
- "414",
- "147",
- "372",
- "369",
- "413",
- "337",
- "124",
- "122",
- "110",
- "174",
- "406",
- "75",
- "82",
- "83",
- "99",
- "97",
- "72",
- "278",
- "173",
- "472",
- "481",
- "336",
- "159",
- "153",
- "100",
- "102",
- "96",
- "200",
- "266",
- "265",
- "263",
- "269",
- "231",
- "446",
- "371",
- "66",
- "409",
- "410",
- "315",
- "179",
- "182",
- "419",
- "392",
- "391",
- "390",
- "525",
- "417",
- "411",
- "183",
- "479",
- "473",
- "146",
- "475",
- "474",
- "401",
- "421",
- "445",
- "356",
- "483",
- "480",
- "551",
- "583",
- "325",
- "324",
- "476",
- "582",
- "364",
- "389",
- "393",
- "839",
- "724",
- "440",
- "227",
- "620",
- "462",
- "477",
- "268",
- "267",
- "225",
- "464",
- "16",
- "271",
- "535",
- "463",
- "299",
- "693",
- "261",
- "270",
- "247",
- "548",
- "467",
- "465",
- "422",
- "241",
- "466",
- "238",
- "239",
- "246",
- "489",
- "634",
- "671",
- "333",
- "326",
- "488",
- "482",
- "633",
- "448",
- "243",
- "248",
- "461",
- "460",
- "332",
- "378",
- "577",
- "484",
- "471",
- "381",
- "25",
- "188",
- "355",
- "470",
- "565",
- "469",
- "334",
- "379",
- "284",
- "279",
- "175",
- "667",
- "562",
- "380",
- "665",
- "550",
- "373",
- "354",
- "632",
- "485",
- "570",
- "363",
- "575",
- "673",
- "585",
- "131",
- "404",
- "285",
- "587",
- "78",
- "145",
- "85",
- "41",
- "773",
- "739",
- "478",
- "87",
- "121",
- "40",
- "358",
- "226",
- "260",
- "283",
- "687",
- "690",
- "486",
- "133",
- "672",
- "95",
- "322",
- "321",
- "195",
- "264",
- "194",
- "177",
- "396",
- "359",
- "402",
- "55",
- "686",
- "619",
- "15",
- "382",
- "397",
- "319",
- "735",
- "212",
- "236",
- "282",
- "280",
- "618",
- "615",
- "614",
- "403",
- "376",
- "59",
- "204",
- "786",
- "640",
- "641",
- "375",
- "374",
- "400",
- "320",
- "58",
- "199",
- "692",
- "584",
- "377",
- "395",
- "405",
- "398",
- "56",
- "579",
- "670",
- "31",
- "357",
- "505",
- "493",
- "784",
- "741",
- "743",
- "50",
- "92",
- "38",
- "213",
- "847",
- "492",
- "841",
- "254",
- "747",
- "827",
- "568",
- "39",
- "53",
- "439",
- "224",
- "607",
- "5",
- "61",
- "158",
- "840",
- "438",
- "214",
- "835",
- "753",
- "223",
- "626",
- "22",
- "13",
- "838",
- "302",
- "54",
- "52",
- "708",
- "769",
- "697",
- "165",
- "118",
- "62",
- "494",
- "491",
- "301",
- "9",
- "222",
- "622",
- "423",
- "296",
- "317",
- "318",
- "252",
- "631",
- "495",
- "304",
- "710",
- "762",
- "36",
- "123",
- "308",
- "760",
- "630",
- "621",
- "674",
- "2",
- "3",
- "253",
- "255",
- "846",
- "77",
- "316",
- "771",
- "628",
- "453",
- "291",
- "383",
- "722",
- "564",
- "295",
- "292",
- "365",
- "830",
- "845",
- "617",
- "624",
- "666",
- "662",
- "581",
- "42",
- "294",
- "726",
- "694",
- "627",
- "654",
- "661",
- "456",
- "48",
- "47",
- "716",
- "732",
- "836",
- "623",
- "507",
- "629",
- "606",
- "651",
- "571",
- "580",
- "574",
- "572",
- "293",
- "837",
- "613",
- "457",
- "65",
- "459",
- "23",
- "758",
- "834",
- "764",
- "831",
- "780",
- "144",
- "125",
- "719",
- "844",
- "184",
- "616",
- "679",
- "681",
- "458",
- "833",
- "713",
- "825",
- "166",
- "139",
- "682",
- "17",
- "511",
- "509",
- "29",
- "832",
- "770",
- "772",
- "766",
- "768",
- "689",
- "842",
- "220",
- "610",
- "675",
- "518",
- "63",
- "26",
- "27",
- "219",
- "221",
- "506",
- "677",
- "120",
- "714",
- "498",
- "680",
- "35",
- "730",
- "738",
- "678",
- "676",
- "573",
- "37",
- "443",
- "740",
- "717",
- "502",
- "642",
- "130",
- "444",
- "703",
- "742",
- "826",
- "501",
- "503",
- "142",
- "117",
- "18",
- "28",
- "731",
- "745",
- "767",
- "90",
- "569",
- "70",
- "20",
- "715",
- "808",
- "170",
- "727",
- "515",
- "514",
- "521",
- "755",
- "191",
- "185",
- "684",
- "557",
- "516",
- "513",
- "522",
- "311",
- "234",
- "556",
- "519",
- "517",
- "701",
- "310",
- "545",
- "450",
- "699",
- "696",
- "733",
- "350",
- "211",
- "520",
- "303",
- "725",
- "736",
- "702",
- "823",
- "210",
- "64",
- "816",
- "822",
- "820",
- "349",
- "524",
- "140",
- "345",
- "746",
- "815",
- "814",
- "189",
- "192",
- "190",
- "555",
- "135",
- "24",
- "705",
- "744",
- "698",
- "813",
- "193",
- "553",
- "538",
- "546",
- "643",
- "33",
- "34",
- "510",
- "721",
- "818",
- "712",
- "707",
- "539",
- "750",
- "795",
- "817",
- "12",
- "351",
- "559",
- "603",
- "601",
- "604",
- "794",
- "793",
- "783",
- "683",
- "206",
- "544",
- "76",
- "734",
- "819",
- "781",
- "789",
- "32",
- "706",
- "805",
- "785",
- "787",
- "297",
- "235",
- "105",
- "44",
- "542",
- "759",
- "765",
- "807",
- "791",
- "711",
- "290",
- "347",
- "289",
- "536",
- "51",
- "757",
- "728",
- "811",
- "810",
- "852",
- "425",
- "160",
- "430",
- "169",
- "778",
- "704",
- "504",
- "779",
- "709",
- "134",
- "98",
- "4",
- "541",
- "346",
- "809",
- "339",
- "305",
- "685",
- "148",
- "540",
- "752",
- "341",
- "167",
- "162",
- "163",
- "149",
- "754",
- "748",
- "340",
- "10",
- "168",
- "67",
- "828",
- "824",
- "782",
- "688",
- "109",
- "554",
- "763",
- "756",
- "428",
- "112",
- "68",
- "496",
- "127",
- "229",
- "128",
- "161",
- "761",
- "829",
- "132",
- "249",
- "176",
- "561",
- "306",
- "537",
- "111",
- "171",
- "307",
- "432",
- "309",
- "19",
- "164",
- "250",
- "178",
- "695",
- "129",
- "116",
- "804",
- "775",
- "197",
- "360",
- "21",
- "802",
- "800",
- "806",
- "803",
- "801",
- "799",
- "797",
- "798",
- "217",
- "216",
- "718",
- "69",
- "150",
- "7",
- "790",
- "338",
- "843",
- "720",
- "152",
- "151",
- "86",
- "8",
- "207",
- "796",
- "233",
- "88",
- "218",
- "560",
- "209",
- "6",
- "777",
- "452",
- "208",
- "172",
- "776",
- "558",
- "451"
- ],
- "data": {},
- "grid": [
- " ! ##$ %%&'' ( )) *** ",
- " ! ##$ %%+', ( ))) ** - ",
- " !! #.$ %%&+' ( ))) ** - ",
- " / 0 ! #.$ %%&', ( ))) ** - ",
- " / 1 0 ! #.$ 2 %%&+', ( ))3 *** - ",
- " / 1 00 !! #.$ 4 2 %%&', ( )) 33 ** -- ",
- " / 1 000 ! #.$ 4 222 %%&+',55 ( )) 3 ** -- ",
- " / 1 66700 ! 8888 ##.$4 22 %%&',555 ( )) 3 ** -- ",
- " / 1 99667000 ! 888 #..$4 222 :%%+',55; ( )) 33*** -- ",
- " / 1 99 667700 ! 8 ##.$$4 22 :%%&', 55 ( )) 33** -- ",
- " / 1 99 66770<0 ! 8 ##.$=422 :%%+',55; ( )) **3 -- ",
- " />>> ? 1 9@@ 667<<000 !! 8 #..$=422 :%%&',,55; ( )) A**3 ------- BBBB ",
- " / C>>>> ? D 9 @E EE66F 0000 ! 8 ##.GG=42 ::%%+',555 ( ) H 3--- BB BB ",
- " / CI J>>KKK DDDD 9 E EEE ELFFF 000 ! MMMMMMNN #O.G= ::%%&+ ,55; ( ) * 3- B ",
- " //PPPPPJ Q DDDDD99 E EE L FFF 000 ! R R N## GGS: :::%&+',555 ( )) **TT BB ",
- " / PC IJPPQ DD EE EE UUU FFF 0000 ! R R #VVGS.::::%%&' ,55; () TT - BBBBBBBBB ",
- "W/ PXXIJP Q EE E YYUUU FFF 000 ! R R ZZ VSS[:::%%&+', 55 ) TT] - BB ^ ",
- "//PPP JP Q E E __YYY UU FFF 000 ! R R ZZ``Saa[[ %%&' ,555 ))TT] - BB ^ ",
- "bb C PPPPQ E E c __ YY U dFF ee0 ! R RR Z``fg [[[%%&',,55 hh T ] - B ^^ ",
- "/bbbb J Q EE LLLcc ___YY dd FFF e000 ! RRR ZZ``fg [[%&+',555 hhiT ] - B ^^ ",
- " bbbbQ j kkk ccc__ d FFFe 000 !!l ZZ`mmmmm [%%&+ ,555 hh iT ] - B nnn ",
- " o jj kkkccc d p qFFF 00r lll Z``stttmm[%%+', 55 hh iT ]]- B uun ",
- " o jj kkkk d vvppq FFFF rr00llllll wZ` sx tm%%&+',55;y hh iT ]z-- B ^ u {{{{{{{{{{",
- " oo jjjjj kkd ||vvvqpp FFFr 0000llll ZZ` s}}}m[%%&'~,55 yyh iT \u007f\u007f\u007f zzzzzz--- B {{{{{{\u0080{{{{{{{{{{{{{\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081",
- " o j kk|||qvv pp rrFF 00000l Z`` ssssm[%%&',555 hh iT\u007f\u007f \u0082\u0082\u0082\u0082\u0082\u0082\u0082\u0083\u0083{{{{{{{{{{\u0081\u0081\u0081\u0081\u0081\u0080\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081 ",
- " o j kkk q| vv\u0084\u0085\u0086\u0087 FFF\u0088\u0088\u008800000Z`\u0089\u008a\u008bx \u008cm%%&+',55\u008d\u008dh\u0082\u0082\u0082\u0082\u0082\u0082\u0082\u0082\u0082\u0082\u0082\u0082\u0082\u008e\u008e\u008e\u008e\u008e\u008e\u008e\u008e\u008e\u008f\u008f\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0081\u0090\u0081\u0081 ",
- " o j kq |||\u0084\u0084\u0091\u0087\u0086\u0086 \u0092\u0088\u0088\u0088\u0088\u0088\u0088\u0093\u0094`\u0095\u0095\u0095\u0095\u0095\u0095\u0095\u0096\u0096\u0096+\u0096,\u0096\u0096\u0096\u008d\u008d\u0082\u0082\u0082\u0082\u0082\u0097\u0097\u0097\u008e\u008e\u008e\u008e\u008e\u008e\u008e\u008e\u008e\u008e\u008e\u008e\u0098 -- \u0099 \u0090 ",
- " o jj \u009a\u009b\u009a kkk| \u009c\u0087\u0091\u0091 \u0086\u0086 \u0092\u0092\u009d\u009d\u0088\u0088\u009e\u009f\u009f\u009f\u009f\u009f\u009f\u009f\u00a0\u00a0\u00a0&+\u00a0,\u00a0\u00a0\u0097\u0097\u00a1\u0097\u0097\u0097\u0097 \u00a2\u00a3\u00a4\u00a5\u00a5\u00a6 \u00a7\u00a7\u00a7\u00a7--- \u0099\u0099 \u0090 ",
- " o jj \u009a\u009a\u009b \u009a\u009a\u009a k \u0087\u009c \u0091 k\u00a8\u009d\u00a9\u00aa\u009e\u00ab\u00ab\u00acx\u00ad %%%&',55 \u00ae \u00a2\u00a3 \u00af\u00af\u00a6\u00a7-- \u0099 \u0090 ",
- " o j \u009a \u009b \u009a kkkkkkkkkk\u00b0kkk \u009d\u009d\u009e\u009e\u00b1\u00b2 x\u00b3 %%&&',55 \u00ae \u00a2\u00a3 \u00af - \u0099\u0099 \u0090 ",
- "\u00b4\u00b4\u00b4 o j \u009a \u009b \u00b5 \u00b6\u00a8\u009d\u009e\u009e\u00b1\u00b2x \u00ad\u00b3 %%&+',55 \u00ae \u00a2\u00a3\u00b7\u00af - \u0099 \u0090 ",
- " \u00b4\u00b4\u00b4o j \u009a\u009a \u009b\u009b \u00b8\u00b9 \u00b5 \u00b6\u00a8\u00ba\u009e \u00b1\u00b2x\u00ad \u00b3%%%&+',55 \u00ae \u00a2\u00a3\u00b7\u00af - \u0099 \u0090 ",
- " \u00b4\u00b4\u00b4 jj \u009a\u009a \u009b \u00bb\u00bc \u00b8\u00b9\u00b9\u00b9 \u00bd\u00bd\u00bd\u00bd\u00be \u00bf\u00ba\u00ba\u009e\u00b1 \u00b2x\u00ad\u00b3 %%%&+',5\u00c0 \u00ae \u00a2 \u00a3\u00b7\u00af - \u0099 \u0090 ",
- "\u00c1 \u00b4\u00b4\u00b4 jj \u009a \u009b \u00bb \u00bc\u00bc\u00bc \u00c2 \u00b9\u00b9 \u00bd\u00bd\u00bd \u00be \u00bf\u00ba\u009e\u009e\u00b1\u00b2 x\u00ad\u00b3 %% &+'55\u00c0 \u00ae \u00a2\u00a2\u00a3\u00b7\u00b7\u00af - \u0099 \u0090 ",
- " \u00c1\u00c1 \u00b4\u00b4 j \u009a\u00c3 \u009b\u009b\u009b\u00bb \u00c4\u00c4\u00c2\u00b8 \u00b9 \u00c5 \u00c6 \u00bf\u00bf\u00ba\u009e \u00b1\u00b2x\u00ad\u00ad\u00b3 %% &+'55\u00c0 \u00ae \u00a2\u00a3\u00a3\u00b7\u00b7\u00af- \u0099 \u0090 ",
- " \u00c1\u00c1 j \u009a\u009a\u00c3 \u009b\u00c7\u00c7 \u00c8 \u00b8\u00b8\u00b8\u00b8\u00b8\u00b9 \u00c5 \u00c6 \u00bf\u00c9\u00ba\u009e \u00ca\u00ca\u00b2\u00cb\u00b3\u00b3 %% \u00cc\u00cd,55 \u00ce \u00ae \u00a2 \u00a3 \u00b7\u00cf\u00cf- \u0099 \u0090 ",
- " \u00c1\u00d0\u00d0\u00d0 jj j \u009a\u009a\u00c3\u00c3\u00d1\u00d1\u00d1\u00d1\u00d1\u00bb\u00d1 \u00d2\u00c7 \u00c8 \u00b9 \u00c5 \u00c6\u00c6 \u00bf\u00ba\u00ba\u009e \u00b2\u00cb\u00b3 %%%&\u00cc',55 \u00ce \u00ae \u00a2\u00a2\u00d3\u00d3\u00d4\u00d5 -- \u0099 \u0090 ",
- " \u00c1\u00c1\u00d0\u00d0j jj \u009a\u00d1\u00d1\u00c3 \u00d6\u00d1\u00d1\u00d2 \u00c7\u00c8 \u00b9 \u00c5 \u00c6 \u00bf\u00ba\u009e\u009e x\u00cb\u00ad \u00d7%%&\u00cc',55 \u00ce \u00ae\u00ae \u00a2\u00d8\u00d3 \u00d5\u00d5 - \u0099 \u0090 ",
- " \u00c1\u00c1 \u00d0\u00d0 \u009a\u00d1\u00d1 \u00c3\u00c3\u00d9\u00d9\u00d9\u00d9\u00d9\u00d9\u00da \u00d1\u00d1\u00c8 \u00b9 \u00c5 \u00c6 \u00db\u00bf\u00ba\u009e x\u00cb\u00ad %%%&\u00dc',55\u00ce\u00c0 \u00ae \u00a2\u00a2\u00dd\u00de \u00d5 - \u00df\u00df\u0099\u0099 \u0090 ",
- " \u00c1\u00c1 \u00d0\u00d0 \u009a\u00e0\u00d1 \u00d9\u00d9 \u00e1 \u00d9\u00d9\u00d9 \u00e2\u00d1\u00d1 \u00b9 \u00c5 \u00e3\u00c6 \u00bfx\u00ba\u009e x\u00cb\u00ad \u00d7%% &\u00dc',55 \u00c0 \u00ae \u00a2 \u00de\u00de \u00d5 - \u00e4\u00df \u0099 \u0090 ",
- " \u00c1 \u00d0\u00d0 \u009a\u009a\u00d1\u00e0\u00e0\u00e0 \u00e5\u00e5\u00e1\u00e5 \u00d9\u00e2 \u00d1 \u00b9 \u00c5 \u00c6 \u00bf\u00ba\u00ba\u009e x\u00cb\u00ad \u00d7%% &\u00cc',55 \u00c0 \u00ae \u00a2\u00a2 \u00dd\u00dd \u00d5 -- \u00e6\u00e7\u00e8 \u0099\u0099 \u0090 ",
- " \u00c1 \u00e9 \u009a \u00d1\u00ea\u00ea\u00ea \u00e5 \u00e5\u00e5 \u00eb\u00d9\u00d9 \u00d1 \u00b9 \u00ec\u00ec \u00ed \u00bf\u00ba\u009e\u009e x\u00cb\u00ad \u00d7%% &\u00dc',55 \u00c0 \u00ae \u00a2 \u00dd\u00dd\u00dd -- \u00e6\u00e6\u00e7\u00e8 \u0099 \u0090 ",
- " \u00c1\u00c1 \u00e9\u00ee \u00ef\u009a \u00d1\u00f0\u00f0\u00d9 \u00e5\u00e5 \u00eb\u00e5 \u00d9\u00d9 \u00d1\u00d1 \u00b9 \u00f1\u00f1\u00ec\u00ec\u00ec \u00ed \u00bf\u00ba\u009e\u009e x\u00cb\u00ad \u00d7%% &\u00cc',55 \u00c0 \u00ae \u00a2 \u00dd\u00dd\u00dd\u00dd- \u00e6\u00f2\u00f3\u00f3\u00f3\u0099 \u0090 ",
- " \u00c1 \u00ee\u00ee\u00ef\u00ef \u009a\u00d1\u00f4\u00f0\u00d9 \u00e5 \u00e5 \u00d9\u00f5\u00f5\u00d1 \u00b9 \u00f6\u00f6\u00f1\u00f1\u00f1\u00ec\u00ec \u00ed \u00f7\u00bf\u00ba\u009e x\u00cb\u00ad \u00d7%% &\u00dc' 55 \u00c0 \u00ae \u00a2\u00a2 \u00d5\u00d5 - \u0099 \u0090 ",
- " \u00c1 \u00f8\u00ef\u00f9\u00f9\u00f9\u00f9\u009a\u00d1 \u00d9 \u00fa\u00e5 \u00e5 \u00d9\u00f5 \u00d1 \u00b9 \u00f6\u00f6\u00f1\u00f1\u00ec \u00ed \u00fb\u00f7\u00f7\u00f7\u00f7\u00f7 x\u00cb\u00ad \u00d7\u00d7%% &\u00cc' \u00fc\u00fc \u00c0 \u00ae\u00ae \u00a2\u00a2 \u00d5 - \u0099 \u00fd ",
- " \u00f8\u00f8\u00f8 \u00f9\u009a\u00d1 \u00d9\u00fa \u00e5\u00e5 \u00e5 \u00d9 \u00d1\u00b9\u00b9 \u00f6\u00f1\u00ec\u00ed\u00ed \u00fb\u00bf\u00ba\u009e\u009e\u00f7 x\u00cb\u00ad \u00d7\u00d7%% &\u00cd'\u00fc\u00fc\u00fe \u00c0 \u00ae \u00a2\u00a2 \u00d5 - \u0099 \u00fd ",
- " \u00f8 \u00ef\u00ef\u00f9\u00f9\u009a \u00d1 \u00d9 \u00e5\u00ff\u00e5\u00e5 \u00e5\u00e5 \u00d9 \u00d1\u00b9 \u00f6\u00f6 \u00bf\u00ba\u009e\u00f7 x\u00cb\u00ad\u00ad \u00d7%% &\u00cd'\u00fc\u00fc\u00fe \u00c0\u00c0 \u00ae \u00a2 \u00d5 - \u0099 \u00fd ",
- " \u00f8\u00f8 \u00ef\u00f9\u009a \u00d1\u00d1 \u0100\u00d9\u00d9\u00ff\u00ff \u0101 \u00d9 \u00b9\u00b9 \u0102 \u00ba\u00ba\u009e\u0103 x\u00cb\u00ad \u00d7%% &\u00cd,\u00fc\u00fc\u00fe\u00fe \u00c0 \u00ae \u00a2 \u0104\u0104\u0105 - \u0099 \u00fd \u0106\u0106\u0106",
- " \u00f8\u00f8 \u00ef\u00ef \u00d1\u00d1\u0107 \u00d9\u00d9\u00d9 \u0101 \u00d9\u00d9 \u00d1\u00b9 \u0108 \u0102 \u00ba\u00ba\u009e\u0109xxx\u00cb\u00ad \u00d7%% &\u00cd'\u00fc\u00fc \u00fe \u00c0 \u00ae \u00a2\u0104\u0104\u0104\u0105\u00d5 -- \u0099 \u00fd \u0106\u0106\u0106\u0106 ",
- " \u00f8 \u009a\u009a \u00d1 \u00d9\u010a\u00d9\u00d9\u00d9 \u010b \u00d1\u00b9\u00b9 \u0108\u010c \u0102 \u00bf\u00ba\u009e\u009e \u00cb\u00ad \u00d7%% &\u00cd'\u00fc\u010d\u010d\u010d \u00c0 \u00ae \u00a2\u00a2 \u0104\u00d5 - \u0099 \u00fd\u00fd \u0106\u0106\u0106\u0106 ",
- " \u00f8 \u009a\u009a \u010a\u010e\u010e \u010b \u00d1\u010f \u0110\u010c\u010c\u010c\u010c\u0111 \u0112 \u0113\u0113\u00ba\u009e\u009e \u00cb\u00cb\u00ad \u00d7\u00d7%% &\u00cd\u00fc\u00fc\u010d \u010d \u00c0\u00c0 \u00ae \u00a2 \u0104\u00d5 - \u0099\u00fd\u00fd \u0106\u0106\u0106\u0106 ",
- " \u00f8\u0114 \u009a\u009a \u010e \u00d1\u010b\u010f \u0110 \u010c\u010c\u0112 \u0113\u0115\u0115\u0115\u00ba\u00ba\u009e \u0116\u00ad \u00d7%%% &\u00dc'\u00fc\u010d \u010d \u00c0 \u00ae \u00a2 \u0104\u00d5 - \u0117\u00fd\u0106\u0106\u0106\u0106 ",
- " \u00f8\u0118\u0118\u0114\u0114 \u009a \u010e\u00b9\u00b9\u010f\u010f \u010c\u010c \u010c\u010c \u0112 \u0113\u0115\u0115\u0115\u0119\u011a\u011b\u009e\u011c\u011c \u0116 \u00ad\u00ad\u00d7%% &\u011d\u00fc \u010d \u010d \u00c0 \u00ae \u00a2 \u0104\u00d5 -- \u0117\u0117\u0106 ",
- "\u011e \u00f8 \u0118\u0118\u0114\u0114 \u009a\u009a \u011f\u00b9\u00b9\u00b9\u00b9 \u010f\u010f \u010c\u010c\u010c \u0112 \u0113\u0115\u0115\u0119\u0119\u0119\u011a\u0120\u0121\u011c\u011c\u0122\u0122\u0116 \u00d7\u00d7%% &\u00dc',\u010d \u010d\u010d \u00c0\u0123\u0123\u0123 \u00ae \u00a2 \u0104\u0104\u0124\u00d5\u00d5--\u0125\u0125\u0126 \u0117\u0117 ",
- "\u0127\u0128\u0128 \u00f8 \u0118\u0114\u0114 \u009a\u009a \u011f\u0129\u0129 \u010f \u010c\u010c \u0112\u0113\u012a\u0115\u0119\u012b\u012b\u012b\u012c\u0121\u0121\u012d\u012e\u0122\u0122\u0122\u00d7\u00d7\u00d7\u00d7%% \u00fc\u00fc\u011d', \u010d \u010d\u010d\u00c0\u00c0 \u00ae\u00ae \u00a2 \u0104\u0124 \u012f\u0130\u0131\u0126 \u0117\u0117 \u0132\u0132",
- " \u0127\u0128\u0128 \u00f8 \u0118\u0118\u0114\u0114 \u009a\u011f\u0129 \u0129 \u010f \u0112 \u012a\u012a\u012b \u012c\u012c\u0121\u0121\u0133\u012e\u012e\u0122\u0122\u00d7\u00d7\u00d7%% \u00fc\u00fc\u011d', \u010d \u010d \u0134 \u00ae\u00ae\u00ae \u00a2 \u0124 \u012f \u0131\u0131 \u0117\u0117 \u0132\u0132\u0132\u0132 ",
- " \u0127\u0128 \u00f8\u00f8 \u0118\u0118\u0114\u0114 \u011f\u0129\u0129\u0129\u0129\u010f\u010f \u0112\u0113\u012a\u012b \u012c\u012c\u0121\u0121 \u0135\u012e\u012e %% \u00fc\u00fc\u0136\u00dc', \u010d \u0134 \u00ae\u00ae\u00ae\u00ae\u00ae\u00ae\u00ae \u00a2 \u0124 \u0130 \u0126 \u0117\u0117 \u0132\u0132\u0132\u0132\u0132 \u0137",
- " \u0138 \u0127\u0128\u0128 \u0118\u0114\u0114 \u009a\u0129\u0129\u010f\u010f \u0112\u0113\u012a\u012a\u0139\u0139\u013a\u013a \u012c\u012c\u0121\u0121 \u013b \u0135\u012e %%% \u00fc\u00fc\u00fc\u013c\u013d\u00cd, \u010d \u013e\u010d \u00ae\u00ae\u00ae\u00ae\u013f\u013f\u013f \u0140 \u0141 \u0117\u0117 \u0132\u0132\u0132\u0132\u0132 \u0137\u0137\u0137\u0137 ",
- " \u0142 \u0138 \u0127\u0128\u0128 \u0118\u0118\u0114 \u0143\u0144\u0129 \u0112\u0113\u012a\u012a\u0139\u0139\u0139\u0139\u013a\u013a\u012c \u0121 \u0145\u0146\u0135\u0135\u012e\u0147%% \u00fc\u00fc\u00fc\u0136\u013c\u00dc', \u010d \u013e \u010d \u013f\u013f\u013f\u013f\u013f\u013f\u013f\u013f\u013f\u013f\u0148\u0148\u0117\u0117 \u0132\u0132\u0132\u0132 \u0137\u0137\u0137\u0137 \u0149\u0149\u0149\u0149",
- "\u00c1 \u0142 \u00f8 \u014a\u0127\u0128\u014b \u0118\u0118\u0114\u0114 \u0143\u0144\u0144 \u0112\u0112\u012a\u012a\u012b\u014c\u014c\u014d\u0139\u0139\u013a\u012c \u0121\u0146\u0146\u0145\u014e\u0135\u014f\u0150\u0150% \u00fc\u00fc\u0136\u013c \u013d\u011d' \u010d\u010d \u013e\u013e \u010d\u010d \u0151\u0151 \u0132\u0132\u0132\u0132 \u0137\u0137\u0137\u0149\u0149\u0149\u0149\u0152\u0152\u0152 ",
- "\u00c1 \u00f8\u00f8 \u014a\u0127\u0128\u014b \u0118\u0114\u0114 \u0143\u0143\u0144 \u0153\u0153 \u0112\u0113\u012a\u012b\u014c\u014c\u014d\u014d\u0139\u0139 \u012c\u0154\u0146\u0146\u0121\u0121\u0155\u0156\u0157\u0150\u0158\u0158%\u00fc\u00fc\u0136 \u013c &\u011d', \u010d \u013e\u013e \u010d\u010d \u0132\u0132\u0132 \u0137\u0137\u0137\u0137\u0149\u0149\u0152\u0149\u0152\u0152 ",
- " \u00f8\u00f8 \u0127\u0128\u0128 \u0118\u0118\u0114 \u0143\u0144 \u0153\u0159 \u015a\u0113\u012a\u012b\u014d\u014c\u014d\u014d\u0139\u015b\u015b\u015b\u012c\u0154 \u0121\u0121\u0156\u0150\u0150\u0158\u0158\u00fc\u00fc\u00fc\u0136 \u013c \u00dc\u011d', \u010d \u015c\u013e \u010d\u010d \u0137\u0137\u0137\u0137\u0149\u0149\u0149\u0149\u0152\u0152 ",
- "\u015d \u00f8 \u014a\u0127\u0128 \u0118\u0118\u0114\u0114 \u0143\u0144\u0144 \u0159\u015e \u0112\u0113\u012a\u012a\u012b \u014d\u015b\u015b\u015b\u015b\u015b\u015b\u012c \u0150\u0150\u0150\u0158\u0158\u014f\u00fc\u00fc\u0136 \u013c &\u011d\u00cd, \u010d\u015c\u015c\u013e\u013e \u013e\u013e\u013e \u0137\u0137\u0137\u0149\u0149\u0149\u0149\u0152\u0152\u0152 \u015f",
- "\u015d\u00f8 \u014a\u0160\u0161\u014b \u0118\u0118\u0114\u0114 \u0143\u0144\u0144 \u015e\u015e \u015e \u0112\u0113\u012a\u012a\u012b\u0162\u0162\u0162\u015b\u015b\u015b\u015b \u0163\u0163\u0164\u0164\u0164\u0150\u0150\u0150\u0150\u0121\u0158\u0158\u00fc\u00fc\u0136\u014f\u014f & ',, \u010d\u015c \u013e\u013e \u013e\u013e\u0165\u013e\u013e \u0137\u0137\u0137\u0149\u0149\u0149\u0149\u0152\u0152\u0152 \u015f\u0166\u0166",
- " \u015d \u0127\u0128\u0128 \u0118\u0118\u0143\u0143\u0144 \u015e\u015e \u015e\u0167 \u0112\u0113\u012a\u012b\u0162\u0162\u0162\u0162\u0164\u0164\u0164\u0164\u0164\u0164\u0163\u0164\u0164\u0164\u0150\u0150\u0150 \u0158\u0158\u0158\u00fc\u00fc\u0157 \u014f \u0168 \u011d', \u010d\u010d \u013e\u013e \u013e\u0165\u0165\u0165\u013e\u013e\u013e \u0169\u0169\u0169\u0137\u0137\u0137\u0137\u0149\u0149\u0149\u0149 \u0152\u0152\u0152 \u01 [...]
- "\u016c \u015d\u015d \u0127\u0161\u0128 \u0118\u0143\u0144 \u015e \u0167\u0167 \u0112\u0113\u012a\u012b\u0162\u0162\u0162\u016d\u016d\u016d\u016d\u016d\u016d\u016d\u016d\u0163\u016d\u0164\u0164 \u016e\u0158\u00fc\u00fc\u0136\u0156\u0157\u014f\u014f \u0168\u00dc\u011d',\u016f \u010d\u010d \u013e\u013e \u013e \u0165\u0165\u0169\u0169\u0169\u0169\u0169\u0169\u0169\u0169\u0169\u0137\u0137\u0137\u0149\u0149\u0149\u0149\u0170\u0170 \u0152\u0152 [...]
- "\u0171\u016c \u015d\u015d \u014a\u0161\u0128\u014b \u0143\u0144 \u015e \u0112\u0113\u012a\u012a\u0162\u0162\u016d\u016d\u016d\u016d\u016d\u0172\u0172\u0172\u016d\u016d\u0163\u016d\u016d\u016d \u016e\u0173\u0173\u0136\u0174\u0174\u0156\u0157\u014f \u0175\u00dc\u011d' ,\u016f \u0176\u0176\u010d\u010d \u013e\u013e\u0177 \u0169 \u0178\u0179\u0137\u0179\u0149\u0149\u0149 \u017a\u0170 \u0152\u0152 \u015f\u0166\u0166\u016a\u016b\u0 [...]
- "\u0171\u016c\u016c \u017b\u015d \u014a\u0127\u0128\u0128 \u0143\u0144\u0144 \u015e \u0112\u0113\u012a\u012a\u0162\u0162\u016d\u016d\u016d\u0172\u0172\u0172\u0172\u0172\u0172\u0172\u0172\u0163\u016d\u016d\u016d\u016d\u016d \u016e\u016e\u0173\u0173\u017c\u017d\u0174\u0174\u0157\u014f \u0168\u00dc \u011d',\u016f\u016f\u0176\u0176 \u0176\u0176\u0176\u010d \u0177\u0177\u0177 \u0169 \u0178\u0178\u0178\u0179\u017e\u0149\u0149 \u017a\u017a\u017a\u0170 \u0152 [...]
- "\u0171 \u016c\u016c\u017b \u015d \u0127\u0127\u0128 \u0143\u0143\u0144 \u015e\u015e \u0112\u0112\u0113\u012a\u0162\u0162\u016d\u016d\u0172\u0172 \u017f\u017f \u0163\u0172\u0172\u016d\u016d\u016d\u016d\u0180\u0180\u0181\u017c\u017c\u017d\u017d\u0174\u0156\u014f \u0168\u00dc \u011d',,\u016f\u0176 \u010d\u010d \u0169\u0169\u0169\u0178\u0178\u0178\u0182\u0179\u0183\u017e \u017a\u017a\u017a \u0170 \u0152 \u015f\u015f\u0166\u0184\u016a\u0 [...]
- "\u0171\u016c\u016c\u017b\u017b \u015d\u015d \u014a\u0128\u0128\u014b \u0143\u0143\u0144 \u015e\u015e \u0112\u0113\u012a\u0162\u0162\u0162\u016d\u0172\u0172 \u017f \u017f\u017f\u017f\u017f \u0186\u0186\u0172\u0187\u0187\u016d\u016d\u0180\u0180\u0181\u017c\u017c\u017d\u017d\u0174\u0174\u0157\u014f \u0175\u00dc \u011d', \u016f \u010d\u010d \u0169\u0169\u0169\u0178\u0178\u0178\u0182\u017e\u017e\u0183 \u017a\u017a\u017a \u0170\u0170 \u0152 \u015 [...]
- " \u016c\u017b\u017b \u015d\u015d \u014a\u0127\u0128\u014b\u0143\u0144 \u0188\u0189 \u0112\u0113\u012a\u012a\u0162\u0162\u016d\u0172\u0172 \u017f\u017f\u018a \u017f\u017f\u018b\u0186\u018b\u0187\u0187 \u016d\u0180\u0181\u0181\u017c\u017c \u017d\u017d\u0174\u0157\u014f \u0175\u00dc \u011d',, \u016f \u010d\u010d\u0169\u0178\u0178\u0178\u0182\u0182\u017e\u017e\u0183 \u017a\u017a \u018c\u018c\u0170 \u0152 \u015f\u0166\u0166\u016a\u016a\u016b\ [...]
- "\u016c \u017b\u018d \u015d\u015d \u0127\u014b\u014b\u0144 \u0188 \u0189 \u0113\u012a\u012a\u0162\u0162\u016d\u0172\u0172 \u017f\u017f \u018a\u018a\u018a\u018a\u018a \u018e\u0186\u018b\u0187\u0187\u0187\u0180\u0180\u0181\u0181\u017c\u017c \u017d\u017d\u0174\u0157\u014f\u018f\u0175\u00dc\u0190\u0191\u011d\u00cd', \u016f \u0192\u0178\u0178\u0182\u0179\u017e\u017e\u0183 \u017a\u017a\u017a \u018c\u018c\u018c\u0170\u0170\u0152 \u015f\u0166\u0166\ [...]
- " \u0193 \u015d\u015d \u0143\u014a\u0144 \u0194 \u0189 \u0113\u0113\u012a\u0162\u0162\u016d\u016d\u0172 \u017f\u017f \u0195\u0195 \u018a\u018a\u018a\u017f\u0186\u0186\u018b\u0187\u0187\u0180\u0180\u0181\u016d\u017c\u017c\u017c\u017d\u017d\u0174\u018f \u0175\u0196 \u0191\u0191\u011d',, \u016f \u0178\u0178 \u0182\u0179\u0197\u017e\u0183 \u017a\u017a\u017a \u018c\u018c \u0170\u0152\u0152 \u015f\u0166\u0166\u016a\u016b\u016b\u016b \u0185\ [...]
- "\u017b \u015d\u015d \u0143\u0143\u0144 \u0194\u0194\u0189\u0189 \u0113\u012a\u0162\u0162\u0162\u016d\u0172\u0198\u0198\u0198\u0195\u0195 \u0195\u0195\u0195 \u018a\u017f \u0186\u018b\u0187\u0187\u0180\u0180\u0181\u016d\u016d\u017c\u017c\u017d\u017d\u0199\u019a \u0175\u0196 \u0191\u011d\u00cd', \u016f\u016f \u0178\u0178 \u019b\u0179\u0197\u017e\u0183\u0192 \u0170\u0170\u0170\u0170\u018c\u018c\u018c \u0170 \u0152 \u015f\u0166\u0166\u016a\u016b\u0 [...]
- "\u019c \u019d\u019d\u015d \u0143\u0144 \u019e\u019e\u019e\u019e\u019e \u0113\u012a\u012a\u0162\u0162\u016d\u0172\u0198\u0198\u0198 \u0195\u0195\u0195\u0195 \u0186\u018b\u018b\u0187\u019f\u01a0\u01a0\u016d\u016d\u017c\u017c\u017d\u017d\u0199\u019a \u0175\u00dc \u0191 \u011d',, \u016f \u0178\u0178 \u0182\u0179\u017e\u017e\u0183\u0183 \u01a1\u01a1 \u0170\u0170\u0170\u0170\u01a2\u01a2\u0170\u0170\u0152 \u015f\u0166\u0166\u01a3\u016a\u016b\u016b [...]
- " \u019d \u015d \u0143\u0144\u0144 \u019e\u019e\u01a4\u01a4\u01a4\u01a4 \u0113\u012a\u012a\u0162\u0162\u016d\u016d\u0198\u0198\u0198 \u0195 \u0186\u0186\u018b\u0187\u019f\u01a0\u01a0\u016d\u016d\u017c\u017c\u017d\u017d\u0199\u019a \u0175 \u0196 \u01a5\u011d\u00cd',\u01a6\u0178\u0178 \u0182\u0179\u017e\u017e\u0183\u0183 \u01a2\u01a2 \u0152\u0152 \u015f\u0166\u0166\u01a3\u016a\u016b\u016b \u0185\u0185 ",
- " \u01a7 \u019d \u015d\u015d\u0143\u0144\u0144 \u01a4\u01a4\u01a4\u01a4\u01a4\u01a4\u01a4\u01a4 \u0113\u012a\u012a\u0162\u0162\u016d\u016d\u0198\u0198\u0198 \u01a8\u01a8\u01a9\u01a9\u01a9\u01a9 \u01aa\u01aa\u0186\u018b\u0187\u019f\u01a0\u01a0\u016d\u016d\u017c\u017c\u017d\u0199\u0199 \u0175 \u0196 \u011d\u01ab\u01a6\u01a6 \u0182\u0179\u017e\u017e \u0183\u0183 \u01a2\u01a2 \u0152 \u015f\u0166\u0166\u01a3\u016b\u016b\u016b \u0185\u0185 [...]
- " \u01a7\u01a7\u01ac\u01ac\u01ac \u015d\u0143\u0144 \u01a4\u01a4\u01a4 \u01a4\u01a4 \u0113\u012a\u0162\u0162\u0162\u016d\u0198\u0198\u0198 \u01a9\u01ad\u01a9 \u01a9\u01a9\u01a9 \u01ae\u01ae\u01af\u01af\u0186\u0186\u0187\u019f\u01a0\u01a0\u016d\u016d\u017c\u017c\u017d\u0199\u019a \u0175 \u0196\u00dc \u01b0\u0178\u01ab\u01a6\u0182\u017e\u017e \u0183\u0183 \u01a2\u01a2 \u0152 \u015f\u0166\u0166\u01b1\u01b1\u016b\u016b \u0185\u0185\u0185 [...]
- "\u01b2\u01b3 \u019d\u019d\u01ac \u01ac\u01ac\u01ac \u015d\u015d\u01b4\u01b5 \u019e\u01a4\u01a4\u01b6\u01b6\u01b6\u01b6 \u01a4\u01a4\u012a\u012a\u0162\u0162\u01b7\u0198\u0198 \u01b8\u01a9 \u01ad\u01ad \u01a9\u01ae\u01ae \u01af\u0186\u0186\u0187\u019f\u01a0\u01a0\u016d\u016d\u017c\u017c\u017d\u0199 \u0175\u0175 \u0196\u00dc \u0178\u0178\u01b0\u01b9\u0182\u01a6\u01a6 \u0183\u0183 \u01a2\u01a2\u01a2\u01a2\u01a2 \u01ba\u0152\u015f\u015f\u0166\u01b1\u016a\u01 [...]
- "\u01b3\u01b2\u01b2 \u01bb\u01bb \u01ac \u01bc\u01bd\u01b4\u019e\u01a4\u01a4\u01b6\u01b6 \u01b6 \u01be\u0113\u012a\u012a\u01bf\u0162\u01c0\u01b7\u01b7 \u01a9\u01b8\u01b8\u01b8 \u01ad\u01ad \u01a9 \u01af\u0186\u0187\u019f\u01a0\u01a0\u016d\u016d\u017c\u017c\u0199\u0199 \u0175 \u01c1\u01c2\u01c3\u0178 \u0182\u0182\u017e\u01b0\u01ab\u01a6\u0183\u0183 \u01a2\u01a2\u01a2\u01a2 \u01a2\u01a2\u01a2 \u01ba\u0166\u0166\u01b1\u01b1\u016b \u0185\u0185 [...]
- "\u016c\u016c\u01c4\u01b2 \u01c5 \u01c6\u01ac \u01c7\u01c8\u01c9\u01a4\u01a4 \u01b6 \u01ca \u01cb\u01cc\u0113\u012a\u012a\u012b\u01bf\u01bf\u01c0\u01b7 \u01cd\u01cd \u01b8\u01b8 \u01ad\u01ad\u01ad\u01a9 \u01af\u0186\u0186\u019f\u019f\u01a0\u01a0\u016d\u017c\u017d\u0199\u019a \u0175\u0175 \u01c3\u01c2\u01c2\u01ce\u0182\u017e\u017e\u01b0\u01b9\u01ab\u01a6\u01a6 \u01a2\u01a2 \u01a2\u01a2\u0166\u0166\u0166\u016a\u01b1\u016b \u0185\u0185 [...]
- " \u016c\u016c \u01cf\u01c5 \u019d\u01c6\u01c6 \u01c7\u01d0\u01a4\u01d1\u01b6 \u01ca \u01ca\u01cb \u0113\u012a\u012b\u01bf\u01bf\u01c0\u01b7\u01b7 \u01d2\u01a9 \u01cd\u01cd \u01b8\u01b8 \u01ad\u01ad \u01af \u0186\u0187\u019f\u01a0\u01a0\u01d3\u01d3 \u0199 \u0175\u0175 \u01c3\u01c3\u01d4\u01c2\u01d5\u01d6\u017e \u0183\u0183\u01b0\u01d7\u01ab\u01d8 \u01a2\u01a2 \u01a2\u015f\u015f\u0166\u0166\u0184\u016b\u016b \u0185\u0185 ",
- " \u016c \u01cf\u01cf\u019d\u019d\u01ac\u01ac \u01c7\u01d0 \u01d1\u01d1\u01d1\u01ca \u0113\u012a\u012b\u01bf\u01bf\u01c0\u01b7\u01b7\u01d9\u01d9\u01a9\u01a9\u01d2\u01d2 \u01cd\u01cd \u01b8\u01b8 \u01a9 \u01af \u0186\u0186\u019f\u01a0\u01d3\u01d3\u016d\u0199\u01da\u0175\u0175\u01c3\u01c3\u01d4\u01d5\u01d5\u01c2\u01d6 \u0183\u0183\u0183 \u01d7\u01db\u01d8\u01d8\u01a2\u01a2\u01a2\u01a2\u01a2 \u01a2\u015f\u01dc\u0166\u0166\u016a\u016b\u016b \u01dd\u01d [...]
- " \u016c \u01c5\u01de\u019d \u01ac \u01c7\u01d0\u01df\u01e0\u01df\u01d1\u01d1\u01d1 \u0113\u012a\u012a\u01bf\u01bf\u01bf\u01b7\u01b7 \u01d9\u01e1\u01e1 \u01d2\u01d2 \u01cd\u01cd \u01b8\u01b8\u01a9 \u01af \u0186\u019f\u01d3\u01d3\u016d\u016d\u01da\u01da\u0175\u01c3\u01d4\u01e2\u01d5\u01d5\u01e3\u01c2\u0183\u0183\u0183 \u01d7\u01db\u01d8\u01a2 \u01a2\u01dc\u0166\u0166\u0166\u01e4\u016b\u016b\u01ba \u01dd\u01dd \u01e5 ",
- "\u01e6 \u016c \u01c5 \u01de\u01ac \u01c7\u01d0\u01df\u01e0\u01e7\u01df\u01df\u01d1\u01d1 \u0113\u012a\u012a\u012b\u01bf\u01bf\u01c0\u01e8 \u01e9 \u01ea\u01d9\u01e1\u01e1 \u01d2\u01d2 \u01cd\u01cd\u01a9\u01a9 \u01af \u01d3\u01d3\u01d3\u01a0\u01eb\u01eb\u0175\u01c3\u01ec\u01e2\u01ed\u01ee\u01ef\u01f0\u0183\u01c1\u0183 \u01d7\u01f1\u01db\u01d8\u01a2 \u01a2\u015f\u0166\u0166\u016a\u01e4\u01e4\u016b \u01f2 \u01f3\u01f3 \u01dd\u01dd\u01dd \u01e5 [...]
- "\u01e6\u01e6\u016c \u01c5 \u01ac\u01ac\u01ac \u01f4\u01f4\u01df\u01e0 \u01e7\u01f5\u01df\u01df\u01d1\u01d1\u012a\u012a\u012b\u01bf\u01bf\u01c0\u01e8\u01e8\u01f6\u01e9\u01e9\u01ea\u01d9\u01d9 \u01e1\u01e1 \u01d2\u01d2\u01a9\u01a9\u01cd\u01a9 \u01af\u01f7\u01f7\u01d3\u01d3\u01f8\u01f9\u0175\u01c3\u01ec\u01da\u01ed\u01ee\u01e3\u01f0\u0183\u0183\u0183\u01c2\u01c2 \u01f1\u01db\u01d8\u01d8 \u01a2\u015f\u0166\u0166\u016a\u016b\u016b\u016b \u01f2 \u01fa\u01f3\u01f [...]
- " \u01e6\u01e6 \u01c5\u01fc \u01ac \u01c7\u01f4\u01df\u01e0\u01e7\u01e7\u01f5\u01fd \u01df\u01d1\u012a\u012b\u01bf\u01bf\u01c0\u01e8\u01e8 \u01f6\u01ea\u01e9 \u01e8\u01d9 \u01a9\u01a9\u01e1\u01a9\u01a9\u01a9 \u01f7\u01f7\u01f7\u01f7\u01f7\u01fe\u0175\u01c3\u01ec\u01f9\u01da\u01da\u01f0\u01ef\u0183\u0183\u0183 \u01ff \u01d7\u01d7\u01db\u01d8\u01a2 \u01a2\u01a2\u015f\u0166\u0166\u016a\u016b\u016b \u01f2 \u01fa\u01fa\u01fb\u01fb\u01f3 \u01e5 [...]
- " \u01e6\u01e6 \u0200\u01fc\u01fc \u01ac \u01c7\u01c7\u01d0 \u0201\u01e7\u01f5\u01f5\u01fd\u01df \u012a\u012b\u01bf\u01bf\u01bf\u0172\u01e8\u01e8\u01e8 \u01f6\u01e8\u01e8\u01e8\u01d9\u01e8 \u0202\u0202\u01f7\u01f7\u01f7\u01f7 \u0175\u01c3\u01fe\u01ec\u01d5\u01d5\u01f0\u01da\u01ef\u0183\u0183 \u01ff\u0203 \u01d7\u01f1\u01db\u01d8\u0204\u015f\u0166\u0166\u016a\u016b\u016b \u01f2 \u01fa\u01fa \u01e5 ",
- "\u0175 \u01e6\u01e6\u01e6 \u01fc\u01ac \u01c7\u01d0 \u0201 \u0205\u0206\u0207\u01df\u01df\u012a\u012a\u01bf\u01bf\u01bf\u0172\u0172 \u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01d9\u01d9 \u0202\u0202\u0202\u0202\u0202\u0208\u0208\u0208\u0208\u01f7 \u0175\u0175\u01c3\u01ec\u01d5\u01d5\u01e3\u01f9\u01ef\u01ef\u0183 \u0209\u0209 \u01ff\u0203 \u01d7\u01f1\u01db\u020a\u020b\u016a\u016b\u016b \u01f2 \u01dd\u01dd \u01e5 ",
- "\u0175\u0175 \u020c\u01e6\u01e6\u01e6 \u01fc\u01fc\u01fc \u01c7\u01d0\u0201\u0201\u0205 \u0206\u020d\u01df\u012a\u012a\u012b\u01bf\u01bf\u01c0\u0172 \u01e8\u01e8\u01e8\u01e8\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0208\u0208\u0208\u0208\u0208\u0208\u0208 \u0175\u0175\u01c3\u01ec\u01d5\u01d5\u01fe\u01e3\u01f8\u01ef\u01f9\u01da\u020e \u0209\u0209\u020f \u01ff\u0203 \u0210\u0211\u020a\u020b\u0212\u0212\u016b \u01f2\u01dd \ [...]
- "\u01c3\u0175\u0175 \u0213\u0214\u01e6\u01e6\u0215\u0215 \u01fc\u01fc\u01fc \u01c7\u01d0\u0201\u0201\u0205 \u0206 \u020d\u012a\u012a\u012b\u01bf\u01bf\u01bf\u0172 \u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0216\u0202\u0202\u0202\u0202\u0202\u0202\u0208\u0208\u0208\u0208\u0208\u0208\u0208 \u0175\u0175\u01c3\u01ec\u01d5\u0179\u0179\u01e3 \u01fe\u01f8\u01f8\u0217\u0218\u020e\u0209\u0209 \u020f \u01ff\u0203 \u0210\u0210\u0211\u0219\u021a\u0212\u0212\u01db\u01d8 \u01f [...]
- "\u021b\u021b\u01c3\u0175\u0213 \u0214\u0214\u021c\u0215\u0215\u0215\u0215 \u01fc\u01fc\u01fc\u01c7\u01d0\u0201\u0205\u0205\u0206 \u020d \u012a\u012b\u01bf\u01bf\u01bf\u0172 \u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u0202\u021d\u0216\u0216 \u0208\u0208\u0208\u0208\u0208 \u0175\u0175\u01c3\u01ec\u01d5\u0179\u0179\u01e3 \u0183\u0183\u01fe\u021e\u021f\u021f\u0217\u020e\u020e \u01ff\u0203 \u0210\u0211\u0211\u0220\u0219\u0221\u0221\u0212\u01d7\u01f1\u01db\u01d8 [...]
- "\u0223\u021b\u021b\u01c3\u0175\u0175 \u0214\u0214 \u021c\u0215\u0215\u0215\u0215 \u01c7\u01fc\u020d\u020d\u0205\u0206\u0206\u020d \u012a\u012a\u01bf\u01bf\u01bf\u0172\u0202\u0202\u0202\u0202\u0202\u0224\u0225\u0225\u0226\u021d\u021d\u021d\u0216\u0216 \u0208\u0208\u0208\u0208\u0208 \u0175\u0175\u01c3\u01ec\u0227\u0179\u01d5\u01e3 \u0183\u0183 \u021e\u021f\u021f\u0217\u0217\u020e\u019a \u01ff\u0203 \u0210\u0211\u0211\u0220\u0221\u0221\u0221\u0228\u0228\u0228 \u01f1\u01f1\u01db [...]
- "\u022a\u0223\u021b\u0213\u0213\u0175\u0175 \u0214\u0214\u022b\u021c\u021c\u0215\u0215\u0215\u0215 \u020d\u0206\u020d \u012a\u012a\u012b\u01bf\u01bf\u01c0\u0202\u0202\u0202\u0202\u0202\u022c\u0224 \u021d\u021d\u021d\u022d\u022e \u0216\u0216\u0208\u0208\u0208 \u0175\u01c3\u01c3\u01ec\u0227\u01d5\u0179\u01e3 \u0183\u0183 \u021e\u021e\u021f\u021f\u0217\u020e\u020e \u01ff\u0203 \u0210\u0211\u0211\u0220\u0221\u0221\u0221 \u022f \u0228 \u01d7\u01f1\u01db\u01d8 \u01f2 \u0 [...]
- " \u022a\u022a\u0223\u021b\u0213\u01c3\u0175\u0175 \u0231 \u021c\u021c\u0215\u0215\u0215\u0215 \u020d\u012a\u012a\u012b\u01bf\u01bf\u01bf\u0202\u0202\u0202\u0232\u0233\u0233\u022c\u021d\u021d\u0225\u0225\u0226 \u022d\u022e \u0216\u0216\u0208 \u0175\u01c3\u01c3\u01ec\u01ec\u01d5\u0179\u01e3\u01e3\u0183\u0183 \u021e\u021f\u021f\u0217\u0217\u020e\u019a \u01ff\u0234\u0211\u0211\u0220\u0221\u0221\u0221 \u0235\u022f \u0228 \u01f1\u01f1\u01db\u01d8 \u01f2 \u0229 [...]
- "\u0236\u0236 \u022a\u0223\u021b\u021b \u01c3\u0175\u0231\u0231 \u021c\u021c\u0215\u0215\u0215\u0215\u012a\u012b\u01bf\u01bf\u01bf\u0202\u0202\u0202 \u0232 \u021d\u021d\u022c\u0224 \u0225\u0226\u0226\u022d\u022e\u0237 \u0175\u01c3\u01c3\u01ec\u01ec\u01d5\u01d5\u0179\u01e3\u0183\u0183 \u021e\u021e\u021f\u021f\u0217\u020e\u020e\u0238\u0239\u0239\u023a\u023a\u0220\u0221\u0221\u0221 \u023b \u0235 \u022f \u023c\u023c\u0228 \u01d7\u01f1\u01db\u01d8 \u01f2 \u0229 [...]
- " \u0236\u0236 \u022a\u0223\u021b\u021b\u0231\u01c3\u0175\u0175\u0175 \u021c\u021c\u021c\u0215\u0215\u01bf\u01bf\u01bf\u0202\u0202\u0202 \u023d\u021d\u021d\u0233 \u022c \u0224\u0225 \u0226\u0237 \u0175\u01c3\u01c3\u01ec\u01ec\u01d5\u01d5\u01e3\u01e3\u0183\u0183 \u023e\u021e\u021f\u021f\u0217\u0217\u0238\u0238\u023f\u0240\u0241\u0242\u0221\u0221 \u023b\u023b \u0235 \u0243\u022f\u023c \u0228\u0228 \u01f1\u01f1\u01db\u01d8 \u01f2 \u0229 \u01e5 [...]
- " \u0236\u0236 \u022a\u0223\u021b\u021b \u01c3\u01c3\u0175\u0175 \u021c\u012a \u0244\u0244\u0202\u0202\u0202 \u023d\u0232 \u0233\u022c\u022c\u0224\u0237\u0225 \u0175\u0175\u01c3\u01ec\u01ec \u01e3\u01e3\u01e3\u0183\u0183 \u023e\u023e\u023e \u021e\u0238\u021f\u0238\u0238\u023f\u023f\u023f\u0245\u0246\u0247 \u023b\u023b \u0235 \u0248\u0243\u0243 \u0228 \u01d7\u01f1\u01db\u01d8 \u01f2 \u0229 \u01e5 ",
- "\u0249\u0249\u0249\u0249\u0249\u0236\u0236 \u0231\u0223\u021b\u021b\u021b\u01c3\u01c3\u0175\u0175\u0175 \u024a \u0244\u0244\u0172\u0202\u0202 \u023d \u0232\u0233 \u022c\u0237 \u0175\u0175\u01c3\u01ec\u01ec\u01ec\u01e3\u01e3\u01e3\u0183\u0183 \u023e\u023e\u024b \u024c\u024c\u0238\u0238\u023f\u023f\u023f\u024d\u024d\u024e\u0203 \u023b\u023b \u0248 \u024f\u024f \u0250\u0251 \u01d7\u01f1\u01db\u01d8 \u01f2 \u0229 \u01e5 ",
- " \u0236\u0236\u0252 \u022a\u022a\u0223\u021b\u021b\u021b\u01c3\u0175\u0175\u0175\u0253\u0254\u0244\u0244\u0202\u0202 \u023d\u0232\u0237\u0233 \u0175\u0175\u01c3\u01ec\u01ec\u01ec\u01e3\u01e3 \u0183\u0183\u0183 \u0255\u0255\u0255\u0255\u0255\u0256\u0256\u024c \u023f\u023f\u0257\u024d\u024d\u0258\u020e\u01ff\u0203 \u023b \u0235 \u0259\u0250 \u0251 \u01d7\u01f1\u01db\u01d8 \u01f2\u01f2 \u0229 \u01e5 ",
- "\u025a \u025b\u025b\u025b \u025c\u025d\u025d\u025d \u022a\u022a\u0223\u0223\u021b\u0253\u01c3\u0175\u0254\u025e\u025e\u025f\u0202 \u0260\u0260 \u023d\u0237 \u0175\u0175\u01c3\u01ec\u01ec\u01ec\u01e3\u01e3 \u0183\u0183\u0183 \u0255\u0255\u0255\u0255\u0255\u0255 \u024b\u024b\u0256 \u0223\u0223\u0261\u024d\u0262\u0258\u0258\u0217\u020e\u0263\u0264\u023b \u0259\u0259\u0259\u0259\u0259\u024f \u0251 \u01d7\u01f1\u01db\u01d8 \u01f2 \u0229\u0229 \u01e5 [...]
- "\u025a\u025a\u025b\u025b\u025b \u025c\u0265 \u025d\u025d\u025d \u022a\u022a\u0223\u0223\u0254\u021b\u021b\u01c3\u0175 \u0260\u0260\u0260\u0260 \u0175\u0175\u0175\u01c3\u01ec\u01ec\u01ec\u01e3\u01e3 \u0183\u0183\u0183 \u0255\u0255\u0255\u0255 \u024b\u0223\u0223\u0223\u0266\u0267\u0268\u0262\u0262\u0258\u021f\u0217\u0269\u0263\u020e\u026a \u024f \u0251\u0251 \u01f1 \u01d8\u01d8 \u01f2 \u0229\u0229 \u01e5 ",
- " \u026b\u025a \u025c\u026c \u026d\u026e \u0253\u0253\u0254\u025e\u022a\u022a\u0223\u0183\u01c3\u0175\u0175\u01c3\u0175\u0175\u0175\u0175\u01c3\u0175\u01c3\u01c3\u01ec\u01ec\u01e3\u01e3\u01e3 \u0183\u0183\u0183 \u0255\u0255\u0255\u0255 \u0223\u0223\u0223\u0223\u0266\u0266\u026f\u0267\u0270\u0271\u0258\u021e\u021f\u021f\u0217\u0263\u0264\u020e\u026a\u026a\u026a\u026a \u0272\u0272\u0272\u0272\u0272 \u0273 \u0251\u0251 \u01d7\u01d7 \u01d8\u01d8\u01f2\u01f2 \u0 [...]
- "\u026b \u025a\u025a \u0265\u0265\u026c \u0274 \u0275\u0275\u0254\u025e\u025e\u025e\u025f\u022a\u022a\u0223\u0223\u0183\u0183\u0183 \u01ec\u01ec\u0276\u01e3\u01e3\u0183\u0183\u0183 \u0255\u0255\u0255 \u0223\u0223\u0223\u0223\u0266\u0266\u0266\u0266\u0277\u0277\u0267\u0278\u0271\u0279 \u021e\u021e\u021f\u021f\u0263\u0264\u020e\u020e\u026a \u0272\u0272\u0272\u0272\u0272 \u0272\u0272\u0272\u0272\u0272\u0272 \u0251\u0251 \u01d7\u01f1 \u01d8 \u01f2 \u0229 \ [...]
- "\u026b \u025a\u025a \u0265 \u026c \u0274 \u0275\u0275\u027a\u027a\u025e\u025e\u025f\u025f \u022a\u022a\u0223\u0183\u0183\u0183\u0183\u0183\u0183\u0183\u0183\u0183\u0183\u027b\u027b\u027b\u0255\u0255 \u0223\u0223\u0223\u0223\u0223\u0223\u022a\u0266\u0266\u0266 \u0277\u027c\u0267\u0270\u027d\u0271\u027e \u027f\u021e\u021e\u021f\u0264\u0217\u0269\u020e\u020e \u0272\u0272\u0272 \u0280\u0280\u0280\u0280\u0280\u0280\u0280\u0280\u0280 \u0273 \u0272\u0272\u0272 \u01d7\u01d7 [...]
- " \u025a\u025a\u0265 \u026c \u0274 \u0275\u0275\u027a\u027a\u0282\u0282\u025f\u025f\u0283 \u0284\u0285\u022a\u022a\u0223\u0223\u0223\u0223\u0223\u027b\u027b\u0223\u0223\u0223\u0223\u0223\u0223\u0223\u0223\u0223\u022a\u0266\u0266\u0266\u0266\u0266\u0266 \u0286\u0286\u0277\u027c\u027c\u0270\u027d\u027e\u0287\u0279 \u027f \u021e\u0263\u0264\u0217\u0217\u0269\u0288\u0272\u0289\u028a\u028b\u028b\u0280 \u0280\u0280\u0280\u0280 \u0272\u0272 \u01d7\u01f1\u01db\u01d8\u [...]
- " \u028c\u025a \u026c \u0274 \u0275\u027a\u027a\u0282\u0282\u028d\u028d \u0283 \u0284\u0284\u028e\u028e\u028e \u028f\u028f\u027b\u027b\u027b\u022a\u022a\u0266\u0266\u0266\u0266\u0266\u0266\u0266\u0266 \u0286\u0290\u0291\u0277\u027c\u0267\u0278\u027d\u027e\u0287\u0279 \u027f \u0263\u0264\u021f\u021f\u0288\u0292\u0292\u0289\u0293 \u028b \u0280\u0280\u0280 \u0272\u0272 \u01d7\u01f1\u01db\u01d8\u01f2 \u0229\u0229 \u01e5 \u0281\u0281\ [...]
- " \u028c \u025a\u025a \u0274 \u0275\u0275\u027a\u0282\u0282\u0282\u028d \u0283 \u0284\u0284\u028e\u028e \u028f\u028f\u028f \u0266\u0266\u0266\u0266\u0266\u0266 \u0286\u0290\u0290\u0290\u0291\u027c\u0270\u0270\u027d\u027e\u0287\u0279\u027f\u027f \u0263\u0264\u021e\u0292\u0292\u0289\u0289\u020e\u020e\u0295\u0296 \u0280\u0280\u0280 \u0272 \u01f1\u01f1\u01db\u01f2\u01f2 \u0229\u0229\u01e5\u01e5 \u0281\u0281\u0281\u0281\u0281\u0281\ [...]
- " \u028c\u028c \u025a\u025a \u0275\u0275\u027a\u0282\u0282\u0282\u028d \u0283\u0284\u0284\u028e\u028e \u028f\u0266\u0266\u0266\u0266\u0266 \u0286\u0290\u0290\u0290\u0291\u027c\u027c\u0267\u0278\u027d\u027e\u0287\u0279\u027f\u027f \u0297\u0298\u0288\u0292\u0292\u0289\u021f\u0217\u0269\u020e\u0295\u0296 \u0280\u0280 \u0272\u0272\u01d7\u01f1\u01db\u01f2 \u0229\u0229 \u0281\u0281\u0281\u0281\u0281\u0281\u0294\u0294\u0294\u0294\ [...]
- " \u028c\u028c \u0299\u0299\u025a\u0275\u0275\u027a\u027a\u0282\u0282\u028d\u028d \u0284\u028e\u028e \u028f\u028f\u0266\u0266\u0266 \u0290\u0290\u0291\u0291\u027c\u027c\u029a\u0271\u027d\u0287\u0287 \u027f\u027f \u0297\u0298\u029b\u029b\u0289\u0289\u021f\u021f\u021f\u0217\u020e\u020e\u0295\u0296\u0296\u0296\u0296 \u0280 \u0272\u0272\u01d7 \u01db\u01f2 \u01e5 \u0281\u0281\u029c\u0281\u0281\u0281\u0294\u0294\u0294\u0294\u0294\u02 [...]
- " \u028c \u0299\u0299 \u029d\u029d\u027a\u027a\u0282\u0282\u029e\u029e \u0284\u0284\u028e\u029f \u028f\u0266\u0266\u0266 \u02a0\u02a1\u0291\u0291\u027c\u027c\u0270\u0271\u027d\u0287\u0287 \u027f\u027f \u0297\u029b\u029b\u0289\u02a2\u02a3\u021e\u021f\u021f\u021f\u0217\u020e \u0296\u0296\u0296\u0296\u0296\u0296\u0296 \u0280\u0280 \u0272\u01d7\u01d7\u01db\u02a4\u01f2 \u01e5\u01e5 \u02a5\u02a5\u02a5\u02a5\u0281\u0294\u0294\u0294\u0294\u02 [...]
- " \u028c \u0299\u0299 \u029d\u027a\u027a\u0282\u0282\u029e\u029e \u0284\u0284\u028e \u02a6\u02a7\u0266\u0266 \u02a0\u02a1\u0291 \u027c\u0267\u029a\u0271\u027d\u0287\u0287 \u027f \u0297\u029b\u029b\u02a8 \u02a3\u02a3\u021e\u021e\u021f\u021f\u0217\u0217\u020e \u02a9 \u0296\u0296\u0296\u0296\u0296\u0296\u0296 \u0280\u0280 \u0272\u01d7\u01db\u01f2\u01f2 \u02aa\u02a5\u02a5\u02a5\u02ab\u02ab\u02ab\u02ac\u02ac\u0294 ",
- " \u028c \u0299\u029d\u029d\u027a\u0282\u0282\u0282\u029e \u0284\u0284\u028e \u02ad\u02ae\u02ae\u02ae \u02a0\u02a1\u0291 \u027c\u0267\u0270\u0271\u027e\u0287\u0279\u027f\u027f \u0297\u029b\u029b \u02af\u02a3 \u021e\u02b0\u021f\u021f\u0217\u020e \u02a9 \u02b1\u0296\u0296\u0296\u0296\u0296\u0296\u0280\u0280 \u01d7\u01f1\u01db\u02a4 \u02aa\u02aa\u02aa\u02aa\u02ab\u02ab\u02ab\u02ab\u02ab\u02b2\u02b2 ",
- "\u028c\u028c \u029d\u029d\u027a\u027a\u0282\u0282\u029e \u0284\u028e \u02b3\u02b3 \u02ae\u02a6 \u02a1\u0291\u0291\u02a6\u027c\u0270\u0278\u0271\u027e\u0287\u0279\u027f\u027f \u0297\u029b \u02af\u02af \u021e\u021e\u021f\u021f\u0217\u0217\u020e \u02a9 \u02b1 \u0280\u0280 \u0272\u02b4\u02b5\u02b6\u01f2\u02b7\u02b7\u02aa\u02ab\u02ab\u02ab \u02b2\u02b2 ",
- "\u028c \u029d\u029d\u027a\u027a\u0282\u0282\u029e\u02b8 \u02b9\u02ba \u02ad\u02b3\u02b3 \u02a6 \u02a0\u02a1\u0291\u0291\u027c\u027c\u0267\u0270\u027d\u027e\u0287\u0279\u027f\u027f \u0297\u0297\u029b \u02af\u02af\u02a3 \u021e\u021e\u021f\u021f\u0217\u020e\u02bb \u02a9 \u02b1 \u0280 \u0272\u02b4\u02b5\u02bc\u02bc\u02bc\u02bd \u02b2\u02b2\u02b2\u02b2 ",
- " \u029d\u027a\u027a\u0282\u0282\u029e\u02b8\u02b8 \u02b9\u02ba \u02ad\u02ad \u02be\u02a6 \u02a0\u02a1\u0291\u0291\u027c\u0267\u0270\u0278\u027d\u0287\u0287\u0279\u027f\u027f \u0297\u0297\u029b \u02af\u02af \u02a3 \u02b0\u021e\u021f\u021f\u0217\u0217\u02bf \u02a9\u02a9 \u02b1 \u0280 \u02b7\u02b7\u0272\u02b4\u02bc\u01d8\u01d8\u02c0\u02c0 \u02b2\u02b2\u02b2\u02b2\u02b2 ",
- " \u029d\u029d\u027a\u0282\u0282\u029e\u02b8\u02b8 \u02b9\u02b9 \u02b3\u02b3 \u02be\u02be \u02a6 \u02a0\u02a1\u0291\u02a6\u027c\u027c\u029a\u0278\u027d\u0287\u0287 \u027f \u0297\u0297\u029b \u02af\u02af \u02a3 \u021e\u02c1\u021f\u021f\u0217\u02bf\u02bb \u02a9 \u02b1 \u02c2\u02b7\u02bc\u02bc\u0272\u02b4\u02b6\u01d8\u01d8 \u02b2\u02b2\u02b2\u02b2\u02b2 ",
- " \u029d\u029d\u027a\u0282\u0282\u0282\u029e\u02b8 \u02c3\u02c4 \u02ad\u02b3 \u02be\u02be \u02a6 \u02a0\u02a1\u0291\u02a6\u027c\u0267\u0270\u0271\u027d\u0287\u0287\u027f\u027f \u0297\u029b\u029b \u02af\u02af \u02a3 \u02c1\u021f\u021f\u0217\u0217\u02bb \u02a9 \u02b1 \u02c2\u02c2\u02c2\u02c5\u02bc \u0272\u02b4\u02b6\u01d8\u01d8 \u02c6\u02c7 \u02b2\u02b2\u02b2\u02b2\u02b2 ",
- " \u029d\u029d\u027a\u0282\u0282\u0282\u029e\u02b8 \u02c4 \u02ad\u02b3 \u02be\u02be \u02a6\u02a6 \u02a0\u02a1\u0291\u02a6\u027c\u0270\u0270\u0271\u027e\u0287\u0279\u027f\u027f \u0297\u0297\u029b \u02af\u02af \u02a3\u02a3 \u02c1\u02c1\u021f\u021f\u0217\u02bf \u02a9 \u02b1 \u02c2\u02c2\u02c5\u02c5 \u02b4\u02b5\u02b6\u01d8\u01d8 \u02c7\u02c7 \u02b2\u02b2\u02b2\u02b2 ",
- " \u029d\u027a\u027a\u0282\u0282\u029e\u02b8 \u02c3\u02c4\u02ad\u02b3 \u02be \u02a6\u02a6 \u02c8\u02c8 \u02a0\u02a1\u0291\u0291\u027c\u027c\u0267\u029a\u027d\u027e\u0287\u0279\u027f\u027f \u0297\u0297\u029b \u02af\u02af \u02a3 \u02c1\u021f\u021f\u0217\u02bf \u02a9 \u02b1 \u02c2\u02c2\u02c2\u02c5\u02c5 \u02b4\u02b4\u02b6\u01d8\u01d8 \u02c7 \u02b2\u02b2\u02b2\u02b2 ",
- " \u029d\u029d\u027a\u0282\u0282\u029e\u02b8\u02b8 \u02c3\u02c4\u02ad\u02b3 \u02be \u02a6\u02c8\u02c8 \u02a0\u02a1\u0291\u0291\u027c\u0267\u0270\u0278\u027d\u027e\u0287\u0279\u027f\u027f \u0297\u029b\u029b \u02af\u02af \u02c9\u02c9\u02c9\u02c9\u02c9 \u02c1\u021f\u021f\u0217 \u02a9 \u02b1 \u02c2\u02c2\u02c2\u02c5\u02c5 \u0272\u02b5\u02b6\u01d8 \u02c7 \u02b2\u02b2\u02b2\u02b2",
- "\u02ca\u02ca \u029d\u029d\u027a\u0282\u0282\u029e\u029e\u02b8 \u02c3\u02c4\u02ad\u02b3 \u02be \u02a6 \u02a0\u02a1\u0291\u0291\u027c\u027c\u0267\u0278\u027d\u027e\u0287\u0279\u027f \u0297\u029b \u02af \u02c9\u02c9 \u02c9\u02c9 \u02c1\u021f\u021f\u0217\u02bb \u02a9\u02a9\u02a9\u02a9\u02a9\u02a9\u02a9 \u02b1 \u02c2\u02c2\u02cb\u02c5\u02cc \u0272\u02b4\u02b6\u02b6\u01d8 \u02c7 \u02b2",
- " \u02ca\u029d\u029d\u027a\u0282\u0282\u0282\u029e\u02b8 \u02c4 \u02b3 \u02be\u02be \u02a6\u02a6 \u02a0\u02a1\u0291\u02a6\u027c\u0267\u029a\u0271\u027d\u0287\u0287\u0279\u027f \u0297\u0297\u029b \u02af\u02cd \u02c9\u02c9\u02c9 \u02c9 \u02c1\u021f\u02bf\u02bf \u02a9\u02a9\u02a9\u02a9\u02a9\u02c2\u02c2\u02c2\u02cb\u02cb \u02cc\u02cc \u0272\u02b5\u02b5 \u01d8 \u02c7 ",
- " \u029d\u029d\u027a\u027a\u0282\u0282\u029e\u02b8 \u02c3\u02c4\u02b3\u02b3 \u02be\u02be \u02a6\u02a6\u02a6\u02a0\u02a1\u0291\u02a6\u027c\u0267\u0270\u0271\u027e\u0287\u0287\u027f\u027f \u0297\u0297 \u02ce\u02ce \u02cf\u02cf\u02c9\u02c9 \u02c9 \u02c1\u02c1\u02bf\u02d0 \u02d1\u02d1\u02c2\u02cb\u02cb \u02d2\u02cc\u02d3\u02d3 \u0272\u02b4\u02b6 \u01d8 \u02c7\u02c7 ",
- " \u029d\u029d\u027a\u0282\u0282\u029e\u02b8\u02b8 \u02c4\u02c4\u02ad\u02b3 \u02be\u02be \u02a0\u0291\u0291\u02a6\u027c\u0267\u029a\u0271\u027d\u0287\u0287\u027f\u027f \u0297\u02d4 \u02ce \u02cf \u02c9 \u02c9\u02d5\u02d5\u02bf \u02d1\u02d1\u02d6\u02d6 \u02d2\u02d2\u02d2 \u02cc \u02d3 \u0272\u02b5\u02b6\u01d8\u01d8 \u02c7\u02c7 ",
- "\u029d\u029d\u027a\u0282\u0282\u029e\u029e\u02b8 \u02c3\u02c4\u02ad\u02b3 \u02be\u02be \u02a1\u0291\u0291\u027c\u027c\u02d7\u0270\u0271\u027e\u0287\u0279\u027f\u027f \u0297\u02d8\u02d4 \u02ce \u02c9\u02c9 \u02c9\u02c9\u02c9\u02c1\u02c1\u02bf\u02bb \u02d1\u02d1\u02cb\u02cb\u02d9 \u02cc\u02d3\u02d3 \u02b4\u02b4\u02b6\u01d8\u01d8 \u02c7 ",
- "\u029d\u027a\u0282\u0282\u0282\u029e\u02b8 \u02c4\u02ad\u02b3 \u02be\u02be \u02a1\u0291\u0291\u027c\u027c\u02d7\u0278\u027d\u027e\u0287\u0279\u027f\u027f \u0297\u0297\u02d4 \u02da\u02da\u02ce \u02c9\u02c9\u02c9 \u02db\u02c1\u02c1\u02bf \u02d1\u02d1\u02cb\u02cb \u02d9 \u02cc\u02cc\u02d3\u02d3 \u0272\u02b5\u02b6\u01d8 \u02c7 ",
- "\u027a\u0282\u0282\u0282\u029e\u02b8 \u02c3\u02c4\u02b3 \u02be\u02be \u02a6\u02a1\u0291\u0291\u027c\u027c\u02d7\u02dc\u02dd\u027e\u0287\u0279\u027f \u0297\u02d4 \u02da\u02da\u02ce \u02db\u02c1\u02bf\u02bf \u02d1\u02d1\u02cb\u02cb \u02d9 \u02cc\u02cc\u02d3 \u02b4\u02b6\u02b6\u01d8 \u02c7 ",
- "\u027a\u0282\u0282\u029e\u02b8\u02b8 \u02c4\u02c4\u02ad\u02b3 \u02be \u02a6\u02a6\u02a1\u02a1\u0291\u02de\u027c\u02df\u02e0\u02dd\u02e1\u0287\u0279\u027f \u0297\u0297\u02d4 \u02da\u02da \u02ce \u02db\u02c1\u02c1\u02bf\u02bb \u02d1\u02d1\u02cb\u02cb \u02d9 \u02cc \u02d3 \u02b5\u02b6 \u01d8 \u02c7\u02c7 ",
- "\u0282\u0282\u029e\u02b8\u02b8 \u02c3\u02c4\u02b3\u02b3 \u02be \u02a6\u02a6 \u02a1\u0291\u0291\u02de\u027c\u02dc\u02e0\u02e1\u02e2\u02e3\u027f\u027f \u0297\u0297\u02d4 \u02da \u02ce\u02ce \u02db\u02c1\u02c1\u02bf\u02bb\u02bb\u02d1\u02d1\u02cb\u02cb \u02d9 \u02cc \u02d3 \u02b4\u02b4\u02b6\u01d8\u01d8 \u02c7\u02c7 ",
- "\u0282\u029e\u029e\u02b8 \u02c3\u02c4\u02ad\u02b3 \u02be \u02a6 \u02a1\u0291\u0291\u02de\u027c\u02dc\u02e0\u02e1\u02e3\u02e3\u027f\u027f \u0297\u0297\u02d4 \u02da \u02ce \u02db\u02db\u02c1\u02c1\u02bf\u02bf\u02d1\u02d1\u02cb\u02cb\u02e4\u02e4\u02e5 \u02d9 \u02cc \u02d3 \u02b4\u02b5\u02e6\u01d8\u01d8 ",
- "\u0282\u029e\u02b8 \u02c3\u02c4\u02b3 \u02be\u02be \u02a6 \u02a1\u0291\u0291\u02de\u027c\u02e0\u02dd\u02e1\u02e3 \u027f\u027f \u0297\u0297\u02d4 \u02da\u02da \u02ce \u02db\u02db\u02c1\u02d0\u02e7\u02d1\u02e8\u02cb \u02e5\u02e5\u02e5\u02d9\u02d9\u02d9\u02d9\u02d9 \u02cc\u02cc\u02e9\u02d3 \u02b4\u02b5\u02b6\u01d8 ",
- "\u029e\u02b8 \u02c4\u02c4\u02ad \u02be\u02be \u02a6\u02a1\u0291\u02de\u02de\u027c\u02dd\u02e0\u02e3\u02e3 \u027f\u027f \u0297\u02ea\u0297 \u02da\u02da \u02ce \u02eb \u02db\u02c1\u02c1\u02e7\u02d0\u02e8\u02cb \u02d9\u02d9\u02d9\u02d9\u02d9\u02d9\u02d9\u02cc\u02cc\u02e9\u02d3 \u02ec\u02b5\u02ed\u01d8 ",
- "\u02b8\u02b8 \u02c3\u02c4\u02b3\u02b3 \u02be\u02be \u02a6\u02a6\u02de\u02de\u027c \u02dd\u02e2\u02e2 \u027f\u027f \u0297\u02ea\u02d4 \u02da\u02da \u02ce\u02ce \u02eb\u02eb \u02db\u02ee\u02ee\u02d0\u02ef\u02cb \u02d9\u02cc\u02e9\u02e9\u02d3 \u02b4\u02b6\u02e6\u01d8 ",
- "\u02b8 \u02c3\u02c4\u02ad\u02b3 \u02de\u027c\u027c \u02e1\u02e2 \u027f\u027f \u02ea\u02ea\u02d4 \u02da\u02da \u02ce\u02ce \u02eb \u02f0\u02ee\u02ee\u02ee\u02d0\u02d0\u02f1 \u02f2\u02cc\u02e9\u02d3\u02d3 \u02b4\u02ec\u02ed\u02ed\u01d8 ",
- " \u02c3\u02ad\u02b3 \u02de\u027c\u027c \u02e1\u02f3 \u027f\u027f\u0297\u0297\u02d4 \u02da \u02ce\u02ce \u02eb \u02f0\u02f0\u02f4\u02f5\u02f5\u02db\u02f1\u02f1\u02f1\u02f1 \u02f2 \u02cc\u02e9\u02d3\u02d3 \u02f6\u02f6 \u02b4\u02ec\u02b6\u01d8\u01d8 ",
- " \u02c4\u02c4\u02ad \u02de\u027c\u02f7\u02f3\u02e1 \u027f\u0297\u0297\u02d4 \u02da\u02da \u02ce\u02ce \u02eb \u02f0\u02f0\u02f5\u02f5\u02f8\u02f9\u02f9\u02f1\u02f1\u02f1\u02f1\u02f1\u02f1 \u02f2 \u02cc\u02cc\u02e9\u02d3\u02d3\u02f6\u02f6 \u02ec\u02b5\u02ed\u01d8\u01d8 ",
- " \u02c3\u02c4\u02b3 \u02de\u02de\u027c\u02f7\u02fa\u02f3\u027f\u027f\u0297\u0297\u0297 \u02da\u02da \u02ce \u02eb \u02fb\u02f0\u02f0\u02f5 \u02f8\u02f9\u02f9\u02f9\u02f1\u02f1\u02f1\u02f1\u02f1\u02f1\u02f1\u02f1\u02f1\u02f1\u02f1\u02f1\u02f1\u02fc\u02f1 \u02fd\u02e9\u02e9\u02f6\u02f6 \u02b4\u02b5\u02e6\u01d8\u01d8 ",
- "\u02c3\u02c4\u02ad\u02b3 \u02de\u02de\u027c\u02f7\u02fa\u02fe\u02ff\u02ff\u0297\u0297\u02d4 \u02da\u02da \u02ce\u02ce \u02eb \u0300\u02fb\u02f0\u02f5\u02f5 \u02f8\u02f9\u02f9\u02f9\u02f9\u02f1\u02f1\u02f1\u02f1\u02f1\u02f1\u02f1\u02f1\u02f1\u02fc\u02fc\u02f1\u02f1\u02f1\u02f1\u02f1\u02f1\u02fd\u02e9\u02e9\u02d3 \u02b4\u02b4\u02b6\u02e6\u01d8\u01d8 ",
- "\u02c3\u02b3\u02b3 \u02de\u027c\u027c\u02fa\u02fa\u02fe\u02ff\u0297\u0297\u02d4 \u02da\u02da \u02ce\u02ce \u02eb \u02fb\u02fb\u02fb\u02f0\u02f5 \u02f8\u02f8\u02f9\u02f9\u02f9\u02f9\u02f9\u02f9\u02f9\u02f9\u02f9\u02f9\u02f9\u02fc\u02f9\u02f9\u02f1\u02f1\u02f1\u02f1\u02f1\u02fd\u02f1\u02e9\u02e9\u02d3 \u02b4\u02b4\u02b6\u02e6\u01d8 ",
- "\u02ad\u02b3 \u02de\u027c \u02fa\u02fa\u02fe\u02ff\u0297\u0297 \u02da \u02ce\u02ce \u0300 \u02f5\u02f5 \u02f8\u02f8\u02f8\u02f8\u02f9\u02f8\u02f8\u02f8\u02f8\u02f8\u02fc\u02f9\u02f9\u02f9\u02f9\u02f9\u02f9\u02f9\u02f1\u02f1\u02fd\u02f1\u02f1\u02e9\u02d3 \u02b4\u02b5\u02b6 \u01d8 ",
- "\u02b3 \u02de\u02de\u027c \u02fe\u02fe\u02ff\u0297\u02d4 \u02ce\u02ce \u02f9\u02f9\u02f9\u02fd\u02f1\u02f1\u02f1\u02d3\u02d3 \u02b4\u02b5\u02b6 \u01d8 ",
- "\u02b3 \u02de\u02de\u027c \u02fe\u02fe\u02ff\u0297\u02d4 \u02ce \u02fd\u02f9\u02f1\u02f1\u02f1\u02f1\u02d3 \u02b4\u02b6\u02b6\u01d8\u01d8 ",
- " \u02de\u027c\u027c \u02fe\u02fe\u0297\u0297\u02d4 \u02ce\u02ce \u02f9\u02f9\u02f9\u02f1\u02f1\u02f1\u02d3 \u02b4\u02b4\u02b6\u02b6\u01d8\u01d8 ",
- " \u02de\u02de\u027c \u02fe\u02fe\u0297\u0297 \u02ce\u02ce \u02f9\u02f9\u02f1\u02f1\u02f1\u02d3 \u02b4\u02b5\u02b6\u02b6\u01d8 ",
- " \u02de\u02de\u027c \u02fe\u02ff\u0297\u02d4 \u02ce\u02ce \u02f9\u02f9\u02f1\u02f1\u02f1\u02d3 \u02b4\u02b5\u02b6 \u01d8 ",
- " \u02de\u027c \u02fe\u02ff\u0297\u02d4 \u02ce\u02ce \u02f9\u02f9\u02f1\u02f1\u02f1\u02d3 \u02b4\u02b5\u02b6 \u01d8 ",
- " \u02de \u02fe\u02fe\u02ff\u0297\u02d4 \u02f9\u02f1\u02f1\u02f1\u02d3 \u02b4 \u02b6\u01d8\u01d8 ",
- " \u02fe\u02fe\u0297\u0297\u02d4 \u02f9\u02f1\u02f1\u02f1\u02d3 \u02b4\u02b5\u02b6\u02b6\u01d8 ",
- " \u02fe\u02fe\u0297\u0297\u02d4 \u02f9\u02f1\u02f1\u02f1\u02d3 \u02b4\u02b5\u02b6 \u01d8 "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/road-casings-non-grouped-rendering-600-600-2.0-grid-reference.json b/tests/visual_tests/grids/road-casings-non-grouped-rendering-600-600-2.0-grid-reference.json
deleted file mode 100644
index fd52148..0000000
--- a/tests/visual_tests/grids/road-casings-non-grouped-rendering-600-600-2.0-grid-reference.json
+++ /dev/null
@@ -1,856 +0,0 @@
-{
- "keys": [
- "",
- "330",
- "155",
- "74",
- "57",
- "788",
- "774",
- "201",
- "202",
- "181",
- "228",
- "691",
- "523",
- "73",
- "749",
- "530",
- "385",
- "384",
- "286",
- "1",
- "156",
- "531",
- "361",
- "45",
- "43",
- "93",
- "46",
- "527",
- "589",
- "288",
- "215",
- "605",
- "138",
- "532",
- "588",
- "154",
- "362",
- "348",
- "328",
- "639",
- "635",
- "637",
- "638",
- "529",
- "497",
- "576",
- "300",
- "329",
- "237",
- "636",
- "600",
- "103",
- "534",
- "595",
- "137",
- "232",
- "593",
- "136",
- "104",
- "353",
- "14",
- "180",
- "526",
- "592",
- "594",
- "323",
- "490",
- "327",
- "203",
- "256",
- "258",
- "528",
- "415",
- "442",
- "342",
- "596",
- "157",
- "343",
- "331",
- "257",
- "89",
- "598",
- "599",
- "367",
- "344",
- "335",
- "277",
- "597",
- "371",
- "276",
- "275",
- "126",
- "113",
- "369",
- "108",
- "107",
- "590",
- "407",
- "414",
- "147",
- "99",
- "97",
- "124",
- "122",
- "110",
- "472",
- "591",
- "153",
- "100",
- "102",
- "173",
- "174",
- "481",
- "336",
- "406",
- "75",
- "159",
- "96",
- "72",
- "200",
- "266",
- "265",
- "263",
- "269",
- "231",
- "419",
- "179",
- "182",
- "525",
- "392",
- "391",
- "313",
- "390",
- "183",
- "417",
- "411",
- "315",
- "473",
- "479",
- "446",
- "146",
- "475",
- "474",
- "401",
- "421",
- "445",
- "483",
- "551",
- "480",
- "356",
- "476",
- "583",
- "324",
- "839",
- "462",
- "655",
- "325",
- "389",
- "393",
- "724",
- "440",
- "267",
- "227",
- "620",
- "477",
- "582",
- "268",
- "535",
- "464",
- "299",
- "16",
- "271",
- "259",
- "225",
- "247",
- "463",
- "693",
- "270",
- "548",
- "467",
- "465",
- "422",
- "418",
- "261",
- "489",
- "633",
- "466",
- "238",
- "244",
- "246",
- "482",
- "634",
- "671",
- "333",
- "326",
- "239",
- "248",
- "488",
- "448",
- "245",
- "484",
- "460",
- "332",
- "378",
- "25",
- "577",
- "461",
- "471",
- "381",
- "188",
- "565",
- "470",
- "469",
- "334",
- "379",
- "355",
- "284",
- "279",
- "175",
- "668",
- "550",
- "562",
- "373",
- "665",
- "354",
- "632",
- "485",
- "570",
- "575",
- "673",
- "131",
- "404",
- "587",
- "585",
- "549",
- "663",
- "41",
- "285",
- "739",
- "478",
- "40",
- "773",
- "262",
- "690",
- "78",
- "145",
- "358",
- "226",
- "260",
- "283",
- "687",
- "486",
- "133",
- "672",
- "95",
- "121",
- "322",
- "195",
- "264",
- "177",
- "396",
- "321",
- "359",
- "15",
- "402",
- "686",
- "619",
- "641",
- "615",
- "397",
- "59",
- "236",
- "282",
- "204",
- "786",
- "618",
- "614",
- "403",
- "376",
- "58",
- "212",
- "692",
- "584",
- "400",
- "56",
- "55",
- "199",
- "375",
- "374",
- "31",
- "405",
- "319",
- "640",
- "579",
- "670",
- "357",
- "505",
- "743",
- "493",
- "50",
- "92",
- "38",
- "784",
- "847",
- "320",
- "841",
- "213",
- "568",
- "741",
- "492",
- "39",
- "840",
- "254",
- "747",
- "827",
- "607",
- "53",
- "158",
- "398",
- "439",
- "753",
- "224",
- "438",
- "214",
- "835",
- "223",
- "626",
- "5",
- "54",
- "61",
- "119",
- "838",
- "302",
- "62",
- "52",
- "22",
- "165",
- "494",
- "13",
- "769",
- "622",
- "491",
- "301",
- "423",
- "118",
- "252",
- "222",
- "631",
- "317",
- "710",
- "318",
- "495",
- "36",
- "304",
- "762",
- "697",
- "630",
- "123",
- "760",
- "621",
- "674",
- "2",
- "253",
- "255",
- "846",
- "77",
- "453",
- "3",
- "708",
- "628",
- "291",
- "383",
- "308",
- "726",
- "771",
- "617",
- "625",
- "564",
- "581",
- "295",
- "292",
- "365",
- "830",
- "722",
- "845",
- "624",
- "656",
- "666",
- "42",
- "294",
- "694",
- "623",
- "627",
- "606",
- "580",
- "456",
- "47",
- "716",
- "732",
- "836",
- "507",
- "629",
- "654",
- "653",
- "293",
- "23",
- "758",
- "837",
- "613",
- "65",
- "48",
- "144",
- "459",
- "834",
- "780",
- "184",
- "457",
- "125",
- "833",
- "764",
- "831",
- "719",
- "844",
- "139",
- "616",
- "679",
- "681",
- "682",
- "458",
- "29",
- "766",
- "768",
- "825",
- "842",
- "166",
- "511",
- "26",
- "27",
- "30",
- "772",
- "219",
- "220",
- "610",
- "675",
- "17",
- "518",
- "509",
- "63",
- "770",
- "689",
- "221",
- "506",
- "677",
- "35",
- "37",
- "120",
- "832",
- "714",
- "738",
- "680",
- "678",
- "755",
- "730",
- "676",
- "443",
- "740",
- "713",
- "11",
- "444",
- "703",
- "742",
- "717",
- "745",
- "826",
- "501",
- "142",
- "642",
- "117",
- "130",
- "767",
- "503",
- "20",
- "18",
- "731",
- "808",
- "185",
- "170",
- "727",
- "90",
- "521",
- "569",
- "70",
- "191",
- "234",
- "515",
- "513",
- "522",
- "701",
- "311",
- "545",
- "684",
- "556",
- "517",
- "516",
- "514",
- "733",
- "211",
- "141",
- "519",
- "696",
- "350",
- "310",
- "210",
- "64",
- "520",
- "303",
- "699",
- "736",
- "729",
- "524",
- "450",
- "345",
- "725",
- "816",
- "822",
- "349",
- "192",
- "135",
- "746",
- "815",
- "813",
- "189",
- "190",
- "546",
- "643",
- "24",
- "33",
- "34",
- "510",
- "705",
- "744",
- "721",
- "712",
- "193",
- "553",
- "538",
- "555",
- "750",
- "817",
- "559",
- "539",
- "795",
- "818",
- "707",
- "351",
- "603",
- "604",
- "76",
- "794",
- "683",
- "206",
- "544",
- "819",
- "779",
- "783",
- "787",
- "789",
- "32",
- "706",
- "807",
- "805",
- "793",
- "297",
- "235",
- "105",
- "44",
- "543",
- "542",
- "759",
- "791",
- "711",
- "852",
- "290",
- "347",
- "289",
- "160",
- "536",
- "51",
- "757",
- "728",
- "811",
- "781",
- "785",
- "169",
- "810",
- "778",
- "541",
- "504",
- "98",
- "709",
- "148",
- "134",
- "748",
- "809",
- "704",
- "426",
- "163",
- "149",
- "4",
- "752",
- "346",
- "341",
- "305",
- "167",
- "162",
- "754",
- "12",
- "109",
- "67",
- "828",
- "540",
- "340",
- "10",
- "168",
- "824",
- "112",
- "554",
- "763",
- "688",
- "68",
- "756",
- "428",
- "106",
- "782",
- "229",
- "829",
- "496",
- "128",
- "127",
- "161",
- "249",
- "761",
- "176",
- "132",
- "561",
- "537",
- "306",
- "19",
- "432",
- "307",
- "309",
- "111",
- "171",
- "129",
- "164",
- "250",
- "178",
- "695",
- "21",
- "116",
- "804",
- "775",
- "197",
- "360",
- "803",
- "802",
- "800",
- "806",
- "801",
- "799",
- "798",
- "797",
- "217",
- "216",
- "718",
- "150",
- "843",
- "720",
- "790",
- "338",
- "152",
- "69",
- "151",
- "7",
- "86",
- "8",
- "207",
- "218",
- "796",
- "451",
- "88",
- "6",
- "172",
- "777",
- "558",
- "452",
- "209",
- "208",
- "776"
- ],
- "data": {},
- "grid": [
- " !! ##$$ %%%%&&' (( )))) *** + ",
- " !! ##$$ %%%,&& (( )))) **** ++ ",
- " - . !! ###$$ %%%/,'' (( )))) **** ++ ",
- " -- ... !! ###$$ %%//&' (( )))) **** +++ ",
- " -- 00 ... !! ###$$1 22%%%/&&' (( )))33 *** +++ ",
- " -- 00 .... !! ###$$1 222%%%,&&44 (( )))33 **** ++ ",
- " -- 00 5.... !! ###$$1 222%%%/,'4444 (( ))))33 **** +++ ",
- " -- 00 655.... !! 7777777 8##$$112229%%//&'4444 (( ))) 333**** ++++ ",
- " -- 00 65555.... !! 7777777 ###$$112229%%/&&'4444 ( ))) 33*** ++++ ",
- " -- 00 66 5555...:. !! 77 ##;$$12229%%%,&&4444 ( )) 33** ++++ ",
- " << 00 66= 5555.:::. !! 77 ###$$$12229%%%,&'4444 (( ))>>*33* ++++++ ? ",
- " <<<<<< @ 0 66=== 5555::.... !! 77 ###A$$1229%%//,''444 ( )) >>333++++++++ ???? ",
- " -- <<<<<<@ BBB 666 ==C CC555D...... !! 77 EEEEF ###;AAG1299%%/&&'4444 ( )))*>*33+++ ??? ???? ",
- " --HHIJJK<<LLLBBBBBB 66 CCCCCCCC55DDD..... !! EEEEEEFFF###AAAG229%%%/&&'4444 (( )) **33+ ??? ?? ",
- " --HHHHHHHMM BBBBBBB6 CC CC NNNDDDDD ..... !! O OOFF##AAAP9999%%%,&'4444 (()) *QQQ3 ???? ",
- " --HRJJHHHMM BBB CC CC SSSS DDDDD...... !! OO OO T##AAAP999%%%%,&'4444 ()))QQQQ+ ?????????? ",
- "U-HHRJJKHHMM CC CCC NVVSSSSDDDDD ..... !! OO OO TTWWPP9999%%/%&''444 ))QQQ ++ ?????XX ? ",
- "UUHHHHHKHMM CCCCCC YYVVVSSSSDDDDD ....Z !! OO OOTTT[[P]^^^^%%/&&'4444 ))QQ__++ ??? XX ",
- "```IHHHHHMM CCCCC NaYYYVVVSSSbDDDDD..ZZ.. !! OOOOOO TT[[[P ^^^%%%,&'4444 ccQQ __++ ??? XX ",
- "-`````KHHM CCC dNNaaaYYYVVV bbDDDDDZZZ.... ! OOOO T[[[ee ^^^%%%,&'4444 cccfQQ _++ g?? XXhhh ",
- "- `````iM ddjjjaaaaYYY bb DDDDDDZ.....!!kk TT[[[llll^%%%/,&'4444 cccffQQ _++ g?? hhhh ",
- " `ii dd jjjjaaa bb mmmDDDDDDD..nn.kkkk TT[[ooppl^%%//&'4444 ccc ffQ _++ ?? qqhh rrr",
- " ii d dd jjjjajbb ssmmttDDDDDnnn...kkkkkkuT[[[vvvpl^%%/&&'444w ccc ffQ _+xxx++++++ ?? XXhqrrrrrrrrrrrrrrrrrrr",
- " ii dddddd jjjbjyyssttmmmDDDnnn.....kkkkzT[[[vvvvv%%%%&&4444wwc ffQ{{{{xxxxxxx|+++rrrrrrrrrrrrrr}}rrrr~~~~~~~~~~~~~~~~~",
- " ii ddd d bjjyyyttssmmmDnnDDD.......TT[[\u007fooooo%%%,,'4444cw \u0080\u0080\u0080f\u0080\u0080\u0080\u0080\u0080\u0080\u0080\u0080\u0080\u0080\u0080\u0080\u0080\u0081\u0081\u0081~~~~~~~~~~~~~~}}}~~~~~~~~~~~~~~~~~~~~",
- " ii ddd jjjjytyssss\u0082\u0083\u0084DDDDD\u0085\u0085\u0085\u0085..T[[[\u0086\u0086\u0086\u0086\u0086\u0086\u0087\u0087/\u0087\u0087'\u0087\u0087\u0087\u0088\u0088\u0080\u0080\u0080\u0080\u0080\u0080\u0080\u0080\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u008a\u008a\u008a~~~~~~~~~~~~~~}}~~~~~~~~~~~~~ ",
- " ii dd \u008b jjtyyyss\u008c\u0084\u0084\u0083\u0083\u0083D\u0085\u0085\u0085\u0085\u0085\u0085\u0085\u0085\u008d\u008d\u008e\u0086\u0086\u0086\u0086\u008e\u008f\u008f\u008f/&&'\u008f\u008f\u008f\u0088\u0088\u0080\u0080\u0080\u0080\u0080\u0080\u0080\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u0089\u008a\u008a\u008a~~~~~\u0090~~~~ \u0091\u0091 ",
- " i dd \u008b\u0092\u008b\u008b jjjjyy\u0093\u0084\u0084\u0094\u0083\u0083\u0083 \u0095\u0095\u0085\u0096\u0096\u0085\u0085\u008d\u008d\u008e\u008e\u008e\u008e\u008e\u008f\u008f\u008f\u008f/&\u008f'\u008f\u008f\u008f\u0097\u0097\u0098\u0098\u0098\u0098\u0098\u0098\u0098\u0098\u0099\u009a\u009b\u009c\u009c\u009d\u009d\u009e\u009e\u009e\u009e\u009e\u009e++ \u0090\u0090 \u0091 ",
- " ii dd \u008b\u008b\u0092\u008b\u008b\u008b\u008b jj \u0093\u0084\u0093\u0094\u0094j\u009fjjj\u0095\u0096\u0096\u0096\u008d\u008d\u008d\u008e\u008e\u008e\u008e\u008e\u008e\u008f\u008f\u008f\u008f&4444 \u00a0\u00a0 \u0099\u0099\u009a\u009b\u00a1\u00a1\u009d\u009d\u009d\u009e+++++ \u0090\u0090 \u0091\u0091 ",
- "\u00a2 ii ddd \u008b\u008b\u008b\u0092 \u008b\u008b\u008b jjjjjjjjjj\u009fjjjjz\u0096\u0096\u008d\u008d\u00a3\u00a4\u00a4\u00a5\u00a6\u00a6%%%%,,4444 \u00a0\u00a0 \u0099\u0099\u009a\u00a7\u00a1\u00a1\u00a1+ \u0090\u0090 \u0091\u0091 ",
- "\u00a2\u00a2\u00a2\u00a2ii ddd \u008b\u008b\u008b\u0092\u0092 jjj \u00a8\u00a8 \u00a9\u0096\u0096\u0096\u008d\u00a3\u00a4\u00a5\u00aa\u00a6\u00a6%%%/&&'444 \u00a0\u00a0 \u0099\u0099\u009a\u009a\u00a1 + \u0090\u0090 \u0091\u0091 ",
- " \u00a2\u00a2\u00a2ii dd \u008b\u008b \u0092\u0092 \u00ab\u00ac\u00ab\u00ab \u00a8\u00a8 \u00ad\u00ae\u0096\u008d\u008d\u00a3\u00a4\u00a5\u00aa\u00a6\u00a6%%%/&&'444 \u00a0 \u0099\u009a\u009a\u00a1\u00a1 ++ \u0090\u0090 \u0091\u0091 ",
- " i\u00a2\u00a2\u00a2\u00a2 dd \u008b\u008b \u0092\u0092 \u00af\u00af\u00b0\u00b0 \u00ac\u00ac\u00ab\u00ab\u00ab\u00ab \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b2\u00b2 \u00b3\u00ae\u008d\u008d\u00a3\u00a3\u00a4\u00a5\u00aa\u00a6\u00a6%%%/&&'444 \u00a0\u00a0 \u0099\u0099\u009a\u00a7\u00a1 ++ \u0090\u0090 \u0091 ",
- "\u00b4\u00b4 \u00a2\u00a2\u00a2\u00a2\u00a2\u00a2 dd \u008b\u00b5\u008b \u0092\u0092 \u00af\u00af\u00b0\u00b0\u00b0\u00b0 \u00b6\u00b6 \u00ab\u00ab\u00ab\u00ab \u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b1\u00b2\u00b2 \u00b3\u00b3\u00ae\u008d\u008d\u00a3\u00a4\u00a4\u00aa\u00aa\u00a6%%%%/,&444\u00b7 \u00a0\u00a0 \u0099\u0099\u009a\u00a7\u00a7\u00a1++ \u0090\u0090 \u0091\u0091 ",
- "\u00b4\u00b4\u00b4 \u00a2\u00a2\u00a2\u00a2 ddd \u008b\u008b\u00b5\u00b5 \u0092\u0092\u0092\u0092\u00b8 \u00b0\u00b9\u00b9\u00b6\u00b6\u00ac\u00ac\u00ac \u00ab\u00ab \u00b1\u00b1 \u00ba\u00b1 \u00b3\u00ae\u00ae\u008d\u008d\u00a3\u00a4\u00a4\u00aa\u00aa\u00a6%%%%\u00bb,&444\u00b7 \u00a0\u00a0 \u0099\u0099\u009a\u009a\u00a7\u00a7\u00a1++ \u0090\u0090 \u0091\u0091 ",
- " \u00b4\u00b4\u00b4\u00b4 \u00a2 ddd \u008b\u00b5\u00b5 \u00bc\u00bc\u0092\u0092\u0092\u00b8\u00b8 \u00b9\u00bd\u00ac\u00ac\u00ac\u00ac\u00ac\u00ac\u00ab \u00be\u00be \u00ba\u00ba \u00b3\u00ae\u008d\u008d\u008d\u00bf\u00bf\u00a4\u00c0\u00c0\u00a6%%%/\u00bb\u00c1'444\u00c2 \u00a0 \u0099\u0099\u009a\u009a\u00c3\u00c4++ \u0090\u0090 \u0091\u0091 ",
- " \u00b4\u00c5\u00c5\u00c5\u00c5 dddddd \u008b\u008b\u00b5\u00b5\u00bc\u00bc\u00bc\u00bc\u00bc\u00af\u00bc\u00b8\u00c6\u00c6\u00b8\u00c7\u00c7 \u00ac\u00ac\u00ac \u00be\u00be \u00ba\u00ba \u00b3\u00ae\u008d\u008d\u008d \u00a4\u00a4\u00c0\u00a6%%%%\u00bb\u00bb&&444\u00c2 \u00a0\u00a0 \u0099\u0099\u00c8\u00c8\u00c3\u00c3 ++ \u0090\u0090 \u0091\u0091 ",
- " \u00b4\u00b4\u00c5\u00c5\u00c5\u00c5dddd \u008b\u008b\u00bc\u00bc\u00b5\u00b5\u00c9\u00c9\u00c9\u00ca\u00ca\u00bc\u00c6\u00c6\u00b8\u00b8\u00c7\u00c7 \u00ab \u00be \u00ba\u00ba \u00cb\u00b3\u00ae\u008d\u008d \u00a5\u00c0\u00c0\u00aa\u00cc%%%\u00bb\u00bb&'444\u00c2\u00b7 \u00a0\u00a0 \u0099\u0099\u00cd\u00c8\u00ce\u00cf\u00cf+++ \u00d0\u0090\u0090 \u0091 ",
- " \u00b4\u00b4\u00b4\u00c5\u00c5\u00c5 \u008b\u008b\u00bc \u00b5\u00b5\u00c9\u00c9\u00c9\u00c9\u00c9\u00c9\u00c9\u00d1\u00bc\u00c7\u00c7 \u00ab\u00ab \u00be\u00be \u00ba \u00b3\u00ae\u00ae\u008d\u008d \u00a5\u00c0\u00c0\u00aa\u00cc%%%\u00bb\u00d2&4444\u00c2\u00b7 \u00a0\u00a0 \u0099\u0099\u00d3\u00d3 \u00cf\u00cf+++ \u00d0\u00d0\u00d0\u0090\u0090 \u0091\u0091 ",
- " \u00b4\u00b4\u00b4\u00c5\u00c5\u00c5 \u00d4\u00d4\u00d4\u00d4\u00c9\u00c9\u00b5 \u00d5\u00c9\u00c9\u00c9\u00c9\u00c9\u00d6\u00d6\u00bc\u00bc \u00ab\u00ab \u00be\u00be \u00d7\u00d7\u00d8 \u00b3\u00ae\u008d\u008d\u008d \u00a5\u00c0\u00aa\u00cc\u00cc%%%\u00bb\u00d2&4444\u00b7\u00b7 \u00a0\u00a0 \u0099\u0099\u00d9\u00d3\u00d3\u00cf\u00cf\u00cf+++ \u00d0\u00d0 \u0090\u0090 \u0091\u0091 ",
- " \u00b4\u00b4\u00b4\u00c5\u00c5\u00da \u008b\u008b\u00d4\u00db\u00d4\u00d4\u00c9 \u00dc\u00dc\u00dc\u00d5\u00dc\u00dc \u00c9\u00c9\u00c9 \u00bc\u00bc\u00bc \u00ab\u00ab \u00be\u00be \u00d7\u00d8 \u00b3\u00ae\u008d\u008d\u008d \u00a5\u00a5\u00c0\u00aa\u00cc%%%%\u00bb\u00bb&'444\u00b7\u00b7 \u00a0\u00a0 \u0099\u0099\u00d9\u00d3\u00d9\u00d9\u00cf\u00cf+++ \u00dd\u00de\u00df\u00df \u0090\u0090 \u0091\u0091 ",
- " \u00b4\u00b4 \u00da\u00da\u00da \u00e0\u00e0\u008b\u00bc\u00e1\u00e1\u00e1 \u00dc\u00dc\u00dc \u00dc\u00dc\u00dc\u00e2\u00e2\u00c9\u00c9 \u00bc\u00bc\u00bc \u00ab\u00ab \u00e3\u00e3\u00e3\u00e3 \u00e4\u00e4 \u00b3\u00ae\u008d\u008d \u00a5\u00c0\u00c0\u00aa\u00cc%%%%\u00bb\u00bb&'444 \u00b7\u00b7 \u00a0\u00a0 \u0099\u0099 \u00d9\u00d9\u00d9\u00d9\u00d9\u00d9+\u00d9 \u00dd\u00e5\u00df\u00df \u00e6\u0090 \u0091\u0091 ",
- " \u00b4\u00b4 \u00da\u00da\u00e7\u00e7 \u00e0\u00e0\u00e0\u008b\u00bc\u00db\u00db\u00c9 \u00dc\u00dc \u00dc\u00e2\u00e2 \u00c9\u00c9 \u00bc\u00bc \u00ab\u00ab \u00be\u00e8\u00e8\u00e3\u00e3\u00e3 \u00e4\u00e4 \u00ae\u00ae\u008d\u008d \u00a5\u00c0\u00c0\u00aa\u00cc%%%%\u00bb\u00bb&'444 \u00b7\u00b7 \u00a0\u00a0 \u0099\u0099 \u00d9\u00d9\u00d9\u00d9\u00d9\u00d9 \u00dd\u00e9\u00e6\u00e6\u00e6\u0090\u0090 \u0091 ",
- " \u00b4\u00b4 \u00e7\u00e7\u00e7\u00ea\u00ea\u00ea\u008b\u00bc\u00db\u00db\u00c9 \u00dc\u00dc \u00dc\u00dc\u00dc\u00c9\u00c9\u00eb\u00eb\u00bc \u00ab\u00ab \u00ec\u00ec\u00e8\u00e8\u00e8\u00e3\u00e3 \u00e4 \u00ed\u00ed\u00ed\u008d\u008d\u008d \u00a5\u00c0\u00aa\u00cc\u00cc%%%%\u00bb\u00d2&4\u00ee\u00ee4 \u00b7\u00b7 \u00a0\u00a0 \u0099\u0099 \u00cf\u00cf ++ \u00dd\u00dd\u00e6\u00e6 \u0090\u0090 \u0091\u0091 ",
- " \u00b4\u00b4 \u00ef\u00ef\u00e0\u00ea\u00ea\u00ea\u00ea\u008b\u00bc\u00f0\u00c9\u00c9\u00f1\u00f1\u00dc \u00dc\u00dc \u00c9\u00c9\u00eb\u00bc\u00ab\u00ab \u00ec\u00ec\u00ec\u00e8\u00e8\u00e3\u00e4\u00e4 \u00f2\u00ed\u00ed\u00ed\u00ed\u00ed \u00a5\u00a5\u00c0\u00aa\u00cc\u00cc%%%%\u00bb\u00d2&\u00ee\u00ee\u00ee4 \u00b7\u00b7 \u00a0\u00a0 \u0099\u0099 \u00cf\u00cf ++ \u0090\u0090 \u00f3\u00f3 ",
- " \u00ef\u00ef\u00ef\u00ef\u00e0 \u00ea\u00ea\u008b\u00bc\u00bc\u00c9\u00c9\u00f1\u00f1\u00dc\u00dc\u00dc \u00dc\u00dc \u00c9\u00c9 \u00bc\u00ab\u00ab \u00ec\u00e8\u00e8\u00e3\u00e4\u00e4 \u00f2\u00b3\u00ae\u008d\u00ed\u00ed \u00a5\u00c0\u00c0\u00aa\u00cc\u00cc%%%%/\u00c1'\u00ee\u00ee\u00ee\u00ee \u00b7\u00b7 \u00a0\u00a0 \u0099\u0099 \u00cf\u00cf ++ \u0090\u0090 \u00f3\u00f3\u00f3 ",
- " \u00ef\u00ef \u00e0\u00e0\u00e0\u00ea\u00ea\u008b\u00bc\u00bc \u00c9\u00c9\u00f4 \u00dc\u00f5\u00dc\u00dc\u00f6\u00f6\u00dc\u00dc \u00c9\u00c9 \u00bc\u00ab \u00ec\u00ec\u00ec\u00e4 \u00ae\u00ae\u008d\u00ed\u00ed \u00a5\u00c0\u00c0\u00aa\u00cc\u00cc%%% /\u00c1&\u00ee\u00ee\u00ee\u00ee \u00b7\u00b7 \u00a0 \u0099\u0099 \u00cf\u00cf + \u0090\u0090 \u00f3\u00f3\u00f3 ",
- " \u00ef\u00ef \u00e0\u00ea\u00ea\u008b\u008b \u00bc\u00bc \u00f4\u00f4\u00c9\u00f5\u00f5\u00dc\u00dc\u00f6\u00f6\u00dc \u00c9\u00c9 \u00bc\u00ab\u00ab \u00f7\u00f7 \u00ae\u008d\u008d\u008d\u00f8 \u00a5\u00c0\u00c0\u00aa\u00cc\u00cc%%% /\u00c1&\u00ee\u00ee\u00ee\u00f9 \u00b7\u00b7 \u00a0\u00a0 \u0099\u0099\u00fa\u00fa\u00fa\u00fb\u00fb ++ \u0090\u0090 \u00f3\u00f3\u00f3 \u00fc\u00fc\u00fc\u00fc\u00fc",
- " \u00ef\u00ef \u00e0\u00e0\u008b \u00bc\u00fd\u00fd \u00c9\u00c9\u00c9\u00c9\u00c9\u00f6\u00f6\u00c9\u00fe\u00fe\u00c9 \u00bc\u00ab \u00ff\u00ff\u0100 \u00f7\u00f7 \u00b3\u00ae\u008d\u008d\u008d\u00a5\u00a5\u00a5\u00c0\u00aa \u00cc%%%% /\u00d2&\u00ee\u00ee\u00ee\u00f9 \u00b7 \u00a0\u00a0 \u0099\u0099\u00fa\u00fa\u00fa\u00cf ++ \u0090\u0090 \u00f3\u00f3\u00f3 \u00fc\u00fc\u00fc\u00fc\u00fc\u00fc\u00fc\u00fc ",
- " \u00ef\u00ef\u00ef \u008b\u008b\u008b \u00fd\u00bc \u00c9\u00c9\u0101\u00c9\u00c9\u00c9\u00fe\u00fe \u00bc\u00ab\u00ab \u00ff\u00ff\u0100\u0100 \u00f7\u00f7 \u00ae\u00ae\u008d\u008d\u008d\u00a5\u00a5\u00c0\u00c0\u00aa \u00cc%%%% /\u00d2\u00ee\u00ee\u00ee\u0102\u00f9\u0102 \u00b7\u00b7 \u00a0\u00a0 \u0099\u0099 \u00fa\u00fa\u00cf ++ \u0090\u0090 \u00f3\u00f3 \u00fc\u00fc\u00fc\u00fc\u00fc\u00fc\u00fc\u00fc ",
- " \u00ef\u00ef\u00ef \u008b\u008b\u008b \u0101\u0101\u0103\u0103 \u00fe\u00fe\u0104\u0104 \u0105\u00ff\u0100\u0100\u0100\u0100\u0106\u0106 \u0107\u0108\u00ae\u00ae\u008d\u008d \u0109\u00c0\u00aa\u00cc\u00cc%%%% /\u00c1'\u00ee\u00ee \u0102\u0102 \u00b7\u00b7 \u00a0\u00a0 \u0099\u0099 \u00fa\u00fa\u00cf + \u0090\u00f3\u00f3 \u00fc\u00fc\u00fc\u00fc\u00fc\u00fc\u00fc\u00fc ",
- " \u010a\u010b\u010b \u008b\u008b\u008b \u010c\u010d \u0103\u0103\u00bc\u00fe\u00fe\u0104\u0104 \u0105\u0105 \u0100\u0100\u0106\u0106\u0107\u0108\u0108\u0108\u0108\u00ae\u008d\u008d\u008d\u010e \u0109\u0109\u00aa\u00cc\u00cc%%%% /\u00c1&\u00ee\u0102 \u0102\u0102 \u00b7\u00b7 \u00a0\u00a0 \u0099 \u00fa\u00fa\u00cf ++ \u010f\u010f\u00fc\u00fc\u00fc\u00fc\u00fc\u00fc ",
- "\u0110 \u00ef\u010a\u010a\u010b\u010b \u008b\u008b\u008b \u0111\u00ab\u00ab\u0103\u0103\u00ab\u00ab\u0104\u0104 \u0100\u0100\u0100\u0100\u0100\u0106\u0106\u0107\u0108\u0108\u0108\u0108\u0108\u00ae\u008d\u008d\u008d\u010e\u010e\u0112\u0109\u00aa\u00aa\u00cc%%%% \u00ee/\u0113&\u00ee\u0102 \u0102\u0102 \u00b7 \u00a0\u00a0 \u0099\u0099\u00fa\u00fa\u00cf\u00cf ++ \u0114 \u010f\u010f\u00fc\u00fc\u00fc ",
- "\u0115\u0115 \u00ef\u00ef \u010a\u010a\u010a\u010b\u010b \u008b\u008b\u008b \u00ab\u0111\u00ab\u00ab\u00ab\u0103\u00ab\u0104\u0104 \u0100\u0100\u0100\u0100\u0106\u0106\u0108\u0108\u0108\u0108\u0116\u0117\u0117\u0117\u008d\u010e\u010e\u010e\u0112\u0112\u0112\u00cc\u00cc%%%% \u00ee\u00ee\u0113&'\u0102\u0102 \u0102\u0102 \u0118\u0118\u0118\u0118 \u00a0\u00a0 \u0099\u0099 \u00fa\u00fa\u0119\u00cf\u00cf++\u011a\u011a\u011b\u011b \u010f\u010f [...]
- "\u011c\u0115\u0115 \u00ef\u00ef\u00ef \u010a\u010a\u010a\u010b\u010b \u008b\u008b\u008b\u0111\u011d\u011d\u011d\u011d \u0104\u0104\u0104 \u0100\u0100\u0106\u0106\u0107\u011e\u011e\u0108\u0116\u011f\u0120\u0120\u0121\u0121\u0122\u010e\u0112\u0112\u00cc\u00cc\u00cc\u00cc%%%%\u00ee\u00ee\u00ee\u00d2\u00ee'\u0102\u0102 \u0102\u0102\u0118\u0118\u0118 \u00a0\u00a0 \u0099\u0099 \u00fa\u00fa\u00fa\u00cf \u0123\u0124\u0124\u011b\u011b \u010f\u010f [...]
- " \u011c\u0115\u0115\u0115 \u00ef\u00ef \u010a\u010a\u010a\u010b\u010b \u008b\u008b\u0111\u011d\u011d\u011d\u011d\u0104\u0104\u0104 \u0106\u0107\u011e\u011e\u011e\u011f \u0120\u0120\u0121\u0121\u0126\u0127\u0127\u0127\u00cc\u00cc\u00cc%%%%\u00ee\u00ee\u00ee/\u00c1\u00c1' \u0102\u0102 \u0102\u0102\u00b7\u0128 \u00a0\u00a0\u00a0\u00a0\u00a0 \u0099\u0099 \u0119\u0119\u0119 \u0124\u0124\u0124\u011b\u011b \u010f\u010f \u0125\u0125\u012 [...]
- " \u011c\u011c\u0115\u0115\u00ef\u00ef \u010a\u010a\u010a\u010b \u008b\u0111\u011d\u011d\u011d\u011d\u0104\u0104 \u0106\u0107\u011e\u011e\u011e\u0129\u0129 \u0120\u0120\u0121\u0121 \u012a\u0127\u0127\u0127\u00cc\u00cc%%%%\u00ee\u00ee\u00ee//&' \u0102\u0102 \u0102\u0128\u0128 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0099 \u0119\u0119 \u0124\u0124\u0124\u011b\u011b \u010f\u010f \u0125\u0125\u0125\u0125\u0125\ [...]
- " \u012c\u011c\u011c\u0115\u0115\u012d \u010a\u010a\u010a\u010b\u010b \u008b\u012e\u012e\u0104\u0104 \u0106\u0106\u011e\u011e\u011e\u0129\u0129\u0129\u0129\u0120\u0120\u0120\u0121\u0121\u0121\u012f\u012a\u012a\u0127\u0127\u0130%%%\u00ee\u00ee\u00ee\u00ee/\u0113&' \u0102\u0102 \u0102\u0102\u0102 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u0131\u0131\u0131\u0131\u0131 \u0132\u0132 \u011b\u011b \u0133\u010f\u010f\u010f \u0125\u0125\u0125\u0125\u [...]
- "\u00b4\u0135\u012c\u012c\u012c\u0115\u0115\u0115\u012d \u010a\u010a\u010a\u010b\u010b \u012e\u012e\u012e\u0136\u0104 \u0106\u011e\u011e\u011e\u0129\u0129\u0129\u0129\u0129\u0120\u0120\u0120\u0121\u0121\u0121\u0137\u0138\u0138\u0127\u0127\u0139\u0139%%\u00ee\u00ee\u00ee\u00ee/\u0113&&' \u0102\u0102 \u013a\u013a\u0102\u0102\u0102 \u0131\u0131\u0131\u0131\u0131\u0131\u0131\u0131\u0131\u0131\u0131\u0131\u0131\u0133\u010f\u010f\u010f \u0125\u01 [...]
- "\u00b4\u0135\u0135\u0135\u00ef\u00ef\u011c\u011c\u0115\u0115 \u010a\u010a\u010b\u010b \u012e\u012e\u0136\u013c \u0106\u0107\u011e\u011e\u011e\u0129\u0129\u0129\u0129\u0129\u0120\u0120\u0120\u0121\u0138\u0138\u0138\u0138\u013d\u012a\u0139\u013e\u013e\u0139\u00ee\u00ee\u00ee\u00ee\u013f/\u00d2&&' \u0102\u0102\u013a\u013a\u013a \u0102\u0102\u0102 \u0131\u0131\u0131\u0131\u0131\u0131 \u0140\u0140\u0140\u0125\u0125\u0125\u0125\u0125\u0125\u0 [...]
- "\u00b4 \u00ef\u00ef \u011c\u011c\u0115\u0115 \u010a\u010a\u010a\u010b\u010b \u012e\u012e\u0136\u013c\u013c\u013c \u0106\u0107\u011e\u011e\u011e\u011f\u0141\u0142\u0129\u0129\u0143\u0120\u0120\u0138\u0138\u0138\u0138\u0121\u0144\u0144\u0139\u013e\u013e\u013e\u013e\u00ee\u00ee\u00ee\u013f\u0145//\u00c1&' \u0102\u0102 \u013a\u013a \u0102\u0102\u0102 \u0140\u0125\u0125\u0125\u0125\u0125 \u012b\u012b\u012b\u012b\u012b\u0134\u0134\u013 [...]
- "\u00b4 \u00ef\u00ef \u0146\u0115\u0115\u0115\u012d \u010a\u010a\u010a\u010b\u010b \u012e\u012e\u0136\u0136 \u013c\u013c\u0147 \u0148\u0148\u011e\u011e\u011e\u011f\u0141\u0129\u0143\u0143\u0143\u0143\u0120\u0120\u0143\u0138 \u0121\u0121\u0121\u0139\u0139\u013e\u013e\u013e\u013e\u00ee\u00ee\u00ee\u0145\u0145//\u00c1&' \u0102\u0102\u0102\u013a\u0149\u0149 \u0102\u0102\u0102\u013a \u012b\u012b\u012b\u012b\u0134\u0134\u0134\u0134\u0134\u [...]
- "\u014a\u00ef\u00ef\u00ef \u0146\u011c\u011c\u0115\u014b \u010a\u010a\u010b\u010b \u012e\u012e\u0136\u0136 \u014c\u0147\u0147\u014c \u0106\u011e\u011e\u011e\u011f\u014d\u014d\u0143\u0143\u0143\u0143\u0143\u014e\u014e\u0143\u014f\u014f\u0139\u0139\u0139\u0139\u0139\u013e\u013e\u013e\u00ee\u00ee\u00ee\u013f\u0145\u0145 /\u0113&'' \u0102\u0102\u0149\u0149\u013a\u013a \u013a\u013a\u013a\u013a \u012b\u012b\u012b\u012b\u012b\u0134\u0134\u0134\u0 [...]
- "\u014a\u00ef\u00ef \u011c\u0115\u014b\u014b \u010a\u010a\u010a\u010b\u010b\u012e\u012e\u0136 \u014c\u014c\u014c\u014c\u014c \u0106\u0107\u011e\u011e\u011e\u014d\u014d\u014d\u014d\u014f\u014f\u014f\u014f\u014e\u014e\u014f\u014f\u0139\u0139\u0139\u0139\u0139\u013e\u013e\u013e\u013e\u00ee\u00ee\u013f\u0152\u0145 \u0153\u00d2\u0113&&' \u0149\u0149 \u013a\u013a \u013a\u013a\u0154\u0154\u013a\u013a\u013a \u012b\u012b\u012b\u012b\u0134\u0134\u012b\u0 [...]
- "\u0155\u014a\u014a\u014a \u0146\u0156\u014b\u014b\u012d \u010a\u010a\u010a\u012e\u012e\u0136\u0136 \u014c\u014c \u014c\u014c\u0157 \u0106\u0107\u011e\u011e\u011e\u014d\u014d\u014d\u014d\u014d\u0158\u0158\u0158\u0158\u014e\u014e\u014f\u014f\u0139\u0139\u0139\u0139\u0139\u013e\u013e\u013e\u00ee\u00ee\u013f\u013f\u0152\u0152 \u0153\u0159\u0113&&' \u0102\u0102 \u013a\u013a\u013a \u013a\u0154\u0154\u0154\u0154\u0154\u0154\u0154\u015a\u015a\u015a\u015a\u015a\u015a\u0 [...]
- "\u015d \u014a\u014a\u014a \u0146\u014b\u011c\u0115\u0115 \u010a\u012e\u012e\u0136\u0136 \u014c\u014c \u0157\u0157\u0106\u0106\u011e\u011e\u011e\u014d\u014d\u014d\u014d\u0158\u0158\u0158\u0158\u0158\u0158\u014e\u014e\u0158\u0158\u014f\u0139\u0139\u0139\u015e\u013e\u013e\u013e\u00ee\u00ee\u015f\u0160\u0152\u0152 \u0153\u0159/\u00c1\u00c1''\u0161 \u0102\u0102 \u013a\u013a\u013a\u013a\u013a\u013a \u0154\u0154\u0154\u015a\u015a\u015a\u015a\u015a\u015a\u015a\u015a\u [...]
- "\u015d\u0155 \u014a\u014a\u014a \u014b\u0115\u0115\u0115 \u012e\u012e\u0136\u0136 \u014c\u014c\u014c \u0157\u0106\u011e\u011e\u011e\u014d\u014d\u014d\u014d\u0158\u0158\u0158\u0158\u0158\u0158\u0158\u014e\u014e\u014e\u0158\u0158\u0158\u0158 \u015e\u013e\u013e\u00ee\u00ee\u013f\u015f\u015f\u0152\u0152 \u0153\u0153/\u0113&''\u0161 \u0164\u0164\u0164\u0102\u0164 \u013a\u013a\u013a\u0165\u0165 \u015a\u015a \u0166\u0166\u012b\u012b\u0134\u0162\u0134\u0134\u0134\ [...]
- "\u015d\u015d\u0155\u0155\u0168\u0168\u014a\u014a \u011c\u0115\u0115\u0115\u012d \u012e\u012e\u012e\u0136 \u014c\u014c\u014c \u0106\u0107\u011e\u011e\u011e\u014d\u014d\u0158\u0158\u0158\u0158\u0169\u0169\u0169\u0169\u0169\u014e\u014e\u014e\u0158\u0158\u0158\u0158\u0158\u016a\u016a\u016b\u016b\u013f\u016c\u015f\u015f\u0144\u0152\u0152 \u0153\u00d2\u0113\u0113&''\u0161\u0164\u0164\u0164\u0164\u0164\u0164\u0102\u0102 \u0165\u0165\u0165\u0165\u0165 \u015a\u015a\u015a\u0 [...]
- "\u015d\u015d\u0155\u0155\u0168\u0168\u014a\u014a\u014a \u0146\u0115\u011c\u0115\u012d \u012e\u012e\u0136 \u014c\u014c \u0106\u0107\u011e\u011e\u011e\u014d\u014d\u0158\u0158\u0158\u0169\u0169\u016e\u016e\u016e\u0169\u0169\u0169\u014e\u014e\u0158\u016f\u0158\u0158\u016a\u016a\u016a\u016a\u0170\u0171\u0171\u015f\u015f\u015f\u0152\u0152 \u0153\u00d2 \u0113&&'\u0161\u0161 \u0102\u0102\u0102 \u0165\u015a\u015a\u0166\u0166\u0166\u0166\u016d\u0162\u016d\u016d\u016d \ [...]
- "\u015d\u0155\u0155\u0168\u0168 \u014a\u014a\u014a \u0146\u011c\u0115\u0115\u0115 \u012e\u012e\u0136\u0136 \u0173\u014c \u0106\u0107\u011e\u011e\u011e\u014d\u014d\u014d\u0158\u0169\u0169\u016e\u016e\u016e\u016e\u016e\u016e\u016e \u014e\u014e\u016f\u016f\u016f\u0158\u016a\u016a\u016a\u016a\u0170\u0171\u0171\u0174\u015f\u015f\u0152\u0152 \u0159/ \u0113&&'\u0161\u0161\u0161 \u0102\u0102\u0102\u0102\u015a\u015a\u015a\u0166\u0166\u0166\u0166\u0162\u016d\u016d\u0175\u016 [...]
- "\u015d\u0176\u0168\u0168 \u014a\u014a\u014a \u011c\u0115\u0115\u0115\u012e\u0136\u0136 \u0173\u0173\u0177\u0177 \u0106\u0106\u011e\u011e\u011e\u014d\u014d\u014d\u0158\u0169\u0169\u016e\u016e\u0178\u0178\u0178 \u016e\u016e\u0179\u017a\u017a\u017a\u016f\u016f\u016f\u016a\u016a\u016a\u0170\u0171\u0171\u0171\u0174\u015f\u015f\u015f\u0152\u0159\u0159/ \u00c1&''\u0161\u0161 \u0102\u017b\u017b\u0102\u0166\u0166\u0166\u0166\u016d\u0162\u016d\u016d\u0175 \u0167\u0167\u0 [...]
- "\u017d\u017d\u0168\u0176\u0176 \u014a\u014a\u014a \u0146\u0115\u0115\u012d\u0136 \u0173\u0173\u0173\u0177\u0177 \u0106\u0107\u011e\u011e\u011e\u014d\u014d\u0158\u0169\u0169\u016e\u016e\u0178\u0178\u0178\u0178\u0178\u0178 \u0179\u017a\u017a\u017a\u016f\u016f\u016f\u016a\u016a\u016a\u0170\u0171\u0171\u0171\u0174\u015f\u015f\u015f\u0152\u017e\u0159\u017f\u017e\u0180\u0113&&' \u0161\u0161 \u017b\u017b\u017b\u0166\u0162\u016d\u016d\u016d\u016d\u0175\u0167\u0167\u0167 [...]
- "\u017d\u017d\u0168\u0176\u0176 \u014a\u014a\u014a \u0146\u0146\u012d \u0181\u0173\u0177\u0177 \u0107\u011e\u011e\u011e\u014d\u014d\u0158\u0158\u0182\u0182\u0183\u0183\u0183\u0183\u0183\u0183\u0178\u0178\u0178\u016e\u016e\u017a\u017a\u016f\u016f\u016a\u016a\u016a\u016a\u0170\u0158\u0171\u0171\u0174\u0174\u015f\u015f\u0152\u0159\u0159\u017f\u0180\u0180\u0113\u0113&''\u0161\u0161 \u0166\u0166\u0166\u0166\u017b\u0184\u0162\u016d\u0175\u0175\u0163\u0167\u0167\u0167\ [...]
- "\u0186\u0168 \u014a\u014a\u014a \u012e\u012e\u0136\u0136 \u0181\u0181\u0177\u0177 \u0107\u011e\u011e\u011e\u014d\u014d\u014d\u0158\u0182\u0182\u0182\u0183\u0183\u0183\u0183\u0183\u0183\u0183\u0183\u0178\u0178\u016e\u017a\u017a\u017a\u016f\u016a\u016a\u016a\u016a\u0170\u0158\u0171\u0171\u0174\u0174\u0187\u0187 \u0159\u0159\u00d2 \u0180\u0113&&' \u0161\u0161 \u0166\u0166\u0166\u0166\u0188\u016d\u016d\u0175\u017b\u017b\u017b \u0163\u0163\u0163\u0163\u0163\u017c\u01 [...]
- "\u0186 \u0189\u0189\u014a\u014a \u012e\u012e\u0136\u0136 \u018a\u018a\u018a\u018a\u018a \u0107\u011e\u011e\u011e\u014d\u014d\u014d\u0158\u0182\u0182\u0182\u0182 \u0183\u0183\u0183\u0183\u0183\u017a\u017a\u017a\u016f\u018b\u016a\u016a\u0170\u0170\u0158\u0171\u0171\u0171\u0187\u0187\u0187 \u0159\u0159\u00d2\u00d2 \u0180\u0113\u00c1\u00c1''\u0161\u0161\u0166\u0166\u0166\u0166\u0162\u0162\u0162\u016d\u0175\u0175 \u017b\u017b\u018c \u0163\u0163\u0163\u0163\u018d\u0 [...]
- " \u0189\u0189\u0189\u014a\u014a\u014a \u012e\u012e\u0136\u0136 \u018a\u018f\u018f\u018f\u018f\u018f\u018f\u018f \u0107\u011e\u011e\u011e\u014d\u014d\u0158\u0182\u0182\u0182\u0182\u0190 \u0183\u0183\u0183\u017a\u017a\u016f\u018b\u0191\u0191\u0191\u0191\u0158\u0158\u0171\u0171\u0187\u0187\u0187 \u0159\u0159\u017f\u00d2 \u0180\u0113&&'\u0166\u0166\u0166\u0166\u0192\u016d\u016d\u016d\u016d\u0175\u0175 \u018d\u018d\u018d\u018d \u013b\u013b \u0150\u0150\u [...]
- " \u0193\u0193\u0189\u0189 \u014a\u014a\u014a\u012e\u012e\u0136 \u018a\u018f\u018f\u018f\u018f\u018f\u018f\u018f\u018f\u018f \u0107\u011e\u011e\u011e\u014d\u014d\u0158\u0158\u0182\u0182\u0182\u0182\u0190\u0190\u0194\u0194\u0194\u0194\u0194 \u0183\u0195\u017a\u017a\u017a\u018b\u0191\u0191\u0191\u0191\u0158\u0158\u0171\u0171\u0187\u0187\u0196 \u0159\u0159\u017f\u00d2 \u0113\u0113\u0197\u0198\u0198\u0166\u0192\u0162\u016d\u016d\u016d\u0175\u0175\u0175 \u018d\u018 [...]
- "\u0199 \u0193\u0193\u019a\u019b\u019b\u019b \u012e\u012e\u0136\u0136 \u018f\u018f\u018f\u018f\u019c\u019c \u018f\u018f\u018f\u018f\u018f\u011e\u011e\u011e\u014d\u014d\u014d\u0158\u0182\u0182\u0182 \u019d\u019d\u019d\u0194\u0194\u0194\u0194\u0194 \u019e\u019e\u019e\u019f\u019f\u017a\u017a\u018b\u0191\u0191\u0191\u0191\u0158\u0158\u0171\u0187\u0187\u0187 \u0159\u0159 \u017f\u00d2 \u0166\u01a0\u01a0\u01a1\u0198\u016d\u0162\u016d\u016d\u0175\u0175\u0175 \u018d\u018d [...]
- "\u0199\u01a3 \u0189\u019a\u019a\u019b\u019b\u019b\u019b\u019b \u0136\u01a4\u01a5\u01a5 \u018f\u018f\u018f\u019c\u019c\u019c\u019c\u019c \u018f\u018f\u011e\u011e\u011e\u014d\u014d\u014d\u01a6\u0182\u0182\u0182 \u0194\u01a7\u0194\u019d\u019d\u019d\u019d \u0194\u019e\u019e\u019e \u019f\u017a\u017a\u018b\u0191\u0191\u0191\u0191\u0158\u0158\u0171\u0187\u0187\u0187 \u0159\u0159 \u017f\u00d2 \u0166\u0166\u0166\u01a0\u01a0\u01a1\u016d\u016d\u016d\u0175\u0175\u0175 \u018d\u018d\u [...]
- "\u01a3\u01a3\u01a9 \u0189\u01aa\u01aa \u019b\u019b \u01ab\u01a4\u01a5\u01a5\u018f\u018f\u018f\u019c\u019c \u01ac\u019c\u019c\u019c\u01ad\u011e\u011e\u011e\u014d\u014d\u014d\u01ae\u01a6\u0182\u0182 \u0194\u0194\u01a7\u01a7\u01a7 \u019d\u019d\u019d\u019d \u019e\u0194 \u019f\u017a\u017a\u018b\u018b\u0191\u0191\u0191\u0158\u0158\u0171\u0187\u0187 \u0159\u0159 \u01af\u01af\u01b0\u01b1\u0166\u0166\u0162\u016d\u0162\u0197\u0198\u0198\u0175\u0175 \u018d\u018d\u018d\u018d\u018d\ [...]
- "\u0155\u0155\u01a9\u0199\u0199\u01b2 \u01b3\u01b3\u0189\u019b \u01b4\u01b5\u018f\u018f\u018f\u019c\u019c \u01ac\u01ac\u01ac\u019c\u019c\u0107\u011e\u011e\u011e\u014d\u014d\u014d\u01a6\u01a6\u01a6 \u0194\u01b6\u01b6\u01b6\u01a7\u01a7\u01a7\u01a7 \u019d\u019d\u019d\u0194\u0194 \u019f\u019f\u017a\u017a\u018b\u0191\u0191\u0191\u01b7\u01b7\u0187\u0187\u0187 \u0159\u0159 \u01b1\u01af\u01b0\u01b8\u01b9\u0162\u016d\u016d\u01a0\u0197\u0197\u0198\u0198\u0198 \u018d\u018d\u018d\u01 [...]
- " \u0155\u0155\u0199\u01ba\u01ba \u0189\u01b3\u01b3 \u01ab\u018f\u018f\u01bb\u01bb\u019c\u01ac\u01ac\u01ac\u01ac\u01ac\u0107\u011e\u011e\u011e\u01bc\u01bc\u01bc\u01bd\u01bd\u01bd \u01be\u01be\u0194\u01b6\u01b6\u01b6 \u01a7\u01a7\u01a7\u01a7\u019d\u019d\u019d\u019d \u019f\u017a\u017a\u018b\u0191\u0191\u01b7\u01b7\u01b7\u01b7\u0187\u0187\u0159\u0159\u01b1\u01b1\u01b1\u01af\u01af\u01bf\u01b9\u016d\u016d\u0175\u0175\u01a0\u01a1\u01a1\u0198\u01c0 \u018d\u018d\u018d\u018d\u018d\ [...]
- " \u0155 \u01ba\u01ba\u01ba\u0189\u0189\u019b\u019b \u01ab\u01ab\u01c2\u01bb\u01bb\u01bb\u01bb\u01ac\u01ac \u0107\u011e\u011e\u011e\u01bc\u01bc\u01bc\u01ae\u01bd\u01bd\u01bd\u0194\u01be\u01be\u01be \u01b6\u01b6\u01b6 \u01a7\u01a7\u01a7\u01a7\u0194\u0194 \u019f\u019f\u017a\u018b\u0191\u01b7\u01b7\u01b7\u01b7\u01c3\u01c3\u0159\u0159\u01b1\u01b1\u01b1\u01bf\u01c4\u01bf\u01c5\u0175\u0175\u0175\u0175\u0175\u01a1\u01c6\u01c7\u01c0\u01c0\u018d\u018d\u018d\u018d\u018d \u018 [...]
- "\u01c9 \u0155 \u01b2\u01ba\u0189\u01ca\u019b\u019b \u01ab\u01ab\u01cb\u01cc\u01cd\u01bb\u01bb\u01bb\u01bb \u011e\u011e\u011e\u01bc\u01bc\u01bc\u01bc\u01a6\u01a6\u01bd\u01bd\u01bd\u01ce \u01be\u01be\u01be \u01b6\u01b6\u01b6\u01b6 \u01a7\u01a7\u01a7 \u019f\u019f\u017a\u01b7\u01b7\u01b7\u01b7\u01cf\u01cf\u01c3\u0159\u0159\u01b1\u01c4\u01bf\u01bf\u01d0\u01d0\u01b0\u0175\u01d1\u0175\u0175 \u01c6\u01c6\u01c7\u01c0\u01c0 \u018d\u0150\u01c8\u0151\u0151\u015b\u01d2\u01d [...]
- "\u01c9\u01c9\u0155 \u01b2\u01b2 \u01ca\u01ca\u01ca \u01ab\u01ab\u01cb\u01cc\u01cc\u01cd\u01cd\u01bb\u01bb\u01bb\u01bb\u0107\u011e\u011e\u011e\u01bc\u01bc\u01bc\u01ae\u01a6\u01d5\u01d5\u01bd\u01bd\u01bd\u01ce\u01ce\u01be\u01be\u01be\u01be \u01b6\u01b6\u01b6\u0194\u0194\u01a7 \u019f\u019f\u01b7\u01b7\u01b7\u01d6\u01d7\u01d7\u01d8\u01b1\u0159\u01b1\u01c4\u01bf\u01bf\u01d9\u0175\u01af\u01b0\u0175\u0175 \u01c6\u01c6\u01c0\u01c0\u018d \u018d\u0150\u0150\u0150\u0151\u01 [...]
- "\u01c9\u01c9\u0155 \u01b2\u01b2 \u01ca\u01ca\u019b \u01dc\u01dc\u01cb\u01cc\u01cc\u01cd\u01dd\u01cb\u01bb\u01bb\u01bb\u011e\u011e\u011e\u01bc\u01bc\u01bc\u01ae\u01de\u01df\u01d5\u01d5\u01e0\u01bd\u01bd\u01ce\u01ce\u01ce\u01ce\u01be\u01be\u01be\u0194\u0194\u01b6\u0194 \u01e1\u01e1\u01e1\u01b7\u01b7\u01d6\u01d7\u0159\u0159\u01d7\u01b1\u01bf\u01e2\u01e2\u01d1\u01d1\u0175\u0175\u0175\u01b0\u01b0\u01b0 \u01c6\u01e3\u01e3\u01c0\u01c0\u018d \u018d\u0150\u0151\u0151\u0150\ [...]
- "\u01c9\u01c9\u01c9\u01c9\u01b2\u01b2\u01e5 \u019b\u019b \u01ab\u01ab\u01dc\u01cb\u01cc\u01cd\u01cd\u01dd\u01e6\u01cb\u01bb\u011e\u011e\u011e\u01bc\u01bc\u01bc\u01ae\u01de\u01de\u01df\u01df\u01d5\u01de\u01bd\u01bd\u01bd\u0194\u01ce\u01ce\u0194\u0194\u01be\u0194\u0194 \u01e7\u01e8\u01e1\u01e1\u01e1\u01e1\u01b7\u01b7\u01e9\u0159\u0159\u01ea\u01bf\u01bf\u01bf\u01e2\u01d0\u0175\u0175\u0175\u0175 \u01eb\u01b0 \u01c6\u01c6\u01c7\u01c0\u01c0\u01ec\u018d\u0150\u0150\u0150\u01 [...]
- " \u01c9\u01c9\u01c9\u01c9\u01b2\u01e5\u01e5\u01e5\u019b\u019b \u01ab\u01ab\u01c2\u01ed\u01cc\u01cd\u01ee\u01dd\u01e6\u01cb\u011e\u011e\u011e\u01bc\u01bc\u01bc\u01bc\u01de\u01de\u01de\u01de\u01de\u01de\u01de\u01de\u01bd\u01bd\u0194\u0194 \u01e7\u01e7\u01e7\u01e8\u01e7\u01e8\u01e8\u01e8\u01e1\u01e1\u01e1\u01e1\u0159\u0159\u01b1\u01b1\u01ea\u01ef\u01ef\u01d1\u01d1\u01d8\u0175\u0175\u0175 \u01f0\u01f0 \u01c6\u01c6\u01c7\u01c0\u01ec\u0151\u0151\u015b\u0151\u015c\u015c\u [...]
- "\u0159 \u01c9\u01c9\u01c9\u01c9\u01c9\u01e5\u01e5\u019b \u01ab\u01c2\u01c2\u01ed\u01ed\u01ee\u01f1\u01e6\u01cb\u011e\u011e\u011e\u01bc\u01bc\u01bc\u01bc\u0169\u01de\u01de\u01de\u01de\u01de\u01de\u01de\u01de\u01bd\u01bd\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01e1\u01e1\u0159\u0159\u0159\u0159\u01e9\u01bf\u01bf\u0162\u01d7\u0175\u0175\u0175\u0175 \u01f2\u01f2\u01f2 \u01eb\u01f0 \u01ec\u01f3\u01f3\u01f3\u01f3\u015c\u015c [...]
- "\u0159\u0159 \u01c9\u01c9\u01c9\u01c9\u01c9\u01c9\u019b\u01e5\u01e5\u01e5 \u01ab\u01ab\u01c2\u01ed\u01ed\u01ee\u01ee\u01f1\u01e6\u01cb\u011e\u011e\u011e\u01bc\u01bc\u01bc\u01ae\u0169\u01de\u01de\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01bd\u01bd\u01e7\u01e7\u01e7\u01e7\u01e7\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u0159\u0159\u01b1\u01b1\u01ea\u01ef\u01bf\u01f4\u01f4\u01d7\u01d0\u0175\u01d7\u01c3\u01f5\u01f2\u01f6\u01f6 \u01f0\u01f0 \u01f7\u01f7\u01f8\u01f9 [...]
- "\u01b1\u0159\u0159\u0159\u01fc\u01c9\u01c9\u01c9\u01fd\u01fd\u01fd\u01e5\u01e5\u01e5\u01e5\u01e5 \u01ab\u01ab\u01ed\u01ed\u01ee\u01ee\u01f1\u01f1\u01fe\u011e\u011e\u011e\u01bc\u01bc\u01bc\u01bc\u0169\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01ff\u01ff\u01e7\u01e7\u01e7\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u0159\u0159\u0159\u0159\u01b1\u01bf\u01ef\u0162\u01f4\u0175\u0175\u01d6\u01d7\u01d7\u01d8\u01d8\u0200\u01f2 \u01f6\u01f6 \u01f0\u01f0 \u01f7 [...]
- "\u0201\u0201\u01b1\u01fc\u01fc\u0202\u0202\u01c9\u01fd\u01fd\u01fd\u01fd\u01fd\u01fd\u01e5\u01e5\u01ab\u01ab\u01c2\u01ed\u01ee\u01ee\u01f1\u01f1\u01fe\u011e\u011e\u011e\u01bc\u01bc\u01bc\u01bc\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01ff\u01ff\u01e7\u01e7\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u0159\u01b1\u01b1\u01b1\u01ea\u01bf\u01bf\u01bf\u0162\u0175\u0175\u0175\u01e9\u01d6\u01d6\u0203\u0203\u0204\u0200\u01f5 \u01eb\u01f0 \u01f7\u01f7\ [...]
- "\u0209\u0201\u01b1\u01b1\u0159\u0159\u0159\u0202\u0202\u020a\u01fd\u01fd\u01fd\u01fd\u01fd\u01fd\u01ab\u01ab\u01fe\u01ee\u01ee\u01f1\u01f1\u01fe\u011e\u011e\u011e\u01bc\u01bc\u01bc\u01bc\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u020b\u020c\u020c\u020c\u01ff\u01ff\u01ff\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8\u01e8 \u0159\u0159\u0159\u0159\u01ea\u01bf\u01ef\u0162\u01f4\u0175\u0175\u0175\u0175 \u020d\u0203\u0203\u0203\u0203\u0204\u0200\u0200 \u01eb\u01f0 \u01f7\u01f8\u01f8\u01f8\ [...]
- "\u0209\u0209\u0201\u01fc\u01b1\u0159\u0159\u0159\u0202\u0202\u0202\u020a\u01fd\u01fd\u01fd\u01fd\u01fd\u01fd\u01fd\u01ee\u01f1\u01f1\u01fe\u01fe\u011e\u011e\u011e\u01bc\u01bc\u01bc\u01e7\u01e7\u01e7\u01e7\u01e7\u01e7\u0210\u0210\u020c\u020c\u020c\u0211\u0212\u01ff\u01ff\u01ff\u01ff\u01e8\u01e8\u01e8\u01e8 \u0159\u01b1\u0159\u01b1\u01ef\u01bf\u01bf\u01bf\u0162\u0175\u0175\u0175\u0175 \u020d\u020d\u0203\u0203\u0203\u0203\u0204\u0200\u0200 \u0213\u01eb\u01f0\u01f7\u01f7\u01f8\u01f8\u0 [...]
- "\u0215\u0216\u0209\u0209\u0201\u0201\u01b1\u01b1\u0159\u0159\u0217\u0217 \u020a\u020a\u01fd\u01fd\u01fd\u01fd\u01fd\u01fd\u01fe\u01fe\u011e\u011e\u011e\u01bc\u01bc\u01bc\u01bc\u01e7\u01e7\u01e7\u01e7\u0218\u0219\u020c\u020c\u020c\u021a\u020b\u0211\u0212\u0212\u01ff\u01ff\u01ff\u01e8\u01e8 \u0159\u0159\u0159\u01b1\u01ea\u01ea\u01ef\u01f4\u01f4\u01f4\u0175\u0175\u0175 \u020d\u0203\u0203\u0203\u0203\u0204\u0204\u0200 \u021b\u0213\u0213\u01f8\u01f8\u0206\u0206\u0206\u0206 \u0214\u [...]
- "\u0215\u0215\u0216\u0216\u0209\u0201\u0201\u01b1\u01b1\u0159\u0217\u0217 \u020a\u021d\u021d\u01fd\u01fd\u01fd\u01fd\u01fd\u01fd\u011e\u01bc\u01bc\u01bc\u01bc\u01e7\u01e7\u01e7\u021e\u021e\u020c\u020c\u020c\u0210\u0210\u021a\u020b\u020b\u0211\u0212\u0212\u01e8\u01ff\u01e8\u0159\u0159\u0159\u0159\u01b1\u01bf\u01bf\u01bf\u0162\u01f4\u0175\u0175\u0175 \u020d\u020d\u0203\u0203\u0203\u0203\u0204\u0200\u0196\u021f\u021f\u021b\u021b\u01f8\u0206\u0206\u0206 \u0220\u0220 \u0221\u0214\ [...]
- " \u0215\u0215\u0215\u0216\u0209\u0216\u0209\u0201\u0217\u0217\u01b1\u0159\u0159\u0159 \u020a\u020a\u020a\u01fd\u01fd\u01fd\u01fd\u0223\u0223\u01bc\u01bc\u01e7\u01e7\u01e7\u0224\u020c\u020c\u020c\u0218\u0219\u0210\u0210\u021a\u021a\u020b\u0211\u0211 \u0159\u0159\u0159\u01b1\u01ea\u01ea\u01bf\u01bf\u01f4\u01f4\u0175\u0175\u0175 \u0225\u020d\u0203\u0203\u0203\u0203\u0226\u0226\u0226\u0227\u0227\u021b\u0228\u0206\u0206 \u0220\u0220\u0220\u0220 \u0221\u0221\u0214\u0214\u021c \u [...]
- "\u0229\u0229\u0229\u0215\u0215\u0215\u0216\u0209\u0201\u0201\u0201\u01b1\u01b1\u0159\u0159\u0159\u0159 \u020a\u011e\u011e\u0223\u0223\u0223\u0223\u01e7\u01e7\u01e7\u01e7\u020c\u020c\u021e\u021e\u0218\u0219\u0219\u0210\u0210\u021a\u022a \u0159\u0159\u0159\u0159\u01b1\u01ea\u01ea\u01f4\u01f4\u01f4\u0175\u0175\u0175 \u0225\u0225\u022b\u0225\u0225\u020d\u020d\u0226\u0226\u0226\u022c\u022c\u022c\u022c\u022d\u022e\u022e \u0220\u0220\u0220\u0220 \u0221\u022f\u022f\u022f\u0222 \ [...]
- "\u0229\u0229\u0229\u0229\u0215\u0215\u0215\u0215\u0216\u0217\u0216\u0209\u0209\u0201\u01b1\u0159\u01b1\u0159\u0159\u0159\u0231\u0231\u0223\u0223\u0223\u0223\u01e7\u01e7\u01e7\u01e7 \u0224\u0224\u021e\u0218\u0218\u0219\u0210\u0210 \u0159\u0159\u01b1\u01b1\u01ea\u01ea\u01ea\u01f4\u01f4\u0175\u0175\u0175\u0175 \u0225\u0225\u0225\u022b\u0232\u0232\u0232\u0232\u0226\u0226\u022c\u022c\u022c\u0233\u0233\u0234\u01f0\u022e\u0220\u0220\u0220 \u022f\u022f\u022f\u0222\u0235\u0235\u [...]
- " \u0215\u0215\u0237\u0238\u0216\u0216\u0209\u0201\u0201\u0201\u01b1\u01b1\u0159\u0159\u0231\u0239\u0239\u023a\u023a\u023b\u01e7\u01e7\u023c \u0224\u0224\u021e\u021e\u0218\u022a \u0159\u0159\u0159\u0159\u01b1\u01ea\u01ea\u01f4\u01f4\u01f4\u0175\u0175\u0175 \u023d\u023d\u023d\u023d\u023d\u023d\u023d\u023d\u023e\u023e\u0232\u0232\u022c\u022c\u022c\u023f\u0233\u0233\u0233\u0234\u0240\u01f0\u0220\u0220 \u0221\u0221\u0241 \u0235\u0241\u0241\u0230\u0236\u0236\u0236\u01c6\ [...]
- "\u0242 \u0243\u0243\u0243\u0243\u0237\u0244\u0238\u0238\u0238\u0238\u0216\u0209\u0216\u0209\u0209\u0201\u0201\u01b1\u0159\u0159\u0159\u023a\u023b\u01e7\u01e7\u023c\u023c \u023c\u0224\u021e\u022a \u0159\u0159\u01b1\u0159\u01ea\u01ea\u01ea\u01f4\u01f4\u0175\u0175\u0175\u0175 \u023d\u023d\u023d\u023d\u023d\u023d\u023d\u023d\u023d\u023d\u023d\u023d\u023d\u023d\u022b\u0209\u0209\u0209\u0245\u022c\u0246\u0246\u0246\u0234\u0204\u0204\u0240\u0240\u0220\u0220 \u0241\u0241\u0241\u02 [...]
- "\u0242\u0247\u0243\u0243\u0243\u0243 \u0237\u0237\u0248 \u0238\u0238\u0238\u0238\u0238\u0216\u0209\u0231\u0231\u0216\u0209\u01b1\u0159\u023a\u01b1\u0159\u0159\u023c\u023c\u023c\u023c\u023c\u023c\u0159\u0159\u0159\u0159\u0159\u0159\u01b1\u01ea\u01ea\u01f4\u01f4\u0175\u0175\u0175\u0175 \u023d\u023d\u023d\u023d\u023d\u023d\u023d\u023d \u0209\u0209\u0209\u0245\u0216\u0216\u0249\u0246\u024a\u024a\u0234\u0203\u0203\u0240\u0240\u024b\u024c \u024c \u0235\u0235\u0235 \u0236\u [...]
- "\u0247\u0247\u0242\u0242 \u0237\u0237\u024d\u024d \u0238\u0238\u024e\u024f\u0231\u0239\u023a\u0216\u0209\u0201\u0201\u01b1\u0159\u0159\u0159\u0159\u01b1\u0159\u0159\u0159\u0159\u01b1\u0159\u01b1\u01ea\u01ea\u01f4\u01f4\u01f4\u0175\u0175\u0175\u0175\u023d\u023d\u023d\u023d\u023d\u023d \u0209\u0209\u0209\u0216\u0209\u0209\u0245\u0245\u0250\u0250\u0249\u024a\u0234\u0234\u0203\u0203\u0203\u0240\u024b\u0200\u0200\u024c\u024c\u024c\u024c \u0251\u0251\u0251\u0251\u0251\u0251\u02 [...]
- "\u0247\u0247\u0242\u0242\u0242 \u0248\u024d\u024d \u0253\u0253\u024f\u024f\u0231\u0239\u023a\u023a\u023a\u023a\u0216\u0209\u0209\u0209\u01b1\u0175\u0175\u0175\u01b1\u01b1\u01b1\u01ea\u01ea\u01ea\u01ea\u01f4\u0175\u0175\u0175\u0175\u0175\u023d\u023d\u023d\u023d\u023d \u0209\u0209\u0209\u0209\u0209\u0209\u0245\u0245\u0245\u0254\u0254\u0254\u0255\u0256\u0257\u0258\u0234\u020d\u0203\u0203\u0203\u0240\u0240\u0204\u0200\u024c\u024c \u0251\u0251\u0251\u0251\u0251\u0251\u0251\u0251\ [...]
- "\u0247 \u0242\u0242\u0242 \u0248\u0248\u024d\u024d \u0253\u0253\u0253\u024f\u0259\u0259\u023a\u023a\u023a\u023a\u023b\u023b \u0216\u0209\u0216\u0209\u0175\u0209\u0175\u0175\u0175\u0175\u0175\u0175\u0175\u0175\u0175\u025a\u025a\u023d\u023d\u023d \u0209\u0209\u0209\u0209\u0209\u0209\u0209\u0209\u0245\u0245\u0216\u0245\u0245\u0245\u0254\u025b\u025b\u025c\u0249\u025d\u0257\u0258\u0258\u025e\u020d\u020d\u0203\u0240\u0240\u024b\u0204\u0200\u0200\u0251\u0251\u0251\u0251\u0251\u025f\u025 [...]
- " \u0242\u0242\u0242 \u024d\u024d \u0253\u0253\u0253\u024f\u0259\u0259\u0261\u0261\u023a\u023a\u023b\u0262\u0263 \u0216\u0264\u0264\u0264\u0216\u0209\u0209\u0209\u0209\u0216\u0209\u025a\u025a\u025a\u0216\u0209\u0209\u0209\u0209\u0216\u0209\u0209\u0245\u0245\u0245\u0216\u0245\u0245\u0245\u0245\u0245\u025b\u025b\u0254\u0254\u0254\u025c\u0249\u025d\u0265\u0265\u0258\u025e\u025e\u025e\u020d\u0203\u0240\u024b\u0203\u0204\u0266\u0267\u0267\u0268\u0269\u026a\u026a\u025f\u025f\u025f\u0 [...]
- " \u026c\u0242\u0242\u0242\u024d\u024d\u0253\u0253\u0253\u024f\u024f\u0259\u0261\u0261\u0261\u0261\u026d\u026d\u0263\u0263 \u0264\u0264\u0264\u0264\u026e\u026e \u0216\u026f\u026f\u026f\u0216\u0216\u0209\u0245\u0216\u0216\u0245\u0245\u0245\u0245\u0245\u0245\u0245\u0245\u0245\u0245 \u025b\u025b\u0270\u0270\u0254\u0249\u025c\u0271\u0272\u0265\u0265\u0265\u025e\u025e\u025e \u0240\u0240\u0240\u024b\u0266\u0267\u0267\u0267\u0267\u0268\u0273\u026a \u025f\u025f\u025f\u025f\ [...]
- " \u026c\u026c\u026c\u0242\u0242\u0242\u024d\u0253\u0253\u024f\u024f\u0259\u0261\u0261\u0261\u0261\u0261\u026d \u0263\u0263 \u0264\u0264\u0264\u026e\u026e\u026e \u026f\u026f\u026f\u026f\u0245\u0245\u0245\u0245\u0245\u0245\u0245\u0245\u0245 \u025b\u0270\u0270\u0270\u0270\u0274\u025c\u0249\u0249\u0272\u0265\u0265\u0265\u025e\u025e\u025e \u0275\u024b\u024b\u0266\u0267\u0267\u0267\u0268\u0204\u0200\u0273\u0273 \u025f\u025f\u025f \u0251\u0251\u0251\u01c6\u01e3\u [...]
- " \u026c\u026c \u0242\u0242\u0253\u024f\u024f\u0259\u0259\u0261\u0261\u0261\u0261\u026d\u026d \u0263\u0276\u0264\u0264\u0264\u026e\u026e \u026f\u026f\u0245\u0245\u0245\u0245\u0245\u0245\u0245 \u025b\u025b\u0270\u0270\u0274\u0274\u0274\u025c\u0249\u025d\u0257\u0265\u0265\u0258\u025e\u025e \u0275\u0275\u0266\u0267\u0267\u0268\u0268\u0203\u0204\u0200\u0200\u0273\u0273 \u025f\u025f\u025f\u025f \u0251\u0251\u01c6\u01c6\u01e3\u01c7\u01d3\u01d3 \u0207\u0 [...]
- " \u026c\u026c \u0277\u0242\u0242\u0278\u0259\u0259\u0261\u0261\u0261\u0261\u026d\u026d \u0264\u0276\u026e\u026e\u026e \u026f\u0245\u0245\u0245\u0245\u0245\u0245 \u0270\u0270\u0270\u0274\u0274\u0274\u025c\u0255\u0256\u0257\u0265\u0265\u0258\u025e\u025e \u0275\u0275\u0279\u0267\u0267\u0268\u0203\u0203\u0203\u0203\u0204\u0200\u0273\u0273\u0273\u0273\u0273\u0273\u0273\u0273 \u025f\u025f\u025f \u0251\u0251\u01c6\u01c7\u01c0\u01d3\u01d3 \u01d4\u01d4 [...]
- " \u026c\u026c \u0277\u0277 \u0278\u0278\u0259\u0261\u0261\u0261\u0261\u026d\u026d \u0264\u0264\u026e\u026e\u027c\u026f\u026f\u026f\u0245\u0245\u0245 \u027d\u0274\u0274\u0274\u025c\u025c\u0249\u0256\u0257\u0265\u0265\u0258\u025e\u025e \u0275\u027e\u0279\u0279\u0268\u0268\u020d\u0203\u0203\u0203\u0203\u0204\u0204\u0200\u027f\u0273\u0273\u0273\u0273\u0273\u0273\u0273\u0273\u0273\u0273\u0273\u0273 \u025f\u025f\u025f \u0251\u0251\u01c6\u01c7\u01c0\u01d3 [...]
- " \u026c\u026c\u026c \u0277\u0277\u0278\u0278\u0259\u0261\u0261\u0261\u0261\u0282\u0282 \u0264\u0264\u0264\u026e\u0283\u0283\u0245\u0245\u0245 \u0284\u027d\u027d\u0274\u0274\u025c\u025c\u025d\u025d\u0257\u0265\u0265\u0258\u025e\u025e \u0275\u0275\u0275\u0279\u0285\u0285\u0286\u0286\u020d\u0203\u0203\u0203\u0203\u0204\u0200\u0200 \u0287\u0273\u0273\u0273\u0273\u0273\u0273\u0273\u0273\u0273\u0273\u0273 \u025f\u025f\u025f \u0251\u01c6\u01c6\u01c7\u01c7\u [...]
- " \u026c\u026c \u0278\u0278\u0259\u0261\u0261\u0261\u0261\u0261\u0282\u0282 \u0264\u026e\u026e\u0289\u0289\u0283\u0283\u027c \u0284\u027d\u0274\u0274\u0274\u025c\u025c\u025d\u0272\u0265\u0265\u0265\u0258\u025e\u025e \u0275\u0275\u0275\u0279 \u0285\u0285\u0286 \u020d\u020d\u0203\u0203\u0203\u0203\u0204\u0200\u028a \u0287 \u0273\u0273\u0273\u0273\u0273\u0273\u0273\u0273\u025f\u025f \u0251\u01c6\u01c6\u01c7\u01d3\u01d3\u028b\u028b\u0288\u0280\u0280 [...]
- "\u026c\u026c \u0278\u0278\u0259\u0259\u0261\u0261\u0261\u0261\u0282\u0282 \u0264\u026e\u026e\u0289\u028d\u0289\u027c\u028e\u028e\u028e \u0284\u027d\u0274\u0274\u025c\u025c\u0249\u0271\u0272\u0265\u0265\u0265\u025e\u025e\u025e \u0275\u027e\u0279\u0279 \u028f\u028f\u0286 \u0290\u020d\u0203\u0203\u0203\u0203\u0204\u0200\u028a \u0287\u0287 \u0291\u0291 \u0273\u0273\u025f\u025f \u0251\u01c6\u0292\u01c7\u01d3\u0293\u0293\u0288\u0280\u0280\u0280\u02 [...]
- "\u026c \u0278\u0259\u0259\u0261\u0261\u0261\u0261\u0294\u0282 \u0295\u0295\u026e\u028d\u028d\u028d\u028d \u027c\u028e\u028e\u028e \u0284\u027d\u0274\u0274\u025c\u025c\u0249\u025d\u0272\u0265\u0265\u0258\u025e\u025e \u0275\u0275\u0279\u0279 \u028f\u028f\u0286\u0286 \u020d\u020d\u0203\u0203\u0203\u0203\u0204\u0200 \u0287\u0287 \u0291\u0291 \u025f\u025f\u025f \u0251\u0292\u0292\u0296\u0293\u0293\u0293\u0297\u0280 \u028c\u028c\u028c\u028c [...]
- "\u026c \u0278\u0278\u0259\u0261\u0261\u0261\u0261\u0294\u0294 \u0295\u0295\u0298\u0289\u0289\u028d \u028e\u028e\u028e \u0284\u027d\u0274\u0274\u025c\u025c\u025d\u025d\u0257\u0265\u0265\u0258\u025e\u025e \u0275\u0275\u0275\u0279\u0279 \u028f\u028f\u0286\u0286 \u0290\u020d\u020d\u0203\u0203\u0203\u0204\u0204\u0299 \u0287\u0287 \u0291\u0291 \u025f\u025f\u029a\u028b\u0293\u0293\u029b\u0296\u0293\u0293\u029c\u029c \u028c\u028c\u028c\u028 [...]
- " \u0278\u0278\u0259\u0261\u0261\u0261\u0261\u0294\u0294 \u029d\u0298\u0289\u0289\u0289\u028d \u029e\u029e\u028e\u028e\u028e \u0284\u027d\u0274\u0274\u0274\u025c\u0249\u0271\u0256\u0257\u0265\u0265\u0258\u025e\u025e \u0275\u027e\u0275\u0279\u0279\u028f\u028f\u028f\u0286\u0286\u0286 \u0290\u029f\u0203\u0203\u0203\u0203\u0204\u02a0 \u0287\u0287 \u0291\u0291 \u02a1\u028b\u0293\u0293\u0293\u0293\u0292\u0292\u01c0\u01c0\u029c \u02a2 \u028c [...]
- " \u0278\u0278\u0259\u0261\u0261\u0261\u0261\u0261\u0294\u0282 \u02a3\u029d\u029d\u028d\u028d\u028d \u029e\u029e\u029e \u028e\u028e \u0284\u027d\u027d\u0274\u0274\u025c\u025c\u0249\u0256\u0257\u0265\u0265\u0258\u025e\u025e \u0275\u0275\u0279\u0279 \u028f\u028f\u028f \u0286\u0286 \u0290\u029f\u029f\u0203\u0203\u0203\u0204\u02a0 \u0287\u0287 \u0291\u0291 \u02a1\u02a1\u02a1\u02a1\u0293\u0293\u0293\u0251\u0251\u0292\u029b\u01c0\u01c0 \u02a2\u02a [...]
- " \u0278\u0278\u0259\u0259\u0261\u0261\u0261\u0261\u0294\u0294 \u02a3\u02a3\u029d\u0289\u028d\u028d \u029e\u029e\u029e \u028e\u028e \u0284\u027d\u0274\u0274\u0274\u025c\u025d\u025d\u0272\u0265\u0265\u0265\u0258\u025e \u0275\u0275\u0275\u0279 \u028f\u028f\u028f \u0286\u0286 \u029f\u0203\u0203\u0203\u0203\u0204 \u0287 \u0291 \u02a1\u02a1\u02a1\u02a1\u02a5\u02a5 \u0251\u0292\u0292\u0296\u01c0\u01c0 \u02a4\u02a4 \u028c\u028c\u028c\u [...]
- " \u0278\u0278\u0259\u0261\u0261\u0261\u0261\u0294\u0294 \u02a3\u029d\u029d\u0289\u0289\u028d \u029e\u029e\u029e \u028e\u028e \u02a6\u02a6 \u0284\u027d\u0274\u0274\u025c\u0249\u0255\u0271\u0272\u0265\u0265\u0265\u0258\u025e \u0275\u027e\u0275\u0279\u0279 \u028f\u028f\u028f \u0286\u0286 \u029f\u0203\u0203\u0203\u0203\u0204\u0204 \u0287\u0287 \u0291\u0291 \u02a1\u02a1\u02a1\u02a1\u02a1\u02a5\u02a5 \u0251\u0292\u0296\u029b\u01c0\u01c0 \u02a4\u0 [...]
- "\u02a7 \u0278\u0278\u0259\u0261\u0261\u0261\u0261\u0294\u0294 \u029d\u029d\u028d\u0289\u028d \u029e\u029e\u029e \u028e\u02a6\u02a6 \u0284\u027d\u0274\u0274\u025c\u025c\u0249\u0256\u0272\u0265\u0265\u0265\u025e\u025e \u0275\u0275\u0279\u0279\u0279\u028f\u028f\u028f \u02a8\u02a8\u02a8\u02a8\u02a8\u02a8\u02a8 \u029f\u0203\u0203\u0203\u0204\u0204 \u0287\u0287\u0287\u0287 \u0291\u0291 \u02a1\u02a1\u02a1\u02a1\u02a5\u02a5\u02a5 \u0251\u0251\u0292\u01c0 [...]
- "\u02a7\u02a7\u0278\u0278\u0259\u0261\u0261\u0261\u0261\u0294\u0294\u0282 \u02a3\u029d\u029d\u028d\u028d \u029e\u029e\u029e \u028e\u02a6\u028e \u027d\u027d\u0274\u0274\u025c\u025c\u0249\u025d\u0257\u0265\u0265\u0258\u025e\u025e \u0275\u0275\u0275\u0279 \u028f\u028f\u028f \u02a8\u02a8\u02a8\u02a8\u02a8\u02a8\u02a8\u02a8\u02a8\u02a8 \u029f\u0203\u0203\u0203\u0203\u0204\u02a9\u0287\u0287\u0287\u0287\u0287\u0287\u0287\u0287\u0291\u0291 \u02a1\u02a1\u02a1\u02a1\u02a [...]
- " \u02a7\u0278\u0259\u0261\u0261\u0261\u0261\u0261\u0294\u0294 \u02a3\u02a3\u0289\u028d\u028d \u029e\u029e\u029e \u028e\u028e\u028e \u0284\u027d\u027d\u0274\u0274\u025c\u025c\u0255\u0256\u0257\u0265\u0265\u0258\u025e\u025e \u0275\u0275\u0279\u0279 \u02aa\u028f\u02ab\u02ac\u02a8\u02a8\u02a8\u02a8 \u02a8\u02a8\u02a8 \u029f\u0203\u0203\u0203\u02a0\u02a9 \u0287\u0287\u0287\u0291\u0291\u0287\u0287\u02a1\u02a1\u02a1\u02a1\u02ad\u02ad\u02ae\u02ae \u0251\ [...]
- " \u0278\u0259\u0259\u0261\u0261\u0261\u0261\u0294\u0294 \u02a3\u029d\u029d\u0289\u028d \u029e\u029e\u029e \u028e\u028e\u028e\u0284\u027d\u0274\u0274\u0274\u025c\u025c\u0249\u0256\u0257\u0265\u0265\u0258\u025e\u025e \u0275\u0275\u0279\u0279 \u02aa\u02aa\u02aa\u02aa\u02ac\u02ac\u02a8\u02a8\u02a8 \u02a8\u02a8\u02a8 \u029f\u029f\u029f\u02af\u02af\u02a9 \u02b0\u02b0\u02b0\u02a1\u02ad\u02ad\u02ad\u02b1\u02b1\u02ae\u02b2\u02b2\u02b2 \u0292\u0292\u02 [...]
- "\u0278\u0278\u0259\u0261\u0261\u0261\u0261\u0294\u0294 \u029d\u029d\u028d\u028d \u029e\u029e \u028e\u027d\u0274\u0274\u0274\u025c\u0249\u025d\u025d\u0257\u0265\u0265\u0258\u025e \u0275\u0275\u0275\u02b3 \u02aa\u02aa\u02aa\u02ac\u02ac\u02ac \u02a8\u02a8\u02a8 \u02b4\u029f\u02af\u02af\u02af\u02a9 \u02b0\u02b0\u02b0\u02b0\u02b5\u02ad\u02b1\u02b1\u02b1\u02b1\u02b2\u02b2\u02b2\u02b2 \u0251\u0251\u0251\u029b\u01c0\u01c0 \u02a4\u02a4 [...]
- "\u0278\u0259\u0261\u0261\u0261\u0261\u0294\u0294 \u02a3\u029d\u028d\u028d \u029e\u029e \u028e\u027d\u0274\u0274\u025c\u02b6\u02b6\u025d\u0272\u0265\u0265\u0265\u0258\u025e \u0275\u0275\u02b7 \u02aa\u02aa\u02aa \u02ac\u02ac \u02a8\u02a8\u02a8\u02a8\u02a8\u02a8\u02a8\u02a8\u02af\u02af\u029f\u02a0\u02a9 \u02b0\u02b0\u02b0\u02b0\u02b5\u02b5\u02b8 \u02ae\u02ae\u02b2\u02b2 \u0251\u0292\u0292\u0296\u01c0\u01c0 \u02a4\u02a4 ",
- "\u0259\u0261\u0261\u0261\u0261\u0261\u0294\u0294 \u02a3\u02a3\u0289\u028d\u028d \u029e\u029e\u029e \u028e\u027d\u0274\u0274\u025c\u025c\u02b6\u0271\u0272\u0265\u0265\u0265\u025e\u025e \u0275\u02b3\u02b3 \u02b9\u02aa\u02aa\u02aa \u02a8\u02a8\u02a8\u02a8\u02a8\u02a8\u02b4\u029f\u029f\u029f\u02a0\u0299 \u02b0\u02b0\u02b0\u02b0\u02ad\u02ad\u02b8\u02b8 \u02ae\u02ae\u02b2\u02b2 \u0251\u0292\u029b\u0296\u01c0\u01c0 \u02a4\u02a4\u02a4 [...]
- "\u0259\u0261\u0261\u0261\u0261\u0294\u0294 \u02a3\u029d\u0289\u0289\u028d \u029e\u029e\u029e \u028e\u028e\u027d\u0274\u0274\u025c\u025c\u02ba\u02bb\u02bc\u0265\u0265\u0258\u025e\u025e \u0275\u0275\u0275\u02b7\u02b9\u02b9\u02b9\u02aa\u02aa \u02b4\u029f\u029f\u029f\u02a0\u02a9 \u02b0\u02b0\u02b0\u02b0\u02ad\u02ad \u02b8\u02b8 \u02ae\u02ae\u02b2\u02b2 \u0292\u0292\u0292\u01c0\u01c0\u01c0 \u02a4\u02a4\u02a4 ",
- "\u0261\u0261\u0261\u0261\u0294\u0294 \u029d\u029d\u028d\u028d \u029e\u029e\u029e \u028e\u028e\u028e\u027d\u0274\u0274\u02bd\u02bd\u02ba\u02be\u02bf\u02bf\u0265\u0258\u025e\u025e \u0275\u0275\u02b3\u02b3\u02b9\u02b9\u02b9\u02aa\u02aa \u02b4\u02b4\u029f\u029f\u029f\u02a0\u02a9 \u02b0\u02b0\u02b0\u02b0\u02ad\u02ad \u02b8\u02b8 \u02ae\u02ae\u02b2\u02b2 \u0292\u0251\u029b\u01c0\u01c0 \u02a4\u02a4 ",
- "\u0261\u0261\u0261\u0294\u0294 \u02a3\u029d\u028d\u028d \u029e\u029e\u029e \u028e\u028e\u028e\u028e\u027d\u0274\u0274\u02bd\u02bd\u02bb\u02bc\u02bc\u02c0\u02c0\u02c0\u025e\u025e \u0275\u0275\u02b3\u02b3 \u02b9\u02b9\u02b9 \u02aa\u02aa \u02b4\u02b4\u029f\u029f\u02a0\u02a0\u0299\u02b0\u02b0\u02b0\u02ad\u02ad \u02b8\u02b8 \u02ae\u02ae\u02b2\u02b2\u02b2 \u0292\u0292\u0296\u01c0\u01c0 \u02a4\u02a4 ",
- "\u0261\u0261\u0294\u0294 \u02a3\u02a3\u0289\u028d \u029e\u029e\u029e \u028e\u028e\u028e \u0274\u0274\u02bd\u02bd\u025c\u02bb\u02bb\u02bc\u02c1\u02c0\u02c0\u025e\u025e \u0275\u0275\u0275\u0275\u02b3 \u02b9\u02b9\u02b9 \u02aa\u02aa \u02b4\u02b4\u029f\u029f\u029f\u02a0\u02b0\u02b0\u02b0\u02ad\u02ad\u02c2\u02c2\u02c3\u02c3\u02c3\u02b8 \u02ae\u02ae\u02b2\u02b2\u02b2 \u0292\u0292\u02c4\u01c0\u01c0 \u02a4 ",
- "\u0261\u0261\u0294\u0294 \u02a3\u029d\u0289\u0289\u028d \u029e\u029e\u029e \u028e \u027d\u0274\u0274\u02bd\u025c\u02be\u02be\u02bf\u02c0\u02c0\u025e\u025e \u0275\u0275\u02b3\u0275\u02b3 \u02b9\u02b9\u02b9 \u02aa \u02b4\u02b4\u029f\u029f\u029f\u02b0\u02b0\u02c5\u02c5\u02ad\u02c2\u02c2\u02c3\u02c3\u02c3\u02b8\u02b8\u02b8\u02b8\u02b8\u02b8\u02b8\u02b8 \u02ae\u02ae\u02b2\u02b2\u02b2 \u02c6\u02c6\u02c7\u01c0\u01c0 ",
- "\u0261\u0294\u0294 \u02a3\u029d\u029d\u028d\u028d \u029e\u029e\u029e \u028e\u027d\u0274\u0274\u02bd\u025c\u02bc\u02be\u02bf\u02c0\u02c0\u025e\u025e\u025e\u0275\u02c8\u02c8\u02b3 \u02b9\u02b9 \u02aa\u02aa \u02c9\u02c9 \u02b4\u02b4\u029f\u02ca\u02ca\u02cb\u02c5\u02c5\u02ad \u02b8\u02b8\u02b8\u02b8\u02b8\u02b8\u02b8\u02b8\u02b8\u02b8\u02b8\u02b8\u02b2\u02b2\u02b2 \u02c6\u02c6\u02c6\u02c7\u01c0\u01c0 ",
- "\u0294\u0294 \u02a3\u029d\u028d\u028d \u029e\u029e \u028e\u0274\u02bd\u02bd\u025c\u02bc\u02bc\u02c1\u02c0\u025e\u025e\u025e\u02c8\u02c8\u02c8\u02c8 \u02b9\u02b9\u02b9 \u02aa\u02aa \u02c9\u02c9 \u02b4\u02b4\u029f\u02ca\u02ca\u02ca\u02ca\u02cc\u02a9\u02a9 \u02b8\u02b8\u02b8\u02b8\u02ae\u02ae\u02b2\u02b2\u02cd \u0292\u02c6\u0296\u01c0\u01c0\u01c0 ",
- "\u0294 \u02a3\u02a3\u0289\u028d \u029e \u02bd\u02bd\u02bd\u025c\u02bf\u02bf\u02c1\u02c1\u025e\u025e\u02c8\u02c8\u02c8\u02b3\u02b3 \u02b9\u02b9\u02b9 \u02aa\u02aa \u02c9\u02c9 \u02b4\u02ce\u02ca\u02ca\u02ca\u02ca\u02ca\u02cf\u02cf\u02cf\u02cf \u02d0\u02cd\u02ae\u02ae\u02b2\u02b2\u02cd \u02d1\u02d1 \u0292\u0292\u02c4\u02c4\u01c0 ",
- "\u0294 \u02a3\u029d\u0289\u0289 \u02bd\u02bd\u02bd\u025c\u02bf\u02bf\u02bf\u025e\u025e\u0275\u0275\u0275\u02c8\u02b3 \u02b9\u02b9\u02b9 \u02aa\u02aa \u02c9\u02c9\u02c9 \u02ce\u02ce\u02ca\u02ca\u02ca\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf \u02d0\u02d0\u02d0\u02ae\u02ae\u02cd\u02b2\u02b2\u02cd \u02d1\u02d1\u02d1 \u02c6\u02c6\u02c7\u01c0\u01c0 ",
- " \u02a3\u029d\u029d\u028d\u028d \u02bd\u02bd\u025c\u025c\u02d2\u02d2\u02bf\u025e\u0275\u0275\u02b3\u0275\u02b3 \u02b9\u02b9\u02b9 \u02aa\u02aa\u02aa \u02c9\u02c9\u02c9 \u02d3\u02ce\u02ce\u02d4\u02d4\u02d5\u02d5\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02d0\u02d0 \u02ae\u02d6\u02cd\u02b2\u02b2\u02d1\u02d1\u02d1 \u0292\u02c6\u029b\u02c7\u01c0\u01c0 ",
- " \u02a3\u029d\u028d\u028d \u02bd\u02bd\u025c\u025c\u02d7\u02d2\u02d2\u02d8\u0275\u0275\u0275\u02b3 \u02b9\u02b9\u02b9 \u02aa\u02aa\u02aa \u02c9\u02c9 \u02d3\u02d9\u02ce\u02d4\u02d4\u02d4\u02da\u02d5\u02d5\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02db\u02cf\u02cf\u02cf\u02cf\u02cf\u02d6\u02d6\u02cd\u02d1\u02d1 \u0292\u0292\u029b\u02c4\u02c4\u01c0 ",
- "\u02a3\u02a3\u0289\u028d \u02bd\u02bd\u02bd\u025c\u02dc\u02d7\u02d8\u0275\u02b3\u0275\u0275 \u02b9\u02b9 \u02aa\u02aa\u02aa \u02c9\u02c9 \u02d3\u02d3\u02d9\u02ce\u02d4\u02d4\u02d4 \u02d5\u02d5\u02d5\u02d5\u02d5\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02db\u02db\u02cf\u02cf\u02cf\u02cf\u02cf\u02d6\u02d6\u02cd\u02b2\u02b2\u02b2 \u0292\u0292\u0296\u02c4\u02c4\u01c0 ",
- "\u029d\u0289\u0289 \u02bd\u02bd\u02bd\u025c\u02d7\u02d7\u02d7\u02d8\u0275\u0275\u02b3\u02b3 \u02b9\u02b9\u02b9 \u02aa\u02aa\u02aa \u02c9\u02c9 \u02d9\u02d9\u02d9\u02d4\u02d4\u02d4 \u02d5\u02d5\u02d5\u02d5\u02d5\u02d5\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02db\u02db\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02d6\u02d6\u02cf\u02b2\u02b2\u02cd \u0292\u0292\u029b\u01c0\u01c0\u01c0 ",
- "\u029d\u028d \u02bd\u02bd\u02bd\u025c\u02d7\u02d7\u02dc\u0275\u0275\u0275\u02b3 \u02b9\u02b9 \u02aa\u02aa\u02aa \u02c9\u02c9 \u02d3 \u02ce\u02d4\u02d4\u02d4 \u02d5\u02da\u02d5\u02d5\u02d5\u02d5\u02d5\u02d5\u02d5\u02d5\u02d5\u02db\u02db\u02d5\u02d5\u02d5\u02cf\u02cf\u02cf\u02cf\u02d6\u02d6\u02cf\u02cf\u02cf\u02b2\u02cd \u0292\u0292\u0296\u01c0\u01c0\u01c0 ",
- "\u028d\u028d \u02bd\u02bd\u02bd\u025c\u02d7\u02dc\u02dc\u0275\u02b3\u0275\u02b3 \u02aa\u02aa\u02aa \u02d4\u02d4 \u02da\u02da\u02da\u02da\u02da\u02da\u02da\u02da\u02db\u02d5\u02d5\u02d5\u02d5\u02d5\u02d5\u02d5\u02d5\u02cf\u02d6\u02d6\u02cf\u02cf\u02cf\u02b2\u02cd \u0292\u0292\u029b\u0296\u01c0\u01c0\u01c0 ",
- "\u028d \u02bd\u02bd\u02bd \u02dc\u02dc\u0275\u0275\u02b3 \u02aa\u02aa\u02aa \u02d5\u02d5\u02d5\u02d6\u02d6\u02cf\u02cf\u02cf\u02cf\u02cf\u02cd \u0292\u0292\u0296\u0296\u01c0\u01c0 ",
- " \u02bd\u02bd\u025c \u02dc\u02dc\u02dc\u0275\u0275\u0275 \u02aa\u02aa\u02aa \u02d5\u02d6\u02d6\u02cf\u02cf\u02cf\u02cf\u02cf\u02cf\u02cd \u0292\u0292\u029b\u0296\u01c0\u01c0 ",
- " \u02bd\u02bd\u025c \u02dc\u02dc\u02dc\u0275\u0275\u02b3 \u02aa\u02aa \u02d5\u02d5\u02d5\u02cf\u02cf\u02cf\u02cf\u02cf\u02cd\u02cd \u0292\u0292\u0296\u0296\u01c0\u01c0 ",
- " \u02bd\u02bd\u025c \u02dc\u02dc\u0275\u0275\u02b3\u02b3 \u02aa\u02aa \u02d5\u02d5\u02cf\u02cf\u02cf\u02cf\u02cf\u02cd\u02cd \u0292\u0292\u029b\u0296\u01c0\u01c0\u01c0 ",
- " \u02bd\u02bd\u02bd \u02dc\u02dc\u0275\u0275\u0275\u02b3 \u02aa\u02aa \u02d5\u02d5\u02cf\u02cf\u02cf\u02cf\u02cf\u02cd \u0292\u0292\u0292\u0296\u01c0\u01c0 ",
- " \u02bd\u02bd\u02bd \u02dc\u02dc\u0275\u0275\u02b3 \u02aa \u02d5\u02d5\u02cf\u02cf\u02cf\u02cf\u02cf\u02cd \u0292\u0292\u029b\u0296\u01c0\u01c0 ",
- " \u02bd\u02bd \u02dc\u02dc\u0275\u02b3\u02b3 \u02d5\u02d5\u02cf\u02cf\u02cf\u02cf\u02cf\u02b2 \u0292\u0292\u0296\u0296\u01c0\u01c0 ",
- " \u02dc\u02dc\u02dc\u0275\u0275\u0275 \u02d5\u02d5\u02cf\u02cf\u02cf\u02cf\u02cf\u02b2 \u0292\u0292\u0296\u01c0\u01c0 "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/rtl-point-200-200-1.0-grid-reference.json b/tests/visual_tests/grids/rtl-point-200-200-1.0-grid-reference.json
deleted file mode 100644
index acc98b4..0000000
--- a/tests/visual_tests/grids/rtl-point-200-200-1.0-grid-reference.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ",
- " ",
- " ! ",
- " ",
- " ! ! ! !! ",
- " !!!!! !! ",
- " ! ",
- " ",
- " ! ",
- " !! ! ",
- " !!! ",
- " ",
- " ! ",
- " !! !! ",
- " ! !!!! ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/rtl-point-200-200-2.0-grid-reference.json b/tests/visual_tests/grids/rtl-point-200-200-2.0-grid-reference.json
deleted file mode 100644
index dcafa31..0000000
--- a/tests/visual_tests/grids/rtl-point-200-200-2.0-grid-reference.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ",
- " !! ",
- " !!! ! !! !! ",
- " ! ! !! !!! ! ! ",
- " !!!!!!!!! !!!!! ",
- " ! !! ",
- " ! ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ! ",
- " ! ! ! ",
- " !!!! !!! ",
- " ! !! ",
- " !! ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shield-on-line-and-avoid-edges-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/shield-on-line-and-avoid-edges-512-512-1.0-grid-reference.json
deleted file mode 100644
index 2aaaf42..0000000
--- a/tests/visual_tests/grids/shield-on-line-and-avoid-edges-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " !!!! ",
- " !!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!! !",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!! !!!!!!!!!!!!!!!!!!!!!!!! ",
- "! !!! !!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!! ",
- " !!!!! ",
- " !!! ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shield-on-line-and-avoid-edges-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/shield-on-line-and-avoid-edges-512-512-2.0-grid-reference.json
deleted file mode 100644
index eead91d..0000000
--- a/tests/visual_tests/grids/shield-on-line-and-avoid-edges-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " !!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!!! !!!!!!!!!!!!!!!!!! ! ",
- " ! !!!!!!!!!! !!!!!!!!!!!!!!!!! ! ",
- "! !!!!!!!! !!!!!!!!!!!!!!!!!! ",
- "! !!!!!! !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!! ",
- " !!!!! ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shield-on-line-spacing-eq-width-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/shield-on-line-spacing-eq-width-600-400-1.0-grid-reference.json
deleted file mode 100644
index 5859f74..0000000
--- a/tests/visual_tests/grids/shield-on-line-spacing-eq-width-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! !!!!!!!!!",
- " !!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!! ",
- " !!!!! !!!!!!!!!!! !! ",
- " !!!!!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!!! !! ",
- " !!!! !!!!!!!!!!!!!! ",
- " ! !!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!!!!! !!!! ",
- " !! !!!!!!!!!!!!!! ",
- " !! !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!!!!!! !!!!!! ",
- " !!!!!!!!!!!!!! ",
- " !!!!! !!!!!!!!!!! !! ",
- " !!!!! !! !!!!!!! ",
- " !!!!! !! ",
- " !!!! !! !!!!! ",
- " ! !!!!!!!!! ",
- " !!!!!!!!!!!!!! ",
- " !! !!!!!!!!!!!!!! ",
- " !! !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!!!!!! !!!!!! ",
- " !!!!!!!!!!!!!! ",
- " !!!!! !!!!!!!!!!! !! ",
- " !!!!!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!!! !! ",
- " !!!! !!!!!!!!!!!!!! ",
- " ! !!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!!!!! !!!! ",
- " !!!!!!!!!!!!!! ",
- "! !!!!!!!!!! ",
- " !!!!!! ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shield-on-line-spacing-eq-width-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/shield-on-line-spacing-eq-width-600-400-2.0-grid-reference.json
deleted file mode 100644
index aac90a4..0000000
--- a/tests/visual_tests/grids/shield-on-line-spacing-eq-width-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ",
- " !!!!!!!!!!! !",
- " !!! !!!!!!!!!!!!!!!!! ",
- " !!! !!!!!! !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!! !!!!!! ",
- " !!!!!!!! !! !!!!!!!!!!!!!!!!!!!! ",
- " !!! !!!!!!!!!!! !! !!!!!!!!!!!!!!!! ",
- " !!! !!!!!!!!!!!!!!!!! !!!!!!! !!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!! !!!!!!!!!!!!!! !!! !!!!!!!!!!!! !!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!! !!!!!! ",
- " !!!!!!!! !! !!!!!!!!!!!!!!!!!!!! ",
- " !!! !!!!!!!!!!! !! !!!!!!!!!!!!!!!!! ",
- " !!! !!!!!!!!!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!! !!! !!!!!!!!!!!! !!! ",
- "! !!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!! !!! ",
- " !!!!!!!! ",
- " !!!! ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shield-on-polygon-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/shield-on-polygon-500-100-1.0-grid-reference.json
deleted file mode 100644
index 83e2d2a..0000000
--- a/tests/visual_tests/grids/shield-on-polygon-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "3",
- "2",
- "4",
- "5",
- "6"
- ],
- "data": {},
- "grid": [
- " ! ",
- " !! ",
- " !!! ",
- " !! # ",
- " !!! ",
- " !!!! ",
- " !!!! !! ",
- " !!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!! ",
- " !!!! ",
- " $$ % !!! ",
- " $$$$$!!! ",
- " $$$$$$ ! ",
- " $$$$$$ ",
- " $$$$$$ ",
- " $$$$$$ ",
- " $$$$$$$$ ",
- " $$$$$$$$ ",
- " $$$$$$$$$ ",
- " $$$$$$$$$ ",
- " &$$$$$$$$ ",
- " $$$$$$$$ ",
- " '' $ "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shield-on-polygon-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/shield-on-polygon-600-400-1.0-grid-reference.json
deleted file mode 100644
index 176d251..0000000
--- a/tests/visual_tests/grids/shield-on-polygon-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,115 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "3",
- "2",
- "4",
- "7",
- "5",
- "6"
- ],
- "data": {},
- "grid": [
- " !!! ",
- " !!! ",
- " !! ",
- " !! ! ",
- " !!!!! ",
- " !!!!!!!! ",
- " !!!!!!!! ! ",
- " !!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!! ",
- " !!!!!!! ",
- " !!!!!!! ## ",
- " !!!!!!! ## ",
- " !!!!!!! ",
- " !!!!! ! ",
- " !!!!! !! ",
- " !!! !!! ",
- " !!!!!! !!!! ",
- " !!!!!!! !!! ",
- " !!!!!!! !!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!!!! !!! ",
- " !!!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!! ",
- " !!!!!!!!!!!! ",
- " $$$ !!!!!!!!!!!! ",
- " $$ !!!!!!!!!!! ",
- " $$$$$ %% !!!!!!!!!!! ",
- " $$$$$$$$ %% !!!!!!!!!!! ",
- " $$$$$$$$ $$$$$$ !!!!!!!!!!! ",
- " $$$$$$$$ $$$$$$$$ !!!!!!!!!!! ",
- " $$$$$$$$$$$$$$$$$$ !!!!!!!!!!! ",
- " $$$$$$$$$$$$$$$$$$ !!!!!!!! ",
- " $$$$$$$$$$$$$$$$$ !!!! ",
- " $$$$$$$$$$$$$$$$$$$ ! ",
- " $$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " &&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ''$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " ''$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$ $$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$ ",
- " $$ $$$$$ ",
- " ((( ",
- " (((( ",
- " (((((( ",
- " (((((( "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shield-on-polygon-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/shield-on-polygon-600-400-2.0-grid-reference.json
deleted file mode 100644
index 861ddb4..0000000
--- a/tests/visual_tests/grids/shield-on-polygon-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,115 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "3",
- "2",
- "4",
- "7",
- "5",
- "6"
- ],
- "data": {},
- "grid": [
- " !!!! ",
- " !!! ",
- " !!! ",
- " !! ! ",
- " !!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!! ",
- " !!!!!!!! ## ",
- " !!!!!!!! ### ",
- " !!!!!!! ## ",
- " !!!!!! !! ",
- " !!!!!! !!! ",
- " !!!!! !!! ",
- " !!!!!!! !!!! ",
- " !!!!!!!!!!!! ",
- " !!!!!!!!!!!! ",
- " !!!!!!!!!!!! ",
- " !!!!!!!!!!! ",
- " !!!!!!!!!!!! !!!! ",
- " !!!!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! !!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!! ",
- " !!!!!!!!!!!! ",
- " $$$ !!!!!!!!!!!! ",
- " $$$$ !!!!!!!!!!!! ",
- " $$$$$ %% !!!!!!!!!!! ",
- " $$$$$$$$ %%$ !!!!!!!!!!! ",
- " $$$$$$$$ $$$$$$ !!!!!!!!!!!! ",
- " $$$$$$$$ $$$$$$$$$ !!!!!!!!!!!! ",
- " $$$$$$$$$$$$$$$$$$$ !!!!!!!!!!!! ",
- " $$$$$$$$$$$$$$$$$$ !!!!!!!!!! ",
- " $$$$$$$$$$$$$$$$$$$ ! !!!! ",
- " $$$$$$$$$$$$$$$$$$$$ !! ",
- " $$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " &&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " '''$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " '''$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$ $$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$ ",
- " (( $$$$$$$$$$$ ",
- " (((( ",
- " (((( ",
- " (((((( ",
- " (((((( "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-490-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-490-100-1.0-grid-reference.json
deleted file mode 100644
index 217f9c8..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-490-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " # ! ! ",
- " ## ",
- " $$$ % ##### &&& ''' ! ! ((((( ( ) ",
- " $ %%% * + ### && '' ! ( ( ( ) ",
- " $ %% ** ++ # && '' !! (( ( (( )) ",
- " $ ** ++++ & ' ( ",
- " + + ",
- " !! ",
- " ! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-490-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-490-100-2.0-grid-reference.json
deleted file mode 100644
index 2afb326..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-490-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "7",
- "9",
- "6",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " !! ! ",
- " !!! ",
- " ! ",
- " !!! ",
- " ! ! ",
- " # ! ! ",
- " ### # ",
- " ### ",
- " $ % # & ! ' ",
- " $$$$$ % %% ### ( ( && & ! !! ' ' ''''' ' ' ) ) ",
- " $$$ %%% ### ((( &&& !!! ''' ''' '' ))) ",
- " $ % % * ** + # # # (( ( & && ! '' ' '' )) ",
- " $$$ %% ** * ++++ # (( && !! '' ''' '' )) ",
- " $$$ %%%% ** +++ ( ( &&&& !!!! ' ' ''' ' ' ) )) ",
- " $ $ $ % % % ******** ++++++++ (( (( & & & ! ! ! '' ''' ' ''' ' ) ) ",
- " $ % **** +++ & ! ' ",
- " * * ++++ ",
- " + + + ",
- " + ! !! ",
- " ! ! ",
- " !! ",
- " !! ",
- " ! ! ",
- " ! !! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-495-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-495-100-1.0-grid-reference.json
deleted file mode 100644
index af76ebf..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-495-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " ! ! ",
- " ## ",
- " $$$ % #### & ' ! ((((( ( )) ",
- " $ % % * + ## &&& ' ' ! ( ( ( )) ",
- " $ %% * ++ && '' !! (( ( (( )) ",
- " $ * ++++ ( ",
- " *** +++ ",
- " !! ",
- " ! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-495-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-495-100-2.0-grid-reference.json
deleted file mode 100644
index 53aa8c5..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-495-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " !! ! ",
- " !!! ",
- " ! ",
- " !!! ",
- " ! ! ",
- " ! ! ",
- " # # ",
- " ### ",
- " $ % ## & ' ! ( ",
- " $$$$ %%%%% ## && & '''' ! !! ( ( (((( ( ( ) ) ",
- " $$$ %%% * ## # &&& ''' !!! ((( ((( ((( )) ",
- " $ % % * * * + # ## && & ' ' !! (( ( (( )) ",
- " $$$ %%% *** ++ + && ''' !! (( ((( (( )) ",
- " $$$ %%% ** +++ &&&& ''' !!!! ( ( ((( ( ( ) ) ",
- " $ $ $ % % % ******** ++++++++ & & & ' ' ' ! !!! ( ((( ( ( ( (( )) ) ",
- " $ % *** +++ & ' ! ( ",
- " * ** ++++ ",
- " * + + + ",
- " + ! !! ",
- " ! ! ",
- " !! ",
- " !! ",
- " !! ! ",
- " ! !! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-497-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-497-100-1.0-grid-reference.json
deleted file mode 100644
index 4ed4360..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-497-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ",
- " # ! ! ",
- " ## ",
- " $$$ %%% #### &&& ''' !!! ( (((( ( ))) ",
- " $ %% * + ## && '' ! ( (( ( ) ",
- " $ %% * ++ # && ' ! (( (( (( ) ",
- " $ % * ++++ & ' ! ) ",
- " *** + ",
- " ! ",
- " ! ",
- " ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-497-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-497-100-2.0-grid-reference.json
deleted file mode 100644
index f8ac5ca..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-497-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ! !! ",
- " !!! ",
- " ! ",
- " ! ! ",
- " ! !! ",
- " # ! ! ",
- " # ### ",
- " ### ",
- " $ % # ! ",
- " $$ $ %%%%% ## & & ' ' !!!! (( (( ( ( (( (( )) )) ",
- " $$$ %%% * ### && '' !!! ( ( (( ( ( ))) ",
- " $ % % * * * + # ### && & ' '' ! ( (( ( ) ",
- " $$$ %%% *** ++ + # && '' !!! ((( (( ((( ))) ",
- " $$$ %%% *** ++ & & ' ' !!! ( ( ( ( ( ( ))) ",
- " $ $ $ % % % ********* ++++++++ && & '' ' ! ! ! ( ((( ((( ( ) ) ",
- " $ % *** ++ ! ",
- " * *** ++ + ",
- " * + + + ",
- " + !! ! ",
- " ! ! ",
- " !! ",
- " !! ",
- " ! ! ",
- " ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-498-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-498-100-1.0-grid-reference.json
deleted file mode 100644
index d382741..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-498-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " # ! ! ",
- " ## ",
- " $$$ %%% ##### &&& ''' ! ( (( (( ))) ",
- " $ %% * + ### && '' ! ( ( (( ) ",
- " $$ %% * ++ # & '' !! (( (( )) ",
- " $ % * ++++ & ' ) ",
- " *** + ",
- " !! ",
- " ! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-498-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-498-100-2.0-grid-reference.json
deleted file mode 100644
index d30c760..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-498-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "9",
- "6",
- "7",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ! ! ",
- " !! ",
- " ! ",
- " !!! ",
- " ! ! ",
- " # ! ! ",
- " ##### ",
- " ### ",
- " $ % # ! & ",
- " $$ $ %%%% ### ' ' ( ( !! ! & & & && & & ) ) ",
- " $$$ %%% * ### ''' ((( !!! &&& &&& &&& ))) ",
- " $ % % * * * + # # # '' ' ( (( !! && && && ) ",
- " $$$ %%% *** + + # '' (( !! && && &&& ))) ",
- " $$$ %%% *** ++ ' ' ( ( !!!! & && &&&& & && )))) ",
- " $ $ $ % % % ********* ++++++++ ' '' ( (( ! ! ! & & & &&&& & ) ) ",
- " $ % *** ++ ! & ",
- " ***** + + ",
- " * ++ ++ ",
- " ! ! ",
- " ! ! ",
- " !! ",
- " !! ",
- " ! ! ",
- " !! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-499-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-499-100-1.0-grid-reference.json
deleted file mode 100644
index fed627c..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-499-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " # ! ",
- " ## ",
- " $$$ %%% ##### &&& ' !! ( ((((( ) ",
- " $ %% * + ### && '' !! ( ( ( )) ",
- " $$ %% * ++ # && '' !! (( ( (( )) ",
- " $ % * ++++ & ( ",
- " *** + ",
- " !! ",
- " ! ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-499-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-499-100-2.0-grid-reference.json
deleted file mode 100644
index 1e1324f..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-499-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ! ! ",
- " !! ",
- " !! ",
- " !! ",
- " ! ! ",
- " # ! !! ",
- " ### # ",
- " ### ",
- " $ % # & ' ( ",
- " $$ $ %% % ### & && ' '' ! ! ( ( ((((( ( ( ) ) ",
- " $$$ %%% * ### &&& ''' !! (( ((( (( )) ",
- " $ % % * * * + # # # & & ' '' !! (( ( (( )) ",
- " $$$ %%% *** + + # && '' !! (( ((( (( )) ",
- " $$$ %%% ** ++ &&&& '''' ! ! ( ( ((( ( ( ) ) ",
- " $ $ $ % % % ********* ++++++++ & & & ' ''' !! ! (( ( ( ( ((( ( )) ) ",
- " $ % *** ++ & ' ( ",
- " *** * + + ",
- " * ++ ++ ",
- " ! ! ",
- " !!!! ",
- " !! ",
- " !! ",
- " ! !! ",
- " ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-500-100-1.0-grid-reference.json
deleted file mode 100644
index 6987461..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " # ! ",
- " ## ",
- " $$$ %%% #### & '' ! ((((( ( ) ",
- " $ %% * + ### & & ''' ! (( ( ( ) ",
- " $$ %% * ++ # && '' !! (( (((( )) ",
- " $ % * ++++ ( ",
- " *** + ",
- " !! ",
- " ! ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-500-100-2.0-grid-reference.json
deleted file mode 100644
index b3b02a7..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ! ! ",
- " !! ",
- " !! ",
- " !! ",
- " ! ! ",
- " # ! ! ",
- " ## # ",
- " ### ",
- " $ % ## & ' ( ",
- " $$ $ %% % ## &&&&& ''''' ! ! ( ( (( ( ( ( ) ) ",
- " $$$ %%% * ### &&& ''' !!! ((( ((( ((( ))) ",
- " $ % % * * * + # # # & & ' ' !! (( ( (( )) ",
- " $$$ %%% *** + + # &&& ''' !! (( ((( (( )) ",
- " $$$ %%% ** +++ &&& ''' ! ! (( ( ((( ( ( ) ) ",
- " $ $ $ % % % ******** ++++++++ & & & ' ' ' ! !! ( ((( ( ( ( (( ) )) ",
- " $ % *** ++ & ' ( ",
- " *** * + + ",
- " * + ++ ",
- " ! ! ",
- " ! ! ",
- " !! ",
- " !! ",
- " !! ! ",
- " ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-501-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-501-100-1.0-grid-reference.json
deleted file mode 100644
index 0804e86..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-501-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " # ! ! ",
- " ## ",
- " $$$ %%% #### & ' !!! ( (( ( ))) ",
- " $ %% * + ## &&& ' ' ! ( ( ( ) ",
- " $$ % * ++ # && '' !! (( (( )) ",
- " $ % * ++++ ! ) ",
- " *** + ",
- " ! ",
- " ! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-501-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-501-100-2.0-grid-reference.json
deleted file mode 100644
index f20b79a..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-501-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " !! ! ",
- " !!! ",
- " ! ",
- " !!! ",
- " !! ! ",
- " # ! ! ",
- " ## # ",
- " ### ",
- " $ % ## & ' ! ( ",
- " $$ $ %% % ## &&&&& ''''' !!!! (( (( (( ( (( ( )) )) ",
- " $$$ %%% * #### &&& ''' !!! ( ( ((( ( ( ))) ",
- " $ % % *** * + ### # & & ' ' ! ( (( ( ) ",
- " $$$ %%% **** + ++ # &&& ''' !!! ((( (( ((( ))) ",
- " $$$ %%%% ** +++ &&& ''' !!!! ( ( (((( (( ( ))) ",
- " $ $ $ % % % ******** ++++++++ & & & ' ' ' ! ! ! ( (((( ( ( ( ) ) ",
- " $ % *** ++ & ' ! ( ",
- " *** * ++++ ",
- " * + + + ",
- " + ! !! ",
- " ! ! ",
- " !! ",
- " !! ",
- " ! ! ",
- " ! !! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-502-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-502-100-1.0-grid-reference.json
deleted file mode 100644
index 0b393be..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-502-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ! ",
- " ## ",
- " $$$ %%% #### & ''' !!! ( (( ( ))) ",
- " $ %% * + ## &&& ' ' ! ( (( ( ) ",
- " $$ % ** ++ && '' ! (( (( (( )) ",
- " $ % * ++++ ' ! ) ",
- " * * +++ ",
- " ! ",
- " ! ",
- " ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-502-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-502-100-2.0-grid-reference.json
deleted file mode 100644
index 8e97860..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-502-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ! !! ",
- " !!! ",
- " ! ",
- " ! ! ",
- " !! !! ",
- " # ! ! ",
- " ## # ",
- " ### ",
- " $ % ## & ' ! ",
- " $$ $ %% % ## && & '' ' !!!!! ( ( ( ( (( (( ) ) ",
- " $$$ %%% * #### &&& ''' !!! ( ( ((( ( ( ))) ",
- " $ % %% *** * + ### # & & ' '' ! ( (( ( ) ",
- " $$$ %% **** ++++ # &&& '' !!! ((( (( ((( ))) ",
- " $$$$ %%%% ** +++ &&&& '''' !!! ( ( ( ( ( ( ))) ",
- " $ $ $ % % % ******** ++++++++ & & & ' ' ' ! ! ! ( ( ( ((( ( ) ) ",
- " $ % *** +++ & ' ! ",
- " ** * ++++ ",
- " * + + + ",
- " + !! ! ",
- " ! ! ",
- " ! ",
- " !!! ",
- " ! ! ",
- " ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-505-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-505-100-1.0-grid-reference.json
deleted file mode 100644
index 9a30934..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-505-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " ! ",
- " ## ",
- " $$$ %%% #### &&& ' ! (((((( ( ))) ",
- " $ %% * + ## && '' !! (( ( ( ) ",
- " $$ % ** + & '' !! (( (( )) ",
- " $ % ** +++++ & ( ) ",
- " +++ ",
- " !! ",
- " ! ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-505-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-505-100-2.0-grid-reference.json
deleted file mode 100644
index 979a1a1..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-505-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "7",
- "9",
- "6",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ! ! ",
- " !! ",
- " !! ",
- " !! ",
- " ! ! ",
- " # !! ! ",
- " # ## ",
- " ### ",
- " $ % ## & ' ",
- " $$ $ %% % ## ( ( & && ! ! ' ' '' ' ' ' )) ) ",
- " $$$ %%% #### ((( &&& !!! ''' ''' ''' ))) ",
- " $$ % %% ** * + # ### (( ( & && !! ' '' '' ) ",
- " $$ %% * * ++++ # (( && !! '' '' '' ))) ",
- " $$$$ %%%% ** +++ ( ( &&&& ! ! '' ' '''' '' ' )))) ",
- " $ $ $ %%% % ******** +++++++++ ( (( & &&& ! !! ' ''' ' ' ' '' ) ) ",
- " $ % *** +++ & ' ",
- " * * ++++ ",
- " + + + ",
- " + ! ! ",
- " !!! ",
- " !! ",
- " !! ",
- " !! ! ",
- " ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-510-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-510-100-1.0-grid-reference.json
deleted file mode 100644
index 41844bc..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-510-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " ",
- " ## ",
- " $ % #### & ''' ! ( (( ( ))) ",
- " $ %% * + ## && '' !! (( ( ( ) ",
- " $$ %% * ++ && '' !! (( (( ) ",
- " * ++++ ' ) ",
- " * * ++ ",
- " !! ",
- " ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-1-510-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-1-510-100-2.0-grid-reference.json
deleted file mode 100644
index 9d3d6ca..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-1-510-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "6",
- "9",
- "2",
- "7",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ! ! ",
- " !! ",
- " !! ",
- " !! ",
- " ! ! ",
- " # !! !! ",
- " ## # ",
- " ### ",
- " $ ## % & ",
- " $$ $ ' ' ## %% % ( ( ! ! & & && & & & )) )) ",
- " $$$ '' * #### %%% (( !! & & &&& &&& ))) ",
- " $$ ' '' * * * + ### # %% % ( (( !! & && & ) ",
- " $$ '' *** + + # %% (( !! && && && ))) ",
- " $$$$ ' ' ** ++ %%%% ( ( ! ! && & &&&& && & ))) ",
- " $ $ $ '' '' ******** ++++++++ % % % (( (( !! !! & && & & & & ) ) ",
- " $ *** ++ % & ",
- " * ** + + ",
- " * ++ ++ ",
- " ! ! ",
- " !!!! ",
- " !! ",
- " !! ",
- " !!!! ",
- " ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-490-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-490-100-1.0-grid-reference.json
deleted file mode 100644
index c731906..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-490-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " ! ! ",
- " # ",
- " $$$ % # & & ' ' ! ! ((((( ( ) ",
- " $ %%% * + ### && '' ! ( ( ( ) ",
- " $ %% ** ++ # && '' !! (( ( (( )) ",
- " $ ** + # ( ",
- " + + ",
- " !! ",
- " ! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-490-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-490-100-2.0-grid-reference.json
deleted file mode 100644
index abe5134..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-490-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "4",
- "6",
- "9",
- "7",
- "10",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " !! ! ",
- " !!! ",
- " ! ",
- " !!! ",
- " ! ! ",
- " ! ! ",
- " ## # ",
- " # # ",
- " $ % & # ' ! ( ",
- " $$$$$ %% % & ### ' '' ) ) ! !! ( ( ((((( ( ( * * ",
- " $$$ % % % & ### '''' ))) !!! ((( ((( (( *** ",
- " $ % % + ++ & # # # '' ' ) )) ! (( ( (( ** ",
- " $$$ % %% ++ + &&&& # '' ' )) !! (( ((( (( ** ",
- " $$$ %%% % ++ &&& # ' '' ) )) !!!! ( ( ((( ( ( * ** ",
- " $ $ $ %% % ++ & # '' '' ) ) ! ! ! (( ((( ( ((( ( * * ",
- " $ % ++++ &&& # ' ! ( ",
- " + + && & ",
- " & & ",
- " ! !! ",
- " ! ! ",
- " !! ",
- " !! ",
- " ! ! ",
- " ! !! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-495-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-495-100-1.0-grid-reference.json
deleted file mode 100644
index d911b9a..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-495-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "3",
- "4",
- "6",
- "7",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " ! ! ",
- " ## ",
- " $$$ % & ' # ( ( ) ! ***** * ++ ",
- " $ % % & ' ## ((( ) ) ! * * * ++ ",
- " $ %% & '' ((( )) !! ** * ** ++ ",
- " $ & ' ( * ",
- " & & ' ' ",
- " !! ",
- " ! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-495-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-495-100-2.0-grid-reference.json
deleted file mode 100644
index c5106c2..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-495-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "3",
- "4",
- "6",
- "7",
- "9",
- "2",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " !! ! ",
- " !!! ",
- " ! ",
- " !!! ",
- " ! ! ",
- " ! ! ",
- " # # ",
- " ### ",
- " $ % & ## ' ( ! ) ",
- " $$$$ ** ** % & ## ' '' ( ( (( ! !! ) ) )))) ) ) + + ",
- " $$$ * * % & ## # ''' ' ( ( ( !!! ))) ))) ))) ++ ",
- " $ * * % % % & # ## '' ' ( ( !! )) ) )) ++ ",
- " $$$ *** %%% && & '' ' ( ((( !! )) ))) )) ++ ",
- " $$$ * * %% &&& ' ''' ( ( ( !!!! ) ) ))) ) ) + + ",
- " $ $ $ * * %% & ' '' (( ( ! !!! ) ))) ) ) ) )) ++ + ",
- " $ %%% &&& ' ( ! ) ",
- " % % & && ",
- " & & ",
- " ! !! ",
- " ! ! ",
- " !! ",
- " !! ",
- " !! ! ",
- " ! !! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-497-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-497-100-1.0-grid-reference.json
deleted file mode 100644
index 7288101..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-497-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "3",
- "6",
- "7",
- "9",
- "10",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ",
- " ! ! ",
- " ## ",
- " $$$ % % & # ' ' ( ( !!! ) )))) ) *** ",
- " $ %% & + ## '' (( ! ) )) ) * ",
- " $ %% & ++ # ''' ! )) )) )) * ",
- " $ & + # ' ! * ",
- " & & + ",
- " ! ",
- " ! ",
- " ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-497-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-497-100-2.0-grid-reference.json
deleted file mode 100644
index 017eb90..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-497-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "3",
- "4",
- "6",
- "7",
- "2",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ! !! ",
- " !!! ",
- " ! ",
- " ! ! ",
- " ! !! ",
- " ! ! ",
- " # ## ",
- " # # ",
- " $ % & # ' ( ! ",
- " $$ $ )) )) % & ## ' '' (( ( !!!! ** ** * * ** ** ++ ++ ",
- " $$$ ) ) % & ### '' ' ( (( !!! * * ** * * +++ ",
- " $ ) ) % % % & # ### '' ' ( (( ! * ** * + ",
- " $$$ ))) %%% && & # '' ' ( (( !!! *** ** *** +++ ",
- " $$$ ) ) %%% && # ' '' (( ( !!! * * * * * * +++ ",
- " $ $ $ ) ) % && # '' '' (( ( ! ! ! * *** *** * + + ",
- " $ %%% && # ' ( ! ",
- " % %% & & ",
- " & & ",
- " !! ! ",
- " ! ! ",
- " !! ",
- " !! ",
- " ! ! ",
- " ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-498-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-498-100-1.0-grid-reference.json
deleted file mode 100644
index 0b8130a..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-498-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "3",
- "6",
- "7",
- "9",
- "10",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " ! ! ",
- " # ",
- " $$$ % % & # ' ' ( ( ! ) )) )) *** ",
- " $ %% & + ### '' (( ! ) ) )) * ",
- " $$ %% & ++ # ((( !! )) )) ** ",
- " $ & ++ # ( * ",
- " & & + ",
- " !! ",
- " ! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-498-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-498-100-2.0-grid-reference.json
deleted file mode 100644
index 975a7c8..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-498-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "3",
- "6",
- "7",
- "9",
- "2",
- "10",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ! ! ",
- " !! ",
- " ! ",
- " !!! ",
- " ! ! ",
- " ! ! ",
- " ## ## ",
- " # # ",
- " $ % # & ' ! ( ",
- " $$ $ ) )) % ### & && '' ' !! ! ( ( ( (( ( ( * * ",
- " $$$ ) ) % ### &&&& ' ''' !!! ((( ((( ((( *** ",
- " $ ) ) % % % + # # # && & ' '' !! (( (( (( * ",
- " $$$ ))) %%% + + # && & ' '' !! (( (( ((( *** ",
- " $$$ ) ) %%% ++ # & && '' ' !!!! ( (( (((( ( (( **** ",
- " $ $ $ ) ) % ++ # & && '' '' ! ! ! ( ( ( (((( ( * * ",
- " $ %%% ++ # & ' ! ( ",
- " %% %% + + ",
- " ++ ++ ",
- " ! ! ",
- " ! ! ",
- " !! ",
- " !! ",
- " ! ! ",
- " !! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-499-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-499-100-1.0-grid-reference.json
deleted file mode 100644
index 27a1489..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-499-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "3",
- "6",
- "7",
- "9",
- "10",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " ! ",
- " # ",
- " $$$ % % & # ' ' ( ( !! ) ))))) * ",
- " $ %% & + ### '' (( !! ) ) ) ** ",
- " $$ %% & ++ # '' ((( !! )) ) )) ** ",
- " $ & ++ # ( ) ",
- " & & + ",
- " !! ",
- " ! ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-499-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-499-100-2.0-grid-reference.json
deleted file mode 100644
index a184ed4..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-499-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "3",
- "7",
- "9",
- "2",
- "6",
- "10",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ! ! ",
- " !! ",
- " !! ",
- " !! ",
- " ! ! ",
- " ! !! ",
- " ## # ",
- " # # ",
- " $ % # & ' ",
- " $$ $ ( ( % ### ) ) && & ! ! ' ' ''''' ' ' * * ",
- " $$$ ( ( % ### ) ) & &&& !! '' ''' '' ** ",
- " $ ( ( % % % + # # # ) ) & && !! '' ' '' ** ",
- " $$$ ((( %%% + + # )) & && !! '' ''' '' ** ",
- " $$$ ( ( %% ++ # )) ) &&& & ! ! ' ' ''' ' ' * * ",
- " $ $ $ ( ( % ++ # ) ) && && !! ! '' ' ' ' ''' ' ** * ",
- " $ %%% ++ # & ' ",
- " %% % + + ",
- " ++ ++ ",
- " ! ! ",
- " !!!! ",
- " !! ",
- " !! ",
- " ! !! ",
- " ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-500-100-1.0-grid-reference.json
deleted file mode 100644
index 3431d4b..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "3",
- "6",
- "7",
- "9",
- "10",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " ! ",
- " # ",
- " $$$ % % & # ' ((( ! ))))) ) * ",
- " $ %% & + ### ' ' ((( ! )) ) ) * ",
- " $$ %% & ++ # '' ((( !! )) )))) ** ",
- " $ & + # ( ) ",
- " & & + ",
- " !! ",
- " ! ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-500-100-2.0-grid-reference.json
deleted file mode 100644
index 4016583..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "3",
- "7",
- "9",
- "2",
- "6",
- "10",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ! ! ",
- " !! ",
- " !! ",
- " !! ",
- " ! ! ",
- " ! ! ",
- " # # ",
- " # # ",
- " $ % ## & ' ",
- " $$ $ ( ( % ## )) )) &&& && ! ! ' ' '' ' ' ' * * ",
- " $$$ ( ( % ### ) ) & & & !!! ''' ''' ''' *** ",
- " $ ( ( % % % + # # # ) ) & & !! '' ' '' ** ",
- " $$$ ((( %%% + + # ))) & &&& !! '' ''' '' ** ",
- " $$$ ( ( %% +++ # ) ) & & & ! ! '' ' ''' ' ' * * ",
- " $ $ $ ( ( % + # ) ) && & ! !! ' ''' ' ' ' '' * ** ",
- " $ %%% ++ # & ' ",
- " %% % + + ",
- " + ++ ",
- " ! ! ",
- " ! ! ",
- " !! ",
- " !! ",
- " !! ! ",
- " ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-501-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-501-100-1.0-grid-reference.json
deleted file mode 100644
index b6a232d..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-501-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "3",
- "6",
- "7",
- "9",
- "10",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " ! ! ",
- " ## ",
- " $$$ % % & # '' ( !!! ) )) ) *** ",
- " $ %% & + ## ''' ( ( ! ) ) ) * ",
- " $$ & ++ # ''' (( !! )) )) ** ",
- " $ & + # ' ! * ",
- " & & + ",
- " ! ",
- " ! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-501-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-501-100-2.0-grid-reference.json
deleted file mode 100644
index c60859b..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-501-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "3",
- "4",
- "6",
- "7",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " !! ! ",
- " !!! ",
- " ! ",
- " !!! ",
- " !! ! ",
- " ! ! ",
- " # # ",
- " ### ",
- " $ % & ' ## ( ) ! * ",
- " $$ $ %% % & ' ## (( ((( ))) )) !!!! ** ** ** * ** * ++ ++ ",
- " $$$ %%%% & ' #### ( ( ( ) ) ) !!! * * *** * * +++ ",
- " $ % % &&& & ' ### # ( ( ) ) ! * ** * + ",
- " $$$ %%%% &&&& ' '' # ((( ( ) ))) !!! *** ** *** +++ ",
- " $$$ %% %% && ''' # ( ( ( ) ) ) !!!! * * **** ** * +++ ",
- " $ $ $ % % && ' # ( (( )) ) ! ! ! * **** * * * + + ",
- " $ % &&& '' # ( ) ! * ",
- " && & '' ' ",
- " ' ' ",
- " ! !! ",
- " ! ! ",
- " !! ",
- " !! ",
- " ! ! ",
- " ! !! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-502-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-502-100-1.0-grid-reference.json
deleted file mode 100644
index 220b28f..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-502-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "4",
- "6",
- "7",
- "9",
- "10",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ! ",
- " ## ",
- " $$$ % % & # ' ' ( ( !!! ) )) ) *** ",
- " $ %% + & ## ''' ( ( ! ) )) ) * ",
- " $$ ++ && ''' (( ! )) )) )) ** ",
- " $ + & ' ! * ",
- " + + & & ",
- " ! ",
- " ! ",
- " ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-502-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-502-100-2.0-grid-reference.json
deleted file mode 100644
index b3e3220..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-502-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "3",
- "4",
- "6",
- "7",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ! !! ",
- " !!! ",
- " ! ",
- " ! ! ",
- " !! !! ",
- " ! ! ",
- " # # ",
- " ### ",
- " $ % & ' ## ( ! ",
- " $$ $ %% % & ' ## ( (( ) ) !!!!! * * * * ** ** + + ",
- " $$$ %%%% & ' #### ((( ( ))) !!! * * *** * * +++ ",
- " $ % %% &&& & ' ### # ( ( ) )) ! * ** * + ",
- " $$$ % %% &&&& '''' # ((( ( )) !!! *** ** *** +++ ",
- " $$$$ %% %% && ''' # ( ((( ) )) !!! * * * * * * +++ ",
- " $ $ $ % % && ' # ( (( ) ) ! ! ! * * * *** * + + ",
- " $ % &&& ''' # ( ! ",
- " & & '' ' ",
- " ' ' ",
- " !! ! ",
- " ! ! ",
- " ! ",
- " !!! ",
- " ! ! ",
- " ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-505-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-505-100-1.0-grid-reference.json
deleted file mode 100644
index 0793bfc..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-505-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "4",
- "6",
- "7",
- "9",
- "10",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " ! ",
- " ## ",
- " $$$ % % & # ' ' ( ( ! )))))) ) *** ",
- " $ %% + & ## '' (( !! )) ) ) * ",
- " $$ % ++ & ((( !! )) )) ** ",
- " $ % ++ & ( ) * ",
- " & & ",
- " !! ",
- " ! ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-505-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-505-100-2.0-grid-reference.json
deleted file mode 100644
index 9008916..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-505-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "4",
- "6",
- "7",
- "9",
- "10",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ! ! ",
- " !! ",
- " !! ",
- " !! ",
- " ! ! ",
- " !! ! ",
- " # # ",
- " # # ",
- " $ % & ## ' ( ) ",
- " $$ $ %% % & ## ' '' (( ( ! ! ) ) )) ) ) ) ** * ",
- " $$$ %%%% & #### '''' ( ((( !!! ))) ))) ))) *** ",
- " $$ % %% ++ + & # ### '' ' ( (( !! ) )) )) * ",
- " $$ % %% + + &&&& # '' ' ( (( !! )) )) )) *** ",
- " $$$$ %% %% ++ &&& # ' '' ((( ( ! ! )) ) )))) )) ) **** ",
- " $ $ $ %% % ++ & # ' '' (( (( ! !! ) ))) ) ) ) )) * * ",
- " $ % +++ &&& # ' ( ) ",
- " + + & && ",
- " & & ",
- " ! ! ",
- " !!! ",
- " !! ",
- " !! ",
- " !! ! ",
- " ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-510-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-510-100-1.0-grid-reference.json
deleted file mode 100644
index 012886e..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-510-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " ",
- " ## ",
- " $ % % # & & ' ' ! ( (( ( ))) ",
- " $ %% * + ## && '' !! (( ( ( ) ",
- " $$ %%% * ++ &&& '' !! (( (( ) ",
- " % * ++ & ) ",
- " * * ++ ",
- " !! ",
- " ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-2-510-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-2-510-100-2.0-grid-reference.json
deleted file mode 100644
index 3cfb385..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-2-510-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "3",
- "6",
- "7",
- "9",
- "10",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ! ! ",
- " !! ",
- " !! ",
- " !! ",
- " ! ! ",
- " !! !! ",
- " # # ",
- " ### ",
- " $ % & ## ' ( ) ",
- " $$ $ %% % & ## ' '' (( ( ! ! ) ) )) ) ) ) ** ** ",
- " $$$ % %% & #### ''' ' ( (( !! ) ) ))) ))) *** ",
- " $$ % %% & & & + ### # '' ' ( (( !! ) )) ) * ",
- " $$ % %% &&& + + # '' ' ( (( !! )) )) )) *** ",
- " $$$$ %% % && ++ # ' ''' (( ( ! ! )) ) )))) )) ) *** ",
- " $ $ $ %% %% && ++ # ' '' (( (( !! !! ) )) ) ) ) ) * * ",
- " $ % &&& ++ # ' ( ) ",
- " & & + + ",
- " ++ ++ ",
- " ! ! ",
- " !!!! ",
- " !! ",
- " !! ",
- " !!!! ",
- " ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-490-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-490-100-1.0-grid-reference.json
deleted file mode 100644
index 0a4b05b..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-490-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "3",
- "4",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " ! ! ",
- " # ",
- " $ $ % # #### & & ' ' ! ! (( (( ( ",
- " $ %%% ) * ### && '' ! ( ( ( + ",
- " %% )) ** && '' !! (( (( ",
- " )) * **** ",
- " * * ",
- " !! ",
- " ! + ",
- " ! ++ + ",
- " + ++++",
- " + + + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-490-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-490-100-2.0-grid-reference.json
deleted file mode 100644
index 579ad0a..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-490-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "2",
- "6",
- "7",
- "1",
- "9",
- "3",
- "4",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ! ",
- " ! ! ",
- " # ! $ % ",
- " && && # # # !!! $ $ $ % % % ' ' '' '' ' ' ",
- " & & # # # ! ! $$$ $ %%% % ''' ' ' '' ",
- " & # # # ( ) ) ! ! ! $$ $ $ % %% % * '' ' '' + ",
- " &&& ## # )) ) ) $$ $ %% % '' ''' '' ",
- " & & ## # # ))) ) $ $ $ % %% % ' ' ' ' ' ' ",
- " & & # # # ) )))))))) $$ $$ $ % % % '' ''' ''' ' ",
- " # ))) ) $ % ",
- " )) ) ) ",
- " ) ) ) ",
- " ) ",
- " ",
- " ",
- " ",
- " + + ",
- " +++ "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-495-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-495-100-1.0-grid-reference.json
deleted file mode 100644
index 7271752..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-495-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "3",
- "4",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " ! ! ",
- " ## ",
- " $ $ $ % # #### & ' ! (( (( ( ",
- " $ $ % % ) * * ## &&& ' ' ! ( ( (( + ",
- " $ %% ) ** * && '' !! (( ((( ",
- " $ ) * ***** ( ",
- " ) ) * * * ",
- " !! ",
- " ! + ",
- " ! ++ + ",
- " ++ ++++",
- " + + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-495-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-495-100-2.0-grid-reference.json
deleted file mode 100644
index 664ce15..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-495-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "6",
- "1",
- "2",
- "7",
- "9",
- "3",
- "4",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ! ! ",
- " !!! ! ",
- " !! ! # ",
- " $ $$ %% %% !! !# # # & && ' ' ' '' ' ' ",
- " $ $ % % !! ! !### # & & ''' ' ' ''' ",
- " $ % % ( ) ) ! !! ! ## # # & & * '' ' '' + ",
- " $$$ %%% ) ) ) ! ## # &&& '' ''' '' ",
- " $ $ % % ))) ) # ## # & & ' ' ' ' ' ' ",
- " $ $ % % ) )))))))) # # # & & ' ''' ' ' '' ",
- " ))) ) # ",
- " ) )) ) ",
- " ) ) ) ",
- " ) ",
- " ",
- " ",
- " ",
- " + + ",
- " ++ "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-497-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-497-100-1.0-grid-reference.json
deleted file mode 100644
index d958e66..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-497-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "3",
- "4",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ",
- " ! ! ",
- " ## ",
- " $ $ $ % % # #### & & ' ' ' ! ! ! ( (((( ( ",
- " $ $ %% ) * * ## && '' ' ! ! ( (( (( + ",
- " $ %% ) ** * && ' ! (( (( (( ",
- " $ ) * ***** ' ! ( ",
- " ) ) * * ",
- " ! ",
- " ! ",
- " ! ! ",
- " + ++++ ",
- " + + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-497-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-497-100-2.0-grid-reference.json
deleted file mode 100644
index d56b194..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-497-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "6",
- "7",
- "9",
- "1",
- "2",
- "3",
- "4",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! !! ! ",
- " ! ! ! ",
- " ! ! # $ % ",
- " & & '' '' !! !# # # $ $ $ %% %% % % %% %% ",
- " & & ' ' ! ! ! ## # $$ $ % % %% % %% ",
- " & ' ' ( ) ) ! !!! ! ## # # $ $$ $ * % %% % % + ",
- " &&& ''' ) ) ) ! ## # $$ $ %%% %% %%%% ",
- " & & ' ' )) ) # # # $ $ $ % % % % % %% ",
- " & & ' ' )) )))))))) ## # # $$ $ $ % %%% %%% % ",
- " )) ) # $ % ",
- " ) ) ) ",
- " ) ) ) ",
- " ) ",
- " ",
- " ",
- " ",
- " ++ + ",
- " + + "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-498-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-498-100-1.0-grid-reference.json
deleted file mode 100644
index 2f8f820..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-498-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "3",
- "4",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " ! ! ",
- " # ",
- " $ $ $ % % # #### & & ' ' ' ! ! ( (( (( ",
- " $ $ %% ) * * ### && '' ' ! ! ( ( (( + ",
- " $$ $ %% ) ** * '' ' !! ! (( (( ",
- " $ ) ** **** ' ! ",
- " ) ) * * ",
- " !! ",
- " ! + ",
- " ! ++ + ",
- " + ++++ ",
- " + + + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-498-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-498-100-2.0-grid-reference.json
deleted file mode 100644
index 3a44d25..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-498-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "6",
- "7",
- "9",
- "1",
- "2",
- "3",
- "4",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! !! ",
- " ! ! ",
- " ! # $ % ",
- " & & ' '' !!! # # # $ $ $ % % % % % % ",
- " & & ' ' ! ! ### # $$$ $ %%% %%% %%%% ",
- " & ' ' ( ) ) ! ! ! ## # # $ $$ $ * %% %% %%% + ",
- " &&& ''' ) ) ) ## # $$ $ %% %% %%%% ",
- " & & ' ' )) ) # # # $ $ $ % %% %% % % %% ",
- " & & ' ' )) ))))))))) # ## # $ $$ $ % % % %%% % ",
- " )) ) # $ % ",
- " ) ) ) ",
- " )) )) ) ",
- " ) ",
- " ",
- " ",
- " ",
- " + + ",
- " +++ "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-499-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-499-100-1.0-grid-reference.json
deleted file mode 100644
index 59b79ea..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-499-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "3",
- "4",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " # ! ",
- " # # ",
- " $ $ $ % % # #### & & & ' ' !! ! ( (( (( ",
- " $ $ %% ) ) * ### # && & '' ' !! ! ( ( ( + ",
- " $$ $ %% ) ) ** # && & '' ' !! ! (( (( ",
- " $ ) ) ** **** & ' ! ",
- " ) ) ) * ",
- " !! ",
- " ! + ",
- " !! ++ + ",
- " ++ ++++",
- " + + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-499-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-499-100-2.0-grid-reference.json
deleted file mode 100644
index 4d10f54..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-499-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "6",
- "7",
- "1",
- "2",
- "9",
- "3",
- "4",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ! ",
- " ! ! ",
- " ! # $ ",
- " % % & & !!! # # # $ $ $ ' ' '' '' ' ' ",
- " % % & & ! ! # # # $$$ $ '' ' ' '' ",
- " % & & ( ) ) ! ! ! # # # $ $$ $ * '' ' '' + ",
- " %%% &&& ) ) ) ## # $$ $ '' ''' '' ",
- " % % & & )) ) ## # # $$ $ $ ' ' ' ' ' ' ",
- " % % & & )) ))))))))) # # # $ $$ $ '' ' ' ''' ' ",
- " )) ) # $ ",
- " ) ) ) ",
- " )) )) ) ",
- " ) ",
- " ",
- " ",
- " ",
- " + + ",
- " ++ "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-500-100-1.0-grid-reference.json
deleted file mode 100644
index 272429d..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "3",
- "4",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " # ! ",
- " # # ",
- " $ $ $ % % # #### & & '' ' ! (( (( ( ",
- " $ $ %% ) ) * ### # & & & ''' ' ! (( ( (( + ",
- " $$ $ %% ) ) ** # && & '' ' !! (( ((((( ",
- " $ ) ) * **** & ' ( ",
- " ) ) ) * ",
- " !! ",
- " ! ",
- " !! ++ ",
- " + ++++",
- " + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-500-100-2.0-grid-reference.json
deleted file mode 100644
index 7692932..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "7",
- "1",
- "2",
- "6",
- "9",
- "3",
- "4",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ",
- " ! ! ",
- " !! # ",
- " $ $ % % !! && && ## ## # ' ' ' ' ' ' ",
- " $ $ % % ! ! & & # # # ''' ' ' ''' ",
- " $ % % ( ) ) ! ! ! & & # # # * '' ' '' + ",
- " $$$ %%% ) ) ) &&& ### # '' ''' '' ",
- " $ $ % % ))) ) & & # # # '' ' ' ' ' ' ",
- " $ $ % % ) )))))))) & & # # # ' ''' ' ' '' ",
- " )) ) # ",
- " ) ) ) ",
- " ) )) ) ",
- " ) ",
- " ",
- " ",
- " ",
- " + + ",
- " +++ "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-501-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-501-100-1.0-grid-reference.json
deleted file mode 100644
index 9b77ea9..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-501-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "3",
- "4",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " # ! ! ",
- " ## # ",
- " $ $ $ % % # ##### & & ' ! ! ( (( ( ",
- " $ $ %% ) ) * ## # &&& & ' ' ! ( ( (( + ",
- " $$ $ ) ) ** # && & '' !! (( (( ( ",
- " $ ) ) * **** & ( ",
- " ) ) ) * ",
- " ! ",
- " ! ",
- " ! + ",
- " + ++++ ",
- " + + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-501-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-501-100-2.0-grid-reference.json
deleted file mode 100644
index 6017a39..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-501-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "1",
- "2",
- "9",
- "6",
- "7",
- "3",
- "4",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ! ! ",
- " !!! ! ",
- " # $ !! ! % ",
- " # # # $ $ $ !! && && '' '' %% %% % % %% %% ",
- " # # # $$$ $ ! !! !& & ' ' % % %%% % %% ",
- " # # $ $ $ ( ) ) !!! ! ! & & ' ' * % %% % % + ",
- " ### # $$$ $ ) ) ) !&&& ''' %%% %% %%%% ",
- " # # # $ $$ $ ))) ) & & ' ' % % % %% %% %% ",
- " # # # $ $ $ ) )))))))) & & ' ' % %%% % % % ",
- " # $ )) ) % ",
- " )) ) ) ",
- " ) ) ) ",
- " ) ",
- " ",
- " ",
- " ",
- " ++ + ",
- " + + "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-502-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-502-100-1.0-grid-reference.json
deleted file mode 100644
index 7c7cbe1..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-502-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "3",
- "4",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " # ! ! ",
- " ## # ",
- " $ $ $ % % # ##### & ' ' ! ! ( (( ( ",
- " $ $ %% ) ) * ## # &&& ' ' ! ( (( ( + ",
- " $$ $ )) ) ** # && '' (( (( (( ",
- " $ ) ) * **** ",
- " ) ) ) * * ",
- " ! ",
- " ! + ",
- " ! ! ++ + ",
- " + ++++ ",
- " + + + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-502-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-502-100-2.0-grid-reference.json
deleted file mode 100644
index d7af6c1..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-502-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "3",
- "4",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ! ! ",
- " !!! ! ",
- " # $ !! ! % & ' ",
- " # # # $ $ $ !! !% % % & & & ' ' ' ' '' '' ",
- " ### # $$$ $ ! !! !%%% % &&& & ' ' ''' ' '' ",
- " # # $ $$ $ ( ) ) !!! ! ! % % % & && & * ' '' ' ' + ",
- " ### # $$ $ )) ) ) !%%% % && & ''' '' '''' ",
- " # ## # $ $$ $ ))) ) % %% % & && & ' ' ' ' ' '' ",
- " # # # $ $ $ ) )))))))) % % % & & & ' ' ' ''' ' ",
- " # $ ))) ) % & ' ",
- " )) ) ) ",
- " ) ) ) ",
- " ) ",
- " ",
- " ",
- " ",
- " + ++ ",
- " +++ "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-505-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-505-100-1.0-grid-reference.json
deleted file mode 100644
index 0fc786d..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-505-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "3",
- "4",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " ! ",
- " ## ",
- " $ $ $ % % % # #### & & ' ' ! ((( (( ( ",
- " $ $ %% % ) ) * * ## && '' ' !! (( ( (( + ",
- " $$ $ % )) ) * * '' ' !! (( (( ( ",
- " $ % )) ) * **** ' ( ",
- " ) * * * ",
- " !! ",
- " ! ",
- " !! ++ ",
- " + ++++ ",
- " + + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-505-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-505-100-2.0-grid-reference.json
deleted file mode 100644
index a942312..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-505-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "3",
- "4",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ! ! ",
- " ! ! ! ",
- " # $ !! ! % & ' ",
- " # # # $ $ $ !! !% % % & & & ' ' ' ' ' '' ",
- " ### # $$$ $ !! ! ! %%% % &&& & ''' ''' '''' ",
- " ## # $ $$ $ ( ) ! !!! ! %% % % & && & * ' '' '' ' + ",
- " ## # $$ $ ) )) ! %% % && & '' '' '' ' ",
- " # ## # $ $$ $ ))) % % % && & & '' ' ' '' '' '' ",
- " # # # $$ $ $ ) )))))))) % %% % & && & ' ''' ' ' '' ",
- " # $ ))) % & ' ",
- " ) )) ",
- " ) ) ",
- " ",
- " ",
- " ",
- " ",
- " ++ + ",
- " +++ "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-510-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-510-100-1.0-grid-reference.json
deleted file mode 100644
index 7ad189d..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-510-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "3",
- "4",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " # ",
- " ## # ",
- " $ $ % % # ##### & ' ' ' ! ( (( ( ",
- " $ $ %% % ) * ## # && '' ' !! (( ( (( + ",
- " $$ $ %% % ) ** # && '' ' !! (( (( ( ",
- " $ % ) ** **** ' ( ",
- " ) ) ** ",
- " !! ",
- " + ",
- " !! + ",
- " + ++++ ",
- " + + + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-3-510-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-3-510-100-2.0-grid-reference.json
deleted file mode 100644
index 282de03..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-3-510-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "3",
- "4",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ! ! ",
- " !!! ! ",
- " # $ !! ! % & ' ",
- " # # # $ $ $ !! !% % % & & & ' ' ' ' ' '' ",
- " ### # $$ $ ! !! !%%% % && & ' ' ''' '''' ",
- " ## # $ $$ $ ( ) ) !!! ! ! %% % % & && & * ' '' ' ' + ",
- " ## # $$ $ ) ) ) ! %% % && & '' '' '' ' ",
- " # ## # $ $ $ )) ) % %% % & & & '' ' ' '' '' '' ",
- " # # # $$ $$ $ )) ))))))))) % % % && && & ' '' ' ' ' ",
- " # $ )) ) % & ' ",
- " ) ) ) ",
- " )) )) ) ",
- " ) ",
- " ",
- " ",
- " ",
- " + ++ ",
- " + + "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-490-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-490-100-1.0-grid-reference.json
deleted file mode 100644
index 3673116..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-490-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " ! ! ",
- " # ",
- " $ $ % % # & & & ' ' ! ! (( (( ( ) ",
- " $ %%% % * + ### && & '' ! ( ( ( ) ) ",
- " %% % ** ++ && & '' !! (( (( ) ",
- " % ** + & ) ",
- " + + ",
- " !! ",
- " ! ",
- " ! )) ",
- " ) ",
- " ) ) ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-490-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-490-100-2.0-grid-reference.json
deleted file mode 100644
index c7a4fc8..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-490-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "2",
- "4",
- "6",
- "7",
- "1",
- "9",
- "3",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ! ",
- " ! ! ",
- " # $ ! % & ",
- " '' '' # # # $ !!! % % % & & & ( ( (( (( ( ( ",
- " ' ' # # # $ ! ! %%% % &&& & ((( ( ( (( ",
- " ' # # # ) $ $ ! ! ! %% % % & && & * (( ( (( + ",
- " ''' ## # $$ $ $ %% % && & (( ((( (( ",
- " ' ' ## # # $$$ $ % % % & && & ( ( ( ( ( ( ",
- " ' ' # # # $ $ %% %% % & & & (( ((( ((( ( ",
- " # $$$ $ % & ",
- " $$ $ ",
- " $ $ ",
- " ",
- " ",
- " ",
- " ",
- " + + ",
- " +++ "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-495-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-495-100-1.0-grid-reference.json
deleted file mode 100644
index 1d29a92..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-495-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "4",
- "6",
- "7",
- "9",
- "10",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " ! ! ",
- " ## ",
- " $ $ $ % % & # ' ( ( ! )) )) ) * ",
- " $ $ % % % + & & ## ''' ( ( ( ! ) ) )) * * ",
- " $ %% % + && & '' (( ( !! )) ))) * ",
- " $ % + & & ( ) * ",
- " + + & & ",
- " !! ",
- " ! ",
- " ! ** ",
- " ** ",
- " * ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-495-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-495-100-2.0-grid-reference.json
deleted file mode 100644
index bd7bbda..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-495-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "2",
- "4",
- "7",
- "1",
- "6",
- "9",
- "3",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ",
- " !!! ",
- " # $ !! ! % ",
- " & && ## ## # $ !! !' ' % %% % ( ( ( (( ( ( ",
- " & & # # # $ !! ! !''' % % % ((( ( ( ((( ",
- " & # # # ) $ $ ! !! ! '' ' % % % * (( ( (( + ",
- " &&& ### # $ $ $ ! '' %%% % (( ((( (( ",
- " & & # # # $$$ $ !' '' % % % ( ( ( ( ( ( ",
- " & & # # # $ $ ' ' % % % ( ((( ( ( (( ",
- " # $$$ $ ! % ",
- " $ $$ ",
- " $ $ ",
- " ",
- " ",
- " ",
- " ",
- " + + ",
- " ++ "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-497-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-497-100-1.0-grid-reference.json
deleted file mode 100644
index e6cc450..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-497-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "4",
- "6",
- "7",
- "9",
- "3",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ",
- " ! ! ",
- " ## ",
- " $ $ $ % % & # ' ' ' ( ( ! ! ! ) )))) ) ",
- " $ $ %% * & & ## '' ' (( ! ! ) )) )) + ",
- " $ %% * && & '' ' ! )) )) )) ",
- " $ * & & ' ! ) ",
- " * * & ",
- " ! ",
- " ! ",
- " ! ! ",
- " + ",
- " + + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-497-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-497-100-2.0-grid-reference.json
deleted file mode 100644
index 867c8e3..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-497-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "2",
- "4",
- "6",
- "7",
- "9",
- "1",
- "3",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! !! ",
- " ! ! ",
- " # $ ! ! % & ' ",
- " ( ( ## ## # $ !! !% % % & & & '' '' ' ' '' '' ",
- " ( ( # # # $ ! ! ! %% % && & ' ' '' ' '' ",
- " ( # # # ) $ $ ! !!! ! %% % % & && & * ' '' ' ' + ",
- " ((( ### # $ $ $ ! %% % && & ''' '' '''' ",
- " ( ( # # # $$ $ !% % % & & & ' ' ' ' ' '' ",
- " ( ( # # # $$ $ %% % % && & & ' ''' ''' ' ",
- " # $$ $ ! % & ' ",
- " $ $ ",
- " $ $ ",
- " ",
- " ",
- " ",
- " ",
- " ++ + ",
- " + + "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-498-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-498-100-1.0-grid-reference.json
deleted file mode 100644
index 50d2990..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-498-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "4",
- "6",
- "7",
- "9",
- "10",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " ! ! ",
- " # ",
- " $ $ $ % % & # ' ' ' ( ( ! ! ) )) )) * ",
- " $ $ %% + & & ### '' ' (( ! ! ) ) )) * * ",
- " $$ $ %% + && & ' (( !! ! )) )) * ",
- " $ + && & ' ! * ",
- " + + & ",
- " !! ",
- " ! ",
- " ! ** ",
- " * ",
- " * * ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-498-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-498-100-2.0-grid-reference.json
deleted file mode 100644
index 42eff4b..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-498-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "2",
- "4",
- "6",
- "7",
- "9",
- "1",
- "3",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! !! ",
- " ! ! ",
- " # $ ! % & ' ",
- " ( ( # ## # $ !!! % % % & & & ' ' ' ' ' ' ",
- " ( ( # # # $ ! ! %%% % &&& & ''' ''' '''' ",
- " ( # # # ) $ $ ! ! ! %% % % & && & * '' '' ''' + ",
- " ((( ### # $ $ $ %% % && & '' '' '''' ",
- " ( ( # # # $$ $ % % % & & & ' '' '' ' ' '' ",
- " ( ( # # # $$ $ % %% % & && & ' ' ' ''' ' ",
- " # $$ $ % & ' ",
- " $ $ ",
- " $$ $$ ",
- " ",
- " ",
- " ",
- " ",
- " + + ",
- " +++ "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-499-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-499-100-1.0-grid-reference.json
deleted file mode 100644
index a1d6bca..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-499-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "3",
- "6",
- "7",
- "9",
- "10",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " ! ",
- " # ",
- " $ $ $ % % & # # ' ' ' ( !! ! ) )) )) * ",
- " $ $ %% & & + ### # '' ' (( !! ! ) ) ) * * ",
- " $$ $ %% & & ++ # '' ' (( !! ! )) )) * ",
- " $ & & ++ # ' ! * ",
- " & & + ",
- " !! ",
- " ! ",
- " !! ** ",
- " ** ",
- " * ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-499-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-499-100-2.0-grid-reference.json
deleted file mode 100644
index 0247e56..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-499-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "2",
- "4",
- "6",
- "1",
- "7",
- "9",
- "3",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ! ",
- " ! ! ",
- " # $ ! % ",
- " & & # # # $ !!! % % % ' ' ( ( (( (( ( ( ",
- " & & # # # $ ! ! % % % ''' (( ( ( (( ",
- " & # # # ) $ $ ! ! ! % % % ' '' * (( ( (( + ",
- " &&& ### # $ $ $ %% % '' (( ((( (( ",
- " & & # # # $$ $ %% % % '' ' ( ( ( ( ( ( ",
- " & & # # # $$ $ % % % ' '' (( ( ( ((( ( ",
- " # $$ $ % ",
- " $ $ ",
- " $$ $$ ",
- " ",
- " ",
- " ",
- " ",
- " + + ",
- " ++ "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-500-100-1.0-grid-reference.json
deleted file mode 100644
index 9e11775..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "3",
- "6",
- "7",
- "9",
- "4",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " ! ",
- " # ",
- " $ $ $ % % & # # ' (( ( ! )) )) ) ",
- " $ $ %% & & * ### # ' ' ((( ( ! )) ) )) + ",
- " $$ $ %% & & ** # '' (( ( !! )) ))))) ",
- " $ & & * # ( ) ",
- " & & * ",
- " !! ",
- " ! ",
- " !! ++ ",
- " + ",
- " + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-500-100-2.0-grid-reference.json
deleted file mode 100644
index 92372b7..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "2",
- "4",
- "6",
- "1",
- "7",
- "9",
- "3",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ",
- " ! ! ",
- " # $ !! % ",
- " & & # # # $ !! %% %% % '' '' ( ( ( ( ( ( ",
- " & & # # # $ ! ! % % % ' ' ((( ( ( ((( ",
- " & # # # ) $ $ ! ! ! % % % ' ' * (( ( (( + ",
- " &&& ### # $ $ $ %%% % ''' (( ((( (( ",
- " & & # # # $$$ $ % % % ' ' (( ( ( ( ( ( ",
- " & & # # # $ $ % % % ' ' ( ((( ( ( (( ",
- " # $$ $ % ",
- " $ $ ",
- " $ $$ ",
- " ",
- " ",
- " ",
- " ",
- " + + ",
- " +++ "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-501-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-501-100-1.0-grid-reference.json
deleted file mode 100644
index 74c8f8e..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-501-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "3",
- "6",
- "7",
- "9",
- "4",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " ! ! ",
- " ## ",
- " $ $ $ % % & # # ' ( ( ! ! ) )) ) ",
- " $ $ %% & & * ## # ''' ( ( ( ! ) ) )) + ",
- " $$ $ & & ** # '' (( ( !! )) )) ) ",
- " $ & & * # ( ) ",
- " & & * ",
- " ! ",
- " ! ",
- " ! + ",
- " + ",
- " + + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-501-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-501-100-2.0-grid-reference.json
deleted file mode 100644
index 834cc57..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-501-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "1",
- "2",
- "4",
- "6",
- "7",
- "9",
- "3",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ",
- " !!! ",
- " # $ % !! ! & ' ( ",
- " # # # $ $ $ % !! && && & '' '' ' (( (( ( ( (( (( ",
- " # # # $$$ $ % ! !! !& & & ' ' ' ( ( ((( ( (( ",
- " # # $ $ $ ) % % !!! ! ! & & & ' ' ' * ( (( ( ( + ",
- " ### # $$$ $ % % % !&&& & ''' ' ((( (( (((( ",
- " # # # $ $$ $ %%% % !& & & ' ' ' ( ( ( (( (( (( ",
- " # # # $ $ $ % % & & & ' ' ' ( ((( ( ( ( ",
- " # $ %% % ! & ' ( ",
- " %% % ",
- " % % ",
- " ",
- " ",
- " ",
- " ",
- " ++ + ",
- " + + "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-502-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-502-100-1.0-grid-reference.json
deleted file mode 100644
index 867ced4..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-502-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "3",
- "6",
- "7",
- "9",
- "10",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ! ",
- " ## ",
- " $ $ $ % % & # # ' ( (( ! ! ) )) ) * ",
- " $ $ %% & & + ## # ''' ( ( ( ! ) )) ) * * ",
- " $$ $ && & ++ # '' (( ( )) )) )) * ",
- " $ & & + # ( * ",
- " & & + + ",
- " ! ",
- " ! ",
- " ! ! ** ",
- " * ",
- " * * ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-502-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-502-100-2.0-grid-reference.json
deleted file mode 100644
index 351d1df..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-502-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "1",
- "2",
- "4",
- "7",
- "9",
- "6",
- "3",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ",
- " !!! ",
- " # $ % !! ! & ' ",
- " # # # $ $ $ % !! !( ( & & & ' ' ' ' '' '' ",
- " ### # $$$ $ % ! !! !((( &&& & ' ' ''' ' '' ",
- " # # $ $$ $ ) % % !!! ! ! ( ( & && & * ' '' ' ' + ",
- " ### # $$ $ %% % % !((( && & ''' '' '''' ",
- " # ## # $ $$ $ %%% % !( (( & && & ' ' ' ' ' '' ",
- " # # # $ $ $ % % ( ( & & & ' ' ' ''' ' ",
- " # $ %%% % ! & ' ",
- " %% % ",
- " % % ",
- " ",
- " ",
- " ",
- " ",
- " + ++ ",
- " +++ "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-505-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-505-100-1.0-grid-reference.json
deleted file mode 100644
index 08a271f..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-505-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "3",
- "4",
- "6",
- "7",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " ! ",
- " ## ",
- " $ $ $ % % & ' # ( ( ( ) ! *** ** * ",
- " $ $ %% & & ' ' ## (( ( )) !! ** * ** + ",
- " $$ $ && & ' ' ( )) !! ** ** * ",
- " $ && & ' ' ( * ",
- " ' ' ",
- " !! ",
- " ! ",
- " !! ++ ",
- " + ",
- " + + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-505-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-505-100-2.0-grid-reference.json
deleted file mode 100644
index cf36489..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-505-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "1",
- "2",
- "6",
- "9",
- "7",
- "3",
- "4",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ",
- " ! ! ",
- " # $ !! ! % & ",
- " # # # $ $ $ !! !% % % ' ' & & & & & && ",
- " ### # $$$ $ !! ! ! %%% % ''' &&& &&& &&&& ",
- " ## # $ $$ $ ( ) ! !!! ! %% % % ' '' * & && && & + ",
- " ## # $$ $ ) )) ! %% % '' && && && & ",
- " # ## # $ $$ $ ))) !% % % '' ' && & & && && && ",
- " # # # $$ $ $ ) !% %% % ' '' & &&& & & && ",
- " # $ ))) ! % & ",
- " ) )) ",
- " ) ) ",
- " ",
- " ",
- " ",
- " ",
- " ++ + ",
- " +++ "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-510-100-1.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-510-100-1.0-grid-reference.json
deleted file mode 100644
index 9957b50..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-510-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "8",
- "5",
- "1",
- "2",
- "6",
- "7",
- "9",
- "10",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! ",
- " ",
- " ## ",
- " $ $ % # # & ' ' ! ( (( ( ) ",
- " $ $ %% * + ## # && '' !! (( ( (( ) ) ",
- " $$ $ %% * ++ # && '' !! (( (( ( ) ",
- " $ * ++ # ( ) ",
- " * * ++ ",
- " !! ",
- " ",
- " !! ",
- " ) ",
- " ) ) ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/shieldsymbolizer-4-510-100-2.0-grid-reference.json b/tests/visual_tests/grids/shieldsymbolizer-4-510-100-2.0-grid-reference.json
deleted file mode 100644
index 4eff3aa..0000000
--- a/tests/visual_tests/grids/shieldsymbolizer-4-510-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "5",
- "1",
- "4",
- "7",
- "9",
- "2",
- "6",
- "3",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ",
- " !!! ",
- " # $ !! ! % & ",
- " # # # ' ' $ !! !( ( % % % & & & & & && ",
- " ### # '' $ ! !! !((( %% % & & &&& &&&& ",
- " ## # ' '' ) $ $ !!! ! ! (( ( % %% % * & && & & + ",
- " ## # '' $ $ $ ! (( %% % && && && & ",
- " # ## # ' ' $$ $ !( (( % % % && & & && && && ",
- " # # # '' '' $$ $ ( ( %% %% % & && & & & ",
- " # $$ $ ! % & ",
- " $ $ ",
- " $$ $$ ",
- " ",
- " ",
- " ",
- " ",
- " + ++ ",
- " + + "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-100-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-100-100-1.0-grid-reference.json
deleted file mode 100644
index c3057f4..0000000
--- a/tests/visual_tests/grids/simple-100-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "6",
- "9",
- "3",
- "2",
- "7",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! !! ",
- "! !!! !! ## # $$ $$ ",
- " ",
- " ",
- " %% % % ",
- " ! & % %%%%%% %%%%%%%%",
- " %% % %% ",
- " % % %",
- " ",
- " ",
- " &&& && && & ''''' (( ",
- "&&& & &&&& ",
- "&& & &&& && ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-100-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-100-100-2.0-grid-reference.json
deleted file mode 100644
index 4ae1289..0000000
--- a/tests/visual_tests/grids/simple-100-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "keys": [
- "1",
- "",
- "10",
- "3",
- "2"
- ],
- "data": {},
- "grid": [
- " !!!! !! !!! !!!!!!!!",
- "!!!! !! ! !! ! !! !!!!!!!",
- "!!!! !! ! !! ! !!!!!!!",
- "!!!! !! ! !! ! !!!!!!###!",
- " !!! !! !! ! !!#!!#!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!$$$$$!!!!!!!!$!!",
- "!!!!!!!!!!!$!!$$!!!$$!$$$",
- "! !!%!$!!!!$!$!!$!$!!!$!!",
- "!!!!!!!!!!!$!$$$$!$$$!$!!",
- "!!!!!!!!!!!$!$!!!!!!$!$!!",
- "!!!!!!!!!!!$!!$$$!$$$!!$$",
- "!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!%!!!!!%!!!!!!!!!!!!!!!!!",
- "%%%!!!%%%%!!%!%!!%%%!!!!!",
- "!%!!!!!%!!%%%!%!%!!%!!!!!",
- "!%!!!!!%!!%%!%%!%!!%!!!!!"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-150-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-150-100-1.0-grid-reference.json
deleted file mode 100644
index 9400a02..0000000
--- a/tests/visual_tests/grids/simple-150-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "keys": [
- "",
- "10",
- "1",
- "6",
- "4",
- "3",
- "9",
- "2",
- "5",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " # ### $$$ $ $$ !!! ! ",
- " # ## ### %% % $ $ !!!!! ! ",
- " ",
- " ",
- " &&& & & ''' ",
- " # ( & &&&&&&& &&&&&&&& && ' ' ''",
- " && & & &&& & & '' ",
- " & & & & ' ",
- " ",
- " ",
- "( (((( (( ((( )) )) ****** ",
- "((((( ( (((( ",
- "(((((( (((( (( ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-150-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-150-100-2.0-grid-reference.json
deleted file mode 100644
index 831b840..0000000
--- a/tests/visual_tests/grids/simple-150-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "keys": [
- "1",
- "",
- "8",
- "3",
- "2",
- "9"
- ],
- "data": {},
- "grid": [
- " !!!! !! ! !! !!!!!!!!!!!!!!!!!!!!",
- "!!!! ! ! ! ! ! !!!!!!!!!!!!!!!!!!!!",
- "!!!! !!! !! ! !!!!!!!!!!!!!!!!!!!",
- "!!!! !! ! !! ! !!!!!!!!!###!#!!##!#!!!",
- " !!!! ! !! !! !!!!!!!!!!#####!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!$$$$$!!!!!!!!$!!!!!$!!$!!!",
- "!!!!!!!!!!!!!!$!!$$!!!$$!$$$!!!$$$$!$$",
- "!! !!!%!!$!!!!$!$!!$!$!!!$!!!!!$!!$$!$",
- "!!!!!!!!!!!!!!$!$$$$!$$$!$!!!!!$!!$!!$",
- "!!!!!!!!!!!!!!$!$!!!!!!!$$!!!!!$!!$!!$",
- "!!!!!!!!!!!!!!$!!$$$!$$$!!$$!!!$$$$!!$",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!%!!!!%!!!!!!!!!!!!!!!!!!&&&&&!&&&&&",
- "%%%%%!!!%%%%!!%!%!!%%!!!!!!&&&&&!&&!&&",
- "!!!%!!!!%!!!%%%!%!%!!%!!!!!!!!!!!!!!!!",
- "%%!%!!!!%!!!%%!!%!%!!%!!!!!!!!!!!!!!!!"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-250-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-250-100-1.0-grid-reference.json
deleted file mode 100644
index 0f38781..0000000
--- a/tests/visual_tests/grids/simple-250-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "4",
- "8",
- "1",
- "6",
- "10",
- "3",
- "7",
- "2",
- "5",
- "9"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! # # # ",
- "$ $ $$$$$$ !!! ! !! ! !! ##### # #### ## ",
- "$ $ $$$ $$ !!!!!! !!! !!! %%%% # ##### ### ### #&&&&& ",
- " # ",
- " ",
- " ''' ' ((( ",
- " $ ) ' ''' ' ' '''' ''' '' ( ((( ( ( ( ((( ((((",
- " '' ' ' ' (( ( ( ((( ((",
- " ' ' ' ' ",
- " ",
- " ",
- " ) ) ))) )) ) * + ",
- " ))))) ) ) ) ) *** * ****** ++++ + ++ +++ ",
- " ) ))))) ) )) )) *** * * * * ** ++++++ ++ +++ ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-250-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-250-100-2.0-grid-reference.json
deleted file mode 100644
index f7625c8..0000000
--- a/tests/visual_tests/grids/simple-250-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "keys": [
- "1",
- "",
- "5",
- "7",
- "9",
- "3",
- "10",
- "2",
- "6",
- "8"
- ],
- "data": {},
- "grid": [
- " !!!! !! !!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!! ! ! ! ! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!! !! ! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!! !! ! !! ! !!!!!!!!###!##!#!!!$$$!$!$!!$$!%%!%%!%%%!%!!!!",
- " !!! !! !! ! !!!!#!!#!#####!!!!$!!$!$!!$!%%%%!!!%%!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!&&&&&&!!!!!!!!&!!!!&!!!&!!!!!!!!!!!!!!!!!!!!'",
- "!!!!!!!!!!!!!!!!!!!!&!!!&&!!&&&&&&!!!&&&!&&&!!&&!!&&!!!&&!!!!!!",
- "!!! !!!!!(!!!!!!&!!!&!!&!&!&!!!!&!!!!&!!!&!&!!&!!&!&&!&!&&!'!!!",
- "!!!!!!!!!!!!!!!!!!!!&!&&&&&!&&!!&!!!!&!!!&!&!!&!&&&&&&&&&&!!!!!",
- "!!!!!!!!!!!!!!!!!!!!&!&&!!!!!!&!&!!!!&!!!&!&!!&!!&!!!&&!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!&!!&&&!&&&&!&&!!!!&&!&!&!!&!!&&&&!&&&!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!(!!!!(!!!!!!!!!!!!!!!!!!))))!)))!!!****!*!****!!!!!!!!!!",
- "(!(((!(((!!!((((!((!(!(((!!!!!!))))!)))!!!****!*!**!*!!!!!!!!!!",
- "(!(!!!!(!!!!(!!(!((!(!(!!(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "(!!((!!(!!!!(!!!(((((!(!!(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-300-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-300-100-1.0-grid-reference.json
deleted file mode 100644
index c03601a..0000000
--- a/tests/visual_tests/grids/simple-300-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "4",
- "7",
- "10",
- "3",
- "6",
- "9",
- "2",
- "5",
- "8"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # # $ $ % % ",
- "! ! ! !!! ##### # ## $$$$$ $ $ $$ $$$ %%% % % ",
- "!!!! !! !!! ##### # # #### $ $$$$$ $$$$ $ $$$ %%%%%% %%",
- " ",
- " ",
- " &&& & & '' ' ' ((( ( ",
- " ! ) & &&& & & &&& &&& && ' '''''' '''' ( ((( ( ( ",
- " && &&& & & '' '' ' (( ((( ",
- " & & & & ' ' '' ( ( ",
- " ",
- " ",
- " ) ) ) ) ))) ) * * + + ",
- " ))))) ) )))) ) *** * * **** +++ ++ ++ ++ ",
- " ))) ))) ) ) )) ****** * * ** ++++ + ++ +++ ++ ",
- " ++ ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-300-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-300-100-2.0-grid-reference.json
deleted file mode 100644
index b1a0c28..0000000
--- a/tests/visual_tests/grids/simple-300-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "keys": [
- "1",
- "",
- "10",
- "6",
- "4",
- "3",
- "9",
- "2",
- "5",
- "7"
- ],
- "data": {},
- "grid": [
- " !!!! !! ! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!##!!###!###!!#",
- "! !!!! ! ! ! ! !! !!!!!!!!!!!!$$$$!!!!!!!!!!!$!!!!!!!!!!#!#!!#!#!!!#!!!!!",
- "! !!!! !! ! !! ! !!!!!!!!!!!!!!!$$!$$$$!!$$!$$!$!!!!!!!#!####!###!#!!!!!",
- "! !!!! !! ! !! ! !!!!!!%%%!%%%%%!!!$$$$$!!!!$$!$!$!!!!!!!!#!#!!!!!!#!#!!!!!",
- "! !!!! ! !! !! !!%!!%!%!%%%!!!$$!$$!$!!$$!$$!$!!!!!!!#!####!###!###!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!&&&&&&!!!!!!!!&!!!!!&!!&!!!!!!!!!!!!!!!!!!!!!''''''!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!&!!&&!!&&&&&&!!!&&&!&&&!!&&&!&&!!!&&!!!!!!!!!'!!''!",
- "!!!! !!!!!!(!!!!!!!&!!!!&!&!!&&!!!!&!!!!!&!!&!&&!&!!&!!&!&!!&!!!'!!!!'!'!!'",
- "!!!!!!!!!!!!!!!!!!!!!!!!&&&&&&!&&!!&!!!!!&!!&!!&!&!!&&&&&&&&&!!!!!!!!''''''",
- "!!!!!!!!!!!!!!!!!!!!!!!!&!&!!!!!!&!&!!!!!&!!&!!&!&!!&!!!!&!!!!!!!!!!!'!'!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!&!&&&&&&&&!&&!!!!&&!&!!&!&!!&&&&!&&&&!!!!!!!!'!''''",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!(!!!!!(!!!!!!!!!!!!!!))!))!))))!!!!******!******!!!!!!!!!!!!!!!!!!!",
- "(((!(((!(((!!!((((!((!(!(((!!)))))!!!!)!!!!***!*****!***!!!!!!!!!!!!!!!!!!!",
- "!!(!(!!!(!!!!!(!!(!((!(!(!!(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "(((!(((!(!!!!!(!!(!(((!(!!!(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-400-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-400-100-1.0-grid-reference.json
deleted file mode 100644
index 79dbdbf..0000000
--- a/tests/visual_tests/grids/simple-400-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "3",
- "5",
- "7",
- "9",
- "1",
- "2",
- "4",
- "6",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! !! # $ % % ",
- "&&& & &&&&&& !!!!! ! !! !!!!!!! ##### ###### $$$ $ $ $$ $$$ $ %%%%% % %%% %%% ",
- "&&& & && &&&& ! !!!!! !! !! !!!! ##### # ##### $$$$$$ $$$$ $ $$ $ %%%%%%% %% %%% ",
- " ",
- " ",
- " ",
- " & ' ! ( # ) $ * % + ",
- " ",
- " ",
- " ",
- " ",
- " ' ' ''' ''''' ' ( ( ) * * + + +++ + +",
- " ''' ' '''' ((( ( (( ((( ))))) ) ) *** * ** ** +++++ + +++",
- " ''''' ' '' ''' (((((( ( (((( ))))) ) )) ) ****** ** *** * + +++++ + +",
- " * ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-400-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-400-100-2.0-grid-reference.json
deleted file mode 100644
index 9666e8d..0000000
--- a/tests/visual_tests/grids/simple-400-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "keys": [
- "1",
- "",
- "9",
- "4",
- "6",
- "3",
- "7",
- "2",
- "5",
- "8"
- ],
- "data": {},
- "grid": [
- " !!!! !! !!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!##!!######!!!#!##!!#!###!!!",
- "!! !!!!! ! !! ! !! ! !!$$$$!!!!!$!!!$!!!!!!!!%%%!!!!!%!!!!!!!!!!!!!!!#!#!###!!!!#!!!!##!#!!#!#!!#!#",
- "!! !!!! !!! ! !!! !!!!$$$$$$!$!!$$$$$$!$$$!%!%%!%%%%!!%%!!%%!!!!!!######!##!!#!!!!#!!#!!#!#!!#!#",
- " ! !!!! ! ! !!! !!!!!!!$$$$$$!$!!$!$!$$!$$!!%!%%!%%%!!!%%!!!%!!!!!!#!#!!!!!!#!#!!!!#!!#!!#!#!!#!#",
- " ! !!!! !! !!!! !!!!!$$$$$$!$!!$!$$$$$$$!!%!%%!%%%%!!%%!!%%!!!!!!#!########!##!!!#!!#!!#!#!!#!#",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!&&&&&!!!!!!!!&!!!!!&!!&!!!!!!!!!!!!!!!!!'''''!!!!!!!!'!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&!!&&!!&&&!&&&!!&&&!&&&!!&&&!&&!!!&&!!!!'!!''!!'''!'''!!!'''!!''!'!!!'",
- "!!!!! !!!!!!!!!(!!!!!!!!!&!!!!&!&!!&!&!!!&!!!!!&!!&!!&!&!!&!!&!&!!&!!!'!'!!'!'!!!'!!!!!!!!!'!!'!'!'!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&!&&&&!&&&!&!!!!!&!!&!!&!&!!&&&&!&&&&!!!'!''''!'''!'!!!!!'''!''''!'!'!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&!&!!!!!!&!&!!!!!&!!&!!&!&!!&!!!!&!!!!!!'!'!!!!!!'!'!!!!!!!'!'!!!!!''!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&!&&&&!&&&!&&&!!!&&!&!!&!&!!&&&&!&&&&!!!'!!'''!'''!'''!!''''!''''!!'!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "((((!!!!!!!!(!!!!!(!!!!!!!!!!!!!!!!)))!!!!!)!!!)!!!!!!!!*****!!!!!!!!*!!!!!!!!!!*!!!!!!*!!!!*!!!!!!!",
- "!(!!((!!(((!(((!!(((!(!(!!(!(((!!!!!)!!)!!))!!!)!!)!!)!!!!*!!**!!***!***!!!!**!!*!!***!***!!***!!!!!",
- "!(!(!!(!(!!!(!!!!!(!!(!(((!(!!(!!!!!))!!!)))!!!)!!))!)!!!!*!*!!*!*!!!*!!!!!*!!*!*!*!!*!*!!*!*!!!!!!!",
- "!(!((((!(((!(!!!!!(!!((!((!(!!(!!!!!)!)))))))!!)!!!)!))!!!*!****!***!*!!!!!****!*!*!!*!*!!*!*!!!!!!!"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-600-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-600-100-1.0-grid-reference.json
deleted file mode 100644
index d7b0248..0000000
--- a/tests/visual_tests/grids/simple-600-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "3",
- "5",
- "7",
- "9",
- "2",
- "4",
- "6",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "! ! # # # $ $ % % & ",
- "!!!!! ! !!! !! ##### # ## ##### $$$ $ $$ $$ %%% % % % %%%% %%% &&&& & &&&&&& ",
- "! !!!!! !!! !! ##### # #### ## ## $$$$$$ $$ $ $$ %%% %%% % %% % %%% &&&&& & & &&& && ",
- " ",
- " ",
- " ",
- " ! ' # ( $ ) % * & + ",
- " ",
- " ",
- " ",
- " ",
- " ' '''' '' '' ( ) ) * * +++ +++ ++++++",
- " ''''' ' '' ' ((( ( ( (( ))))) ) ) ))) *** * ***** ** +++++ + +++ ",
- " '''''' ' '' '' ((( ( ( (( ((( ) ))))) ))))) *** * * ***** *** +++++ + +++++ ",
- " ** ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-600-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-600-100-2.0-grid-reference.json
deleted file mode 100644
index 35e7281..0000000
--- a/tests/visual_tests/grids/simple-600-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "4",
- "7",
- "10",
- "3",
- "6",
- "9",
- "2",
- "5",
- "8"
- ],
- "data": {},
- "grid": [
- " !! !!! !! !!! !! # ## ###### ### ## # # # # $ $$ $$$ $$$ $$$ $$ $ $ $$$ $ $$ % %% %% %%% %%% ",
- "! ! ! ! ! ! ! # # ## # # ## # # # ## $ $ $ $ $ $ $ $ $ $ $$ $ $$ $ % % % % % % %",
- "!!! ! ! ! ! !!!! # #### ## # # # # # # # $ $$$$ $$ $ $$ $$$$ $ $ $$$$$$ $ % %%%% %%% % % %",
- " ! ! ! ! ! ! # # # # # # # # # # $ $ $ $ $ $ $ $ $ $ $ % % %%% % %",
- "!!! !! !!!! ! ! !!!! # ######## ## # ### ### # $ $$$$ $$$ $$$ $$$$ $$$$ $ $$$ $ $ % %%% %%% %% %%% ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " &&&&& & & & ''''' ' ' ((((( ( ",
- " & &&& && &&& &&&& && & & &&& &&& ' ''' '' ''' '' ' ' '' ( ((( (( ((( (",
- " ! ) & & && & & & & && & && & & && & ' ' '' ' ' ' ' ' ' ' ( ( (( ( ( ( (",
- " & &&&&&&&& & & & & & &&&&&&&&&& ' '''''''' ' ''' ' ' ( (((((((( ( (",
- " & & & & & & & & & & ' ' ' ' ''' ''' ( ( ( ( (",
- " & &&& &&& && &&&& & & &&& &&& ' ''' ''' '' ''' ' '' ' ( ((( ((( (( (",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ))))) ) ) ***** * *** ++++++ + + + + ",
- " ) ))) )))))) )))) ) ) ))) * *** ** *** **** * * ** + ++ ++++++ ++ + +++ +++ +++ ",
- " ) ) ))) ) ) ) )) ) ) ) * ** * * * * * * * * * + + +++ + ++ + + ++ + + + + ",
- " ) ))))) )) ) ) ))) ) ) ) * ******** * * * * * **** + +++++ ++ + ++++ + + + + + + "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-800-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-800-100-1.0-grid-reference.json
deleted file mode 100644
index f83d6ed..0000000
--- a/tests/visual_tests/grids/simple-800-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "9",
- "10",
- "8"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ $ $$ % % & ' ( ) ) * * * ",
- " !!!!! ! !!!!!! ### # #### $$$$$ $ $$ $$$$$$$ %%% % %% %%% &&&&& &&&&&& ''''' ' ' ((( ( ( (( ((( ( ))))) ) ))) ))) ***** * ****** ",
- " !!!!! ! !! !!!! ##### # ## ### $ $$$$$ $$ $$ $$$$ %%%%%% % %%%% &&&&& & &&&&& ''''' ' '' ' (((((( (((( ( (( ( ))))))) )) ))) * ***** ****** ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( + ) * ",
- " ",
- " ",
- " ",
- " ",
- " + + ",
- " +++ + ++ ++ ",
- " ++++++ ++ +++ + ",
- " + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-800-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-800-100-2.0-grid-reference.json
deleted file mode 100644
index e975e17..0000000
--- a/tests/visual_tests/grids/simple-800-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "1",
- "",
- "3",
- "5",
- "7",
- "9",
- "2",
- "4",
- "6",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " !! !!!! !! !!! !!!!!!!#!!##!!######!!!###!###!!###!##!!!##!!!!!!!$!!$$!!$$$!$$$!!$$$$$$!!!$!$$$!!!!!%!!%%!!!%%!%%%!!!!%%!!%%!!%!!%!!%%!!%%%!!!!!&!!&&!!&&&&&&!!!&!&&!!&!&&&!!!&&!!!!!!!!!!!!!",
- "! ! !!! !!!!! ! !! ! !! ! !!!!!!#!#!!##!!!!#!!!!!#!!#!##!#!!#!!#!#!!#!!!!!!$!$!!$!$!!!$!!!!!$!!$!$!$!$$!$!!!!!%!%%!%!%!!!!%!!!!%!!!%!!%!%!!%!%!!%!%!!%!!!!&!&!&&&!!!!&!!!!&&!&!!&!&!!&!&!!&!!!!!!!!!!!!",
- " ! !! !!!! !!! ! !!! !!!!!!#!####!##!!#!!!!!#!!#!!#!#!!####!####!!!!!!$!$$$$!$$$!$!!!!!$!!$!$!$!$$$$$!!!!%!%%%%!%%%!!%!!!!%%%!%%%%!!%!%!%%%%!%!!%!!!!&&&&&&!&&!!&!!!!&!!&!!&!&!!&!&&&&!!!!!!!!!!!!",
- "!!!!! ! !!!! ! ! !!! !!!!!!!!!#!#!!!!!!#!#!!!!!#!!#!!#!#!!#!!!!#!!!!!!!!!$!$!!!!!!$!$!!!!!$!!$!$!$!$!!!!!!!!%!%!!!!!!!%!%!!!!!!%%%!!!!!%%!!%!!!!%!!%!!!!&!&!!!!!!&!&!!!!&!!&!!&!&!!&!&!!!!!!!!!!!!!!!",
- " ! ! !!!! !! !!!! !!!!!!!#!########!##!!!!##!#!!#!#!!####!####!!!!!!$!$$$$!$$$!$$$!!!$!!$!!$!!!$$$!!!!!%!!%%%!%%%!!%%!!!%%%!!%%%!!%%!!%%%%!%!!%!!!!&!&&&&&&&&!&&!!!&!!&!!&!&!!&!&&&&!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!! !!!!!!!!!!!!!!!!!!!'!!!!!!!!!!!!!!!!!!!#!!!!!!!!!!!!!!!!!!!(!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!)!!!!!!!!!!!!!!!!!!!%!!!!!!!!!!!!!!!!!!!*!!!!!!!!!!!!!!!!!!!&!!!!!!!!!!!!!!!!!!!+!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!'''''!!!!!!!!'!!!!!'!!!!!!!!!!!!!!!!!!!(((((!!!!!!!!(!!!!!(((!!!!!!!!!!!!!!!!!!!!!)))))!!!!!!!!)!!!!!!!!!)!!!!!!!!!!!*****!!!!!!!!*!!!!!!!!!!*!!!!!!*!!!!*!!!!!!!+++++!!!!!!!!+!!!!!+!!!!!",
- "!!!!!!!!!!!!!!!!'!!''!!'''!'''!!'''!'!'!!'!'''!!!!!!!!!(!!((!!!((!(((!!!((!!((!!(!!(!(((!!!!!!!!!!)!!))!!))))))!!!!)))!)!)!!)!!!!!!!!*!!**!!***!***!!!!**!!*!!***!***!!***!!!!!!!+!+++!!++++++!!!+++!+++",
- "!!!!!!!!!!!!!!!!'!'!!'!'!!!'!!!!!'!!'!'''!'!!'!!!!!!!!!(!(!!(!(!!!(!!!!!(!!(!((!(!!(!(!!!!!!!!!!!!)!)!!))!!!!)!!!!)!!!!)!)))!!!!!!!!!*!*!!*!*!!!*!!!!!*!!*!*!*!!*!*!!*!*!!!!!!!!!+!+!!++!!!!+!!!!!+!!+!!",
- "!!!!!!!!!!!!!!!!'!''''!'''!'!!!!!'!!''!''!'!!'!!!!!!!!!(!((((!(((!(!!!!!(!!(!!(!(!!(!(!!!!!!!!!!!!)!))))!))!!)!!!!!))!!)!!)!!!!!!!!!!*!****!***!*!!!!!****!*!*!!*!*!!*!*!!!!!!!!!+!++++!+++!+!!!!!+!++++"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-E-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-E-500-100-1.0-grid-reference.json
deleted file mode 100644
index a957e13..0000000
--- a/tests/visual_tests/grids/simple-E-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! !! ",
- " ! !!!!!!! !!!!!!! ",
- " !! ! !!!! ",
- " ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-E-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-E-500-100-2.0-grid-reference.json
deleted file mode 100644
index b7ab30f..0000000
--- a/tests/visual_tests/grids/simple-E-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!! ! !!! ",
- " ! !! !!!!!! !!!! ! ! !! ",
- " ! ! ! !! ! ! ! ! ! ! ! ",
- " !!!!!! !! ! ! ! ! ! !!!! ",
- " ! ! ! ! ! ! !! ! ",
- " ! !!!!!!!! !! ! ! ! !!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-N-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-N-500-100-1.0-grid-reference.json
deleted file mode 100644
index a96d365..0000000
--- a/tests/visual_tests/grids/simple-N-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ! !! ",
- " !!! ! ! !!!! !! ",
- " !! !!! !!! ",
- " ! ! ! ",
- " ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-N-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-N-500-100-2.0-grid-reference.json
deleted file mode 100644
index 6804954..0000000
--- a/tests/visual_tests/grids/simple-N-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " !!!!! ! !!!! ",
- " ! !! !! !!! !!!!! ! ! !! ",
- " ! ! ! ! ! ! ! ! ! ! ! ",
- " ! !!!! !!! ! ! ! ! ! !!!! ",
- " ! ! ! ! ! ! !! ! ",
- " ! !!! !!! !! ! ! !! !!!! ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-NE-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-NE-500-100-1.0-grid-reference.json
deleted file mode 100644
index 21736c8..0000000
--- a/tests/visual_tests/grids/simple-NE-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! !! ",
- " !!!!!!! !!!!!!! ",
- " !! ! !!!! ",
- " ! ! ! ",
- " ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-NE-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-NE-500-100-2.0-grid-reference.json
deleted file mode 100644
index 7fcd28d..0000000
--- a/tests/visual_tests/grids/simple-NE-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " !!!!!! ! !!! ",
- " ! !! !!!!!! !!!! ! ! !! ",
- " ! ! !! ! ! ! ! ! ! ! ",
- " !!!!!! !! ! ! ! ! ! !!!! ",
- " ! ! ! ! ! ! !! ! ",
- " ! !!!!!!!! !! ! ! ! !!! ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-NW-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-NW-500-100-1.0-grid-reference.json
deleted file mode 100644
index c710ebb..0000000
--- a/tests/visual_tests/grids/simple-NW-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ! !! ",
- " !!!!!! !!! !!! ",
- " ! !! !! ",
- " ! ! ! ",
- " ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-NW-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-NW-500-100-2.0-grid-reference.json
deleted file mode 100644
index 69289b0..0000000
--- a/tests/visual_tests/grids/simple-NW-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " !!!!!! ! !!! ",
- " ! !! !!!!!! !!!! ! ! !! ",
- " ! ! !! ! ! ! ! ! ! ! ",
- " !!!!!! !! ! ! ! ! ! !!!! ",
- " ! ! ! ! ! ! !! ! ",
- " ! !!!!!!!! !! ! ! ! !!! ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-S-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-S-500-100-1.0-grid-reference.json
deleted file mode 100644
index ae71814..0000000
--- a/tests/visual_tests/grids/simple-S-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ",
- " ",
- " !!! ! !! ",
- " !!! ! ! !!!! !! ",
- " !! !!! !!! ",
- " ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-S-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-S-500-100-2.0-grid-reference.json
deleted file mode 100644
index 17ec8b0..0000000
--- a/tests/visual_tests/grids/simple-S-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ! !!!! ",
- " ! !! !! !!! !!!!! ! ! !! ",
- " ! ! ! ! ! ! ! ! ! ! ! ",
- " ! !!!! !!! ! ! ! ! ! !!!! ",
- " ! ! ! ! ! ! !! ! ",
- " ! !!! !!! !! ! ! !! !!!! ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-SE-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-SE-500-100-1.0-grid-reference.json
deleted file mode 100644
index 24b2e42..0000000
--- a/tests/visual_tests/grids/simple-SE-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ",
- " ",
- " !!! !! ",
- " !!!!!!! !!!!!!! ",
- " !! ! !!!! ",
- " ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-SE-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-SE-500-100-2.0-grid-reference.json
deleted file mode 100644
index 3c41289..0000000
--- a/tests/visual_tests/grids/simple-SE-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!! ! !!! ",
- " ! !! !!!!!! !!!! ! ! !! ",
- " ! ! !! ! ! ! ! ! ! ! ",
- " !!!!!! !! ! ! ! ! ! !!!! ",
- " ! ! ! ! ! ! !! ! ",
- " ! !!!!!!!! !! ! ! ! !!! ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-SW-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-SW-500-100-1.0-grid-reference.json
deleted file mode 100644
index 756e82f..0000000
--- a/tests/visual_tests/grids/simple-SW-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ",
- " ",
- " !!! ! !! ",
- " !!!!!! !!! !!! ",
- " ! !! !! ",
- " ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-SW-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-SW-500-100-2.0-grid-reference.json
deleted file mode 100644
index 15b24d3..0000000
--- a/tests/visual_tests/grids/simple-SW-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!! ! !!! ",
- " ! !! !!!!!! !!!! ! ! !! ",
- " ! ! !! ! ! ! ! ! ! ! ",
- " !!!!!! !! ! ! ! ! ! !!!! ",
- " ! ! ! ! ! ! !! ! ",
- " ! !!!!!!!! !! ! ! ! !!! ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-W-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-W-500-100-1.0-grid-reference.json
deleted file mode 100644
index 1feb160..0000000
--- a/tests/visual_tests/grids/simple-W-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ! !! ",
- " !!!!!! !!! !!! ! ",
- " ! !! !! ",
- " ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-W-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-W-500-100-2.0-grid-reference.json
deleted file mode 100644
index 5aca190..0000000
--- a/tests/visual_tests/grids/simple-W-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!! ! !!! ",
- " ! !! !!!!!! !!!! ! ! !! ",
- " ! ! !! ! ! ! ! ! ! ! ! ",
- " !!!!!! !! ! ! ! ! ! !!!! ",
- " ! ! ! ! ! ! !! ! ",
- " ! !!!!!!!! !! ! ! ! !!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-shield-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/simple-shield-500-100-1.0-grid-reference.json
deleted file mode 100644
index 14430a3..0000000
--- a/tests/visual_tests/grids/simple-shield-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "1",
- "",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " !!!!!!!###!##########!#!!!!$!!!!!!!!%%%!%%%%%!%%%%!!!!&!!!!!!!!!!''''''''!'!'!!!!!(!!!!!!)))!)!!))))))!!!))!!!*!!!!!!!!!+++!",
- "!!!!!!!!###!#!##!#!!#!#!!!!!!!!!!!!!!%%%%%%%%!%!%%%!!!!!!!!!!!!!!!''''''!'''''!!!!!!!!!!!!)))))!)!!)))))!!)))!!!!!!!!!!!!++++",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(!!!!!!!!!!!!!!!!!!))!!!!!!!*!!!!!!!!!!!!!",
- " ! !!!! !!!!!!!!!!!$!$!$!!!!!$$!!!$!$!!!!!!!!!!!!!&!!&&!!&!!!!!!!!!!!!!!!!(!(!(!!!!(!(!!!!(!!(!!!!!!!!!*!*!*!*!*!*!!*!!*!!!!!",
- " ! !!!!!!!!!!$$$!$!!$$$$!!!$$!$$!!!!!!!!!!!!&&&!&&&&&!!!&&!!!!!!!!!!(((!(!!!((((((((((((!!!!!!!!!*****!*****!!!***!!!!!",
- " ! !!!!!!!!!!!$$$!$!$!!$$!!!$$!$$!!!!!!!!!!!!&&&&&&!&&!&!&&!!!!!!!!!!(((!(!(!((!((!(!((((!!!!!!!!!*!*****!***!!!***!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-shield-500-100-2.0-grid-reference.json b/tests/visual_tests/grids/simple-shield-500-100-2.0-grid-reference.json
deleted file mode 100644
index e329f6c..0000000
--- a/tests/visual_tests/grids/simple-shield-500-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "1",
- "",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " !!!!!!!!################!#!$!!!!!!%%%%%%%%%%%%%%%%!%!!&!!!!'''!!'''''''''''''!!!'!(''!!!))))))!)))))))))!))!)!*!!!!!!!++++!+",
- "!!!!!!!!!#!#!!!!#!#!###!#!#!!!!!!!!%%!!!!%%!%!!%!%%!%!!!!!!!''!!!!!!''!''!!!!!''!'!!''!!!))!!)!))!!!)!!))!))!)!!!!!!!!!+!!!!!",
- "!!!!!!!!!!!!!!!!#!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!!!!!!!!!!!!!'!'!!''!!'!''!!!'!''!'!'!'!!!!!!!!!!!!!!!!!!!!)!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!#!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(!!!!!!!!!!!!!!!!!!!!!!!!!!!*!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!&&&&&!!!!!!!!!!!!!!!&&&!!!!!!!!!!!!!!!!!!!!!(!!!!!!!!!!*****!!!!!!!!!!!!*!!!!!!*!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!&!!!!!!!!!!!&!!!!&!!!!!!!!!!!!!!!!!!!!!!!!(!!!!!!!!!!!!*!!!!!!!!!!*!!!*!!!!!!!!!!!!!",
- " !! !! !! !!!!!!$$!!$!$!!!!!!!!!!!!&!!&&&!&&&&&&&!!!&&&&!&!!&!&&&&!!!!!((!!(!(!!!!!!!!!!!!*!****!******!!*!***!!*!****!",
- " !! ! !!! !!! !!!!!!$$$$$$$$$$$!!!!!!!&!&!!!&&&!!&&&&&&&&!&!&&!&!&!!&!!!!!!(((((((((((!!!!!!!*!*!!*!*!!!*********!!*!*!!*!",
- " ! !!! ! !!! !!!!!!!!!!!!!!!$!!!!!!!!!!!!&!&!!!!!!&&!&!!!!&!!&!!&&!!&!!!!!!!!!!!!!!(!!!!!!!!!!!!*!*!!!!!**!*!!!*!*!!*!*!*!!*!",
- " !! ! !! !!!! !!!!!!!!!!!!!!$!!!!!!!!!!!!&!!&!!!&!&&!&!!!!&!!&!!&&!!&&!&!!!!!!!!!!!(!!!!!!!!!!!!*!*!!**!!*!*!!!*!*!!*!*!*!!*!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(!!!!!!!!!!!!!!!!!!!!!!!!!!!*!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-shield-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/simple-shield-600-400-1.0-grid-reference.json
deleted file mode 100644
index a882bb2..0000000
--- a/tests/visual_tests/grids/simple-shield-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,118 +0,0 @@
-{
- "keys": [
- "1",
- "",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " !!!!!!!!!!!!!!!!#!!!!!!!!$$$$$!!$$$$!!!$$$$$!!!!!%!!!!!!!!!!&&&&&&&&&!!&&&&!!!!!!!'!!!!!!!!(((((!!!((((((((((!(!!!!!)!!!!!!!!!*****!*******!!**!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!$$$$$!$!!$$!!!$$!$$!!!!!!!!!!!!!!!!&&&&&!&&!!!&!&&!!!!!!!!!!!!!!!!(((((!(!((!(((!((!!(!!!!!!!!!!!!!!!*****!*!*!***!!**!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " ! !!!! !!!#!!##!!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!%%!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!!'!!!!!!!!!!!!!!!!!!!!!!!!)!!!!!)!!!!!!!!!!)!!!!!!!!!!!!!!!!!+!+!+!+",
- " ! !!########!!####!!!!!!!!!!!!!!!!!!!%%%!%%%%%!%%%!!!!!!!!!!!!!!!!!!!!'''!''''''!!'!!!!!!!!!!!!!!!!!!)))!)!)))))))!!!))!!!!!!!!!!!!!!!!!+++++++",
- " ! !!!######!####!##!!!!!!!!!!!!!!!!!!!%%%%%%%%!%%%%!!!!!!!!!!!!!!!!!!!!'''!'''!!'!!''!!!!!!!!!!!!!!!!!)))!)))!!)))))!!)))!!!!!!!!!!!!!!!!+!+++++",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!))!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/simple-shield-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/simple-shield-600-400-2.0-grid-reference.json
deleted file mode 100644
index a939086..0000000
--- a/tests/visual_tests/grids/simple-shield-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,118 +0,0 @@
-{
- "keys": [
- "1",
- "",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " !!!!#!#!!#!#!!#########!#!###!#!$!#!!!!!!!%!!!!%%%%%%%%%%!!!!%!!!!&!!!!!'!'!!!''''''''''''!!!!'!'''(!!!!!!!!!)!))!)))))))))!)!)!!)!!*!!!!!+!+!!+!++!+",
- "!!!!!#!#!!!!!!#!#!!#!!#!!#!!##!#!!!#!!!!!!!%!!!!!%%!!!%!!%!!%!%!!!!!!!!!!'!'!!!!!'''!''!!!!'''!'!!'!!!!!!!!!!!)!!!)!!!!)!!)!!)!)!!)!!!!!!!!+!+!!!!!!+!",
- "!!!!!#!##!#!#!#!##!#!!#!!!#!##!!#!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!'!!!'!!'!''!!!'!!'!'!'!'!!!!!!!!!!!!!!!!!!!)!!!!!)!!!!!!!!!!!!!+!++!+!+!+!",
- "!!!!!!!!!!!!!!!!!!!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!''!!''!!!'!!!!''!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!&&&&&&!!!!!!!!!!!!!!&&&!!!!!!!!!!!!!!!!!!!!!!!!!!!(!!!!!!!!!!!!!!!*****!!!!!!!!!!!!*!!!!!!*!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!$$$$!!!!!!!!$!$!!!!!!!!!!!!!!!!&&!!!!!!!!!!&!!!!!&!!!!!!!!!!!!!!!!(((!!!!!!!!!!(!!!!!!!!!!!!!!!!!*!!!!!!!!!!*!!!*!!!!!!!!!!!!!!!!",
- " !! !! !! !!!!!!!!$$!$$$$!!$$$$!$$!$!!$!!!!!!!&&!&&&!&&&&&&&!!!&&&&!&!!&!&&&&!!!!!(!((!((((!!((!(((!(!((!((!!!!!*!****!***!***!*!***!!*!****!***",
- " !! ! !!! !!! !!!!!!!$!!$!!$$$$$$$$$!$!$$!$!!!!!!&&&!!!&&&!!&&&&&&&&!&!!&!&!&!!&!!!!!(!((!(!(((((((((!(((((!!!!!!!!*!*!!*!*!!!**********!*!*!!*!*!!",
- " ! !!! ! !!! !!!!!!!!!!!$!!!$!!!!$!$!$$!$!!$!!!!!!!!&&&!!!!!&&&!&!!!!!&!&!!&!&!&!!!!!!!!(!(!!!((!!!!((!!!((!!!!!!!!!!!*!*!!!!!**!*!!!*!*!!*!*!*!!*!*!!",
- " !! ! !! !!!! !!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!&&!&!!&&!!&!&!!!!!&!&!!&&!!&&!!!!!!!!!!!!!!!!!!!(!!!!!!!!!!!!!!!!!*!*!!*!!!*!*!!!*!*!!*!*!*!!*!*!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!&&!!&&!!!!!!!!!!!!!!!!!!&&!!!!!!!!!!!!!!!!!!(!!!!!!!!!!!!!!!!!!!!**!!**!!!!!!*!!!!!!!!!!!!!!**",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/style-level-compositing-tiled-0,0-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/style-level-compositing-tiled-0,0-512-512-1.0-grid-reference.json
deleted file mode 100644
index 6dd6a4d..0000000
--- a/tests/visual_tests/grids/style-level-compositing-tiled-0,0-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,190 +0,0 @@
-{
- "keys": [
- "",
- "71",
- "24",
- "245",
- "207",
- "238",
- "82",
- "132",
- "205",
- "51",
- "65",
- "231",
- "186",
- "165",
- "114",
- "2",
- "120",
- "235",
- "116",
- "13",
- "113",
- "41",
- "234",
- "34",
- "78",
- "48",
- "15",
- "90",
- "173",
- "215",
- "1",
- "75",
- "224",
- "181",
- "79",
- "42",
- "158",
- "208",
- "38",
- "127",
- "70",
- "167",
- "212",
- "76",
- "39",
- "164",
- "183",
- "87",
- "69",
- "104",
- "77",
- "157",
- "59",
- "21",
- "49"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ",
- " !!!!!!!!!! ",
- " !!!!! !!!!!! ! ",
- " ### #### !!!!!!!!!!!!!! ",
- " ### ######### ! !!!!!!!!!!!!!!! ",
- " ############ !!!! !!!!!!!!!!!!! ",
- " ############## ! !!!!!!!!!!!!!!!!!! ",
- " ## ############### !! !! !!!!!!!!!!!!!!!!! ",
- " # ################# !!! ! !! !!!!!!!!!!! ",
- " ################### !!!!!!!!!!! !!!!!!!!! !!! !! ! ",
- " ################## !!!!!!!!!!!!!!!!!!!!!!!!! !!! !!! ",
- " ################# # !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! ",
- " ## ################# !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!! ",
- " ## ######## ######## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ### ####### ######## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " #### ## ######### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ###### ######## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ##### ## ######## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " # ################## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ###### ### ##### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ## ########### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ## ##### ####### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ### #### # ###### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ## ###### ############# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " #### ## ############# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " # # ## ####### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ## # ## # ##### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ## ## # # ## ## #### ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ### # # ####### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " #### # ### ######## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ### # # # ### ############# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ### #### ## # ### ## # !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " # ### ### #### ## ### !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ######## ##### ######### !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ######## # ## ## ######### !!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " ### # ######## !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ### !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ###### # ##### !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ###### ### ### #### ### #### !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ####### ### ####### ## ###### !!!!!!!!!!!!!!!!!!!!!!!! ",
- " ######## # #### ######## ###### ## !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ############ ## #### # ### ####### !!!!!!!!!!!!!!!!!!!!!! ! ",
- " #### ####### ## ### ############ !!!!!!!!!!!!!!!!!!!!!!!! ",
- " $ ### ########## # ## ############## ! !!!!!!!!!!!!!!!!!!!!!! ",
- " %%% ########## ## ############# !!!!!!!!!!!!!!!!!!!!!! & ",
- " %%%%%%% # # ####### ### ############### !!!!!!!!!!!!!!!!!!!! !! ",
- " %%%%%%%%%%%% % # # # ############ ### ###### ######## !!!!!!!!!!!!!!!!!!!!!!!! ",
- " %%%%%%%%%%%%%%%%## ###### ## ########## ###### ## ########## !!!!!!!!!!!!!!!!!!!!!! ",
- " %%%%%%%%%%%%%%%%%### ############# ##### ### ### ### ### # ###### !!!!!!!!!!!!!!!!!!! ",
- " %%%%%%%%%%%%%%%%%%###################### ### # #### #### # ##### !!!!!!!!!!!!!!!!!!!! ",
- " %%%%%%%%%%%%%%%%%%################### # ### ############ ######### !!!!!!!!!!!!!!!!! ",
- " %%%%%%%%%%%%%%%%###################################### #### ## ###### !!!!!!!!!!!!!!! ",
- " %%%%%%%%%%%%%%%########################################### ######### !!!!!!!!!!!!!! ",
- " % %%%%%%%%%%%%%%%########################################## ######### !!!!!!!!!!!!!! ' ",
- " %%%%%%%%%%%%%%%%%%%####################################### # ##### ## !!!!!!!!!! ! '' '''' ",
- " %%%%%%%%%%%%%%%%%%###################################### ## ######## ## !!!!!!!!! ''''''' ",
- " $ %%%%%%%%%%%%%%%%%%###################################### ### ######### !!!!!!!!! '''''' ",
- " %%%%%%%%%%%%%%###################################### #### ####### !!!!!!!!! ''''' ",
- " %% %%%%%%%%%%%%%%%#################################### # # # ###### !!!!!!!! '' ",
- " %%%%%%%%%%%%%%%%%################################### # ### # !!!!!!! ",
- " %%%%%%%%%%%%%%%%%%################################### # # #### ## !!!!! ( ",
- " %%%%%%%%%%%%%%%%%%################################## ##### !!!!! ( ",
- " %%%%%%%%%%%%%%%%%################################# ####### !!!! ",
- " %%%%%%%%%%%%%%% %%%%%############################### ###### # !! )",
- " %%%%%% %% %%%%############################ ###### # ",
- " % %%%% %%%############################# ######## ### ) ",
- " %%%% %%%############################# ########### ))) ",
- " % % %% %%############################## ########### ))) ",
- " %%% % %%%############################### ## ########### )))) ",
- " %% %%%################################ ############# ))) ",
- " %% % %%################################## ############### *) )))",
- " % #################################### ################ *** ))",
- " % # ##################################################### *** )))",
- " % % ################################## ################# *** )))",
- " % ################################## ################# * )))",
- " ################################################# ## )))",
- " ########################################### ## ### +",
- " ##%%%%%%%%%%%%%%%%%%%%%##################### #### + +",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%################ ##### +++",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%###########%## # , # +",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%#########%%###### +",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#####%%%%%% ## +",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%####%%%%%% # # +",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##%%%%%% ------",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .-----",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .-----",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .-----",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .-----",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ///0",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ////0",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%% //////",
- " 111%%%%%%%%%%%%%%%%%%%%%%% /////00",
- " 1 11111%%%%%%%%%%%%%%%%%% ////000",
- " 11111111%1%%%%% %% %% //00000",
- " 11 11111111%%% %% ---///000000",
- " 11 11111111% %% 222300000",
- " 11111111111 % 2233333000",
- " 1 1111111 4 22233335500",
- " 1 111111 666 22233335550",
- " % 1111111 666666 7 222333335555",
- " 1111111 111 6666 33333335555",
- " % 1 111111 111 8 9::: 33333335555",
- " 111111111; < : = > ? 33333335555",
- " 111111@; A BB333333555",
- " 1@@CCCC D BBBB35555555",
- " @CCEE BBBB555555FF",
- " EEEE GH I BBJB55555FFF",
- " EE GGKKK K LLLL55FFFF",
- " MMN GGK KKKKKKK OOLPPPPFQ",
- " NN NNGGGKKKKKKKKK OORPPPPPQ",
- " GGGGKKKKKKKKKS RRRPPPQQ",
- " GGGGGGGKKKKKSSSTTU RRPPPPQ",
- " GGGGGGGKKKKVVSTTTUU ",
- " GGGGGGGGKKKVVVSSTTUV ",
- " WGGGGGGVGKKVVVSVVVVVV "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/style-level-compositing-tiled-0,0-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/style-level-compositing-tiled-0,0-512-512-2.0-grid-reference.json
deleted file mode 100644
index 6dd6a4d..0000000
--- a/tests/visual_tests/grids/style-level-compositing-tiled-0,0-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,190 +0,0 @@
-{
- "keys": [
- "",
- "71",
- "24",
- "245",
- "207",
- "238",
- "82",
- "132",
- "205",
- "51",
- "65",
- "231",
- "186",
- "165",
- "114",
- "2",
- "120",
- "235",
- "116",
- "13",
- "113",
- "41",
- "234",
- "34",
- "78",
- "48",
- "15",
- "90",
- "173",
- "215",
- "1",
- "75",
- "224",
- "181",
- "79",
- "42",
- "158",
- "208",
- "38",
- "127",
- "70",
- "167",
- "212",
- "76",
- "39",
- "164",
- "183",
- "87",
- "69",
- "104",
- "77",
- "157",
- "59",
- "21",
- "49"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ",
- " !!!!!!!!!! ",
- " !!!!! !!!!!! ! ",
- " ### #### !!!!!!!!!!!!!! ",
- " ### ######### ! !!!!!!!!!!!!!!! ",
- " ############ !!!! !!!!!!!!!!!!! ",
- " ############## ! !!!!!!!!!!!!!!!!!! ",
- " ## ############### !! !! !!!!!!!!!!!!!!!!! ",
- " # ################# !!! ! !! !!!!!!!!!!! ",
- " ################### !!!!!!!!!!! !!!!!!!!! !!! !! ! ",
- " ################## !!!!!!!!!!!!!!!!!!!!!!!!! !!! !!! ",
- " ################# # !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! ",
- " ## ################# !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!! ",
- " ## ######## ######## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ### ####### ######## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " #### ## ######### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ###### ######## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ##### ## ######## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " # ################## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ###### ### ##### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ## ########### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ## ##### ####### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ### #### # ###### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ## ###### ############# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " #### ## ############# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " # # ## ####### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ## # ## # ##### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ## ## # # ## ## #### ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ### # # ####### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " #### # ### ######## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ### # # # ### ############# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ### #### ## # ### ## # !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " # ### ### #### ## ### !!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ######## ##### ######### !!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ######## # ## ## ######### !!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " ### # ######## !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ### !!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ###### # ##### !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ###### ### ### #### ### #### !!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ####### ### ####### ## ###### !!!!!!!!!!!!!!!!!!!!!!!! ",
- " ######## # #### ######## ###### ## !!!!!!!!!!!!!!!!!!!!!!!!! ",
- " ############ ## #### # ### ####### !!!!!!!!!!!!!!!!!!!!!! ! ",
- " #### ####### ## ### ############ !!!!!!!!!!!!!!!!!!!!!!!! ",
- " $ ### ########## # ## ############## ! !!!!!!!!!!!!!!!!!!!!!! ",
- " %%% ########## ## ############# !!!!!!!!!!!!!!!!!!!!!! & ",
- " %%%%%%% # # ####### ### ############### !!!!!!!!!!!!!!!!!!!! !! ",
- " %%%%%%%%%%%% % # # # ############ ### ###### ######## !!!!!!!!!!!!!!!!!!!!!!!! ",
- " %%%%%%%%%%%%%%%%## ###### ## ########## ###### ## ########## !!!!!!!!!!!!!!!!!!!!!! ",
- " %%%%%%%%%%%%%%%%%### ############# ##### ### ### ### ### # ###### !!!!!!!!!!!!!!!!!!! ",
- " %%%%%%%%%%%%%%%%%%###################### ### # #### #### # ##### !!!!!!!!!!!!!!!!!!!! ",
- " %%%%%%%%%%%%%%%%%%################### # ### ############ ######### !!!!!!!!!!!!!!!!! ",
- " %%%%%%%%%%%%%%%%###################################### #### ## ###### !!!!!!!!!!!!!!! ",
- " %%%%%%%%%%%%%%%########################################### ######### !!!!!!!!!!!!!! ",
- " % %%%%%%%%%%%%%%%########################################## ######### !!!!!!!!!!!!!! ' ",
- " %%%%%%%%%%%%%%%%%%%####################################### # ##### ## !!!!!!!!!! ! '' '''' ",
- " %%%%%%%%%%%%%%%%%%###################################### ## ######## ## !!!!!!!!! ''''''' ",
- " $ %%%%%%%%%%%%%%%%%%###################################### ### ######### !!!!!!!!! '''''' ",
- " %%%%%%%%%%%%%%###################################### #### ####### !!!!!!!!! ''''' ",
- " %% %%%%%%%%%%%%%%%#################################### # # # ###### !!!!!!!! '' ",
- " %%%%%%%%%%%%%%%%%################################### # ### # !!!!!!! ",
- " %%%%%%%%%%%%%%%%%%################################### # # #### ## !!!!! ( ",
- " %%%%%%%%%%%%%%%%%%################################## ##### !!!!! ( ",
- " %%%%%%%%%%%%%%%%%################################# ####### !!!! ",
- " %%%%%%%%%%%%%%% %%%%%############################### ###### # !! )",
- " %%%%%% %% %%%%############################ ###### # ",
- " % %%%% %%%############################# ######## ### ) ",
- " %%%% %%%############################# ########### ))) ",
- " % % %% %%############################## ########### ))) ",
- " %%% % %%%############################### ## ########### )))) ",
- " %% %%%################################ ############# ))) ",
- " %% % %%################################## ############### *) )))",
- " % #################################### ################ *** ))",
- " % # ##################################################### *** )))",
- " % % ################################## ################# *** )))",
- " % ################################## ################# * )))",
- " ################################################# ## )))",
- " ########################################### ## ### +",
- " ##%%%%%%%%%%%%%%%%%%%%%##################### #### + +",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%################ ##### +++",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%###########%## # , # +",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%#########%%###### +",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#####%%%%%% ## +",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%####%%%%%% # # +",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##%%%%%% ------",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .-----",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .-----",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .-----",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .-----",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ///0",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ////0",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%% //////",
- " 111%%%%%%%%%%%%%%%%%%%%%%% /////00",
- " 1 11111%%%%%%%%%%%%%%%%%% ////000",
- " 11111111%1%%%%% %% %% //00000",
- " 11 11111111%%% %% ---///000000",
- " 11 11111111% %% 222300000",
- " 11111111111 % 2233333000",
- " 1 1111111 4 22233335500",
- " 1 111111 666 22233335550",
- " % 1111111 666666 7 222333335555",
- " 1111111 111 6666 33333335555",
- " % 1 111111 111 8 9::: 33333335555",
- " 111111111; < : = > ? 33333335555",
- " 111111@; A BB333333555",
- " 1@@CCCC D BBBB35555555",
- " @CCEE BBBB555555FF",
- " EEEE GH I BBJB55555FFF",
- " EE GGKKK K LLLL55FFFF",
- " MMN GGK KKKKKKK OOLPPPPFQ",
- " NN NNGGGKKKKKKKKK OORPPPPPQ",
- " GGGGKKKKKKKKKS RRRPPPQQ",
- " GGGGGGGKKKKKSSSTTU RRPPPPQ",
- " GGGGGGGKKKKVVSTTTUU ",
- " GGGGGGGGKKKVVVSSTTUV ",
- " WGGGGGGVGKKVVVSVVVVVV "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/style-level-compositing-tiled-0,1-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/style-level-compositing-tiled-0,1-512-512-1.0-grid-reference.json
deleted file mode 100644
index 3f87242..0000000
--- a/tests/visual_tests/grids/style-level-compositing-tiled-0,1-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,152 +0,0 @@
-{
- "keys": [
- "",
- "49",
- "161",
- "38",
- "21",
- "95",
- "64",
- "17",
- "218",
- "196",
- "61",
- "33",
- "160",
- "8",
- "209",
- "62",
- "243"
- ],
- "data": {},
- "grid": [
- " ! !!!#$$$$%%%%%%%%%%%%%%% ",
- " !!!##$$$%%%%%%%%%%%%%%%%%% ",
- " !!######%%%%%%%%%%%%%%%%%%%%% ",
- " & #########%%%%%%%%%%%%%%%%%%%%%%% ",
- " & ######%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " #####%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " ####%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " & ' #####%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " & ######(((%%%%%%%%%%%%%%%%%%%% ",
- " ######(((%%%%%%%%%%%%%%%%%% ",
- " ) ######(((((%%%%%%%%%%%%%%%% ",
- " * ####((((((%%%%%%%%%%%%%%%% ",
- "+ ###((((((((%%%%%%%%%%%%%% ",
- " #((((((((%%%%%%%%%%%%% ",
- " * ,,((((---%%%%%%%%%%%%% ",
- " ,,((((---%%%%%%%%%%%%% ",
- " ,,((((-----%%%%%%%%%% ",
- " ,,,...-----%%%%%%%% ",
- " ,,......----%%%%% ",
- " ,,.......---%%%% ",
- " , ,,.......--.%%%% ",
- " ,.........%%%%%% ",
- " ,,.........%%%%% ",
- " ,,........//%%%% ",
- " ,,........///%% ",
- " ,,........///% ",
- " ,,......../// ",
- " ,.......... ",
- " ,,.......... ",
- " ,,.......... ",
- " ,,........ ",
- " ,....... ",
- " ,....... ",
- " ,..... ",
- " ,,...... ",
- " ,,..... ",
- " ,,,.... ",
- " ,,,.. ",
- " ,,..... ",
- " ,,..... ",
- " ,,,.... ",
- " ,.... ",
- " ,,.. ",
- " ,,... 00 ",
- " ,,,, ",
- " ,,,,, ",
- " ,,,. 1 ",
- " ,,,. ",
- " , ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/style-level-compositing-tiled-0,1-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/style-level-compositing-tiled-0,1-512-512-2.0-grid-reference.json
deleted file mode 100644
index 3f87242..0000000
--- a/tests/visual_tests/grids/style-level-compositing-tiled-0,1-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,152 +0,0 @@
-{
- "keys": [
- "",
- "49",
- "161",
- "38",
- "21",
- "95",
- "64",
- "17",
- "218",
- "196",
- "61",
- "33",
- "160",
- "8",
- "209",
- "62",
- "243"
- ],
- "data": {},
- "grid": [
- " ! !!!#$$$$%%%%%%%%%%%%%%% ",
- " !!!##$$$%%%%%%%%%%%%%%%%%% ",
- " !!######%%%%%%%%%%%%%%%%%%%%% ",
- " & #########%%%%%%%%%%%%%%%%%%%%%%% ",
- " & ######%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " #####%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " ####%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " & ' #####%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " & ######(((%%%%%%%%%%%%%%%%%%%% ",
- " ######(((%%%%%%%%%%%%%%%%%% ",
- " ) ######(((((%%%%%%%%%%%%%%%% ",
- " * ####((((((%%%%%%%%%%%%%%%% ",
- "+ ###((((((((%%%%%%%%%%%%%% ",
- " #((((((((%%%%%%%%%%%%% ",
- " * ,,((((---%%%%%%%%%%%%% ",
- " ,,((((---%%%%%%%%%%%%% ",
- " ,,((((-----%%%%%%%%%% ",
- " ,,,...-----%%%%%%%% ",
- " ,,......----%%%%% ",
- " ,,.......---%%%% ",
- " , ,,.......--.%%%% ",
- " ,.........%%%%%% ",
- " ,,.........%%%%% ",
- " ,,........//%%%% ",
- " ,,........///%% ",
- " ,,........///% ",
- " ,,......../// ",
- " ,.......... ",
- " ,,.......... ",
- " ,,.......... ",
- " ,,........ ",
- " ,....... ",
- " ,....... ",
- " ,..... ",
- " ,,...... ",
- " ,,..... ",
- " ,,,.... ",
- " ,,,.. ",
- " ,,..... ",
- " ,,..... ",
- " ,,,.... ",
- " ,.... ",
- " ,,.. ",
- " ,,... 00 ",
- " ,,,, ",
- " ,,,,, ",
- " ,,,. 1 ",
- " ,,,. ",
- " , ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/style-level-compositing-tiled-1,0-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/style-level-compositing-tiled-1,0-512-512-1.0-grid-reference.json
deleted file mode 100644
index 2ded483..0000000
--- a/tests/visual_tests/grids/style-level-compositing-tiled-1,0-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,248 +0,0 @@
-{
- "keys": [
- "",
- "245",
- "238",
- "154",
- "60",
- "189",
- "142",
- "53",
- "101",
- "45",
- "103",
- "102",
- "72",
- "163",
- "98",
- "205",
- "153",
- "30",
- "207",
- "206",
- "110",
- "65",
- "129",
- "58",
- "136",
- "105",
- "191",
- "57",
- "81",
- "171",
- "86",
- "170",
- "182",
- "80",
- "236",
- "16",
- "210",
- "89",
- "140",
- "22",
- "68",
- "186",
- "4",
- "112",
- "200",
- "202",
- "93",
- "94",
- "74",
- "5",
- "3",
- "84",
- "194",
- "96",
- "31",
- "2",
- "199",
- "190",
- "88",
- "162",
- "44",
- "83",
- "107",
- "100",
- "139",
- "91",
- "175",
- "50",
- "97",
- "155",
- "32",
- "18",
- "168",
- "226",
- "118",
- "14",
- "244",
- "126",
- "214",
- "113",
- "36",
- "188",
- "193",
- "99",
- "131",
- "172",
- "220",
- "54",
- "208",
- "152",
- "56",
- "25",
- "73",
- "19",
- "35",
- "185",
- "197",
- "40",
- "26",
- "63",
- "230",
- "69",
- "119",
- "121",
- "223",
- "229",
- "28",
- "204",
- "92",
- "27",
- "52",
- "67",
- "95"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! !! ",
- " ! ",
- " !!!! ",
- " ! !!! ! ! !! ",
- " !!! !! ! !!!! ",
- " !! !! !!! !!!! ",
- " # ## ! !!!! !!!! ",
- " ##### # # !! !! !!!! ",
- " # ####### ! !!!!!! ",
- " ########### ! ! !!!!! ",
- " ########## !!!!!! ",
- " ###### !!! !! ",
- " ######## ## !! !!! ",
- " ######## !!!! ",
- " ## ## # !!! ",
- " #### ## ",
- " #### ### ",
- " ### # !!!! ",
- " ## !! !!! ! ",
- " ## !! !!!!! ",
- " !!! !!!!!!!!!! ",
- " !!!!! !!!!!!!!!!!! ! ",
- " !!!! !!!!!!!!!!!!!!! !! !! ",
- " !!!! !!!!!!!!!!!!!!!!! !!!!!!! ",
- " !!!! !!!!!!!!!!!!!!!!!!! !!!!! !!!! ",
- " !!! !!!!!!!!!!!!!!!!!!! ! ",
- " !!! ! !!!!!!!!!!!!!!!!! ! ",
- " !!! ! !!!!!!!!!!!!!!!!!!! ! ",
- " !! ! !!!!!!!!!!!!!!!!!!!! !!! !!! !! !! ",
- " !!! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! ",
- " !!! !!! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! ",
- " !! !!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! ",
- " !!! !!! !!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!! ",
- " !!! !!!!!! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!! ",
- " $$ $ !!! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!! !",
- " $$$$$$ ! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " $ $$$$$ ! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " $$$$$$%%!!! !!! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!! ",
- " $$$$%$$$%%!!!!! ! !!!!! !!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!",
- " $$$$&%%%%!!!!!!!! !! !! !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$&&&&%%%%!!!!!!!! !! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $&&&&&%%%%!!!!!!!!! !! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$&&&&&%%%%!!!!!!!!! ! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$&&&&&&%%%%!!! !!! ! !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$&&&&&&&%%%%!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $&&&&&& %%%!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$&&&&&& %%%!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$&&&&&&& %%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " $$$&&&&& %%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$$$&&&&& %%%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$$$$&&&& %%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " $$$$$&&&& %%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!! ",
- " $$$$$&&&& %%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!! ",
- " $$$$$&&&&&'%%%% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! ! ",
- " $$$$$&&&&& ((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! !!! ",
- " $$$ &&&&& (((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! ",
- " &&&& )(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! ",
- " ** &&&&& )))))!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! ",
- " ** &&& )+)))!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!! ",
- " ***&& ++++,,,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! ",
- " --* .!!!++,,,!!!!!!!!!!!!!!!!!!!!!!!!!!///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! !! ",
- " ----.......++,,,,!!!!!!!!!!!!!!!!!!!!!!//////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ",
- "0 11----.......,,,,,,!!!!!!!!!!!!!!!!!!!!!////////////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2!!!!!!!!!!!!!! !!! ",
- "00 111-----......,,,,,,!!!!!!!!!!!!!!!!!!!!!////////////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2222!!!!!!!!!!!! !! 3 ",
- "0 11------......4444,444!!!!!!!!!!!//!!!!!!/////////////!!!!!!!!!!!!!55!!!!!!!!!!!!!!2222!!!!!!!!!!!! ! 3",
- " 6677-----8......44444444!!!!!!!!!!///////!/////////////////!!!!!!!!!!555!!!!!!!!!!!!222222!!!!!!!!! !! ! ",
- "66669----8888...444444444444!!!!!!///////////////////////////!!!55555!5555555!!!!55!!222222!!!!!!!!! !! ! ",
- "666666----88::::4444444444444!!!!!////////////////////////////2555555555555555555552222222222!!!!!!! ! ",
- "666666;---<<=:==444>>4444444!!!!!!///////////////////////////22255555555555555555552522222222!!2!!!! ! ",
- "66666;;;?<<<====@@@@>444444 !!!!!!!////////////////////////2/22225555555555555555555552222222222!!! !! ! ",
- "66666;????AAB=C@@@@@>4 4 !!!!!!!! /////////////////////222222555555555555555555222222222222!!! ! ",
- "66666???? BBDBCC@@@@@@ 44!!!!!!!! ////EEE///////////////22222222555555555555555522222222222!!!!! F ! ",
- "666666 ??? BDDCCC@@@@ !!!!!! ////EEEE//////////////222222222255555555555522222222222222!!! FFF ",
- "666 ?? BGCCCHHH II!!! ///EEEEEEEE//////////22222222222555555555522222222222222!!! FFF ",
- "JJJ 6 ??? KCLHHM MM III!! NENNEEEEE//EOOOOOO222222222222222225522222222222222PPP F ",
- "J ? ???? KLQQQM MMMMMMMMMMMRSSS NNNNNNEEEEEEEEEOO22222222222222222222222222222222222PPP F ",
- " JJ ? ? ?QQQ QMMMMMMMMMMMMMRSTS NNNNNNNEEEEUUOO222222222222222222222222222222222 22PP F ",
- "JJ QQQQMMMMMMMMMMMMMTTT NNNNNNNEEEUUUU2222222222222222222222222222222 2 PPV F ",
- " ?? QQQQQMMMMMMMMMMMMTTTT NTTNNNNNNEUWUUU2222222222222222222222222222222 2 PVV V FF ",
- " XXXXXYY Q Q QM MMMMZZZ[[[TTTTTTTTTTTNNWWWWW]]]]2222222222222222222222222222222 VVV FFFF ",
- "XXXXXXYY QQQ ^ ZZZZ[[[TTTTTTTTTTTNWWWWWW]]]]]222222222222222222222222222222 VVV FFFFFF ",
- "XXXXXXYY ZZZ[[[[TTTTTTTTTTTWWWWWW]]]____22222222222222222222222222222 V FFFFF F ",
- "XXXXXXYYY` ` aZZ[[[[[TTTTTTTTTTTWWWWWW]]]____22222222222222222222222222222 FF ",
- "XXXXXXXY```` ``` bcddd[[[[[TTTTTTTTTWWWW]]]]]]__2222222222222222222222222222222 FF ",
- "XXXXXXXY``````````eeeeeeeccdddd[[[[TTTTTTTTTWWW]]]]]]_____22222222222222222222222222222 F ",
- "XXXXXXX```````````eeeeeeeddddddd[ff TTTTTTTT]]]]]]]]_____ggg2222222__222222222222222222 ",
- "XXXXXXX```````````eeeeeeedddddddddd TTTTTTTT]]]]]]]______gggg2_h2____22222222222222222 F ",
- "XXXXXXX```````````eeeeeee dddddddddd TTTTTTT]]]]]___________gg______i2222222222222222 F F ",
- "XXXXXXX```````````eeeeeee ddddddddddj kTTT]]]]]]]_________________ii2222222222222222 ",
- "XXXXXXXX``````````eeeeeeee dddddddddd kkl ]]]_____________m___ii22222222222222n n F ",
- "XXXXXXXXoo````````eeeeeeee dddddddddkkklll _______________m__iiii2222p22222222 n ",
- "qXXXXXooooorrr````sssssssss ddddddddddddlll ______________m iiiii22pppp2222 ",
- "qqXXXooooooorrrr``sssssssss dddddddddddll __________ iiiiituupp 2 v ",
- "qqqooooooooorrrrrssssssssss dddddddddllll _________ iiittuupp 22 w ",
- "qqqooooooooorrrrrsssssssssss dddddxxxlll ________ iiitttttp w ",
- "qqqoooooooorrrrrrssssssssssy xxdxxxx _______ iiitttttup ww ",
- "zoooooooooorrrrrssssssssssyyy xxxxxx ____ ttttttup w ",
- "zooo{ooooorrrrrrssssssssss||||yxxxx _____ _ ittt}}}p www ~ ",
- "zzo{{{{{{{{rrrrrssssssssss||||| xx ___ _ it t}}pp wwww ",
- "z\u007f\u007f{{{{{{{\u0080rrrrrsssssssss||||||\u0081 \u0081\u0081\u0081\u0081 ___ i }ppp wwwww ",
- "\u0082\u007f\u007f{{{{{{{rrrrr\u0083\u0083ssssssss||||||\u0081\u0081\u0081\u0081\u0081\u0081 ___\u0084 tt p w www \u0085 \u0086 ",
- "\u0087\u0082{{{{{{{\u0080\u0080rr\u0083\u0083\u0083\u0083sssssss|||||||||\u0081\u0081\u0081 _ \u0084 _ tt w www ",
- "\u0087\u0082{{{{{{{\u0080\u0080\u0083\u0083\u0083\u0083\u0083\u0083\u0083\u0083ssssss||||||||\u0081\u0081\u0081 \u0088 \u0084\u0084 tt \u0089w ww \u0085 ",
- " {{{\u0080\u0080\u0080\u0080\u0083\u0083\u0083\u0083\u0083\u0083\u0083\u0083\u0083ssssss||||||\u0081\u0081\u0081 \u0088 \u008a \u0089\u0089\u0089 \u0089\u0089\u0089 w \u008b ",
- " \u0080\u0080\u0080\u0080\u0083\u0083\u0083\u008c\u008c\u008c\u008c\u008c\u008c\u008c\u008css\u008d\u008e\u008e||\u008e\u0081\u0081\u0081\u0081 \u0088 \u008a\u008a \u0089\u0089 \u008a \u0089\u008a\u008a \u008a ",
- " \u0080\u0080\u0080\u0080\u0080\u008f\u008c\u008c\u008c\u008c\u008c\u008c\u008c\u008c\u008c\u008d\u008d\u008d\u008e\u008e\u008e\u008e\u0081\u0081\u0081\u0081 \u0088 \u008a \u008a\u008a\u0089\u0089\u0089 \u0089\u0089\u0089\u008a\u008a \u008a ",
- " \u0090\u0091\u0091\u0091\u008f\u008f\u008c\u008c\u008c\u008c\u008c\u008c\u008c\u008c\u008c\u008d\u008d\u008d\u008e\u008e\u008e\u008e\u0081\u0081\u0081 \u008a \u008a\u008a \u008a \u008a\u0089\u008a\u008a\u008a\u008a\u008a \u008a\u008a \u008a \u008a \u0092 "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/style-level-compositing-tiled-1,0-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/style-level-compositing-tiled-1,0-512-512-2.0-grid-reference.json
deleted file mode 100644
index 2ded483..0000000
--- a/tests/visual_tests/grids/style-level-compositing-tiled-1,0-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,248 +0,0 @@
-{
- "keys": [
- "",
- "245",
- "238",
- "154",
- "60",
- "189",
- "142",
- "53",
- "101",
- "45",
- "103",
- "102",
- "72",
- "163",
- "98",
- "205",
- "153",
- "30",
- "207",
- "206",
- "110",
- "65",
- "129",
- "58",
- "136",
- "105",
- "191",
- "57",
- "81",
- "171",
- "86",
- "170",
- "182",
- "80",
- "236",
- "16",
- "210",
- "89",
- "140",
- "22",
- "68",
- "186",
- "4",
- "112",
- "200",
- "202",
- "93",
- "94",
- "74",
- "5",
- "3",
- "84",
- "194",
- "96",
- "31",
- "2",
- "199",
- "190",
- "88",
- "162",
- "44",
- "83",
- "107",
- "100",
- "139",
- "91",
- "175",
- "50",
- "97",
- "155",
- "32",
- "18",
- "168",
- "226",
- "118",
- "14",
- "244",
- "126",
- "214",
- "113",
- "36",
- "188",
- "193",
- "99",
- "131",
- "172",
- "220",
- "54",
- "208",
- "152",
- "56",
- "25",
- "73",
- "19",
- "35",
- "185",
- "197",
- "40",
- "26",
- "63",
- "230",
- "69",
- "119",
- "121",
- "223",
- "229",
- "28",
- "204",
- "92",
- "27",
- "52",
- "67",
- "95"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! !! ",
- " ! ",
- " !!!! ",
- " ! !!! ! ! !! ",
- " !!! !! ! !!!! ",
- " !! !! !!! !!!! ",
- " # ## ! !!!! !!!! ",
- " ##### # # !! !! !!!! ",
- " # ####### ! !!!!!! ",
- " ########### ! ! !!!!! ",
- " ########## !!!!!! ",
- " ###### !!! !! ",
- " ######## ## !! !!! ",
- " ######## !!!! ",
- " ## ## # !!! ",
- " #### ## ",
- " #### ### ",
- " ### # !!!! ",
- " ## !! !!! ! ",
- " ## !! !!!!! ",
- " !!! !!!!!!!!!! ",
- " !!!!! !!!!!!!!!!!! ! ",
- " !!!! !!!!!!!!!!!!!!! !! !! ",
- " !!!! !!!!!!!!!!!!!!!!! !!!!!!! ",
- " !!!! !!!!!!!!!!!!!!!!!!! !!!!! !!!! ",
- " !!! !!!!!!!!!!!!!!!!!!! ! ",
- " !!! ! !!!!!!!!!!!!!!!!! ! ",
- " !!! ! !!!!!!!!!!!!!!!!!!! ! ",
- " !! ! !!!!!!!!!!!!!!!!!!!! !!! !!! !! !! ",
- " !!! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! ",
- " !!! !!! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! ",
- " !! !!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! ",
- " !!! !!! !!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!! ",
- " !!! !!!!!! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!! ",
- " $$ $ !!! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!! !",
- " $$$$$$ ! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " $ $$$$$ ! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ",
- " $$$$$$%%!!! !!! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!! ",
- " $$$$%$$$%%!!!!! ! !!!!! !!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!",
- " $$$$&%%%%!!!!!!!! !! !! !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$&&&&%%%%!!!!!!!! !! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $&&&&&%%%%!!!!!!!!! !! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$&&&&&%%%%!!!!!!!!! ! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$&&&&&&%%%%!!! !!! ! !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$&&&&&&&%%%%!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $&&&&&& %%%!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$&&&&&& %%%!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$&&&&&&& %%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " $$$&&&&& %%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$$$&&&&& %%%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " $$$$$&&&& %%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " $$$$$&&&& %%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!! ",
- " $$$$$&&&& %%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!! ",
- " $$$$$&&&&&'%%%% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! ! ",
- " $$$$$&&&&& ((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! !!! ",
- " $$$ &&&&& (((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! ",
- " &&&& )(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! ",
- " ** &&&&& )))))!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! ",
- " ** &&& )+)))!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!! ",
- " ***&& ++++,,,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! ",
- " --* .!!!++,,,!!!!!!!!!!!!!!!!!!!!!!!!!!///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! !! ",
- " ----.......++,,,,!!!!!!!!!!!!!!!!!!!!!!//////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ",
- "0 11----.......,,,,,,!!!!!!!!!!!!!!!!!!!!!////////////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2!!!!!!!!!!!!!! !!! ",
- "00 111-----......,,,,,,!!!!!!!!!!!!!!!!!!!!!////////////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2222!!!!!!!!!!!! !! 3 ",
- "0 11------......4444,444!!!!!!!!!!!//!!!!!!/////////////!!!!!!!!!!!!!55!!!!!!!!!!!!!!2222!!!!!!!!!!!! ! 3",
- " 6677-----8......44444444!!!!!!!!!!///////!/////////////////!!!!!!!!!!555!!!!!!!!!!!!222222!!!!!!!!! !! ! ",
- "66669----8888...444444444444!!!!!!///////////////////////////!!!55555!5555555!!!!55!!222222!!!!!!!!! !! ! ",
- "666666----88::::4444444444444!!!!!////////////////////////////2555555555555555555552222222222!!!!!!! ! ",
- "666666;---<<=:==444>>4444444!!!!!!///////////////////////////22255555555555555555552522222222!!2!!!! ! ",
- "66666;;;?<<<====@@@@>444444 !!!!!!!////////////////////////2/22225555555555555555555552222222222!!! !! ! ",
- "66666;????AAB=C@@@@@>4 4 !!!!!!!! /////////////////////222222555555555555555555222222222222!!! ! ",
- "66666???? BBDBCC@@@@@@ 44!!!!!!!! ////EEE///////////////22222222555555555555555522222222222!!!!! F ! ",
- "666666 ??? BDDCCC@@@@ !!!!!! ////EEEE//////////////222222222255555555555522222222222222!!! FFF ",
- "666 ?? BGCCCHHH II!!! ///EEEEEEEE//////////22222222222555555555522222222222222!!! FFF ",
- "JJJ 6 ??? KCLHHM MM III!! NENNEEEEE//EOOOOOO222222222222222225522222222222222PPP F ",
- "J ? ???? KLQQQM MMMMMMMMMMMRSSS NNNNNNEEEEEEEEEOO22222222222222222222222222222222222PPP F ",
- " JJ ? ? ?QQQ QMMMMMMMMMMMMMRSTS NNNNNNNEEEEUUOO222222222222222222222222222222222 22PP F ",
- "JJ QQQQMMMMMMMMMMMMMTTT NNNNNNNEEEUUUU2222222222222222222222222222222 2 PPV F ",
- " ?? QQQQQMMMMMMMMMMMMTTTT NTTNNNNNNEUWUUU2222222222222222222222222222222 2 PVV V FF ",
- " XXXXXYY Q Q QM MMMMZZZ[[[TTTTTTTTTTTNNWWWWW]]]]2222222222222222222222222222222 VVV FFFF ",
- "XXXXXXYY QQQ ^ ZZZZ[[[TTTTTTTTTTTNWWWWWW]]]]]222222222222222222222222222222 VVV FFFFFF ",
- "XXXXXXYY ZZZ[[[[TTTTTTTTTTTWWWWWW]]]____22222222222222222222222222222 V FFFFF F ",
- "XXXXXXYYY` ` aZZ[[[[[TTTTTTTTTTTWWWWWW]]]____22222222222222222222222222222 FF ",
- "XXXXXXXY```` ``` bcddd[[[[[TTTTTTTTTWWWW]]]]]]__2222222222222222222222222222222 FF ",
- "XXXXXXXY``````````eeeeeeeccdddd[[[[TTTTTTTTTWWW]]]]]]_____22222222222222222222222222222 F ",
- "XXXXXXX```````````eeeeeeeddddddd[ff TTTTTTTT]]]]]]]]_____ggg2222222__222222222222222222 ",
- "XXXXXXX```````````eeeeeeedddddddddd TTTTTTTT]]]]]]]______gggg2_h2____22222222222222222 F ",
- "XXXXXXX```````````eeeeeee dddddddddd TTTTTTT]]]]]___________gg______i2222222222222222 F F ",
- "XXXXXXX```````````eeeeeee ddddddddddj kTTT]]]]]]]_________________ii2222222222222222 ",
- "XXXXXXXX``````````eeeeeeee dddddddddd kkl ]]]_____________m___ii22222222222222n n F ",
- "XXXXXXXXoo````````eeeeeeee dddddddddkkklll _______________m__iiii2222p22222222 n ",
- "qXXXXXooooorrr````sssssssss ddddddddddddlll ______________m iiiii22pppp2222 ",
- "qqXXXooooooorrrr``sssssssss dddddddddddll __________ iiiiituupp 2 v ",
- "qqqooooooooorrrrrssssssssss dddddddddllll _________ iiittuupp 22 w ",
- "qqqooooooooorrrrrsssssssssss dddddxxxlll ________ iiitttttp w ",
- "qqqoooooooorrrrrrssssssssssy xxdxxxx _______ iiitttttup ww ",
- "zoooooooooorrrrrssssssssssyyy xxxxxx ____ ttttttup w ",
- "zooo{ooooorrrrrrssssssssss||||yxxxx _____ _ ittt}}}p www ~ ",
- "zzo{{{{{{{{rrrrrssssssssss||||| xx ___ _ it t}}pp wwww ",
- "z\u007f\u007f{{{{{{{\u0080rrrrrsssssssss||||||\u0081 \u0081\u0081\u0081\u0081 ___ i }ppp wwwww ",
- "\u0082\u007f\u007f{{{{{{{rrrrr\u0083\u0083ssssssss||||||\u0081\u0081\u0081\u0081\u0081\u0081 ___\u0084 tt p w www \u0085 \u0086 ",
- "\u0087\u0082{{{{{{{\u0080\u0080rr\u0083\u0083\u0083\u0083sssssss|||||||||\u0081\u0081\u0081 _ \u0084 _ tt w www ",
- "\u0087\u0082{{{{{{{\u0080\u0080\u0083\u0083\u0083\u0083\u0083\u0083\u0083\u0083ssssss||||||||\u0081\u0081\u0081 \u0088 \u0084\u0084 tt \u0089w ww \u0085 ",
- " {{{\u0080\u0080\u0080\u0080\u0083\u0083\u0083\u0083\u0083\u0083\u0083\u0083\u0083ssssss||||||\u0081\u0081\u0081 \u0088 \u008a \u0089\u0089\u0089 \u0089\u0089\u0089 w \u008b ",
- " \u0080\u0080\u0080\u0080\u0083\u0083\u0083\u008c\u008c\u008c\u008c\u008c\u008c\u008c\u008css\u008d\u008e\u008e||\u008e\u0081\u0081\u0081\u0081 \u0088 \u008a\u008a \u0089\u0089 \u008a \u0089\u008a\u008a \u008a ",
- " \u0080\u0080\u0080\u0080\u0080\u008f\u008c\u008c\u008c\u008c\u008c\u008c\u008c\u008c\u008c\u008d\u008d\u008d\u008e\u008e\u008e\u008e\u0081\u0081\u0081\u0081 \u0088 \u008a \u008a\u008a\u0089\u0089\u0089 \u0089\u0089\u0089\u008a\u008a \u008a ",
- " \u0090\u0091\u0091\u0091\u008f\u008f\u008c\u008c\u008c\u008c\u008c\u008c\u008c\u008c\u008c\u008d\u008d\u008d\u008e\u008e\u008e\u008e\u0081\u0081\u0081 \u008a \u008a\u008a \u008a \u008a\u0089\u008a\u008a\u008a\u008a\u008a \u008a\u008a \u008a \u008a \u0092 "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/style-level-compositing-tiled-1,1-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/style-level-compositing-tiled-1,1-512-512-1.0-grid-reference.json
deleted file mode 100644
index 97fda92..0000000
--- a/tests/visual_tests/grids/style-level-compositing-tiled-1,1-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,170 +0,0 @@
-{
- "keys": [
- "",
- "67",
- "27",
- "28",
- "204",
- "92",
- "185",
- "119",
- "223",
- "52",
- "203",
- "29",
- "166",
- "201",
- "6",
- "177",
- "221",
- "227",
- "20",
- "123",
- "9",
- "122",
- "141",
- "108",
- "151",
- "222",
- "61",
- "216",
- "180",
- "124",
- "178",
- "219",
- "179",
- "159",
- "146"
- ],
- "data": {},
- "grid": [
- " !!!!##$$$$$$$$%%%%&&&&'' ( ))))) )))))) ) ) ))) ",
- " * !!!!#$$$$$$$$$%++++&&&& )))) ))))) )) ) )))))) ",
- " !!###$$$$$$$$$,+++++&& )))))) )))) ))) ))) )) ))))- -- ",
- " ##$$$$$$$$$$$+++++++& ))) ) ) ))))))--- - ",
- " $$$$$$$$$$$$+++++++ )) ) )) )))------- - . ",
- " ///$$/$$$$$$$+++++++ 0 ))))) ) ))---- ",
- " //////$$$$$11+++++ ))))))))22 ) )-- -- 3 3 ",
- " //////$$$$$1114++++ ) ) 5 --- 33 ",
- " ///////11$11114+++6 55 5 5 - ",
- " ////////111111146666 7 8 55555 55 ",
- " ///////1111111144666 88 5 555555 55 9 ",
- " ///////1111116664666 888 555555555 555 9 ",
- " ///////1111::::64666 8888 55555555555555555 ;;",
- " <<<<<<<<<::::::666 8888 555555555555555555 ;;",
- " <<<<<<====:::::66 888 55555555555555555555 9 ",
- " <<<<<=====::::6 8888 5555555555555555555555555 > ",
- " <<<<<======::666 8888 555555555555555555555555555 > ",
- " <<<<=====???666 888 555555555555555555555555555 ",
- " <<<<====????66 888 5555555555555555555555555555 ",
- " <<<<==?????@6 5555555555555555555555555555 ",
- " <<<<???????@? 55555555555555555555555555555 ",
- " <<<????????? 5555555555555555555555555555 ",
- " ???????AA?? 5555555555555555555555555555 ",
- " ????????? 555555555555555555555555555 ",
- " ???????? 5555555555 555555555555555 ",
- " ??????? 5555555 555555555555 ",
- " ?? 555 5 5555555555 B ",
- " 5555555555 BB ",
- " 5555555 BB ",
- " C 555555 BB ",
- " 5 5 BBB ",
- " 5 B ",
- " 555 BBB ",
- " 55 BB ",
- " 55 BB ",
- " BBB ",
- " BBB ",
- " BBB ",
- " B ",
- " ",
- " CC ",
- " ",
- " B ",
- " ",
- " B ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/style-level-compositing-tiled-1,1-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/style-level-compositing-tiled-1,1-512-512-2.0-grid-reference.json
deleted file mode 100644
index 97fda92..0000000
--- a/tests/visual_tests/grids/style-level-compositing-tiled-1,1-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,170 +0,0 @@
-{
- "keys": [
- "",
- "67",
- "27",
- "28",
- "204",
- "92",
- "185",
- "119",
- "223",
- "52",
- "203",
- "29",
- "166",
- "201",
- "6",
- "177",
- "221",
- "227",
- "20",
- "123",
- "9",
- "122",
- "141",
- "108",
- "151",
- "222",
- "61",
- "216",
- "180",
- "124",
- "178",
- "219",
- "179",
- "159",
- "146"
- ],
- "data": {},
- "grid": [
- " !!!!##$$$$$$$$%%%%&&&&'' ( ))))) )))))) ) ) ))) ",
- " * !!!!#$$$$$$$$$%++++&&&& )))) ))))) )) ) )))))) ",
- " !!###$$$$$$$$$,+++++&& )))))) )))) ))) ))) )) ))))- -- ",
- " ##$$$$$$$$$$$+++++++& ))) ) ) ))))))--- - ",
- " $$$$$$$$$$$$+++++++ )) ) )) )))------- - . ",
- " ///$$/$$$$$$$+++++++ 0 ))))) ) ))---- ",
- " //////$$$$$11+++++ ))))))))22 ) )-- -- 3 3 ",
- " //////$$$$$1114++++ ) ) 5 --- 33 ",
- " ///////11$11114+++6 55 5 5 - ",
- " ////////111111146666 7 8 55555 55 ",
- " ///////1111111144666 88 5 555555 55 9 ",
- " ///////1111116664666 888 555555555 555 9 ",
- " ///////1111::::64666 8888 55555555555555555 ;;",
- " <<<<<<<<<::::::666 8888 555555555555555555 ;;",
- " <<<<<<====:::::66 888 55555555555555555555 9 ",
- " <<<<<=====::::6 8888 5555555555555555555555555 > ",
- " <<<<<======::666 8888 555555555555555555555555555 > ",
- " <<<<=====???666 888 555555555555555555555555555 ",
- " <<<<====????66 888 5555555555555555555555555555 ",
- " <<<<==?????@6 5555555555555555555555555555 ",
- " <<<<???????@? 55555555555555555555555555555 ",
- " <<<????????? 5555555555555555555555555555 ",
- " ???????AA?? 5555555555555555555555555555 ",
- " ????????? 555555555555555555555555555 ",
- " ???????? 5555555555 555555555555555 ",
- " ??????? 5555555 555555555555 ",
- " ?? 555 5 5555555555 B ",
- " 5555555555 BB ",
- " 5555555 BB ",
- " C 555555 BB ",
- " 5 5 BBB ",
- " 5 B ",
- " 555 BBB ",
- " 55 BB ",
- " 55 BB ",
- " BBB ",
- " BBB ",
- " BBB ",
- " B ",
- " ",
- " CC ",
- " ",
- " B ",
- " ",
- " B ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-allow-overlap-expr-500-500-1.0-grid-reference.json b/tests/visual_tests/grids/text-allow-overlap-expr-500-500-1.0-grid-reference.json
deleted file mode 100644
index 0ffa225..0000000
--- a/tests/visual_tests/grids/text-allow-overlap-expr-500-500-1.0-grid-reference.json
+++ /dev/null
@@ -1,145 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "1",
- "3",
- "5",
- "8",
- "7",
- "10",
- "9",
- "11",
- "13",
- "16",
- "15"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !#!!#!!! $ $$ $$ % %%%%% &&&'&&&' ",
- " ! #! ! $$ $$$ %% %%% '& &''& ",
- " ! !# # $ $$ $ % %% % && &'& ' ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ()(()((( * ** ** + + ++ , ,-,,,- ",
- " ( (( ** ** ++ ++ ,, ,--, ",
- " )))) ( ** ** ++ ++ ,, ,-, ",
- " ) * + - ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-allow-overlap-expr-500-500-2.0-grid-reference.json b/tests/visual_tests/grids/text-allow-overlap-expr-500-500-2.0-grid-reference.json
deleted file mode 100644
index 7ae9819..0000000
--- a/tests/visual_tests/grids/text-allow-overlap-expr-500-500-2.0-grid-reference.json
+++ /dev/null
@@ -1,145 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "1",
- "3",
- "5",
- "8",
- "7",
- "10",
- "9",
- "11",
- "13",
- "16",
- "15"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !##! !##! ##!! $ $$$$ $ $$ %% %%%% %% %% &'& &'&& '' &' ",
- " #!! #!!! # !! $ $ $ $ $ %% % % % &'& & &' ' & ",
- " #!! #!!# # ! $ $ $$$ $ % % %%% % '&' '&' '&& ",
- " #!!# # !# #! $$$$ $ $ $ %%%% % % % '&'& '& ' && ",
- " #! ! # !# !# # $ $ $ $ $$ $ % %% % % % % && &' '& ' & ' ",
- " ! !!##!# !!!!! $ $ $$$ $$$ %% % %%% %%% '& & '&' &&&&& ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " () ( ())( ((((( * **** **** ++ +++ +++++ ,,-,,,,--,,,,,,- ",
- " )(( )((( )) ( *** * * * ++ + + + ,-, , ,- - ,, ",
- " )(( )(() ) ( * * **** * + + +++ + -,- -,, -,, ",
- " )(() ) () )( ** * * * * + + + + + -,,, -, - -, ",
- " )())( ) () (( ***** * * * ++++ + + + + -,-, -, - , - ",
- " (( ( ))() ((((( * * **** **** ++ + +++ ++++ -, , -,- ,,,,,- ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-bengali-800-100-1.0-grid-reference.json b/tests/visual_tests/grids/text-bengali-800-100-1.0-grid-reference.json
deleted file mode 100644
index 14b9ad6..0000000
--- a/tests/visual_tests/grids/text-bengali-800-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "keys": [
- "",
- "3",
- "5",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!! ## $$$$$ ",
- " !! ! ! !! ####### $$ $$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-bengali-800-100-2.0-grid-reference.json b/tests/visual_tests/grids/text-bengali-800-100-2.0-grid-reference.json
deleted file mode 100644
index 7e74062..0000000
--- a/tests/visual_tests/grids/text-bengali-800-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "keys": [
- "",
- "3",
- "5",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # # $$$ ",
- " ! !! !! !!!!! ### ########### $$$$$$$$$$ ",
- " ! ! ! ! !!!!! # ######## $ $ $$$ ",
- " ! ! #### ### $ $$$$ ",
- " # $$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-bug1532-600-165-1.0-grid-reference.json b/tests/visual_tests/grids/text-bug1532-600-165-1.0-grid-reference.json
deleted file mode 100644
index 9f71858..0000000
--- a/tests/visual_tests/grids/text-bug1532-600-165-1.0-grid-reference.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- "keys": [
- "",
- "4",
- "2",
- "1",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! !! ! !! ! ! !!!! ",
- " !! !!! !!!!!! !! ! ",
- " !! !! ! !! !!! !!! ! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " # # # $ $ $$ $ ",
- " #### ########### ## $$$$$ $$$$$$ $$$ $ ",
- " # ## ## ## ### ## # $$$$$ $$$$ $$$ $$$ $ ",
- " ## $$ ",
- " ",
- " ",
- " % % %% % ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%% % %%%%%% %%% % ",
- " %% ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-bug1532-600-165-2.0-grid-reference.json b/tests/visual_tests/grids/text-bug1532-600-165-2.0-grid-reference.json
deleted file mode 100644
index 6d7d801..0000000
--- a/tests/visual_tests/grids/text-bug1532-600-165-2.0-grid-reference.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- "keys": [
- "",
- "4",
- "1",
- "2",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! !! !! ! ",
- " ! !! !! ! ",
- " !!!! !!!! !!!! !!!! !!!! !!!!!!!! !!!! ",
- " !!!! ! ! !! !! !! !!!! !! !!!!!!!!!!!!!!!! ",
- " !! !! ! ! !! !! !! ! !! !! !! ! ! ",
- " !!!! !!!! !!!! !!!! !!!! !! !!!!! ! !! ",
- " !! ",
- " !!! ",
- " ",
- " ",
- " ## # ## # ",
- " ## # ### # ",
- " #### #### ### #### #### ### #### #### ",
- " $ ## ## #### # ##### # ## ## ## ## # ",
- " #### ## #### ## # #### ## ## ## # # ",
- " #### #### #### #### #### ## ##### # # ",
- " ## ",
- " ### % % %%% % ",
- " %%% %%%% %%% %%%% %%% %%% %%%% %%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%% % %%%% %% % %%%% %% %% %% % % ",
- " %%%% %%%% %%%% %%%% %% % %% %%%%% % % ",
- " % % % % % %% %% %%%% % % ",
- " %%% ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-bug1533-600-600-1.0-grid-reference.json b/tests/visual_tests/grids/text-bug1533-600-600-1.0-grid-reference.json
deleted file mode 100644
index 8931820..0000000
--- a/tests/visual_tests/grids/text-bug1533-600-600-1.0-grid-reference.json
+++ /dev/null
@@ -1,162 +0,0 @@
-{
- "keys": [
- "",
- "3",
- "4",
- "2",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! !!! ! ##### # ",
- " !!! !!! ## ## # ",
- " ",
- " ! ! ! ! # # # ",
- " ! !! ! !! !! !! ! !!! !!!! #### ## ############################## ",
- " !! ! # ",
- " # ",
- " !! ! !! # ## # ## ",
- " ! # # ",
- " ",
- " ",
- " ",
- " $ ",
- " $ ",
- " $ ",
- " $ ",
- " $ ",
- " ",
- " $ ",
- " $ ",
- " $$ ",
- " $$ % ",
- " $ % ",
- " $ % ",
- " $ $ % ",
- " $ $$ % ",
- " $$ % ",
- " $$ $ $ % ",
- " $$ $$ $ % ",
- " $$ $ % % ",
- " $$ $$$ % %% ",
- " $$$ $ % % % ",
- " $$ %%% % ",
- " $$$ %%% % ",
- " $ $ % %% ",
- " $ $ % % % ",
- " $ %% %%% ",
- " $ % % %% ",
- " $$ %% %% ",
- " $ %%% %% ",
- " $ %% % ",
- " $ % % ",
- " $ %% ",
- " $ % ",
- " $ % ",
- " $ % ",
- " % ",
- " % ",
- " % ",
- " % ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-bug1533-600-600-2.0-grid-reference.json b/tests/visual_tests/grids/text-bug1533-600-600-2.0-grid-reference.json
deleted file mode 100644
index 9a4bf57..0000000
--- a/tests/visual_tests/grids/text-bug1533-600-600-2.0-grid-reference.json
+++ /dev/null
@@ -1,162 +0,0 @@
-{
- "keys": [
- "",
- "3",
- "4",
- "2",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! # # ",
- " !!!!!!!!!!! !! # # #### # ",
- " !! !! ! !!! !! ## ## # ## ",
- " !! !! ! !! ## # # ## ",
- " ! ! ",
- " ",
- " ",
- " ! ! ! ! ## # ",
- " !! !! !! !! !! !! !! ! ! ## ### # #### # ",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #################################################### ",
- " ! !! ! !! !! ! ! ! ! # # # ## ## ## ## ",
- " !! ! # ",
- " ",
- " ### ",
- " ! !!! !!!! # # # ## # # ",
- " !!!! !! ! !!!! ## # # # # ## # ",
- " !! !!!!!!!!! ## # ## # ## # ",
- " !! $! # ",
- " $ ",
- " $ ",
- " $ ",
- " $$ ",
- " $$ ",
- " $ $$ ",
- " $ ",
- " $ $ $$ ",
- " $$ % ",
- " $$ $$ %% ",
- " $$$ % % ",
- " $ $$ %% % ",
- " $$ $$ % %% ",
- " $ $ $$ $ % % %%% ",
- " $ $$$$ $ $ %% % %% ",
- " $ $ $ $$$$ $ $$$$ $ % %% % % ",
- " $$$ $$$ $ $ $ % %%% % % ",
- " $ $ $$ $ $ $$ % %%% %% ",
- " $ $$$$ $ % %% %%% ",
- " $ $ $ $$ % %%% % ",
- " $$ $ $$ %%% % ",
- " $$ $ $ % %%% %% ",
- " $$$$ $ % %% %%% % ",
- " $$$$ % %% %% ",
- " $ $$ $ % % %%% ",
- " $$ $ $ $ % %%% ",
- " $ $ $ % %% ",
- " $ $ $$ % %%%% ",
- " $ $ % % %%% ",
- " $ % %%%% %% ",
- " $ %% %% %%% ",
- " $ % % % % % ",
- " $ %%% %% ",
- " $ % % ",
- " % % %% ",
- " % ",
- " % ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-bug1820+0-600-300-1.0-grid-reference.json b/tests/visual_tests/grids/text-bug1820+0-600-300-1.0-grid-reference.json
deleted file mode 100644
index 05d5df7..0000000
--- a/tests/visual_tests/grids/text-bug1820+0-600-300-1.0-grid-reference.json
+++ /dev/null
@@ -1,93 +0,0 @@
-{
- "keys": [
- "",
- "10",
- "9",
- "8",
- "7",
- "6",
- "5",
- "4",
- "3",
- "2",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ",
- " !!! ! ! ",
- " # # # # !! !! ",
- " $ ### # ! ! ",
- " %%% $$$ $ ### # # ",
- " &&& %% $$$ $$$ ",
- " &&& & & %% % ",
- " ' ' ' ' && && ",
- " ( ''' ' & & ",
- " ))) ((( ( ''' ' ' ",
- " *** )) ((( ((( ",
- " *** * * )) ) ",
- " + + + + ** ** ",
- " +++ + * * ",
- " +++ + + ",
- " ",
- " + * ) ( ' & % $ # ! ",
- " ",
- " ",
- " ",
- " + +++ * ",
- " + ++ * ***** ) ",
- " * * ** ))) ) ) )) ",
- " ) )))))) ( ( (((( ",
- " )) ) )))) (( (((( ",
- " ( ( ((( ''' & ",
- " ' ' & & ",
- " && & %%%% %%% % ",
- " %%%% % %% % $$$ $$$$$$ ",
- " %% % % %% % $$$$ $$ # ",
- " $$$ $$$ $ ### ### ",
- " $ ### ## ! !! ",
- " ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-bug1820+0-600-300-2.0-grid-reference.json b/tests/visual_tests/grids/text-bug1820+0-600-300-2.0-grid-reference.json
deleted file mode 100644
index 714f2f0..0000000
--- a/tests/visual_tests/grids/text-bug1820+0-600-300-2.0-grid-reference.json
+++ /dev/null
@@ -1,93 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "7",
- "5",
- "3",
- "1",
- "2",
- "4",
- "6",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! ! ",
- " ! !!! !!!!!! ",
- " ##### ! ! ! ! ",
- " # # ! !!!! !!! ! ",
- " # #### ###### ! ! ! ! ",
- " $$$$$ $ # # # # # ! !!!!!!!! !! ",
- " $ $$$ $$$$$$ # # ## # ",
- " %%%%% $ $ $ $ # # ## # # ",
- " % % $ $$$$ $$$ $ ",
- " % %%%% %%%%%% $ $ $ $ ",
- "&&&& & % % % % % $ $$$$$$$$ $$ ",
- " & &&& &&&&&& % % %% % ",
- " & & & & % % %% % % ",
- " & &&&& &&& & ",
- " & & & & ",
- " & &&&&&&&& && ",
- " ",
- " ",
- " & ' % ( $ ) # * ! + ",
- " ",
- " ",
- " ",
- " ",
- " && &&& && ",
- " & & & & & & % ",
- " & & & & &&&& % % ",
- " & & & & & %%% %%%% %%%%%%% %%%% ",
- " &&& & & &&&& % % % % % % % % $ $ ",
- " % % % % % % $$$$ $ $ $$ ",
- " % % % % %% % %% % $ $ $ $ $ $ ",
- " $ $ $$$ $$$$ ",
- " $ $ $$ $ #### ### # # ### #### ",
- " $ $ $$ $$$$ ## ## # # # # # # # ! ",
- " ### # # # # # !!! ! !!!! !! ",
- " # # # # ## ## # # # ! ! ! ! ! ! ! ",
- " ! ! ! ! ! !!!! ",
- " ! ! ! ! ! ! ",
- " ! ! ! ! ! !!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-bug1820+1-600-300-1.0-grid-reference.json b/tests/visual_tests/grids/text-bug1820+1-600-300-1.0-grid-reference.json
deleted file mode 100644
index 7e9cbe5..0000000
--- a/tests/visual_tests/grids/text-bug1820+1-600-300-1.0-grid-reference.json
+++ /dev/null
@@ -1,93 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " !!! ### $$$ %%% &&& ''' ((( ))) *** +++ ",
- " !! ## $$ %% && '' (( )) ** ++ ",
- " !! !! ## ## $$ $$ %% %% && && '' '' (( (( )) )) ** ** ++ ++ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! !!!! ",
- " ! !! ",
- " ! ! # ",
- " # #### ",
- " ## ### $ ",
- " $$$ $ $ $$ ",
- " $ $$ ",
- " $ $ % ",
- " %% %%%% ",
- " %%% %%% & ",
- " && &&& ",
- " &&& ",
- " & ",
- " ' ' ' ",
- " '''' ",
- " (((( ((( (( ",
- " (( ( ( ( ",
- " ( ( ( ) ",
- " )))) )) ",
- " ))) ))) ) * ",
- " ) ***** ** ",
- " *** * ",
- " * ",
- " +++++ ",
- " +++ + ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-bug1820+1-600-300-2.0-grid-reference.json b/tests/visual_tests/grids/text-bug1820+1-600-300-2.0-grid-reference.json
deleted file mode 100644
index f9fc998..0000000
--- a/tests/visual_tests/grids/text-bug1820+1-600-300-2.0-grid-reference.json
+++ /dev/null
@@ -1,93 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- "!!!! ! $$$$$ $ &&&&& & ((((( ( ***** * ",
- " ! ! $ $ & & ( ( * * ",
- " ! ! !! ! ! ! $ $ $$ $ $ $ & & && & & & ( ( (( ( ( ( * * ** * * * ",
- " ! !!!! !! ! $ $$$$ $$ $ & &&&& && & ( (((( (( ( * **** ** * ",
- " ! ! ! ! $ $ $ $ & & & & ( ( ( ( * * * * ",
- " ! !!!!!!!! !! $ $$$$$$$$ $$ & &&&&&&&& && ( (((((((( (( * ******** ** ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! !! !!!! ! !! ",
- " ! ! ! ! !!!! ",
- " ! ! ! ! ! ",
- " !!!! ! ! !!!! $ $ ",
- " $ $ ",
- " $ $$ $ $$ $$ $ $$ $ ",
- " $ $ $ $ $$$$ $$$$ ",
- " $ $ $ $ $ $ ",
- " $$ $ $ $ $$$$ $$$$ &&&& ",
- " & ",
- " & & & & & && ",
- " & & & && &&&& ",
- " & & && & ",
- " & & && &&&& ",
- " ",
- " (( ( ( ( ( ( (( ( (( ( ",
- " (( ((((( ( ( (((( ( ( ",
- " (((( ( ( ( ( ( ",
- " (((( (((( ( ((( ( ( * ",
- " ",
- " * ** * ** * ** * ",
- " * * * * * **** ",
- " * * * * * * "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-bug1820-1-600-300-1.0-grid-reference.json b/tests/visual_tests/grids/text-bug1820-1-600-300-1.0-grid-reference.json
deleted file mode 100644
index 7ca8ae2..0000000
--- a/tests/visual_tests/grids/text-bug1820-1-600-300-1.0-grid-reference.json
+++ /dev/null
@@ -1,93 +0,0 @@
-{
- "keys": [
- "",
- "10",
- "9",
- "8",
- "7",
- "6",
- "5",
- "4",
- "3",
- "2",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ! ! ",
- " !!! ! ",
- " ### !!! ! ! ",
- " ## ",
- " ## # ",
- " $ $ $ $ ",
- " $$$ $ ",
- " %%% $$$ $ $ ",
- " %% ",
- " %% % ",
- " & & & & ",
- " &&& & ",
- " ''' &&& & & ",
- " '' ",
- " '' ' ",
- " ( ( ( ( ",
- " ((( ( ",
- " ))) ((( ( ( ",
- " )) ",
- " )) ) ",
- " * * * * ",
- " *** * ",
- " +++ *** * * ",
- " ++ ",
- " ++ + ",
- " ",
- " ",
- " ",
- " ",
- " ) ' & $ $ # ",
- " + ++ + ** ** * ))) ) ) )) ( ( (((( '' ' ' &&&& & %% %% %%% % $$$ $$$$$$ ##### ## ! ! !! ",
- " + + ++++ * **** ) )))))) (( (((( '''' &&& & %%%% % %% % $$$$ $$ ### ### !!! ! ",
- " + ++ + ****** )) ) )))) ( ((((( ' ' &&&& & %%%% % %% % $$$ $$$ $ ### ### ! ! ! ",
- " $ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-bug1820-1-600-300-2.0-grid-reference.json b/tests/visual_tests/grids/text-bug1820-1-600-300-2.0-grid-reference.json
deleted file mode 100644
index a1b4149..0000000
--- a/tests/visual_tests/grids/text-bug1820-1-600-300-2.0-grid-reference.json
+++ /dev/null
@@ -1,93 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "7",
- "5",
- "3",
- "1",
- "2",
- "4",
- "6",
- "8",
- "10"
- ],
- "data": {},
- "grid": [
- " ! ! ",
- " ! !!! !!!!!! ",
- " ! ! ! ! ! ",
- " ! ! !! ! ",
- " ##### ! ! !! ! ! ",
- " # # !! !! ",
- " # ### ###### ",
- " # # # # # ",
- " # # ## # ",
- " $$$$$ # # ## # # ",
- " $ $ ## ## ",
- " $ $$$ $$$$$$ ",
- " $ $ $ $ $ ",
- " $ $ $$ $ ",
- " %%%%% $ $ $$ $ $ ",
- " % % $$ $$ ",
- " % %%% %%%%%% ",
- " % % % % % ",
- " % % %% % ",
- "&&&& % % %% % % ",
- " & & %% %% ",
- " & &&& &&&&&& ",
- " & & & & & ",
- " & & && & ",
- " & & && & & ",
- " && && ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " % $$$ ! ",
- " % % $ ",
- " &&&& &&&& &&&& %%% %%%% %%%%%%% %%%% $$$$ $ $ $$$$ #### ### # ## ### #### !!!! ! !!!! !!!! ",
- " & & & & & & % % % % % % % % $ $ $ $ $ $ ## # # # # # # # # ! ! ! ! ! ! ! ",
- " & & & & & % % % % % % $ $ $$ $ #### # # # # # ! ! ! ! ! ! ",
- " & & & & & & % % % % %% % % $ $ $$ $ $ # # # # ## ## # # ! ! ! ! ! !! ",
- " && & && ' % %% %% ( $ $$ ) ## ## # ## * ! !! + ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-bug2037-800-300-1.0-grid-reference.json b/tests/visual_tests/grids/text-bug2037-800-300-1.0-grid-reference.json
deleted file mode 100644
index dc69abd..0000000
--- a/tests/visual_tests/grids/text-bug2037-800-300-1.0-grid-reference.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "keys": [
- "",
- "7",
- "3",
- "4",
- "8"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ! !!!!!! ",
- " ####### $$$$$$$ ",
- " ## ### $$ $$$ !!!! %%%%% % %% ",
- " # $ !! %%%% %%%%%% ",
- " ## # $$ $ ",
- " # $ !! !! %%%%% %%%% ",
- " # ## ## $ $$ $$ !! !! % % %% ",
- " ## # ## $$ $ $$ ! ! % % ",
- " ! !!! % %%% ",
- " ##### $$$$$ ",
- " # $ !!!! % %% %%%%%%% ",
- " !!!! % %% %%%%%%%% ",
- " # ## $ $$ ",
- " !!!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-bug2037-800-300-2.0-grid-reference.json b/tests/visual_tests/grids/text-bug2037-800-300-2.0-grid-reference.json
deleted file mode 100644
index d9dbff1..0000000
--- a/tests/visual_tests/grids/text-bug2037-800-300-2.0-grid-reference.json
+++ /dev/null
@@ -1,86 +0,0 @@
-{
- "keys": [
- "",
- "7",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " !! !!!!!!! !! !! !!!!!! ",
- " !! !! !!!! !!! ! ",
- " !!! ! ! ! !! ! !!!! ! ",
- " ## # # $$ $ $ ",
- " ## ## # # $$ $$ $ $ ",
- " !!!! !!!! ",
- " !!! ",
- " # # # $ $ $ !!!!!! ! ",
- " ## ## ## $$ $$ $$ ",
- " # ## ## # # $ $$ $$ $ $ ",
- " ### ## ## $$$ $$ $$ ! ! !! ",
- " !!! ! ",
- " ! ! ! ! ",
- " ###### ## ## ## $$$$$$ $$ $$ $$ ",
- " # ## ## # # $ $$ $$ $ $ ",
- " # ## ### ## ## $ $$ $$$ $$ $$ ",
- " # $ ! ! ! !! ",
- " ! ! ! !! ",
- " ##### # $$$$$ $ ",
- " ### # ## $$$ $ $$ ",
- " ###### # $$$$$$ $ !! ",
- " !!! !! ! ",
- " !!! !! ",
- " # # ## ### $ $ $$ $$$ ! ",
- " ### # # # $$$ $ $ $ ",
- " # # ## # # $ $ $$ $ $ ! ! ",
- " # $ !! !!!! !!!! !! ",
- " ! !! !!! !!! !! ",
- " !! ! !! !!! !!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-charplacement-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/text-charplacement-512-512-1.0-grid-reference.json
deleted file mode 100644
index c622e96..0000000
--- a/tests/visual_tests/grids/text-charplacement-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,148 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "5",
- "6",
- "9",
- "1",
- "11",
- "10",
- "7",
- "8",
- "13",
- "12",
- "3"
- ],
- "data": {},
- "grid": [
- " ! # $ %%% % ",
- " & ! %% %%% ",
- " ! # $ %%%% ",
- " & ! %%%%%% ",
- " ! # $ % %% %%%% ",
- " & ! %%%%%% ",
- " ! # $ %%%%%%%% ",
- " & ! $$ %% %% ",
- " ! #### $$$$$ %%%% %% ",
- " & ! #### $$$$$ % %%% ",
- " ! #### $$$ %%%%% ",
- " & ! #### $$$$ '''' '' % %%% ",
- " ! ### $ $ ''''' %%%%% ",
- " & ! # ## $$$$ ''''' %%%% ",
- " ! ### $$$$ ' '''' %%%% ",
- " & ! #### $$$$ '''''' %%%% ",
- " ! #### $$$$ '''''' %% ",
- " & ! ##### $ $$ ''''''' %%%% ",
- " ! ### $$$ ''''' %% ",
- " & ! ##### $ '''' ' %%%% ",
- " ! ### $$$ ''' %%%% ",
- "& ! # $$$$$ ''''' %%%% ",
- "& #### $$$$ ''' % ",
- " & ! #### $$$$ ''''' % ",
- " & ### $$$ '''' ",
- " & ! ## $$$ ''''' ",
- " & ### $$$ '''' %",
- " & ! ### $$$ ''' %",
- " & ## $ '' ' %",
- " & ! ### $$$ ''' %",
- " & ### $ '''' %",
- " & ! ### $$$ ''' ",
- " & #### $$$ ''' ",
- " & ! # # $$$ ",
- " & #### $$$ ",
- " & ! ' ",
- " & ' ",
- " & ! ' ",
- " & ' ",
- " & ! ",
- " & ",
- " & ! ",
- " & ",
- " ",
- " ",
- " ",
- " ' ",
- " ' ",
- " ' ",
- " ' ",
- " ",
- " ' ",
- " ''' ",
- " '''' ",
- " ''' (",
- " ''' (",
- " ''' (",
- " '''' (",
- " ''''' (",
- " '''' ",
- " '''' ",
- " '''''' ( ",
- " )))) *** ' '''' ( ",
- " ) ) *** ''''' (( ",
- " )))) *** ' '' ((((",
- " ))) *** ''' '' ((((",
- " ) ) * '''' ((( ",
- " ))) *** ''''' (((( ",
- " ))) *** '''''' (((( ",
- " ))) *** ''''''''' (( ( ",
- " ))) *** ''''''''' (((( ",
- " ))) *** '''''' (((( ",
- " ) ) *** '' '''' ((((( ",
- " )))) **** '''' ' (( (((( ",
- " **** ((((( ",
- " ))) ***** ( ((( ",
- " )))) *** ((( (( ",
- " ))))) *** ((( ",
- " )))) *** ((( (( ",
- " )))) * ** (((((( ",
- " )))) *** ((( (((((( ",
- " )))) **** ((((((((( ",
- " )))) **** ((((((( ",
- " )))) **** ((( ( (( ",
- " )))) *** ( ( ",
- " + + ))) *** ",
- "+ ++ + ++ + )))) ***** ",
- " ++ + ++ + + )))) ****** ",
- " + + + + + + )))) *** ",
- " + + + + ))) * ** ",
- " + + + + + ) * ",
- " + + + + + + + ) * ",
- " + + + + + + + ) * ",
- " + + + + + + ) * ",
- " + + + + ) * ",
- " + + + + + ) * , ",
- " + + + ) * ,,, ",
- " ,,,,,,, ",
- " ,, ,,,,,, ,, ",
- " , , ,,,,,,, ",
- " , ,,,,,,,,, ",
- " , ,,,,,, , ,",
- " ,,,,,,, , ",
- " , ,,,, , ",
- " ,,,,,,, , ",
- " ,,,,,,,,,,,,,, ",
- " , ,,,, ,,,,,, ",
- " ,,,, , ,,,, ",
- " , ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " - - - ",
- " --- - - - - - - - - --- - - -- ---- - - - - --- - - -- --- - - - - ",
- "--------------------------------------------------------------------------------------------------------------------------------",
- " ------------- ------- - ---- ---- ------- -------- ------ ---- ----- - ------ -------- ",
- " ------ ------ ------- - ---- - ---------- - ------ ------ - ---------- - ---- ---- -- ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-charplacement-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/text-charplacement-512-512-2.0-grid-reference.json
deleted file mode 100644
index 62ee024..0000000
--- a/tests/visual_tests/grids/text-charplacement-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,148 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "5",
- "6",
- "9",
- "1",
- "11",
- "10",
- "7",
- "8",
- "13",
- "12",
- "3"
- ],
- "data": {},
- "grid": [
- " ! # $ %%%% ",
- " & ! # $ %%% ",
- " ! # $ %%% ",
- " & ! # $ %% ",
- " ! # $ %% ",
- " & ! # $ %% ",
- " ! # $ % ",
- " & ! # $ % ",
- " ! # $ % ",
- " & ! # $ %% ",
- " ! # $ % ",
- " & ! # $ '''''' % ",
- " ! # $ ''' % ",
- " & ! # $ '' % ",
- " ! # $ '' '' % ",
- " & ! # $ '' ''' % ",
- " ! # $ '''''''' % ",
- " & ! # $ '''''' % ",
- " ! # $ ''''''' % ",
- " & ! # $ ''''''' '' % ",
- " ! # $ ''''''''' % ",
- "& ! # $ '''''''' % ",
- "& ''' '' % ",
- " & ! ''' ''' % ",
- " & '''''''' ",
- " & ! ''''' '' %",
- " & ''' ''' %",
- " & ! '''''''' %",
- " & ''''' %",
- " & ! ''''''' %",
- " & '''''' %",
- " & ! ''''''' ",
- " & ''''''' ",
- " & ! ''''''' ",
- " & '''''' ",
- " & ! ''' ",
- " & '''''''' ",
- " & ! '''''''' ",
- " & '''' ",
- " & ! ''''' ",
- " & '''''''' ",
- " & ! '''''''' ",
- " & ''''' ",
- " ",
- " ' ",
- " ' ",
- " '''''' ",
- " ''''''''' ",
- " ''''''' ",
- " ''' ''' ",
- " ''''''' ",
- " '''''' ",
- " '''' ",
- " '''''' ",
- " ''''''' (",
- " ''''''' (",
- " ''''''' (",
- " '''''' (",
- " '''''''' (",
- " '''''' (",
- " ''' ''' ",
- " ''' ''' '' ( ",
- " '''''''''''' ( ",
- " '''''''''''' ",
- " ''' '''' ( ",
- " '''''''''' ( ",
- " ''''' ''' ( ",
- " ''''' ( ",
- " ' '''' ( ",
- " '' ''' ( ",
- " '' ( ",
- " ''' ( ",
- " '' ( ",
- " ''''' ( ",
- " ( ",
- " ) * ( ",
- " ) * ( ",
- " ) * ( ",
- " ) * (( ",
- " ) * ( ",
- " ) * (( ",
- " ) * (( ",
- " ) * ((( ",
- " ) * (((( ",
- " ) * (( ",
- "+ + + ) * ",
- "+ ++ + ++ + ) * ",
- " + ++ + + ++ + + ) * ",
- " + + + + + + + + ) * ",
- " + + + + + + ) * ",
- " + + + + + + + + ) * ",
- " + + + + + + + + + ) * ",
- " + + + + + + + + + ) * ",
- " + + + + + + + + ) * ",
- " + + ++ + + ) * ",
- " + ++ ++ ++ + ) * ",
- " + + + + + ) * ",
- " ,,,,, ",
- " ,,, ,,, ",
- " ,, ,, ",
- " , , ",
- " , ,, ,",
- " , , , ",
- " ,, ,, ",
- " , ,, ",
- " ,,,, ,,, ",
- " ,,,, ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " -- ",
- " ----- -- --- -- ",
- " ------ -- --- ---- ---- -- --- -- --- --- ",
- " -- --------------- ----- ---- -- ----- --------- ----- ",
- "--------------------------------------------------------------------------------------------------------------------------------",
- " ----- -- ---------- -- ------------- -- -- -------- ",
- " -- ----- ----------- -- -- ---------- -- -- -------- ",
- " -- -------------------- -- ---------- -- -- -------- ",
- " -- -------------- ----- -- --------- -- -- -- ----- ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-data-binding-500-500-1.0-grid-reference.json b/tests/visual_tests/grids/text-data-binding-500-500-1.0-grid-reference.json
deleted file mode 100644
index 16d309f..0000000
--- a/tests/visual_tests/grids/text-data-binding-500-500-1.0-grid-reference.json
+++ /dev/null
@@ -1,134 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! ! !!!!!!!!!!!!!!!!!!!!!!! !! ! ! !! ! ! ! ",
- " ! !!!! ! !! !! !!! !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!! !!!!! ! !! !! ! !! !! !! ",
- " !! ! !! !!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!! !! !!!!!!! !!! ! ! !! ! ! !! ! !! ",
- " !!!!! ! ! !! ! !!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!! ! !! ! ! ! ! ! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! ",
- " ! !! ! ! ! !!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!! ! ! !! ! !! !!!!! ! !! !!!!! ! ! ",
- " ! !!!! ! !! !!!!!! !!!!!!!!!!!!!! !!!!! !!!!! ! !! ! ",
- " ! !! ! ",
- " ! !!! ! ! ",
- " !! !!! !!! ",
- " !! !! ",
- " !!!! ! ! ! ",
- " !! ! ! !! ! ",
- " ! !!!!!! ! ! ",
- " ! !! !! !! ",
- " !!! !! ",
- " !! !!! ",
- " ! !!! !!! ! ",
- " ! !!!!! !!!! ",
- " !! !!!! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ! ! ! !! ! ! ! ",
- " ! !! !!!!! !! !!!!!!!! !!!! ",
- " ! ! !! ! ! !! !!! ",
- " !! ",
- " ! ",
- " ! !! !!!!! !! ! ! !!!! ! !! ",
- " !! ! !! ! !!! !!!!!!!! ",
- " ! !!!! !!!!!! ! !!!!!! ! !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-data-binding-500-500-2.0-grid-reference.json b/tests/visual_tests/grids/text-data-binding-500-500-2.0-grid-reference.json
deleted file mode 100644
index c78f35f..0000000
--- a/tests/visual_tests/grids/text-data-binding-500-500-2.0-grid-reference.json
+++ /dev/null
@@ -1,133 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-displacement-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/text-displacement-512-512-1.0-grid-reference.json
deleted file mode 100644
index 5470d17..0000000
--- a/tests/visual_tests/grids/text-displacement-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,162 +0,0 @@
-{
- "keys": [
- "",
- "3",
- "4",
- "15",
- "14",
- "22",
- "23",
- "25",
- "2",
- "13",
- "16",
- "1",
- "5",
- "12",
- "9",
- "6",
- "11",
- "21",
- "8",
- "10",
- "26",
- "7",
- "24",
- "17",
- "18",
- "19",
- "20"
- ],
- "data": {},
- "grid": [
- " !!!!!!!!!!!!## $%%%%%%%%%%%% &&&&&&&&&&& ' ((((((((((((",
- " ) ) ! ## ## $ %% % & '' ",
- " )) ) ### $ %%%%%%% ' ",
- " )) ) ### $ %%%%%%% & ",
- " )))) ) ### $ $ ** & & ",
- " ))) ) #### $ $$ *** & & ",
- " ) ) ## $ $$$ *** & ",
- " ) $ $$$ *** ",
- " ) + $ $$$$ *** & ",
- ")) +$ $ ** &&& & ",
- ")) + & & '''''''''' ",
- ", -- +++ & ",
- ", ----- ++++ .. ",
- ", --- ++++ .. ",
- ", -- +++ .. ",
- ", -- +++ .. ",
- ", -- +++ .. ",
- ", -- +++ .. ",
- ", --- ++++ .. ",
- ", //+ .. ",
- ", /+ ",
- ", 0 // / 1 1 2 2 ",
- ", 0 / /// 11 1 2 ",
- " 0 /// 111 1 ",
- " 0 /// 111 1 2 ",
- " 33 0 00 //// 1111 1 2 2 ",
- " 333 0 0000 /// 11 1 2 2 ",
- " 333 0 0000 / 1 2 ",
- " 3333 0 000 4444444 1 ",
- " 333 0 000 4444444 1 22 2 55 ",
- " 3 6 0 0 4 1 22 2 77 5 ",
- " 6 44 2 7 5 ",
- " 66 6 2 5 ",
- " 6666666 2 5 ",
- " 6 66666 ",
- " ",
- " ",
- " ",
- " 8888 8888888 ",
- " 8888888 8888888888 ",
- " 8 88 8888888 ",
- " 888 8 888888888888 8888 ",
- " 888888 8 8 888888 ",
- " 8888 8 8 8 8888 ",
- " 8888 8 8 8888 ",
- " 888 8 8 888 ",
- " 888 8 88888 ",
- " 888888 8 888 ",
- " 88888 8 888 ",
- " 888 8 88888 ",
- " 888 8 88888 ",
- " 88888 88 88 ",
- " 88 8 88888 ",
- "8888 8888 ",
- "888 88 ",
- "88 8 ",
- "88 8 ",
- " ",
- " ",
- " ",
- " ",
- "9 ",
- "99 9 ",
- " 9 9 ",
- " 9 ",
- " 9 ",
- " 9 ",
- " 9 ",
- " 9 ",
- " 9 ",
- " 9 ",
- " 9 ",
- " 9 9 ",
- " 9 9 ",
- " 9 9 ",
- " 9 : ; 9 ",
- " 9 : ; 9 ; ",
- " :: ;;;; ",
- " :: ;;;;;; ",
- " : ;;;; ",
- " : ; ;;; ",
- " : ;;; ; ",
- " : ; ;;; ",
- " : ; ;; ",
- " : ;;;; ",
- " : ;;;;; ",
- " : ;;; ; ",
- " : ;;;; ",
- " ;; ",
- " : ;;;; ",
- " ;; ",
- " : ;;;; ",
- " ;; ",
- " : ;;; ",
- " ;; ",
- " : ;;;; ",
- " ;; ",
- " : ;;;; ",
- " : ;;;; ",
- " : ;;; ",
- " : ;;; ",
- " : ;;; ",
- " : ; ;; ",
- " : ;;; ",
- " : ;;; ",
- " : ;;; ",
- " : ;;; ",
- " : ;;; ",
- " : ;; ",
- " : ; ;; ",
- " : ;; ",
- " : ; ;; ",
- " : ;;; ",
- " : ; ;;; ",
- " : ;; ",
- " : ; ",
- " : ;;; ",
- " : ; ;;; ",
- " ;;; ",
- " ;;; ",
- " ;;; ",
- " ;;; ",
- " ;;; ",
- " ;;; ",
- " ;;;; ",
- " ;;; ",
- " ;;; ",
- " ;;; "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-displacement-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/text-displacement-512-512-2.0-grid-reference.json
deleted file mode 100644
index 8a89da9..0000000
--- a/tests/visual_tests/grids/text-displacement-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,160 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "3",
- "4",
- "15",
- "14",
- "22",
- "23",
- "25",
- "13",
- "16",
- "1",
- "12",
- "6",
- "9",
- "11",
- "21",
- "26",
- "8",
- "10",
- "24",
- "17",
- "18",
- "19",
- "20"
- ],
- "data": {},
- "grid": [
- " !!!!!! ##########$$ $$$$$$$ %%%&&&&&&&&&&&&&&& ''''''''''' ( )))))))))))))))",
- " !!!!! ! $$$ $$$$$ %%% && ** ' ' ( )) ",
- "!!!!!! ! $$$ $$$$$$ %%%% ** ' (((( ",
- "!!!!! ! $$$ $$$$$$ %%%%%% ** ** ' ((( ",
- "!!!! ! $$ $$$$$$$ % %%%% **** ** ' ' (( ",
- "!!! ! $$ $$$$$$$ % %%%%% ***** ** ' ' ( ",
- "!! ! $$ $$$$ + % %%%%%%% ****** ** '' ' ( ",
- "!!!! $$ $$$ + % %%%%%% ***** *** ''' ' ( ",
- "!!!! $$ + % %%%%%% ****** *** ''''' ( ",
- " !!! $$ +% %%%%%% ***** *** ' ' ' ( ",
- "! ! $ + %%%%%%% ****** * ** ' ' ((((((((((( ",
- ", + %%%%%%% ******* ** '' ",
- ", +++++%%%%%% ***** ** '' ",
- ", +++ %%% *** ** ' ",
- ", ++ %% * ' ",
- ", + ' ",
- ", + -- ",
- ",, .. / + // 00 -- ",
- ",, .. // + //// 000 ---- ",
- ", .. //+ ///// 00000 -- ",
- ", . .. /+ ////// 000000 -- 11111111111 2222222222",
- "33 ... /// ///// 000000 -- 1 1 2 ",
- ",33 ... ////////// 000000 0-- 1 1 2 ",
- ", 33 ..... //// ////// 000000 0 -- 1 2 ",
- "3 33 . ... // ///// 0000000 0 -- 1 2 ",
- "3 33 . .... // //////// 0000000 0 -- 1 1 2 ",
- "33 33 . ..... // ////// 000000 0 1 1 2 ",
- "333 33 . ...... // //// 000 0 11 1 22 ",
- "3333 3333 . ..... // // 00000 1111 2222 ",
- "33333 333 . ...... // 4 000 111 1 55 2 222 ",
- " 3333 333 . ........ 444444444 0000 1 1 555555555 2 ",
- " 3333333 33 ....... 444444444 00 0 1 555555555 2 ",
- " 333333 33 ....... 44 00 1 55 2 ",
- " 3333 33 ..... 00 1 2 ",
- " 33 3 .. 0 11 2 ",
- " 1 2 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " 666666666666 ",
- " 6 66 ",
- " 6 66 ",
- " 6 66 ",
- " 6 66 ",
- " 6 66 ",
- " 6 6 ",
- " 6 6 ",
- " 6 6 ",
- " 6 6 ",
- " 6 6 ",
- " 6 6 ",
- " 66 6 ",
- "6666 6 ",
- " 666 6 ",
- "666 6 ",
- "6 ",
- " ",
- " ",
- " ",
- "7 ",
- "777 7 ",
- " 777 7 ",
- "7777 7 ",
- " 77 7 ",
- " 77 7 ",
- " 77 7 ",
- " 77 7 ",
- " 77 7 ",
- " 77 7 ",
- " 77 7 ",
- " 7 7 ",
- " 7 7 ",
- " 7 8 99 7 ",
- " 7 8 99 7 ",
- " 7 8 99 7 ",
- " 8 877777777799 9 ",
- " 88 999 ",
- " 8888 9999 ",
- " 88 99 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 8 9 ",
- " 88 99 ",
- " 88 99 ",
- " 88 99 ",
- " 88 99 ",
- " 88 99 ",
- " 88 99 ",
- " 88 99 ",
- " 88 99 ",
- " 88 99 ",
- " 88 99 "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-expressionformat-color-800-100-1.0-grid-reference.json b/tests/visual_tests/grids/text-expressionformat-color-800-100-1.0-grid-reference.json
deleted file mode 100644
index 8c07d56..0000000
--- a/tests/visual_tests/grids/text-expressionformat-color-800-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- " ! ! # # $ $ % % & & ' ' ( ( ) ) * * + + ",
- " !! !! !! ! ## ## ## # $$ $$ $$ $ %% %% %% % && && && & '' '' '' ' (( (( (( ( )) )) )) ) ** ** ** * ++ ++ ++ + ",
- " ! ! ! ! ! # # # # # $ $ $ $ $ % % % % % & & & & & ' ' ' ' ' ( ( ( ( ( ) ) ) ) ) * * * * * + + + + + ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " !! ! ! ## # # $$ $ $ %% % % && & & '' ' ' (( ( ( )) ) ) ** * * ++ + + ",
- " !!! !!! ### ### $$$ $$$ %%% %%% &&& &&& ''' ''' ((( ((( ))) ))) *** *** +++ +++ ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-expressionformat-color-800-100-2.0-grid-reference.json b/tests/visual_tests/grids/text-expressionformat-color-800-100-2.0-grid-reference.json
deleted file mode 100644
index 208a214..0000000
--- a/tests/visual_tests/grids/text-expressionformat-color-800-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- "10"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ",
- " ",
- " ! # $ % & ' ( ) * + ",
- " ! ! ! # # # $ $ $ % % % & & & ' ' ' ( ( ( ) ) ) * * * + + ",
- "!! !!! !!! ### ###!!### ### $$$ $$$##$$$ $$$ %%% %%%$$%%% %%% &&& &&&%%&&& &&& ''' '''&&''' ''' ((( (((''((( ((( ))) )))(())) ))) *** ***))*** *** +++ +++**+++ +++ ++ +",
- " ! ! ! ! !# !#!!# #! # # #$ #$##$ $# $ $ $% $%$$% %$ % % %& %&%%& &% & & &' &'&&' '& ' ' '( '(''( (' ( ( () ()(() )( ) ) )* )*))* *) * * *+ *+**+ +* + + + + +",
- "!! ! ! ! !#!!#### #! # # #$##$$$$ $# $ $ $%$$%%%% %$ % % %&%%&&&& &% & & &'&&'''' '& ' ' '(''(((( (' ( ( ()(()))) )( ) ) )*))**** *) * * *+**++++ +* + + ++++ ",
- " ! ! ! !# #! ! #! # # #$ $# # $# $ $ $% %$ $ %$ % % %& &% % &% & & &' '& & '& ' ' '( (' ' (' ( ( () )( ( )( ) ) )* *) ) *) * * *+ +* * +* + + + +",
- "!! !!! !! #!!!###! ### ## $###$$$# $$$ $$ %$$$%%%$ %%% %% &%%%&&&% &&& && '&&&'''& ''' '' ('''(((' ((( (( )((()))( ))) )) *)))***) *** ** +***+++* +++ ++ +++++",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-font-features-500-500-1.0-grid-reference.json b/tests/visual_tests/grids/text-font-features-500-500-1.0-grid-reference.json
deleted file mode 100644
index 46c069c..0000000
--- a/tests/visual_tests/grids/text-font-features-500-500-1.0-grid-reference.json
+++ /dev/null
@@ -1,140 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! ! ! ! ",
- " ! ! ! ! ! ! ! !! ! ",
- " ! ! ! !! ! !! ! ! ! !! !! !! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ### # # # # ",
- " # # ## # # ## # # # ## ## ## ",
- " # # # # # # # ## # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $ $$ $ ",
- " $ $ $ $ $$$$ ",
- " $$$$$$$ $$$$$$ $ $$$$$$$$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%% % % ",
- " % %% %% %%%%% %% %%%%%% ",
- " % % % %%%% ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " & & & & & & ",
- " & & & & &&& ",
- " && && &&&& && & ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ' ' ' ' '' ' '' ' ' ",
- " ' ' ' ' ' '''' ''' ' ",
- " ' ' ' ' ''' '' ' ' ' ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ( (( (( ( ( ",
- " ((( ( ((( ( ",
- " ( ((( (( (( (( ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-font-features-500-500-2.0-grid-reference.json b/tests/visual_tests/grids/text-font-features-500-500-2.0-grid-reference.json
deleted file mode 100644
index 01d87bd..0000000
--- a/tests/visual_tests/grids/text-font-features-500-500-2.0-grid-reference.json
+++ /dev/null
@@ -1,140 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! ! !! ",
- " ! ! ! ! ! ! ! ! ! ! ",
- " ! !!!! !!! !!! !! !!! !! !!! !!! ! !!! !!! !!! ",
- " ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! !!! ! ! ! ! ! ! ! ! ",
- " ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ##### # # # # # # # ## ",
- " # # # # # # # ",
- " # ## # # # # # ### # # # # # # # # ### ",
- " # # # #### # # # ## # # # # # # # # ",
- " # # # # # # # # # # # # # # # # # # ",
- " ## #### ### ### ## ## ### ## ### ## ### ### ## ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $ $$ $$$ ",
- " $ $ $ $ $ $ $ ",
- " $ $$$ $$ $$$$ $$$ $$ $$$ $$ $ $$$ $$ $$$ ",
- " $ $ $ $ $ $ $ $ $ $ $ $ $ $$ $ $ ",
- " $ $ $ $ $ $ $$ $ $ $ $ $$ $ $ ",
- " $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $$ $ $ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%%%%%% %%%% % %%%% ",
- " % % % % % % % ",
- " % % % % % % % %%%% % % % % % % % % % ",
- " % % % %%%% % % % %% % % % % %% % % ",
- " % % % % % % % % % % % % % % % % % % ",
- " %%% %%%%% %% %%%% %% %%% %% %%%%% %%% %% %% ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " & & & & & ",
- " && && & && & && &&& & & ",
- " & & & & & && & & && ",
- " & & & & & && & & & ",
- " & & & & & & & & &&&& ",
- " & & &&& & & & && && & ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ''' '' ''' ''' '' ''' ''' '''' ''' ''' ",
- " ' ' ' ' ' ' ' '' ' ' ' ' ' ' ",
- " ' ' ' ' '' ' ' ''' '''' ' ''' ' ' ",
- " ' ' ' ' ''' ' ' ' ' ' ' ' ''' ",
- " ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ",
- " ''' ''' '''' ''' '' '''' '' ' ''' '' ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ( ",
- " ( ( ( ( ( ( ( ( ( ",
- " ( ( ( ( ( ( (( ",
- " ((((( ( ((( ( ( ( ( ",
- " ( ( ( ( ( ( (((( ",
- " ( ( (((( ( ( ( ( ( ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-halign-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/text-halign-800-800-1.0-grid-reference.json
deleted file mode 100644
index 756e3d8..0000000
--- a/tests/visual_tests/grids/text-halign-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "12",
- "10",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " !!!! ",
- " !!!!!!! !!! ",
- " !!!!!!!!! !!!!! !!! ",
- " !!!!!!!!!!!! !!!!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!!!!!!!! !!!!!!!! ! ",
- " !!!!!! ! !!!!! !!!!!! !!!!! !!!!!!!!!! !!!! ",
- " !!!!!! !!!!! !!!!!! !!!!! !!!!! !!!!!! !!!!!! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!! !!!!! ",
- " !!!!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!!! !!!!! !!!!!! !!!!! !!!!! !!!!! !!!!!! ",
- " !!!!!!! !!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!! !!!!! !!!!! !!!!! !!!!!! ",
- " !!!! !!!!! !!!!! !!!!! !!!!!! !!!!!! !!!!! ",
- " ! !!!!! !!!!!! !!!!!! !!!!! !!!!!! !!!!!! ",
- " !!!!!! !!!!! !!!!!! !!!!!! !!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!! !!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!! !!!!!!! !!!!! ",
- " !!!!!! !!!! !!! ",
- " ### !!! # !! $$$ ",
- " ##### ! #### $$$ ",
- " ######## ####### ## $$$ ",
- " ########### ########## ##### ## $$$ ",
- " ###### ###### ###### ##### ######## #### $$$ ",
- " ####### ##### ##### ##### ########## ###### $$$ ",
- " ###### ##### ###### ###### ##### ##### ##### $$$ ",
- " ###### ###### ###### ###### ###### ###### ###### $$$ ",
- " ###### ###### ##### ##### ###### ###### ###### $$$ ",
- " ###### ##### ###### ##### ##### ##### ##### $$$ ",
- " ####### ##### ##### ###### ##### ###### ###### $$$ ",
- " ###### ###### ###### ##### ###### ###### ##### $$$ ",
- " #### ##### ###### ##### ##### ##### ###### $$$ ",
- " %%% ## ##### ##### ###### ##### ###### ###### $$$ ",
- " %%% ###### ###### ###### ###### ##### ##### $$$ ",
- " %%% ###### ###### ##### ###### ###### ###### $$$ ",
- " %%% ##### ###### ##### ##### ########### $$$ ",
- " %%% ##### ###### ###### ##### ####### $$$ ",
- " %%% ###### ##### ########### ##### $$$ ",
- " %%% ########### ######## ## $$$ ",
- " %%% ######## ###### $$$ ",
- " %%% ##### #### $$$ ",
- " %%% ### # $$$ ",
- " %%% $$$ ",
- " %%% &&&&&&& $$$ ",
- " %%% &&&&&& &&&&&&&& &&&&&&&&&& $$$ ",
- " %%% &&&&&&&& &&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&&& $$$ ",
- " %%% &&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&& &&&&& $$$ ",
- " %%% &&&&&&&&&&&&&& &&&&&&& &&&&&& &&&&&&& &&&&& &&&&&& &&&&& $$$$ ",
- " %%% &&&&&&& &&&&& &&&&&&& &&&&& &&&&&& &&&&& &&&&& &&&&& $$$$ ",
- " %%% &&&&&& &&&& &&&&&& &&&& &&&&& &&&&& &&&&& &&&& $$$$ ",
- " %%% &&&&&& &&&&& &&&&& &&&&& &&&&&& &&&& &&&&&& &&&& $$$$ ",
- " %%% &&&&& &&&& &&&&& &&&& &&&&& &&&& &&&&& &&&& && $$$$ ",
- " %%% &&&&& &&&& &&&&& &&&& &&&&& &&&&& &&&&& &&&&& &&&&& $$$$ ",
- " %%% &&& &&&& &&&&&& &&&& &&&&& &&&&& &&&&&& &&&&&&&&&&&&&& $$$$ ",
- " %%% & &&&&& &&&&&&& &&&&&& &&&&&& &&&&&&&&&&&&& &&&&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&& &&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&&& &&&&&&&& &&&&&& &&&& $$$$ ",
- " %%% &&&&&&& &&&& & $$$$ ",
- " %%%% && $$$$ ",
- " %%%% $$$$ ",
- " %%% $$$$ ",
- " %%% '''''''' $$$$ ",
- " %%% '''''''' $$$$ ",
- " %%% '''''''' $$$$ ",
- " %%% ''' $$$$ ",
- " %%% ''''''''''''''''''''''''' $$$$ ",
- " %%% ''''''''''''''''''''''''' $$$$ ",
- " %%% (( ''''''''''''''''''''''''' $$$$ ",
- " %%% ((((((( (((((((( ''''''''''''''''''''''''' $$$$ ",
- " %%% (((((( (((((((( (((((((((( (((((((((((( $$$$ ",
- " %%% (((((((((( (((((((((((( ((((((((((((( (((((((((((((( $$$$ ",
- " %%% (((((((((((((( ((((((((((((((( (((((((( ((((( ((((((( (((((( $$$$ ",
- " %%% ((((((( (((((( ((((((( (((( (((((( (((( (((((( (((( $$$$ ",
- " %%% ((((((( (((( (((((( (((( (((((( (((( ((((( (((( $$$$ ",
- " %%% (((((( (((( (((((( (((( ((((( ((((( ((((( ((((( $$$$ ",
- " %%% ((((( (((( ((((( (((( (((((( (((( (((((( (((( (( $$$$ ",
- " %%% ((((( (((( ((((( (((( ((((( (((( ((((( (((( (((( $$$$ ",
- " %%% (((( (((( (((((( (((( ((((( (((( (((((( ((((( (((((( $$$$ ",
- " %%% (( ((((( (((((( ((((( (((((( (((((((((((((( ((((((((((((( $$$$ ",
- " %%% (((((( (((((( (((((((((((( (((((((((((( ((((((((( $$$$ ",
- " %%% ((((((((((( (((((((((( (((((((( (((((( $$$$ ",
- " %%%% (((((((( )) ((((((( ((( $$$$ ",
- " %%%% (((( )))) *** ( $$$$ ",
- " %%%% ))))) *** ++++++++++++ $$$$ ",
- " %%%% )))))) *** ++++++++++++++++++++++++++++++++ $$$$ ",
- " %%%% )))))) **** ,,, +++++++++++++++++++++++++++++++++++++ $$$$ ",
- " %%%% ))))) **** ,,, +++++++++++++++++++++++++++++++++ $$$$ ",
- " %%%% )))))) *** ,,, ------ +++++++++++++++ $$$$ ",
- " %%%% )))))) *** ,,,, ----------------------------- ++++++ $$$$ ",
- " %%%% ))))) *** ,,,, ----------------------------- ++++ $$$$ ",
- " %%%% )))))) *** ,,, ----------------------------- ++++ $$$$ ",
- " %%%% )))))) **** ,,, ++++ $$$$ ",
- " %%%% ))))) **** ,,, ++++ $$$$ ",
- " %%%% )))))) *** ,,, ++++ $$$$ ",
- " %%%% )))))) *** ,,, ++++ $$$$ ",
- " %%%% ))))) *** ,,,, ................................. +++ $$$$ ",
- " %%%% )))))) *** ,,,, .......................................... +++ $$$$ ",
- " %%%% )))))) **** ,,, ........................................... +++ $$$$ ",
- " %%%% ))))) **** ,,, ................. +++ $$$$ ",
- " %%%% )))))) *** ,,, ..... +++ $$$$ ",
- " %%%% )))))) *** ,,, .... +++ $$$$ ",
- " %%%% ))))) *** ,,,, ... +++ $$$$ ",
- " %%%% )))))) //////// *** ,,,, ... +++ $$$$ ",
- " %%%% )))))) /////////////// *** ,,,, .... +++ $$$$ ",
- " %%%% ))))) ////////////////////// **** ,,, .... +++ $$$$ ",
- " %%%% )))))) ////// ////////////// **** ,,, ... +++ $$$$ ",
- " %%%% )))))) ////// ///////// *** ,,, ... ++++ $$$$ ",
- " %%%% ))))) ///// //// *** ,,, ... ++++ $$$$ ",
- " %%%% )))))) ////// ///// *** ,,,, ... 00000000000000000000000000000 ++++ $$$$ ",
- " %%%% )))))) ////// //// *** ,,,, ... 00000000000000000000000000000 +++ $$$$ ",
- " %%%% ))))) ///// //// ,,, ... 00000000000000000000000000000 +++ $$$$ ",
- " %%%% ))))) ////// //// ,,, ... +++ $$$$ ",
- " %%%% ))) ////// ///// ,,, ... +++ $$$$ ",
- " %%% ) //// //// ,,, ... ++++ $$$$ ",
- " %%% /// //// ,,, ... ++++ $$$$ ",
- " %%% /// //// ,,, ... +++ $$$$ ",
- " %%% /// ///// ... ++++ $$$$ ",
- " %%% /// //// ... ++++++++++++++++ ++++ $$$$ ",
- " %%% //// /// ... ++++++++++++++++++++++++++++++++++++++++++++ $$$$ ",
- " %%% //// /// ... +++++++++++++++++++++++++++++++++++++++++++ $$$$ ",
- " %%% /// //// ... +++++++++++++++++++++++++++++++++ $$$$ ",
- " %%% /// //// ... $$$$ ",
- " %%% /// //// .... $$$$ ",
- " %%% /// /// .... $$$$ ",
- " %%% //// /// .... $$$$ ",
- " %%% //// /// ..... $$$$ ",
- " %%% /// /// .... $$$$ ",
- " %%% /// //// ..... $$$$ ",
- " %%% /// //// ...... $$$$ ",
- " %%% /// /// .......................................... $$$$ ",
- " %%% //// /// ........................................ $$$$ ",
- " %%% //// /// ...................................... $$$$ ",
- " %%% //// /// .. $$$$ ",
- " %%% //// /// $$$$ ",
- " //// //// $$$$ ",
- " //// ///// $$$$ ",
- " ///// ///// ",
- " //// ////// ",
- " //// ////// ",
- " //// ///// ",
- " ///// ////// ",
- " ///// /////// ",
- " /////////// ///// ",
- " /////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////// 11111111111111111111111111111111111111111111111111 ",
- " //// 1111111111 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-halign-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/text-halign-800-800-2.0-grid-reference.json
deleted file mode 100644
index 1eaef29..0000000
--- a/tests/visual_tests/grids/text-halign-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "10",
- "12",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!! ",
- " !!!!!! !! ",
- " !!!!!!!!! !!!!! !! ",
- " !!!!!!!!!!! !!!!!!! !!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!! !! ",
- " !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! ",
- " !!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! ",
- " ## !!!!!!!!!!!!! # !!!!!!!!!!!! !!!!!!!!!!! ",
- " ##### !!!!!!!!!!! #### !!!!!!!!!! !!!!!!! ",
- " ######## !!!!!!!!! ###### !!!!!! ## !!!!! $$$$$$ ",
- " ########## !!!!!!! ######### !!!! #### !! $$$$$$ ",
- " ############## !!!!! ############ !! ######## # $$$$$$ ",
- " ################ ############## ########## #### $$$$$$ ",
- " ################### ################## ############ ##### $$$$$$ ",
- " ##################### #################### ################ ####### $$$$$$ ",
- " ############ ########### ########### ########## ################## ########## $$$$$$ ",
- " ############ ########## ########### ########## #################### ########### $$$$$$ ",
- " ############ ########## ########### ########### ########## ########### ########### $$$$$$ ",
- " ############ ########### ########## ########## ########### ########### ########### $$$$$$ ",
- " ########### ########## ########### ########## ########## ########## ########## $$$$$$ ",
- " ######### ########## ########### ########## ########## ########### ########### $$$$$$ ",
- " ###### ########## ########### ########### ########### ########### ########### $$$$$$ ",
- " %%%%%%% ##### ########### ########### ########## ########### ########## ########### $$$$$$ ",
- " %%%%%%% ## ########## ########## ########## ########## ##################### $$$$$$ ",
- " %%%%%%% ########## ########### ########### ########## ################## $$$$$$ ",
- " %%%%%%% ########### ########### ##################### ############### $$$$$$ ",
- " %%%%%%% ##################### ################## ############# $$$$$$ ",
- " %%%%%%% ################## ################ ########## $$$$$$ ",
- " %%%%%%% ################ ############## ####### $$$$$$ ",
- " %%%%%%% ############# ########### ##### $$$$$$ ",
- " %%%%%%% ########## ######## ## $$$$$$ ",
- " %%%%%%% ####### ###### $$$$$$ ",
- " %%%%%%% ##### &&&&&&& ### &&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&& ### &&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&& &&&&&&&&&&&& &&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&& & &&&&&&&&& &&&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&& & $$$$$$ ",
- " %%%%%%% &&&&&&&&&&& &&&&&&&&& &&&&&&&&&& &&& &&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& && $$$$$$ ",
- " %%%%%%% &&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&& &&&&& $$$$$$ ",
- " %%%%%% &&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&& &&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% & &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&& &&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&& &&&&&&&& &&&& & $$$$$$ ",
- " %%%%%% &&&&& & '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ( ((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ((((((( ((((((((( ((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ((((((((( (((((((((((( ((((((((((((( ((((((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ((((((((((((( (((((((((((((( (((((((((((((((( (((((((((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% (((((((((((((((( ((((((((((((((((( (((((((((((((((((( ((((((((((((((((((( $$$$$$ ",
- " %%%%%% (((((((((((((((((( (((((((((((((((((((( (((((((((((((((((((( ((((((((((((((((((((( $$$$$$ ",
- " %%%%%% ((((((((((((((((((((( ((((((((((((((((((((( (((((((((((((((((((((( (((((((((((( ((((((((( $$$$$$ ",
- " %%%%%% (((((((((((((((((((((( (((((((((((( (((((((( ((((((((((( ((((((((( (((((((((( (((((((( $$$$$$ ",
- " %%%%%% ((((((((((( (((((((( (((((((((( (((((((( ((((((((((( ((((((( (((((((((( (((((((( (((( $$$$$$ ",
- " %%%%%% (((((((((( (((((((( (((((((((( (((((((( (((((((((( (((((((( (((((((((( (((((((( ((((( $$$$$$ ",
- " %%%%%% ((((((((( ((((((( (((((((((( ((((((((( (((((((((( ((((((((( ((((((((((( ((((((((((((((((( $$$$$$ ",
- " %%%%%% (((((( ((((((((( ((((((((((( ((((((((((((((((((((( (((((((((((((((((((( (((((((((((((((( ( $$$$$$ ",
- " %%%%%% (((( (((((((((((((((((((( (((((((((((((((((( ((((((((((((((((( ((((((((((((((((( $$$$$$ ",
- " %%%%%% (( (((((((((((((((((( (((((((((((((((( (((((((((((((((( ((((((((((((((( $$$$$$$ ",
- " %%%%%% ((((((((((((((((()) ((((((((((((((( (((((((((((((( ((((((((((( $$$$$$ $ ",
- " %%%%%% ((((((((((((( )))) (((((((((((( (((((((((( ** ((((((((( $$$$$$ $ ",
- " %%%%%% ((((((((((( )))))) +++++ ((((((((( ((((((( ( ********************** ((( $$$$$$ ",
- " %%%%%% (((((((( )))))))) +++++++ (((( ( (( ************************************* $$$$$$ ",
- " %%%%%% ( )))))))))) ++++++ , *************************************** $$$$$$ ",
- " %%%%%% )))))))))) ++++++ ,,,,,,, **************************************** $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, ------------------------ ****************************************** $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,, ----------------------------- ******************************************* $$$$$$ ",
- " %%%%%% )))))))))) +++++++ ,,,,,, ----------------------------- *************************** $$$$$$ ",
- " %%%%%% ))))))))))) +++++++ ,,,,,, ----------------------------- *********** $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,, ----------------------------- ********* $$$$$$ ",
- " %%%%%% )))))))))) ++++++ ,,,,,,, ----------------------------- ******* $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, -------------- ******** $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, . ............... ******* $$$$$$ ",
- " %%%%%% )))))))))) +++++++ ,,,,,, ...................................... ******* $$$$$$ ",
- " %%%%%% ))))))))))) +++++++ ,,,,,, ........................................... ****** $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,, ............................................ ******* $$$$$$ ",
- " %%%%%% )))))))))) ++++++ ,,,,,, ............................................. ******* $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, ............................................. ******* $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, ............................................ ******* $$$$$$ ",
- " %%%%%% )))))))))) //// +++++++ ,,,,,, ............ ******** $$$$$$ ",
- " %%%%%% ))))))))))) //////////// +++++++ ,,,,,, ....... ******* $$$$$$ ",
- " %%%%%% )))))))))) //////////////////// +++++++ ,,,,,, ....... ******** $$$$$$ ",
- " %%%%%% )))))))))) ///////////////////////// ++++++ ,,,,,, ...... ******* $$$$$$ ",
- " %%%%%% ))))))))))) /////////////////////////// ++++++ ,,,,,, ...... ****** $$$$$$ ",
- " %%%%%% )))))))))) //////////////////////////// ++++++ ,,,,,,, ...... ****** $$$$$$ ",
- " %%%%%% )))))))))) ///////////////////////////////++++++ ,,,,,,, ...... 00000000000000000000000000000 ****** $$$$$$ ",
- " %%%%%% ))))))))))) /////////// //////////////+++++++,,,,,, ....... 00000000000000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))))))))) ////////// ////////+++++++,,,,,, ....... 00000000000000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))))))))) /////////// ///////++++ ,,,,,, ....... 00000000000000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))))))))) /////////// //////// ,,,,,, ...... 00000000000000000000000000000 ******* $$$$$$ ",
- " %%%%%% ))))))) ////////// //////// ,,,,,,, ...... 00000000000000000000000000000 ******* $$$$$$ ",
- " %%%%%% ))))) ///////// /////// ,,,,,,, ...... 000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))) //////// //////// ,,,,,,, ...... ****** $$$$$$ ",
- " %%%%%% ) /////// ////////,,,,,, ...... ****** $$$$$$ ",
- " %%%%%% /////// //////// ,,,, ...... *** ******** $$$$$$ ",
- " %%%%%% /////// //////// ...... ***************************** *************** $$$$$$ ",
- " %%%%%% ////// //////// ...... ********************************************** $$$$$$ ",
- " %%%%%% ////// ///// / ....... ********************************************** $$$$$$ ",
- " %%%%%% ////// ////// ....... ********************************************* $$$$$$ ",
- " %%%%%% ////// ////// ...... ******************************************** $$$$$$ ",
- " %%%%%% /////// ////// . ...... ******************************************* $$$$$$ ",
- " %%%%%% /////// ////// . ...... **************** $$$$$$ ",
- " %%%%%% ////// ////// ........ $$$$$$ ",
- " %%%%%% ////// /////// ........ $$$$$$ ",
- " %%%%%% ////// /////// ....... $$$$$$ ",
- " %%%%%% ////// ////// ......... $$$$$$ ",
- " %%%%%% /////// ////// .......... .................................. $$$$$$ ",
- " %%%%%% /////// ////// ............................................ $$$$$$ ",
- " %%%%%% /////// ////// ............................................ $$$$$$ ",
- " %%%%%% //////// /////// ........................................... $$$$$$ ",
- " %%%%%% //////// /////// ......................................... $$$$$$ ",
- " %%%%%% //////// ////// ....................................... $$$$$$ ",
- " %%%%%% //////// ////// .................................... $$$$$$ ",
- " //////// /////// $$$$$$ ",
- " //////// ///////// $$$$$$ ",
- " /////// ////////// ",
- " //////// ////////// ",
- " //////// /////////// ",
- " //////// /////////// ",
- " /////////// ////////// ",
- " ///////////////// /////////// 11111111111111111111111111 ",
- " ////////////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " /////////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " ////////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " / ///////////////// 11111111111111111111111111111111111111111111111111 ",
- " // ///////// 11111111111111111111111111111111111111 ",
- " / ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-halign-adjust-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/text-halign-adjust-800-800-1.0-grid-reference.json
deleted file mode 100644
index ab36473..0000000
--- a/tests/visual_tests/grids/text-halign-adjust-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "12",
- "10",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " !!!! ",
- " !!!!!!! !!! ",
- " !!!!!!!!! !!!!! !!! ",
- " !!!!!! !!!!! !!!!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!!!!!!!! !!!!!!!! ! ",
- " !!!!!! !!!!! !!!!!! !!!!! !!!!!!!!!! !!!! ",
- " !!!!!! !!!!! !!!!!! !!!!! !!!!! !!!!!! !!!!!! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!! !!!!! ",
- " !!!!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!!! !!!!! !!!!!! !!!!! !!!!! !!!!! !!!!!! ",
- " !!!!!!! !!!!! !!!!!! !!!!! !!!!!! !!!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!! !!!!! !!!!! !!!!! !!!!!! ",
- " !!!! !!!!! !!!!! !!!!! !!!!!! !!!!!! !!!!! ",
- " ! !!!!! !!!!!! !!!!!! !!!!! !!!!!! !!!!!! ",
- " !!!!!! !!!!! !!!!!! !!!!!! !!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!! !!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!! !!!!!!! !!!!! ",
- " !!!!!! !!!!! !!! ",
- " ### !!! # !! $$$ ",
- " ##### ! #### $$$ ",
- " ######## ####### ## $$$ ",
- " ########### ########## ##### # $$$ ",
- " ###### ###### ###### ##### ######## ### $$$ ",
- " ####### ##### ##### ##### ########## ##### $$$ ",
- " ###### ##### ###### ###### ##### ##### ###### $$$ ",
- " ###### ###### ###### ###### ###### ###### ###### $$$ ",
- " ###### ###### ###### ##### ###### ###### ###### $$$ ",
- " ###### ##### ###### ##### ##### ##### ##### $$$ ",
- " ####### ##### ##### ###### ##### ###### ###### $$$ ",
- " ###### ###### ###### ##### ###### ###### ##### $$$ ",
- " #### ##### ###### ##### ##### ##### ###### $$$ ",
- " %%% ## ##### ##### ###### ##### ###### ###### $$$ ",
- " %%% ###### ###### ###### ###### ##### ##### $$$ ",
- " %%%% ###### ###### ##### ###### ###### ###### $$$ ",
- " %%% ##### ###### ##### ##### ########### $$$ ",
- " %%% ##### ###### ###### ##### ####### $$$ ",
- " %%% ###### ##### ########### ##### $$$ ",
- " %%% ########### ######## ## $$$ ",
- " %%% ######## ###### $$$ ",
- " %%% ##### #### $$$ ",
- " %%% ### # $$$ ",
- " %%% $$$ ",
- " %%% &&&&&&& $$$ ",
- " %%% &&&&&& &&&&&&&& &&&&&&&&&& $$$ ",
- " %%% &&&&&&&& &&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&&& $$$ ",
- " %%% &&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&& &&&&& $$$ ",
- " %%% &&&&&&&&&&&&&& &&&&&&& &&&&&& &&&&&&& &&&&&& &&&&&& &&&&& $$$$ ",
- " %%% &&&&&&& &&&&& &&&&&&& &&&&& &&&&&& &&&&& &&&&&& &&&&& $$$$ ",
- " %%% &&&&&& &&&& &&&&&& &&&& &&&&& &&&&& &&&&& &&&& $$$$ ",
- " %%% &&&&&& &&&&& &&&&& &&&&& &&&&&& &&&& &&&&&& &&&& $$$$ ",
- " %%% &&&&& &&&& &&&&& &&&& &&&&& &&&& &&&&& &&&& && $$$$ ",
- " %%% &&&&& &&&& &&&&& &&&& &&&&& &&&&& &&&&& &&&&& &&&&& $$$$ ",
- " %%% &&& &&&& &&&&&& & &&&& &&&&& &&&&& &&&&&& &&&&&&&&&&&&&& $$$$ ",
- " %%% & &&&&& &&&&&&& &&&&&& &&&&&& &&&&&&&&&&&&& &&&&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&& &&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&&& &&&&&&&& &&&&&& &&&& $$$$ ",
- " %%% &&&&&&& &&&& & $$$$ ",
- " %%% && $$$$ ",
- " %%% $$$$ ",
- " %%% ' $$$$ ",
- " %%% '''''''' $$$$ ",
- " %%% '''''''' $$$$ ",
- " %%% '''''''' $$$$ ",
- " %%% ''' $$$$ ",
- " %%% ''''''''''''''''''''''''' $$$$ ",
- " %%% ''''''''''''''''''''''''' $$$$ ",
- " %%% (( ''''''''''''''''''''''''' $$$$ ",
- " %%% ((((((( (((((((( ''''''''''''''''''''''''' $$$$ ",
- " %%% (((((( (((((((( (((((((((( (((((((((((( ' $$$$ ",
- " %%% (((((((((( (((((((((((( ((((((((((((( (((((((((((((( $$$$ ",
- " %%% (((((((((((((( ((((((((((((((( (((((((( (((((( ((((((( (((( $$$$ ",
- " %%% ((((((( (((((( ((((((( (((( (((((( (((( (((((( (((( $$$$ ",
- " %%%% ((((((( (((( (((((( (((( (((((( (((( ((((( (((( $$$$ ",
- " %%% (((((( (((( (((((( (((( ((((( ((((( ((((( ((((( $$$$ ",
- " %%% ((((( (((( ((((( (((( (((((( (((( (((((( (((( (( $$$$ ",
- " %%% ((((( (((( ((((( (((( ((((( (((( ((((( (((( (((( $$$$ ",
- " %%% (((( (((( (((((( ((((( ((((( (((( (((((( ((((( (((((( $$$$ ",
- " %%% (( ((((( (((((( ((((( (((((( (((((((((((((( ((((((((((((( $$$$ ",
- " %%% (((((( (((((( (((((((((((( (((((((((((( ((((((((( $$$$ ",
- " %%% ((((((((((( (((((((((( (((((((( (((((( $$$$ ",
- " %%% (((((((( )) ((((((( ((( $$$$ ",
- " %%%% ((((( )))) *** ( $$$$ ",
- " %%%% ))))) *** ++++++++++++ $$$$ ",
- " %%%% )))))) *** ++++++++++++++++++++++++++++++++ $$$$ ",
- " %%%% )))))) **** ,,,, +++++++++++++++++++++++++++++++++++++ $$$$ ",
- " %%%% ))))) **** ,,, +++++++++++++++++++++++++++++++++ $$$$ ",
- " %%%% )))))) *** ,,, ------ +++++++++++++++ $$$$ ",
- " %%%% )))))) *** ,,,, ----------------------------- ++++++ $$$$$ ",
- " %%%% )))))) **** ,,,, ----------------------------- ++++ $$$$ ",
- " %%%% )))))) *** ,,,, ----------------------------- ++++ $$$$ ",
- " %%%% )))))) **** ,,,, - -- - ++++ $$$$ ",
- " %%%% ))))) **** ,,, ++++ $$$$ ",
- " %%%% )))))) *** ,,, ++++ $$$$ ",
- " %%%% )))))) **** ,,, +++ $$$$ ",
- " %%%% )))))) *** ,,,, ................................. +++ $$$$ ",
- " %%%% )))))) *** ,,,, .......................................... +++ $$$$ ",
- " %%%% )))))) **** ,,,, ........................................... +++ $$$$ ",
- " %%%% ))))) **** ,,, ................. .. +++ $$$$ ",
- " %%%% )))))) **** ,,, ..... +++ $$$$ ",
- " %%%% )))))) *** ,,, .... +++ $$$$ ",
- " %%%% )))))) *** ,,,, .... +++ $$$$ ",
- " %%%% )))))) //////// *** ,,,,, .... +++ $$$$ ",
- " %%%% )))))) /////////////// *** ,,,, .... +++ $$$$ ",
- " %%%% ))))) ////////////////////// **** ,,, .... +++ $$$$ ",
- " %%%% )))))) ////// ////////////// **** ,,, ... +++ $$$$ ",
- " %%%% )))))) ////// ///////// *** ,,, ... ++++ $$$$ ",
- " %%%% )))))) ///// //// *** ,,, ... ++++ $$$$ ",
- " %%%% )))))) ////// ///// *** ,,,, ... 00000000000000000000000000000 ++++ $$$$ ",
- " %%%% )))))) ////// //// *** ,,,, ... 00000000000000000000000000000 +++ $$$$ ",
- " %%%% ))))) ///// //// ,,, ... 00000000000000000000000000000 +++ $$$$ ",
- " %%%% ))))) ////// //// ,,, ... 0 0 0 0 +++ $$$$ ",
- " %%%% ))) ////// ///// ,,, ... +++ $$$$ ",
- " %%%% ) //// //// ,,, ... ++++ $$$$ ",
- " %%% /// //// ,,, ... ++++ $$$$ ",
- " %%% /// //// ,,, ... +++ + $$$$ ",
- " %%% / /// ///// ... ++++ $$$$ ",
- " %%% /// ///// ... ++++++++++++++++ ++++ $$$$ ",
- " %%% //// /// ... ++++++++++++++++++++++++++++++++++++++++++++ $$$$ ",
- " %%% //// /// ... +++++++++++++++++++++++++++++++++++++++++++ $$$$ ",
- " %%% /// //// ... + + +++++++++++++++++++++++++++++++++ $$$$ ",
- " %%% /// //// ... + $$$$ ",
- " %%% /// //// ..... $$$$ ",
- " %%% /// /// .... $$$$ ",
- " %%% //// /// .... $$$$ ",
- " %%% //// /// ..... $$$$ ",
- " %%% /// /// .... $$$$ ",
- " %%% /// //// ..... $$$$ ",
- " %%% /// //// ...... .. . $$$$ ",
- " %%% /// /// .......................................... $$$$ ",
- " %%% //// /// ........................................ $$$$ ",
- " %%% //// /// ...................................... $$$$ ",
- " %%%% //// /// $$$$ ",
- " %%%% //// /// $$$$ ",
- " //// //// $$$$ ",
- " //// ///// $$$$ ",
- " ///// ///// ",
- " //// ////// ",
- " //// ////// ",
- " //// ///// ",
- " ///// ////// ",
- " ///// ////// ",
- " /////////// ////// ",
- " /////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////// 11111111111111111111111111111111111111111111111111 ",
- " //// 1111111111 11 1 ",
- " 1 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-halign-adjust-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/text-halign-adjust-800-800-2.0-grid-reference.json
deleted file mode 100644
index 13fdc27..0000000
--- a/tests/visual_tests/grids/text-halign-adjust-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "10",
- "12",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!! ",
- " !!!!!! !! ",
- " !!!!!!!!! !!!!! !! ",
- " !!!!!!!!!!! !!!!!!! !!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!! !! ",
- " !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! ! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!! ! !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! ",
- " !!! !!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! ",
- " ## !!!!!!!!!!!!! # !!!!!!!!!!!! !!!!!!!!!!! ",
- " ##### !!!!!!!!!!! #### !!!!!!!!!! !!!!!!! ",
- " ######## !!!!!!!!! ###### !!!!!!! ## !!!!! $$$$$$$ ",
- " ########## !!!!! ######### !!!! #### !! $$$$$$$ ",
- " ############## !!! ############ !! ######## # $$$$$$$ ",
- " ################ ############## ########## #### $$$$$$ ",
- " ################### ################## ############ ##### $$$$$$ ",
- " ##################### #################### ################ ####### $$$$$$ ",
- " ############ ########### ########### ########## ################## ########## $$$$$$ ",
- " ############ ########## ########### ########## #################### ############ $$$$$$ ",
- " ############ ########## ########### ########### ########## ########### ############# $$$$$$ ",
- " ############ ########### ########## # ########## ########### ########### ########### $$$$$$ ",
- " ########### ########## ########### # ########## ########## ########## ########## $$$$$$ ",
- " ######### ########## ########### # ########## ########## ############ ########### $$$$$$ ",
- " ####### ########## ########### ########### ########### ############ ########### $$$$$$ ",
- " %%%%%%%% ##### ########### ########### ########## ########### ########## ########### $$$$$$ ",
- " %%%%%%% ## ########## ########## ########## ########## ##################### $$$$$$ ",
- " %%%%%%% # ########## ########### ########### ########## ################## $$$$$$ ",
- " %%%%%%% ############ ########### ##################### ############### $$$$$$ ",
- " %%%%%%%% ###################### ################## ############# $$$$$$ ",
- " %%%%%%% # ################## ################ ########## $$$$$$ ",
- " %%%%%%% ################ ############## ####### $$$$$$ ",
- " %%%%%%% ############# ########### ##### $$$$$$ ",
- " %%%%%%% ########## ######## ## $$$$$$ ",
- " %%%%%%% ####### ###### $$$$$$$ ",
- " %%%%%%% ##### &&&&&&& ### &&&&&&&&& $$$$$$$ ",
- " %%%%%%% &&&&&&& ### &&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&& $$$$$$$ ",
- " %%%%%%% &&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&& &&&&&&&&&&&& &&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&& &&&&&&&&&& &&&&&&&&&&& &&&&&&&&& &&&&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&& &&&&&&&& & $$$$$$ ",
- " %%%%%%% &&&&&&&&&&& &&&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&&&& &&&&&&&& && $$$$$$ ",
- " %%%%%%% &&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&& &&&&& $$$$$$ ",
- " %%%%%% &&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&& &&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% && &&&&&&&&&&&&&&&&&& && &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&& & $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&& &&&&&&& $$$$$$ ",
- " %%%%%% &&&&&&&&&& &&&&&&&& &&&& & '' $$$$$$ ",
- " %%%%%% &&&&&&& & '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%% '''''''''' $$$$$$$ ",
- " %%%%%% ''''''''''''''''''''''''''' $$$$$$$ ",
- " %%%%%% ''''''''''''''''''''''''''' $$$$$$$ ",
- " %%%%%% ( ((((((( ''''''''''''''''''''''''''' $$$$$$$ ",
- " %%%%%% ((((((( ((((((((( ((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ((((((((( (((((((((((( ((((((((((((( ((((((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ((((((((((((( (((((((((((((( (((((((((((((((( (((((((((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% (((((((((((((((( ((((((((((((((((( (((((((((((((((((( ((((((((((((((((((( ' ' ''' ' ''' $$$$$$ ",
- " %%%%%% (((((((((((((((((( (((((((((((((((((((( (((((((((((((((((((( ((((((((((((((((((((( ' $$$$$$ ",
- " %%%%%% ((((((((((((((((((((( ((((((((((((((((((((( (((((((((((((((((((((( (((((((((((( ((((((((( '' $$$$$$ ",
- " % %%%%%% (((((((((((((((((((((( (((((((((((( (((((((( ((((((((((( ((((((((((( ((((((((((( (((((((( $$$$$$ ",
- " %%%%%% ((((((((((( (((((((( (((((((((( (((((((( ((((((((((( ( ((((((( (((((((((( ( (((((((( (( $$$$$$ ",
- " %%%%%% (((((((((( (((((((( (((((((((( (((((((( (((((((((( (((((((( (((((((((( (((((((( ((((( $$$$$$ ",
- " %%%%%% ((((((((( ((((((( (((((((((( (((((((( (((((((((( ((((((((( ((((((((((( ((((((((((((((((( $$$$$$ ",
- " %%%%%% (((((((( ((((((((( ((((((((((( ((((((((((((((((((((( (((((((((((((((((((( (((((((((((((((( $$$$$$ ",
- " %%%%%% (((( (((((((((((((((((((( (((((((((((((((((( ((((((((((((((((( ((((((((((((((((( $$$$$$ ",
- " %%%%%% (( (((((((((((((((((( (( (((((((((((((((( (((((((((((((((( (((((((((((((((( $$$$$$ ",
- " %%%%%% ( ((((((((((((((((()) ((((((((((((((( (((((((((((((( ((((((((((( $$$$$$ ",
- " %%%%%% ((((((((((((( )))) (((((((((((( (((((((((( ** ((((((((( $$$$$$ ",
- " %%%%%% ((((((((((( )))))) +++++ ((((((((( ((((((( *************************((( $$$$$$ ",
- " %%%%%% ((((((((()))))))) +++++++ (((( ( ************************************* $$$$$$ ",
- " %%%%%% ( )))))))))) ++++++ , *************************************** $$$$$$ ",
- " %%%%%% )))))))))))) ++++++ ,,,,,,, **************************************** $$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, ------------------------ ****************************************** $$$$$$ ",
- " %%%%%% ))))))))))) +++++++ ,,,,,, ----------------------------- ******************************************* $$$$$$$$$ ",
- " %%%%%% )))))))))) +++++++ ,,,,,, ----------------------------- *************************** $$$$$$ $ ",
- " %%%%%% ))))))))))) +++++++ ,,,,,, ----------------------------- ********** $$$$$$ ",
- " %%%%%% ))))))))))) +++++++ ,,,,,, ----------------------------- ********* $$$$$$ ",
- " %%%%%%% )))))))))))) +++++++ ,,,,,,, ----------------------------- ******** $$$$$$ ",
- " %%%%%%% ))))))))))) +++++++ ,,,,,,, - - --- - -------------- ******** $$$$$$ ",
- " %%%%%%% ))))))))))) ++++++ ,,,,,,, - - --- -- ............... ******* $$$$$$ ",
- " %%%%%%% )))))))))) + +++++++ ,,,,,, ...--................................. ****** $$$$$$ ",
- " %%%%%% ))))))))))) +++++++++ ,,,,,, ........................................... ****** $$$$$$ ",
- " %%%%%% )))))))))))) ++++++ ,,,,,, ............................................ ****** $$$$$$ ",
- " %%%%%% )))))))))))) ++++++ ,,,,,, ............................................. ******* $$$$$$ ",
- " %%%%%% ))))))))))) +++++++ ,,,,,,, ............................................. ******* $$$$$$ ",
- " %%%%%% ))))))))))) +++++++ ,,,,,,, .............................................. ******* $$$$$$ ",
- " %%%%%% )))))))))) /////// ++++++++ ,,,,,, ............ ... ******* $$$$$$ ",
- " %%%%%% ))))))))))) //////////// +++++++ ,,,,,, ........ ******* $$$$$$ ",
- " %%%%%% )))))))))) ) //////////////////// +++++++ ,,,,,, ........ ******* $$$$$$ ",
- " %%%%%% )))))))))) //////////////////////// +++++++ ,,,,,, ........ ****** $$$$$$ ",
- " %%%%%% ))))))))))) ) ///////////////////////////+++++++ ,,,,,, ....... ****** $$$$$$ ",
- " %%%%%% )))))))))) ////////////////////////////+++++++ ,,,,,,, ...... ****** $$$$$$ ",
- " %%%%%% ))))))))))) ///////////////////////////////++++++ ,,,,,,, ...... 00000000000000000000000000000 ****** $$$$$$ ",
- " %%%%%% )))))))))))) /////////// //////////////+++++++,,,,,, ....... 00000000000000000000000000000 ****** $$$$$$$ ",
- " %%%%%% )))))))))) ) ////////// ////////+++++++,,,,,, ....... 00000000000000000000000000000 ****** $$$$$$$ ",
- " %%%%%% )))))))))) /////////// //////+++++ ,,,,,, ....... 00000000000000000000000000000 ****** $$$$$$$ ",
- " %%%%%% )))))))))) /////////// //////// ,,,,,, ...... 00000000000000000000000000000 ******* $$$$$$$ ",
- " %%%%%%% ))))))) ////////// //////// ,,,,,,, ...... 00000000000000000000000000000 ******* $$$$$$ ",
- " %%%%%%% ))))))) ///////// /////// ,,,,,,, ...... 00000000000000000000 0 0 00 ****** $$$$$$ ",
- " %%%%%%% )))) //////// //////// ,,,,,,, ...... 0 0 0 ****** $$$$$$ ",
- " %%%%%% )) /////// ////////,,,,,, ...... 00 ******** $$$$$$ ",
- " %%%%%% ) /////// //////// ,,,, ...... *** ******* $$$$$$ ",
- " %%%%%% /////// ///////// ...... ***************************** *************** $$$$$$ ",
- " %%%%%% //////// //////// ...... ********************************************** $$$$$$ ",
- " %%%%%% ////// ///// ....... ********************************************** $$$$$$ ",
- " %%%%%% ////// /////// ....... ********************************************* $$$$$$ ",
- " %%%%%% ////// /////// ...... ******************************************** $$$$$$ ",
- " %%%%%% /////// /////// ...... . ******************************************* $$$$$$ ",
- " %%%%%% /////// ////// ....... . * * *************** $$$$$$ ",
- " %%%%%% ////// ////// ....... * * $$$$$$ ",
- " %%%%%% ////// /////// ........ $$$$$$ ",
- " %%%%%% ////// /////// ....... $$$$$$ ",
- " %%%%%% ////// ////// ......... . . . $$$$$$ ",
- " %%%%%% /////// ////// .......... .................................. $$$$$$ ",
- " %%%%%% /////// ////// ............................................ $$$$$$ ",
- " %%%%%% /////// ////// ............................................ $$$$$$ ",
- " %%%%%% //////// /////// ........................................... $$$$$$$ ",
- " %%%%%% //////// /////// ......................................... $$$$$$ ",
- " %%%%%%% //////// ////// ....................................... $$$$$$ ",
- " %%%%%%% //////// ////// .................................... $$$$$$ ",
- " //////// /////// $$$$$$$ ",
- " //////// ///////// $$$$$$ ",
- " /////// ////////// ",
- " //////// ////////// ",
- " //////// /////////// ",
- " //////// /////////// ",
- " /////////// ////////// ",
- " ///////////////// /////////// 11111111111111111111111111 ",
- " /////////////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " ///////////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////////// 11111111111111111111111111111111111111111111111111 ",
- " ///////// 111111111111111111111111111111111111111 1 11 ",
- " / 1 1 1111 1 11 ",
- " 11 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-halign-adjust-multiline-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/text-halign-adjust-multiline-800-800-1.0-grid-reference.json
deleted file mode 100644
index d696844..0000000
--- a/tests/visual_tests/grids/text-halign-adjust-multiline-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "10",
- "12",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " !!!! ",
- " !!!!!!! !!! ",
- " !!!!!!!!! !!!!!! !!! ",
- " !!!!!! !!!!! !!!!!!! ! !!!!! ",
- " !!!!!! !!!!!! !!!!!!!!!!! !!!!!!!! ! ",
- " !!!!!! !!!!! !!!!!! !!!!! !!!!!!!!!! !!!! ",
- " !!!!!! !!!!!! !!!!!! !!!!! !!!!! !!!!!! !!!!!!! ",
- " !!!!!! ! !!!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!! ! ",
- " !!!!!!! ! !!!!!! ! !!!!! !!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!!! !!!!! ! !!!!!! !!!!! !!!!! !!!!! !!!!!! ",
- " !!!!!!! !!!!! ! !!!!!! !!!!! !!!!!! !!!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!!!! !! !!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!!! !!!!! !!!!! !!!!! ! !!!!!! ",
- " !!!!! !!!!! !!!!! ! !!!!! !!!!!! !!!!!! !!!!! ",
- " ! ! ! !!!!! !!!!!! !!!!!! !!!!! !!!!!! !!!!!! ",
- " ! !!!!!! !!!!! !!!!!! !!!!!! !!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!! !!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! ! !!!!!!!! ",
- " !!!!!!!!! !!!!!!! !!!!! ",
- " !!!!!! !!!! !!! ",
- " ### !!!! # !! ! ! $$$$ ",
- " ##### ! ! #### $$$$$ ",
- " ######## ####### ## $$$$ ",
- " ########### ########## ##### # $$$ ",
- " ###### ###### ###### ##### ######## ### $$$ ",
- " ####### ##### ##### ##### ########## ##### $$$ ",
- " ###### ##### ###### ###### ##### ##### ##### $$$ ",
- " ###### ###### ###### ###### ###### ###### ###### $$$ ",
- " ###### ###### ##### ##### ###### ###### ###### $$$ ",
- " ###### ##### ###### ##### ##### ##### ##### $$$ ",
- " ####### ##### ##### ###### ##### ###### ###### $$$ ",
- " ###### ###### ###### ##### ###### ###### ##### $$$ ",
- " #### ##### ###### ##### ##### ##### ###### $$$ ",
- " %%%%% ## ##### ##### ###### ##### ###### ###### $$$ ",
- " %%%%% ###### ###### ###### ###### ##### ##### $$$ ",
- " %%% ###### ###### ##### ###### ###### ###### $$$$$ ",
- " %%% ##### ###### ##### ##### ########### $$$ ",
- " %%% ##### ###### ###### ##### ####### $$$ ",
- " %%% ###### ##### ########### ##### $$$ ",
- " %%% ########### ######## ## $$$ ",
- " %%% ######## ###### $$$ ",
- " %%% ##### #### $ $$$ ",
- " %%% ### # $$$$$ ",
- " %%% $$$ ",
- " %%% & && &&&&&&& $$$ ",
- " %%% & &&&&&& && &&&&&&&& &&&&&&&&&&& $$$ ",
- " %%% &&&&&&&& &&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&&&&& $$$ ",
- " %%%%% &&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&& &&&&& $$$ ",
- " % %%% &&&&&&&&&&&&&& &&&&&&& &&&&&& &&&&&&& &&&&& &&&&&& &&&&& $$$$ ",
- " %%% &&&&&&& &&&&& &&&&&&& &&&&& &&&&&& &&&&& &&&&& &&&&& $$$$ ",
- " %%% &&&&&& &&&& &&&&&& &&&& &&&&& &&&&& &&&&& & &&&& $$$$$$ ",
- " %%%% &&&&&& &&&&& &&&&& &&&&& &&&&&& &&&& &&&&&& & &&&& $$$$ ",
- " %%% % &&&&& &&&& &&&&& &&&& & &&&&& & &&&&& &&&&& &&&& && $$$$ ",
- " %%% &&&&& &&&& & &&&&& &&&&& &&&&& &&&&& &&&&& &&&&& &&&&& $$$$ ",
- " %%% &&& & &&&&& &&&&&& & & &&&& &&&&& &&&&& &&&&&& &&&&&&&&&&&&&&& $$$$ ",
- " %%% & & &&&&&& &&&&&&& & &&&&&& &&&&&& & &&&&&&&&&&&&&& &&&&&&&&&&& && $$$$$ ",
- " %%% & &&&&&&&&&&&&&&& &&&&&&&&&&&& &&&&&&&&&& & &&&&&&&&& $$$$$ ",
- " %%% &&&&&&&&&&& &&&&&&&& &&&&&& &&&& $$$$ ",
- " %%% &&&&&&& &&&& & $$$$ ",
- " %%% && $$$$ ",
- " %%% $$$$ ",
- " %%% $$$$ ",
- " %%% '''''''' $$$$ ",
- " %%% '''''''' $$$$ ",
- " %%%% '''''''' $$$$ ",
- " %%% ''' $$$$ ",
- " %%%%% ''''''''''''''''''''''''' $$$$ ",
- " %%% ''''''''''''''''''''''''' $$$$ ",
- " %%% (( ''''''''''''''''''''''''' $$$$ ",
- " %%% ( ( ((((((( ( (((((((( ''''''''''''''''''''''''' $$$$ ",
- " %%% (((((( ( (((((((( ((((((((((( (((((((((((( $$$$ ",
- " %%% (((((((((( (((((((((((( ((((((((((((( (((((((((((((( $$$$$ ",
- " %%%%% (((((((((((((( ((((((((((((((( (((((((( ((((( ((((((( (((( $$$$ ",
- " % %%% ((((((( (((((( ((((((( (((( (((((( (((( (((((( (((( $$$$ ",
- " %%% ((((((( (((( (((((( (((( (((((( (((( ((((( (((((( $$$$ ",
- " %%% (((((( (((( (((((( (((( ((((( ((((( ((((( (((((( $$$$ ",
- " %%% ((((( (((( ((((( (((( (((((( ((((( ( (((((( (((( (( $$$$ ",
- " %%% ((((( (((( ( ((((( (((( ( ((((( (((( ( ((((( (((( (((( $$$$$$ ",
- " %%% (((( (((((( ((((((( ((((( (((((( (((( (((((( ((((( ((((((( $$$$ ",
- " %%% (( ( (((((( (((((( ( ( ((((( (((((( ( ((((((((((((((( (((((((((((((( $$$$ ",
- " %%% ( ((((((( (((((( (((((((((((( (((((((((((( ((((((((( ( $$$$ ",
- " %%% ( ((((((((((( (((((((((( (((((((( (((((( $$$$ ",
- " %%% (((((((( )) ((((((( ((( * $$$$ ",
- " %%%% (((( )))) +++ ( *** ** $$$$ ",
- " %%%%%% ))))) +++ ************ ** $$$$ ",
- " %%%% )))))) ) +++ ******************************** $$$$ ",
- " %%%% )) )))))) )) ++++ ,,,,, ************************************* $$$$ ",
- " %%%% )))))) ++++ ,,,,, - - - ********************************* $$$$ ",
- " %%%% )))))) +++ ,,,, ------- - - - - * *************** $$$$ ",
- " %%%%% )))))) +++ ,,,, ----------------------------- * ** ****** $$$$ ",
- " %%%% ) ))))) +++ ,,,,, ----------------------------- **** $$$$ $ ",
- " %%%% )))))) +++ ,,,,, ----------------------------- ***** $$$$$ ",
- " %%%% )))))) ++++ ,,,,, - - - - - - -- -- **** $$$$ ",
- " %%%% ))))) ) ++++ ,,, - - -- - - - - **** $$$$ ",
- " %%%% )))))) +++ ,,, .. . . **** $$$$ ",
- " %%%% )))))) +++ ,,,, . . . *** $$$$ ",
- " %%%%%% ))))) ) +++ ,,,, ................................. *** $$$$ ",
- " %%%% )))))) +++ ,,,, .......................................... *** $$$$ ",
- " %%%% )))))) ++++ ,,, ........................................... **** $$$$$$ ",
- " %%%% ))))) ) ++++ ,,,, ................. . *** $$$$$ ",
- " %%%% )))))) ) +++ ,,,,, ..... . . *** $$$$ ",
- " %%%% )))))))) +++ ,,, .... *** $$$$ ",
- " %%%%% ))))))) // +++ ,,,, ... *** $$$$ ",
- " %%%%% )))))) ) //////// / +++ ,,,, , ... *** $$$$ ",
- " %%%% )))))) /////////////// +++ ,,,, .... ***** $$$$ ",
- " %%%% ))))))) / ////////////////////// ++++ ,,,, . .... *** $$$$ ",
- " %%%% )))))) ) ////// ////////////// ++++ ,,,,,, ... *** $$$$ ",
- " %%%% )))))) ////// ///////// +++ ,,, ... 0 0 0 0 **** $$$$ ",
- " %%%% ))))) ///// // //// +++ ,,, ... 00 0 0 0 0 0 0 **** $$$$ ",
- " %%%% )))))) ) ////// ///// +++ ,,,,,,, ... 00000000000000000000000000000 **** $$$$ ",
- " %%%% )))))) )) ////// //// /+++ ,,,,, , ... 00000000000000000000000000000 *** $$$$ ",
- " %%%% ))))) ///// //// ,,, ... 00000000000000000000000000000 ***** $$$$ ",
- " %%%% ))))) ////// //// ,,, ... 00 0 0 0 0 0 00 00 *** $$$$ ",
- " %%%% ))) ////// ///// ,,,,, ... 00 0 0 0 0 0 0 0 00 00 *** $$$$$ ",
- " %%% )) //// //// ,,, ... **** $$$$$ ",
- " %%%% /// //// ,,, ... **** $$$$ ",
- " %%% /// //// ,,,,, ... *** $$$$ ",
- " %%% /// ///// ... * * **** * $$$$ ",
- " %%% /// //// ..... **************** * ** **** $$$$$$ ",
- " %%%%% //// /// ... ******************************************** $$$$$$ ",
- " %%% //// /// ... ******************************************* $$$$ ",
- " %%% /// //// ... * * ********************************* $$$$ ",
- " %%% ///// //// ... * * * $$$$ ",
- " %%% /// //// .... ** $$$$ ",
- " %%% /// /// .... $$$$ ",
- " %%% //// /// .... $$$$ ",
- " %%% //// ///// ..... $$$$ ",
- " %%% /// /// .... $$$$ ",
- " %%% /// //// ..... $$$$ ",
- " %%% /// //// ...... . $$$$ ",
- " %%% /// /// ........................................... $$$$ ",
- " %%% //// /// ........................................ $$$$ ",
- " %%%%% ///// /// ...................................... $$$$ ",
- " %%% / //// /// . . .. $$$$ ",
- " %%% //// /// . . .. $$$$$$ ",
- " //// //// $$$$ ",
- " //// / ///// $$$$ ",
- " ////// ///// ",
- " //// ////// ",
- " //// ////// ",
- " //// ///// / ",
- " ///// ////// / ",
- " ///// ////// 1 1 1 ",
- " /////////// // ///// 1 11 1 1 1 1 ",
- " /////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " / //////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////// 11111111111111111111111111111111111111111111111111 ",
- " //// 1111111111 1 1 1 1 11 ",
- " / 11 11 1 1 1 1 11 ",
- " 11 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-halign-adjust-multiline-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/text-halign-adjust-multiline-800-800-2.0-grid-reference.json
deleted file mode 100644
index ad3ac5c..0000000
--- a/tests/visual_tests/grids/text-halign-adjust-multiline-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "10",
- "2",
- "12",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!! ",
- " !!!!!! !! !!! ",
- " !!!!!!!!! !!!!! !! ",
- " !!!!!!!!!!! !!!!!!! ! !!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!! ! !!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!! !!!!!!!!!! !! ",
- " !!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!! ! ",
- " !!!!!!!!!!! !!!!!!!!!! !!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !! ! ",
- " !!!!!!!!!!! !!!!!!!!!!! ! !!!!!!!!!!! !!!!!!!!!! ! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!! ",
- " !!!!!!!!!!! ! !!!!!!!!!!! !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!! !! !!!!!!!!!! ! !!!!!!!!!! ",
- " !!!!!!!!!! ! !!!!!!!!!!! !!!!!!!!!!! ! ! !!!!!!!!!!! ! !!!!!!!!!!! !! !!!!!!!!!!! !!! !!!!!!!!!!! ",
- " !!!!!!! ! ! !! !!!!!!!!!! !!!!!!!!!!! !! !!!!!!!!!!! !!!!!!!!!!!! ! !!!!!!!!!! ! !!!!!!!!!!! ",
- " !!!!!! ! !!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! ",
- " !!! ! !! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! ",
- " !! ! !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ",
- " ! ! !!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " ! !!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!! !!!!!!!!!!!!! ",
- " ## !!!!!!!!!!!!! # ! !!!!!!!!!!!! ! !!!!!!!!!!! ",
- " ##### !!!!!!!!!!! #### !!!!!!!!!! !! !!!!!!! ",
- " ######## !!!!!!!!! ###### !!!!!! ! ## !!!!!! $$$$$$ $ ",
- " ########## !!!!! ######### !!!! #### !! ! $$$$$$$$ $ ",
- " ############## !!! ############ !! ######## ! ! # $$$$$$ $ $ ",
- " ################ ! ############## ########## ! ! #### $$$$$$$$ $ ",
- " ################### ! ################## ############ ! ##### $$$$$$ $$ ",
- " ##################### ! #################### ################ ####### $$$$$$ ",
- " ############ ########### ########### ########## ################## ########## $$$$$$ ",
- " ############ ########## ########### ########## #################### ########### $$$$$$ ",
- " ############ ########## ########### ########### ########## ########### ########### $$$$$$ ",
- " ############ ########### ########## ########## ########### ########### ########### $$$$$$ ",
- " ########### ########## ########### ########## ########## ########## ########## $$$$$$ ",
- " ######### ########## ########### ########## ########## ########### ########### $$$$$$ ",
- " ###### ########## ########### ########### ########### ########### ########### $$$$$$ ",
- " %%%%%%% ##### ########### ########### ########## ########### ########## ########### $$$$$$ ",
- " %%%%%%%%%%% ## ########## ########## ########## ########## ##################### $$$$$$ ",
- " %%%%%%% ########## ########### ########### ########## ################## $$$$$$ ",
- " %%%%%%%%%%% ########### ########### ##################### ############### $$$$$$$$$$ ",
- " %%%%%%% ##################### ################## ############# $$$$$$ ",
- " %%%%%%% ################## ################ ########## $$$$$$$ ",
- " %%%%%%%%%% ################ ############## ####### $$$$$$$$$$ ",
- " %%%%%%% ############# ########### ##### $ $$$$$$ ",
- " %%%%%%% ########## ######## ## $ $$$$$$ ",
- " %%%%%%% ####### & ###### && $$$$$$$$$ ",
- " %%%%%%% #####& & &&&&&&& ### && &&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&& ### &&&&&&&&& & &&&&&&&&&&& &&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&& && &&&&&&&&&&&&& &&&&&&&&& & &&&&&&&&&&&& &&&&&&&&& $$$$$$ ",
- " %%%%%%%%%% &&&&&&&&&&&& &&&&&&&&&& && &&&&&&&&&&& &&&&&&&&&& &&&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&& & $$$$$$ ",
- " %%%%%%% &&&&&&&&&&& &&&&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&&& && $$$$$$$$$$ ",
- " % %%%%%%%%%&&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&& &&&&&&&&&& &&&&&&&& &&&&&&&&&&& &&&&&&&&&&& &&&&& $$$$$$ ",
- " %%%%%%%%%% %%&&&&&&&& & &&&&&&&& &&&&&&&&&& & &&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%% &&&&&& && &&&&&&&&& &&&&&&&&&&& && &&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&& $ $$$$$$ ",
- " %%%%%% &&& & & &&&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&&& && &&&&&&&&&&&&&&&&& $ $$$$$$ ",
- " %%%%%% && && &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& & && &&&&&&&&&&&&&&& &&&&&&&&&&&&&& & $$$$$$$$ ",
- " %%%%%% & & &&&&&&&&&&&&&&& &&&&&&&&&&&&&& & & &&&&&&&&&&&& & &&&&&&&&&&& &&& $$$$$$ ",
- " %%%%%% && &&&&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&&& && &&&&&&& & && $$$$$$ ",
- " %%%%%% &&&&&&&&&& & &&&&&&&& &&&& & & &&& $$$$$$ ",
- " %%%%%% & &&&&& & & '''''''''' $$$$$$ ",
- " %%%%%% & && && '''''''''' $$$$$$ ",
- " %%%%%% && & '''''''''' $$$$$$ ",
- " %%%%%%%%%% & '''''''''' $$$$$$$$$$ ",
- " %%%%%% '''''''''' $$$$$$ ",
- " %%%%%%%% ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% % ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%%%% ( ((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%%%%%% ((((((( ((((((((( ((((((((((( '''''''''''''''''''''''''''$$$$$$$$ ",
- " %%%%%% ((((((((( (((((((((((( ((((((((((((( ((((((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% ((((((((((((( (((((((((((((( (((((((((((((((( (((((((((((((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " %%%%%% (((((((((((((((( ((((((((((((((((( (((((((((((((((((( ((((((((((((((((((( $$$$$$$$ ",
- " %%%%%% (((((((((((((((((( (((((((((((((((((((( (((((((((((((((((((( ((((((((((((((((((((( $$$$$$ ",
- " %%%%%% ((((((((((((((((((((( ((((((((((((((((((((( (((((((((((((((((((((( (((((((((((( ((((((((( $$$$$$ ",
- " %%%%%%%%%% (((((((((((((((((((((( (((((((((((( (((((((( ((((((((((( ((((((((( (((((((((( (((((((( $$$$$$ ",
- " % %%%%%% ((((((((((( (((((((( (((((((((( (((((((( ((((((((((( ((((((( (((((((((( (((((((( (( $$$$$$ ",
- " %%%%%% (((((((((( (((((((( (((((((((( (((((((( (((((((((( (((((((( (((((((((( (((((((( ((((( $$$$$$$$$$ ",
- " %%%%%% ((((((((( ((((((( (((((((((( (((((((( (((((((((( ((((((((( ((((((((((( ((((((((((((((((( $$$$$$ ",
- " %%%%%%%% (((((( ((((((((( ((((((((((( ((((((((((((((((((((( (((((((((((((((((((( (((((((((((((((( $$$$$$ ",
- " %%%%%% (((( (((((((((((((((((((( (((((((((((((((((( ((((((((((((((((( ))) ((((((((((((((((( $$$$$$ ",
- " %%%%%% (( (((((((((((((((((( (((((((((((((((( (((((((((((((((( ) ((()(()(((((((( $$$$$$ ",
- " %%%%%% (((((((((((((((((** ((((((((((((((( (((((((((((((( )))) ()(()(((((( ) $$$$$$ ",
- " %%%%%% ((((((((((((( **** (((((((((((( (((((((((( ) ) ) )(()((((( ) $$$$$$ ",
- " %%%%%% ((((((((((( ****** +++++ ((((((((( ((((((( ))))))))))))))))))))))) ))(( ) $$$$$$ ",
- " %%%%%% (((((((( ******** +++++++ (((( ( ))))))))))))))))))))))))))))))))))))) $ $$$$$$$$ ",
- " %%%%%%%%%% (* ********** ++++++ , ))))))))))))))))))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% ************ ++++++ ,,,,,,, )))))))))))))))))))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% * *********** ** ++++++ ,,,,,,, ------------------------ )))))))))))))))))))))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% ** ************** * ++++++ ,,,,,, ----------------------------- ))))))))))))))))))))))))))))))))))))))))))) $$$$$$ $ ",
- " %%%%%%%% * *********** ** ** +++++++ ,,,,,, ----------------------------- ) ))))))))))))))))))))))))))) $$$$$$$$$$ ",
- " %%%%%% *********** ** +++++++ ,,,,,, ----------------------------- ) )) ))))))))) )) $$$$$$ ",
- " %%%%%% * *********** * ++++++ ,,,,,, ----------------------------- ) )))) ))))))))))) $$$$$$ ",
- " %%%%%%%% ************* * ++++++ ,,,,,,, ----------------------------- ) )))))))) $$$$$$ ",
- " %%%%%% ** *********** * * ++++++ ,,,,,,, -------------- )))))))) $$$$$$ ",
- " %%%%%% * ************ ** ++++++ ,,,,,,, ............... ))))))) $$$$$$ ",
- " %%%%%% * ********** * * +++++++ ,,,,,, ...................................... ))))))))) $$$$$$ ",
- " %%%%%%%%%% * ************ * +++++++ ,,,,,, ........................................... )))))) $$$$$$$$$$ ",
- " %%%%%% * ************ * ++++++ ,,,,,, ............................................ )))))) $ $$$$$$ ",
- " %%%%%% ** ********** * ++++++ ,,,,,, ............................................. ))))))))) $ $$$$$$ ",
- " %%%%%% * *********** * ++++++ ,,,,,,, ............................................. ))))))) $$$$$$$$ ",
- " %%%%%% * ************* ++++++ ,,,,,,, ............................................ ))))))) $$$$$$ ",
- " %%%%%% *********** * //// +++++++ ,,,,,, ............ ))))))) $$$$$$$$$$ ",
- " %%%%%%%% ** *********** * //////////// +++++++ ,,,,,, ....... ))))))) $$$$$$ ",
- " %%%%%%% * ************ ** //////////////////// +++++++ ,,,,,, ....... )))))))))) $$$$$$ ",
- " %%%%%% % * ********** * * //////////////////////// ++++++ ,,,,,, ...... )))))) $$$$$$ ",
- " %%%%%% ************ * /////////////////////////// ++++++ ,,,,,, ...... )))))) $$$$$$ ",
- " %%%%%% ********** ** //////////////////////////// ++++++ ,,,,,,, ...... )))))) $$$$$$ ",
- " %%% %%%%%% ********** * ///////////////////////////////++++++ ,,,,,,, ...... 00000000000000000000000000000 )))))) $$$$$$ ",
- " %%%%%% *********** * /////////// //////////////+++++++,,,,,, ....... 00000000000000000000000000000 )))))) $$$$$$ ",
- " %%%%%% *********** ** ////////// ////////+++++++,,,,,, ....... 00000000000000000000000000000 )))))) $$$$$$ ",
- " %%%%%% ********** ** * /////////// ///////++++ ,,,,,, ....... 00000000000000000000000000000 )))))))))) $$$$$$ ",
- " %%%%%% ********** *** /////////// //////// ,,,,,, ...... 00000000000000000000000000000 ))))))) $$$$$$ ",
- " %%%%%% ********* ////////// //////// ,,,,,,, ...... 00000000000000000000000000000 ))))))) $$$$$$$$$ ",
- " %%%%%% ****** * ///////// /////// ,,,,,,, ...... 000000000000000000 ) )))))) $$ $$$$$$ ",
- " %%%%%% **** * ** //////// //////// ,,,,,,, ...... )) ) )))))) $$$$$$$$$$$$ ",
- " %%%%%%%%%%** * /////// ////////,,,,,, ...... ) ) ))) )))))) ) $$$$$$ $ ",
- " %%%%%% * ** /////// //////// ,,,, ...... ))) ) ) ) ) ))))))))))) $$$$$$ $ ",
- " %%%%%%%%%% * /////// //////// ...... ))))))))))))))))))))))))))))) )))))))))))))))) $$$$$$$$$ ",
- " %%%%%% * ////// //////// ...... )))))))))))))))))))))))))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% ////// ///// ....... )))))))))))))))))))))))))))))))))))))))))))))) $$$$$$ ",
- " %%%%%%%%%% ////// ////// ....... ))))))))))))))))))))))))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% ////// ////// ...... )))))))))))))))))))))))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% /////// ////// ...... ))))))))))))))))))))))))))))))))))))))))))) $$$$$$ ",
- " %%%%%% /////// ////// ...... ) )) ) ))))))))))))))) ) $$$$$$ ",
- " %%%%%% ////// ////// ....... ) ) ) ) ) ) $$$$$$ ",
- " %%%%%% ////// /////// ........ ) ) ) ) ) ) $$$$$$ ",
- " %%%%%% ////// /////// ....... ) ) ) ) ) ) $$$$$$ ",
- " %%%%%% ////// ////// ......... ) ) $$$$$$ ",
- " %%%%%% /////// ////// .......... .................................. $$$$$$ ",
- " %%%%%% /////// ////// ............................................ $$$$$$$$$$ ",
- " %%%%%%%%% /////// ////// ............................................ $$$$$$ ",
- " %%% %%%%%% //////// /////// ........................................... $$$$$$ ",
- " % % %%%%%% //////// /////// ......................................... $$$$$$$$$$ ",
- " % %%%%%%%% //////// ////// ....................................... $$$$$$ ",
- " % %%%%%% //////// ////// .................................... $$$$$$$ ",
- " //////// /////// $$$$$$$$$$ ",
- " //////// ///////// $$$$$$ ",
- " /////// ////////// ",
- " //////// ////////// ",
- " //////// /////////// 1 1 1 1 ",
- " //////// /////////// 11 111 1 1 1 111 111 ",
- " /////////// ////////// 1 1 11 1 1 1 1 1 ",
- " ///////////////// /////////// 11 1 1 1 1 11111111111111111111111111 ",
- " ////////////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " /////////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " ////////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " //////////////// 11111111111111111111111111111111111111111111111111 ",
- " ///////// 11111111111111111111111111111111111111 1111 1 1 ",
- " / 11 11 1 1 1 1 1 1 1 1 1 1 1111 ",
- " 1 1 1 1 1 1 1 1 1 1 1 1 1 ",
- " 1 1 1 1 1 1 1 1 1 1 1 1 1111 ",
- " 1 1 1 111 1 11 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-halo-opacity-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/text-halo-opacity-512-512-1.0-grid-reference.json
deleted file mode 100644
index 046aa0c..0000000
--- a/tests/visual_tests/grids/text-halo-opacity-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,140 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!!!!!! !!!!!!!!!!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! ",
- " !!! !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ### ### #### ######### ",
- " ####################################### ",
- " ####################################### ",
- " ####################################### ",
- " ####################################### ",
- " ### #### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$ $$$ $$$$ $$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$ ",
- " $$$ $$$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " %%% %%% %%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- " %%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%% ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-halo-opacity-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/text-halo-opacity-512-512-2.0-grid-reference.json
deleted file mode 100644
index 5ceda9e..0000000
--- a/tests/visual_tests/grids/text-halo-opacity-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,140 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "3",
- "4"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! !!!!! !!!!! !!!!!! !!!!!! ",
- " !!!!! !!!!! !!!!!!! !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !!!!! !!!!!! ",
- " !!!!! !!!!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "##### ##### ####### ################### ",
- "################## ############################## ################### ",
- "############################################################################# ",
- "############################################################################# ",
- "############################################################################# ",
- "############################################################################# ",
- "############################################################################# ",
- "############################################################################# ",
- "################################################# ################### ",
- "################### ############################# ################### ",
- " ##### ###### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$$$$ $$$$$ $$$$$ ",
- " $$$$$ $$$$$ $$$$$$$ $$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ",
- " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$ ",
- " $$$$$ $$$$$$ ",
- " $$$$$ $$$$$ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "%%%%% %%%%% %%%%%%% %%%%%%%%%%%%%%%%%%% ",
- "%%%%% %%%%% %%%%%%% %%%%%%%%%%%%%%%%%%% ",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ",
- "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%% ",
- " %%%%% %%%%%% ",
- " %%%%% %%%%% ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-halo-rasterizer-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/text-halo-rasterizer-600-400-1.0-grid-reference.json
deleted file mode 100644
index a574873..0000000
--- a/tests/visual_tests/grids/text-halo-rasterizer-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,124 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "9",
- "2",
- "10",
- "3",
- "11",
- "4",
- "12",
- "5",
- "13",
- "6",
- "14",
- "7",
- "15",
- "8",
- "16"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ! # ## # ",
- " !!! ! # ### # ",
- " !!!!!! !!! # #### # # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $ $$ % %% %% ",
- " $$$ $ $ % %%% % ",
- " $$$$$$ $$$ % %%%% %%% ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " & && ' '' ' ",
- " &&& & && ' ''' ' ",
- " &&&&&& &&& ' '''' ''' ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ( (( ) )) )) ",
- " ((( ( ( ) ))) ) ",
- " (((((( ( ) )))) ) ) ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " *** *** ** ++++++ + ",
- " ******* * +++++ + ",
- " ******* *** +++++ ++ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ,,,,,,,, , ,, -- --- -- --- ",
- " , ,,,,, , ,,, -- --- - --- ",
- " ,,,,,,,, ,,,,,, ------ ------ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " .. .. ... // /// // /// ",
- " ........... ... /////// // /// ",
- " ........ .. ... /////// // /// ",
- " ............... ////// ////// ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " 0000 00 000 111 1111111 ",
- " 000000000000 11111111111 ",
- " 0000000000000 11111111111 ",
- " 0000000000000 11111111111 ",
- " 000000000 00 1111111 111 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-halo-rasterizer-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/text-halo-rasterizer-600-400-2.0-grid-reference.json
deleted file mode 100644
index 5c6db82..0000000
--- a/tests/visual_tests/grids/text-halo-rasterizer-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,124 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "9",
- "2",
- "10",
- "3",
- "11",
- "4",
- "12",
- "5",
- "13",
- "6",
- "14",
- "7",
- "15",
- "8",
- "16"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ## # # ",
- " ! ! !! # # ## ",
- " !! !!! !!! !!! ! #### # # # # ",
- " ! !! ! ! ! # # # # # # ",
- " ! ! ! !! ! ! # # # # # # ",
- " ! ! ! ! ! !! ! !!!! # # ## # # # ### ",
- " ",
- " ",
- " ",
- " ",
- " $ %% % % ",
- " $ $ $ $$ % % % % ",
- " $$ $$$ $$$ $$$ $$ %%%% % % % % ",
- " $ $ $ $ $$ % % % % % %% ",
- " $ $ $ $$ $ $ % % % % % % ",
- " $ $ $ $ $ $$ $ $ $$ % % %% % % % % ",
- " ",
- " ",
- " ",
- " ",
- " &&& &&&& '' ' ' ''' ",
- " && & &&&& '' ' ' ''' ",
- " &&&&&&& &&&&&&& &&& '''' '' ' ' ''' ",
- " & &&&&&& & &&&& '' ' '' ' ' '''' ",
- " & &&&&&&&&&& && '' ' '' ' ' '' ",
- " & &&&&&&&&&&&& && &&&& '' '''' ' ' ''''''' ",
- " & &&&&&&& && && &&& '' '''' ' ' '''''' ",
- " ",
- " ",
- " ",
- " ((( (((( )) ) ) ))))) ",
- " (( ( (((( )) ) ) ))))) ",
- " ((((((( ((((((( (( )))) )) ) ) )) ",
- " ( (((((( ( (( )) ) )) ) ) )) ",
- " ( (((((((((( (( )) ) )) ) ) ) ",
- " ( (((((((((((( (( ( )) )))) ) ) )) )) ",
- " ( ((((((( (( (( (( )) )))) ) ) )) )) ",
- " ",
- " ",
- " ",
- " *** ** **** +++ ++ + +++ ",
- " ****** ** ** **** +++ ++ + +++ ",
- " *************** ** +++++++++ + ++ ",
- " ** ********** ** ++ ++++++ + ++ ",
- " ************* ** ++ ++++++ + ++ ",
- " ************** **** ++ ++++++ + +++++ ",
- " ** *********** **** ++ ++++++ + +++++ ",
- " ",
- " ",
- " ",
- " ,,,, ,,, ,,, ,,,, ---- ---- ---- ----- ",
- " ,,,,,,,,,,,,,,, ,,, ,,,, ----- ------ ---- ----- ",
- " ,,,,,,,,,,,,,,, ,,, ,,,, ----- ------ ---- ----- ",
- " ,,,,,,,,,,,,,,, ,, ,,,,, ----- ------ -- ----- ",
- " ,,,,,,,,,,,,,, ,, ,,,, ,,, ------------ -- ---- -- ",
- " ,,,,,,,,,,,,,,, ,,,,,,,,,,,, ------------ ------------ ",
- " ,,,,,,,,,,,,,,, ,,,,,,,,,,, ------------ ------------ ",
- " ",
- " ",
- " .... ..... ...... ///// ////// ///// ////// ",
- " .... ... ...... ...... ///// ////// ////// ////// ",
- " ................ ...... ...... ////////////// ////// ////// ",
- " ................ ...... ...... ////////////// ////// ////// ",
- " ................ ..... ...... ////////////// ////// ////// ",
- " ............... ............. ///////////// ///////////// ",
- " ............... ............. ///////////// ///////////// ",
- " ............... ............. ///////////// ///////////// ",
- " ............... ............ ///////////// //////////// ",
- " 000000 111111 1111111 ",
- " 0000000 00000 000000 111111 1111111 111111 ",
- " 000000000000000000000000 1111111111111111111111 ",
- " 000000000000000000000000 1111111111111111111111 ",
- " 0000000000000000000000000 1111111111111111111111 ",
- " 0000000000000000000000000 1111111111111111111111 ",
- " 0000000000000000000000000 1111111111111111111111 ",
- " 0000000000000000000000000 111111111111111111111 ",
- " 0000000000000000000000000 111111111111111111111 ",
- " 000000000000000000 00000 11111111111111 11111 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-halo-transform-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/text-halo-transform-600-400-1.0-grid-reference.json
deleted file mode 100644
index 401b436..0000000
--- a/tests/visual_tests/grids/text-halo-transform-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,124 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "1",
- "10",
- "2",
- "11",
- "3",
- "12",
- "4",
- "13",
- "5",
- "14",
- "6",
- "15",
- "7",
- "8",
- "16"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ## ! ! ",
- " ### ! !! ",
- " #### !! ! ",
- " ## ### ! ! ",
- " # ! ",
- " # # ! ",
- " # ! ",
- " ! ",
- " ",
- " $$ ",
- " %% $ ",
- " %% $ $$ ",
- " %%%% $$$ $ ",
- " %% %%% % $ $ ",
- " % %% $ ",
- " % % $ ",
- " $ ",
- " $$ ",
- " ",
- " & ",
- " && ",
- " ' & & ",
- " '''' &&& ",
- " '' '' '' & ",
- " ''' '' & & ",
- " ' & && ",
- " & ",
- " ",
- " ",
- " ",
- " ( ",
- " ) ( ",
- " ))) (( ",
- " ))))) )) ( ",
- " ))) ) ( ( ",
- " ) ( ( ",
- " (( ",
- " ",
- " ",
- " ",
- " ** ",
- " ++ *** * ",
- " +++++++ ****** ",
- " ++++++++++ ***** * ",
- " ++++++ + ** ** ",
- " + ++ ** ",
- " ** ",
- " ",
- " ",
- " ",
- " ,,, ",
- " -- ,,,,,, ",
- " -------- -- ,,,,,, ,, ",
- " ------- - -- ,,,,, , ",
- " ---- -- -- , ,,, ,,, ",
- " ----- ,,,,,, ",
- " ,, ",
- " ",
- " ",
- " ",
- " ... ",
- " /// / ...... ",
- " /////////// /// ...... ... ",
- " //////// // /// ...... ...... ",
- " /////////////// ...... ... ",
- " /////// ....... ",
- " ... ",
- " ",
- " ",
- " ",
- " 00 1111 ",
- " 00000 000000 1111111 ",
- " 000000000000 11111111111 ",
- " 0000000000000 11111111111 ",
- " 0000000000000 11111111111 ",
- " 0000000000000 111111111 ",
- " 11 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-halo-transform-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/text-halo-transform-600-400-2.0-grid-reference.json
deleted file mode 100644
index e291c0a..0000000
--- a/tests/visual_tests/grids/text-halo-transform-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,124 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "1",
- "10",
- "2",
- "11",
- "3",
- "12",
- "4",
- "13",
- "5",
- "14",
- "6",
- "15",
- "7",
- "16",
- "8"
- ],
- "data": {},
- "grid": [
- " ",
- " ! ",
- " !!!! ",
- " !!! ",
- " ## !! ! ",
- " ## ! ",
- " # ## ! ! ",
- " # ## ! ! ! ",
- " # #### ## # !! ! ! ",
- " # # ## ### !! ! ",
- " ### ## # # ! !! ",
- " ## # # ### !! ",
- " # # $$$$ ! ",
- " ## # $$ ",
- " % ## ## $$ !! ",
- " % ## $$ $ ! !! ",
- " %% ## $ !! ",
- " % % $ $ !!! ",
- " % %%%% %% % $$$ $ $$!! ",
- " % % % % %%% $ $ $$ ! ",
- " %%% %% % % $ $ ",
- " %% % % % $ ",
- " % % %% && $ ",
- " %% %%% &&&& $$ ",
- " ' % % &&& $$ ",
- " ''' %%%% && && $$ $ $ ",
- " ''' && && & & $ $$ ",
- " '' '''' && && && $$ $ ",
- " '' '''''''' ' &&&&&&& && $$$ ",
- " ' '''''''''''' &&&&& && ",
- " ' '''' ''' ''' '''' & &&&& ",
- " ''''' ' ' ' '' &&&&& ",
- " ''' ' ''' && && ",
- " '' ' '' (((( &&& ",
- " '' ' '' (((( & &&&&& ",
- " ))) '''' ((((( & && ",
- " ))) (( (( (( && & ",
- " )))))) (( (( (( ((( &&&& ",
- " )) )))))))))) ( (((( (( & ",
- " ) )))))))))))) ) (((((( (( ",
- " ) )))) ))) ))) )))) ( (((( ",
- " ))))) ) ) )) (( (( ( ",
- " ))) ) )) (( ((( ",
- " )) ) ))) (( ",
- " ) )) **** (( ((( ",
- " +++ ) **** (( ((( ",
- " ++++ ***** ((( ",
- " ++++++ ******** ** ",
- " +++++++++++++ ** ** ******* ",
- " ++++++++++++++ +++ ************ ",
- " ++++++++++++++ +++ ********* *** ",
- " +++++++++++++ ++ ******** **** ",
- " ++++++++++ +++ ***** *** ",
- " +++ +++ +++ ,,,, ** *** ",
- " ++++ ,,,,, **** ",
- " --- +++ ,,,,, ,, **** ",
- " ---- ,,,,,,,,,,,, **** ",
- " -------------- ,,,,,,,,,,,,, * ",
- " --------------- ---- ,,,,,,,,,,,,, ,,,, ",
- " --------------- ---- ----- ,,,,,,,,,,,, ,,,, ",
- " -------------- --- ----- ,,,,,,,,, ,,,, ,, ",
- " -------------- -- ---- ,,,,,, ,,, ,,,,, ",
- " ------------ ---- ---- ,, ,,,,, ,,,,, ",
- " ---- --------- -- ..... ,,,,, ,,,,, ",
- " ------------ ...... ,,,,,,, ,,,, ",
- " ///// ----- ...... ..... ,,,,,,,,,, ",
- " /////// /// .............. ,,,,,,, ",
- " /////////////// ////// ................... ,,,,, ",
- " /////////////////////// ////// .................... ",
- " /////////////////////// ////// ............. ...... ..... ",
- " ///////////////// ///// ////// ............. ...... ...... ",
- " //////////////// ////// ////// .................. ...... ",
- " ////////////////////////////// ....... ....... ...... ",
- " ///////////////////////// ... ............. ",
- " ///////////////// 0000000 ............. ",
- " 111111 ///////// 0000000000000........... ",
- " 111111111 11111 11111 000000000000000 ........ ",
- " 111111111111111111111111 000000000000000 000000. ",
- " 111111111111111111111111 0000000000000000000000 ",
- " 111111111111111111111111 0000000000000000000000 ",
- " 1111111111111111111111111 0000000000000000000000 ",
- " 1111111111111111111111111 0000000000000000000000 ",
- " 1111111111111111111111111 0000000000000000000000 ",
- " 1111111111111111111111111 0000000000000000000000 ",
- " 1111111111111111111111111 000000000000000000 ",
- " 111111 11111 0000 000000 ",
- " 00000 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-line-wrap-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/text-line-wrap-512-512-1.0-grid-reference.json
deleted file mode 100644
index 6c277bb..0000000
--- a/tests/visual_tests/grids/text-line-wrap-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ! ",
- " !!!!!!! ",
- " !!!!!!!! ",
- " ! ",
- " !! ! ",
- " !!!!!!!! ",
- " !!!!!!!!! ",
- " !!!!!!! ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ####### ",
- " # ##### ",
- " ######## ",
- " # ",
- " # # # ",
- " ######## ",
- " ######### ",
- " # ## ",
- " # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-line-wrap-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/text-line-wrap-512-512-2.0-grid-reference.json
deleted file mode 100644
index 1a4b972..0000000
--- a/tests/visual_tests/grids/text-line-wrap-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "keys": [
- "",
- "4",
- "3"
- ],
- "data": {},
- "grid": [
- " ",
- " !! !! ",
- " ! !! !! ",
- " !!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!! ",
- " ! !! !!!!!!!!!!! ",
- " !!!! !!!!!!!! ",
- " !!!! !!!!!!!! ",
- " ",
- " ",
- " !! !! !! ",
- " !!!!!!! !!!!!!! ",
- " !!!!!!!!!!!!!!!! ",
- " !!!!! !!!!!!!!!!!! ",
- " !!!!! !! !!!!!!!!! ",
- " !!!!! !!!!!!!!!! ",
- " !!!! !!!!!!!!!! ",
- " ",
- " ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ## ## ## ",
- " ####### ## ### ",
- " ############## ",
- " ## ########### ",
- " ## ## ######## ",
- " ##### ########## ",
- " #### ########## ",
- " ## ",
- " ",
- " ## ## ## ",
- " ####### ######## ",
- " ################ ",
- " ## ## ######## ",
- " #### ## ######## ",
- " ####### ########## ",
- " ## ### ",
- " ",
- " # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-malayalam-800-100-1.0-grid-reference.json b/tests/visual_tests/grids/text-malayalam-800-100-1.0-grid-reference.json
deleted file mode 100644
index c736769..0000000
--- a/tests/visual_tests/grids/text-malayalam-800-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!!!! !!!!!! ! ",
- " !!! ! ! ! ! ",
- " !!! ! ! ! ! ",
- " !!!! ! !!! ! ",
- " !!!!! ! ! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-malayalam-800-100-2.0-grid-reference.json b/tests/visual_tests/grids/text-malayalam-800-100-2.0-grid-reference.json
deleted file mode 100644
index 2750421..0000000
--- a/tests/visual_tests/grids/text-malayalam-800-100-2.0-grid-reference.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keys": [
- "",
- "5"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! !!! !!! !!!!!! ! ",
- " ! !!! !! !! !!! !! ! ! ",
- " !!! ! !! ! ! ! !! !! ! ",
- " ! ! ! !! ! ! ! !! ! ! ",
- " ! ! ! !! ! ! ! ! ! ! ",
- " !!! ! !! ! ! ! !! ! !! ",
- " !!!!!!!!! ! ! !!! ! ! ",
- " ! ! !! ",
- " !!!!!!!!!!! !!! ! ",
- " !!!!!!!!!! ! !! ",
- " !!!! ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-multi-layout-1-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/text-multi-layout-1-512-512-1.0-grid-reference.json
deleted file mode 100644
index 5bdb416..0000000
--- a/tests/visual_tests/grids/text-multi-layout-1-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,142 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "3",
- "5",
- "6",
- "4",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # ",
- " !! ## ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $ ",
- " $ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " % ",
- " %% ",
- " % ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " & ' ",
- " && '' ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-multi-layout-1-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/text-multi-layout-1-512-512-2.0-grid-reference.json
deleted file mode 100644
index 354d801..0000000
--- a/tests/visual_tests/grids/text-multi-layout-1-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,142 +0,0 @@
-{
- "keys": [
- "",
- "2",
- "3",
- "5",
- "6",
- "4",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! # ",
- " ! # ",
- " !!!! #### ",
- " ! # ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $ ",
- " $ ",
- " $$$$ ",
- " $ ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " % ",
- " % ",
- " %%%% ",
- " % ",
- " % ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " & ' ",
- " & ' ",
- " &&&& '''' ",
- " & ' ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-multi-layout-2-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/text-multi-layout-2-512-512-1.0-grid-reference.json
deleted file mode 100644
index 7386a8b..0000000
--- a/tests/visual_tests/grids/text-multi-layout-2-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " ! ",
- " ! ",
- " ! !!! ",
- " !! !!! ",
- " ! !!! ",
- " !!! !! ",
- " ! ! !! ",
- " ! !! !!! ! ",
- " !! !! !! ",
- " !!! ! ! ",
- " !!!! !! ! ",
- " !!! ! !!! ! ! ",
- " !! ! ! ! ! !! ",
- " ! !! !! ! ! ",
- " ! !!! !! !!! !! ",
- " !! ! ! !! !! ! ",
- " !! ! ! !! ",
- " !! ! !! !! !!! ! !!! ",
- " !! ! !!!!!!!!!! !!!! !!!! ! !!! ! ! ! ",
- " ! ! ! !! !! !!! !!!! ! ! !!! !! ",
- " ! !!! !!! ! ",
- " ! !!!! !! ",
- " !!! !!! ! !!! !! ! ",
- " !!!!!!!!!!! !!!! ! ! ! ! !!! !! ",
- " !!!!!!!!!!! ! !!!!!!! !! ! ! ",
- " !! !! !! ",
- " !! ! ! ! ",
- " ! !! ! ",
- " !! !! ",
- " ! !! ",
- " ! ",
- " ",
- " ",
- " ",
- " ! !!! ! !! ! ",
- " !!!!!!!!!!!!!!!!!!! !!!!!!!!! !!!!!!!!! !!!! !!!! ",
- " !!!!!!!!!!!!!!!!!!! !!!!!!!!! !!!!!!!! !!!!!!!!!! ",
- " !!! ! ! ! ! ! !! ! ! ! ! ! ! ",
- " ! ! ! !!! ! ! !! ! ",
- " ! !!!!!! !! !!!!!!! !!!!!!! !! !!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!! !!!!!!!!!!! !!!!!!!!! ",
- " ! ! ! ! !! ! ",
- " !!!!!!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!!!!!!! !!!!!!!! ",
- " ",
- " !!! ! ! ",
- " !!!!!!!!! ",
- " !!!!!!!!!! ",
- " ! ! ! ",
- " !!!!!!!! ",
- " !!!!!!!! ",
- " !! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-multi-layout-2-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/text-multi-layout-2-512-512-2.0-grid-reference.json
deleted file mode 100644
index de57d8b..0000000
--- a/tests/visual_tests/grids/text-multi-layout-2-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ",
- " ! ",
- " !! !! ",
- " ! ! ",
- " ! ! ",
- " !! ! ! ! ",
- " ! !! !! ! ",
- " ! ! ! !!!!! ",
- " ! ! !! ! !! ",
- " ! ! !!! ! ",
- " ! ! !! !! ",
- " ! !! ! !! ",
- " ! ! ! ! ! ",
- " ! ! !! ! ",
- " ! ! !! ",
- " ! !!! !! ! ! ",
- " ! ! ! ! !!! ",
- " !!! !! ! ! ! ",
- " ! !! ! ! ! ! ! ",
- " !!!!! ! !! ! !! ",
- " ! ! ! ! !! ! ",
- " !!! ! !!! ! ! ",
- " ! !! ! !!! ! ! ! ! ! ",
- " ! ! !! ! ! ! !! ",
- " !!! ! ! !! ! ! !!! !! ",
- " ! ! ! !! ! ! ! !! ",
- " !! !! ! ! ! !! ! ! !! ! !! ",
- " !! ! ! ! !! !!! !! ! ! ",
- " !!!!! !! !! ! ! ! ! !! !!! ",
- " ! ! !!!!! !!! !!! ! !! ! ",
- " !! ! ! ! !! ! ! ! ! ",
- " ! !! ! !! ! ! ! !!!! !! ! ",
- " !! ! ! !! !!! ! !!! ! !! ! ",
- " ! !! ! !! !!!! ! ! ",
- " ! !! ! ! ! ! !!! ! ",
- " !!!! !! !! !! ! ! ! !!! ! ! !! ! ! ! ",
- " ! ! !! !! ! ! ! ! !!! ! !! ! !!!! ",
- " !!! !! !! !!!!!!! !!!!! !!!! !! !!!!!! !!!!! !!! ! !! !! !! ! !! !! ",
- " !!!! !! ! ! !! !! !! !!!! ! !! !! !! !!!!! ! ! ! ! ! ",
- " ! !!! ! !! !! !! !!!! ! !! !! !! !! ! !! !! ! ! ! ",
- " !!!! !!! ! !! !! !!!! !!!! !! !!!!!! !!!!! ! ! ! ! !! !!! ",
- " ! ! ! ! !!!!!! !! ",
- " !!! ! !! ! ! ! ! ! ! ",
- " ! ! !! ! ! ! ! !! ! ",
- " !!!! !!!!!! ! ! ! ! ! !! !! ",
- " !!!!! !!!!!! ! ! !!! !! !! ! ! ",
- " !! !! !!!! !!! !!! !! !!!! !! !!!!!! !!! !! !! ! ! ",
- " !!!!! !!!!!!! !! !! !! ! !! !!! ! ! !! ! !! ! !!!!! ",
- " !! !! !!!!! !!!!!!!!! !! !!!!! !!! ! ! !! ! ! ! ! ",
- " !!!!! !!!!!!!!!!!!!!! !! !!!! !! ! !!! ! !! ! ! ! ",
- " ! !! !! !! !!! !! ! ",
- " ! ! !!!! ! !!! ",
- " ! ! !!! !! ! ! ",
- " ! !!! !! !! ! ! ",
- " ! ! ! ! !! ",
- " ! ! ! !! ! ! ",
- " ! ! ! ! ! ",
- " !!! ! ! ! ",
- " ! !!! ! ! ",
- " !! ! !! ! ",
- " ! ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ",
- " ",
- " ",
- " ",
- " !! !!!!! !! !!!! !! ",
- " !!!!! !!!! !!!!!!!!!! !!! !!!! !!!!! !!!!! !! !!!!! !!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ",
- " !! !!!! !!! !! !!!!! ",
- " !!! !! !! !!!! !!! !! !!! !!!!!! !!! ",
- " !!! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! ",
- " !!! !!! !! !! !!!! !! ",
- " !! !! !! !!!!! !! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ",
- " !! ",
- " !!!!! !! !!! ",
- " !!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!!!!!!!! ",
- " !!!!!!!!! !!!!!!!!!!! ",
- " !!! !! !!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!! ",
- " !!!! ",
- " !!! ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-overlap-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/text-overlap-512-512-1.0-grid-reference.json
deleted file mode 100644
index baa36a1..0000000
--- a/tests/visual_tests/grids/text-overlap-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,156 +0,0 @@
-{
- "keys": [
- "1",
- "",
- "8",
- "4",
- "6",
- "2",
- "7",
- "3",
- "19",
- "20",
- "16",
- "15",
- "18",
- "17",
- "5",
- "9",
- "13",
- "10",
- "14",
- "11",
- "12"
- ],
- "data": {},
- "grid": [
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "&&&&&&&&&&&&&&&&&&&&$$$&&&&&&&&&&&&&&&&&&%%%%&&&&&&&&&&&&&&&&&&&!!!!!!!!!!!''''''''''''''''''''###''''''''''''''''''''!!!!!!!!!!",
- "&&&&&&&&&&&&&&&&&&&&$$$&&&&&&&&&&&&&&&&&&%%%%&&&&&&&&&&&&&&&&&&&!!!!!!!!!!!''''''''''''''''''''###''''''''''''''''''''!!!!!!!!!!",
- "&&&&&&&&&&&&&&&&&&&&$$$&&&&&&&&&&&&&&&&&&%%%%&&&&&&&&&&&&&&&&&&(((!!!!!!!!!''''''''''''''''''''###''''''''''''''''''''!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!*********************",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!*********************",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!*********************",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)))!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!++++!!!!!,,,!!!!!!!!!!!!!!!!!!!!----!!!!!!!!!...!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!++++!!!!!,,,!!!!!!!!!!!!!!!!!!!!----!!!!!!!!!...!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!++++!!!!!,,,!!!!!!!!!!!!!!!!!!!!----!!!!!!!!!...!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!++++!!!!!,,,!!!!!!!!!!!!!!!!!!!!----!!!!!!!!!...!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!++++!!!!!,,,!!!!!!!!!!!!!!!!!!!!----!!!!!!!!!...!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!++++!!!!!,,,!!!!!!!!!!!!!!!!!!!!----!!!!!!!!!...!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!++++!!!!!,,,!!!!!!!!!!!!!!!!!!!!----!!!!!!!!!...!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!++++!!!!!,,,!!!!!!!!!!!!!!!!!!!!----!!!!!!!!!...!!!!!!!",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!(((!!!!!!!++++!!!!!,,,!!!!!!!!!!!!!!!!!!!!----!!!!!!!!!...!!!!!!!",
- "/////////////////////////////////////////%%%%///////////////////((!!!!!!!+++++++++++++++++++++++++!!!!!!!-----------------------",
- "/////////////////////////////////////////%%%%///////////////////!!!!!!!!!+++++++++++++++++++++++++!!!!!!!-----------------------",
- "/////////////////////////////////////////%%%%///////////////////!!!!!!!!!+++++++++++++++++++++++++!!!!!!!-----------------------",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,!!!!!!!!!!+++!!!!!!!!!!!!!!!!!!!!...!!!!!!-",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,!!!!!!!!!!+++!!!!!!!!!!!!!!!!!!!!...!!!!!!-",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,!!!!!!!!!!+++!!!!!!!!!!!!!!!!!!!!...!!!!!!-",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,!!!!!!!!!!+++!!!!!!!!!!!!!!!!!!!!...!!!!!!-",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,!!!!!!!!!!+++!!!!!!!!!!!!!!!!!!!!...!!!!!!-",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,!!!!!!!!!!+++!!!!!!!!!!!!!!!!!!!!...!!!!!!-",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,!!!!!!!!!!+++!!!!!!!!!!!!!!!!!!!!...!!!!!!-",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,!!!!!!!!!!+++!!!!!!!!!!!!!!!!!!!!...!!!!!!-",
- " !!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,!!!!!!!!!!+++!!!!!!!!!!!!!!!!!!!!...!!!!!!-",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!00000000000000000000000000000000",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!00000000000000000000000000000000",
- " !!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!00000000000000000000000000000000",
- " !!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- " !!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- " !!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- " !!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- " !!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- " !!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- " !!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- " !!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- " !!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!0000!!!!!!!!!!!!!!!!!!0",
- "55555555511115555555555555555555555555555555555555553335555555555555555555555555555555!!!!!!!!!!!!!!!!!!!00000000000000000000000",
- "55555555511115555555555555555555555555555555555555553335555555555555555555555555555555!!!!!!!!!!!!!!!!!!!00000000000000000000000",
- "55555555511115555555555555555555555555555555555555553335555555555555555555555555555555!!!!!!!!!!!!!!!!!!!00000000000000000000000",
- "55555555511115555555555555555555555555555555555555553335555555555555555555555555555555!!!!!!!!!!!!!!!!!!!00000000000000000000000",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!1111!!!!!!!!!!!!!!!!!!222!!!!!!!!!!!!!!!!!!333!!!!!!!!!!!!!!!!!!4444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-overlap-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/text-overlap-512-512-2.0-grid-reference.json
deleted file mode 100644
index 952c0a1..0000000
--- a/tests/visual_tests/grids/text-overlap-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,156 +0,0 @@
-{
- "keys": [
- "1",
- "",
- "8",
- "4",
- "6",
- "2",
- "7",
- "3",
- "19",
- "20",
- "16",
- "15",
- "18",
- "17",
- "5",
- "9",
- "13",
- "10",
- "14",
- "11",
- "12"
- ],
- "data": {},
- "grid": [
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "&&&&&&&&&&&&&&&&&&&$$$$$$&&&&&&&&&&&&&&&%%%%%%&&&&&&&&&&&&&&&&&&!!!!!!!!!!!''''''''''''''''''######'''''''''''''''''''!!!!!!!!!!",
- "&&&&&&&&&&&&&&&&&&&$$$$$$&&&&&&&&&&&&&&&%%%%%%&&&&&&&&&&&&&&&&&&!!!!!!!!!!!''''''''''''''''''######'''''''''''''''''''!!!!!!!!!!",
- "&&&&&&&&&&&&&&&&&&&$$$$$$&&&&&&&&&&&&&&&%%%%%%&&&&&&&&&&&&&&&&&&!!!!!!!!!!!''''''''''''''''''######'''''''''''''''''''!!!!!!!!!!",
- "&&&&&&&&&&&&&&&&&&&$$$$$$&&&&&&&&&&&&&&&%%%%%%&&&&&&&&&&&&&&&((((((!!!!!!!!''''''''''''''''''######'''''''''''''''''''!!!!!!!!!!",
- "&&&&&&&&&&&&&&&&&&&$$$$$$&&&&&&&&&&&&&&&%%%%%%&&&&&&&&&&&&&&&((((((!!!!!!!!''''''''''''''''''######'''''''''''''''''''!!!!!!!!!!",
- "&&&&&&&&&&&&&&&&&&&$$$$$$&&&&&&&&&&&&&&&%%%%%%&&&&&&&&&&&&&&&((((((!!!!!!!!''''''''''''''''''######'''''''''''''''''''!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!))))))!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!))))))!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!))))))!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!))))))!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!))))))!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!))))))!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!))))))!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!))))))!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!*********************",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!*********************",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!*********************",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!*********************",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!*********************",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!*********************",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!))))))!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!))))))!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!))))))!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!))))))!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!))))))!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!))))))!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!))))))!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!++++++!!,,,,,,,!!!!!!!!!!!!!!!!!------!!!!!!!......!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!++++++!!,,,,,,,!!!!!!!!!!!!!!!!!------!!!!!!!......!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!++++++!!,,,,,,,!!!!!!!!!!!!!!!!!------!!!!!!!......!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!++++++!!,,,,,,,!!!!!!!!!!!!!!!!!------!!!!!!!......!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!++++++!!,,,,,,,!!!!!!!!!!!!!!!!!------!!!!!!!......!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!++++++!!,,,,,,,!!!!!!!!!!!!!!!!!------!!!!!!!......!!!!!",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!((((((!!!!!++++++!!,,,,,,,!!!!!!!!!!!!!!!!!------!!!!!!!......!!!!!",
- "////////////////////////////////////////%%%%%%//////////////////(((!!!!!+++++++++++++++++++++++++++!!!!!------------------------",
- "////////////////////////////////////////%%%%%%//////////////////(((!!!!!+++++++++++++++++++++++++++!!!!!------------------------",
- "////////////////////////////////////////%%%%%%//////////////////(((!!!!!+++++++++++++++++++++++++++!!!!!------------------------",
- "////////////////////////////////////////%%%%%%//////////////////!!!!!!!!+++++++++++++++++++++++++++!!!!!------------------------",
- "////////////////////////////////////////%%%%%%//////////////////!!!!!!!!+++++++++++++++++++++++++++!!!!!------------------------",
- "////////////////////////////////////////%%%%%%//////////////////!!!!!!!!+++++++++++++++++++++++++++!!!!!------------------------",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,,,,,!!!!!!++++++!!!!!!!!!!!!!!!!!!......!!---",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,,,,,!!!!!!++++++!!!!!!!!!!!!!!!!!!......!!---",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,,,,,!!!!!!++++++!!!!!!!!!!!!!!!!!!......!!---",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,,,,,!!!!!!++++++!!!!!!!!!!!!!!!!!!......!!---",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,,,,,!!!!!!++++++!!!!!!!!!!!!!!!!!!......!!---",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,,,,,!!!!!!++++++!!!!!!!!!!!!!!!!!!......!!---",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,,,,,!!!!!!++++++!!!!!!!!!!!!!!!!!!......!!---",
- " !!!!!!!!!!!!!!!!$$$$$$!!!!!!!!!!!!!!!%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,,,,,,,!!!!!!++++++!!!!!!!!!!!!!!!!!!......!!---",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!00000000000000000000000000000000",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!00000000000000000000000000000000",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!00000000000000000000000000000000",
- " !!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!00000000000000000000000000000000",
- " !!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!00000000000000000000000000000000",
- " !!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!00000000000000000000000000000000",
- " !!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!000",
- " !!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!000",
- " !!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!000",
- " !!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!000",
- " !!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!000",
- " !!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!000",
- " !!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!000",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!000",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!000",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!000",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!000",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!000",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!000",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!000",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!000000!!!!!!!!!!!!!!!000",
- "55555555111111555555555555555555555555555555555555533333355555555555555555555555555555!!!!!!!!!!!!!!!!!!000000000000000000000000",
- "55555555111111555555555555555555555555555555555555533333355555555555555555555555555555!!!!!!!!!!!!!!!!!!000000000000000000000000",
- "55555555111111555555555555555555555555555555555555533333355555555555555555555555555555!!!!!!!!!!!!!!!!!!000000000000000000000000",
- "55555555111111555555555555555555555555555555555555533333355555555555555555555555555555!!!!!!!!!!!!!!!!!!000000000000000000000000",
- "55555555111111555555555555555555555555555555555555533333355555555555555555555555555555!!!!!!!!!!!!!!!!!!000000000000000000000000",
- "55555555111111555555555555555555555555555555555555533333355555555555555555555555555555!!!!!!!!!!!!!!!!!!000000000000000000000000",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!111111!!!!!!!!!!!!!!!222222!!!!!!!!!!!!!!!!333333!!!!!!!!!!!!!!!444444!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-spacing-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/text-spacing-512-512-1.0-grid-reference.json
deleted file mode 100644
index 6c7be17..0000000
--- a/tests/visual_tests/grids/text-spacing-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,153 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "10",
- "11",
- "14",
- "16",
- "12",
- "13",
- "15",
- "3",
- "4",
- "5",
- "6",
- "17",
- "7",
- "8",
- "9"
- ],
- "data": {},
- "grid": [
- " !!!! #### $$$ %%% &&&&&&&&&&&& ",
- " !!! #### $$$$ %%%% &&&&&&&&&&&&&& ",
- " !!!! #### $$$$ %%% &&&&&&&&&&& ",
- " !!! #### $$$$ %%%% &&&&&&&&& ",
- " !!!! #### $$$$ %%% &&&&&&&& ",
- " !!! #### $$$$ %%%% &&&&&& ",
- " !!!! #### $$$$ %%% &&&&&& ",
- " !!! #### $$$$ %%%% &&&&& ",
- " !!!! #### $$$$ %%% &&&&& ",
- " !!! #### $$$$ %%%% ' &&&&& ",
- " !!!! #### $$$$ %%% ''''''''' &&&& ",
- " !!! #### $$$$ %%%% '''''''''''' &&&& ",
- " !!!! #### $$$$ %%% '''''''''''''' &&&& ",
- " !!! #### $$$$ %%%% '''''''''' &&&& ",
- " !!!! #### $$$$ %%% '''''''' &&&& ",
- " !!! #### $$$$ %%%% ''''''' &&& ",
- " !!!! #### $$$$ %%% ''''''' &&&& ",
- " !!! #### $$$$ %%%% '''''' &&& ",
- "!!!! #### $$$$ %%% ''''' &&&& ",
- "!!! #### $$$$ %%%% ''''' &&& ",
- "!!! #### $$$$ %%% ''''' &&&&",
- "!! #### $$$$ %%%% ''''' &&&&",
- "!!! #### $$$$ %%%% '''' &&&",
- "!!! ### $$$$ %%%% '''' &&&",
- "!!!! #### $$$$ %%%% '''' &&&",
- "!!!! ### $$$$ %%%% '''' &&",
- " !!!! #### $$$$ %%%% '''' &&",
- " !!!! ### $$$$ %%%% ''' &&",
- " !!!! #### $$$$ %%%% '''' &&",
- " !!!! ### $$$$ %%%% ''' &&",
- " !!!! #### $$$$ %%%% '''' &&",
- " !!!! ### $$$$ %%%% ''' &&",
- " !!!! #### $$$$ %%%% ''' &",
- " !!!! ### $$$$ %%%% '''' ",
- " !!!! #### $$$$ %%%% '''' ",
- " !!!! ### $$$$ %%%% ''' ",
- " !!!! #### $$$$ %%%% ''' ",
- " !!!! ### $$$$ %%%% ''' ",
- " !!!! #### $$$$ %%%% ''' ",
- " !!!! ### $$$$ %%%% ''' ",
- " !!!! #### $$$$ %%%% '''' ",
- " !!!! ### $$$$ %%%% '''' ",
- " !!!! #### $$$$ %%%% '''' ",
- " !!!! ### $$$$ %%%% '''' ",
- " !! # $$ %% ''' ",
- " ''' ",
- " ''' ",
- " ''' ",
- " ''' ",
- " ''' ",
- " '''' ",
- " '''' ",
- " (( )) ''' **",
- " (((( )))) '''' **",
- " (((( )))) '''' **",
- " (((( )))) '''' **",
- " (((( )))) '''' **",
- " (((( )))) '''' **",
- " (((( )))) '''' **",
- " (((( )))) '''' **",
- " (((( )))) ''''' ***",
- " (((( )))) '''' ***",
- " (((( )))) '''' ***",
- "++++++++++++ (((( )))) '''' ****",
- "+++++++++++++ (((( )))) ''''' *** ",
- "++++++++++++ (((( )))) ''''' **** ",
- " (((( )))) ''''' **** ",
- " (((( )))) '''''' **** ",
- " (((( )))) '''''' **** ",
- " (((( )))) ''''''' **** ",
- " (((( )))) '''''''' **** ",
- " (((( )))) ''''''''''' **** ",
- " (((( )))) ''''''''''''''' **** ",
- ",,,,,,,,,,,,,,,,,,,,,, (((( )))) ''''''''''' ***** ",
- ",,,,,,,,,,,,,,,,,,,,,,, (((( )))) '''''''' ***** ",
- ",,,,,,,,,,,,,,,,,,,,,,, (((( )))) ***** ",
- ",,,,,,,,,,,,,,,,,,,,,, (((( )))) ***** ",
- " (((( )))) ***** ",
- " (((( )))) ****** ",
- " (((( )))) ******* ",
- " (((( )))) ******* ",
- " (((( )))) ********* ",
- " (((( )))) ************* ",
- " (((( )))) ************* ",
- "---------------------------------- (((( )))) *********** ",
- "---------------------------------- (((( )))) ***** ",
- "---------------------------------- (((( )))) ",
- " (((( )))) ",
- " (((( )))) ",
- " (((( )))) ",
- " (((( )))) ",
- " (((( )))) ",
- " (((( )))) ",
- " (((( )))) ",
- " (((( )))) ",
- "............................................ (((( )))) ",
- "............................................. ((( ))) //////// ",
- "............................................ ((( ))) ///////////// ",
- " //////////////// ",
- " /////// //////// /",
- " ///// ////// //",
- " ///// ////// ///",
- " //// ////// ////",
- " // ////// //// ",
- " ///////// /////// ",
- "00000000000000000000000000000000000000000000000000000000000000000 //////////////// ",
- "000000000000000000000000000000000000000000000000000000000000000000 ////////////// ",
- "000000000000000000000000000000000000000000000000000000000000000000 /////// ",
- "00000000000000000000000000000000000000000000000000000000000000000 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",
- "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",
- "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-spacing-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/text-spacing-512-512-2.0-grid-reference.json
deleted file mode 100644
index d6ad244..0000000
--- a/tests/visual_tests/grids/text-spacing-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,153 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "2",
- "10",
- "11",
- "14",
- "16",
- "12",
- "13",
- "15",
- "3",
- "4",
- "5",
- "6",
- "17",
- "7",
- "8",
- "9"
- ],
- "data": {},
- "grid": [
- " !!!!!!! ###### $$$$$$$ %%%%%%% &&&&&&&&&&&&&&&&&& ",
- " !!!!!!! ####### $$$$$$$ %%%%%%% &&&&&&&&&&&&&&&&&&& ",
- " !!!!!!!! ####### $$$$$$$ %%%%%%% &&&&&&&&&&&&&&&&&&&& ",
- " !!!!!!! ####### $$$$$$$ %%%%%%% &&&&&&&&&&&&&&&&&&&& ",
- " !!!!!!!! ####### $$$$$$$ %%%%%%% &&&&&&&&&&&&&&& ",
- " !!!!!!! ####### $$$$$$$ %%%%%%% &&&&&&&&&&&& ",
- " !!!!!!!! ####### $$$$$$$ %%%%%%% &&&&&&&&&&& ",
- " !!!!!!! ####### $$$$$$$ %%%%%%% &&&&&&&&&& ",
- " !!!!!!!! ####### $$$$$$$ %%%%%%% ''''''' &&&&&&&&& ",
- " !!!!!!! ####### $$$$$$$ %%%%%%% '''''''''''' &&&&&&&&& ",
- " !!!!!!!! ####### $$$$$$$ %%%%%%% '''''''''''''''' &&&&&&&&& ",
- " !!!!!!! ####### $$$$$$$ %%%%%%% '''''''''''''''''' &&&&&&&&& ",
- " !!!!!!!! ####### $$$$$$$ %%%%%%% ''''''''''''''''''' &&&&&&&& ",
- " !!!!!!! ####### $$$$$$$ %%%%%%% ''''''''''''''''''''' &&&&&&&& ",
- "!!!!!!!! ####### $$$$$$$ %%%%%%% '''''''''''''''''' &&&&&&&& ",
- "!!!!!!! ####### $$$$$$$ %%%%%%% '''''''''''''' &&&&&&& ",
- "!!!!!!! ####### $$$$$$$ %%%%%%% '''''''''''' &&&&&&& ",
- "!!!!!! ####### $$$$$$$ %%%%%%% ''''''''''' &&&&&&&",
- "!!!!!! ####### $$$$$$$ %%%%%%% '''''''''' &&&&&&&",
- "!!!!! ####### $$$$$$$ %%%%%%% ''''''''' &&&&&&",
- "!!!!! ####### $$$$$$$ %%%%%%% ''''''''' &&&&&&",
- "!!!! ###### $$$$$$$ %%%%%%% '''''''' &&&&&",
- "!!!! ####### $$$$$$ %%%%%% '''''''' &&&&&",
- "!!!!! ####### $$$$$$ %%%%%% '''''''' &&&&&",
- "!!!!! ######## $$$$$$ %%%%%% '''''''' &&&&",
- "!!!!!! ####### $$$$$$ %%%%%% '''''''' &&&&",
- "!!!!!! ######## $$$$$$ %%%%%% '''''''' &&&&",
- "!!!!!!! ####### $$$$$$ %%%%%% ''''''' &&&&",
- "!!!!!!! ######## $$$$$$ %%%%%% ''''''' &&&&",
- " !!!!!!! ####### $$$$$$ %%%%%% ''''''' &&&&",
- " !!!!!!! ######## $$$$$$ %%%%%% ''''''' &&&&",
- " !!!!!!! ####### $$$$$$ %%%%%% ''''''' &&&",
- " !!!!!!! ######## $$$$$$ %%%%%% ''''''' &&&",
- " !!!!!!! ####### $$$$$$ %%%%%% '''''' &&",
- " !!!!!!! ######## $$$$$$ %%%%%% '''''' ",
- " !!!!!!! ####### $$$$$$ %%%%%% ''''''' ",
- " !!!!!!! ######## $$$$$$ %%%%%% ''''''' ",
- " !!!!!!! ####### $$$$$$ %%%%%% ''''''' ",
- " !!!!!!! ######## $$$$$$ %%%%%% '''''' ",
- " !!!!!!! ####### $$$$$$ %%%%%% '''''' ",
- " !!!!!!! ######## $$$$$$ %%%%%% '''''' ",
- " !!!!!!! ####### $$$$$$ %%%%%% '''''' ",
- " !!!!!!! ####### $$$$$$ %%%%%% '''''' ",
- " !!!!!! ###### $$$$$$ %%%%%% '''''' ",
- " !!!!!! ###### $$$$$$ %%%%%% '''''' ",
- " !!!! #### $$$$ %%%% '''''' ",
- " '''''' ",
- " ''''''' ",
- " ''''''' ",
- " ''''''' ",
- " '''''' ",
- " (((( )))) ''''''' ***",
- " (((((( )))))) ''''''' ***",
- " (((((( )))))) '''''' ***",
- " (((((( )))))) ''''''' ****",
- " (((((( )))))) ''''''' ****",
- " (((((( )))))) ''''''' ****",
- " (((((( )))))) ''''''' ****",
- " (((((( )))))) ''''''' ****",
- " (((((( )))))) '''''''' ****",
- " (((((( )))))) ''''''' ****",
- "++++++++++++ (((((( )))))) '''''''' *****",
- "++++++++++++++ (((((( )))))) '''''''' *****",
- "++++++++++++++ (((((( )))))) '''''''' *****",
- "++++++++++++++ (((((( )))))) ''''''''' ******",
- "++++++++++++++ (((((( )))))) '''''''''' ******",
- "+++++++++++++ (((((( )))))) '''''''''' *******",
- " (((((( )))))) ''''''''''' *******",
- " (((((( )))))) ''''''''''''' ******* ",
- " (((((( )))))) ''''''''''''''' ******** ",
- " (((((( )))))) ''''''''''''''''''' ******* ",
- " (((((( )))))) ''''''''''''''''''''' ******** ",
- ",,,,,,,,,,,,,,,,,,,,,,,, (((((( )))))) '''''''''''''''''''' ******** ",
- ",,,,,,,,,,,,,,,,,,,,,,,, (((((( )))))) '''''''''''''''''' ******** ",
- ",,,,,,,,,,,,,,,,,,,,,,,,, (((((( )))))) ''''''''''''''' ********* ",
- ",,,,,,,,,,,,,,,,,,,,,,,,, ((((((( ))))))) ''''''''''' ********* ",
- ",,,,,,,,,,,,,,,,,,,,,,,,, ((((((( ))))))) '''' ********** ",
- ",,,,,,,,,,,,,,,,,,,,,,,, ((((((( ))))))) ********** ",
- " ((((((( ))))))) *********** ",
- " ((((((( ))))))) ************* ",
- " ((((((( ))))))) *************** ",
- " ((((((( ))))))) ******************** ",
- " ((((((( ))))))) ********************* ",
- "----------------------------------- ((((((( ))))))) ******************* ",
- "----------------------------------- ((((((( ))))))) ***************** ",
- "----------------------------------- ((((((( ))))))) ************** ",
- "----------------------------------- ((((((( ))))))) ********** ",
- "----------------------------------- ((((((( ))))))) ",
- "---------------------------------- ((((((( ))))))) ",
- " ((((((( ))))))) ",
- " ((((((( ))))))) ",
- " ((((((( ))))))) ",
- " ((((((( ))))))) ",
- "............................................ ((((((( ))))))) ",
- ".............................................. ((((((( ))))))) //// ",
- ".............................................. ((((((( ))))))) ////////// ",
- ".............................................. ((((((( ))))))) /////////////// ",
- ".............................................. (((((( )))))) /////////////////// ",
- "............................................. ((((( ))))) ///////////////////// //",
- " //////////////////////// ///",
- " ////////////////////////// ////",
- " ////////// ///////////// /////",
- " //////// //////////// ///////",
- " /////// /////////////////////////",
- "000000000000000000000000000000000000000000000000000000000000000000 ///// ///////////////////////",
- "0000000000000000000000000000000000000000000000000000000000000000000 //////////////////////",
- "0000000000000000000000000000000000000000000000000000000000000000000 /////////////////// ",
- "0000000000000000000000000000000000000000000000000000000000000000000 //////////////// ",
- "0000000000000000000000000000000000000000000000000000000000000000000 /////////// ",
- "000000000000000000000000000000000000000000000000000000000000000000 /// ",
- " ",
- " ",
- " ",
- " ",
- " ",
- "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",
- "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",
- "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",
- "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",
- "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",
- "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",
- " ",
- " ",
- " ",
- " ",
- "22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
- "22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
- "22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-ttc-font-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/text-ttc-font-600-400-1.0-grid-reference.json
deleted file mode 100644
index 85e04d5..0000000
--- a/tests/visual_tests/grids/text-ttc-font-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,124 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "9",
- "2",
- "10",
- "3",
- "11",
- "4",
- "12",
- "5",
- "13",
- "6",
- "14",
- "7",
- "15",
- "8",
- "16"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !!! !!! # # ### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $$ $ %% % ",
- " $ $ $ $$$$ %% % %%%% ",
- " $$ $$ $ $$$$ %% %% % %%%% ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " & & & ' ' ' ",
- " & && & & &&& & ' '' ' ' ''''' ",
- " & &&& && & && & ' ''' '' ''' '' ' ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ( (( ) )) ",
- " ( ( (( (( ( (( (( ( ) ) )) )) ) )) ) ) ",
- " (( ( ( ( (( ( ( (( )) ) ) ) )) ) ) )) ",
- " (( (( ( ( ( ( ( )) ) ) ) ) ) ) ) ",
- " ( (( (( ( (( ( ( ((( ) )) )) ) )) ) ) ))) ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ** * * *** ++ + + +++ ",
- " ** * ****** ** * *** *** *** ++ + ++ +++ ++ + +++ +++ +++ ",
- " * * ** * * * * ** * * * * + + ++ + + + + ++ + + + + ",
- " * *** * * * * * * * * * ** + +++ + + + + + + + + + ++ ",
- " * ** *** ***** *** *** * * *** + ++ +++ +++++ +++ +++ + + +++ ",
- " ",
- " ",
- " ",
- " ",
- " ,, , ,,, -- - - ---- ",
- " ,, , ,, ,,,, --- - - - - -- -- - - - ",
- " ,,, , ,,,, ,,,,,,, ,, ,,,,,,,,,,,,---- - -------- ---- -- --------- ---- ",
- " , ,,, ,, ,,,, ,, ,, ,,, ,,,, ,,,,,---- - -- -- - -- -- --- ---- - -- ",
- " , ,,, ,, ,,,, , ,, ,, ,,,,,, ,, ,,-- --- - -- - -- -- --------- - ---- ",
- " , ,, ,, ,,,, ,, ,, ,,,, , ,,,, ,,,,,-- -- -- -- - - -- - ---- ---- - -- ",
- " , , ,,, ,, ,,, ,,,, ,,,,,, ,,,,,-- -- ---- ------- ------------ - ---- ",
- " ",
- " ",
- " ",
- " .. . .. .... // / // //// ",
- " ... . ... ... .. .. ... .....///../ /// /// /// // /// ///// /// ",
- " ... . .............. ... ..........///../ ////////////// /// //// ///// //// ",
- " . .. . .. .. .. .. .. .... .... ./.// / // // // // // //// //// / // ",
- " . ... . . .. .. .. .. ....... ./ //// / / // // // // /////// / /// ",
- " . ... .. .. .. .. .. ... .... ./ /// // // // // // / / //// / / ",
- " . .. ..... ... .... ..... ....... ./...// ///// /// //// ///// /////// / //// ",
- " ",
- " ",
- " 00 00 0000 11 11 1111 ",
- " 00 00 0 00000 11 11 1 11111 ",
- " 000 00 000 0000 000 00 000 111001100111 1111 111 11 111 11111 1111 ",
- " 0000 00 00000 0000 00000 000 00000 1111011011111 1111 11111 11 11111 111111 1111 ",
- " 0 00 00 00 00 0 00 00 00000 00 1011011011 11 1 11 11 11111 11 11 11 11 ",
- " 0 0000 0 00 0 00 0 000 00000 10 11110100 11 1 11 1 111 11111 11 11 1111 ",
- " 0 0000 00 00 0 00 00 0 00 00 10 1111 110011 1 11 11 1 11 11 11 11 111 ",
- " 0 000 00000 000 00000 00000 00000 10 111011111 111111111 11111 11111 11 11 11111 ",
- " 0 00 0000 000 0000 00000 00000 10 111001111 111 1111 1111 11111 11 11 1111 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-ttc-font-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/text-ttc-font-600-400-2.0-grid-reference.json
deleted file mode 100644
index 84058b5..0000000
--- a/tests/visual_tests/grids/text-ttc-font-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,124 +0,0 @@
-{
- "keys": [
- "",
- "1",
- "9",
- "2",
- "10",
- "3",
- "11",
- "4",
- "12",
- "5",
- "13",
- "14",
- "6",
- "7",
- "15",
- "8",
- "16"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " !! ! ## # ",
- " ! ! ! !!!! # # #### ",
- " !! !! ! !!!! ## ## # #### ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " $ $$ % %% ",
- " $ $ $$ $$ $ $$ $$ $ % % %% %% % %% % % ",
- " $$ $$ $ $ $$ $ $$ %% % % % %% % % %% ",
- " $$ $$ $ $ $ $ $ %% % % % % % % ",
- " $ $$ $$ $ $$ $ $ $$$ % %% %% % %% % % %%% ",
- " ",
- " ",
- " ",
- " ",
- " && & &&& '' ' ''' ",
- " && & && &&&& '' ' '' '''' ",
- " &&& & &&&& &&&&&&& && &&&&&&&&&&&&& ''' ' '''' ''''''' '' ''''''''''''' ",
- " & &&& && &&&& && && &&& &&&& &&&&& ' ''' '' '''' '' '' '''' '''' ''''' ",
- " & &&& && &&&& & && && &&&&&& && &&& ' ''' ' '''' ' '' '' '''''' '' ''' ",
- " & && && &&&& && && &&&& & &&&& &&&&&& ' '' '' '''' '' '' '''''' '''' '''''' ",
- " & & &&& &&& &&& &&&& &&&&&& &&&&&& ' ' ''' ''' ''' '''' '''''' '''''' ",
- " ",
- " ",
- " (( (( (((( )) )) )))) ",
- " (( (( ( ((((( )) )) ) ))))) ",
- " ((( (( ((( (((( ((( (( ((( )))(())(())) )))) ))) )) ))) ))))) )))) ",
- " (((( (( ((((( (((( ((((( (( ((((( ))))())())))) )))) ))))) )) ))))) )))))) )))) ",
- " ( (( (( (( (( ( (( (( ((((( (( )())())()) )) ) )) )) ))))) )) )) )) )) ",
- " ( (((( ( (( ( (( ( ((( ((((( )( ))))()(( )) ) )) ) ))) ))))) )) )) )))) ",
- " ( (((( (( (( ( (( (( ( (( (( )( )))) ))(()) ) )) )) ) )) )) )) )) ))) ",
- " ( ((( ((((( ((( ((((( ((((( ((((( )( )))())))) ))))))))) ))))) ))))) )) )) ))))) ",
- " ( (( (((( ((( (((( ((((( ((((( )( )))(()))) ))) )))) )))) ))))) )) )) )))) ",
- " *** ** ***+++ ++ ++++ ",
- " *** ** ** ****+++ ++ ++ ++++++ ",
- " **** ** ** ** ++++ ++ ++ +++ + ",
- " ***** ** ****** ***** ***** *** ++++***++ ++++++ +++++**+++++ +++ +++++ ++++++ +++++ ",
- " ** ** ** ****** ***** ******* *** ++ ++* ++ ++++++*+++++*+++++++ +++ ++ ++ +++++++ ++++++ ",
- " ** *** ** *** *** ** ** ** ****++ +++ ++*+++ +++ ++* ++ ++ +++++ ++ ++ ++ +++ ",
- " ** ** ** ** ** ** ** ** **++ ++*++*++* ++ ++**+++ ++ ++++ ++++++ ++ ++ +++++ ",
- " ** **** ** ** ** ** ** ++ *+++++*++* ++ ++**+++ ++ ++ +++ ++ ++ ++ ++++ ",
- " ** **** *** *** ** ** ** ++ **++++*+++ +++ ++ *++ ++ ,, ++ +++ ++ ++ ++ ",
- " --- **-- *** ****** **** *******,,, ***-,,,--**+++* ++++++* ++++*+++++++ ++,,,,,,,,+++++ ++ ++ ++++++ ",
- " ---- **-- *** **** -- *** ***** ,,,,*---,,,--**+++* *+++,,, *+++* +++++ +,,,,,,,,,+++++ ++ ++ +++++ ",
- " ---- -- --- ,,,,,---,,,-- ,,, ,,,, ,, ",
- " ----- -- ----- ------ ----- ,,,,,---,,, ,,,,,,, ,,,,,,,-,,,,,,,-- ,,, ,,,,,,, ,,,,,,,, ,,,,,,, ",
- " ------ -- -------- ------ -------- ,,,,,,--,,, ,,,,,,,,, ,,,,,,,,,,,,,,,,-- ,,,, ,,,,,,,, ,,,,,,,,, ,,,,,,,, ",
- " ------ -- --------------- ---------,, ,,,--,,, ,,,,-,,,, ,,,---,,,,-,,,,, ,,,,, ,,, ,,,, ,,,, ,,,, ,,, ,, ",
- " -- ---- -- --- --- --- --- ---,, ,,,,-,,,- ,,, ,,, ,,, ,,,---,,,, ,,,,,,, ,,, ,,, ,,, ,,,, ",
- " -- --- -- --- --- --- -- ---,, ,,,,,,,-,,,-----,,, ,,, ,,,----,,, ,,,,,, ,,,,,,,, ,, ,,, ,,,,,, ",
- " -- ------ -- --- --- -- ---,, ,,,,,,-,,,-----,,, ,,, ,,, ---,,,- ,,,, ,,,,,,,,, ,, ,,, ,,,,,,, ",
- " .... -- ...---- --- --- --- --- ////,, ,///,,.,,,,- ,,,, ,,, ,,, ,,,- ////// ,,,, ,,, ,, ,,, ,,,,, ",
- " .... -- ...---- --- ---...-- --- ////,, -///,,..,,,- ,,, ///, ,,,-- ,,,,- /////////,,, ,,,, ,, ,,, ,,, ",
- " ..... -- ...---- --------...----------/////, -///,,..,,,,,,,,, ///,,,,,,,,,,,,,-- ,/////////,,,,,,,,, ,, ,,, ,,,,,,,, ",
- " ...... -- ... --- .-------...----- --.-////// -///,,- .,/,,,,,- ///,,,,-,,,/,,,,- . ,///,,,,/ ,,,,,,,,, ,, //, ,,,,,,,, ",
- " ...... ... ....... ........ .....////// ///,, ///////,.////////,./////// .......///,,, ,//////// ,/////////,,,//////// ",
- " ....... ... ......... ........ ....../////// ///. /////////.////////./////////.......//// //////// ////////// //////// ",
- " ... .... ... .... .... ... .... ./// //// ///..//// ///// ./// ..//// .////... .////// /// /// ///// /// /// // ",
- " ... .... ... .... ... ... ... ///.//// ///.//// //// /// ../// ..///.... /////// /// //// /// //// ",
- " ... .... ... ... ... ... ... ///. //// ///.///.. ///../// ../// ..////..... /////// /////// /// /// ////// ",
- " 0000 ... 000..... ... ... ... .1111 ///. 111/////0///00 ..///../// ../// ...///....... 111111 ///////// /// /// /////// ",
- " 0000 ... 000..... ... ... ... .1111 ///. 111/////0///0000./// /// ../// ..//// .....1111111111//// // /// /// ///// ",
- " 00000 ... 000..... .... ....00... .11111 ///. 111/////0////000////11/// ../// ../// ...1111111111// /// /// /// /// ",
- " 000000... 000..... .... ....000... .111111/// 111/////00////0////111/// ..//// .////.. ./11111///11/// //// /// /// // /// ",
- " 000000... 000.....000000....00000000.. 111111/// 111/////111111////11111111//.111111///00..../1111///// /////111111/// 111/111111/////1111111 ",
- " 0000000.. 000 ...00000000..000000000..01111111// 111 //111111111//111111111//1111111110000.../1111//// //111111111// 11111111111///11111111 ",
- " 00000000 000 0000000000 000000000 0011111111 111 01111111111 111111111011111111110000 001111100 1111111111 11111111111 111111111 ",
- " 000 0000 000 00000 00000 000 00111 11110 111 111100011111 111 00011110001111000 000111111 11 1111 11111 111 111 11 ",
- " 000 0000 000 0000 0000 000 000111 1111 111 111100001111 111 0111100001111000 00001111111 111 1111 111 1111 ",
- " 000 00000 000 000 000 000 000111 11111 111 111000000111 111000011110000 111000 0000011111111 11111111 1111 111 1111111 ",
- " 000 0000 000 000 000 000 000111 1111 111 111 000111 01110000111 000 111000 000000011111 1111111111 111 111 11111111 ",
- " 000 0000000 000 000 000 000111 01111111 111 00111001110000111 000 111000 0000001111 11111111111 111 111 111111 ",
- " 000 0000000 0000 0000 000 000111 01111111 111 111100111 01111000 111000 00000111 1111 111 111 111 11111 ",
- " 000 000000 0000 0000 000 000111 000111111 1111 111100111 001111000 1111000 000111 111 1111 111 111 1111 ",
- " 000 00000 00000 0000 0000 00 00111 0000111111 01111011111 001111011011111011111000 0011111111111 1111 11111 111 111 111 11111 ",
- " 000 00000 0000000000 0000000 0011100000 11111 01111111111 00111111101111111111 000 001111111111 11111111111 111 111 111111111 ",
- " 000 0000 00000000 000000 01110000 1111 0011111111 001111110011111111 000 00111111111 1111111111 111 111 111111111 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-typographic-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/text-typographic-512-512-1.0-grid-reference.json
deleted file mode 100644
index cd1fdc8..0000000
--- a/tests/visual_tests/grids/text-typographic-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "keys": [
- "2",
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###########!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!############!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##########!!!!",
- " ! ! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!!!!!!!!!!",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!#########",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##!!#!!!!!!!!",
- " !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!",
- "!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!",
- "!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!#!!!!!!!!",
- "!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!!!!",
- "!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!!!!",
- "!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!!!!",
- "!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##!#######!!!!!!!",
- "!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!############!!!!!!!",
- "!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!########!###!!!!!!!",
- "!!!!!!!! !!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###############!!####!!!!!!",
- "!!!!!!!! !!!! !!! !!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!!####!##!!######!!!!!!",
- "!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!###############!!!!!!!",
- "!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##!!###############!!!!!!!",
- "!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#############!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##!!##!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##!###!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##################!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###############!###!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!! !!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###############!###!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#############!!!####!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!###############!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!###############!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!###############!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##!####!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !! !!!!!!!!!!!!!!!!!!!!!!!!!!#############!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!#############!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!##############!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !! !!!!!!!!!!!!!!!!!!!!!!!##############!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!###!!##############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!###!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!###!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!###!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!####!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!###!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!###!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!#######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!##!!!!!!!####!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!##########!!!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! ###########!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ###########!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! !!!!!! !!!!###!##!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!#############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!##############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !##############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ####!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##!! ####!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######### !# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!########## !!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!!#### # # # !!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!######## ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!######## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!############# ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!#!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##!!!!!!!########!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#####!##!#########!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!##!#####!###!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!########!!!###!!!####!!!!!!!!!!!!!! !!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!!####!##!!######!!!!!!!!!!!!!! !!!! !!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!###############!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!###############!!!!!!!!!!!!!!!!! !!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!#############!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!##!##!!#######!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!#######!!#######!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!#####!!!!######!!####!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!####!!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!###!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!###!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! !!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!###!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!####!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!####!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!###!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!##!####!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!##########!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!",
- "!!!!!!!!!!!!!###############!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!",
- "!!!!!!!!!!!!####!##########!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!",
- "!!!!!!!!!!!!###!!###!####!!!!###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!",
- "!!!!!!!!!!!####!!##############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! !!!!!!!!!!!",
- "!!!!!!!!!!!####!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!",
- "!!!!!!!!!!!!###!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!! !! !!!!!!!!!!!",
- "!!!!!!!!!!!!###!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!",
- "!!!!!!!!!!!!###!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!",
- "!!!!!!!!!!!!###!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!",
- "!!!!!!!!!!!!###!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!",
- "!!!!!!!!!!!!###!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!",
- "!!!!!!##!!!!###!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!!!!!!!!!!",
- "!!!############!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!!!!!!!!!!"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-typographic-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/text-typographic-512-512-2.0-grid-reference.json
deleted file mode 100644
index 83c913e..0000000
--- a/tests/visual_tests/grids/text-typographic-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "keys": [
- "2",
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#####!####!!!",
- " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!################",
- "! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#############!!!",
- "! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#########!###!!!",
- "! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#########!!!!!!!",
- "!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!!!!!!",
- " !!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!!!!!",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!!####",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!######",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!######",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!#######",
- " ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!###########!!######!",
- "!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!!###########!!######!",
- "!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#####!!###########!!######!",
- "!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!################!!!#######!",
- "!! !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!################!!!#######!",
- "!! !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#################!!!#######!",
- "!! !!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!########!!!!#######!",
- "!! !!!!!! !!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!#####!!!!!######!",
- "!! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!################!",
- "!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!###############!!",
- "!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!#################!!",
- "!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!##################!!",
- "!!!!!!! ! !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!########!###############!!!!!",
- "!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!#########!###############!!!!!",
- "!!!!!!!!!!!!!!! !!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!!##################!!!!###!!!!!!!",
- "!!!!!!!!!!!!!!! !!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!########################!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!########!##################!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##################!!!#######!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##########!!######!!!#######!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!########!!!!!####!!!!#######!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!! !!! !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!########!!!!!!!!!!##########!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!! ! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!################!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!################!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##########################!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!! !!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##########################!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#########################!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!##!!!###########!!###############!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!####!!############!#########!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!##################!!!#####!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!##################!!!#####!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! !!!!!!!!!!!!!!!!!!!!!###############!!!!!!#####!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! !!!!!!!!!!!!!!!!!!!!################!!!!!!#####!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! !!!!!!!!!!!!!!!!!!!!#######!!!!!!!!!!!!!#######!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!! !!!! !!!!!!!!!!!!!!!!!!!!#######!!!!!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!!!!!!!!!!!!!!!!!!#######!!!!!#############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!#######!!!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!#######!!################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!#######!!################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!#######!!################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!##########!!!############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!###########!!!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! ##############!!!##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!###########!!#####!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!########!!!!!#####!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! !!!########!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!!!!!!#######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!!!!!!#######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!! !!!!################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!###################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!###################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!! !# !#################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##### ###########!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######### !###!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!############ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#### ##### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#### ####! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#### ####! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#### !!! ###### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##### ### ###### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##### ### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##### ## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######! # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!####!!!!# # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##!!!###########!!!!# # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###!!###########!!!!####!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!################!!!!!##!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#################!!!######!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!################!!!######!!! !!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!##################!!!######!!! !!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!###############!!!!!!######!!! !!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!!!!!!!!!!#######!!! !!!! !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!!!!!###########!!!!! !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!######!!!!################!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!###################!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!###################!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!#################!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!###!!!!!!!!!#!!!!##############!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!####!!###!!!#!!!!#########!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!#############!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!########!####!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!##############!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!##########!!!!!!!!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!########!!!!!!!!!!!!!#######!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!########!!!!!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!#######!!!!!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!#######!!!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!#######!!!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!#######!#################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!!#######!#################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!##!!!###########!!!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!",
- "!!!!!!!!!!!####!!############!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!",
- "!!!!!!!!!!!##################!!#######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!",
- "!!!!!!!!!!!##################!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!",
- "!!!!!!!!!!!###############!!!!!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!",
- "!!!!!!!!!!################!!!!#######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!! !!!!!!!!!!",
- "!!!!!!!!!!#######!!!!!!!!!!!!!#######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! ! !!!!!!!!!!!",
- "!!!!!!!!!!#######!!!!!!!!####!#######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!",
- "!!!!!!!!!!#######!###!!##############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! !!!!!!!!!!!",
- "!!!!!!!!!!#######!###################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!",
- "!!!!!!!!!!#######!################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!!!!!!!!!",
- "!!!!!!!!!!#######!!##############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!!!!!!!!!",
- "!!!!!!!!!!#######!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!! !!!!!!!!!!!!",
- "!!!!!!##########!!###############!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! !!!!!!!!!!!!",
- "!!!!!!###########!######!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!! !!!!!!!!!!!!"
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-vertical-alignment-800-800-1.0-grid-reference.json b/tests/visual_tests/grids/text-vertical-alignment-800-800-1.0-grid-reference.json
deleted file mode 100644
index dd3bd2a..0000000
--- a/tests/visual_tests/grids/text-vertical-alignment-800-800-1.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "12",
- "2",
- "10",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " !!!! ",
- " !!!!!!! !!!!! ",
- " !!!!!!!!! !!!!!!! !!! ",
- " !!!!!! !!!!! ! !!!!!!!! !!!!! ",
- " !!!!!! !!!!!! ! !!!!!!!!!!!! !!!!!!!! ! ",
- " !!!!!! !!!!! !!!!!!!!!!!!!!!! !!!!!!!!!! !!!! ",
- " !!!!!! !!!!! !!!!!!! ! !!!!!!! !!!!! !!!!!! !!!!!! ",
- " !!!!!! !!!!!! !!!!!!! ! !!!!!!!!! !!!!!! !!!!! !!!!! ",
- " !!!!!!! !!!!!! !!!!!!! ! !!!!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!!! !!!!! !!!!!!! ! ! !!!!!! !!!!! !!!!! !!!!!! ",
- " !!!!!!! !!!!! !!!!!!! !!!!!!!!! !!!!!! !!!!!! !!!!! ",
- " !!!!!! !!!!!! !!!!!!! !! !!!!!!! !!!!!! !!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!!! !!!!!!! ! !!!!! !!!!! !!!!!! ",
- " !!!! !!!!! !!!!! ! ! !!!!!!! !!!!!!! !!!!!! !!!!! ",
- " !! ! !!!!! !!!!!! !!!!!!! !!!!!! !!!!!! !!!!!! ",
- " !! !!!!!! !!!!! !!!!!!! !!!!!!! !!!!! !!!!! ",
- " !!!!!! !!!!!! ! !!!!!!! !!!!!!! !!!!! !!!!!! ",
- " !!!!! !!!!!! !!!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! !!!!!!!! ",
- " !!!!!!!!! ! !!!!!!! !!!!! ",
- " !!!!!! !!!!! !!! ",
- " ### !!! # ! !!!! $$$ ",
- " ##### ! # ##### ! $$$ ",
- " ######## # ####### ## # $$$ ",
- " ########### ############ ##### # ## $$$ ",
- " ###### ###### ############### ######## #### $$$ ",
- " ####### ##### ###### ## ##### ########## ##### $$$ ",
- " ###### ##### ###### ######### ##### ##### ##### $$$ ",
- " ###### ###### ######## ######### ###### ###### ###### $$$ ",
- " ###### ###### ##### ## ### ##### ###### ###### ###### $$$ ",
- " % ###### ##### ####### # ##### ##### ##### ##### $$$ ",
- " % ####### ##### ##### # # ####### ##### ###### ###### $$$ ",
- " % ###### ###### ###### ## # ###### ###### ###### ##### $$$ ",
- " % #### ##### ###### # ######### ##### ##### ###### $$$ ",
- " %%% ## ##### ###### # ######### # ##### ###### ###### $$$ ",
- " %%% ###### ###### # ####### ###### ##### ##### $$$ ",
- " %%% ###### ###### ## ###### ###### ###### ###### $$$ ",
- " %%% ##### ###### # ####### ###### ########### $$$ ",
- " %%% ##### ###### ############### ####### $$$ ",
- " %%% ###### ##### # ########### ##### $$$ ",
- " %%% ########### ########### # ## $$$ ",
- " %%% ######## # ###### # $$$ ",
- " %%% ##### ##### # $$$ ",
- " %%% ### ## # # $$$ ",
- " %%% & # $$$ ",
- " %%% && &&&&& &&&&&&& $$$ ",
- " %%% &&&&&&& &&&&&&&&& &&&&&&&&&& $$$ ",
- " %%% &&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&&& $$$ ",
- " %%% &&&&&&&&&&& &&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& &&&&&&&& &&&&& $$$ ",
- " %%% &&&&&&&&&&&&&& &&&&&&& &&&&&&& &&&&&&& &&&&&&&&& &&&&&& &&&&& $$$$ ",
- " %%% &&&&&&& &&&&& &&&&&&& &&&&&& &&&&&&&& && &&&&& &&&&& &&&&& $$$$ ",
- " %%% &&&&&& &&&& &&&&&& &&&&&& &&&&&&& & &&&&& &&&&& &&&& $$$$ ",
- " %%% &&&&&& &&&&& &&&&& &&&&&& &&&&&&& & &&&& &&&&&& &&&& $$$$ ",
- " %%% &&&&& &&&& &&&&& &&&&&& &&&&&& && &&&& &&&&& &&&& && $$$$ ",
- " %%% &&&&& &&&& &&&&& &&&&&& &&&&&&& &&&&&& &&&&& &&&&& &&&&& $$$$ ",
- " %%% &&&& &&&& &&&&&& &&&&&& & &&&&&&&& &&&&& &&&&&& &&&&&&&&&&&&&& $$$$ ",
- " %%% && & &&&&& &&&&&&& &&&&&& &&&&&& &&&&&&&&&&&&& &&&&&&&&&&& $$$$$ ",
- " %%% && &&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&& &&&&&&&&& $$$$ ",
- " %%% &&&&&&&&&&& &&&&&&&&&&& & &&&&&& &&&& $$$$ ",
- " %%%% &&&&&&& & &&&&&& & $$$$$$ ",
- " %%%% && && & $$$$$ ",
- " %%%% $$$$ ",
- " %%%% $$$$ ",
- " %%%% '''''''' $$$$$ ",
- " %%%%%% ''''''''''' $$$$$ ",
- " %%% '''''''' $$$$$ ",
- " %%%% ''' $$$$ ",
- " %%%% ''''''''''''''''''''''''' $$$$ ",
- " %%%%% ''''''''''''''''''''''''' $$$$ ",
- " %%%% (( (( ''''''''''''''''''''''''' $$$$$ ",
- " %%%% ((((((((( (((((((( ''''''''''''''''''''''''' $$$$ ",
- " %%% % (((((( ((((((((( (((((((((((( (((((((((((( $$$$ ",
- " %%% (((((((((( (((((((((((( ((((((((((((((( (((((((((((((( $$$$$ ",
- " %%%% (((((((((((((( (((((((((((((((( (((((((((( (((((( ((((((( (((( $$$$ ",
- " %%%% ((((((( (((((( ((((((( (((((( ( ((((((( ((((( ((((( (((((( (((( $$$$$ ",
- " %%%%% ((((((( (((( (((((( (((((((( (((((((( (( (((( ((((( (((( ( $$$$ ",
- " %%% % (((((( (((( (((((( (((( (((((( ( ((((((( ((((( ((((( (( $$$$ ",
- " %%% ((((( (((( ((((( ( ((((( (((((((( (((((( (((((( (((( ((( $$$$ ",
- " %%%% ((((( (((( ((((( (((((( ( (((((((( (((((( ((((( (((( (((( $$$$$ ",
- " %%%% (((( (((( (((((( (((((( ( ((((((( ((((( (((((( ((((( (((((( $$$$$$ ",
- " %%%%% (( ((((( (((((( (((((( (((((((( (((((((((((((( ((((((((((((( $$$$ $ ",
- " %%%% (((((( (((((( ) ((((((((((((( ( (((((((((((( ((((((((( $$$$ ",
- " %%% ((((((((((( * ) ((((((((((((( ( (((((((( (((((( $$$$ ",
- " %%% (((((((( **** ) (( ((((((( ( ((( $$$$$ ",
- " %%%%%% (((( ***** ))) ( (((( (( $$$$$ ",
- " %%%%% ***** ))) (( ( ++++++++++++ + + $$$$ ",
- " %%%% ****** ))) +++++++++++++++++++++++++++++++++++++ ++ $$$$ ",
- " %%%% ******* )))) ,,, +++++++++++++++++++++++++++++++++++++ ++ $$$$$ ",
- " %%%% ****** )))) ,,, +++++++++++++++++++++++++++++++++ + $$$$$ ",
- " %%%%% ****** ))) ,,, ------ +++++++++++++++++ $$$$$ ",
- " %%%% ******* ))) ,,,, --------------------------------- + +++++++ $$$$ ",
- " %%%% ****** ))) ,,,, ----------------------------- ++++++ + $$$$ ",
- " %%%% ******* ))) ,,, ----------------------------- +++++ + $$$$$ ",
- " %%%%% ****** )))) ,,, +++++ $$$$ ",
- " %%%%% ****** )))) ,,, ++++++ $$$$ ",
- " %%%% ******* ))) ,,, +++++ $$$$$ ",
- " %%%% ******* ))) ,,, .. . ++++ $$$$ ",
- " %%%% ****** ))) ,,,, . ... ................................. ++++ $$$$$ ",
- " %%%% ******* ))) ,,,, ............................................ ++++ $$$$ ",
- " %%%% ******** )))) ,,, ........................................... ++++ $$$$$$ ",
- " %%%% ***** )))) ,,, . ................. ++++++ $$$$ ",
- " %%%% ******* ))) ,,, ....... . . ++++++ $$$$$ ",
- " %%%% * ****** ))) ,,, ..... . . ++++++ $$$$ ",
- " %%%%% ***** ))) ,,,, .... . ++++ $$$$ ",
- " %%%%%% ******* //////// ))) ,,,, . ... . ++++ $$$$ ",
- " %%%% ******* /////////////// ))) ,,,, ..... +++++ $$$$ ",
- " %%%%% ****** ////////////////////// )))) ,,, ...... ++++ $$$$ ",
- " %%%%% ******* ////// ////////////// )))) ,,, ...... ++++ $$$$ ",
- " %%%% ******* //////// ///////// ))) ,,, ..... +++++ $$$$ ",
- " %%%% ****** // ///// //// ))) ,,, ..... ++++++ $$$$ ",
- " %%%% ****** //////// ///// ))) ,,,, .. ..... 00000000000000000000000000000 +++++ $$$$ ",
- " %%%% ******* / ////// //// ))) ,,,, .... 000000000000000000000000000000000 ++++ ++ $$$$ ",
- " %%%% ***** / /////// //// ,,, .... 00000000000000000000000000000 +++ $$$$ ",
- " %%%% ***** /////// //// ,,, ..... +++ $$$$ ",
- " %%%% *** ////// ///// ,,, ...... +++++ + $$$$ ",
- " %%% * ///// //// ,,, ..... +++++ $$$$ ",
- " %%% /////// //// ,,, ... ++++++ $$$$ ",
- " %%% ///// //// ,,, ..... +++++ $$$$ ",
- " %%% ////// ///// ..... +++++++ $$$$ ",
- " %%% /// //// ..... ++++++++++++++++ + ++++++ ++++ + $$$$ ",
- " %%% //// /// ... . ++++++++++++++++++++++++++++++++++++++++++++++ $$$$ ",
- " %%% //// /// . ..... +++++++++++++++++++++++++++++++++++++++++++++ $$$$ ",
- " %%% /////// //// ...... +++++++++++++++++++++++++++++++++ + $$$$ ",
- " %%% ///// //// .... ++ +++ + $$$$ ",
- " %%% ///// //// ..... + +++ $$$$ ",
- " %%% /////// /// ...... $$$$ ",
- " %%% / //// /// ..... . $$$$ ",
- " %%% ////// /// ....... $$$$ ",
- " %%% ////// /// ...... $$$$ ",
- " %%% ////// //// ....... ... . $$$$ ",
- " %%% //// //// . .......... $$$$ ",
- " %%% /// /// . .......................................... $$$$ ",
- " %%% ////// /// ........................................... $$$$ ",
- " %%% ////// /// ......................................... $$$$ ",
- " %%% ///// /// . .. $$$$ ",
- " %%% /////// /// .. $$$$ ",
- " ////// //// $$$$ ",
- " ///// ///// $$$$ ",
- " / ///// ///// $ ",
- " / ///// ////// $ ",
- " /////// ////// $ ",
- " ///// ///// ",
- " ////// / ////// ",
- " / /////// / ////// 1 ",
- " ///////////// ///// 1 1 1 11 11 1 111 1111 1 11 11 11 ",
- " /////////////////////// 11111111111111111111111111111111111111111111111111 ",
- " ///////////////////// 111111111111111111111111111111111111111111111111111111 ",
- " / / ///////////// 11111111111111111111111111111111111111111111111111 ",
- " / / //// 1111111111 ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/text-vertical-alignment-800-800-2.0-grid-reference.json b/tests/visual_tests/grids/text-vertical-alignment-800-800-2.0-grid-reference.json
deleted file mode 100644
index eb84e71..0000000
--- a/tests/visual_tests/grids/text-vertical-alignment-800-800-2.0-grid-reference.json
+++ /dev/null
@@ -1,224 +0,0 @@
-{
- "keys": [
- "",
- "9",
- "8",
- "4",
- "5",
- "7",
- "16",
- "6",
- "2",
- "10",
- "12",
- "13",
- "14",
- "11",
- "3",
- "15",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " !!!! ! ! ",
- " !!!!!! ! !!!! ! ",
- " !!!!!!!!! !!!!!! ! !!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! !!! !!!!!! ",
- " !!!!!!!!!!!!!!! !!!!!!!!!!!!!! !! !!!!!!! ",
- " !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! ! ! !!!!!!!!!!!!! !! ",
- " !!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!! !!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!! !!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!! ! ! ! !!!!!!!!!!!!!!!!!! ! !!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!! ! !!!!!!!!!!!!!! !!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!!! !!!!!!!!!! ! ! !!!!!!!!!!!! !!! !!!!!!!!!!! !!!!!!!!!!! ! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ! !!!!!!!!!!!! !!! ! ! !!!!!!!!!!!! !!!!!!!!!!! ! ! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!!!!! !!!!!!!!!!! ! !!!!!!!!!!!!!! ! !!!!!!!!!!! ! !!!!!!!!!!!!!! !! !!!!!!!!!! !!!!!!!!!! ",
- " !!!!!!!!! !!!!!!!!!! ! !!!!!!!!!!!! ! !!!!! !!!!!!!!!!! !!!!!!!!!!!! ! !! !!!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!!! !!!!!!!!!! !! !!! !!!!!!!!!!!! !! ! ! !!!!!!!!!!!!!!! !! !!!!!!!!!! ! ! ! !!!!!!!!!! !!!!!!!!!!! ",
- " !!!!!!! !!!!!!!!!!! !!! !!!!!!!!!!!!!! ! !! ! !!!!!!!!!!! ! !!!!!!!!!!!! !! !!!!!!!!!! !!!!!!!!!! ",
- " !!! !!! !!!!!!!!!!!! !!!!!!!!!!! ! !! ! !!!!!!!!!!! !!!!!!!!!!! ! ! !!!!!!!!!!!!!!!!!!!!! ",
- " !!! !!!!!!!!!! !!!!!!!!!!! !!! ! !!!!!!!!!!!!!!!!!!!!! ! !! !!!!!!!!!!!!!!!!!!! ",
- " !! !!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!! ",
- " !!!!!!!!!!!!!!!! !!!! ! !!!!!!!!!!!!!!! ! !!!!!!!!!!!!! ",
- " ## !!!!!!!!!!!!! !! ## ! !!!!!!!!!!!!! !! !!!!!!!!!!! ",
- " ##### !!!!!!!!!!!!! ! # ##### # ! !!!!!!!!!! !!!!!!! ",
- " ######## !!!!!!!!!!! ! ! # ###### ## ! !!!!!!!!! ! ! ### !!!!! $$$$$$ ",
- " ########## !!! !!!!!! ! ########## # ! !!!!! ! ! ######## !! $$$$$$ ",
- " ############## !!!!! !! ############## # ! !! ! ######### # $$$$$$ ",
- " ################ ! ! # ############## ! ! ### ########## #### $$$$$$ ",
- " ################### !!! ###################### # ############ ##### $$$$$$ ",
- " ##################### # # ###################### ################ ####### $$$$$$$ ",
- " % ############ ########### # ############ ########## ################### ########## $$$$$$ ",
- " % ############ ########## ############ ############### ##################### ########### $$$$$$$ ",
- " % ############ ########## ## ############ ## ############ ########### ############ ########### $$$$$$$ ",
- " % ############ ########### ############## ## ## ############ ### ############# ########### ########### $$$$$$ ",
- " % ########### ########## # ########### # ## # # ############## ############ # # ########## ########## $$$$$$$ ",
- " % ######### ########## ############ # # ## # # ########## # ########## # ## # ############ ########### $$$$$$ ",
- " % ###### ########## ############# # ## # ############## ############# ### # # ########### ########### $$$$$$$$$ ",
- " %%%%%%% ##### ########### # ############### # ########## # ############### # ## ########## ########### $$$$$$$ $ ",
- " %%%%%%% ## ########## ########### # ## # ############ #### ########### ### ##################### $$$$$$ ",
- " %%%%%%% ########## # ############ # ### # ############ ########### # ################## $$$$$$$$$$$$ ",
- " %%%%%%% ############ ########### # # ### ####################### ## ############### $$$$$$ ",
- " %%%%%%% ###################### # # #################### # ############# $$$$$$$$ ",
- " %%%%%%%% # ##################### ## # ################# # # ########## $$$$$$$$$ $ ",
- " %% %%%%%%% ## ################# ## # ## ################ ## ####### $$$$$$ ",
- " %%%%%%%%% # ############### # ## # ############# # ##### $$$$$$ $ ",
- " %%%%%%% # ############& ## & # ######### # # ## $$$$$$$$$$$ ",
- " %%%%%%%%% # # ####### #& # && &&# # ###### ## $$$$$$ $ ",
- " %%%%%%%%% ## ########&#### && &&&&&&# ##### &&&&&&&&&&& $$$$$$$$$ ",
- " % %%%%%%%% &&&&&&& # ### &#&&&&&&&&& && &&&&&&&&&&# &&&&&&&&&&&&&&& $$$$$$$ ",
- " % %%%%%%%% &&&&&&&&&& &&#&&&##&&&&&&&& & & &&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&& $$$$$$ ",
- " %%%%%%%% &&&&&&&&&&&&& && &&###&&&&&&&&&&& && &&&&&&&&&&&&&&&&& && &&&&&&&&&&&&&&&&&& $$$$$$$ $ ",
- " %%%%%%%%%% &&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&&&&& $$$$$$ $ ",
- " %%%%%%% &&&&&&&&&&&&&&&&&&& & & &&&&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&&&&&&& $$$$$$$ $ ",
- " %%%%%%% &&&&&&&&&&&&&&&&&&&&& && &&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&& $$$$$$$ $ ",
- " %%%%%%% &&&&&&&&&&&& &&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&&&&&& &&&&&&&&&&&&&&& &&&&&&&&&&&& & &&&&&&&&&&&&& &&&&&&&& & $$$$$$ $ ",
- " %%%%%%%%% &&&&&&&&&&& &&&&&&&&& && &&&&&&&&&& & && &&&&&&&& & && &&&&&&&&&&& & &&&&&&&&&&&&&& && &&&&&&&&&& &&&&&&&& && $$$$$$$$$ ",
- " % %%%%%%% &&&&&&&&&& &&&&&&&& & && &&&&&&&&&&& & && &&&&&&&& &&& &&&&&&&&&&& & & & &&&&&&&&&& &&&&&&&&&&&&& &&&&&&&& &&&&& $$$$$$ $ ",
- " %%%%%% &&&&&&& &&&&&&&& & &&&&&&&&&&& & & & &&&&&&&&& &&&&&&&&&&&& &&& & && &&&&&&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&& $$$$$$$$$ ",
- " %%%%%%%%% &&&&&& &&&&&&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&&&&&&&&& &&& & &&&&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&& $$$$$$$ ",
- " %%%%%% && &&& &&&&&&&&&&&&&&&&&&&& & & &&&&&&&&&&&&&&&&&&& && & &&&&&&&&&&&&&&&&& &&&& &&&&&&&&&&&&&&&& $$$$$$$$$$ ",
- " %%%%%%%%% && & &&&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&& & && &&&&&&&&&&&&& $$$$$$$ ",
- " % %%%%%%&& &&&&&&&&&&&&&&&& && & &&&&&&&&&&&&&&& && & &&&&&&&&&&&&&& & & &&&&&&&&&&& $$$$$$$ ",
- " % %%%%&&& &&&&&&&&&&&&&&& & &&&&&&&&&&&&& && & &&&&&&&&&& && & &&&&&&& $$$$$$$$$$ ",
- " % %%%%%& &&&&&&&&& &&& & &&&&&&&&&&& && & & &&&& & && & $$$$$$ ",
- " %% %%%%%% &&&&& &&&& & & & & &&&&& && '''''''''' $$$$$$$ $ ",
- " %% %%%%%% & & & & ''''''''''$$$$$$$$$ $ ",
- " %%%%%%% &&& & ''''''''''''''''' $$$$$$$ $ ",
- " %%%%%%%%% ''''''''''''''''' $$$$$$$$$$ ",
- " %%%%%% '''''''''' $$$$$$$$$ ",
- " %%%%%%%%% ''''''''''''''''''''''''''' $$$$$$$$$ ",
- " %%%%%% ( (( ''''''''''''''''''''''''''' $$$$$$$ ",
- " % %%%%%% (( (( (((( (( ((((((( ''''''''''''''''''''''''''' $$$$$$ ",
- " % %%%%%% ( ( ( (((((((( (( (((((((((((( ((((((((((( ''''''''''''''''''''''''''' $$$$$$$$$$ ",
- " %%%%%% ((((((((( ( (((((((((((( ( ((((((((((((((( (( ((((((((((((((( ''''''''''''''''''''''''''' $$$$$$$ ",
- " %% %%%%%% ((((((((((((( ( ((((((((((((((( ((((((((((((((((((( (((((((((((((((((( '''''''''''''''''''''''''''$ $$$$$$ ",
- " % %%%%%%% (((((((((((((((( ( ((((((((((((((((( ( (((((((((((((((((( ( ((((((((((((((((((( $$$$$$$$$$ ",
- " %%%%%%% (((((((((((((((((( (((((((((((((((((((( ( ((((((((((((((((((((( ( ((((((((((((((((((((( ( $$$$$$ ",
- " %%%%%%%%% ((((((((((((((((((((( ((((((((((((((((((((((( ( ( ((((((((((((((((((((((( ((((((((((((((((((((((((( ((( $$$$$$$$$$ ",
- " %%%%%% (((((((((((((((((((((( ( (((((((((((( (((((((((( ( ( (((((((((((((( (((((((((( (((((((((( ( ( (((((((( ((( $$$$$$$ ",
- " %%%%%%%%% ((((((((((( (((((((( (((((((((((( ((( ((((((((( ( ((((((((((((( ((( ( ((((((((( ( ( ((((((((((( ( ( (((((((( (( ((( $$$$$$ ",
- " %%%%%% (((((((((( (((((((( ((((((((((( ( ((((((((((( (( ( (((((((((( (( ( ( ((((((((((((( ((((((((((( ( ( ( (((((((( ((((((( $$$$$$$$$$ ",
- " %%%%%% ((((((((( ((((((( ( (((((((((( (( ((((( ((((((((( (((((((((((( ( (((( (( (((((((((( ((((((((((( ((( ( ((((((((((((((((( $ $$$$$$ ",
- " %%%%%%%%% (((((( ((((((((( ((((((((((( ( ((( (((((((((((((((((((((( (( ( (((((((((((((((((((( (( (((((((((((((((( $$$$$$$$$$$ ",
- " %%%%%% (((( (((((((((((((((((((( ( )) ( (((((((((((((((((( ( ( ( ( ((((((((((((((((( ( ( ((((((((((((((((( $$$$$$$ $$$ ",
- " % %%%%%%%%% (( (((((((((((((((((((( (()) ((((((((((((((((((( (( ((((((((((((((((((( ( * * * ***(**(**((((((((( $$$$$$ $ $ ",
- " % % %%%%%% ((((((((((((((((())((()) ( (((((((((((((((( ( (((((((((((((((( ( ( * * * * * (*((*(*(**(**** $$$$$$$ $$ $ ",
- " % % %%%%%% ((((((((((((( ()))))) ( (((((((((((((( ( (( ((((((((((((((( * ( * * * * * *((*(*((* * * $ $$$$$$$ ",
- " %%%%%%%%%% (((((((((((()(())) +++++( ((((((((((( ( ( ((((((( ( ( ********************** *(* ** * ** $$$$$$$$$ ",
- " %%%%%% (((((((((()))())) +++++++ ( (((((( (( ( ((( ( (************************************* ** $$$$$$$ ",
- " %%%%%%%%% ((( (())()))))) ++++++ ( ( (, ( ( (( (( ( ( *************************************** ** $$$$$$ ",
- " %%%%%% ( ( )((()))))) ++++++ ( ,,,,,,, ((( (( ***************************************** * $$$$$$$$$$ ",
- " %%%%%% ())))))))))) ++++++ ,,,,,,, ------------------------ ****************************************** * $$$$$$$ ",
- " %%%%%%%%% ))))))))))) ++++++ ,,,,,, ----------------------------- ********************************************* $ $$$$$$$$$ ",
- " %%%%%% )))))))))) +++++++ ,,,,,, ----------------------------- * ** * * **************************** * $$$$$$$$ $ ",
- " %%%%%%%%% ))))))))))) +++++++ ,,,,,, ----------------------------- ** *** * * * ** ************* $$$$$$$ $ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,, -----------------------------... .. * * * * ********** $ $$$$$$$ $$ ",
- " %%%%%% )))))))))) ++++++ ,,,,,,, ----------------------------- . .. * ******** ** $$$$$$$ ",
- " %%%%%%%%% ))))))))))) ++++++ ,,,,,,, . . .--------------.... . . * ********* $$$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,,, .. .. . ... . . . . . ............... * ******* $$$$$$$$$$ ",
- " %%%%%% )))))))))) +++++++ ,,,,,, .. . ...................................... * ******** * $$$$$$ ",
- " %%%%%%%%% ))))))))))) +++++++ ,,,,,, ............................................. * ****** * * $$$$$$$$$$ ",
- " %%%%%% ))))))))))) ++++++ ,,,,,, . ............................................ ******** * * $ $$$$$$ ",
- " %%%%%%%%% )))))))))) / // ++++++ ,,,,,, ............................................... ********* $ $$$$$$$$$ ",
- " % %%%%%%% ))))))))))) / / /// ++++++ ,,,,,,, .............................................. ******** $$$$$$$ $ ",
- " % %%%%%%% ))))))))))) /// / / / // / ++++++ ,,,,,,, .. ............................................ *********** $$$$$$$ $ ",
- " % %%%%%%% )))))))))) / / //// ////// / / +++++++ ,,,,,, ............. . . . . ...... ... . . ******** $$$$$$ $$ ",
- " %%%%%% ))))))))))) / //////////// / / / +++++++ ,,,,,, ......... . .. ******** $$$$$$ ",
- " %%%%%%%%% )))))))))) / / //////////////////// +++++++ ,,,,,, . . ........ . . . ********** $$$$$$ $ ",
- " %%%%%% )))))))))) / / //////////////////////// ++++++ ,,,,,, . . ......... . ******* $$$$$$$$$ $ ",
- " %%%%%% ))))))))))) / ////////////////////////////// ++++++ ,,,,,, ... ........ ******* $$$$$$$$$ ",
- " %%%%%%%%% )))))))))) / ///////////////////////////// ++++++ ,,,,,,, ........ ********** $$$$$$$ ",
- " %%%%%% )))))))))) ////////////////////////////////++++++ ,,,,,,, ......... 00000000000000000000000000000 ******* $ $$$$$$$$$ ",
- " %%%%%%%%% ))))))))))) / ///////////// / //////////////+++++++,,,,,, .......... 00000000000000000000000000000 ********* $ $$$$$$ ",
- " % %%%%%% )))))))))) /// ////////// / ///// / ////////+++++++,,,,,, ........ . 000000000000000000000000000000000000 ********* $$$$$$ $ ",
- " %%%%%% )))))))))) //////////// // / / ///////////++++ ,,,,,, ....... 000000000000000000000000000000000000 ****** $$$$$$$$$$ ",
- " % %%%%%% )))))))))) /////////////// //////// ,,,,,, ........... 00000000000000000000000000000 ************* $ $$$$$$ ",
- " % %%%%%% ))))))) ////////////// ///////// ,,,,,,, ...... . 00000000000000000000000000000 ******* $ $$$$$$ ",
- " % %%%%%% ))))) ///////// /////// /,,,,,,, ......... . 000000000000000000 ********** $$$$$$$ ",
- " % %%%%%% )))) /// ////////// /////////,,,,,,, ........ * * ******** *** $$$$$$$$$ ",
- " % %%%%%% ) /////// / ////////,,,,,, ...... * ** ** * * * ******* * *$ $$$$$$$ ",
- " %%%%%% // /////// //////// ,,,, ........... *** * * * * ****** * *** *** * ********** * $$$$$$$ $ ",
- " %%%%%% ///////// //////// ...... . ***************************** *************** $ $$$$$$$ $ ",
- " %%%%%%%%% / / ////// / //////// ...... . ************************************************ $$$$$$$$$$ $ ",
- " % %%%%%% / / /////// / ///// ........... ********************************************** ** $ $$$$$$$$ ",
- " %%%%%%% // /////// ////// ....... ********************************************** $ $$$$$$ ",
- " %%%%%%%%% /// ////// ////// .......... ******************************************** * $$$$$$$$$ ",
- " % %%%%%% /////////// ////// . . ...... . ******************************************** $$$$$$$$ $ ",
- " % %%%%%% /////// ////// . ...... . * * * *** **************** * * $$$$$$$$ ",
- " %%%%%%%% //////////// ////// . .......... * * * * * * * *** *** * ** $$$$$$$ ",
- " %%%%%% ////// /////// ........ . * * * * * * * * * * $ $$$$$$ ",
- " %%%%%%%%%%% / /////// /////// ........... . . . ** * ** * *** *** * $$$$$$$ ",
- " % %%%%%% //////// / ////// . .......... .. ... ... ... ... ... $$$$$$ ",
- " % %%%%%% /////// / ////// ........... .................................. $$$$$$$$ ",
- " %%%%%%%% ////////// ////// .. ............................................ $$$$$$$ ",
- " %%%%%% / /////// /////// ............................................. ..... $$$$$$ ",
- " %%%%%% ///////// //////// . .................................................. $$$$$$$ ",
- " %%%%%% //////////// //////// . .......................................... $ $$$$$$ ",
- " %%%%%% ///////// /////// . ........................................ $$$$$$ ",
- " %%%%%% //////// / ////// .. ..................................... $$$$$$ ",
- " // ///////// / /////// . . . . . . . . . . . . $$$$$$ ",
- " /////////// / ////////// . . . . . . . . . . . $$$$$$ ",
- " // ///////// // ////////// .... ... ... .. ... . . . $$ ",
- " / ///////// / //////////// $$ ",
- " / ////////// //////////// $$ ",
- " / ///////// /// / //////////// $$ ",
- " / //////////// / / /// //////////// / $$ ",
- " / ///////////////// / ///////////// // 11111111111111111111111111 $$ ",
- " //////////////////////////////// / 11111111111111111111111111111111111111111111111111 $$ ",
- " / //////////////////////////// / // 111111111111111111111111111111111111111111111111111111111 ",
- " ////////////////////////////// / 111111111111111111111111111111111111111111111111111111111 ",
- " //////////////////////// / / 11111111111111111111111111111111111111111111111111 ",
- " / / ///////////////// / / 11111111111111111111111111111111111111111111111111 ",
- " //// / / ///////// /// 11111111111111111111111111111111111111 ",
- " / / / / / / / ",
- " //// / / / /// ",
- " /// / ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-alpha-broken-assoc-alpha-gdal-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-alpha-broken-assoc-alpha-gdal-600-400-1.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/tiff-alpha-broken-assoc-alpha-gdal-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-alpha-broken-assoc-alpha-gdal-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-alpha-broken-assoc-alpha-gdal-600-400-2.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/tiff-alpha-broken-assoc-alpha-gdal-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-alpha-gdal-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-alpha-gdal-600-400-1.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/tiff-alpha-gdal-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-alpha-gdal-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-alpha-gdal-600-400-2.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/tiff-alpha-gdal-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-alpha-gradient-gdal-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-alpha-gradient-gdal-600-400-1.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/tiff-alpha-gradient-gdal-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-alpha-gradient-gdal-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-alpha-gradient-gdal-600-400-2.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/tiff-alpha-gradient-gdal-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-edge-alignment-gdal1-255-257-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-edge-alignment-gdal1-255-257-1.0-grid-reference.json
deleted file mode 100644
index a9b8956..0000000
--- a/tests/visual_tests/grids/tiff-edge-alignment-gdal1-255-257-1.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-edge-alignment-gdal1-255-257-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-edge-alignment-gdal1-255-257-2.0-grid-reference.json
deleted file mode 100644
index a9b8956..0000000
--- a/tests/visual_tests/grids/tiff-edge-alignment-gdal1-255-257-2.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-edge-alignment-gdal1-256-256-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-edge-alignment-gdal1-256-256-1.0-grid-reference.json
deleted file mode 100644
index e023c5e..0000000
--- a/tests/visual_tests/grids/tiff-edge-alignment-gdal1-256-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-edge-alignment-gdal1-256-256-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-edge-alignment-gdal1-256-256-2.0-grid-reference.json
deleted file mode 100644
index e023c5e..0000000
--- a/tests/visual_tests/grids/tiff-edge-alignment-gdal1-256-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-edge-alignment-gdal2-255-257-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-edge-alignment-gdal2-255-257-1.0-grid-reference.json
deleted file mode 100644
index a9b8956..0000000
--- a/tests/visual_tests/grids/tiff-edge-alignment-gdal2-255-257-1.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-edge-alignment-gdal2-255-257-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-edge-alignment-gdal2-255-257-2.0-grid-reference.json
deleted file mode 100644
index a9b8956..0000000
--- a/tests/visual_tests/grids/tiff-edge-alignment-gdal2-255-257-2.0-grid-reference.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-edge-alignment-gdal2-256-256-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-edge-alignment-gdal2-256-256-1.0-grid-reference.json
deleted file mode 100644
index e023c5e..0000000
--- a/tests/visual_tests/grids/tiff-edge-alignment-gdal2-256-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-edge-alignment-gdal2-256-256-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-edge-alignment-gdal2-256-256-2.0-grid-reference.json
deleted file mode 100644
index e023c5e..0000000
--- a/tests/visual_tests/grids/tiff-edge-alignment-gdal2-256-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-nodata-edge-gdal-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-nodata-edge-gdal-600-400-1.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/tiff-nodata-edge-gdal-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-nodata-edge-gdal-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-nodata-edge-gdal-600-400-2.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/tiff-nodata-edge-gdal-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-nodata-edge-gdal-969-793-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-nodata-edge-gdal-969-793-1.0-grid-reference.json
deleted file mode 100644
index 924d741..0000000
--- a/tests/visual_tests/grids/tiff-nodata-edge-gdal-969-793-1.0-grid-reference.json
+++ /dev/null
@@ -1,207 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-nodata-edge-gdal-969-793-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-nodata-edge-gdal-969-793-2.0-grid-reference.json
deleted file mode 100644
index 924d741..0000000
--- a/tests/visual_tests/grids/tiff-nodata-edge-gdal-969-793-2.0-grid-reference.json
+++ /dev/null
@@ -1,207 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-nodata-edge-rgba-500-100-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-nodata-edge-rgba-500-100-1.0-grid-reference.json
deleted file mode 100644
index dcf3d34..0000000
--- a/tests/visual_tests/grids/tiff-nodata-edge-rgba-500-100-1.0-grid-reference.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-nodata-edge-rgba-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-nodata-edge-rgba-512-512-1.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/tiff-nodata-edge-rgba-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-nodata-edge-rgba-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-nodata-edge-rgba-512-512-2.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/tiff-nodata-edge-rgba-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-nodata-rgb-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-nodata-rgb-512-512-1.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/tiff-nodata-rgb-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-nodata-rgb-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-nodata-rgb-512-512-2.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/tiff-nodata-rgb-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-nodata-rgba-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-nodata-rgba-512-512-1.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/tiff-nodata-rgba-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-nodata-rgba-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-nodata-rgba-512-512-2.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/tiff-nodata-rgba-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-nodata-tolerance-512-512-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-nodata-tolerance-512-512-1.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/tiff-nodata-tolerance-512-512-1.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-nodata-tolerance-512-512-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-nodata-tolerance-512-512-2.0-grid-reference.json
deleted file mode 100644
index 53162f3..0000000
--- a/tests/visual_tests/grids/tiff-nodata-tolerance-512-512-2.0-grid-reference.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-opaque-edge-gdal-256-256-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-opaque-edge-gdal-256-256-1.0-grid-reference.json
deleted file mode 100644
index e023c5e..0000000
--- a/tests/visual_tests/grids/tiff-opaque-edge-gdal-256-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-opaque-edge-gdal-256-256-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-opaque-edge-gdal-256-256-2.0-grid-reference.json
deleted file mode 100644
index e023c5e..0000000
--- a/tests/visual_tests/grids/tiff-opaque-edge-gdal-256-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-opaque-edge-gdal-969-793-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-opaque-edge-gdal-969-793-1.0-grid-reference.json
deleted file mode 100644
index 924d741..0000000
--- a/tests/visual_tests/grids/tiff-opaque-edge-gdal-969-793-1.0-grid-reference.json
+++ /dev/null
@@ -1,207 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-opaque-edge-gdal-969-793-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-opaque-edge-gdal-969-793-2.0-grid-reference.json
deleted file mode 100644
index 924d741..0000000
--- a/tests/visual_tests/grids/tiff-opaque-edge-gdal-969-793-2.0-grid-reference.json
+++ /dev/null
@@ -1,207 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-opaque-edge-gdal2-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-opaque-edge-gdal2-600-400-1.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/tiff-opaque-edge-gdal2-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-opaque-edge-gdal2-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-opaque-edge-gdal2-600-400-2.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/tiff-opaque-edge-gdal2-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-opaque-edge-gdal2-969-793-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-opaque-edge-gdal2-969-793-1.0-grid-reference.json
deleted file mode 100644
index 924d741..0000000
--- a/tests/visual_tests/grids/tiff-opaque-edge-gdal2-969-793-1.0-grid-reference.json
+++ /dev/null
@@ -1,207 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-opaque-edge-gdal2-969-793-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-opaque-edge-gdal2-969-793-2.0-grid-reference.json
deleted file mode 100644
index 924d741..0000000
--- a/tests/visual_tests/grids/tiff-opaque-edge-gdal2-969-793-2.0-grid-reference.json
+++ /dev/null
@@ -1,207 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-opaque-edge-raster2-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-opaque-edge-raster2-600-400-1.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/tiff-opaque-edge-raster2-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-opaque-edge-raster2-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-opaque-edge-raster2-600-400-2.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/tiff-opaque-edge-raster2-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-opaque-edge-raster2-969-793-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-opaque-edge-raster2-969-793-1.0-grid-reference.json
deleted file mode 100644
index 924d741..0000000
--- a/tests/visual_tests/grids/tiff-opaque-edge-raster2-969-793-1.0-grid-reference.json
+++ /dev/null
@@ -1,207 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-opaque-edge-raster2-969-793-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-opaque-edge-raster2-969-793-2.0-grid-reference.json
deleted file mode 100644
index 924d741..0000000
--- a/tests/visual_tests/grids/tiff-opaque-edge-raster2-969-793-2.0-grid-reference.json
+++ /dev/null
@@ -1,207 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-reprojection-1-250-250-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-reprojection-1-250-250-1.0-grid-reference.json
deleted file mode 100644
index 4f1f36a..0000000
--- a/tests/visual_tests/grids/tiff-reprojection-1-250-250-1.0-grid-reference.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-reprojection-1-250-250-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-reprojection-1-250-250-2.0-grid-reference.json
deleted file mode 100644
index 4f1f36a..0000000
--- a/tests/visual_tests/grids/tiff-reprojection-1-250-250-2.0-grid-reference.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-reprojection-2-250-250-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-reprojection-2-250-250-1.0-grid-reference.json
deleted file mode 100644
index 4f1f36a..0000000
--- a/tests/visual_tests/grids/tiff-reprojection-2-250-250-1.0-grid-reference.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-reprojection-2-250-250-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-reprojection-2-250-250-2.0-grid-reference.json
deleted file mode 100644
index 4f1f36a..0000000
--- a/tests/visual_tests/grids/tiff-reprojection-2-250-250-2.0-grid-reference.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-resampling-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/tiff-resampling-600-400-1.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/tiff-resampling-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff-resampling-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/tiff-resampling-600-400-2.0-grid-reference.json
deleted file mode 100644
index 1a15981..0000000
--- a/tests/visual_tests/grids/tiff-resampling-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,108 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff_colortable-256-256-1.0-grid-reference.json b/tests/visual_tests/grids/tiff_colortable-256-256-1.0-grid-reference.json
deleted file mode 100644
index e023c5e..0000000
--- a/tests/visual_tests/grids/tiff_colortable-256-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff_colortable-256-256-2.0-grid-reference.json b/tests/visual_tests/grids/tiff_colortable-256-256-2.0-grid-reference.json
deleted file mode 100644
index e023c5e..0000000
--- a/tests/visual_tests/grids/tiff_colortable-256-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff_colortable_custom_nodata-256-256-1.0-grid-reference.json b/tests/visual_tests/grids/tiff_colortable_custom_nodata-256-256-1.0-grid-reference.json
deleted file mode 100644
index e023c5e..0000000
--- a/tests/visual_tests/grids/tiff_colortable_custom_nodata-256-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/tiff_colortable_custom_nodata-256-256-2.0-grid-reference.json b/tests/visual_tests/grids/tiff_colortable_custom_nodata-256-256-2.0-grid-reference.json
deleted file mode 100644
index e023c5e..0000000
--- a/tests/visual_tests/grids/tiff_colortable_custom_nodata-256-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/vrt_colortable-256-256-1.0-grid-reference.json b/tests/visual_tests/grids/vrt_colortable-256-256-1.0-grid-reference.json
deleted file mode 100644
index e023c5e..0000000
--- a/tests/visual_tests/grids/vrt_colortable-256-256-1.0-grid-reference.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/vrt_colortable-256-256-2.0-grid-reference.json b/tests/visual_tests/grids/vrt_colortable-256-256-2.0-grid-reference.json
deleted file mode 100644
index e023c5e..0000000
--- a/tests/visual_tests/grids/vrt_colortable-256-256-2.0-grid-reference.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "keys": [
- ""
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/whole-centroid-600-400-1.0-grid-reference.json b/tests/visual_tests/grids/whole-centroid-600-400-1.0-grid-reference.json
deleted file mode 100644
index 0d3a340..0000000
--- a/tests/visual_tests/grids/whole-centroid-600-400-1.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!! ",
- " !!!!! ",
- " ! ! ",
- " ! ! ",
- " ! !!! ",
- " ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! !!! ! ",
- " ! ! ! ",
- " ! ! ",
- " ! ! ! ",
- " !!!!!!! !! ! ",
- " ! ! ",
- " ! !!! ! ",
- " ! !! ! ! ",
- " !! ",
- " ! ! ",
- " ! ",
- " !! ! ",
- " !! ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ! ! ",
- " !!! ! !! ",
- " ! ! !! ! ",
- " ! ! ! ",
- " ! ! ! ! ",
- " !! ! ! ! ",
- " ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " !!! ",
- " ! !!!!! ! ",
- " ! !!!!! ! ",
- " ! !!!!! ",
- " ! !!!!! ! ",
- " !! ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ! ! ",
- " ! ! ",
- " ! ! ",
- " ! !!! ",
- " ! ! !! ",
- " !! ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! !! ",
- " ! ! ",
- " ! ! ",
- " ! !! ! ! ! ",
- " !!! ! ! ",
- " ! ! ! ",
- " ! ! ! ! ",
- " ! ! !! !! ",
- " ! ! ! ",
- " ! ! !! ! ",
- " ! ! ! !! ! ",
- " ! ! ! ! ! ! ",
- " ! ! ",
- " ! ! ! ! ! ",
- " ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! ! ",
- " ! ! ! ",
- " ! ",
- " ! ! ! ",
- " ! ! !! ! ! ",
- " ! ! ! ",
- " !! ! !! ",
- " ! !! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ! ",
- " ! ",
- " !! ! ! ",
- " ! ! !!!! !! ",
- " ! ! !! ! !!! ",
- " ! ! ",
- " ! ! ",
- " !! ! ",
- " ! ! ",
- " ! ! ",
- " ! ",
- " ! ! ",
- " ! ",
- " !! ",
- " ! !! ! ",
- " ! ! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/grids/whole-centroid-600-400-2.0-grid-reference.json b/tests/visual_tests/grids/whole-centroid-600-400-2.0-grid-reference.json
deleted file mode 100644
index 69a4447..0000000
--- a/tests/visual_tests/grids/whole-centroid-600-400-2.0-grid-reference.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " !!!!! ",
- " !!!!!! !! ",
- " ! ! ",
- " ! !! ",
- " ! !!!! ",
- " ! !!!! !! ",
- " !! ! !! ! ! ",
- " ! ! ! !!! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ",
- " !!!!!!! !! ! ",
- " ! ! ",
- " ! !!!! ! ",
- " ! !! !!!! ",
- " ! !! ",
- " ! !! ",
- " !! ",
- " !! ! ",
- " !! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! ! ",
- " ! !! !! ! ",
- " !!! ! !! ",
- " !! ! !! !! ",
- " !! !!! ! ",
- " ! ! ! ! ! ",
- " !! ! ! !! ",
- " ! ! ! ",
- " ! ! ",
- " ! ! ",
- " ! !!!!!!! ! ",
- " ! !!!!!!!!! ! ",
- " ! !!!!!!!!! ! ",
- " ! !!!!!!!!!!! ! ",
- " ! !!!!!!!!!!! ! ",
- " ! ! !!!!!!!!!!! ! ",
- " !! ! !!!!!!!!!! ! ",
- " !!! ! !!!!!!!!! ! ",
- " ! ! !!!!!!! !! ",
- " ! ! !!!!! !! ",
- " !! ! ",
- " ! ! ! ! ",
- " !! ! ",
- " ! ! ",
- " !! !!!!! ",
- " ! ! !!! ",
- " !! ! ",
- " ! ! ",
- " !! ",
- " ! ! ",
- " !! !! ",
- " ! !! ",
- " ! ! !! ",
- " ! !!!!! !! ! ",
- " !!!! ! ! ! ! ",
- " ! ! ! !! !! ",
- " ! ! !! ! !! ",
- " ! ! ! !! !! ",
- " ! ! !! ! ! ",
- " ! ! !! !! ! ",
- " ! ! ! ! !!!! ! ",
- " ! ! !! ! ! ! ",
- " ! !! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! ! ! ",
- " ! ! ! !! ",
- " ! ! ! ",
- " ! ! ! ",
- " !! ! !! ! ! ",
- " !! ! ! ! ",
- " !!! ! !! ",
- " ! ! !! ",
- " !! ! ! ",
- " ! ! ",
- " !! ! ",
- " ! ! ! ",
- " ! ! ",
- " !!! ! ! ",
- " ! ! !!!!!! !! ! ",
- " !!! !! !!!! ! !!!! ",
- " ! !! ! ",
- " !! ! ",
- " !! ! ",
- " !! ! ",
- " !! ! ",
- " ! ! ",
- " ! ! ",
- " !! ! ",
- " !! ! ",
- " ! !! ! ",
- " ! !!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/html_report_template.html b/tests/visual_tests/html_report_template.html
deleted file mode 100644
index 759b8fe..0000000
--- a/tests/visual_tests/html_report_template.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <style>
- body { margin:10; padding:10; }
- .expected {
- float:left;
- border-width:1px;
- border-style:solid;
- width:45%;
- }
- .actual {
- float:right;
- border-width:1px;
- border-style:solid;
- width:45%;
- }
- .text {
- float:left;
- }
- </style>
-</head>
-<body>
-<script>
-</script>
-<div id='results'>
- <div class="expected">expected</div>
- <div class="text">% difference</div>
- <div class="actual">actual</div>
-{{RESULTS}}
-</div>
-</body>
-</html>
diff --git a/tests/visual_tests/images/building-symbolizer-opacity-512-512-1.0-agg-reference.png b/tests/visual_tests/images/building-symbolizer-opacity-512-512-1.0-agg-reference.png
deleted file mode 100644
index 99d578c..0000000
Binary files a/tests/visual_tests/images/building-symbolizer-opacity-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/building-symbolizer-opacity-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/building-symbolizer-opacity-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 8042955..0000000
Binary files a/tests/visual_tests/images/building-symbolizer-opacity-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/building-symbolizer-opacity-512-512-2.0-agg-reference.png b/tests/visual_tests/images/building-symbolizer-opacity-512-512-2.0-agg-reference.png
deleted file mode 100644
index c4cc3e5..0000000
Binary files a/tests/visual_tests/images/building-symbolizer-opacity-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/building-symbolizer-opacity-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/building-symbolizer-opacity-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 6b35045..0000000
Binary files a/tests/visual_tests/images/building-symbolizer-opacity-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/charspacing-200-400-1.0-agg-reference.png b/tests/visual_tests/images/charspacing-200-400-1.0-agg-reference.png
deleted file mode 100644
index c6976c3..0000000
Binary files a/tests/visual_tests/images/charspacing-200-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/charspacing-200-400-1.0-cairo-reference.png b/tests/visual_tests/images/charspacing-200-400-1.0-cairo-reference.png
deleted file mode 100644
index 38c6d76..0000000
Binary files a/tests/visual_tests/images/charspacing-200-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/charspacing-200-400-2.0-agg-reference.png b/tests/visual_tests/images/charspacing-200-400-2.0-agg-reference.png
deleted file mode 100644
index 918f241..0000000
Binary files a/tests/visual_tests/images/charspacing-200-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/charspacing-200-400-2.0-cairo-reference.png b/tests/visual_tests/images/charspacing-200-400-2.0-cairo-reference.png
deleted file mode 100644
index 09ae113..0000000
Binary files a/tests/visual_tests/images/charspacing-200-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/charspacing-lines-300-300-1.0-agg-reference.png b/tests/visual_tests/images/charspacing-lines-300-300-1.0-agg-reference.png
deleted file mode 100644
index c9d76d5..0000000
Binary files a/tests/visual_tests/images/charspacing-lines-300-300-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/charspacing-lines-300-300-1.0-cairo-reference.png b/tests/visual_tests/images/charspacing-lines-300-300-1.0-cairo-reference.png
deleted file mode 100644
index 3d3d8c5..0000000
Binary files a/tests/visual_tests/images/charspacing-lines-300-300-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/charspacing-lines-300-300-2.0-agg-reference.png b/tests/visual_tests/images/charspacing-lines-300-300-2.0-agg-reference.png
deleted file mode 100644
index e599ab1..0000000
Binary files a/tests/visual_tests/images/charspacing-lines-300-300-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/charspacing-lines-300-300-2.0-cairo-reference.png b/tests/visual_tests/images/charspacing-lines-300-300-2.0-cairo-reference.png
deleted file mode 100644
index b166a1c..0000000
Binary files a/tests/visual_tests/images/charspacing-lines-300-300-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/collision-600-400-1.0-agg-reference.png b/tests/visual_tests/images/collision-600-400-1.0-agg-reference.png
deleted file mode 100644
index 696c521..0000000
Binary files a/tests/visual_tests/images/collision-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/collision-600-400-1.0-agg.png b/tests/visual_tests/images/collision-600-400-1.0-agg.png
deleted file mode 100644
index 808c0bd..0000000
Binary files a/tests/visual_tests/images/collision-600-400-1.0-agg.png and /dev/null differ
diff --git a/tests/visual_tests/images/collision-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/collision-600-400-1.0-cairo-reference.png
deleted file mode 100644
index dca685b..0000000
Binary files a/tests/visual_tests/images/collision-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/collision-600-400-1.0-cairo.png b/tests/visual_tests/images/collision-600-400-1.0-cairo.png
deleted file mode 100644
index c8a3eba..0000000
Binary files a/tests/visual_tests/images/collision-600-400-1.0-cairo.png and /dev/null differ
diff --git a/tests/visual_tests/images/collision-600-400-1.0-grid.json b/tests/visual_tests/images/collision-600-400-1.0-grid.json
deleted file mode 100644
index 25daa99..0000000
--- a/tests/visual_tests/images/collision-600-400-1.0-grid.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "keys": [
- "",
- "1"
- ],
- "data": {},
- "grid": [
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ! ",
- " !! ",
- " !!!! ",
- " !!!!! ",
- " !!!!! ",
- " !!!!! ",
- " !!!! ",
- " !!! ",
- " !!! ",
- " !!!! ",
- " !!!!! ",
- " !!!!!!! ",
- " !!!!!! ",
- " !!!! ",
- " ! !!! ",
- " !!!! ",
- " !!!!! ",
- " !!!!!! ",
- " !!!! ",
- " !! ",
- " !! ",
- " !!!! ",
- " !!!!! ",
- " !!!!! ",
- " !!!!! ",
- " !!!! ",
- " !! ",
- " ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!! ",
- " !!! ",
- " !!!! ",
- " ! ! ",
- " ",
- " ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!! ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " ! ",
- " !! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!! ",
- " ! ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " !!!! ",
- " !!! ",
- " ",
- " !! ",
- " !!! ",
- " !!!! ",
- " !!!! ",
- " !!! ",
- " !!!! ",
- " !!! ",
- " ! ! ! ",
- " !! ",
- " !!!! ",
- " !!!!! ",
- " !!!!!! ",
- " !!!! ",
- " !! ! !! ",
- " !!!! ",
- " !!!!! ",
- " !!!!!!!! ",
- " !!!!!! ",
- " !! !!! ",
- " !!!!!! ",
- " !!!!!!!! ",
- " !!!!!! !! ",
- " !!! !!!! ",
- " !!!!! !! ",
- " !!!!!!!! ",
- " !!!!!! ",
- " !!! "
- ]
-}
\ No newline at end of file
diff --git a/tests/visual_tests/images/collision-600-400-2.0-agg-reference.png b/tests/visual_tests/images/collision-600-400-2.0-agg-reference.png
deleted file mode 100644
index a1f0128..0000000
Binary files a/tests/visual_tests/images/collision-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/collision-600-400-2.0-agg.png b/tests/visual_tests/images/collision-600-400-2.0-agg.png
deleted file mode 100644
index d0e7a44..0000000
Binary files a/tests/visual_tests/images/collision-600-400-2.0-agg.png and /dev/null differ
diff --git a/tests/visual_tests/images/collision-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/collision-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 5d8d45c..0000000
Binary files a/tests/visual_tests/images/collision-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/collision-600-400-2.0-cairo.png b/tests/visual_tests/images/collision-600-400-2.0-cairo.png
deleted file mode 100644
index d72f194..0000000
Binary files a/tests/visual_tests/images/collision-600-400-2.0-cairo.png and /dev/null differ
diff --git a/tests/visual_tests/images/colorize-alpha1-512-512-1.0-agg-reference.png b/tests/visual_tests/images/colorize-alpha1-512-512-1.0-agg-reference.png
deleted file mode 100644
index da04eee..0000000
Binary files a/tests/visual_tests/images/colorize-alpha1-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/colorize-alpha1-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/colorize-alpha1-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 34aeeea..0000000
Binary files a/tests/visual_tests/images/colorize-alpha1-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/colorize-alpha1-512-512-2.0-agg-reference.png b/tests/visual_tests/images/colorize-alpha1-512-512-2.0-agg-reference.png
deleted file mode 100644
index ab7ed1f..0000000
Binary files a/tests/visual_tests/images/colorize-alpha1-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/colorize-alpha1-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/colorize-alpha1-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 283c5f2..0000000
Binary files a/tests/visual_tests/images/colorize-alpha1-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/colorize-alpha2-512-512-1.0-agg-reference.png b/tests/visual_tests/images/colorize-alpha2-512-512-1.0-agg-reference.png
deleted file mode 100644
index a6ff00a..0000000
Binary files a/tests/visual_tests/images/colorize-alpha2-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/colorize-alpha2-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/colorize-alpha2-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 34aeeea..0000000
Binary files a/tests/visual_tests/images/colorize-alpha2-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/colorize-alpha2-512-512-2.0-agg-reference.png b/tests/visual_tests/images/colorize-alpha2-512-512-2.0-agg-reference.png
deleted file mode 100644
index 3d9c7b8..0000000
Binary files a/tests/visual_tests/images/colorize-alpha2-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/colorize-alpha2-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/colorize-alpha2-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 283c5f2..0000000
Binary files a/tests/visual_tests/images/colorize-alpha2-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/colorize-alpha3-512-512-1.0-agg-reference.png b/tests/visual_tests/images/colorize-alpha3-512-512-1.0-agg-reference.png
deleted file mode 100644
index 1327518..0000000
Binary files a/tests/visual_tests/images/colorize-alpha3-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/colorize-alpha3-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/colorize-alpha3-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 34aeeea..0000000
Binary files a/tests/visual_tests/images/colorize-alpha3-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/colorize-alpha3-512-512-2.0-agg-reference.png b/tests/visual_tests/images/colorize-alpha3-512-512-2.0-agg-reference.png
deleted file mode 100644
index 9036403..0000000
Binary files a/tests/visual_tests/images/colorize-alpha3-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/colorize-alpha3-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/colorize-alpha3-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 283c5f2..0000000
Binary files a/tests/visual_tests/images/colorize-alpha3-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/dst-over-compositing-512-512-1.0-agg-reference.png b/tests/visual_tests/images/dst-over-compositing-512-512-1.0-agg-reference.png
deleted file mode 100644
index cde2316..0000000
Binary files a/tests/visual_tests/images/dst-over-compositing-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/dst-over-compositing-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/dst-over-compositing-512-512-1.0-cairo-reference.png
deleted file mode 100644
index aa51da4..0000000
Binary files a/tests/visual_tests/images/dst-over-compositing-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/dst-over-compositing-512-512-2.0-agg-reference.png b/tests/visual_tests/images/dst-over-compositing-512-512-2.0-agg-reference.png
deleted file mode 100644
index 685debb..0000000
Binary files a/tests/visual_tests/images/dst-over-compositing-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/dst-over-compositing-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/dst-over-compositing-512-512-2.0-cairo-reference.png
deleted file mode 100644
index aa51da4..0000000
Binary files a/tests/visual_tests/images/dst-over-compositing-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/expressionformat-500-100-1.0-agg-reference.png b/tests/visual_tests/images/expressionformat-500-100-1.0-agg-reference.png
deleted file mode 100644
index 5c2d0a6..0000000
Binary files a/tests/visual_tests/images/expressionformat-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/expressionformat-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/expressionformat-500-100-1.0-cairo-reference.png
deleted file mode 100644
index fc7b944..0000000
Binary files a/tests/visual_tests/images/expressionformat-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/expressionformat-500-100-2.0-agg-reference.png b/tests/visual_tests/images/expressionformat-500-100-2.0-agg-reference.png
deleted file mode 100644
index 3b7263d..0000000
Binary files a/tests/visual_tests/images/expressionformat-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/expressionformat-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/expressionformat-500-100-2.0-cairo-reference.png
deleted file mode 100644
index de1f803..0000000
Binary files a/tests/visual_tests/images/expressionformat-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-1-500-100-1.0-agg-reference.png b/tests/visual_tests/images/formatting-1-500-100-1.0-agg-reference.png
deleted file mode 100644
index 64be9c9..0000000
Binary files a/tests/visual_tests/images/formatting-1-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-1-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/formatting-1-500-100-1.0-cairo-reference.png
deleted file mode 100644
index 52d5d5c..0000000
Binary files a/tests/visual_tests/images/formatting-1-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-1-500-100-2.0-agg-reference.png b/tests/visual_tests/images/formatting-1-500-100-2.0-agg-reference.png
deleted file mode 100644
index a43a8d7..0000000
Binary files a/tests/visual_tests/images/formatting-1-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-1-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/formatting-1-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 17d6caf..0000000
Binary files a/tests/visual_tests/images/formatting-1-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-2-500-100-1.0-agg-reference.png b/tests/visual_tests/images/formatting-2-500-100-1.0-agg-reference.png
deleted file mode 100644
index 64be9c9..0000000
Binary files a/tests/visual_tests/images/formatting-2-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-2-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/formatting-2-500-100-1.0-cairo-reference.png
deleted file mode 100644
index 52d5d5c..0000000
Binary files a/tests/visual_tests/images/formatting-2-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-2-500-100-2.0-agg-reference.png b/tests/visual_tests/images/formatting-2-500-100-2.0-agg-reference.png
deleted file mode 100644
index a43a8d7..0000000
Binary files a/tests/visual_tests/images/formatting-2-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-2-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/formatting-2-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 17d6caf..0000000
Binary files a/tests/visual_tests/images/formatting-2-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-3-500-100-1.0-agg-reference.png b/tests/visual_tests/images/formatting-3-500-100-1.0-agg-reference.png
deleted file mode 100644
index cc91310..0000000
Binary files a/tests/visual_tests/images/formatting-3-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-3-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/formatting-3-500-100-1.0-cairo-reference.png
deleted file mode 100644
index 51acc69..0000000
Binary files a/tests/visual_tests/images/formatting-3-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-3-500-100-2.0-agg-reference.png b/tests/visual_tests/images/formatting-3-500-100-2.0-agg-reference.png
deleted file mode 100644
index d0ff1b4..0000000
Binary files a/tests/visual_tests/images/formatting-3-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-3-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/formatting-3-500-100-2.0-cairo-reference.png
deleted file mode 100644
index c739028..0000000
Binary files a/tests/visual_tests/images/formatting-3-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-4-500-100-1.0-agg-reference.png b/tests/visual_tests/images/formatting-4-500-100-1.0-agg-reference.png
deleted file mode 100644
index fa3ffc1..0000000
Binary files a/tests/visual_tests/images/formatting-4-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-4-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/formatting-4-500-100-1.0-cairo-reference.png
deleted file mode 100644
index fa3ffc1..0000000
Binary files a/tests/visual_tests/images/formatting-4-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-4-500-100-2.0-agg-reference.png b/tests/visual_tests/images/formatting-4-500-100-2.0-agg-reference.png
deleted file mode 100644
index 4c2ce1b..0000000
Binary files a/tests/visual_tests/images/formatting-4-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-4-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/formatting-4-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 43f9fcf..0000000
Binary files a/tests/visual_tests/images/formatting-4-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-5-500-100-1.0-agg-reference.png b/tests/visual_tests/images/formatting-5-500-100-1.0-agg-reference.png
deleted file mode 100644
index 64be9c9..0000000
Binary files a/tests/visual_tests/images/formatting-5-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-5-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/formatting-5-500-100-1.0-cairo-reference.png
deleted file mode 100644
index 52d5d5c..0000000
Binary files a/tests/visual_tests/images/formatting-5-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-5-500-100-2.0-agg-reference.png b/tests/visual_tests/images/formatting-5-500-100-2.0-agg-reference.png
deleted file mode 100644
index a43a8d7..0000000
Binary files a/tests/visual_tests/images/formatting-5-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-5-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/formatting-5-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 17d6caf..0000000
Binary files a/tests/visual_tests/images/formatting-5-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-6-500-100-1.0-agg-reference.png b/tests/visual_tests/images/formatting-6-500-100-1.0-agg-reference.png
deleted file mode 100644
index 64be9c9..0000000
Binary files a/tests/visual_tests/images/formatting-6-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-6-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/formatting-6-500-100-1.0-cairo-reference.png
deleted file mode 100644
index 52d5d5c..0000000
Binary files a/tests/visual_tests/images/formatting-6-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-6-500-100-2.0-agg-reference.png b/tests/visual_tests/images/formatting-6-500-100-2.0-agg-reference.png
deleted file mode 100644
index a43a8d7..0000000
Binary files a/tests/visual_tests/images/formatting-6-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-6-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/formatting-6-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 17d6caf..0000000
Binary files a/tests/visual_tests/images/formatting-6-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-7-500-100-1.0-agg-reference.png b/tests/visual_tests/images/formatting-7-500-100-1.0-agg-reference.png
deleted file mode 100644
index 64be9c9..0000000
Binary files a/tests/visual_tests/images/formatting-7-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-7-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/formatting-7-500-100-1.0-cairo-reference.png
deleted file mode 100644
index 52d5d5c..0000000
Binary files a/tests/visual_tests/images/formatting-7-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-7-500-100-2.0-agg-reference.png b/tests/visual_tests/images/formatting-7-500-100-2.0-agg-reference.png
deleted file mode 100644
index a43a8d7..0000000
Binary files a/tests/visual_tests/images/formatting-7-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-7-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/formatting-7-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 17d6caf..0000000
Binary files a/tests/visual_tests/images/formatting-7-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-8-500-100-1.0-agg-reference.png b/tests/visual_tests/images/formatting-8-500-100-1.0-agg-reference.png
deleted file mode 100644
index 64be9c9..0000000
Binary files a/tests/visual_tests/images/formatting-8-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-8-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/formatting-8-500-100-1.0-cairo-reference.png
deleted file mode 100644
index 52d5d5c..0000000
Binary files a/tests/visual_tests/images/formatting-8-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-8-500-100-2.0-agg-reference.png b/tests/visual_tests/images/formatting-8-500-100-2.0-agg-reference.png
deleted file mode 100644
index a43a8d7..0000000
Binary files a/tests/visual_tests/images/formatting-8-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-8-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/formatting-8-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 17d6caf..0000000
Binary files a/tests/visual_tests/images/formatting-8-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-expr-alignment-500-500-1.0-agg-reference.png b/tests/visual_tests/images/formatting-expr-alignment-500-500-1.0-agg-reference.png
deleted file mode 100644
index 65d3d08..0000000
Binary files a/tests/visual_tests/images/formatting-expr-alignment-500-500-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-expr-alignment-500-500-1.0-cairo-reference.png b/tests/visual_tests/images/formatting-expr-alignment-500-500-1.0-cairo-reference.png
deleted file mode 100644
index 883a7d5..0000000
Binary files a/tests/visual_tests/images/formatting-expr-alignment-500-500-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-expr-alignment-500-500-2.0-agg-reference.png b/tests/visual_tests/images/formatting-expr-alignment-500-500-2.0-agg-reference.png
deleted file mode 100644
index d2a79b2..0000000
Binary files a/tests/visual_tests/images/formatting-expr-alignment-500-500-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/formatting-expr-alignment-500-500-2.0-cairo-reference.png b/tests/visual_tests/images/formatting-expr-alignment-500-500-2.0-cairo-reference.png
deleted file mode 100644
index 2cf0264..0000000
Binary files a/tests/visual_tests/images/formatting-expr-alignment-500-500-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/functional-expressions-256-256-1.0-agg-reference.png b/tests/visual_tests/images/functional-expressions-256-256-1.0-agg-reference.png
deleted file mode 100644
index 790765b..0000000
Binary files a/tests/visual_tests/images/functional-expressions-256-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/functional-expressions-256-256-1.0-cairo-reference.png b/tests/visual_tests/images/functional-expressions-256-256-1.0-cairo-reference.png
deleted file mode 100644
index 6ca5865..0000000
Binary files a/tests/visual_tests/images/functional-expressions-256-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/functional-expressions-256-256-2.0-agg-reference.png b/tests/visual_tests/images/functional-expressions-256-256-2.0-agg-reference.png
deleted file mode 100644
index 21759f0..0000000
Binary files a/tests/visual_tests/images/functional-expressions-256-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/functional-expressions-256-256-2.0-cairo-reference.png b/tests/visual_tests/images/functional-expressions-256-256-2.0-cairo-reference.png
deleted file mode 100644
index fd479ef..0000000
Binary files a/tests/visual_tests/images/functional-expressions-256-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/functional-expressions-length-512-512-1.0-agg-reference.png b/tests/visual_tests/images/functional-expressions-length-512-512-1.0-agg-reference.png
deleted file mode 100644
index 7b9502e..0000000
Binary files a/tests/visual_tests/images/functional-expressions-length-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/functional-expressions-length-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/functional-expressions-length-512-512-1.0-cairo-reference.png
deleted file mode 100644
index d842e00..0000000
Binary files a/tests/visual_tests/images/functional-expressions-length-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/functional-expressions-length-512-512-2.0-agg-reference.png b/tests/visual_tests/images/functional-expressions-length-512-512-2.0-agg-reference.png
deleted file mode 100644
index e258219..0000000
Binary files a/tests/visual_tests/images/functional-expressions-length-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/functional-expressions-length-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/functional-expressions-length-512-512-2.0-cairo-reference.png
deleted file mode 100644
index fe4da8d..0000000
Binary files a/tests/visual_tests/images/functional-expressions-length-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/gdal-filter-factor-600-400-1.0-agg-reference.png b/tests/visual_tests/images/gdal-filter-factor-600-400-1.0-agg-reference.png
deleted file mode 100644
index 3fcb40d..0000000
Binary files a/tests/visual_tests/images/gdal-filter-factor-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/gdal-filter-factor-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/gdal-filter-factor-600-400-1.0-cairo-reference.png
deleted file mode 100644
index 3fcb40d..0000000
Binary files a/tests/visual_tests/images/gdal-filter-factor-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/gdal-filter-factor-600-400-2.0-agg-reference.png b/tests/visual_tests/images/gdal-filter-factor-600-400-2.0-agg-reference.png
deleted file mode 100644
index 3fcb40d..0000000
Binary files a/tests/visual_tests/images/gdal-filter-factor-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/gdal-filter-factor-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/gdal-filter-factor-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 3fcb40d..0000000
Binary files a/tests/visual_tests/images/gdal-filter-factor-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-scale-500-500-1.0-agg-reference.png b/tests/visual_tests/images/geometry-transform-scale-500-500-1.0-agg-reference.png
deleted file mode 100644
index 14c046a..0000000
Binary files a/tests/visual_tests/images/geometry-transform-scale-500-500-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-scale-500-500-1.0-cairo-reference.png b/tests/visual_tests/images/geometry-transform-scale-500-500-1.0-cairo-reference.png
deleted file mode 100644
index a76c90b..0000000
Binary files a/tests/visual_tests/images/geometry-transform-scale-500-500-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-scale-500-500-2.0-agg-reference.png b/tests/visual_tests/images/geometry-transform-scale-500-500-2.0-agg-reference.png
deleted file mode 100644
index 9144481..0000000
Binary files a/tests/visual_tests/images/geometry-transform-scale-500-500-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-scale-500-500-2.0-cairo-reference.png b/tests/visual_tests/images/geometry-transform-scale-500-500-2.0-cairo-reference.png
deleted file mode 100644
index a88adae..0000000
Binary files a/tests/visual_tests/images/geometry-transform-scale-500-500-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-scale-patterns-500-500-1.0-agg-reference.png b/tests/visual_tests/images/geometry-transform-scale-patterns-500-500-1.0-agg-reference.png
deleted file mode 100644
index 8e5d422..0000000
Binary files a/tests/visual_tests/images/geometry-transform-scale-patterns-500-500-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-scale-patterns-500-500-1.0-cairo-reference.png b/tests/visual_tests/images/geometry-transform-scale-patterns-500-500-1.0-cairo-reference.png
deleted file mode 100644
index e00e283..0000000
Binary files a/tests/visual_tests/images/geometry-transform-scale-patterns-500-500-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-scale-patterns-500-500-2.0-agg-reference.png b/tests/visual_tests/images/geometry-transform-scale-patterns-500-500-2.0-agg-reference.png
deleted file mode 100644
index 0b6ec2b..0000000
Binary files a/tests/visual_tests/images/geometry-transform-scale-patterns-500-500-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-scale-patterns-500-500-2.0-cairo-reference.png b/tests/visual_tests/images/geometry-transform-scale-patterns-500-500-2.0-cairo-reference.png
deleted file mode 100644
index f24e943..0000000
Binary files a/tests/visual_tests/images/geometry-transform-scale-patterns-500-500-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-translate-200-200-1.0-agg-reference.png b/tests/visual_tests/images/geometry-transform-translate-200-200-1.0-agg-reference.png
deleted file mode 100644
index 81c7c7c..0000000
Binary files a/tests/visual_tests/images/geometry-transform-translate-200-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-translate-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/geometry-transform-translate-200-200-1.0-cairo-reference.png
deleted file mode 100644
index 5757230..0000000
Binary files a/tests/visual_tests/images/geometry-transform-translate-200-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-translate-200-200-2.0-agg-reference.png b/tests/visual_tests/images/geometry-transform-translate-200-200-2.0-agg-reference.png
deleted file mode 100644
index 1f0468f..0000000
Binary files a/tests/visual_tests/images/geometry-transform-translate-200-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-translate-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/geometry-transform-translate-200-200-2.0-cairo-reference.png
deleted file mode 100644
index 9b29876..0000000
Binary files a/tests/visual_tests/images/geometry-transform-translate-200-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-translate-patterns-200-200-1.0-agg-reference.png b/tests/visual_tests/images/geometry-transform-translate-patterns-200-200-1.0-agg-reference.png
deleted file mode 100644
index fa06b37..0000000
Binary files a/tests/visual_tests/images/geometry-transform-translate-patterns-200-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-translate-patterns-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/geometry-transform-translate-patterns-200-200-1.0-cairo-reference.png
deleted file mode 100644
index a42e101..0000000
Binary files a/tests/visual_tests/images/geometry-transform-translate-patterns-200-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-translate-patterns-200-200-2.0-agg-reference.png b/tests/visual_tests/images/geometry-transform-translate-patterns-200-200-2.0-agg-reference.png
deleted file mode 100644
index c584eb6..0000000
Binary files a/tests/visual_tests/images/geometry-transform-translate-patterns-200-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-translate-patterns-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/geometry-transform-translate-patterns-200-200-2.0-cairo-reference.png
deleted file mode 100644
index a024250..0000000
Binary files a/tests/visual_tests/images/geometry-transform-translate-patterns-200-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-translate-patterns-svg-200-200-1.0-agg-reference.png b/tests/visual_tests/images/geometry-transform-translate-patterns-svg-200-200-1.0-agg-reference.png
deleted file mode 100644
index 7400aa8..0000000
Binary files a/tests/visual_tests/images/geometry-transform-translate-patterns-svg-200-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-translate-patterns-svg-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/geometry-transform-translate-patterns-svg-200-200-1.0-cairo-reference.png
deleted file mode 100644
index 35ccb86..0000000
Binary files a/tests/visual_tests/images/geometry-transform-translate-patterns-svg-200-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-translate-patterns-svg-200-200-2.0-agg-reference.png b/tests/visual_tests/images/geometry-transform-translate-patterns-svg-200-200-2.0-agg-reference.png
deleted file mode 100644
index 21b651b..0000000
Binary files a/tests/visual_tests/images/geometry-transform-translate-patterns-svg-200-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/geometry-transform-translate-patterns-svg-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/geometry-transform-translate-patterns-svg-200-200-2.0-cairo-reference.png
deleted file mode 100644
index 6c3b753..0000000
Binary files a/tests/visual_tests/images/geometry-transform-translate-patterns-svg-200-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-1-512-512-1.0-agg-reference.png b/tests/visual_tests/images/group-symbolizer-1-512-512-1.0-agg-reference.png
deleted file mode 100644
index 2de70a1..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-1-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-1-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/group-symbolizer-1-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 5e4d7f1..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-1-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-1-512-512-2.0-agg-reference.png b/tests/visual_tests/images/group-symbolizer-1-512-512-2.0-agg-reference.png
deleted file mode 100644
index 038cdf7..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-1-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-1-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/group-symbolizer-1-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 39c9635..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-1-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-2-512-512-1.0-agg-reference.png b/tests/visual_tests/images/group-symbolizer-2-512-512-1.0-agg-reference.png
deleted file mode 100644
index bef874b..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-2-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-2-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/group-symbolizer-2-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 76cd9e9..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-2-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-2-512-512-2.0-agg-reference.png b/tests/visual_tests/images/group-symbolizer-2-512-512-2.0-agg-reference.png
deleted file mode 100644
index aebd66e..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-2-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-2-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/group-symbolizer-2-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 5e6fa91..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-2-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-3-512-256-1.0-agg-reference.png b/tests/visual_tests/images/group-symbolizer-3-512-256-1.0-agg-reference.png
deleted file mode 100644
index 33be04d..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-3-512-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-3-512-256-1.0-cairo-reference.png b/tests/visual_tests/images/group-symbolizer-3-512-256-1.0-cairo-reference.png
deleted file mode 100644
index ce75908..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-3-512-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-3-512-256-2.0-agg-reference.png b/tests/visual_tests/images/group-symbolizer-3-512-256-2.0-agg-reference.png
deleted file mode 100644
index 2ff8456..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-3-512-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-3-512-256-2.0-cairo-reference.png b/tests/visual_tests/images/group-symbolizer-3-512-256-2.0-cairo-reference.png
deleted file mode 100644
index 5a023e4..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-3-512-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-line-1-512-512-1.0-agg-reference.png b/tests/visual_tests/images/group-symbolizer-line-1-512-512-1.0-agg-reference.png
deleted file mode 100644
index 4d3083d..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-line-1-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-line-1-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/group-symbolizer-line-1-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 1345f87..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-line-1-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-line-1-512-512-2.0-agg-reference.png b/tests/visual_tests/images/group-symbolizer-line-1-512-512-2.0-agg-reference.png
deleted file mode 100644
index fa0c2c9..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-line-1-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-line-1-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/group-symbolizer-line-1-512-512-2.0-cairo-reference.png
deleted file mode 100644
index b8dcf94..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-line-1-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-line-2-512-512-1.0-agg-reference.png b/tests/visual_tests/images/group-symbolizer-line-2-512-512-1.0-agg-reference.png
deleted file mode 100644
index a0d22b8..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-line-2-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-line-2-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/group-symbolizer-line-2-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 4a94049..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-line-2-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-line-2-512-512-2.0-agg-reference.png b/tests/visual_tests/images/group-symbolizer-line-2-512-512-2.0-agg-reference.png
deleted file mode 100644
index 85d1f09..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-line-2-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/group-symbolizer-line-2-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/group-symbolizer-line-2-512-512-2.0-cairo-reference.png
deleted file mode 100644
index e4aaf33..0000000
Binary files a/tests/visual_tests/images/group-symbolizer-line-2-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/halo-comp-op-on-satellite-450-450-1.0-agg-reference.png b/tests/visual_tests/images/halo-comp-op-on-satellite-450-450-1.0-agg-reference.png
deleted file mode 100644
index c81967c..0000000
Binary files a/tests/visual_tests/images/halo-comp-op-on-satellite-450-450-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/halo-comp-op-on-satellite-450-450-1.0-cairo-reference.png b/tests/visual_tests/images/halo-comp-op-on-satellite-450-450-1.0-cairo-reference.png
deleted file mode 100644
index 7997b2f..0000000
Binary files a/tests/visual_tests/images/halo-comp-op-on-satellite-450-450-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/halo-comp-op-on-satellite-450-450-2.0-agg-reference.png b/tests/visual_tests/images/halo-comp-op-on-satellite-450-450-2.0-agg-reference.png
deleted file mode 100644
index c581d64..0000000
Binary files a/tests/visual_tests/images/halo-comp-op-on-satellite-450-450-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/halo-comp-op-on-satellite-450-450-2.0-cairo-reference.png b/tests/visual_tests/images/halo-comp-op-on-satellite-450-450-2.0-cairo-reference.png
deleted file mode 100644
index 29a6cf4..0000000
Binary files a/tests/visual_tests/images/halo-comp-op-on-satellite-450-450-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/harfbuzz-800-200-1.0-agg-reference.png b/tests/visual_tests/images/harfbuzz-800-200-1.0-agg-reference.png
deleted file mode 100644
index f11d264..0000000
Binary files a/tests/visual_tests/images/harfbuzz-800-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/harfbuzz-800-200-1.0-cairo-reference.png b/tests/visual_tests/images/harfbuzz-800-200-1.0-cairo-reference.png
deleted file mode 100644
index f83b277..0000000
Binary files a/tests/visual_tests/images/harfbuzz-800-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/harfbuzz-800-200-2.0-agg-reference.png b/tests/visual_tests/images/harfbuzz-800-200-2.0-agg-reference.png
deleted file mode 100644
index adecccb..0000000
Binary files a/tests/visual_tests/images/harfbuzz-800-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/harfbuzz-800-200-2.0-cairo-reference.png b/tests/visual_tests/images/harfbuzz-800-200-2.0-cairo-reference.png
deleted file mode 100644
index b1fd3d8..0000000
Binary files a/tests/visual_tests/images/harfbuzz-800-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/hb-fontsets-800-200-1.0-agg-reference.png b/tests/visual_tests/images/hb-fontsets-800-200-1.0-agg-reference.png
deleted file mode 100644
index ef8510f..0000000
Binary files a/tests/visual_tests/images/hb-fontsets-800-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/hb-fontsets-800-200-1.0-cairo-reference.png b/tests/visual_tests/images/hb-fontsets-800-200-1.0-cairo-reference.png
deleted file mode 100644
index a521962..0000000
Binary files a/tests/visual_tests/images/hb-fontsets-800-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/hb-fontsets-800-200-2.0-agg-reference.png b/tests/visual_tests/images/hb-fontsets-800-200-2.0-agg-reference.png
deleted file mode 100644
index 18990f2..0000000
Binary files a/tests/visual_tests/images/hb-fontsets-800-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/hb-fontsets-800-200-2.0-cairo-reference.png b/tests/visual_tests/images/hb-fontsets-800-200-2.0-cairo-reference.png
deleted file mode 100644
index b9e7aec..0000000
Binary files a/tests/visual_tests/images/hb-fontsets-800-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/image-filters-galore-512-512-1.0-agg-reference.png b/tests/visual_tests/images/image-filters-galore-512-512-1.0-agg-reference.png
deleted file mode 100644
index 54b234c..0000000
Binary files a/tests/visual_tests/images/image-filters-galore-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/image-filters-galore-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/image-filters-galore-512-512-1.0-cairo-reference.png
deleted file mode 100644
index f6c9d11..0000000
Binary files a/tests/visual_tests/images/image-filters-galore-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/image-filters-galore-512-512-2.0-agg-reference.png b/tests/visual_tests/images/image-filters-galore-512-512-2.0-agg-reference.png
deleted file mode 100644
index 54b234c..0000000
Binary files a/tests/visual_tests/images/image-filters-galore-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/image-filters-galore-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/image-filters-galore-512-512-2.0-cairo-reference.png
deleted file mode 100644
index f6c9d11..0000000
Binary files a/tests/visual_tests/images/image-filters-galore-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/image-filters-multi-blur-512-512-1.0-agg-reference.png b/tests/visual_tests/images/image-filters-multi-blur-512-512-1.0-agg-reference.png
deleted file mode 100644
index 55ebc57..0000000
Binary files a/tests/visual_tests/images/image-filters-multi-blur-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/image-filters-multi-blur-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/image-filters-multi-blur-512-512-1.0-cairo-reference.png
deleted file mode 100644
index caf6fc8..0000000
Binary files a/tests/visual_tests/images/image-filters-multi-blur-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/image-filters-multi-blur-512-512-2.0-agg-reference.png b/tests/visual_tests/images/image-filters-multi-blur-512-512-2.0-agg-reference.png
deleted file mode 100644
index b945e82..0000000
Binary files a/tests/visual_tests/images/image-filters-multi-blur-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/image-filters-multi-blur-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/image-filters-multi-blur-512-512-2.0-cairo-reference.png
deleted file mode 100644
index e6ce030..0000000
Binary files a/tests/visual_tests/images/image-filters-multi-blur-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/image-filters-multi-blur-inflate-512-512-1.0-agg-reference.png b/tests/visual_tests/images/image-filters-multi-blur-inflate-512-512-1.0-agg-reference.png
deleted file mode 100644
index a94e93a..0000000
Binary files a/tests/visual_tests/images/image-filters-multi-blur-inflate-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/image-filters-multi-blur-inflate-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/image-filters-multi-blur-inflate-512-512-1.0-cairo-reference.png
deleted file mode 100644
index caf6fc8..0000000
Binary files a/tests/visual_tests/images/image-filters-multi-blur-inflate-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/image-filters-multi-blur-inflate-512-512-2.0-agg-reference.png b/tests/visual_tests/images/image-filters-multi-blur-inflate-512-512-2.0-agg-reference.png
deleted file mode 100644
index 79b2afb..0000000
Binary files a/tests/visual_tests/images/image-filters-multi-blur-inflate-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/image-filters-multi-blur-inflate-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/image-filters-multi-blur-inflate-512-512-2.0-cairo-reference.png
deleted file mode 100644
index e6ce030..0000000
Binary files a/tests/visual_tests/images/image-filters-multi-blur-inflate-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/jalign-auto-200-200-1.0-agg-reference.png b/tests/visual_tests/images/jalign-auto-200-200-1.0-agg-reference.png
deleted file mode 100644
index 0fd4d81..0000000
Binary files a/tests/visual_tests/images/jalign-auto-200-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/jalign-auto-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/jalign-auto-200-200-1.0-cairo-reference.png
deleted file mode 100644
index a92df87..0000000
Binary files a/tests/visual_tests/images/jalign-auto-200-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/jalign-auto-200-200-2.0-agg-reference.png b/tests/visual_tests/images/jalign-auto-200-200-2.0-agg-reference.png
deleted file mode 100644
index fecedca..0000000
Binary files a/tests/visual_tests/images/jalign-auto-200-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/jalign-auto-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/jalign-auto-200-200-2.0-cairo-reference.png
deleted file mode 100644
index 8d99da3..0000000
Binary files a/tests/visual_tests/images/jalign-auto-200-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/khmer-800-200-1.0-agg-reference.png b/tests/visual_tests/images/khmer-800-200-1.0-agg-reference.png
deleted file mode 100644
index e462c19..0000000
Binary files a/tests/visual_tests/images/khmer-800-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/khmer-800-200-1.0-cairo-reference.png b/tests/visual_tests/images/khmer-800-200-1.0-cairo-reference.png
deleted file mode 100644
index 9881bc0..0000000
Binary files a/tests/visual_tests/images/khmer-800-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/khmer-800-200-2.0-agg-reference.png b/tests/visual_tests/images/khmer-800-200-2.0-agg-reference.png
deleted file mode 100644
index f54f693..0000000
Binary files a/tests/visual_tests/images/khmer-800-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/khmer-800-200-2.0-cairo-reference.png b/tests/visual_tests/images/khmer-800-200-2.0-cairo-reference.png
deleted file mode 100644
index 38c79e9..0000000
Binary files a/tests/visual_tests/images/khmer-800-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-offset-900-250-1.0-agg-reference.png b/tests/visual_tests/images/line-offset-900-250-1.0-agg-reference.png
deleted file mode 100644
index 644529e..0000000
Binary files a/tests/visual_tests/images/line-offset-900-250-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-offset-900-250-1.0-cairo-reference.png b/tests/visual_tests/images/line-offset-900-250-1.0-cairo-reference.png
deleted file mode 100644
index eb0db95..0000000
Binary files a/tests/visual_tests/images/line-offset-900-250-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-offset-900-250-2.0-agg-reference.png b/tests/visual_tests/images/line-offset-900-250-2.0-agg-reference.png
deleted file mode 100644
index 095d02b..0000000
Binary files a/tests/visual_tests/images/line-offset-900-250-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-offset-900-250-2.0-cairo-reference.png b/tests/visual_tests/images/line-offset-900-250-2.0-cairo-reference.png
deleted file mode 100644
index 8b65591..0000000
Binary files a/tests/visual_tests/images/line-offset-900-250-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-opacity-multi-render-512-512-1.0-agg-reference.png b/tests/visual_tests/images/line-opacity-multi-render-512-512-1.0-agg-reference.png
deleted file mode 100644
index 73a23b9..0000000
Binary files a/tests/visual_tests/images/line-opacity-multi-render-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-opacity-multi-render-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/line-opacity-multi-render-512-512-1.0-cairo-reference.png
deleted file mode 100644
index cadd94f..0000000
Binary files a/tests/visual_tests/images/line-opacity-multi-render-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-opacity-multi-render-512-512-2.0-agg-reference.png b/tests/visual_tests/images/line-opacity-multi-render-512-512-2.0-agg-reference.png
deleted file mode 100644
index 3008425..0000000
Binary files a/tests/visual_tests/images/line-opacity-multi-render-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-opacity-multi-render-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/line-opacity-multi-render-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 94fe30c..0000000
Binary files a/tests/visual_tests/images/line-opacity-multi-render-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-smooth-and-offset-500-100-1.0-agg-reference.png b/tests/visual_tests/images/line-pattern-smooth-and-offset-500-100-1.0-agg-reference.png
deleted file mode 100644
index 6da936d..0000000
Binary files a/tests/visual_tests/images/line-pattern-smooth-and-offset-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-smooth-and-offset-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/line-pattern-smooth-and-offset-500-100-1.0-cairo-reference.png
deleted file mode 100644
index 9818100..0000000
Binary files a/tests/visual_tests/images/line-pattern-smooth-and-offset-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-smooth-and-offset-500-100-2.0-agg-reference.png b/tests/visual_tests/images/line-pattern-smooth-and-offset-500-100-2.0-agg-reference.png
deleted file mode 100644
index a8b724e..0000000
Binary files a/tests/visual_tests/images/line-pattern-smooth-and-offset-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-smooth-and-offset-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/line-pattern-smooth-and-offset-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 41c6076..0000000
Binary files a/tests/visual_tests/images/line-pattern-smooth-and-offset-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-smooth-and-offset-512-512-1.0-agg-reference.png b/tests/visual_tests/images/line-pattern-smooth-and-offset-512-512-1.0-agg-reference.png
deleted file mode 100644
index 0d6a3d3..0000000
Binary files a/tests/visual_tests/images/line-pattern-smooth-and-offset-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-smooth-and-offset-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/line-pattern-smooth-and-offset-512-512-1.0-cairo-reference.png
deleted file mode 100644
index ae5d716..0000000
Binary files a/tests/visual_tests/images/line-pattern-smooth-and-offset-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-smooth-and-offset-512-512-2.0-agg-reference.png b/tests/visual_tests/images/line-pattern-smooth-and-offset-512-512-2.0-agg-reference.png
deleted file mode 100644
index ef457d5..0000000
Binary files a/tests/visual_tests/images/line-pattern-smooth-and-offset-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-smooth-and-offset-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/line-pattern-smooth-and-offset-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 19c6e08..0000000
Binary files a/tests/visual_tests/images/line-pattern-smooth-and-offset-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-symbolizer-900-250-1.0-agg-reference.png b/tests/visual_tests/images/line-pattern-symbolizer-900-250-1.0-agg-reference.png
deleted file mode 100644
index 6ea65c9..0000000
Binary files a/tests/visual_tests/images/line-pattern-symbolizer-900-250-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-symbolizer-900-250-1.0-cairo-reference.png b/tests/visual_tests/images/line-pattern-symbolizer-900-250-1.0-cairo-reference.png
deleted file mode 100644
index 9509825..0000000
Binary files a/tests/visual_tests/images/line-pattern-symbolizer-900-250-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-symbolizer-900-250-2.0-agg-reference.png b/tests/visual_tests/images/line-pattern-symbolizer-900-250-2.0-agg-reference.png
deleted file mode 100644
index 40f1b7f..0000000
Binary files a/tests/visual_tests/images/line-pattern-symbolizer-900-250-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-symbolizer-900-250-2.0-cairo-reference.png b/tests/visual_tests/images/line-pattern-symbolizer-900-250-2.0-cairo-reference.png
deleted file mode 100644
index 1e3888f..0000000
Binary files a/tests/visual_tests/images/line-pattern-symbolizer-900-250-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-symbolizer-opacity-512-512-1.0-agg-reference.png b/tests/visual_tests/images/line-pattern-symbolizer-opacity-512-512-1.0-agg-reference.png
deleted file mode 100644
index 8a8f5d5..0000000
Binary files a/tests/visual_tests/images/line-pattern-symbolizer-opacity-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-symbolizer-opacity-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/line-pattern-symbolizer-opacity-512-512-1.0-cairo-reference.png
deleted file mode 100644
index ea54754..0000000
Binary files a/tests/visual_tests/images/line-pattern-symbolizer-opacity-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-symbolizer-opacity-512-512-2.0-agg-reference.png b/tests/visual_tests/images/line-pattern-symbolizer-opacity-512-512-2.0-agg-reference.png
deleted file mode 100644
index 8a8f5d5..0000000
Binary files a/tests/visual_tests/images/line-pattern-symbolizer-opacity-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-pattern-symbolizer-opacity-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/line-pattern-symbolizer-opacity-512-512-2.0-cairo-reference.png
deleted file mode 100644
index ea54754..0000000
Binary files a/tests/visual_tests/images/line-pattern-symbolizer-opacity-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-smooth-and-offset-512-512-1.0-agg-reference.png b/tests/visual_tests/images/line-smooth-and-offset-512-512-1.0-agg-reference.png
deleted file mode 100644
index 786645c..0000000
Binary files a/tests/visual_tests/images/line-smooth-and-offset-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-smooth-and-offset-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/line-smooth-and-offset-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 7ab02a0..0000000
Binary files a/tests/visual_tests/images/line-smooth-and-offset-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-smooth-and-offset-512-512-2.0-agg-reference.png b/tests/visual_tests/images/line-smooth-and-offset-512-512-2.0-agg-reference.png
deleted file mode 100644
index 35a0d4a..0000000
Binary files a/tests/visual_tests/images/line-smooth-and-offset-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-smooth-and-offset-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/line-smooth-and-offset-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 0afbde7..0000000
Binary files a/tests/visual_tests/images/line-smooth-and-offset-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-symbolizer-expressions-256-256-1.0-agg-reference.png b/tests/visual_tests/images/line-symbolizer-expressions-256-256-1.0-agg-reference.png
deleted file mode 100644
index bbd772b..0000000
Binary files a/tests/visual_tests/images/line-symbolizer-expressions-256-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-symbolizer-expressions-256-256-1.0-cairo-reference.png b/tests/visual_tests/images/line-symbolizer-expressions-256-256-1.0-cairo-reference.png
deleted file mode 100644
index cd59af5..0000000
Binary files a/tests/visual_tests/images/line-symbolizer-expressions-256-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-symbolizer-expressions-256-256-2.0-agg-reference.png b/tests/visual_tests/images/line-symbolizer-expressions-256-256-2.0-agg-reference.png
deleted file mode 100644
index aea44bb..0000000
Binary files a/tests/visual_tests/images/line-symbolizer-expressions-256-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-symbolizer-expressions-256-256-2.0-cairo-reference.png b/tests/visual_tests/images/line-symbolizer-expressions-256-256-2.0-cairo-reference.png
deleted file mode 100644
index 682c966..0000000
Binary files a/tests/visual_tests/images/line-symbolizer-expressions-256-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-symbolizer-expressions-all-256-256-1.0-agg-reference.png b/tests/visual_tests/images/line-symbolizer-expressions-all-256-256-1.0-agg-reference.png
deleted file mode 100644
index 41dc4e7..0000000
Binary files a/tests/visual_tests/images/line-symbolizer-expressions-all-256-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-symbolizer-expressions-all-256-256-1.0-cairo-reference.png b/tests/visual_tests/images/line-symbolizer-expressions-all-256-256-1.0-cairo-reference.png
deleted file mode 100644
index b9be12a..0000000
Binary files a/tests/visual_tests/images/line-symbolizer-expressions-all-256-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-symbolizer-expressions-all-256-256-2.0-agg-reference.png b/tests/visual_tests/images/line-symbolizer-expressions-all-256-256-2.0-agg-reference.png
deleted file mode 100644
index 9ada2e9..0000000
Binary files a/tests/visual_tests/images/line-symbolizer-expressions-all-256-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line-symbolizer-expressions-all-256-256-2.0-cairo-reference.png b/tests/visual_tests/images/line-symbolizer-expressions-all-256-256-2.0-cairo-reference.png
deleted file mode 100644
index 13149ce..0000000
Binary files a/tests/visual_tests/images/line-symbolizer-expressions-all-256-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line_break-800-800-1.0-agg-reference.png b/tests/visual_tests/images/line_break-800-800-1.0-agg-reference.png
deleted file mode 100644
index af83882..0000000
Binary files a/tests/visual_tests/images/line_break-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line_break-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/line_break-800-800-1.0-cairo-reference.png
deleted file mode 100644
index dcfab57..0000000
Binary files a/tests/visual_tests/images/line_break-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line_break-800-800-2.0-agg-reference.png b/tests/visual_tests/images/line_break-800-800-2.0-agg-reference.png
deleted file mode 100644
index acf3b55..0000000
Binary files a/tests/visual_tests/images/line_break-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/line_break-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/line_break-800-800-2.0-cairo-reference.png
deleted file mode 100644
index c60f3b2..0000000
Binary files a/tests/visual_tests/images/line_break-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-200-200-1.0-agg-reference.png b/tests/visual_tests/images/lines-1-200-200-1.0-agg-reference.png
deleted file mode 100644
index 7a7c3c8..0000000
Binary files a/tests/visual_tests/images/lines-1-200-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/lines-1-200-200-1.0-cairo-reference.png
deleted file mode 100644
index 93c255c..0000000
Binary files a/tests/visual_tests/images/lines-1-200-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-200-200-2.0-agg-reference.png b/tests/visual_tests/images/lines-1-200-200-2.0-agg-reference.png
deleted file mode 100644
index e530c6c..0000000
Binary files a/tests/visual_tests/images/lines-1-200-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/lines-1-200-200-2.0-cairo-reference.png
deleted file mode 100644
index 81727a6..0000000
Binary files a/tests/visual_tests/images/lines-1-200-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-400-400-1.0-agg-reference.png b/tests/visual_tests/images/lines-1-400-400-1.0-agg-reference.png
deleted file mode 100644
index e68990c..0000000
Binary files a/tests/visual_tests/images/lines-1-400-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-400-400-1.0-cairo-reference.png b/tests/visual_tests/images/lines-1-400-400-1.0-cairo-reference.png
deleted file mode 100644
index 07b7fc9..0000000
Binary files a/tests/visual_tests/images/lines-1-400-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-400-400-2.0-agg-reference.png b/tests/visual_tests/images/lines-1-400-400-2.0-agg-reference.png
deleted file mode 100644
index 0605028..0000000
Binary files a/tests/visual_tests/images/lines-1-400-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-400-400-2.0-cairo-reference.png b/tests/visual_tests/images/lines-1-400-400-2.0-cairo-reference.png
deleted file mode 100644
index ed284c2..0000000
Binary files a/tests/visual_tests/images/lines-1-400-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-600-600-1.0-agg-reference.png b/tests/visual_tests/images/lines-1-600-600-1.0-agg-reference.png
deleted file mode 100644
index 912e65c..0000000
Binary files a/tests/visual_tests/images/lines-1-600-600-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-600-600-1.0-cairo-reference.png b/tests/visual_tests/images/lines-1-600-600-1.0-cairo-reference.png
deleted file mode 100644
index 35afcf1..0000000
Binary files a/tests/visual_tests/images/lines-1-600-600-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-600-600-2.0-agg-reference.png b/tests/visual_tests/images/lines-1-600-600-2.0-agg-reference.png
deleted file mode 100644
index 260706b..0000000
Binary files a/tests/visual_tests/images/lines-1-600-600-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-600-600-2.0-cairo-reference.png b/tests/visual_tests/images/lines-1-600-600-2.0-cairo-reference.png
deleted file mode 100644
index 2cee875..0000000
Binary files a/tests/visual_tests/images/lines-1-600-600-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-800-800-1.0-agg-reference.png b/tests/visual_tests/images/lines-1-800-800-1.0-agg-reference.png
deleted file mode 100644
index 5c2cc64..0000000
Binary files a/tests/visual_tests/images/lines-1-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/lines-1-800-800-1.0-cairo-reference.png
deleted file mode 100644
index 7388c13..0000000
Binary files a/tests/visual_tests/images/lines-1-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-800-800-2.0-agg-reference.png b/tests/visual_tests/images/lines-1-800-800-2.0-agg-reference.png
deleted file mode 100644
index c0030e5..0000000
Binary files a/tests/visual_tests/images/lines-1-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-1-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/lines-1-800-800-2.0-cairo-reference.png
deleted file mode 100644
index e9da30f..0000000
Binary files a/tests/visual_tests/images/lines-1-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-200-200-1.0-agg-reference.png b/tests/visual_tests/images/lines-2-200-200-1.0-agg-reference.png
deleted file mode 100644
index 33a15c6..0000000
Binary files a/tests/visual_tests/images/lines-2-200-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/lines-2-200-200-1.0-cairo-reference.png
deleted file mode 100644
index c945b65..0000000
Binary files a/tests/visual_tests/images/lines-2-200-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-200-200-2.0-agg-reference.png b/tests/visual_tests/images/lines-2-200-200-2.0-agg-reference.png
deleted file mode 100644
index e530c6c..0000000
Binary files a/tests/visual_tests/images/lines-2-200-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/lines-2-200-200-2.0-cairo-reference.png
deleted file mode 100644
index 81727a6..0000000
Binary files a/tests/visual_tests/images/lines-2-200-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-400-400-1.0-agg-reference.png b/tests/visual_tests/images/lines-2-400-400-1.0-agg-reference.png
deleted file mode 100644
index 6e53a49..0000000
Binary files a/tests/visual_tests/images/lines-2-400-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-400-400-1.0-cairo-reference.png b/tests/visual_tests/images/lines-2-400-400-1.0-cairo-reference.png
deleted file mode 100644
index 64034f8..0000000
Binary files a/tests/visual_tests/images/lines-2-400-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-400-400-2.0-agg-reference.png b/tests/visual_tests/images/lines-2-400-400-2.0-agg-reference.png
deleted file mode 100644
index 78d6c96..0000000
Binary files a/tests/visual_tests/images/lines-2-400-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-400-400-2.0-cairo-reference.png b/tests/visual_tests/images/lines-2-400-400-2.0-cairo-reference.png
deleted file mode 100644
index 36d395b..0000000
Binary files a/tests/visual_tests/images/lines-2-400-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-600-600-1.0-agg-reference.png b/tests/visual_tests/images/lines-2-600-600-1.0-agg-reference.png
deleted file mode 100644
index 492c933..0000000
Binary files a/tests/visual_tests/images/lines-2-600-600-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-600-600-1.0-cairo-reference.png b/tests/visual_tests/images/lines-2-600-600-1.0-cairo-reference.png
deleted file mode 100644
index 18d7276..0000000
Binary files a/tests/visual_tests/images/lines-2-600-600-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-600-600-2.0-agg-reference.png b/tests/visual_tests/images/lines-2-600-600-2.0-agg-reference.png
deleted file mode 100644
index 1467f96..0000000
Binary files a/tests/visual_tests/images/lines-2-600-600-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-600-600-2.0-cairo-reference.png b/tests/visual_tests/images/lines-2-600-600-2.0-cairo-reference.png
deleted file mode 100644
index b9d8164..0000000
Binary files a/tests/visual_tests/images/lines-2-600-600-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-800-800-1.0-agg-reference.png b/tests/visual_tests/images/lines-2-800-800-1.0-agg-reference.png
deleted file mode 100644
index 9ceff11..0000000
Binary files a/tests/visual_tests/images/lines-2-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/lines-2-800-800-1.0-cairo-reference.png
deleted file mode 100644
index f09adfb..0000000
Binary files a/tests/visual_tests/images/lines-2-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-800-800-2.0-agg-reference.png b/tests/visual_tests/images/lines-2-800-800-2.0-agg-reference.png
deleted file mode 100644
index 1d78e4b..0000000
Binary files a/tests/visual_tests/images/lines-2-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-2-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/lines-2-800-800-2.0-cairo-reference.png
deleted file mode 100644
index 4e57885..0000000
Binary files a/tests/visual_tests/images/lines-2-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-200-200-1.0-agg-reference.png b/tests/visual_tests/images/lines-3-200-200-1.0-agg-reference.png
deleted file mode 100644
index 7a7c3c8..0000000
Binary files a/tests/visual_tests/images/lines-3-200-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/lines-3-200-200-1.0-cairo-reference.png
deleted file mode 100644
index 93c255c..0000000
Binary files a/tests/visual_tests/images/lines-3-200-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-200-200-2.0-agg-reference.png b/tests/visual_tests/images/lines-3-200-200-2.0-agg-reference.png
deleted file mode 100644
index e530c6c..0000000
Binary files a/tests/visual_tests/images/lines-3-200-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/lines-3-200-200-2.0-cairo-reference.png
deleted file mode 100644
index 81727a6..0000000
Binary files a/tests/visual_tests/images/lines-3-200-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-400-400-1.0-agg-reference.png b/tests/visual_tests/images/lines-3-400-400-1.0-agg-reference.png
deleted file mode 100644
index b3ba36e..0000000
Binary files a/tests/visual_tests/images/lines-3-400-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-400-400-1.0-cairo-reference.png b/tests/visual_tests/images/lines-3-400-400-1.0-cairo-reference.png
deleted file mode 100644
index ca4fbf6..0000000
Binary files a/tests/visual_tests/images/lines-3-400-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-400-400-2.0-agg-reference.png b/tests/visual_tests/images/lines-3-400-400-2.0-agg-reference.png
deleted file mode 100644
index 0605028..0000000
Binary files a/tests/visual_tests/images/lines-3-400-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-400-400-2.0-cairo-reference.png b/tests/visual_tests/images/lines-3-400-400-2.0-cairo-reference.png
deleted file mode 100644
index ed284c2..0000000
Binary files a/tests/visual_tests/images/lines-3-400-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-600-600-1.0-agg-reference.png b/tests/visual_tests/images/lines-3-600-600-1.0-agg-reference.png
deleted file mode 100644
index 02a48ad..0000000
Binary files a/tests/visual_tests/images/lines-3-600-600-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-600-600-1.0-cairo-reference.png b/tests/visual_tests/images/lines-3-600-600-1.0-cairo-reference.png
deleted file mode 100644
index b7b73c7..0000000
Binary files a/tests/visual_tests/images/lines-3-600-600-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-600-600-2.0-agg-reference.png b/tests/visual_tests/images/lines-3-600-600-2.0-agg-reference.png
deleted file mode 100644
index 54ed9f8..0000000
Binary files a/tests/visual_tests/images/lines-3-600-600-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-600-600-2.0-cairo-reference.png b/tests/visual_tests/images/lines-3-600-600-2.0-cairo-reference.png
deleted file mode 100644
index d2bf0b2..0000000
Binary files a/tests/visual_tests/images/lines-3-600-600-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-800-800-1.0-agg-reference.png b/tests/visual_tests/images/lines-3-800-800-1.0-agg-reference.png
deleted file mode 100644
index 628ca4d..0000000
Binary files a/tests/visual_tests/images/lines-3-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/lines-3-800-800-1.0-cairo-reference.png
deleted file mode 100644
index 47a1783..0000000
Binary files a/tests/visual_tests/images/lines-3-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-800-800-2.0-agg-reference.png b/tests/visual_tests/images/lines-3-800-800-2.0-agg-reference.png
deleted file mode 100644
index 6e81e90..0000000
Binary files a/tests/visual_tests/images/lines-3-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-3-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/lines-3-800-800-2.0-cairo-reference.png
deleted file mode 100644
index 78b0147..0000000
Binary files a/tests/visual_tests/images/lines-3-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-200-200-1.0-agg-reference.png b/tests/visual_tests/images/lines-4-200-200-1.0-agg-reference.png
deleted file mode 100644
index 6a6d675..0000000
Binary files a/tests/visual_tests/images/lines-4-200-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/lines-4-200-200-1.0-cairo-reference.png
deleted file mode 100644
index bc2fa8b..0000000
Binary files a/tests/visual_tests/images/lines-4-200-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-200-200-2.0-agg-reference.png b/tests/visual_tests/images/lines-4-200-200-2.0-agg-reference.png
deleted file mode 100644
index ea83730..0000000
Binary files a/tests/visual_tests/images/lines-4-200-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/lines-4-200-200-2.0-cairo-reference.png
deleted file mode 100644
index 592ab35..0000000
Binary files a/tests/visual_tests/images/lines-4-200-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-400-400-1.0-agg-reference.png b/tests/visual_tests/images/lines-4-400-400-1.0-agg-reference.png
deleted file mode 100644
index 8199781..0000000
Binary files a/tests/visual_tests/images/lines-4-400-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-400-400-1.0-cairo-reference.png b/tests/visual_tests/images/lines-4-400-400-1.0-cairo-reference.png
deleted file mode 100644
index e636931..0000000
Binary files a/tests/visual_tests/images/lines-4-400-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-400-400-2.0-agg-reference.png b/tests/visual_tests/images/lines-4-400-400-2.0-agg-reference.png
deleted file mode 100644
index ce8f7de..0000000
Binary files a/tests/visual_tests/images/lines-4-400-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-400-400-2.0-cairo-reference.png b/tests/visual_tests/images/lines-4-400-400-2.0-cairo-reference.png
deleted file mode 100644
index e09dc9c..0000000
Binary files a/tests/visual_tests/images/lines-4-400-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-600-600-1.0-agg-reference.png b/tests/visual_tests/images/lines-4-600-600-1.0-agg-reference.png
deleted file mode 100644
index c81d0b1..0000000
Binary files a/tests/visual_tests/images/lines-4-600-600-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-600-600-1.0-cairo-reference.png b/tests/visual_tests/images/lines-4-600-600-1.0-cairo-reference.png
deleted file mode 100644
index 3fd65cb..0000000
Binary files a/tests/visual_tests/images/lines-4-600-600-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-600-600-2.0-agg-reference.png b/tests/visual_tests/images/lines-4-600-600-2.0-agg-reference.png
deleted file mode 100644
index 928d519..0000000
Binary files a/tests/visual_tests/images/lines-4-600-600-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-600-600-2.0-cairo-reference.png b/tests/visual_tests/images/lines-4-600-600-2.0-cairo-reference.png
deleted file mode 100644
index 8d9d757..0000000
Binary files a/tests/visual_tests/images/lines-4-600-600-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-800-800-1.0-agg-reference.png b/tests/visual_tests/images/lines-4-800-800-1.0-agg-reference.png
deleted file mode 100644
index 2b5a36e..0000000
Binary files a/tests/visual_tests/images/lines-4-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/lines-4-800-800-1.0-cairo-reference.png
deleted file mode 100644
index 2fb03d1..0000000
Binary files a/tests/visual_tests/images/lines-4-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-800-800-2.0-agg-reference.png b/tests/visual_tests/images/lines-4-800-800-2.0-agg-reference.png
deleted file mode 100644
index dc98a92..0000000
Binary files a/tests/visual_tests/images/lines-4-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-4-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/lines-4-800-800-2.0-cairo-reference.png
deleted file mode 100644
index 0847a7b..0000000
Binary files a/tests/visual_tests/images/lines-4-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-200-200-1.0-agg-reference.png b/tests/visual_tests/images/lines-5-200-200-1.0-agg-reference.png
deleted file mode 100644
index 7cca842..0000000
Binary files a/tests/visual_tests/images/lines-5-200-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/lines-5-200-200-1.0-cairo-reference.png
deleted file mode 100644
index d84fe45..0000000
Binary files a/tests/visual_tests/images/lines-5-200-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-200-200-2.0-agg-reference.png b/tests/visual_tests/images/lines-5-200-200-2.0-agg-reference.png
deleted file mode 100644
index 39150ae..0000000
Binary files a/tests/visual_tests/images/lines-5-200-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/lines-5-200-200-2.0-cairo-reference.png
deleted file mode 100644
index 2bb4af7..0000000
Binary files a/tests/visual_tests/images/lines-5-200-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-400-400-1.0-agg-reference.png b/tests/visual_tests/images/lines-5-400-400-1.0-agg-reference.png
deleted file mode 100644
index cacff31..0000000
Binary files a/tests/visual_tests/images/lines-5-400-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-400-400-1.0-cairo-reference.png b/tests/visual_tests/images/lines-5-400-400-1.0-cairo-reference.png
deleted file mode 100644
index 307a02a..0000000
Binary files a/tests/visual_tests/images/lines-5-400-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-400-400-2.0-agg-reference.png b/tests/visual_tests/images/lines-5-400-400-2.0-agg-reference.png
deleted file mode 100644
index f1e55a5..0000000
Binary files a/tests/visual_tests/images/lines-5-400-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-400-400-2.0-cairo-reference.png b/tests/visual_tests/images/lines-5-400-400-2.0-cairo-reference.png
deleted file mode 100644
index 48e7789..0000000
Binary files a/tests/visual_tests/images/lines-5-400-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-600-600-1.0-agg-reference.png b/tests/visual_tests/images/lines-5-600-600-1.0-agg-reference.png
deleted file mode 100644
index 694b434..0000000
Binary files a/tests/visual_tests/images/lines-5-600-600-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-600-600-1.0-cairo-reference.png b/tests/visual_tests/images/lines-5-600-600-1.0-cairo-reference.png
deleted file mode 100644
index d02431a..0000000
Binary files a/tests/visual_tests/images/lines-5-600-600-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-600-600-2.0-agg-reference.png b/tests/visual_tests/images/lines-5-600-600-2.0-agg-reference.png
deleted file mode 100644
index 3b7d116..0000000
Binary files a/tests/visual_tests/images/lines-5-600-600-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-600-600-2.0-cairo-reference.png b/tests/visual_tests/images/lines-5-600-600-2.0-cairo-reference.png
deleted file mode 100644
index 2ad89f2..0000000
Binary files a/tests/visual_tests/images/lines-5-600-600-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-800-800-1.0-agg-reference.png b/tests/visual_tests/images/lines-5-800-800-1.0-agg-reference.png
deleted file mode 100644
index d9222d5..0000000
Binary files a/tests/visual_tests/images/lines-5-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/lines-5-800-800-1.0-cairo-reference.png
deleted file mode 100644
index 72192a5..0000000
Binary files a/tests/visual_tests/images/lines-5-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-800-800-2.0-agg-reference.png b/tests/visual_tests/images/lines-5-800-800-2.0-agg-reference.png
deleted file mode 100644
index 03aff50..0000000
Binary files a/tests/visual_tests/images/lines-5-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-5-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/lines-5-800-800-2.0-cairo-reference.png
deleted file mode 100644
index ef2b935..0000000
Binary files a/tests/visual_tests/images/lines-5-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-200-200-1.0-agg-reference.png b/tests/visual_tests/images/lines-6-200-200-1.0-agg-reference.png
deleted file mode 100644
index 6d0cdba..0000000
Binary files a/tests/visual_tests/images/lines-6-200-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/lines-6-200-200-1.0-cairo-reference.png
deleted file mode 100644
index 6a6d2d8..0000000
Binary files a/tests/visual_tests/images/lines-6-200-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-200-200-2.0-agg-reference.png b/tests/visual_tests/images/lines-6-200-200-2.0-agg-reference.png
deleted file mode 100644
index 3a13092..0000000
Binary files a/tests/visual_tests/images/lines-6-200-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/lines-6-200-200-2.0-cairo-reference.png
deleted file mode 100644
index dba440d..0000000
Binary files a/tests/visual_tests/images/lines-6-200-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-400-400-1.0-agg-reference.png b/tests/visual_tests/images/lines-6-400-400-1.0-agg-reference.png
deleted file mode 100644
index c063219..0000000
Binary files a/tests/visual_tests/images/lines-6-400-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-400-400-1.0-cairo-reference.png b/tests/visual_tests/images/lines-6-400-400-1.0-cairo-reference.png
deleted file mode 100644
index 887ccb7..0000000
Binary files a/tests/visual_tests/images/lines-6-400-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-400-400-2.0-agg-reference.png b/tests/visual_tests/images/lines-6-400-400-2.0-agg-reference.png
deleted file mode 100644
index 3f0b8c7..0000000
Binary files a/tests/visual_tests/images/lines-6-400-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-400-400-2.0-cairo-reference.png b/tests/visual_tests/images/lines-6-400-400-2.0-cairo-reference.png
deleted file mode 100644
index b6bd44f..0000000
Binary files a/tests/visual_tests/images/lines-6-400-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-600-600-1.0-agg-reference.png b/tests/visual_tests/images/lines-6-600-600-1.0-agg-reference.png
deleted file mode 100644
index e422caa..0000000
Binary files a/tests/visual_tests/images/lines-6-600-600-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-600-600-1.0-cairo-reference.png b/tests/visual_tests/images/lines-6-600-600-1.0-cairo-reference.png
deleted file mode 100644
index 385b8ed..0000000
Binary files a/tests/visual_tests/images/lines-6-600-600-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-600-600-2.0-agg-reference.png b/tests/visual_tests/images/lines-6-600-600-2.0-agg-reference.png
deleted file mode 100644
index de5b4d9..0000000
Binary files a/tests/visual_tests/images/lines-6-600-600-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-600-600-2.0-cairo-reference.png b/tests/visual_tests/images/lines-6-600-600-2.0-cairo-reference.png
deleted file mode 100644
index 6bf6182..0000000
Binary files a/tests/visual_tests/images/lines-6-600-600-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-800-800-1.0-agg-reference.png b/tests/visual_tests/images/lines-6-800-800-1.0-agg-reference.png
deleted file mode 100644
index e54dfa3..0000000
Binary files a/tests/visual_tests/images/lines-6-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/lines-6-800-800-1.0-cairo-reference.png
deleted file mode 100644
index 995c36c..0000000
Binary files a/tests/visual_tests/images/lines-6-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-800-800-2.0-agg-reference.png b/tests/visual_tests/images/lines-6-800-800-2.0-agg-reference.png
deleted file mode 100644
index f074a02..0000000
Binary files a/tests/visual_tests/images/lines-6-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-6-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/lines-6-800-800-2.0-cairo-reference.png
deleted file mode 100644
index 6d9a037..0000000
Binary files a/tests/visual_tests/images/lines-6-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-200-200-1.0-agg-reference.png b/tests/visual_tests/images/lines-7-200-200-1.0-agg-reference.png
deleted file mode 100644
index f87ecce..0000000
Binary files a/tests/visual_tests/images/lines-7-200-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/lines-7-200-200-1.0-cairo-reference.png
deleted file mode 100644
index cbf367e..0000000
Binary files a/tests/visual_tests/images/lines-7-200-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-200-200-2.0-agg-reference.png b/tests/visual_tests/images/lines-7-200-200-2.0-agg-reference.png
deleted file mode 100644
index d07c856..0000000
Binary files a/tests/visual_tests/images/lines-7-200-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/lines-7-200-200-2.0-cairo-reference.png
deleted file mode 100644
index 24fd98a..0000000
Binary files a/tests/visual_tests/images/lines-7-200-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-400-400-1.0-agg-reference.png b/tests/visual_tests/images/lines-7-400-400-1.0-agg-reference.png
deleted file mode 100644
index b9b9004..0000000
Binary files a/tests/visual_tests/images/lines-7-400-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-400-400-1.0-cairo-reference.png b/tests/visual_tests/images/lines-7-400-400-1.0-cairo-reference.png
deleted file mode 100644
index 91fa0bf..0000000
Binary files a/tests/visual_tests/images/lines-7-400-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-400-400-2.0-agg-reference.png b/tests/visual_tests/images/lines-7-400-400-2.0-agg-reference.png
deleted file mode 100644
index 705eca6..0000000
Binary files a/tests/visual_tests/images/lines-7-400-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-400-400-2.0-cairo-reference.png b/tests/visual_tests/images/lines-7-400-400-2.0-cairo-reference.png
deleted file mode 100644
index 63e5344..0000000
Binary files a/tests/visual_tests/images/lines-7-400-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-600-600-1.0-agg-reference.png b/tests/visual_tests/images/lines-7-600-600-1.0-agg-reference.png
deleted file mode 100644
index 8b5a497..0000000
Binary files a/tests/visual_tests/images/lines-7-600-600-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-600-600-1.0-cairo-reference.png b/tests/visual_tests/images/lines-7-600-600-1.0-cairo-reference.png
deleted file mode 100644
index ad2661c..0000000
Binary files a/tests/visual_tests/images/lines-7-600-600-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-600-600-2.0-agg-reference.png b/tests/visual_tests/images/lines-7-600-600-2.0-agg-reference.png
deleted file mode 100644
index fe7f809..0000000
Binary files a/tests/visual_tests/images/lines-7-600-600-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-600-600-2.0-cairo-reference.png b/tests/visual_tests/images/lines-7-600-600-2.0-cairo-reference.png
deleted file mode 100644
index 315fc58..0000000
Binary files a/tests/visual_tests/images/lines-7-600-600-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-800-800-1.0-agg-reference.png b/tests/visual_tests/images/lines-7-800-800-1.0-agg-reference.png
deleted file mode 100644
index f45c3f8..0000000
Binary files a/tests/visual_tests/images/lines-7-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/lines-7-800-800-1.0-cairo-reference.png
deleted file mode 100644
index 262be88..0000000
Binary files a/tests/visual_tests/images/lines-7-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-800-800-2.0-agg-reference.png b/tests/visual_tests/images/lines-7-800-800-2.0-agg-reference.png
deleted file mode 100644
index 277e373..0000000
Binary files a/tests/visual_tests/images/lines-7-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-7-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/lines-7-800-800-2.0-cairo-reference.png
deleted file mode 100644
index eb55404..0000000
Binary files a/tests/visual_tests/images/lines-7-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-800-800-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-1-800-800-1.0-agg-reference.png
deleted file mode 100644
index 9642239..0000000
Binary files a/tests/visual_tests/images/lines-multi-layout-1-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-1-800-800-1.0-cairo-reference.png
deleted file mode 100644
index a6c2bf3..0000000
Binary files a/tests/visual_tests/images/lines-multi-layout-1-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-800-800-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-1-800-800-2.0-agg-reference.png
deleted file mode 100644
index 0858043..0000000
Binary files a/tests/visual_tests/images/lines-multi-layout-1-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-multi-layout-1-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-1-800-800-2.0-cairo-reference.png
deleted file mode 100644
index a141bec..0000000
Binary files a/tests/visual_tests/images/lines-multi-layout-1-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-800-800-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-2-800-800-1.0-agg-reference.png
deleted file mode 100644
index 0aeee39..0000000
Binary files a/tests/visual_tests/images/lines-multi-layout-2-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-2-800-800-1.0-cairo-reference.png
deleted file mode 100644
index e43d5b6..0000000
Binary files a/tests/visual_tests/images/lines-multi-layout-2-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-800-800-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-2-800-800-2.0-agg-reference.png
deleted file mode 100644
index 618ea59..0000000
Binary files a/tests/visual_tests/images/lines-multi-layout-2-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-multi-layout-2-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-2-800-800-2.0-cairo-reference.png
deleted file mode 100644
index dad80dc..0000000
Binary files a/tests/visual_tests/images/lines-multi-layout-2-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-800-800-1.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-800-800-1.0-agg-reference.png
deleted file mode 100644
index dc9ab90..0000000
Binary files a/tests/visual_tests/images/lines-multi-layout-shield-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-800-800-1.0-cairo-reference.png
deleted file mode 100644
index 4a6771d..0000000
Binary files a/tests/visual_tests/images/lines-multi-layout-shield-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-800-800-2.0-agg-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-800-800-2.0-agg-reference.png
deleted file mode 100644
index 540104c..0000000
Binary files a/tests/visual_tests/images/lines-multi-layout-shield-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-multi-layout-shield-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/lines-multi-layout-shield-800-800-2.0-cairo-reference.png
deleted file mode 100644
index 5cb7878..0000000
Binary files a/tests/visual_tests/images/lines-multi-layout-shield-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-200-200-1.0-agg-reference.png b/tests/visual_tests/images/lines-shield-200-200-1.0-agg-reference.png
deleted file mode 100644
index fe95cbc..0000000
Binary files a/tests/visual_tests/images/lines-shield-200-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/lines-shield-200-200-1.0-cairo-reference.png
deleted file mode 100644
index d71fc17..0000000
Binary files a/tests/visual_tests/images/lines-shield-200-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-200-200-2.0-agg-reference.png b/tests/visual_tests/images/lines-shield-200-200-2.0-agg-reference.png
deleted file mode 100644
index 6eca66b..0000000
Binary files a/tests/visual_tests/images/lines-shield-200-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/lines-shield-200-200-2.0-cairo-reference.png
deleted file mode 100644
index 886e4ae..0000000
Binary files a/tests/visual_tests/images/lines-shield-200-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-400-400-1.0-agg-reference.png b/tests/visual_tests/images/lines-shield-400-400-1.0-agg-reference.png
deleted file mode 100644
index b26003d..0000000
Binary files a/tests/visual_tests/images/lines-shield-400-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-400-400-1.0-cairo-reference.png b/tests/visual_tests/images/lines-shield-400-400-1.0-cairo-reference.png
deleted file mode 100644
index 1eb2cc5..0000000
Binary files a/tests/visual_tests/images/lines-shield-400-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-400-400-2.0-agg-reference.png b/tests/visual_tests/images/lines-shield-400-400-2.0-agg-reference.png
deleted file mode 100644
index 4142c84..0000000
Binary files a/tests/visual_tests/images/lines-shield-400-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-400-400-2.0-cairo-reference.png b/tests/visual_tests/images/lines-shield-400-400-2.0-cairo-reference.png
deleted file mode 100644
index 2f42825..0000000
Binary files a/tests/visual_tests/images/lines-shield-400-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-600-600-1.0-agg-reference.png b/tests/visual_tests/images/lines-shield-600-600-1.0-agg-reference.png
deleted file mode 100644
index 53506ad..0000000
Binary files a/tests/visual_tests/images/lines-shield-600-600-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-600-600-1.0-cairo-reference.png b/tests/visual_tests/images/lines-shield-600-600-1.0-cairo-reference.png
deleted file mode 100644
index c622bc6..0000000
Binary files a/tests/visual_tests/images/lines-shield-600-600-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-600-600-2.0-agg-reference.png b/tests/visual_tests/images/lines-shield-600-600-2.0-agg-reference.png
deleted file mode 100644
index 69537f8..0000000
Binary files a/tests/visual_tests/images/lines-shield-600-600-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-600-600-2.0-cairo-reference.png b/tests/visual_tests/images/lines-shield-600-600-2.0-cairo-reference.png
deleted file mode 100644
index 27c9757..0000000
Binary files a/tests/visual_tests/images/lines-shield-600-600-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-800-800-1.0-agg-reference.png b/tests/visual_tests/images/lines-shield-800-800-1.0-agg-reference.png
deleted file mode 100644
index 15d4d95..0000000
Binary files a/tests/visual_tests/images/lines-shield-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/lines-shield-800-800-1.0-cairo-reference.png
deleted file mode 100644
index 36650f9..0000000
Binary files a/tests/visual_tests/images/lines-shield-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-800-800-2.0-agg-reference.png b/tests/visual_tests/images/lines-shield-800-800-2.0-agg-reference.png
deleted file mode 100644
index 419c089..0000000
Binary files a/tests/visual_tests/images/lines-shield-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/lines-shield-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/lines-shield-800-800-2.0-cairo-reference.png
deleted file mode 100644
index 6993f63..0000000
Binary files a/tests/visual_tests/images/lines-shield-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-100-100-1.0-agg-reference.png b/tests/visual_tests/images/list-100-100-1.0-agg-reference.png
deleted file mode 100644
index c2f25a4..0000000
Binary files a/tests/visual_tests/images/list-100-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-100-100-1.0-cairo-reference.png b/tests/visual_tests/images/list-100-100-1.0-cairo-reference.png
deleted file mode 100644
index 5c6191b..0000000
Binary files a/tests/visual_tests/images/list-100-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-100-100-2.0-agg-reference.png b/tests/visual_tests/images/list-100-100-2.0-agg-reference.png
deleted file mode 100644
index 60a0c38..0000000
Binary files a/tests/visual_tests/images/list-100-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-100-100-2.0-cairo-reference.png b/tests/visual_tests/images/list-100-100-2.0-cairo-reference.png
deleted file mode 100644
index b489e71..0000000
Binary files a/tests/visual_tests/images/list-100-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-150-100-1.0-agg-reference.png b/tests/visual_tests/images/list-150-100-1.0-agg-reference.png
deleted file mode 100644
index 7f7b989..0000000
Binary files a/tests/visual_tests/images/list-150-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-150-100-1.0-cairo-reference.png b/tests/visual_tests/images/list-150-100-1.0-cairo-reference.png
deleted file mode 100644
index 534efc4..0000000
Binary files a/tests/visual_tests/images/list-150-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-150-100-2.0-agg-reference.png b/tests/visual_tests/images/list-150-100-2.0-agg-reference.png
deleted file mode 100644
index 4099ad4..0000000
Binary files a/tests/visual_tests/images/list-150-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-150-100-2.0-cairo-reference.png b/tests/visual_tests/images/list-150-100-2.0-cairo-reference.png
deleted file mode 100644
index 8541266..0000000
Binary files a/tests/visual_tests/images/list-150-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-250-100-1.0-agg-reference.png b/tests/visual_tests/images/list-250-100-1.0-agg-reference.png
deleted file mode 100644
index 507706a..0000000
Binary files a/tests/visual_tests/images/list-250-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-250-100-1.0-cairo-reference.png b/tests/visual_tests/images/list-250-100-1.0-cairo-reference.png
deleted file mode 100644
index 6fc518e..0000000
Binary files a/tests/visual_tests/images/list-250-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-250-100-2.0-agg-reference.png b/tests/visual_tests/images/list-250-100-2.0-agg-reference.png
deleted file mode 100644
index 9a02784..0000000
Binary files a/tests/visual_tests/images/list-250-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-250-100-2.0-cairo-reference.png b/tests/visual_tests/images/list-250-100-2.0-cairo-reference.png
deleted file mode 100644
index 9705f81..0000000
Binary files a/tests/visual_tests/images/list-250-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-300-100-1.0-agg-reference.png b/tests/visual_tests/images/list-300-100-1.0-agg-reference.png
deleted file mode 100644
index c4c6688..0000000
Binary files a/tests/visual_tests/images/list-300-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-300-100-1.0-cairo-reference.png b/tests/visual_tests/images/list-300-100-1.0-cairo-reference.png
deleted file mode 100644
index 0ff833d..0000000
Binary files a/tests/visual_tests/images/list-300-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-300-100-2.0-agg-reference.png b/tests/visual_tests/images/list-300-100-2.0-agg-reference.png
deleted file mode 100644
index 90f4630..0000000
Binary files a/tests/visual_tests/images/list-300-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-300-100-2.0-cairo-reference.png b/tests/visual_tests/images/list-300-100-2.0-cairo-reference.png
deleted file mode 100644
index f2383ef..0000000
Binary files a/tests/visual_tests/images/list-300-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-400-100-1.0-agg-reference.png b/tests/visual_tests/images/list-400-100-1.0-agg-reference.png
deleted file mode 100644
index 9cfad2f..0000000
Binary files a/tests/visual_tests/images/list-400-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-400-100-1.0-cairo-reference.png b/tests/visual_tests/images/list-400-100-1.0-cairo-reference.png
deleted file mode 100644
index b842717..0000000
Binary files a/tests/visual_tests/images/list-400-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-400-100-2.0-agg-reference.png b/tests/visual_tests/images/list-400-100-2.0-agg-reference.png
deleted file mode 100644
index 0c4336c..0000000
Binary files a/tests/visual_tests/images/list-400-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-400-100-2.0-cairo-reference.png b/tests/visual_tests/images/list-400-100-2.0-cairo-reference.png
deleted file mode 100644
index 74f63ab..0000000
Binary files a/tests/visual_tests/images/list-400-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-600-100-1.0-agg-reference.png b/tests/visual_tests/images/list-600-100-1.0-agg-reference.png
deleted file mode 100644
index 1dd6357..0000000
Binary files a/tests/visual_tests/images/list-600-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-600-100-1.0-cairo-reference.png b/tests/visual_tests/images/list-600-100-1.0-cairo-reference.png
deleted file mode 100644
index 9b782e9..0000000
Binary files a/tests/visual_tests/images/list-600-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-600-100-2.0-agg-reference.png b/tests/visual_tests/images/list-600-100-2.0-agg-reference.png
deleted file mode 100644
index da0b301..0000000
Binary files a/tests/visual_tests/images/list-600-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-600-100-2.0-cairo-reference.png b/tests/visual_tests/images/list-600-100-2.0-cairo-reference.png
deleted file mode 100644
index 68dc8e4..0000000
Binary files a/tests/visual_tests/images/list-600-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-800-100-1.0-agg-reference.png b/tests/visual_tests/images/list-800-100-1.0-agg-reference.png
deleted file mode 100644
index f75cc05..0000000
Binary files a/tests/visual_tests/images/list-800-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-800-100-1.0-cairo-reference.png b/tests/visual_tests/images/list-800-100-1.0-cairo-reference.png
deleted file mode 100644
index a429203..0000000
Binary files a/tests/visual_tests/images/list-800-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-800-100-2.0-agg-reference.png b/tests/visual_tests/images/list-800-100-2.0-agg-reference.png
deleted file mode 100644
index 764fb65..0000000
Binary files a/tests/visual_tests/images/list-800-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/list-800-100-2.0-cairo-reference.png b/tests/visual_tests/images/list-800-100-2.0-cairo-reference.png
deleted file mode 100644
index 0b5d5b7..0000000
Binary files a/tests/visual_tests/images/list-800-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/map-background-image-compositing-512-512-1.0-agg-reference.png b/tests/visual_tests/images/map-background-image-compositing-512-512-1.0-agg-reference.png
deleted file mode 100644
index 1778b2e..0000000
Binary files a/tests/visual_tests/images/map-background-image-compositing-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/map-background-image-compositing-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/map-background-image-compositing-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 0553c74..0000000
Binary files a/tests/visual_tests/images/map-background-image-compositing-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/map-background-image-compositing-512-512-2.0-agg-reference.png b/tests/visual_tests/images/map-background-image-compositing-512-512-2.0-agg-reference.png
deleted file mode 100644
index 02b41e6..0000000
Binary files a/tests/visual_tests/images/map-background-image-compositing-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/map-background-image-compositing-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/map-background-image-compositing-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 6be8ee3..0000000
Binary files a/tests/visual_tests/images/map-background-image-compositing-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-collide-512-512-1.0-agg-reference.png b/tests/visual_tests/images/marker-collide-512-512-1.0-agg-reference.png
deleted file mode 100644
index 104e87d..0000000
Binary files a/tests/visual_tests/images/marker-collide-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-collide-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/marker-collide-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 5767f7f..0000000
Binary files a/tests/visual_tests/images/marker-collide-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-collide-512-512-2.0-agg-reference.png b/tests/visual_tests/images/marker-collide-512-512-2.0-agg-reference.png
deleted file mode 100644
index 95b84c6..0000000
Binary files a/tests/visual_tests/images/marker-collide-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-collide-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/marker-collide-512-512-2.0-cairo-reference.png
deleted file mode 100644
index c5d981e..0000000
Binary files a/tests/visual_tests/images/marker-collide-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-interior-position-600-400-1.0-agg-reference.png b/tests/visual_tests/images/marker-interior-position-600-400-1.0-agg-reference.png
deleted file mode 100644
index 47aaa38..0000000
Binary files a/tests/visual_tests/images/marker-interior-position-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-interior-position-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/marker-interior-position-600-400-1.0-cairo-reference.png
deleted file mode 100644
index 71b3beb..0000000
Binary files a/tests/visual_tests/images/marker-interior-position-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-interior-position-600-400-2.0-agg-reference.png b/tests/visual_tests/images/marker-interior-position-600-400-2.0-agg-reference.png
deleted file mode 100644
index e280621..0000000
Binary files a/tests/visual_tests/images/marker-interior-position-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-interior-position-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/marker-interior-position-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 22f8de2..0000000
Binary files a/tests/visual_tests/images/marker-interior-position-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-multi-policy-600-400-1.0-agg-reference.png b/tests/visual_tests/images/marker-multi-policy-600-400-1.0-agg-reference.png
deleted file mode 100644
index e6dc272..0000000
Binary files a/tests/visual_tests/images/marker-multi-policy-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-multi-policy-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/marker-multi-policy-600-400-1.0-cairo-reference.png
deleted file mode 100644
index 9f83b0e..0000000
Binary files a/tests/visual_tests/images/marker-multi-policy-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-multi-policy-600-400-2.0-agg-reference.png b/tests/visual_tests/images/marker-multi-policy-600-400-2.0-agg-reference.png
deleted file mode 100644
index e45044e..0000000
Binary files a/tests/visual_tests/images/marker-multi-policy-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-multi-policy-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/marker-multi-policy-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 007f317..0000000
Binary files a/tests/visual_tests/images/marker-multi-policy-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-hex-grid-257-256-1.0-agg-reference.png b/tests/visual_tests/images/marker-on-hex-grid-257-256-1.0-agg-reference.png
deleted file mode 100644
index 36268a4..0000000
Binary files a/tests/visual_tests/images/marker-on-hex-grid-257-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-hex-grid-257-256-1.0-cairo-reference.png b/tests/visual_tests/images/marker-on-hex-grid-257-256-1.0-cairo-reference.png
deleted file mode 100644
index 37ffc25..0000000
Binary files a/tests/visual_tests/images/marker-on-hex-grid-257-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-hex-grid-257-256-2.0-agg-reference.png b/tests/visual_tests/images/marker-on-hex-grid-257-256-2.0-agg-reference.png
deleted file mode 100644
index 2f5c6b6..0000000
Binary files a/tests/visual_tests/images/marker-on-hex-grid-257-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-hex-grid-257-256-2.0-cairo-reference.png b/tests/visual_tests/images/marker-on-hex-grid-257-256-2.0-cairo-reference.png
deleted file mode 100644
index 2c9aa89..0000000
Binary files a/tests/visual_tests/images/marker-on-hex-grid-257-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-hex-grid-400-600-1.0-agg-reference.png b/tests/visual_tests/images/marker-on-hex-grid-400-600-1.0-agg-reference.png
deleted file mode 100644
index 987302d..0000000
Binary files a/tests/visual_tests/images/marker-on-hex-grid-400-600-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-hex-grid-400-600-1.0-cairo-reference.png b/tests/visual_tests/images/marker-on-hex-grid-400-600-1.0-cairo-reference.png
deleted file mode 100644
index 3c86658..0000000
Binary files a/tests/visual_tests/images/marker-on-hex-grid-400-600-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-hex-grid-400-600-2.0-agg-reference.png b/tests/visual_tests/images/marker-on-hex-grid-400-600-2.0-agg-reference.png
deleted file mode 100644
index 7047e23..0000000
Binary files a/tests/visual_tests/images/marker-on-hex-grid-400-600-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-hex-grid-400-600-2.0-cairo-reference.png b/tests/visual_tests/images/marker-on-hex-grid-400-600-2.0-cairo-reference.png
deleted file mode 100644
index 4f9a011..0000000
Binary files a/tests/visual_tests/images/marker-on-hex-grid-400-600-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-hex-grid-600-400-1.0-agg-reference.png b/tests/visual_tests/images/marker-on-hex-grid-600-400-1.0-agg-reference.png
deleted file mode 100644
index 48ed8e6..0000000
Binary files a/tests/visual_tests/images/marker-on-hex-grid-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-hex-grid-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/marker-on-hex-grid-600-400-1.0-cairo-reference.png
deleted file mode 100644
index c0d01e3..0000000
Binary files a/tests/visual_tests/images/marker-on-hex-grid-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-hex-grid-600-400-2.0-agg-reference.png b/tests/visual_tests/images/marker-on-hex-grid-600-400-2.0-agg-reference.png
deleted file mode 100644
index d064ce2..0000000
Binary files a/tests/visual_tests/images/marker-on-hex-grid-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-hex-grid-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/marker-on-hex-grid-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 1970f5d..0000000
Binary files a/tests/visual_tests/images/marker-on-hex-grid-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-600-400-1.0-agg-reference.png b/tests/visual_tests/images/marker-on-line-600-400-1.0-agg-reference.png
deleted file mode 100644
index 6fbe8f5..0000000
Binary files a/tests/visual_tests/images/marker-on-line-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/marker-on-line-600-400-1.0-cairo-reference.png
deleted file mode 100644
index ac653fd..0000000
Binary files a/tests/visual_tests/images/marker-on-line-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-600-400-2.0-agg-reference.png b/tests/visual_tests/images/marker-on-line-600-400-2.0-agg-reference.png
deleted file mode 100644
index 4c7ceb8..0000000
Binary files a/tests/visual_tests/images/marker-on-line-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/marker-on-line-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 7d29f70..0000000
Binary files a/tests/visual_tests/images/marker-on-line-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-avoid-edges-512-512-1.0-agg-reference.png b/tests/visual_tests/images/marker-on-line-and-avoid-edges-512-512-1.0-agg-reference.png
deleted file mode 100644
index dbb58e1..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-avoid-edges-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-avoid-edges-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/marker-on-line-and-avoid-edges-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 8ad8633..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-avoid-edges-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-avoid-edges-512-512-2.0-agg-reference.png b/tests/visual_tests/images/marker-on-line-and-avoid-edges-512-512-2.0-agg-reference.png
deleted file mode 100644
index a928205..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-avoid-edges-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-avoid-edges-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/marker-on-line-and-avoid-edges-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 86e7371..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-avoid-edges-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-1.0-agg-reference.png b/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-1.0-agg-reference.png
deleted file mode 100644
index 63fa8a6..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-1.0-cairo-reference.png
deleted file mode 100644
index baf6176..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-2.0-agg-reference.png b/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-2.0-agg-reference.png
deleted file mode 100644
index 754d220..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 8132215..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-line-placement-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-vertex-first-placement-600-400-1.0-agg-reference.png b/tests/visual_tests/images/marker-on-line-and-vertex-first-placement-600-400-1.0-agg-reference.png
deleted file mode 100644
index cf1c4e9..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-vertex-first-placement-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-vertex-first-placement-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/marker-on-line-and-vertex-first-placement-600-400-1.0-cairo-reference.png
deleted file mode 100644
index 1d862a9..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-vertex-first-placement-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-vertex-first-placement-600-400-2.0-agg-reference.png b/tests/visual_tests/images/marker-on-line-and-vertex-first-placement-600-400-2.0-agg-reference.png
deleted file mode 100644
index f558b77..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-vertex-first-placement-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-vertex-first-placement-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/marker-on-line-and-vertex-first-placement-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 4af718a..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-vertex-first-placement-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-vertex-last-placement-600-400-1.0-agg-reference.png b/tests/visual_tests/images/marker-on-line-and-vertex-last-placement-600-400-1.0-agg-reference.png
deleted file mode 100644
index f892d13..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-vertex-last-placement-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-vertex-last-placement-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/marker-on-line-and-vertex-last-placement-600-400-1.0-cairo-reference.png
deleted file mode 100644
index 5f8bd35..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-vertex-last-placement-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-vertex-last-placement-600-400-2.0-agg-reference.png b/tests/visual_tests/images/marker-on-line-and-vertex-last-placement-600-400-2.0-agg-reference.png
deleted file mode 100644
index 69045d7..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-vertex-last-placement-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-and-vertex-last-placement-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/marker-on-line-and-vertex-last-placement-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 3e1c3cf..0000000
Binary files a/tests/visual_tests/images/marker-on-line-and-vertex-last-placement-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-1.0-agg-reference.png b/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-1.0-agg-reference.png
deleted file mode 100644
index cc8483f..0000000
Binary files a/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-1.0-cairo-reference.png
deleted file mode 100644
index b737004..0000000
Binary files a/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-2.0-agg-reference.png b/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-2.0-agg-reference.png
deleted file mode 100644
index b2c926d..0000000
Binary files a/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 9f2e33c..0000000
Binary files a/tests/visual_tests/images/marker-on-line-spacing-eq-width-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-1.0-agg-reference.png b/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-1.0-agg-reference.png
deleted file mode 100644
index 4d7850f..0000000
Binary files a/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-1.0-cairo-reference.png
deleted file mode 100644
index 0318ea9..0000000
Binary files a/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-2.0-agg-reference.png b/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-2.0-agg-reference.png
deleted file mode 100644
index 11fdf0e..0000000
Binary files a/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-2.0-cairo-reference.png
deleted file mode 100644
index bcea41a..0000000
Binary files a/tests/visual_tests/images/marker-on-line-spacing-eq-width-overlap-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-path-expression-500-100-1.0-agg-reference.png b/tests/visual_tests/images/marker-path-expression-500-100-1.0-agg-reference.png
deleted file mode 100644
index bb59b5a..0000000
Binary files a/tests/visual_tests/images/marker-path-expression-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-path-expression-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/marker-path-expression-500-100-1.0-cairo-reference.png
deleted file mode 100644
index ba70ac9..0000000
Binary files a/tests/visual_tests/images/marker-path-expression-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-path-expression-500-100-2.0-agg-reference.png b/tests/visual_tests/images/marker-path-expression-500-100-2.0-agg-reference.png
deleted file mode 100644
index 146fafd..0000000
Binary files a/tests/visual_tests/images/marker-path-expression-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-path-expression-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/marker-path-expression-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 9180f89..0000000
Binary files a/tests/visual_tests/images/marker-path-expression-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-recenter-collide-256-128-1.0-agg-reference.png b/tests/visual_tests/images/marker-recenter-collide-256-128-1.0-agg-reference.png
deleted file mode 100644
index ca602d3..0000000
Binary files a/tests/visual_tests/images/marker-recenter-collide-256-128-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-recenter-collide-256-128-1.0-cairo-reference.png b/tests/visual_tests/images/marker-recenter-collide-256-128-1.0-cairo-reference.png
deleted file mode 100644
index 9f36676..0000000
Binary files a/tests/visual_tests/images/marker-recenter-collide-256-128-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-recenter-collide-256-128-2.0-agg-reference.png b/tests/visual_tests/images/marker-recenter-collide-256-128-2.0-agg-reference.png
deleted file mode 100644
index 4c46d08..0000000
Binary files a/tests/visual_tests/images/marker-recenter-collide-256-128-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-recenter-collide-256-128-2.0-cairo-reference.png b/tests/visual_tests/images/marker-recenter-collide-256-128-2.0-cairo-reference.png
deleted file mode 100644
index 72d90e7..0000000
Binary files a/tests/visual_tests/images/marker-recenter-collide-256-128-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-svg-empty-g-element-500-100-1.0-agg-reference.png b/tests/visual_tests/images/marker-svg-empty-g-element-500-100-1.0-agg-reference.png
deleted file mode 100644
index 4d75272..0000000
Binary files a/tests/visual_tests/images/marker-svg-empty-g-element-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-svg-empty-g-element-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/marker-svg-empty-g-element-500-100-1.0-cairo-reference.png
deleted file mode 100644
index 4346d90..0000000
Binary files a/tests/visual_tests/images/marker-svg-empty-g-element-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-svg-empty-g-element-500-100-2.0-agg-reference.png b/tests/visual_tests/images/marker-svg-empty-g-element-500-100-2.0-agg-reference.png
deleted file mode 100644
index cec958b..0000000
Binary files a/tests/visual_tests/images/marker-svg-empty-g-element-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-svg-empty-g-element-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/marker-svg-empty-g-element-500-100-2.0-cairo-reference.png
deleted file mode 100644
index dff14d1..0000000
Binary files a/tests/visual_tests/images/marker-svg-empty-g-element-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-svg-opacity-500-100-1.0-agg-reference.png b/tests/visual_tests/images/marker-svg-opacity-500-100-1.0-agg-reference.png
deleted file mode 100644
index 11c31d9..0000000
Binary files a/tests/visual_tests/images/marker-svg-opacity-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-svg-opacity-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/marker-svg-opacity-500-100-1.0-cairo-reference.png
deleted file mode 100644
index fe95711..0000000
Binary files a/tests/visual_tests/images/marker-svg-opacity-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-svg-opacity-500-100-2.0-agg-reference.png b/tests/visual_tests/images/marker-svg-opacity-500-100-2.0-agg-reference.png
deleted file mode 100644
index 4d5ac73..0000000
Binary files a/tests/visual_tests/images/marker-svg-opacity-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-svg-opacity-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/marker-svg-opacity-500-100-2.0-cairo-reference.png
deleted file mode 100644
index c428279..0000000
Binary files a/tests/visual_tests/images/marker-svg-opacity-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-svg-opacity2-500-100-1.0-agg-reference.png b/tests/visual_tests/images/marker-svg-opacity2-500-100-1.0-agg-reference.png
deleted file mode 100644
index 334f9de..0000000
Binary files a/tests/visual_tests/images/marker-svg-opacity2-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-svg-opacity2-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/marker-svg-opacity2-500-100-1.0-cairo-reference.png
deleted file mode 100644
index 995ef96..0000000
Binary files a/tests/visual_tests/images/marker-svg-opacity2-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-svg-opacity2-500-100-2.0-agg-reference.png b/tests/visual_tests/images/marker-svg-opacity2-500-100-2.0-agg-reference.png
deleted file mode 100644
index 47d03b4..0000000
Binary files a/tests/visual_tests/images/marker-svg-opacity2-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-svg-opacity2-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/marker-svg-opacity2-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 12ae430..0000000
Binary files a/tests/visual_tests/images/marker-svg-opacity2-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-1.0-agg-reference.png b/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-1.0-agg-reference.png
deleted file mode 100644
index d3172ff..0000000
Binary files a/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-1.0-cairo-reference.png b/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-1.0-cairo-reference.png
deleted file mode 100644
index cfea6cd..0000000
Binary files a/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-2.0-agg-reference.png b/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-2.0-agg-reference.png
deleted file mode 100644
index 787d863..0000000
Binary files a/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-2.0-cairo-reference.png b/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-2.0-cairo-reference.png
deleted file mode 100644
index a8d00bf..0000000
Binary files a/tests/visual_tests/images/marker-symbolizer-expressions-all-256-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-vs-point-512-512-1.0-agg-reference.png b/tests/visual_tests/images/marker-vs-point-512-512-1.0-agg-reference.png
deleted file mode 100644
index fc0e96c..0000000
Binary files a/tests/visual_tests/images/marker-vs-point-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-vs-point-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/marker-vs-point-512-512-1.0-cairo-reference.png
deleted file mode 100644
index be9a21e..0000000
Binary files a/tests/visual_tests/images/marker-vs-point-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-vs-point-512-512-2.0-agg-reference.png b/tests/visual_tests/images/marker-vs-point-512-512-2.0-agg-reference.png
deleted file mode 100644
index 73fb609..0000000
Binary files a/tests/visual_tests/images/marker-vs-point-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-vs-point-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/marker-vs-point-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 9745f0c..0000000
Binary files a/tests/visual_tests/images/marker-vs-point-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-whole-multi-polygon-512-512-1.0-agg-reference.png b/tests/visual_tests/images/marker-whole-multi-polygon-512-512-1.0-agg-reference.png
deleted file mode 100644
index 302fa44..0000000
Binary files a/tests/visual_tests/images/marker-whole-multi-polygon-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-whole-multi-polygon-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/marker-whole-multi-polygon-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 8193aad..0000000
Binary files a/tests/visual_tests/images/marker-whole-multi-polygon-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-whole-multi-polygon-512-512-2.0-agg-reference.png b/tests/visual_tests/images/marker-whole-multi-polygon-512-512-2.0-agg-reference.png
deleted file mode 100644
index f40d9fa..0000000
Binary files a/tests/visual_tests/images/marker-whole-multi-polygon-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-whole-multi-polygon-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/marker-whole-multi-polygon-512-512-2.0-cairo-reference.png
deleted file mode 100644
index b71e924..0000000
Binary files a/tests/visual_tests/images/marker-whole-multi-polygon-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-257-256-1.0-agg-reference.png b/tests/visual_tests/images/marker-with-background-image-257-256-1.0-agg-reference.png
deleted file mode 100644
index ac11112..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-257-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-257-256-1.0-cairo-reference.png b/tests/visual_tests/images/marker-with-background-image-257-256-1.0-cairo-reference.png
deleted file mode 100644
index a02752e..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-257-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-257-256-2.0-agg-reference.png b/tests/visual_tests/images/marker-with-background-image-257-256-2.0-agg-reference.png
deleted file mode 100644
index e1698d8..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-257-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-257-256-2.0-cairo-reference.png b/tests/visual_tests/images/marker-with-background-image-257-256-2.0-cairo-reference.png
deleted file mode 100644
index 2b4a902..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-257-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-400-600-1.0-agg-reference.png b/tests/visual_tests/images/marker-with-background-image-400-600-1.0-agg-reference.png
deleted file mode 100644
index cb0f2a1..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-400-600-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-400-600-1.0-cairo-reference.png b/tests/visual_tests/images/marker-with-background-image-400-600-1.0-cairo-reference.png
deleted file mode 100644
index 10431d2..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-400-600-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-400-600-2.0-agg-reference.png b/tests/visual_tests/images/marker-with-background-image-400-600-2.0-agg-reference.png
deleted file mode 100644
index fb29c30..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-400-600-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-400-600-2.0-cairo-reference.png b/tests/visual_tests/images/marker-with-background-image-400-600-2.0-cairo-reference.png
deleted file mode 100644
index db9e2a3..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-400-600-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-600-400-1.0-agg-reference.png b/tests/visual_tests/images/marker-with-background-image-600-400-1.0-agg-reference.png
deleted file mode 100644
index 75256d5..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/marker-with-background-image-600-400-1.0-cairo-reference.png
deleted file mode 100644
index 3eb12e9..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-600-400-2.0-agg-reference.png b/tests/visual_tests/images/marker-with-background-image-600-400-2.0-agg-reference.png
deleted file mode 100644
index 602da33..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/marker-with-background-image-600-400-2.0-cairo-reference.png
deleted file mode 100644
index d541d33..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-1.0-agg-reference.png b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-1.0-agg-reference.png
deleted file mode 100644
index 6748209..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-1.0-cairo-reference.png b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-1.0-cairo-reference.png
deleted file mode 100644
index a02752e..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-2.0-agg-reference.png b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-2.0-agg-reference.png
deleted file mode 100644
index 7c0bc70..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-2.0-cairo-reference.png b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-2.0-cairo-reference.png
deleted file mode 100644
index 2b4a902..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-257-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-1.0-agg-reference.png b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-1.0-agg-reference.png
deleted file mode 100644
index ac6008a..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-1.0-cairo-reference.png b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-1.0-cairo-reference.png
deleted file mode 100644
index 10431d2..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-2.0-agg-reference.png b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-2.0-agg-reference.png
deleted file mode 100644
index 1281cd3..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-2.0-cairo-reference.png b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-2.0-cairo-reference.png
deleted file mode 100644
index db9e2a3..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-400-600-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-1.0-agg-reference.png b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-1.0-agg-reference.png
deleted file mode 100644
index d4a31bb..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-1.0-cairo-reference.png
deleted file mode 100644
index 3eb12e9..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-2.0-agg-reference.png b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-2.0-agg-reference.png
deleted file mode 100644
index 9a06fdb..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-2.0-cairo-reference.png
deleted file mode 100644
index d541d33..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-and-hsla-transform-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-linear-comp-op-500-100-1.0-agg-reference.png b/tests/visual_tests/images/marker-with-background-image-linear-comp-op-500-100-1.0-agg-reference.png
deleted file mode 100644
index 281f78d..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-linear-comp-op-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-linear-comp-op-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/marker-with-background-image-linear-comp-op-500-100-1.0-cairo-reference.png
deleted file mode 100644
index fe9f864..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-linear-comp-op-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-linear-comp-op-500-100-2.0-agg-reference.png b/tests/visual_tests/images/marker-with-background-image-linear-comp-op-500-100-2.0-agg-reference.png
deleted file mode 100644
index 76bd8c2..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-linear-comp-op-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker-with-background-image-linear-comp-op-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/marker-with-background-image-linear-comp-op-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 2a12a50..0000000
Binary files a/tests/visual_tests/images/marker-with-background-image-linear-comp-op-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker_line_placement_on_points-500-100-1.0-agg-reference.png b/tests/visual_tests/images/marker_line_placement_on_points-500-100-1.0-agg-reference.png
deleted file mode 100644
index 084beba..0000000
Binary files a/tests/visual_tests/images/marker_line_placement_on_points-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker_line_placement_on_points-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/marker_line_placement_on_points-500-100-1.0-cairo-reference.png
deleted file mode 100644
index 8943bfa..0000000
Binary files a/tests/visual_tests/images/marker_line_placement_on_points-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker_line_placement_on_points-500-100-2.0-agg-reference.png b/tests/visual_tests/images/marker_line_placement_on_points-500-100-2.0-agg-reference.png
deleted file mode 100644
index 9ab7627..0000000
Binary files a/tests/visual_tests/images/marker_line_placement_on_points-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/marker_line_placement_on_points-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/marker_line_placement_on_points-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 4cf7ae3..0000000
Binary files a/tests/visual_tests/images/marker_line_placement_on_points-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/orientation-800-200-1.0-agg-reference.png b/tests/visual_tests/images/orientation-800-200-1.0-agg-reference.png
deleted file mode 100644
index 0bd22d3..0000000
Binary files a/tests/visual_tests/images/orientation-800-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/orientation-800-200-1.0-cairo-reference.png b/tests/visual_tests/images/orientation-800-200-1.0-cairo-reference.png
deleted file mode 100644
index a522756..0000000
Binary files a/tests/visual_tests/images/orientation-800-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/orientation-800-200-2.0-agg-reference.png b/tests/visual_tests/images/orientation-800-200-2.0-agg-reference.png
deleted file mode 100644
index 285d8c7..0000000
Binary files a/tests/visual_tests/images/orientation-800-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/orientation-800-200-2.0-cairo-reference.png b/tests/visual_tests/images/orientation-800-200-2.0-cairo-reference.png
deleted file mode 100644
index 96b88ca..0000000
Binary files a/tests/visual_tests/images/orientation-800-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/point-symbolizer-expressions-256-256-1.0-agg-reference.png b/tests/visual_tests/images/point-symbolizer-expressions-256-256-1.0-agg-reference.png
deleted file mode 100644
index 1b86d1f..0000000
Binary files a/tests/visual_tests/images/point-symbolizer-expressions-256-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/point-symbolizer-expressions-256-256-1.0-cairo-reference.png b/tests/visual_tests/images/point-symbolizer-expressions-256-256-1.0-cairo-reference.png
deleted file mode 100644
index 9cbecbe..0000000
Binary files a/tests/visual_tests/images/point-symbolizer-expressions-256-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/point-symbolizer-expressions-256-256-2.0-agg-reference.png b/tests/visual_tests/images/point-symbolizer-expressions-256-256-2.0-agg-reference.png
deleted file mode 100644
index f26141a..0000000
Binary files a/tests/visual_tests/images/point-symbolizer-expressions-256-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/point-symbolizer-expressions-256-256-2.0-cairo-reference.png b/tests/visual_tests/images/point-symbolizer-expressions-256-256-2.0-cairo-reference.png
deleted file mode 100644
index c0cce9d..0000000
Binary files a/tests/visual_tests/images/point-symbolizer-expressions-256-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/point-symbolizer-expressions-all-256-256-1.0-agg-reference.png b/tests/visual_tests/images/point-symbolizer-expressions-all-256-256-1.0-agg-reference.png
deleted file mode 100644
index 92ce3f0..0000000
Binary files a/tests/visual_tests/images/point-symbolizer-expressions-all-256-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/point-symbolizer-expressions-all-256-256-1.0-cairo-reference.png b/tests/visual_tests/images/point-symbolizer-expressions-all-256-256-1.0-cairo-reference.png
deleted file mode 100644
index 89defea..0000000
Binary files a/tests/visual_tests/images/point-symbolizer-expressions-all-256-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/point-symbolizer-expressions-all-256-256-2.0-agg-reference.png b/tests/visual_tests/images/point-symbolizer-expressions-all-256-256-2.0-agg-reference.png
deleted file mode 100644
index c7e0cda..0000000
Binary files a/tests/visual_tests/images/point-symbolizer-expressions-all-256-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/point-symbolizer-expressions-all-256-256-2.0-cairo-reference.png b/tests/visual_tests/images/point-symbolizer-expressions-all-256-256-2.0-cairo-reference.png
deleted file mode 100644
index 1a29308..0000000
Binary files a/tests/visual_tests/images/point-symbolizer-expressions-all-256-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/point-symbolizer-overlap-placement-expr-500-500-1.0-agg-reference.png b/tests/visual_tests/images/point-symbolizer-overlap-placement-expr-500-500-1.0-agg-reference.png
deleted file mode 100644
index ff046ca..0000000
Binary files a/tests/visual_tests/images/point-symbolizer-overlap-placement-expr-500-500-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/point-symbolizer-overlap-placement-expr-500-500-1.0-cairo-reference.png b/tests/visual_tests/images/point-symbolizer-overlap-placement-expr-500-500-1.0-cairo-reference.png
deleted file mode 100644
index 124833e..0000000
Binary files a/tests/visual_tests/images/point-symbolizer-overlap-placement-expr-500-500-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/point-symbolizer-overlap-placement-expr-500-500-2.0-agg-reference.png b/tests/visual_tests/images/point-symbolizer-overlap-placement-expr-500-500-2.0-agg-reference.png
deleted file mode 100644
index ad8ebe8..0000000
Binary files a/tests/visual_tests/images/point-symbolizer-overlap-placement-expr-500-500-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/point-symbolizer-overlap-placement-expr-500-500-2.0-cairo-reference.png b/tests/visual_tests/images/point-symbolizer-overlap-placement-expr-500-500-2.0-cairo-reference.png
deleted file mode 100644
index 6828333..0000000
Binary files a/tests/visual_tests/images/point-symbolizer-overlap-placement-expr-500-500-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/polygon-symbolizer-expressions-256-256-1.0-agg-reference.png b/tests/visual_tests/images/polygon-symbolizer-expressions-256-256-1.0-agg-reference.png
deleted file mode 100644
index 02598d6..0000000
Binary files a/tests/visual_tests/images/polygon-symbolizer-expressions-256-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/polygon-symbolizer-expressions-256-256-1.0-cairo-reference.png b/tests/visual_tests/images/polygon-symbolizer-expressions-256-256-1.0-cairo-reference.png
deleted file mode 100644
index ea09d5d..0000000
Binary files a/tests/visual_tests/images/polygon-symbolizer-expressions-256-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/polygon-symbolizer-expressions-256-256-2.0-agg-reference.png b/tests/visual_tests/images/polygon-symbolizer-expressions-256-256-2.0-agg-reference.png
deleted file mode 100644
index 99c858e..0000000
Binary files a/tests/visual_tests/images/polygon-symbolizer-expressions-256-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/polygon-symbolizer-expressions-256-256-2.0-cairo-reference.png b/tests/visual_tests/images/polygon-symbolizer-expressions-256-256-2.0-cairo-reference.png
deleted file mode 100644
index 2341913..0000000
Binary files a/tests/visual_tests/images/polygon-symbolizer-expressions-256-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/polygon-symbolizer-expressions-all-256-256-1.0-agg-reference.png b/tests/visual_tests/images/polygon-symbolizer-expressions-all-256-256-1.0-agg-reference.png
deleted file mode 100644
index 931d6fd..0000000
Binary files a/tests/visual_tests/images/polygon-symbolizer-expressions-all-256-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/polygon-symbolizer-expressions-all-256-256-1.0-cairo-reference.png b/tests/visual_tests/images/polygon-symbolizer-expressions-all-256-256-1.0-cairo-reference.png
deleted file mode 100644
index d92d512..0000000
Binary files a/tests/visual_tests/images/polygon-symbolizer-expressions-all-256-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/polygon-symbolizer-expressions-all-256-256-2.0-agg-reference.png b/tests/visual_tests/images/polygon-symbolizer-expressions-all-256-256-2.0-agg-reference.png
deleted file mode 100644
index f328174..0000000
Binary files a/tests/visual_tests/images/polygon-symbolizer-expressions-all-256-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/polygon-symbolizer-expressions-all-256-256-2.0-cairo-reference.png b/tests/visual_tests/images/polygon-symbolizer-expressions-all-256-256-2.0-cairo-reference.png
deleted file mode 100644
index 10464ad..0000000
Binary files a/tests/visual_tests/images/polygon-symbolizer-expressions-all-256-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/polygon-winding-order-300-300-1.0-agg-reference.png b/tests/visual_tests/images/polygon-winding-order-300-300-1.0-agg-reference.png
deleted file mode 100644
index 6e5bb8e..0000000
Binary files a/tests/visual_tests/images/polygon-winding-order-300-300-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/polygon-winding-order-300-300-1.0-cairo-reference.png b/tests/visual_tests/images/polygon-winding-order-300-300-1.0-cairo-reference.png
deleted file mode 100644
index 1d2f189..0000000
Binary files a/tests/visual_tests/images/polygon-winding-order-300-300-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/polygon-winding-order-300-300-2.0-agg-reference.png b/tests/visual_tests/images/polygon-winding-order-300-300-2.0-agg-reference.png
deleted file mode 100644
index bf60cb3..0000000
Binary files a/tests/visual_tests/images/polygon-winding-order-300-300-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/polygon-winding-order-300-300-2.0-cairo-reference.png b/tests/visual_tests/images/polygon-winding-order-300-300-2.0-cairo-reference.png
deleted file mode 100644
index 94dffb0..0000000
Binary files a/tests/visual_tests/images/polygon-winding-order-300-300-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/postgis-inline-512-512-1.0-agg-reference.png b/tests/visual_tests/images/postgis-inline-512-512-1.0-agg-reference.png
deleted file mode 100644
index 9f7157f..0000000
Binary files a/tests/visual_tests/images/postgis-inline-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/postgis-inline-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/postgis-inline-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 0671bcd..0000000
Binary files a/tests/visual_tests/images/postgis-inline-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/postgis-inline-512-512-2.0-agg-reference.png b/tests/visual_tests/images/postgis-inline-512-512-2.0-agg-reference.png
deleted file mode 100644
index 5265777..0000000
Binary files a/tests/visual_tests/images/postgis-inline-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/postgis-inline-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/postgis-inline-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 87f6511..0000000
Binary files a/tests/visual_tests/images/postgis-inline-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/python-Format-reference.png b/tests/visual_tests/images/python-Format-reference.png
deleted file mode 100644
index 95a0eea..0000000
Binary files a/tests/visual_tests/images/python-Format-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/python-IfElse-reference.png b/tests/visual_tests/images/python-IfElse-reference.png
deleted file mode 100644
index d71da4f..0000000
Binary files a/tests/visual_tests/images/python-IfElse-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/python-List-reference.png b/tests/visual_tests/images/python-List-reference.png
deleted file mode 100644
index 2be43fc..0000000
Binary files a/tests/visual_tests/images/python-List-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/python-MyText-reference.png b/tests/visual_tests/images/python-MyText-reference.png
deleted file mode 100644
index 775f4bc..0000000
Binary files a/tests/visual_tests/images/python-MyText-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/python-TextNode-reference.png b/tests/visual_tests/images/python-TextNode-reference.png
deleted file mode 100644
index db6bfa2..0000000
Binary files a/tests/visual_tests/images/python-TextNode-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha1-512-512-1.0-agg-reference.png b/tests/visual_tests/images/raster-color-to-alpha1-512-512-1.0-agg-reference.png
deleted file mode 100644
index 1a0e0ac..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha1-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha1-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/raster-color-to-alpha1-512-512-1.0-cairo-reference.png
deleted file mode 100644
index e727a0f..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha1-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha1-512-512-2.0-agg-reference.png b/tests/visual_tests/images/raster-color-to-alpha1-512-512-2.0-agg-reference.png
deleted file mode 100644
index 1a0e0ac..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha1-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha1-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/raster-color-to-alpha1-512-512-2.0-cairo-reference.png
deleted file mode 100644
index e727a0f..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha1-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha2-512-512-1.0-agg-reference.png b/tests/visual_tests/images/raster-color-to-alpha2-512-512-1.0-agg-reference.png
deleted file mode 100644
index 316d8bd..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha2-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha2-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/raster-color-to-alpha2-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 2850cd0..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha2-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha2-512-512-2.0-agg-reference.png b/tests/visual_tests/images/raster-color-to-alpha2-512-512-2.0-agg-reference.png
deleted file mode 100644
index 316d8bd..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha2-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha2-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/raster-color-to-alpha2-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 2850cd0..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha2-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha3-512-512-1.0-agg-reference.png b/tests/visual_tests/images/raster-color-to-alpha3-512-512-1.0-agg-reference.png
deleted file mode 100644
index dd575b5..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha3-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha3-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/raster-color-to-alpha3-512-512-1.0-cairo-reference.png
deleted file mode 100644
index eccd824..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha3-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha3-512-512-2.0-agg-reference.png b/tests/visual_tests/images/raster-color-to-alpha3-512-512-2.0-agg-reference.png
deleted file mode 100644
index dd575b5..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha3-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha3-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/raster-color-to-alpha3-512-512-2.0-cairo-reference.png
deleted file mode 100644
index eccd824..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha3-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha4-512-512-1.0-agg-reference.png b/tests/visual_tests/images/raster-color-to-alpha4-512-512-1.0-agg-reference.png
deleted file mode 100644
index 1ec158d..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha4-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha4-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/raster-color-to-alpha4-512-512-1.0-cairo-reference.png
deleted file mode 100644
index dec77cf..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha4-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha4-512-512-2.0-agg-reference.png b/tests/visual_tests/images/raster-color-to-alpha4-512-512-2.0-agg-reference.png
deleted file mode 100644
index 1ec158d..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha4-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha4-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/raster-color-to-alpha4-512-512-2.0-cairo-reference.png
deleted file mode 100644
index dec77cf..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha4-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha5-512-512-1.0-agg-reference.png b/tests/visual_tests/images/raster-color-to-alpha5-512-512-1.0-agg-reference.png
deleted file mode 100644
index b759889..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha5-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha5-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/raster-color-to-alpha5-512-512-1.0-cairo-reference.png
deleted file mode 100644
index dec77cf..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha5-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha5-512-512-2.0-agg-reference.png b/tests/visual_tests/images/raster-color-to-alpha5-512-512-2.0-agg-reference.png
deleted file mode 100644
index b759889..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha5-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster-color-to-alpha5-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/raster-color-to-alpha5-512-512-2.0-cairo-reference.png
deleted file mode 100644
index dec77cf..0000000
Binary files a/tests/visual_tests/images/raster-color-to-alpha5-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster_colorizer-512-512-1.0-agg-reference.png b/tests/visual_tests/images/raster_colorizer-512-512-1.0-agg-reference.png
deleted file mode 100644
index dec77cf..0000000
Binary files a/tests/visual_tests/images/raster_colorizer-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster_colorizer-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/raster_colorizer-512-512-1.0-cairo-reference.png
deleted file mode 100644
index dec77cf..0000000
Binary files a/tests/visual_tests/images/raster_colorizer-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster_colorizer-512-512-2.0-agg-reference.png b/tests/visual_tests/images/raster_colorizer-512-512-2.0-agg-reference.png
deleted file mode 100644
index dec77cf..0000000
Binary files a/tests/visual_tests/images/raster_colorizer-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster_colorizer-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/raster_colorizer-512-512-2.0-cairo-reference.png
deleted file mode 100644
index dec77cf..0000000
Binary files a/tests/visual_tests/images/raster_colorizer-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster_symbolizer-512-512-1.0-agg-reference.png b/tests/visual_tests/images/raster_symbolizer-512-512-1.0-agg-reference.png
deleted file mode 100644
index a7c34dc..0000000
Binary files a/tests/visual_tests/images/raster_symbolizer-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster_symbolizer-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/raster_symbolizer-512-512-1.0-cairo-reference.png
deleted file mode 100644
index a7c34dc..0000000
Binary files a/tests/visual_tests/images/raster_symbolizer-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster_symbolizer-512-512-2.0-agg-reference.png b/tests/visual_tests/images/raster_symbolizer-512-512-2.0-agg-reference.png
deleted file mode 100644
index a7c34dc..0000000
Binary files a/tests/visual_tests/images/raster_symbolizer-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/raster_symbolizer-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/raster_symbolizer-512-512-2.0-cairo-reference.png
deleted file mode 100644
index a7c34dc..0000000
Binary files a/tests/visual_tests/images/raster_symbolizer-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-1-750-250-1.0-agg-reference.png b/tests/visual_tests/images/repeat-labels-1-750-250-1.0-agg-reference.png
deleted file mode 100644
index 9e5fbda..0000000
Binary files a/tests/visual_tests/images/repeat-labels-1-750-250-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-1-750-250-1.0-cairo-reference.png b/tests/visual_tests/images/repeat-labels-1-750-250-1.0-cairo-reference.png
deleted file mode 100644
index 1cdc0b8..0000000
Binary files a/tests/visual_tests/images/repeat-labels-1-750-250-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-1-750-250-2.0-agg-reference.png b/tests/visual_tests/images/repeat-labels-1-750-250-2.0-agg-reference.png
deleted file mode 100644
index 08b873a..0000000
Binary files a/tests/visual_tests/images/repeat-labels-1-750-250-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-1-750-250-2.0-cairo-reference.png b/tests/visual_tests/images/repeat-labels-1-750-250-2.0-cairo-reference.png
deleted file mode 100644
index 8018224..0000000
Binary files a/tests/visual_tests/images/repeat-labels-1-750-250-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-2-750-250-1.0-agg-reference.png b/tests/visual_tests/images/repeat-labels-2-750-250-1.0-agg-reference.png
deleted file mode 100644
index a9371c2..0000000
Binary files a/tests/visual_tests/images/repeat-labels-2-750-250-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-2-750-250-1.0-cairo-reference.png b/tests/visual_tests/images/repeat-labels-2-750-250-1.0-cairo-reference.png
deleted file mode 100644
index e5adf19..0000000
Binary files a/tests/visual_tests/images/repeat-labels-2-750-250-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-2-750-250-2.0-agg-reference.png b/tests/visual_tests/images/repeat-labels-2-750-250-2.0-agg-reference.png
deleted file mode 100644
index eef52f5..0000000
Binary files a/tests/visual_tests/images/repeat-labels-2-750-250-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-2-750-250-2.0-cairo-reference.png b/tests/visual_tests/images/repeat-labels-2-750-250-2.0-cairo-reference.png
deleted file mode 100644
index 0fe149c..0000000
Binary files a/tests/visual_tests/images/repeat-labels-2-750-250-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-3-750-250-1.0-agg-reference.png b/tests/visual_tests/images/repeat-labels-3-750-250-1.0-agg-reference.png
deleted file mode 100644
index 526b793..0000000
Binary files a/tests/visual_tests/images/repeat-labels-3-750-250-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-3-750-250-1.0-cairo-reference.png b/tests/visual_tests/images/repeat-labels-3-750-250-1.0-cairo-reference.png
deleted file mode 100644
index a454c13..0000000
Binary files a/tests/visual_tests/images/repeat-labels-3-750-250-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-3-750-250-2.0-agg-reference.png b/tests/visual_tests/images/repeat-labels-3-750-250-2.0-agg-reference.png
deleted file mode 100644
index b40a7f2..0000000
Binary files a/tests/visual_tests/images/repeat-labels-3-750-250-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-3-750-250-2.0-cairo-reference.png b/tests/visual_tests/images/repeat-labels-3-750-250-2.0-cairo-reference.png
deleted file mode 100644
index 5a98da9..0000000
Binary files a/tests/visual_tests/images/repeat-labels-3-750-250-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-4-750-250-1.0-agg-reference.png b/tests/visual_tests/images/repeat-labels-4-750-250-1.0-agg-reference.png
deleted file mode 100644
index 185b735..0000000
Binary files a/tests/visual_tests/images/repeat-labels-4-750-250-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-4-750-250-1.0-cairo-reference.png b/tests/visual_tests/images/repeat-labels-4-750-250-1.0-cairo-reference.png
deleted file mode 100644
index 850c8a5..0000000
Binary files a/tests/visual_tests/images/repeat-labels-4-750-250-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-4-750-250-2.0-agg-reference.png b/tests/visual_tests/images/repeat-labels-4-750-250-2.0-agg-reference.png
deleted file mode 100644
index 31b540a..0000000
Binary files a/tests/visual_tests/images/repeat-labels-4-750-250-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/repeat-labels-4-750-250-2.0-cairo-reference.png b/tests/visual_tests/images/repeat-labels-4-750-250-2.0-cairo-reference.png
deleted file mode 100644
index 9be179a..0000000
Binary files a/tests/visual_tests/images/repeat-labels-4-750-250-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/road-casings-grouped-rendering-600-600-1.0-agg-reference.png b/tests/visual_tests/images/road-casings-grouped-rendering-600-600-1.0-agg-reference.png
deleted file mode 100644
index 7256f46..0000000
Binary files a/tests/visual_tests/images/road-casings-grouped-rendering-600-600-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/road-casings-grouped-rendering-600-600-1.0-cairo-reference.png b/tests/visual_tests/images/road-casings-grouped-rendering-600-600-1.0-cairo-reference.png
deleted file mode 100644
index 79f49c7..0000000
Binary files a/tests/visual_tests/images/road-casings-grouped-rendering-600-600-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/road-casings-grouped-rendering-600-600-2.0-agg-reference.png b/tests/visual_tests/images/road-casings-grouped-rendering-600-600-2.0-agg-reference.png
deleted file mode 100644
index b832c0b..0000000
Binary files a/tests/visual_tests/images/road-casings-grouped-rendering-600-600-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/road-casings-grouped-rendering-600-600-2.0-cairo-reference.png b/tests/visual_tests/images/road-casings-grouped-rendering-600-600-2.0-cairo-reference.png
deleted file mode 100644
index e913633..0000000
Binary files a/tests/visual_tests/images/road-casings-grouped-rendering-600-600-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-1.0-agg-reference.png b/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-1.0-agg-reference.png
deleted file mode 100644
index 3dc0a23..0000000
Binary files a/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-1.0-cairo-reference.png b/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-1.0-cairo-reference.png
deleted file mode 100644
index 3bc431d..0000000
Binary files a/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-2.0-agg-reference.png b/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-2.0-agg-reference.png
deleted file mode 100644
index 3134581..0000000
Binary files a/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-2.0-cairo-reference.png b/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-2.0-cairo-reference.png
deleted file mode 100644
index 908e738..0000000
Binary files a/tests/visual_tests/images/road-casings-non-grouped-rendering-600-600-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/rtl-point-200-200-1.0-agg-reference.png b/tests/visual_tests/images/rtl-point-200-200-1.0-agg-reference.png
deleted file mode 100644
index e70b694..0000000
Binary files a/tests/visual_tests/images/rtl-point-200-200-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/rtl-point-200-200-1.0-cairo-reference.png b/tests/visual_tests/images/rtl-point-200-200-1.0-cairo-reference.png
deleted file mode 100644
index 15483d0..0000000
Binary files a/tests/visual_tests/images/rtl-point-200-200-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/rtl-point-200-200-2.0-agg-reference.png b/tests/visual_tests/images/rtl-point-200-200-2.0-agg-reference.png
deleted file mode 100644
index ab06fb3..0000000
Binary files a/tests/visual_tests/images/rtl-point-200-200-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/rtl-point-200-200-2.0-cairo-reference.png b/tests/visual_tests/images/rtl-point-200-200-2.0-cairo-reference.png
deleted file mode 100644
index bf030b8..0000000
Binary files a/tests/visual_tests/images/rtl-point-200-200-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shield-on-line-and-avoid-edges-512-512-1.0-agg-reference.png b/tests/visual_tests/images/shield-on-line-and-avoid-edges-512-512-1.0-agg-reference.png
deleted file mode 100644
index 28824f4..0000000
Binary files a/tests/visual_tests/images/shield-on-line-and-avoid-edges-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shield-on-line-and-avoid-edges-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/shield-on-line-and-avoid-edges-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 435a92c..0000000
Binary files a/tests/visual_tests/images/shield-on-line-and-avoid-edges-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shield-on-line-and-avoid-edges-512-512-2.0-agg-reference.png b/tests/visual_tests/images/shield-on-line-and-avoid-edges-512-512-2.0-agg-reference.png
deleted file mode 100644
index c694227..0000000
Binary files a/tests/visual_tests/images/shield-on-line-and-avoid-edges-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shield-on-line-and-avoid-edges-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/shield-on-line-and-avoid-edges-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 3a74eb1..0000000
Binary files a/tests/visual_tests/images/shield-on-line-and-avoid-edges-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-1.0-agg-reference.png b/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-1.0-agg-reference.png
deleted file mode 100644
index 90783f5..0000000
Binary files a/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-1.0-cairo-reference.png
deleted file mode 100644
index d3ea323..0000000
Binary files a/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-2.0-agg-reference.png b/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-2.0-agg-reference.png
deleted file mode 100644
index 64427ea..0000000
Binary files a/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-2.0-cairo-reference.png
deleted file mode 100644
index bab66c3..0000000
Binary files a/tests/visual_tests/images/shield-on-line-spacing-eq-width-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shield-on-polygon-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/shield-on-polygon-500-100-1.0-cairo-reference.png
deleted file mode 100644
index bcb6803..0000000
Binary files a/tests/visual_tests/images/shield-on-polygon-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shield-on-polygon-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/shield-on-polygon-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 8ebad23..0000000
Binary files a/tests/visual_tests/images/shield-on-polygon-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shield-on-polygon-600-400-1.0-agg-reference.png b/tests/visual_tests/images/shield-on-polygon-600-400-1.0-agg-reference.png
deleted file mode 100644
index e938102..0000000
Binary files a/tests/visual_tests/images/shield-on-polygon-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shield-on-polygon-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/shield-on-polygon-600-400-1.0-cairo-reference.png
deleted file mode 100644
index cc77764..0000000
Binary files a/tests/visual_tests/images/shield-on-polygon-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shield-on-polygon-600-400-2.0-agg-reference.png b/tests/visual_tests/images/shield-on-polygon-600-400-2.0-agg-reference.png
deleted file mode 100644
index 3afdfbd..0000000
Binary files a/tests/visual_tests/images/shield-on-polygon-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shield-on-polygon-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/shield-on-polygon-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 96075a3..0000000
Binary files a/tests/visual_tests/images/shield-on-polygon-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-490-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-490-100-1.0-agg-reference.png
deleted file mode 100644
index 396d137..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-490-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-490-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-490-100-1.0-cairo-reference.png
deleted file mode 100644
index b047ed2..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-490-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-490-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-490-100-2.0-agg-reference.png
deleted file mode 100644
index 6ca876a..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-490-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-490-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-490-100-2.0-cairo-reference.png
deleted file mode 100644
index 945d240..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-490-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-495-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-495-100-1.0-agg-reference.png
deleted file mode 100644
index 3a95ae3..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-495-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-495-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-495-100-1.0-cairo-reference.png
deleted file mode 100644
index ae527fd..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-495-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-495-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-495-100-2.0-agg-reference.png
deleted file mode 100644
index 9e9e1ea..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-495-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-495-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-495-100-2.0-cairo-reference.png
deleted file mode 100644
index dd05db8..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-495-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-497-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-497-100-1.0-agg-reference.png
deleted file mode 100644
index 36cb347..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-497-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-497-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-497-100-1.0-cairo-reference.png
deleted file mode 100644
index ed8a9f2..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-497-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-497-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-497-100-2.0-agg-reference.png
deleted file mode 100644
index 5fae0ce..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-497-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-497-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-497-100-2.0-cairo-reference.png
deleted file mode 100644
index e3627ec..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-497-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-498-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-498-100-1.0-agg-reference.png
deleted file mode 100644
index 93350ee..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-498-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-498-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-498-100-1.0-cairo-reference.png
deleted file mode 100644
index 08819ff..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-498-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-498-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-498-100-2.0-agg-reference.png
deleted file mode 100644
index e8eb1fb..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-498-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-498-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-498-100-2.0-cairo-reference.png
deleted file mode 100644
index 2433d55..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-498-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-499-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-499-100-1.0-agg-reference.png
deleted file mode 100644
index 4ab458d..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-499-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-499-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-499-100-1.0-cairo-reference.png
deleted file mode 100644
index 1bf3e32..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-499-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-499-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-499-100-2.0-agg-reference.png
deleted file mode 100644
index 94b7023..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-499-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-499-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-499-100-2.0-cairo-reference.png
deleted file mode 100644
index 5407006..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-499-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-500-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-500-100-1.0-agg-reference.png
deleted file mode 100644
index ce717a6..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-500-100-1.0-cairo-reference.png
deleted file mode 100644
index 0fd05f9..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-500-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-500-100-2.0-agg-reference.png
deleted file mode 100644
index c14823e..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 96057d2..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-501-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-501-100-1.0-agg-reference.png
deleted file mode 100644
index a5a4060..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-501-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-501-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-501-100-1.0-cairo-reference.png
deleted file mode 100644
index f8e1233..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-501-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-501-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-501-100-2.0-agg-reference.png
deleted file mode 100644
index 65ecbe7..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-501-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-501-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-501-100-2.0-cairo-reference.png
deleted file mode 100644
index b17d91e..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-501-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-502-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-502-100-1.0-agg-reference.png
deleted file mode 100644
index 929a3fe..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-502-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-502-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-502-100-1.0-cairo-reference.png
deleted file mode 100644
index a34b73a..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-502-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-502-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-502-100-2.0-agg-reference.png
deleted file mode 100644
index d68ca3e..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-502-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-502-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-502-100-2.0-cairo-reference.png
deleted file mode 100644
index 79e392a..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-502-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-505-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-505-100-1.0-agg-reference.png
deleted file mode 100644
index 7841a97..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-505-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-505-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-505-100-1.0-cairo-reference.png
deleted file mode 100644
index 6f6eef1..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-505-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-505-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-505-100-2.0-agg-reference.png
deleted file mode 100644
index b25d596..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-505-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-505-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-505-100-2.0-cairo-reference.png
deleted file mode 100644
index f088573..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-505-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-510-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-510-100-1.0-agg-reference.png
deleted file mode 100644
index c267bce..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-510-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-510-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-510-100-1.0-cairo-reference.png
deleted file mode 100644
index af491e5..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-510-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-510-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-510-100-2.0-agg-reference.png
deleted file mode 100644
index 2240e8a..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-510-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-1-510-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-1-510-100-2.0-cairo-reference.png
deleted file mode 100644
index 1aa7fbd..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-1-510-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-490-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-490-100-1.0-agg-reference.png
deleted file mode 100644
index 9c322cd..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-490-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-490-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-490-100-1.0-cairo-reference.png
deleted file mode 100644
index 31cab03..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-490-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-490-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-490-100-2.0-agg-reference.png
deleted file mode 100644
index ae4aea7..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-490-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-490-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-490-100-2.0-cairo-reference.png
deleted file mode 100644
index 3ed9e82..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-490-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-495-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-495-100-1.0-agg-reference.png
deleted file mode 100644
index db91816..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-495-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-495-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-495-100-1.0-cairo-reference.png
deleted file mode 100644
index 2e18e9a..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-495-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-495-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-495-100-2.0-agg-reference.png
deleted file mode 100644
index 302465b..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-495-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-495-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-495-100-2.0-cairo-reference.png
deleted file mode 100644
index 3f1f27e..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-495-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-497-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-497-100-1.0-agg-reference.png
deleted file mode 100644
index 37e55a1..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-497-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-497-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-497-100-1.0-cairo-reference.png
deleted file mode 100644
index ff57e06..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-497-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-497-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-497-100-2.0-agg-reference.png
deleted file mode 100644
index af3ff8a..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-497-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-497-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-497-100-2.0-cairo-reference.png
deleted file mode 100644
index bfd9a91..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-497-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-498-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-498-100-1.0-agg-reference.png
deleted file mode 100644
index 31dd2fb..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-498-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-498-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-498-100-1.0-cairo-reference.png
deleted file mode 100644
index b335a04..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-498-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-498-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-498-100-2.0-agg-reference.png
deleted file mode 100644
index 04be827..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-498-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-498-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-498-100-2.0-cairo-reference.png
deleted file mode 100644
index 6b57c53..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-498-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-499-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-499-100-1.0-agg-reference.png
deleted file mode 100644
index db5946f..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-499-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-499-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-499-100-1.0-cairo-reference.png
deleted file mode 100644
index 89875cc..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-499-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-499-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-499-100-2.0-agg-reference.png
deleted file mode 100644
index 4e9f93a..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-499-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-499-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-499-100-2.0-cairo-reference.png
deleted file mode 100644
index df0cff0..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-499-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-500-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-500-100-1.0-agg-reference.png
deleted file mode 100644
index 9607221..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-500-100-1.0-cairo-reference.png
deleted file mode 100644
index d36e078..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-500-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-500-100-2.0-agg-reference.png
deleted file mode 100644
index a372ead..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-500-100-2.0-cairo-reference.png
deleted file mode 100644
index d6d1d75..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-501-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-501-100-1.0-agg-reference.png
deleted file mode 100644
index a992508..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-501-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-501-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-501-100-1.0-cairo-reference.png
deleted file mode 100644
index 16d4352..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-501-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-501-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-501-100-2.0-agg-reference.png
deleted file mode 100644
index dbcc187..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-501-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-501-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-501-100-2.0-cairo-reference.png
deleted file mode 100644
index 7bfe234..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-501-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-502-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-502-100-1.0-agg-reference.png
deleted file mode 100644
index 4c8e27d..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-502-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-502-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-502-100-1.0-cairo-reference.png
deleted file mode 100644
index 150aa87..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-502-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-502-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-502-100-2.0-agg-reference.png
deleted file mode 100644
index 5745518..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-502-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-502-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-502-100-2.0-cairo-reference.png
deleted file mode 100644
index 76209cf..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-502-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-505-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-505-100-1.0-agg-reference.png
deleted file mode 100644
index 63a4cd2..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-505-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-505-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-505-100-1.0-cairo-reference.png
deleted file mode 100644
index ed5dcf9..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-505-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-505-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-505-100-2.0-agg-reference.png
deleted file mode 100644
index b4f97aa..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-505-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-505-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-505-100-2.0-cairo-reference.png
deleted file mode 100644
index c3ec0b9..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-505-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-510-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-510-100-1.0-agg-reference.png
deleted file mode 100644
index 78a30e3..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-510-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-510-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-510-100-1.0-cairo-reference.png
deleted file mode 100644
index 6a0967c..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-510-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-510-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-510-100-2.0-agg-reference.png
deleted file mode 100644
index dc4da3e..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-510-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-2-510-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-2-510-100-2.0-cairo-reference.png
deleted file mode 100644
index aaf5534..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-2-510-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-490-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-490-100-1.0-agg-reference.png
deleted file mode 100644
index 9566143..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-490-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-490-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-490-100-1.0-cairo-reference.png
deleted file mode 100644
index ca496b1..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-490-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-490-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-490-100-2.0-agg-reference.png
deleted file mode 100644
index 2897893..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-490-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-490-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-490-100-2.0-cairo-reference.png
deleted file mode 100644
index bdf60ff..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-490-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-495-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-495-100-1.0-agg-reference.png
deleted file mode 100644
index a15dfe4..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-495-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-495-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-495-100-1.0-cairo-reference.png
deleted file mode 100644
index 6ec66fb..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-495-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-495-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-495-100-2.0-agg-reference.png
deleted file mode 100644
index 7977c54..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-495-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-495-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-495-100-2.0-cairo-reference.png
deleted file mode 100644
index 4bcee59..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-495-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-497-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-497-100-1.0-agg-reference.png
deleted file mode 100644
index 5c41e60..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-497-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-497-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-497-100-1.0-cairo-reference.png
deleted file mode 100644
index 9f0c794..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-497-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-497-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-497-100-2.0-agg-reference.png
deleted file mode 100644
index 4f7df8b..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-497-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-497-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-497-100-2.0-cairo-reference.png
deleted file mode 100644
index b267d52..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-497-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-498-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-498-100-1.0-agg-reference.png
deleted file mode 100644
index cfca099..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-498-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-498-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-498-100-1.0-cairo-reference.png
deleted file mode 100644
index 60f298e..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-498-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-498-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-498-100-2.0-agg-reference.png
deleted file mode 100644
index 7fb6d68..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-498-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-498-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-498-100-2.0-cairo-reference.png
deleted file mode 100644
index bf92b48..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-498-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-499-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-499-100-1.0-agg-reference.png
deleted file mode 100644
index 63746e8..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-499-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-499-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-499-100-1.0-cairo-reference.png
deleted file mode 100644
index 27a9277..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-499-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-499-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-499-100-2.0-agg-reference.png
deleted file mode 100644
index 5dd3ae1..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-499-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-499-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-499-100-2.0-cairo-reference.png
deleted file mode 100644
index 46c310e..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-499-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-500-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-500-100-1.0-agg-reference.png
deleted file mode 100644
index 790f226..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-500-100-1.0-cairo-reference.png
deleted file mode 100644
index 20a8744..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-500-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-500-100-2.0-agg-reference.png
deleted file mode 100644
index c48e21b..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 5e305ef..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-501-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-501-100-1.0-agg-reference.png
deleted file mode 100644
index d1997da..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-501-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-501-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-501-100-1.0-cairo-reference.png
deleted file mode 100644
index 9eb3212..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-501-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-501-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-501-100-2.0-agg-reference.png
deleted file mode 100644
index 6505613..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-501-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-501-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-501-100-2.0-cairo-reference.png
deleted file mode 100644
index 32c3fcc..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-501-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-502-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-502-100-1.0-agg-reference.png
deleted file mode 100644
index 426adea..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-502-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-502-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-502-100-1.0-cairo-reference.png
deleted file mode 100644
index d34e115..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-502-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-502-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-502-100-2.0-agg-reference.png
deleted file mode 100644
index 15f0bd4..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-502-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-502-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-502-100-2.0-cairo-reference.png
deleted file mode 100644
index 40b60ef..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-502-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-505-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-505-100-1.0-agg-reference.png
deleted file mode 100644
index fe6e028..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-505-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-505-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-505-100-1.0-cairo-reference.png
deleted file mode 100644
index 5d9dcbf..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-505-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-505-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-505-100-2.0-agg-reference.png
deleted file mode 100644
index ae4e0d1..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-505-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-505-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-505-100-2.0-cairo-reference.png
deleted file mode 100644
index d43388e..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-505-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-510-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-510-100-1.0-agg-reference.png
deleted file mode 100644
index 6e10461..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-510-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-510-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-510-100-1.0-cairo-reference.png
deleted file mode 100644
index df801fa..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-510-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-510-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-510-100-2.0-agg-reference.png
deleted file mode 100644
index 4e38b7c..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-510-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-3-510-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-3-510-100-2.0-cairo-reference.png
deleted file mode 100644
index 4183d00..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-3-510-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-490-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-490-100-1.0-agg-reference.png
deleted file mode 100644
index 6cc0b01..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-490-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-490-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-490-100-1.0-cairo-reference.png
deleted file mode 100644
index c94477a..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-490-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-490-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-490-100-2.0-agg-reference.png
deleted file mode 100644
index 0ef56f7..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-490-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-490-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-490-100-2.0-cairo-reference.png
deleted file mode 100644
index b08fce6..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-490-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-495-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-495-100-1.0-agg-reference.png
deleted file mode 100644
index 6cd8aa3..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-495-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-495-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-495-100-1.0-cairo-reference.png
deleted file mode 100644
index 88fc8dc..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-495-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-495-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-495-100-2.0-agg-reference.png
deleted file mode 100644
index 8b93c3a..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-495-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-495-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-495-100-2.0-cairo-reference.png
deleted file mode 100644
index 4528700..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-495-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-497-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-497-100-1.0-agg-reference.png
deleted file mode 100644
index e7baf91..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-497-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-497-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-497-100-1.0-cairo-reference.png
deleted file mode 100644
index ebcc25d..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-497-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-497-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-497-100-2.0-agg-reference.png
deleted file mode 100644
index 428561a..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-497-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-497-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-497-100-2.0-cairo-reference.png
deleted file mode 100644
index a68576c..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-497-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-498-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-498-100-1.0-agg-reference.png
deleted file mode 100644
index d2b58e1..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-498-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-498-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-498-100-1.0-cairo-reference.png
deleted file mode 100644
index a221b90..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-498-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-498-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-498-100-2.0-agg-reference.png
deleted file mode 100644
index 21d8d03..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-498-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-498-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-498-100-2.0-cairo-reference.png
deleted file mode 100644
index 91a89f5..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-498-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-499-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-499-100-1.0-agg-reference.png
deleted file mode 100644
index 354977f..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-499-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-499-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-499-100-1.0-cairo-reference.png
deleted file mode 100644
index b9aad12..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-499-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-499-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-499-100-2.0-agg-reference.png
deleted file mode 100644
index ad0900b..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-499-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-499-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-499-100-2.0-cairo-reference.png
deleted file mode 100644
index a9d49e5..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-499-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-500-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-500-100-1.0-agg-reference.png
deleted file mode 100644
index 3bb6c2e..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-500-100-1.0-cairo-reference.png
deleted file mode 100644
index a3c4c01..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-500-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-500-100-2.0-agg-reference.png
deleted file mode 100644
index 0cd9c0c..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 14b34e8..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-501-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-501-100-1.0-agg-reference.png
deleted file mode 100644
index a1136e3..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-501-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-501-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-501-100-1.0-cairo-reference.png
deleted file mode 100644
index fe18499..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-501-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-501-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-501-100-2.0-agg-reference.png
deleted file mode 100644
index 706b3e0..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-501-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-501-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-501-100-2.0-cairo-reference.png
deleted file mode 100644
index 6f2d7b6..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-501-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-502-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-502-100-1.0-agg-reference.png
deleted file mode 100644
index e263276..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-502-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-502-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-502-100-1.0-cairo-reference.png
deleted file mode 100644
index 049f077..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-502-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-502-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-502-100-2.0-agg-reference.png
deleted file mode 100644
index b42566f..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-502-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-502-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-502-100-2.0-cairo-reference.png
deleted file mode 100644
index b9299b5..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-502-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-505-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-505-100-1.0-agg-reference.png
deleted file mode 100644
index 9085ecb..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-505-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-505-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-505-100-1.0-cairo-reference.png
deleted file mode 100644
index 47e5d6b..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-505-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-505-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-505-100-2.0-agg-reference.png
deleted file mode 100644
index ae2c349..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-505-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-505-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-505-100-2.0-cairo-reference.png
deleted file mode 100644
index 3359ff7..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-505-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-510-100-1.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-510-100-1.0-agg-reference.png
deleted file mode 100644
index 8374ecd..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-510-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-510-100-1.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-510-100-1.0-cairo-reference.png
deleted file mode 100644
index 7159e2e..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-510-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-510-100-2.0-agg-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-510-100-2.0-agg-reference.png
deleted file mode 100644
index de87e55..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-510-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/shieldsymbolizer-4-510-100-2.0-cairo-reference.png b/tests/visual_tests/images/shieldsymbolizer-4-510-100-2.0-cairo-reference.png
deleted file mode 100644
index 0dcb533..0000000
Binary files a/tests/visual_tests/images/shieldsymbolizer-4-510-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-100-100-1.0-agg-reference.png b/tests/visual_tests/images/simple-100-100-1.0-agg-reference.png
deleted file mode 100644
index 1c8424b..0000000
Binary files a/tests/visual_tests/images/simple-100-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-100-100-1.0-cairo-reference.png b/tests/visual_tests/images/simple-100-100-1.0-cairo-reference.png
deleted file mode 100644
index 2490ad3..0000000
Binary files a/tests/visual_tests/images/simple-100-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-100-100-2.0-agg-reference.png b/tests/visual_tests/images/simple-100-100-2.0-agg-reference.png
deleted file mode 100644
index b3d13d9..0000000
Binary files a/tests/visual_tests/images/simple-100-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-100-100-2.0-cairo-reference.png b/tests/visual_tests/images/simple-100-100-2.0-cairo-reference.png
deleted file mode 100644
index 58089e4..0000000
Binary files a/tests/visual_tests/images/simple-100-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-150-100-1.0-agg-reference.png b/tests/visual_tests/images/simple-150-100-1.0-agg-reference.png
deleted file mode 100644
index 7cbce97..0000000
Binary files a/tests/visual_tests/images/simple-150-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-150-100-1.0-cairo-reference.png b/tests/visual_tests/images/simple-150-100-1.0-cairo-reference.png
deleted file mode 100644
index cd4ab50..0000000
Binary files a/tests/visual_tests/images/simple-150-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-150-100-2.0-agg-reference.png b/tests/visual_tests/images/simple-150-100-2.0-agg-reference.png
deleted file mode 100644
index 31e4d13..0000000
Binary files a/tests/visual_tests/images/simple-150-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-150-100-2.0-cairo-reference.png b/tests/visual_tests/images/simple-150-100-2.0-cairo-reference.png
deleted file mode 100644
index 48caeb4..0000000
Binary files a/tests/visual_tests/images/simple-150-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-250-100-1.0-agg-reference.png b/tests/visual_tests/images/simple-250-100-1.0-agg-reference.png
deleted file mode 100644
index fdb63c8..0000000
Binary files a/tests/visual_tests/images/simple-250-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-250-100-1.0-cairo-reference.png b/tests/visual_tests/images/simple-250-100-1.0-cairo-reference.png
deleted file mode 100644
index e7c7a5d..0000000
Binary files a/tests/visual_tests/images/simple-250-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-250-100-2.0-agg-reference.png b/tests/visual_tests/images/simple-250-100-2.0-agg-reference.png
deleted file mode 100644
index f29a48d..0000000
Binary files a/tests/visual_tests/images/simple-250-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-250-100-2.0-cairo-reference.png b/tests/visual_tests/images/simple-250-100-2.0-cairo-reference.png
deleted file mode 100644
index 14ecb67..0000000
Binary files a/tests/visual_tests/images/simple-250-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-300-100-1.0-agg-reference.png b/tests/visual_tests/images/simple-300-100-1.0-agg-reference.png
deleted file mode 100644
index 6d15aab..0000000
Binary files a/tests/visual_tests/images/simple-300-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-300-100-1.0-cairo-reference.png b/tests/visual_tests/images/simple-300-100-1.0-cairo-reference.png
deleted file mode 100644
index 9debca1..0000000
Binary files a/tests/visual_tests/images/simple-300-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-300-100-2.0-agg-reference.png b/tests/visual_tests/images/simple-300-100-2.0-agg-reference.png
deleted file mode 100644
index d54df74..0000000
Binary files a/tests/visual_tests/images/simple-300-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-300-100-2.0-cairo-reference.png b/tests/visual_tests/images/simple-300-100-2.0-cairo-reference.png
deleted file mode 100644
index 2d811af..0000000
Binary files a/tests/visual_tests/images/simple-300-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-400-100-1.0-agg-reference.png b/tests/visual_tests/images/simple-400-100-1.0-agg-reference.png
deleted file mode 100644
index 3a2fda1..0000000
Binary files a/tests/visual_tests/images/simple-400-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-400-100-1.0-cairo-reference.png b/tests/visual_tests/images/simple-400-100-1.0-cairo-reference.png
deleted file mode 100644
index a8047e0..0000000
Binary files a/tests/visual_tests/images/simple-400-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-400-100-2.0-agg-reference.png b/tests/visual_tests/images/simple-400-100-2.0-agg-reference.png
deleted file mode 100644
index 060d334..0000000
Binary files a/tests/visual_tests/images/simple-400-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-400-100-2.0-cairo-reference.png b/tests/visual_tests/images/simple-400-100-2.0-cairo-reference.png
deleted file mode 100644
index a777040..0000000
Binary files a/tests/visual_tests/images/simple-400-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-600-100-1.0-agg-reference.png b/tests/visual_tests/images/simple-600-100-1.0-agg-reference.png
deleted file mode 100644
index 3623404..0000000
Binary files a/tests/visual_tests/images/simple-600-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-600-100-1.0-cairo-reference.png b/tests/visual_tests/images/simple-600-100-1.0-cairo-reference.png
deleted file mode 100644
index f58181b..0000000
Binary files a/tests/visual_tests/images/simple-600-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-600-100-2.0-agg-reference.png b/tests/visual_tests/images/simple-600-100-2.0-agg-reference.png
deleted file mode 100644
index 5bfde25..0000000
Binary files a/tests/visual_tests/images/simple-600-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-600-100-2.0-cairo-reference.png b/tests/visual_tests/images/simple-600-100-2.0-cairo-reference.png
deleted file mode 100644
index 0de2346..0000000
Binary files a/tests/visual_tests/images/simple-600-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-800-100-1.0-agg-reference.png b/tests/visual_tests/images/simple-800-100-1.0-agg-reference.png
deleted file mode 100644
index 748d997..0000000
Binary files a/tests/visual_tests/images/simple-800-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-800-100-1.0-cairo-reference.png b/tests/visual_tests/images/simple-800-100-1.0-cairo-reference.png
deleted file mode 100644
index 273b914..0000000
Binary files a/tests/visual_tests/images/simple-800-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-800-100-2.0-agg-reference.png b/tests/visual_tests/images/simple-800-100-2.0-agg-reference.png
deleted file mode 100644
index aea49db..0000000
Binary files a/tests/visual_tests/images/simple-800-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-800-100-2.0-cairo-reference.png b/tests/visual_tests/images/simple-800-100-2.0-cairo-reference.png
deleted file mode 100644
index 908a992..0000000
Binary files a/tests/visual_tests/images/simple-800-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-E-500-100-1.0-agg-reference.png b/tests/visual_tests/images/simple-E-500-100-1.0-agg-reference.png
deleted file mode 100644
index 38e97ca..0000000
Binary files a/tests/visual_tests/images/simple-E-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-E-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/simple-E-500-100-1.0-cairo-reference.png
deleted file mode 100644
index 4f987d5..0000000
Binary files a/tests/visual_tests/images/simple-E-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-E-500-100-2.0-agg-reference.png b/tests/visual_tests/images/simple-E-500-100-2.0-agg-reference.png
deleted file mode 100644
index 8de9e05..0000000
Binary files a/tests/visual_tests/images/simple-E-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-E-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/simple-E-500-100-2.0-cairo-reference.png
deleted file mode 100644
index c8dc04b..0000000
Binary files a/tests/visual_tests/images/simple-E-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-N-500-100-1.0-agg-reference.png b/tests/visual_tests/images/simple-N-500-100-1.0-agg-reference.png
deleted file mode 100644
index b9a246d..0000000
Binary files a/tests/visual_tests/images/simple-N-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-N-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/simple-N-500-100-1.0-cairo-reference.png
deleted file mode 100644
index c491c26..0000000
Binary files a/tests/visual_tests/images/simple-N-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-N-500-100-2.0-agg-reference.png b/tests/visual_tests/images/simple-N-500-100-2.0-agg-reference.png
deleted file mode 100644
index bbacdc0..0000000
Binary files a/tests/visual_tests/images/simple-N-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-N-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/simple-N-500-100-2.0-cairo-reference.png
deleted file mode 100644
index ee99dc4..0000000
Binary files a/tests/visual_tests/images/simple-N-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-NE-500-100-1.0-agg-reference.png b/tests/visual_tests/images/simple-NE-500-100-1.0-agg-reference.png
deleted file mode 100644
index 18f8b94..0000000
Binary files a/tests/visual_tests/images/simple-NE-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-NE-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/simple-NE-500-100-1.0-cairo-reference.png
deleted file mode 100644
index f2a5ce7..0000000
Binary files a/tests/visual_tests/images/simple-NE-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-NE-500-100-2.0-agg-reference.png b/tests/visual_tests/images/simple-NE-500-100-2.0-agg-reference.png
deleted file mode 100644
index 5c5669d..0000000
Binary files a/tests/visual_tests/images/simple-NE-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-NE-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/simple-NE-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 6a44e27..0000000
Binary files a/tests/visual_tests/images/simple-NE-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-NW-500-100-1.0-agg-reference.png b/tests/visual_tests/images/simple-NW-500-100-1.0-agg-reference.png
deleted file mode 100644
index b0c3049..0000000
Binary files a/tests/visual_tests/images/simple-NW-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-NW-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/simple-NW-500-100-1.0-cairo-reference.png
deleted file mode 100644
index ee3dff1..0000000
Binary files a/tests/visual_tests/images/simple-NW-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-NW-500-100-2.0-agg-reference.png b/tests/visual_tests/images/simple-NW-500-100-2.0-agg-reference.png
deleted file mode 100644
index faf42d8..0000000
Binary files a/tests/visual_tests/images/simple-NW-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-NW-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/simple-NW-500-100-2.0-cairo-reference.png
deleted file mode 100644
index aa298d3..0000000
Binary files a/tests/visual_tests/images/simple-NW-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-S-500-100-1.0-agg-reference.png b/tests/visual_tests/images/simple-S-500-100-1.0-agg-reference.png
deleted file mode 100644
index 8e5c8ab..0000000
Binary files a/tests/visual_tests/images/simple-S-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-S-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/simple-S-500-100-1.0-cairo-reference.png
deleted file mode 100644
index a383860..0000000
Binary files a/tests/visual_tests/images/simple-S-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-S-500-100-2.0-agg-reference.png b/tests/visual_tests/images/simple-S-500-100-2.0-agg-reference.png
deleted file mode 100644
index 882a9a5..0000000
Binary files a/tests/visual_tests/images/simple-S-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-S-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/simple-S-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 136809b..0000000
Binary files a/tests/visual_tests/images/simple-S-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-SE-500-100-1.0-agg-reference.png b/tests/visual_tests/images/simple-SE-500-100-1.0-agg-reference.png
deleted file mode 100644
index 6b01c14..0000000
Binary files a/tests/visual_tests/images/simple-SE-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-SE-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/simple-SE-500-100-1.0-cairo-reference.png
deleted file mode 100644
index b4d0941..0000000
Binary files a/tests/visual_tests/images/simple-SE-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-SE-500-100-2.0-agg-reference.png b/tests/visual_tests/images/simple-SE-500-100-2.0-agg-reference.png
deleted file mode 100644
index 9c8e276..0000000
Binary files a/tests/visual_tests/images/simple-SE-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-SE-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/simple-SE-500-100-2.0-cairo-reference.png
deleted file mode 100644
index ff1ae27..0000000
Binary files a/tests/visual_tests/images/simple-SE-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-SW-500-100-1.0-agg-reference.png b/tests/visual_tests/images/simple-SW-500-100-1.0-agg-reference.png
deleted file mode 100644
index ff59e60..0000000
Binary files a/tests/visual_tests/images/simple-SW-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-SW-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/simple-SW-500-100-1.0-cairo-reference.png
deleted file mode 100644
index e4d4808..0000000
Binary files a/tests/visual_tests/images/simple-SW-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-SW-500-100-2.0-agg-reference.png b/tests/visual_tests/images/simple-SW-500-100-2.0-agg-reference.png
deleted file mode 100644
index 39a5494..0000000
Binary files a/tests/visual_tests/images/simple-SW-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-SW-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/simple-SW-500-100-2.0-cairo-reference.png
deleted file mode 100644
index 13979d2..0000000
Binary files a/tests/visual_tests/images/simple-SW-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-W-500-100-1.0-agg-reference.png b/tests/visual_tests/images/simple-W-500-100-1.0-agg-reference.png
deleted file mode 100644
index 69dd08d..0000000
Binary files a/tests/visual_tests/images/simple-W-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-W-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/simple-W-500-100-1.0-cairo-reference.png
deleted file mode 100644
index 24d09a0..0000000
Binary files a/tests/visual_tests/images/simple-W-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-W-500-100-2.0-agg-reference.png b/tests/visual_tests/images/simple-W-500-100-2.0-agg-reference.png
deleted file mode 100644
index 2fbaf5b..0000000
Binary files a/tests/visual_tests/images/simple-W-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-W-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/simple-W-500-100-2.0-cairo-reference.png
deleted file mode 100644
index f8e3010..0000000
Binary files a/tests/visual_tests/images/simple-W-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-shield-600-400-1.0-agg-reference.png b/tests/visual_tests/images/simple-shield-600-400-1.0-agg-reference.png
deleted file mode 100644
index aedabdf..0000000
Binary files a/tests/visual_tests/images/simple-shield-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-shield-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/simple-shield-600-400-1.0-cairo-reference.png
deleted file mode 100644
index baa7e2f..0000000
Binary files a/tests/visual_tests/images/simple-shield-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-shield-600-400-2.0-agg-reference.png b/tests/visual_tests/images/simple-shield-600-400-2.0-agg-reference.png
deleted file mode 100644
index b82e914..0000000
Binary files a/tests/visual_tests/images/simple-shield-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/simple-shield-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/simple-shield-600-400-2.0-cairo-reference.png
deleted file mode 100644
index baa7e2f..0000000
Binary files a/tests/visual_tests/images/simple-shield-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-1.0-agg-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-1.0-agg-reference.png
deleted file mode 100644
index 8ba187d..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 998b329..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-2.0-agg-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-2.0-agg-reference.png
deleted file mode 100644
index 8ba187d..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 998b329..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-0,0-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-1.0-agg-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-1.0-agg-reference.png
deleted file mode 100644
index 2ecb9ee..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-1.0-cairo-reference.png
deleted file mode 100644
index cc2ac31..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-2.0-agg-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-2.0-agg-reference.png
deleted file mode 100644
index 2ecb9ee..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-2.0-cairo-reference.png
deleted file mode 100644
index cc2ac31..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-0,1-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-1.0-agg-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-1.0-agg-reference.png
deleted file mode 100644
index 56a8ef5..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-1.0-cairo-reference.png
deleted file mode 100644
index a0d5ed1..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-2.0-agg-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-2.0-agg-reference.png
deleted file mode 100644
index 56a8ef5..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-2.0-cairo-reference.png
deleted file mode 100644
index a0d5ed1..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-1,0-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-1.0-agg-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-1.0-agg-reference.png
deleted file mode 100644
index 0e1cd5b..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-1.0-cairo-reference.png
deleted file mode 100644
index cdf19e8..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-2.0-agg-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-2.0-agg-reference.png
deleted file mode 100644
index 0e1cd5b..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-2.0-cairo-reference.png
deleted file mode 100644
index cdf19e8..0000000
Binary files a/tests/visual_tests/images/style-level-compositing-tiled-1,1-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-allow-overlap-expr-500-500-1.0-agg-reference.png b/tests/visual_tests/images/text-allow-overlap-expr-500-500-1.0-agg-reference.png
deleted file mode 100644
index f8ce913..0000000
Binary files a/tests/visual_tests/images/text-allow-overlap-expr-500-500-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-allow-overlap-expr-500-500-1.0-cairo-reference.png b/tests/visual_tests/images/text-allow-overlap-expr-500-500-1.0-cairo-reference.png
deleted file mode 100644
index e04ebca..0000000
Binary files a/tests/visual_tests/images/text-allow-overlap-expr-500-500-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-allow-overlap-expr-500-500-2.0-agg-reference.png b/tests/visual_tests/images/text-allow-overlap-expr-500-500-2.0-agg-reference.png
deleted file mode 100644
index d37986a..0000000
Binary files a/tests/visual_tests/images/text-allow-overlap-expr-500-500-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-allow-overlap-expr-500-500-2.0-cairo-reference.png b/tests/visual_tests/images/text-allow-overlap-expr-500-500-2.0-cairo-reference.png
deleted file mode 100644
index 5b69fdf..0000000
Binary files a/tests/visual_tests/images/text-allow-overlap-expr-500-500-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bengali-800-100-1.0-agg-reference.png b/tests/visual_tests/images/text-bengali-800-100-1.0-agg-reference.png
deleted file mode 100644
index c8f36ea..0000000
Binary files a/tests/visual_tests/images/text-bengali-800-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bengali-800-100-1.0-cairo-reference.png b/tests/visual_tests/images/text-bengali-800-100-1.0-cairo-reference.png
deleted file mode 100644
index 5dff0d2..0000000
Binary files a/tests/visual_tests/images/text-bengali-800-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bengali-800-100-2.0-agg-reference.png b/tests/visual_tests/images/text-bengali-800-100-2.0-agg-reference.png
deleted file mode 100644
index 605330f..0000000
Binary files a/tests/visual_tests/images/text-bengali-800-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bengali-800-100-2.0-cairo-reference.png b/tests/visual_tests/images/text-bengali-800-100-2.0-cairo-reference.png
deleted file mode 100644
index 569ff91..0000000
Binary files a/tests/visual_tests/images/text-bengali-800-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1532-600-165-1.0-agg-reference.png b/tests/visual_tests/images/text-bug1532-600-165-1.0-agg-reference.png
deleted file mode 100644
index c5f3920..0000000
Binary files a/tests/visual_tests/images/text-bug1532-600-165-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1532-600-165-1.0-cairo-reference.png b/tests/visual_tests/images/text-bug1532-600-165-1.0-cairo-reference.png
deleted file mode 100644
index e856308..0000000
Binary files a/tests/visual_tests/images/text-bug1532-600-165-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1532-600-165-2.0-agg-reference.png b/tests/visual_tests/images/text-bug1532-600-165-2.0-agg-reference.png
deleted file mode 100644
index 724394c..0000000
Binary files a/tests/visual_tests/images/text-bug1532-600-165-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1532-600-165-2.0-cairo-reference.png b/tests/visual_tests/images/text-bug1532-600-165-2.0-cairo-reference.png
deleted file mode 100644
index 270038a..0000000
Binary files a/tests/visual_tests/images/text-bug1532-600-165-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1533-600-600-1.0-agg-reference.png b/tests/visual_tests/images/text-bug1533-600-600-1.0-agg-reference.png
deleted file mode 100644
index c3bee1a..0000000
Binary files a/tests/visual_tests/images/text-bug1533-600-600-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1533-600-600-1.0-cairo-reference.png b/tests/visual_tests/images/text-bug1533-600-600-1.0-cairo-reference.png
deleted file mode 100644
index d928b96..0000000
Binary files a/tests/visual_tests/images/text-bug1533-600-600-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1533-600-600-2.0-agg-reference.png b/tests/visual_tests/images/text-bug1533-600-600-2.0-agg-reference.png
deleted file mode 100644
index 96b6908..0000000
Binary files a/tests/visual_tests/images/text-bug1533-600-600-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1533-600-600-2.0-cairo-reference.png b/tests/visual_tests/images/text-bug1533-600-600-2.0-cairo-reference.png
deleted file mode 100644
index 26d9d18..0000000
Binary files a/tests/visual_tests/images/text-bug1533-600-600-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1820+0-600-300-1.0-agg-reference.png b/tests/visual_tests/images/text-bug1820+0-600-300-1.0-agg-reference.png
deleted file mode 100644
index 13532ac..0000000
Binary files a/tests/visual_tests/images/text-bug1820+0-600-300-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1820+0-600-300-1.0-cairo-reference.png b/tests/visual_tests/images/text-bug1820+0-600-300-1.0-cairo-reference.png
deleted file mode 100644
index 21e99cc..0000000
Binary files a/tests/visual_tests/images/text-bug1820+0-600-300-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1820+0-600-300-2.0-agg-reference.png b/tests/visual_tests/images/text-bug1820+0-600-300-2.0-agg-reference.png
deleted file mode 100644
index 565f39f..0000000
Binary files a/tests/visual_tests/images/text-bug1820+0-600-300-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1820+0-600-300-2.0-cairo-reference.png b/tests/visual_tests/images/text-bug1820+0-600-300-2.0-cairo-reference.png
deleted file mode 100644
index 8b97828..0000000
Binary files a/tests/visual_tests/images/text-bug1820+0-600-300-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1820+1-600-300-1.0-agg-reference.png b/tests/visual_tests/images/text-bug1820+1-600-300-1.0-agg-reference.png
deleted file mode 100644
index 9f61850..0000000
Binary files a/tests/visual_tests/images/text-bug1820+1-600-300-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1820+1-600-300-1.0-cairo-reference.png b/tests/visual_tests/images/text-bug1820+1-600-300-1.0-cairo-reference.png
deleted file mode 100644
index 67fb09d..0000000
Binary files a/tests/visual_tests/images/text-bug1820+1-600-300-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1820+1-600-300-2.0-agg-reference.png b/tests/visual_tests/images/text-bug1820+1-600-300-2.0-agg-reference.png
deleted file mode 100644
index a8ef1e9..0000000
Binary files a/tests/visual_tests/images/text-bug1820+1-600-300-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1820+1-600-300-2.0-cairo-reference.png b/tests/visual_tests/images/text-bug1820+1-600-300-2.0-cairo-reference.png
deleted file mode 100644
index 64ba71c..0000000
Binary files a/tests/visual_tests/images/text-bug1820+1-600-300-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1820-1-600-300-1.0-agg-reference.png b/tests/visual_tests/images/text-bug1820-1-600-300-1.0-agg-reference.png
deleted file mode 100644
index 4dbae33..0000000
Binary files a/tests/visual_tests/images/text-bug1820-1-600-300-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1820-1-600-300-1.0-cairo-reference.png b/tests/visual_tests/images/text-bug1820-1-600-300-1.0-cairo-reference.png
deleted file mode 100644
index 11793b6..0000000
Binary files a/tests/visual_tests/images/text-bug1820-1-600-300-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1820-1-600-300-2.0-agg-reference.png b/tests/visual_tests/images/text-bug1820-1-600-300-2.0-agg-reference.png
deleted file mode 100644
index 5ad7b51..0000000
Binary files a/tests/visual_tests/images/text-bug1820-1-600-300-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug1820-1-600-300-2.0-cairo-reference.png b/tests/visual_tests/images/text-bug1820-1-600-300-2.0-cairo-reference.png
deleted file mode 100644
index 833d446..0000000
Binary files a/tests/visual_tests/images/text-bug1820-1-600-300-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug2037-800-300-1.0-agg-reference.png b/tests/visual_tests/images/text-bug2037-800-300-1.0-agg-reference.png
deleted file mode 100644
index 92d8927..0000000
Binary files a/tests/visual_tests/images/text-bug2037-800-300-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug2037-800-300-1.0-cairo-reference.png b/tests/visual_tests/images/text-bug2037-800-300-1.0-cairo-reference.png
deleted file mode 100644
index 702a4bd..0000000
Binary files a/tests/visual_tests/images/text-bug2037-800-300-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug2037-800-300-2.0-agg-reference.png b/tests/visual_tests/images/text-bug2037-800-300-2.0-agg-reference.png
deleted file mode 100644
index c6cb44b..0000000
Binary files a/tests/visual_tests/images/text-bug2037-800-300-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-bug2037-800-300-2.0-cairo-reference.png b/tests/visual_tests/images/text-bug2037-800-300-2.0-cairo-reference.png
deleted file mode 100644
index 76a1a15..0000000
Binary files a/tests/visual_tests/images/text-bug2037-800-300-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-charplacement-512-512-1.0-agg-reference.png b/tests/visual_tests/images/text-charplacement-512-512-1.0-agg-reference.png
deleted file mode 100644
index f99d8cb..0000000
Binary files a/tests/visual_tests/images/text-charplacement-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-charplacement-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/text-charplacement-512-512-1.0-cairo-reference.png
deleted file mode 100644
index d3d8bbd..0000000
Binary files a/tests/visual_tests/images/text-charplacement-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-charplacement-512-512-2.0-agg-reference.png b/tests/visual_tests/images/text-charplacement-512-512-2.0-agg-reference.png
deleted file mode 100644
index 2c8c011..0000000
Binary files a/tests/visual_tests/images/text-charplacement-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-charplacement-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/text-charplacement-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 30eefc2..0000000
Binary files a/tests/visual_tests/images/text-charplacement-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-data-binding-500-500-1.0-agg-reference.png b/tests/visual_tests/images/text-data-binding-500-500-1.0-agg-reference.png
deleted file mode 100644
index 7cd1b6f..0000000
Binary files a/tests/visual_tests/images/text-data-binding-500-500-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-data-binding-500-500-1.0-cairo-reference.png b/tests/visual_tests/images/text-data-binding-500-500-1.0-cairo-reference.png
deleted file mode 100644
index 6bbda39..0000000
Binary files a/tests/visual_tests/images/text-data-binding-500-500-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-data-binding-500-500-2.0-agg-reference.png b/tests/visual_tests/images/text-data-binding-500-500-2.0-agg-reference.png
deleted file mode 100644
index a3085cd..0000000
Binary files a/tests/visual_tests/images/text-data-binding-500-500-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-data-binding-500-500-2.0-cairo-reference.png b/tests/visual_tests/images/text-data-binding-500-500-2.0-cairo-reference.png
deleted file mode 100644
index 6317826..0000000
Binary files a/tests/visual_tests/images/text-data-binding-500-500-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-displacement-512-512-1.0-agg-reference.png b/tests/visual_tests/images/text-displacement-512-512-1.0-agg-reference.png
deleted file mode 100644
index 0167438..0000000
Binary files a/tests/visual_tests/images/text-displacement-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-displacement-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/text-displacement-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 4eb1c41..0000000
Binary files a/tests/visual_tests/images/text-displacement-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-displacement-512-512-2.0-agg-reference.png b/tests/visual_tests/images/text-displacement-512-512-2.0-agg-reference.png
deleted file mode 100644
index 5a9fdb1..0000000
Binary files a/tests/visual_tests/images/text-displacement-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-displacement-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/text-displacement-512-512-2.0-cairo-reference.png
deleted file mode 100644
index d3b238e..0000000
Binary files a/tests/visual_tests/images/text-displacement-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-expressionformat-color-800-100-1.0-agg-reference.png b/tests/visual_tests/images/text-expressionformat-color-800-100-1.0-agg-reference.png
deleted file mode 100644
index 633a0e6..0000000
Binary files a/tests/visual_tests/images/text-expressionformat-color-800-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-expressionformat-color-800-100-1.0-cairo-reference.png b/tests/visual_tests/images/text-expressionformat-color-800-100-1.0-cairo-reference.png
deleted file mode 100644
index 227fcfb..0000000
Binary files a/tests/visual_tests/images/text-expressionformat-color-800-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-expressionformat-color-800-100-2.0-agg-reference.png b/tests/visual_tests/images/text-expressionformat-color-800-100-2.0-agg-reference.png
deleted file mode 100644
index 9b5871f..0000000
Binary files a/tests/visual_tests/images/text-expressionformat-color-800-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-expressionformat-color-800-100-2.0-cairo-reference.png b/tests/visual_tests/images/text-expressionformat-color-800-100-2.0-cairo-reference.png
deleted file mode 100644
index 074b306..0000000
Binary files a/tests/visual_tests/images/text-expressionformat-color-800-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-font-features-500-500-1.0-agg-reference.png b/tests/visual_tests/images/text-font-features-500-500-1.0-agg-reference.png
deleted file mode 100644
index 5783e07..0000000
Binary files a/tests/visual_tests/images/text-font-features-500-500-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-font-features-500-500-1.0-cairo-reference.png b/tests/visual_tests/images/text-font-features-500-500-1.0-cairo-reference.png
deleted file mode 100644
index 9412911..0000000
Binary files a/tests/visual_tests/images/text-font-features-500-500-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-font-features-500-500-2.0-agg-reference.png b/tests/visual_tests/images/text-font-features-500-500-2.0-agg-reference.png
deleted file mode 100644
index d89e950..0000000
Binary files a/tests/visual_tests/images/text-font-features-500-500-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-font-features-500-500-2.0-cairo-reference.png b/tests/visual_tests/images/text-font-features-500-500-2.0-cairo-reference.png
deleted file mode 100644
index fda86f3..0000000
Binary files a/tests/visual_tests/images/text-font-features-500-500-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halign-800-800-1.0-agg-reference.png b/tests/visual_tests/images/text-halign-800-800-1.0-agg-reference.png
deleted file mode 100644
index 2a454e6..0000000
Binary files a/tests/visual_tests/images/text-halign-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halign-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/text-halign-800-800-1.0-cairo-reference.png
deleted file mode 100644
index 942dfa1..0000000
Binary files a/tests/visual_tests/images/text-halign-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halign-800-800-2.0-agg-reference.png b/tests/visual_tests/images/text-halign-800-800-2.0-agg-reference.png
deleted file mode 100644
index 269e107..0000000
Binary files a/tests/visual_tests/images/text-halign-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halign-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/text-halign-800-800-2.0-cairo-reference.png
deleted file mode 100644
index 8e106db..0000000
Binary files a/tests/visual_tests/images/text-halign-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halign-adjust-800-800-1.0-agg-reference.png b/tests/visual_tests/images/text-halign-adjust-800-800-1.0-agg-reference.png
deleted file mode 100644
index 1f1023b..0000000
Binary files a/tests/visual_tests/images/text-halign-adjust-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halign-adjust-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/text-halign-adjust-800-800-1.0-cairo-reference.png
deleted file mode 100644
index 957c5a4..0000000
Binary files a/tests/visual_tests/images/text-halign-adjust-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halign-adjust-800-800-2.0-agg-reference.png b/tests/visual_tests/images/text-halign-adjust-800-800-2.0-agg-reference.png
deleted file mode 100644
index 7b1da0c..0000000
Binary files a/tests/visual_tests/images/text-halign-adjust-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halign-adjust-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/text-halign-adjust-800-800-2.0-cairo-reference.png
deleted file mode 100644
index b3742e5..0000000
Binary files a/tests/visual_tests/images/text-halign-adjust-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halign-adjust-multiline-800-800-1.0-agg-reference.png b/tests/visual_tests/images/text-halign-adjust-multiline-800-800-1.0-agg-reference.png
deleted file mode 100644
index f578bc0..0000000
Binary files a/tests/visual_tests/images/text-halign-adjust-multiline-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halign-adjust-multiline-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/text-halign-adjust-multiline-800-800-1.0-cairo-reference.png
deleted file mode 100644
index f29c561..0000000
Binary files a/tests/visual_tests/images/text-halign-adjust-multiline-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halign-adjust-multiline-800-800-2.0-agg-reference.png b/tests/visual_tests/images/text-halign-adjust-multiline-800-800-2.0-agg-reference.png
deleted file mode 100644
index 99b5270..0000000
Binary files a/tests/visual_tests/images/text-halign-adjust-multiline-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halign-adjust-multiline-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/text-halign-adjust-multiline-800-800-2.0-cairo-reference.png
deleted file mode 100644
index 706ba2c..0000000
Binary files a/tests/visual_tests/images/text-halign-adjust-multiline-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halo-opacity-512-512-1.0-agg-reference.png b/tests/visual_tests/images/text-halo-opacity-512-512-1.0-agg-reference.png
deleted file mode 100644
index 072952d..0000000
Binary files a/tests/visual_tests/images/text-halo-opacity-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halo-opacity-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/text-halo-opacity-512-512-1.0-cairo-reference.png
deleted file mode 100644
index d1dbac9..0000000
Binary files a/tests/visual_tests/images/text-halo-opacity-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halo-opacity-512-512-2.0-agg-reference.png b/tests/visual_tests/images/text-halo-opacity-512-512-2.0-agg-reference.png
deleted file mode 100644
index 0b08856..0000000
Binary files a/tests/visual_tests/images/text-halo-opacity-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halo-opacity-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/text-halo-opacity-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 9f80d32..0000000
Binary files a/tests/visual_tests/images/text-halo-opacity-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halo-rasterizer-600-400-1.0-agg-reference.png b/tests/visual_tests/images/text-halo-rasterizer-600-400-1.0-agg-reference.png
deleted file mode 100644
index 83d49e2..0000000
Binary files a/tests/visual_tests/images/text-halo-rasterizer-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halo-rasterizer-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/text-halo-rasterizer-600-400-1.0-cairo-reference.png
deleted file mode 100644
index a92e9a9..0000000
Binary files a/tests/visual_tests/images/text-halo-rasterizer-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halo-rasterizer-600-400-2.0-agg-reference.png b/tests/visual_tests/images/text-halo-rasterizer-600-400-2.0-agg-reference.png
deleted file mode 100644
index 139ab42..0000000
Binary files a/tests/visual_tests/images/text-halo-rasterizer-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halo-rasterizer-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/text-halo-rasterizer-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 953b7e4..0000000
Binary files a/tests/visual_tests/images/text-halo-rasterizer-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halo-transform-600-400-1.0-agg-reference.png b/tests/visual_tests/images/text-halo-transform-600-400-1.0-agg-reference.png
deleted file mode 100644
index 80177ff..0000000
Binary files a/tests/visual_tests/images/text-halo-transform-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halo-transform-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/text-halo-transform-600-400-1.0-cairo-reference.png
deleted file mode 100644
index a92e9a9..0000000
Binary files a/tests/visual_tests/images/text-halo-transform-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halo-transform-600-400-2.0-agg-reference.png b/tests/visual_tests/images/text-halo-transform-600-400-2.0-agg-reference.png
deleted file mode 100644
index 7179403..0000000
Binary files a/tests/visual_tests/images/text-halo-transform-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-halo-transform-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/text-halo-transform-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 953b7e4..0000000
Binary files a/tests/visual_tests/images/text-halo-transform-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-line-wrap-512-512-1.0-agg-reference.png b/tests/visual_tests/images/text-line-wrap-512-512-1.0-agg-reference.png
deleted file mode 100644
index a52e099..0000000
Binary files a/tests/visual_tests/images/text-line-wrap-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-line-wrap-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/text-line-wrap-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 532f828..0000000
Binary files a/tests/visual_tests/images/text-line-wrap-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-line-wrap-512-512-2.0-agg-reference.png b/tests/visual_tests/images/text-line-wrap-512-512-2.0-agg-reference.png
deleted file mode 100644
index e8e63bc..0000000
Binary files a/tests/visual_tests/images/text-line-wrap-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-line-wrap-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/text-line-wrap-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 8d8608d..0000000
Binary files a/tests/visual_tests/images/text-line-wrap-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-malayalam-800-100-1.0-agg-reference.png b/tests/visual_tests/images/text-malayalam-800-100-1.0-agg-reference.png
deleted file mode 100644
index 943a9d5..0000000
Binary files a/tests/visual_tests/images/text-malayalam-800-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-malayalam-800-100-1.0-cairo-reference.png b/tests/visual_tests/images/text-malayalam-800-100-1.0-cairo-reference.png
deleted file mode 100644
index e6e2463..0000000
Binary files a/tests/visual_tests/images/text-malayalam-800-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-malayalam-800-100-2.0-agg-reference.png b/tests/visual_tests/images/text-malayalam-800-100-2.0-agg-reference.png
deleted file mode 100644
index 32101e2..0000000
Binary files a/tests/visual_tests/images/text-malayalam-800-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-malayalam-800-100-2.0-cairo-reference.png b/tests/visual_tests/images/text-malayalam-800-100-2.0-cairo-reference.png
deleted file mode 100644
index 4f0699f..0000000
Binary files a/tests/visual_tests/images/text-malayalam-800-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-multi-layout-1-512-512-1.0-agg-reference.png b/tests/visual_tests/images/text-multi-layout-1-512-512-1.0-agg-reference.png
deleted file mode 100644
index fdc336a..0000000
Binary files a/tests/visual_tests/images/text-multi-layout-1-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-multi-layout-1-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/text-multi-layout-1-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 84f293a..0000000
Binary files a/tests/visual_tests/images/text-multi-layout-1-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-multi-layout-1-512-512-2.0-agg-reference.png b/tests/visual_tests/images/text-multi-layout-1-512-512-2.0-agg-reference.png
deleted file mode 100644
index e6fb4f4..0000000
Binary files a/tests/visual_tests/images/text-multi-layout-1-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-multi-layout-1-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/text-multi-layout-1-512-512-2.0-cairo-reference.png
deleted file mode 100644
index b2b2b9e..0000000
Binary files a/tests/visual_tests/images/text-multi-layout-1-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-multi-layout-2-512-512-1.0-agg-reference.png b/tests/visual_tests/images/text-multi-layout-2-512-512-1.0-agg-reference.png
deleted file mode 100644
index 90efb53..0000000
Binary files a/tests/visual_tests/images/text-multi-layout-2-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-multi-layout-2-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/text-multi-layout-2-512-512-1.0-cairo-reference.png
deleted file mode 100644
index ea4b5fb..0000000
Binary files a/tests/visual_tests/images/text-multi-layout-2-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-multi-layout-2-512-512-2.0-agg-reference.png b/tests/visual_tests/images/text-multi-layout-2-512-512-2.0-agg-reference.png
deleted file mode 100644
index cf94c15..0000000
Binary files a/tests/visual_tests/images/text-multi-layout-2-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-multi-layout-2-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/text-multi-layout-2-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 4a418a9..0000000
Binary files a/tests/visual_tests/images/text-multi-layout-2-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-overlap-512-512-1.0-agg-reference.png b/tests/visual_tests/images/text-overlap-512-512-1.0-agg-reference.png
deleted file mode 100644
index 3fccea8..0000000
Binary files a/tests/visual_tests/images/text-overlap-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-overlap-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/text-overlap-512-512-1.0-cairo-reference.png
deleted file mode 100644
index dc61ec1..0000000
Binary files a/tests/visual_tests/images/text-overlap-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-overlap-512-512-2.0-agg-reference.png b/tests/visual_tests/images/text-overlap-512-512-2.0-agg-reference.png
deleted file mode 100644
index cdb9d97..0000000
Binary files a/tests/visual_tests/images/text-overlap-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-overlap-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/text-overlap-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 4413c2d..0000000
Binary files a/tests/visual_tests/images/text-overlap-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-spacing-512-512-1.0-agg-reference.png b/tests/visual_tests/images/text-spacing-512-512-1.0-agg-reference.png
deleted file mode 100644
index 16ea180..0000000
Binary files a/tests/visual_tests/images/text-spacing-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-spacing-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/text-spacing-512-512-1.0-cairo-reference.png
deleted file mode 100644
index f128881..0000000
Binary files a/tests/visual_tests/images/text-spacing-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-spacing-512-512-2.0-agg-reference.png b/tests/visual_tests/images/text-spacing-512-512-2.0-agg-reference.png
deleted file mode 100644
index 1415056..0000000
Binary files a/tests/visual_tests/images/text-spacing-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-spacing-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/text-spacing-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 25ff4bb..0000000
Binary files a/tests/visual_tests/images/text-spacing-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-ttc-font-600-400-1.0-agg-reference.png b/tests/visual_tests/images/text-ttc-font-600-400-1.0-agg-reference.png
deleted file mode 100644
index dad75d2..0000000
Binary files a/tests/visual_tests/images/text-ttc-font-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-ttc-font-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/text-ttc-font-600-400-1.0-cairo-reference.png
deleted file mode 100644
index 9446f53..0000000
Binary files a/tests/visual_tests/images/text-ttc-font-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-ttc-font-600-400-2.0-agg-reference.png b/tests/visual_tests/images/text-ttc-font-600-400-2.0-agg-reference.png
deleted file mode 100644
index 96ea0de..0000000
Binary files a/tests/visual_tests/images/text-ttc-font-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-ttc-font-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/text-ttc-font-600-400-2.0-cairo-reference.png
deleted file mode 100644
index ab0b69d..0000000
Binary files a/tests/visual_tests/images/text-ttc-font-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-typographic-512-512-1.0-agg-reference.png b/tests/visual_tests/images/text-typographic-512-512-1.0-agg-reference.png
deleted file mode 100644
index 54415f3..0000000
Binary files a/tests/visual_tests/images/text-typographic-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-typographic-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/text-typographic-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 6c25505..0000000
Binary files a/tests/visual_tests/images/text-typographic-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-typographic-512-512-2.0-agg-reference.png b/tests/visual_tests/images/text-typographic-512-512-2.0-agg-reference.png
deleted file mode 100644
index 1a4c1b1..0000000
Binary files a/tests/visual_tests/images/text-typographic-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-typographic-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/text-typographic-512-512-2.0-cairo-reference.png
deleted file mode 100644
index a1d74f6..0000000
Binary files a/tests/visual_tests/images/text-typographic-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-vertical-alignment-800-800-1.0-agg-reference.png b/tests/visual_tests/images/text-vertical-alignment-800-800-1.0-agg-reference.png
deleted file mode 100644
index b9303a1..0000000
Binary files a/tests/visual_tests/images/text-vertical-alignment-800-800-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-vertical-alignment-800-800-1.0-cairo-reference.png b/tests/visual_tests/images/text-vertical-alignment-800-800-1.0-cairo-reference.png
deleted file mode 100644
index 5a99bf5..0000000
Binary files a/tests/visual_tests/images/text-vertical-alignment-800-800-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-vertical-alignment-800-800-2.0-agg-reference.png b/tests/visual_tests/images/text-vertical-alignment-800-800-2.0-agg-reference.png
deleted file mode 100644
index c8bd47a..0000000
Binary files a/tests/visual_tests/images/text-vertical-alignment-800-800-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/text-vertical-alignment-800-800-2.0-cairo-reference.png b/tests/visual_tests/images/text-vertical-alignment-800-800-2.0-cairo-reference.png
deleted file mode 100644
index 070c901..0000000
Binary files a/tests/visual_tests/images/text-vertical-alignment-800-800-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-1.0-agg-reference.png b/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-1.0-agg-reference.png
deleted file mode 100644
index df37253..0000000
Binary files a/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-1.0-cairo-reference.png
deleted file mode 100644
index df37253..0000000
Binary files a/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-2.0-agg-reference.png b/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-2.0-agg-reference.png
deleted file mode 100644
index df37253..0000000
Binary files a/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-2.0-cairo-reference.png
deleted file mode 100644
index df37253..0000000
Binary files a/tests/visual_tests/images/tiff-alpha-broken-assoc-alpha-gdal-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-alpha-gdal-600-400-1.0-agg-reference.png b/tests/visual_tests/images/tiff-alpha-gdal-600-400-1.0-agg-reference.png
deleted file mode 100644
index eb2a80d..0000000
Binary files a/tests/visual_tests/images/tiff-alpha-gdal-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-alpha-gdal-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-alpha-gdal-600-400-1.0-cairo-reference.png
deleted file mode 100644
index eb2a80d..0000000
Binary files a/tests/visual_tests/images/tiff-alpha-gdal-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-alpha-gdal-600-400-2.0-agg-reference.png b/tests/visual_tests/images/tiff-alpha-gdal-600-400-2.0-agg-reference.png
deleted file mode 100644
index eb2a80d..0000000
Binary files a/tests/visual_tests/images/tiff-alpha-gdal-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-alpha-gdal-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-alpha-gdal-600-400-2.0-cairo-reference.png
deleted file mode 100644
index eb2a80d..0000000
Binary files a/tests/visual_tests/images/tiff-alpha-gdal-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-1.0-agg-reference.png b/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-1.0-agg-reference.png
deleted file mode 100644
index 77bd59f..0000000
Binary files a/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-1.0-cairo-reference.png
deleted file mode 100644
index 77bd59f..0000000
Binary files a/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-2.0-agg-reference.png b/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-2.0-agg-reference.png
deleted file mode 100644
index 77bd59f..0000000
Binary files a/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 77bd59f..0000000
Binary files a/tests/visual_tests/images/tiff-alpha-gradient-gdal-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-1.0-agg-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-1.0-agg-reference.png
deleted file mode 100644
index cf37ac7..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-1.0-cairo-reference.png
deleted file mode 100644
index cf37ac7..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-2.0-agg-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-2.0-agg-reference.png
deleted file mode 100644
index cf37ac7..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-2.0-cairo-reference.png
deleted file mode 100644
index cf37ac7..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal1-255-257-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-1.0-agg-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-1.0-agg-reference.png
deleted file mode 100644
index 181f49f..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-1.0-cairo-reference.png
deleted file mode 100644
index 181f49f..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-2.0-agg-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-2.0-agg-reference.png
deleted file mode 100644
index 181f49f..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-2.0-cairo-reference.png
deleted file mode 100644
index 181f49f..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal1-256-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-1.0-agg-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-1.0-agg-reference.png
deleted file mode 100644
index 562f007..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-1.0-cairo-reference.png
deleted file mode 100644
index 562f007..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-2.0-agg-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-2.0-agg-reference.png
deleted file mode 100644
index 562f007..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-2.0-cairo-reference.png
deleted file mode 100644
index 562f007..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal2-255-257-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-1.0-agg-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-1.0-agg-reference.png
deleted file mode 100644
index dbf4ebe..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-1.0-cairo-reference.png
deleted file mode 100644
index dbf4ebe..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-2.0-agg-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-2.0-agg-reference.png
deleted file mode 100644
index dbf4ebe..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-2.0-cairo-reference.png
deleted file mode 100644
index dbf4ebe..0000000
Binary files a/tests/visual_tests/images/tiff-edge-alignment-gdal2-256-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-1.0-agg-reference.png b/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-1.0-agg-reference.png
deleted file mode 100644
index 2d09d34..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-1.0-cairo-reference.png
deleted file mode 100644
index 2d09d34..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-2.0-agg-reference.png b/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-2.0-agg-reference.png
deleted file mode 100644
index 2d09d34..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 2d09d34..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-gdal-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-1.0-agg-reference.png b/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-1.0-agg-reference.png
deleted file mode 100644
index 16a6230..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-1.0-cairo-reference.png
deleted file mode 100644
index 16a6230..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-2.0-agg-reference.png b/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-2.0-agg-reference.png
deleted file mode 100644
index 16a6230..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-2.0-cairo-reference.png
deleted file mode 100644
index 16a6230..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-gdal-969-793-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-rgba-500-100-1.0-agg-reference.png b/tests/visual_tests/images/tiff-nodata-edge-rgba-500-100-1.0-agg-reference.png
deleted file mode 100644
index c9c2fbe..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-rgba-500-100-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-rgba-500-100-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-nodata-edge-rgba-500-100-1.0-cairo-reference.png
deleted file mode 100644
index eec8d04..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-rgba-500-100-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-rgba-500-100-2.0-agg-reference.png b/tests/visual_tests/images/tiff-nodata-edge-rgba-500-100-2.0-agg-reference.png
deleted file mode 100644
index c9c2fbe..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-rgba-500-100-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-rgba-500-100-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-nodata-edge-rgba-500-100-2.0-cairo-reference.png
deleted file mode 100644
index eec8d04..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-rgba-500-100-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-rgba-512-512-1.0-agg-reference.png b/tests/visual_tests/images/tiff-nodata-edge-rgba-512-512-1.0-agg-reference.png
deleted file mode 100644
index a717799..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-rgba-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-rgba-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-nodata-edge-rgba-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 69af86e..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-rgba-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-rgba-512-512-2.0-agg-reference.png b/tests/visual_tests/images/tiff-nodata-edge-rgba-512-512-2.0-agg-reference.png
deleted file mode 100644
index a717799..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-rgba-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-edge-rgba-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-nodata-edge-rgba-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 69af86e..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-edge-rgba-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-rgb-512-512-1.0-agg-reference.png b/tests/visual_tests/images/tiff-nodata-rgb-512-512-1.0-agg-reference.png
deleted file mode 100644
index e17dd9c..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-rgb-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-rgb-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-nodata-rgb-512-512-1.0-cairo-reference.png
deleted file mode 100644
index e01309a..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-rgb-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-rgb-512-512-2.0-agg-reference.png b/tests/visual_tests/images/tiff-nodata-rgb-512-512-2.0-agg-reference.png
deleted file mode 100644
index e17dd9c..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-rgb-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-rgb-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-nodata-rgb-512-512-2.0-cairo-reference.png
deleted file mode 100644
index e01309a..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-rgb-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-rgba-512-512-1.0-agg-reference.png b/tests/visual_tests/images/tiff-nodata-rgba-512-512-1.0-agg-reference.png
deleted file mode 100644
index ef1625a..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-rgba-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-rgba-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-nodata-rgba-512-512-1.0-cairo-reference.png
deleted file mode 100644
index 96be15b..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-rgba-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-rgba-512-512-2.0-agg-reference.png b/tests/visual_tests/images/tiff-nodata-rgba-512-512-2.0-agg-reference.png
deleted file mode 100644
index ef1625a..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-rgba-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-rgba-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-nodata-rgba-512-512-2.0-cairo-reference.png
deleted file mode 100644
index 96be15b..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-rgba-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-tolerance-512-512-1.0-agg-reference.png b/tests/visual_tests/images/tiff-nodata-tolerance-512-512-1.0-agg-reference.png
deleted file mode 100644
index f33b25a..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-tolerance-512-512-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-tolerance-512-512-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-nodata-tolerance-512-512-1.0-cairo-reference.png
deleted file mode 100644
index f33b25a..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-tolerance-512-512-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-tolerance-512-512-2.0-agg-reference.png b/tests/visual_tests/images/tiff-nodata-tolerance-512-512-2.0-agg-reference.png
deleted file mode 100644
index f33b25a..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-tolerance-512-512-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-nodata-tolerance-512-512-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-nodata-tolerance-512-512-2.0-cairo-reference.png
deleted file mode 100644
index f33b25a..0000000
Binary files a/tests/visual_tests/images/tiff-nodata-tolerance-512-512-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-1.0-agg-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-1.0-agg-reference.png
deleted file mode 100644
index fa01319..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-1.0-cairo-reference.png
deleted file mode 100644
index fa01319..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-2.0-agg-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-2.0-agg-reference.png
deleted file mode 100644
index fa01319..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-2.0-cairo-reference.png
deleted file mode 100644
index fa01319..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal-256-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-1.0-agg-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-1.0-agg-reference.png
deleted file mode 100644
index b23e716..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-1.0-cairo-reference.png
deleted file mode 100644
index b23e716..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-2.0-agg-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-2.0-agg-reference.png
deleted file mode 100644
index b23e716..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-2.0-cairo-reference.png
deleted file mode 100644
index b23e716..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal-969-793-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-1.0-agg-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-1.0-agg-reference.png
deleted file mode 100644
index faebe7e..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-1.0-cairo-reference.png
deleted file mode 100644
index faebe7e..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-2.0-agg-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-2.0-agg-reference.png
deleted file mode 100644
index faebe7e..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-2.0-cairo-reference.png
deleted file mode 100644
index faebe7e..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal2-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-1.0-agg-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-1.0-agg-reference.png
deleted file mode 100644
index b23e716..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-1.0-cairo-reference.png
deleted file mode 100644
index b23e716..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-2.0-agg-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-2.0-agg-reference.png
deleted file mode 100644
index b23e716..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-2.0-cairo-reference.png
deleted file mode 100644
index b23e716..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-gdal2-969-793-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-1.0-agg-reference.png b/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-1.0-agg-reference.png
deleted file mode 100644
index dafaec4..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-1.0-cairo-reference.png
deleted file mode 100644
index 081e14c..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-2.0-agg-reference.png b/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-2.0-agg-reference.png
deleted file mode 100644
index dafaec4..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 081e14c..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-raster2-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-1.0-agg-reference.png b/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-1.0-agg-reference.png
deleted file mode 100644
index b23e716..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-1.0-cairo-reference.png
deleted file mode 100644
index b23e716..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-2.0-agg-reference.png b/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-2.0-agg-reference.png
deleted file mode 100644
index b23e716..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-2.0-cairo-reference.png
deleted file mode 100644
index b23e716..0000000
Binary files a/tests/visual_tests/images/tiff-opaque-edge-raster2-969-793-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-reprojection-1-250-250-1.0-agg-reference.png b/tests/visual_tests/images/tiff-reprojection-1-250-250-1.0-agg-reference.png
deleted file mode 100644
index f0945b1..0000000
Binary files a/tests/visual_tests/images/tiff-reprojection-1-250-250-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-reprojection-1-250-250-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-reprojection-1-250-250-1.0-cairo-reference.png
deleted file mode 100644
index 71df304..0000000
Binary files a/tests/visual_tests/images/tiff-reprojection-1-250-250-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-reprojection-1-250-250-2.0-agg-reference.png b/tests/visual_tests/images/tiff-reprojection-1-250-250-2.0-agg-reference.png
deleted file mode 100644
index f0945b1..0000000
Binary files a/tests/visual_tests/images/tiff-reprojection-1-250-250-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-reprojection-1-250-250-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-reprojection-1-250-250-2.0-cairo-reference.png
deleted file mode 100644
index 71df304..0000000
Binary files a/tests/visual_tests/images/tiff-reprojection-1-250-250-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-reprojection-2-250-250-1.0-agg-reference.png b/tests/visual_tests/images/tiff-reprojection-2-250-250-1.0-agg-reference.png
deleted file mode 100644
index 26438dc..0000000
Binary files a/tests/visual_tests/images/tiff-reprojection-2-250-250-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-reprojection-2-250-250-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-reprojection-2-250-250-1.0-cairo-reference.png
deleted file mode 100644
index 26438dc..0000000
Binary files a/tests/visual_tests/images/tiff-reprojection-2-250-250-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-reprojection-2-250-250-2.0-agg-reference.png b/tests/visual_tests/images/tiff-reprojection-2-250-250-2.0-agg-reference.png
deleted file mode 100644
index 26438dc..0000000
Binary files a/tests/visual_tests/images/tiff-reprojection-2-250-250-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-reprojection-2-250-250-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-reprojection-2-250-250-2.0-cairo-reference.png
deleted file mode 100644
index 26438dc..0000000
Binary files a/tests/visual_tests/images/tiff-reprojection-2-250-250-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-resampling-600-400-1.0-agg-reference.png b/tests/visual_tests/images/tiff-resampling-600-400-1.0-agg-reference.png
deleted file mode 100644
index cb6a7b9..0000000
Binary files a/tests/visual_tests/images/tiff-resampling-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-resampling-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/tiff-resampling-600-400-1.0-cairo-reference.png
deleted file mode 100644
index 44906be..0000000
Binary files a/tests/visual_tests/images/tiff-resampling-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-resampling-600-400-2.0-agg-reference.png b/tests/visual_tests/images/tiff-resampling-600-400-2.0-agg-reference.png
deleted file mode 100644
index cb6a7b9..0000000
Binary files a/tests/visual_tests/images/tiff-resampling-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff-resampling-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/tiff-resampling-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 44906be..0000000
Binary files a/tests/visual_tests/images/tiff-resampling-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff_colortable-256-256-1.0-agg-reference.png b/tests/visual_tests/images/tiff_colortable-256-256-1.0-agg-reference.png
deleted file mode 100644
index b9ed340..0000000
Binary files a/tests/visual_tests/images/tiff_colortable-256-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff_colortable-256-256-1.0-cairo-reference.png b/tests/visual_tests/images/tiff_colortable-256-256-1.0-cairo-reference.png
deleted file mode 100644
index b9ed340..0000000
Binary files a/tests/visual_tests/images/tiff_colortable-256-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff_colortable-256-256-2.0-agg-reference.png b/tests/visual_tests/images/tiff_colortable-256-256-2.0-agg-reference.png
deleted file mode 100644
index b9ed340..0000000
Binary files a/tests/visual_tests/images/tiff_colortable-256-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff_colortable-256-256-2.0-cairo-reference.png b/tests/visual_tests/images/tiff_colortable-256-256-2.0-cairo-reference.png
deleted file mode 100644
index b9ed340..0000000
Binary files a/tests/visual_tests/images/tiff_colortable-256-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff_colortable_custom_nodata-256-256-1.0-agg-reference.png b/tests/visual_tests/images/tiff_colortable_custom_nodata-256-256-1.0-agg-reference.png
deleted file mode 100644
index 4d03701..0000000
Binary files a/tests/visual_tests/images/tiff_colortable_custom_nodata-256-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff_colortable_custom_nodata-256-256-1.0-cairo-reference.png b/tests/visual_tests/images/tiff_colortable_custom_nodata-256-256-1.0-cairo-reference.png
deleted file mode 100644
index 4d03701..0000000
Binary files a/tests/visual_tests/images/tiff_colortable_custom_nodata-256-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff_colortable_custom_nodata-256-256-2.0-agg-reference.png b/tests/visual_tests/images/tiff_colortable_custom_nodata-256-256-2.0-agg-reference.png
deleted file mode 100644
index 4d03701..0000000
Binary files a/tests/visual_tests/images/tiff_colortable_custom_nodata-256-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/tiff_colortable_custom_nodata-256-256-2.0-cairo-reference.png b/tests/visual_tests/images/tiff_colortable_custom_nodata-256-256-2.0-cairo-reference.png
deleted file mode 100644
index 4d03701..0000000
Binary files a/tests/visual_tests/images/tiff_colortable_custom_nodata-256-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/vrt_colortable-256-256-1.0-agg-reference.png b/tests/visual_tests/images/vrt_colortable-256-256-1.0-agg-reference.png
deleted file mode 100644
index 3fa463b..0000000
Binary files a/tests/visual_tests/images/vrt_colortable-256-256-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/vrt_colortable-256-256-1.0-cairo-reference.png b/tests/visual_tests/images/vrt_colortable-256-256-1.0-cairo-reference.png
deleted file mode 100644
index 3fa463b..0000000
Binary files a/tests/visual_tests/images/vrt_colortable-256-256-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/vrt_colortable-256-256-2.0-agg-reference.png b/tests/visual_tests/images/vrt_colortable-256-256-2.0-agg-reference.png
deleted file mode 100644
index 3fa463b..0000000
Binary files a/tests/visual_tests/images/vrt_colortable-256-256-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/vrt_colortable-256-256-2.0-cairo-reference.png b/tests/visual_tests/images/vrt_colortable-256-256-2.0-cairo-reference.png
deleted file mode 100644
index 3fa463b..0000000
Binary files a/tests/visual_tests/images/vrt_colortable-256-256-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/whole-centroid-600-400-1.0-agg-reference.png b/tests/visual_tests/images/whole-centroid-600-400-1.0-agg-reference.png
deleted file mode 100644
index b0745ca..0000000
Binary files a/tests/visual_tests/images/whole-centroid-600-400-1.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/whole-centroid-600-400-1.0-cairo-reference.png b/tests/visual_tests/images/whole-centroid-600-400-1.0-cairo-reference.png
deleted file mode 100644
index 0120f2e..0000000
Binary files a/tests/visual_tests/images/whole-centroid-600-400-1.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/whole-centroid-600-400-2.0-agg-reference.png b/tests/visual_tests/images/whole-centroid-600-400-2.0-agg-reference.png
deleted file mode 100644
index 31c36c4..0000000
Binary files a/tests/visual_tests/images/whole-centroid-600-400-2.0-agg-reference.png and /dev/null differ
diff --git a/tests/visual_tests/images/whole-centroid-600-400-2.0-cairo-reference.png b/tests/visual_tests/images/whole-centroid-600-400-2.0-cairo-reference.png
deleted file mode 100644
index 3d363a0..0000000
Binary files a/tests/visual_tests/images/whole-centroid-600-400-2.0-cairo-reference.png and /dev/null differ
diff --git a/tests/visual_tests/styles/building-symbolizer-opacity.xml b/tests/visual_tests/styles/building-symbolizer-opacity.xml
deleted file mode 100644
index b6db1c6..0000000
--- a/tests/visual_tests/styles/building-symbolizer-opacity.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
- background-color="green"
- background-image="../../data/images/checker.jpg"
- background-image-opacity=".5"
- background-image-comp-op="soft-light"
- >
- <Style name="ellipse">
- <Rule>
- <BuildingSymbolizer fill="white" fill-opacity=".5" />
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>ellipse</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/marker-multi-policy.csv</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/charspacing-lines.xml b/tests/visual_tests/styles/charspacing-lines.xml
deleted file mode 100644
index 36ffe73..0000000
--- a/tests/visual_tests/styles/charspacing-lines.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/lines.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[nr] = 2</Filter>
- <LineSymbolizer stroke-width="2" stroke="red"/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="-90" character-spacing="0.0">"Char spacing 0.0"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="-80" character-spacing="0.1">"Char spacing 0.1"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="-70" character-spacing="0.2">"Char spacing 0.2"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="-60" character-spacing="0.3">"Char spacing 0.3"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="-50" character-spacing="0.4">"Char spacing 0.4"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="-40" character-spacing="0.5">"Char spacing 0.5"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="-30" character-spacing="0.6">"Char spacing 0.6"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="-20" character-spacing="0.7">"Char spacing 0.7"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="-10" character-spacing="0.8">"Char spacing 0.8"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="0" character-spacing="0.9">"Char spacing 0.9"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="10" character-spacing="1.0">"Char spacing 1.0"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="20" character-spacing="1.5">"Char spacing 1.5"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="30" character-spacing="2">"Char spacing 2.0"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="40" character-spacing="2.5">"Char spacing 2.5"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="50" character-spacing="4">"Char spacing 4"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="60" character-spacing="6">"Char spacing 6"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" allow-overlap="true" placement="line" vertical-alignment="top" dy="70" character-spacing="8">"Char spacing 8"</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/charspacing.xml b/tests/visual_tests/styles/charspacing.xml
deleted file mode 100644
index 3afbdfd..0000000
--- a/tests/visual_tests/styles/charspacing.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
- <Style name="My Style">
- <Rule>
- <Filter>[nr] = 6</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="-90" character-spacing="0.0">"Char spacing 0.0"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="-80" character-spacing="0.1">"Char spacing 0.1"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="-70" character-spacing="0.2">"Char spacing 0.2"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="-60" character-spacing="0.3">"Char spacing 0.3"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="-50" character-spacing="0.4">"Char spacing 0.4"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="-40" character-spacing="0.5">"Char spacing 0.5"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="-30" character-spacing="0.6">"Char spacing 0.6"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="-20" character-spacing="0.7">"Char spacing 0.7"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="-10" character-spacing="0.8">"Char spacing 0.8"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="0" character-spacing="0.9">"Char spacing 0.9"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="10" character-spacing="1.0">"Char spacing 1.0"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="20" character-spacing="1.5">"Char spacing 1.5"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="30" character-spacing="2">"Char spacing 2.0"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="40" character-spacing="2.5">"Char spacing 2.5"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="50" character-spacing="4">"Char spacing 4"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="60" character-spacing="6">"Char spacing 6"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" vertical-alignment="top" dy="70" character-spacing="8">"Char spacing 8"</TextSymbolizer>
- </Rule>
- </Style>
-</Map>
diff --git a/tests/visual_tests/styles/collision.xml b/tests/visual_tests/styles/collision.xml
deleted file mode 100644
index 7b717fc..0000000
--- a/tests/visual_tests/styles/collision.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<Map>
-
- <Style name="line">
- <Rule>
- <LineSymbolizer stroke="#000000" />
- </Rule>
- </Style>
-
- <Style name="text">
- <Rule>
- <TextSymbolizer spacing="10" size="14" halo-radius="2" face-name="DejaVu Sans Oblique" placement="line">'text'</TextSymbolizer>
- <DebugSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="one">
- <StyleName>line</StyleName>
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-i|wkt
-1|LINESTRING(-98.465624973178 64.664065539837, -84.403124973178 49.195315539837, -72.449999973178 40.757815539837, -61.199999973178 29.507815539837, -60.496874973178 22.476565539837, -58.387499973178 4.1953155398369, -52.059374973178 -7.7578094601631, -41.512499973178 -34.476559460163, -27.449999973178 -45.023434460163, -14.090624973178 -52.054684460163, 7.0031250268221 -61.195309460163)
- </Parameter>
- <Parameter name="separator">|</Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="two">
- <StyleName>line</StyleName>
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-i|wkt
-1|LINESTRING(-55.574999973178 68.882815539837, -51.356249973178 42.164065539837, -57.684374973178 33.023440539837, -64.012499973178 21.773440539837, -63.309374973178 3.4921905398369, -45.731249973178 -46.429684460163, -16.903124973178 -50.648434460163, -2.8406249731779 -50.648434460163, 14.737500026822 -50.648434460163, 46.378125026822 -41.507809460163, 78.721875026822 -17.601559460163)
-2|LINESTRING(-21.824999973178 69.585940539837, -108.30937497318 41.460940539837, -13.387499973178 24.585940539837, -108.30937497318 6.3046905398369, -19.012499973178 -2.1328094601631, -83.699999973178 -26.039059460163, 5.5968750268221 -26.039059460163, -30.262499973178 -63.304684460163, 40.050000026822 -19.710934460163, 62.550000026822 -61.195309460163)
-3|LINESTRING(-73.856249973178 77.320315539837, -11.278124973178 -61.898434460163, -112.52812497318 61.148440539837, 31.612500026822 -61.898434460163, 56.925000026822 -13.382809460163)
- </Parameter>
- <Parameter name="separator">|</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/colorize-alpha1.xml b/tests/visual_tests/styles/colorize-alpha1.xml
deleted file mode 100644
index e4f7007..0000000
--- a/tests/visual_tests/styles/colorize-alpha1.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map>
-
- <Style name="countries">
- <Rule>
- <PolygonSymbolizer fill-opacity=".9" gamma=".65"/>
- </Rule>
- </Style>
-
- <Style name="style" image-filters="colorize-alpha(blue,purple,red,orange,yellow,green)">
- <Rule>
- <PointSymbolizer file="../../data/images/marker.png" allow-overlap="true" />
- </Rule>
- </Style>
-
- <Layer name="world">
- <StyleName>countries</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/ne_110m_admin_0_countries.shp</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="style">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="inline">
- x,y
- -170,20
- -122,48
- -122.2,48.2
- -122.2,48.2
- -122.3,48.3
- -122.1,48.4
- -122.1,48.2
- -115,36
- 90,30
- 0,0
- 1,1
- 10,10
- -10,-10
- -20,-20
- </Parameter>
- <Parameter name="type">csv</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/colorize-alpha2.xml b/tests/visual_tests/styles/colorize-alpha2.xml
deleted file mode 100644
index 852825c..0000000
--- a/tests/visual_tests/styles/colorize-alpha2.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map>
-
- <Style name="countries">
- <Rule>
- <PolygonSymbolizer fill-opacity=".9" gamma=".65"/>
- </Rule>
- </Style>
-
- <Style name="style" image-filters="colorize-alpha(blue 100%, cyan, yellow 0.7, rgb(0%,80%,0%) 90%)">
- <Rule>
- <PointSymbolizer file="../../data/images/marker.png" allow-overlap="true" />
- </Rule>
- </Style>
-
- <Layer name="world">
- <StyleName>countries</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/ne_110m_admin_0_countries.shp</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="style">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="inline">
- x,y
- -170,20
- -122,48
- -122.2,48.2
- -122.2,48.2
- -122.3,48.3
- -122.1,48.4
- -122.1,48.2
- -115,36
- 90,30
- 0,0
- 1,1
- 10,10
- -10,-10
- -20,-20
- </Parameter>
- <Parameter name="type">csv</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/colorize-alpha3.xml b/tests/visual_tests/styles/colorize-alpha3.xml
deleted file mode 100644
index ac4a41f..0000000
--- a/tests/visual_tests/styles/colorize-alpha3.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map>
-
- <Style name="countries">
- <Rule>
- <PolygonSymbolizer fill-opacity=".9" gamma=".65"/>
- </Rule>
- </Style>
-
- <Style name="style" image-filters="colorize-alpha(blue 100%,blue)">
- <Rule>
- <PointSymbolizer file="../../data/images/marker.png" allow-overlap="true" />
- </Rule>
- </Style>
-
- <Layer name="world">
- <StyleName>countries</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/ne_110m_admin_0_countries.shp</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="style">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="inline">
- x,y
- -170,20
- -122,48
- -122.2,48.2
- -122.2,48.2
- -122.3,48.3
- -122.1,48.4
- -122.1,48.2
- -115,36
- 90,30
- 0,0
- 1,1
- 10,10
- -10,-10
- -20,-20
- </Parameter>
- <Parameter name="type">csv</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/colorize-alpha4.xml b/tests/visual_tests/styles/colorize-alpha4.xml
deleted file mode 100644
index 8ae5750..0000000
--- a/tests/visual_tests/styles/colorize-alpha4.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map>
-
- <Style name="countries">
- <Rule>
- <PolygonSymbolizer fill-opacity=".9" gamma=".65"/>
- </Rule>
- </Style>
-
- <Style name="style" image-filters="colorize-alpha(blue)">
- <Rule>
- <PointSymbolizer file="../../data/images/marker.png" allow-overlap="true" />
- </Rule>
- </Style>
-
- <Layer name="world">
- <StyleName>countries</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/ne_110m_admin_0_countries.shp</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="style">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="inline">
- x,y
- -170,20
- -122,48
- -122.2,48.2
- -122.2,48.2
- -122.3,48.3
- -122.1,48.4
- -122.1,48.2
- -115,36
- 90,30
- 0,0
- 1,1
- 10,10
- -10,-10
- -20,-20
- </Parameter>
- <Parameter name="type">csv</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/dst-over-compositing.xml b/tests/visual_tests/styles/dst-over-compositing.xml
deleted file mode 100644
index c8623fe..0000000
--- a/tests/visual_tests/styles/dst-over-compositing.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<Map
- background-color="#808080"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="My Style" comp-op="src-over">
- <Rule>
- <LineSymbolizer stroke-width="30" stroke="rgba(255,255,255,1)" stroke-linecap="round" stroke-linejoin="round" comp-op="dst-over" />
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/crossing-lines.csv</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/expressionformat.xml b/tests/visual_tests/styles/expressionformat.xml
deleted file mode 100644
index 4a6315b..0000000
--- a/tests/visual_tests/styles/expressionformat.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer/>
- <TextSymbolizer face-name="DejaVu Sans Book" placement="point" dx="0" dy="5">
- <Format size="[nr]" opacity="1">[name]</Format>
- </TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/formatting-1.xml b/tests/visual_tests/styles/formatting-1.xml
deleted file mode 100644
index ee3f40d..0000000
--- a/tests/visual_tests/styles/formatting-1.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer/>
- <!-- Basic test -->
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="0" dy="5">
- [name]+'
'<Format face-name="DejaVu Sans Oblique" size="9">'('+[name]+')'</Format></TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/formatting-2.xml b/tests/visual_tests/styles/formatting-2.xml
deleted file mode 100644
index ca7646a..0000000
--- a/tests/visual_tests/styles/formatting-2.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer/>
- <!-- Nested formats -->
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="0" dy="5">
- [name]+'
'<Format face-name="DejaVu Sans Oblique"><Format size="9">'('+[name]+')'</Format></Format></TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/formatting-3.xml b/tests/visual_tests/styles/formatting-3.xml
deleted file mode 100644
index eb9e449..0000000
--- a/tests/visual_tests/styles/formatting-3.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer/>
- <!-- Empty formats-->
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="0" dy="5">
- [name]+'
'<Format face-name="DejaVu Sans Oblique" size="9"></Format></TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/formatting-4.xml b/tests/visual_tests/styles/formatting-4.xml
deleted file mode 100644
index 984a654..0000000
--- a/tests/visual_tests/styles/formatting-4.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer/>
- <!-- Empty text -->
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="0" dy="5" />
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/formatting-5.xml b/tests/visual_tests/styles/formatting-5.xml
deleted file mode 100644
index 5e3d8bd..0000000
--- a/tests/visual_tests/styles/formatting-5.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <FontSet name="book">
- <Font face-name="DejaVu Sans Book"/>
- </FontSet>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer/>
- <!-- Basic test -->
- <TextSymbolizer fontset-name="book" size="16" placement="point" dx="0" dy="5">
- [name]+'
'<Format face-name="DejaVu Sans Oblique" size="9" opacity="1">'('+[name]+')'</Format></TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/formatting-6.xml b/tests/visual_tests/styles/formatting-6.xml
deleted file mode 100644
index 8432fdd..0000000
--- a/tests/visual_tests/styles/formatting-6.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <FontSet name="book">
- <Font face-name="DejaVu Sans Book"/>
- </FontSet>
- <FontSet name="oblique">
- <Font face-name="DejaVu Sans Oblique"/>
- </FontSet>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer/>
- <!-- Basic test -->
- <TextSymbolizer fontset-name="book" size="16" placement="point" dx="0" dy="5">
- [name]+'
'<Format fontset-name="oblique" size="9" opacity="1">'('+[name]+')'</Format></TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/formatting-7.xml b/tests/visual_tests/styles/formatting-7.xml
deleted file mode 100644
index 815d44f..0000000
--- a/tests/visual_tests/styles/formatting-7.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <FontSet name="oblique">
- <Font face-name="DejaVu Sans Oblique"/>
- </FontSet>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer/>
- <!-- Basic test -->
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="0" dy="5">
- [name]+'
'<Format fontset-name="oblique" size="9" opacity="1">'('+[name]+')'</Format></TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/formatting-8.xml b/tests/visual_tests/styles/formatting-8.xml
deleted file mode 100644
index ae3ee7b..0000000
--- a/tests/visual_tests/styles/formatting-8.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <FontSet name="oblique">
- <Font face-name="DejaVu Sans Oblique"/>
- </FontSet>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer/>
- <!-- Basic test -->
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="0" dy="5">
- [name]+'
'<Format face-name="DejaVu Sans Oblique" size="9" opacity="1">'('+[name]+')'</Format></TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/formatting-expr-alignment.xml b/tests/visual_tests/styles/formatting-expr-alignment.xml
deleted file mode 100644
index 46ec4bf..0000000
--- a/tests/visual_tests/styles/formatting-expr-alignment.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <FontSet name="book">
- <Font face-name="DejaVu Sans Book"/>
- </FontSet>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
-<Parameter name="inline">
-lat,long,horizontal_alignment,vertical_alignment,dy,text
- 0.25,-0.35,left,top,0
- 0.25,-0.12,middle,top,0
- 0.25, 0.11,right,top,0
- 0 ,-0.35,left,middle,0
- 0 ,-0.12,middle,middle,0
- 0 , 0.11,right,middle,0
--0.25,-0.35,left,bottom,0
--0.25,-0.12,middle,bottom,0
--0.25, 0.11,right,bottom,0
- 0.25, 0.35,right,auto,-0.0001
- 0 , 0.35,middle,auto,0
--0.25, 0.35,left,auto,0.0001
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer ignore-placement="true"/>
- <TextSymbolizer fontset-name="book" size="16" placement="point" dx="0" dy="[dy]" vertical-alignment="[vertical_alignment]" horizontal-alignment="[horizontal_alignment]">XX</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/formatting.xml b/tests/visual_tests/styles/formatting.xml
deleted file mode 100644
index 541d7c1..0000000
--- a/tests/visual_tests/styles/formatting.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer/>
- <TextSymbolizer placement-type="simple" placements="N,S" face-name="DejaVu Sans Book" size="16" placement="point" dx="0" dy="5">
- [name]+'
'<Format face-name="DejaVu Sans Oblique" size="9">'('+[name]+')'</Format></TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/functional-expressions-length.xml b/tests/visual_tests/styles/functional-expressions-length.xml
deleted file mode 100644
index f2243c4..0000000
--- a/tests/visual_tests/styles/functional-expressions-length.xml
+++ /dev/null
@@ -1,116 +0,0 @@
-<Map background-color="#eee" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <FontSet name="book-fonts">
- <Font face-name="DejaVu Sans Book"/>
- </FontSet>
- <Style name="frame" filter-mode="first">
- <Rule>
- <Filter>[mapnik::geometry_type]=linestring</Filter>
- <LineSymbolizer
- stroke="[color]"
- stroke-width="[width]"
- offset="abs([offset]*2.0)"/>
- </Rule>
- <Rule>
- <Filter>[mapnik::geometry_type]=point</Filter>
- <MarkersSymbolizer
- file="../../../[base-path]/[filetype]/[filename].[filetype]"
- width="exp(0.4*length([name]))"
- />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">ogr</Parameter>
- <Parameter name="layer_by_index">0</Parameter>
- <Parameter name="inline"><![CDATA[
- {
- "type" : "FeatureCollection",
- "features" : [
- {
- "properties" : {
- "width":"5",
- "color" : "red",
- "offset": 10
- },
- "geometry" : {
- "coordinates" : [[-15,-15],[15,15]],
- "type" : "LineString"
- },
- "type" : "Feature",
- },
- {
- "geometry" : {
- "coordinates" : [ 0,0 ],
- "type" : "Point"
- },
- "properties" : {
- "base-path":"./tests/data",
- "filetype":"svg",
- "filename":"octocat",
- "width":"5",
- "name": "Large octocat",
- "color" : "#ace"
- },
- "type" : "Feature",
- },
- {
- "geometry" : {
- "coordinates" : [ -10,-10 ],
- "type" : "Point"
- },
- "properties" : {
- "base-path":"./tests/data",
- "filetype":"svg",
- "filename":"octocat",
- "width":"5",
- "name": "tiny cat",
- "color" : "#ace"
- },
- "type" : "Feature",
- },
- {
- "geometry" : {
- "coordinates" : [ 10,10 ],
- "type" : "Point"
- },
- "properties" : {
- "base-path":"./tests/data",
- "filetype":"svg",
- "filename":"octocat",
- "name": "tiny cat"
- },
- "type" : "Feature",
- },
- {
- "geometry" : {
- "coordinates" : [ -10,10 ],
- "type" : "Point"
- },
- "properties" : {
- "base-path":"./tests/data",
- "filetype":"svg",
- "filename":"octocat",
- "name": "small cat"
- },
- "type" : "Feature",
- },
- {
- "geometry" : {
- "coordinates" : [ 10,-10 ],
- "type" : "Point"
- },
- "properties" : {
- "base-path":"./tests/data",
- "filetype":"svg",
- "filename":"octocat",
- "name": "small cat"
- },
- "type" : "Feature",
- }
- ]
- }]]></Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/styles/functional-expressions.xml b/tests/visual_tests/styles/functional-expressions.xml
deleted file mode 100644
index dd45a00..0000000
--- a/tests/visual_tests/styles/functional-expressions.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<Map background-color="#eee" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="frame" filter-mode="first">
- <Rule>
- <Filter>[mapnik::geometry_type]=linestring</Filter>
- <LineSymbolizer
- stroke="[color]"
- stroke-width="[width]"
- offset="abs([offset]*2.0)"/>
- <LineSymbolizer
- stroke="[color]"
- stroke-width="[width]"
- offset="-[offset]*2.0"
- geometry-transform="rotate(360-(tan(-180)*10))"/>
- </Rule>
- <Rule>
- <Filter>[mapnik::geometry_type]=point</Filter>
- <MarkersSymbolizer
- file="../../../[base-path]/[filetype]/[filename].[filetype]"
- width="exp([width])"
- />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">ogr</Parameter>
- <Parameter name="layer_by_index">0</Parameter>
- <Parameter name="inline"><![CDATA[
- {
- "type" : "FeatureCollection",
- "features" : [
- {
- "properties" : {
- "width":"5",
- "color" : "red",
- "offset": 10
- },
- "geometry" : {
- "coordinates" : [[-10,-10],[10,10]],
- "type" : "LineString"
- },
- "type" : "Feature",
- },
- {
- "geometry" : {
- "coordinates" : [ 0,0 ],
- "type" : "Point"
- },
- "properties" : {
- "base-path":"./tests/data",
- "filetype":"svg",
- "filename":"octocat",
- "width":"5",
- "color" : "#ace"
- },
- "type" : "Feature",
- }
- ]
- }]]></Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/gdal-filter-factor.xml b/tests/visual_tests/styles/gdal-filter-factor.xml
deleted file mode 100644
index 22554e3..0000000
--- a/tests/visual_tests/styles/gdal-filter-factor.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="white">
-
-<Style name="test">
- <Rule>
- <RasterSymbolizer filter-factor="1"/>
- </Rule>
-</Style>
-
-<Layer name="test" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>test</StyleName>
- <Datasource>
- <Parameter name="file">../data/Yosemite_L9.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
-</Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/geometry-transform-scale-patterns.xml b/tests/visual_tests/styles/geometry-transform-scale-patterns.xml
deleted file mode 100644
index 563913b..0000000
--- a/tests/visual_tests/styles/geometry-transform-scale-patterns.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>polygon</StyleName>
- <StyleName>polygon-svg</StyleName>
- <StyleName>line</StyleName>
- <StyleName>line-svg</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="extent">-1,-1,1,1</Parameter>
- <Parameter name="inline">
- wkt
- "LINESTRING (-1 0, 0 1, 1 0, 0 -1, -1 0)"
- </Parameter>
- </Datasource>
- </Layer>
- <Style name="polygon">
- <Rule>
- <PolygonPatternSymbolizer
- file="../../data/images/stripes_pattern.png"
- />
- <PolygonPatternSymbolizer
- file="../../data/images/stripes_pattern.png"
- geometry-transform="scale(0.5)"
- />
- </Rule>
- </Style>
- <Style name="line">
- <Rule>
- <LinePatternSymbolizer
- file="../../data/images/stripes_pattern.png"
- />
- <LinePatternSymbolizer
- file="../../data/images/stripes_pattern.png"
- geometry-transform="scale(0.5)"
- />
- </Rule>
- </Style>
- <Style name="polygon-svg">
- <Rule>
- <PolygonPatternSymbolizer
- file="../../data/svg/octocat.svg"
- transform="scale(.05)"
- />
- <PolygonPatternSymbolizer
- file="../../data/svg/octocat.svg"
- transform="scale(.05)"
- geometry-transform="scale(0.5)"
- />
- </Rule>
- </Style>
- <Style name="line-svg">
- <Rule>
- <LinePatternSymbolizer
- file="../../data/svg/octocat.svg"
- transform="scale(.1)"
- />
- <LinePatternSymbolizer
- file="../../data/svg/octocat.svg"
- transform="scale(.1)"
- geometry-transform="scale(0.5)"
- />
- </Rule>
- </Style>
-</Map>
diff --git a/tests/visual_tests/styles/geometry-transform-scale.xml b/tests/visual_tests/styles/geometry-transform-scale.xml
deleted file mode 100644
index 628720b..0000000
--- a/tests/visual_tests/styles/geometry-transform-scale.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>polygon</StyleName>
- <StyleName>line</StyleName>
- <StyleName>marker</StyleName>
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="extent">-1,-1,1,1</Parameter>
- <Parameter name="inline">
- wkt
- "LINESTRING (-1 0, 0 1, 1 0, 0 -1, -1 0)"
- </Parameter>
- </Datasource>
- </Layer>
- <Style name="polygon">
- <Rule>
- <PolygonSymbolizer fill="#ec3" />
- <PolygonSymbolizer fill="#ec3" geometry-transform="scale(0.5)" />
- </Rule>
- </Style>
- <Style name="line">
- <Rule>
- <LineSymbolizer />
- <LineSymbolizer geometry-transform="scale(0.5)" />
- </Rule>
- </Style>
- <Style name="marker">
- <Rule>
- <MarkersSymbolizer placement="line" />
- <MarkersSymbolizer placement="line" geometry-transform="scale(0.5)" />
- </Rule>
- </Style>
- <Style name="text">
- <Rule>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="12"
- placement="line"
- allow-overlap="true"
- spacing="50"
- >
- "text"
- </TextSymbolizer>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="12"
- placement="line"
- allow-overlap="true"
- spacing="50"
- geometry-transform="scale(0.5)"
- >
- "text"
- </TextSymbolizer>
- </Rule>
- </Style>
-</Map>
diff --git a/tests/visual_tests/styles/geometry-transform-translate-patterns-svg.xml b/tests/visual_tests/styles/geometry-transform-translate-patterns-svg.xml
deleted file mode 100644
index 633eb08..0000000
--- a/tests/visual_tests/styles/geometry-transform-translate-patterns-svg.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-<Map background-color="#eee" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="polygon">
- <Rule>
- <PolygonPatternSymbolizer
- file="../../data/svg/octocat.svg"
- geometry-transform="translate(10,10)"
- transform="scale(.01)"
- />
- <PolygonPatternSymbolizer
- file="../../data/svg/octocat.svg"
- transform="scale(.02) rotate(45)"
- opacity=".2"
- />
- </Rule>
- </Style>
- <Style name="line">
- <Rule>
- <LinePatternSymbolizer
- file="../../data/svg/octocat.svg"
- geometry-transform="translate(-3,-3)"
- transform="scale(.05)"
- offset="10"
- />
- <LinePatternSymbolizer
- file="../../data/svg/octocat.svg"
- geometry-transform="translate(3,3)"
- transform="scale(.05) rotate(180)"
- offset="-10"
- />
- </Rule>
- </Style>
- <Style name="point">
- <Rule>
- <MarkersSymbolizer
- fill="#437"
- width="10"
- stroke-width="0"
- transform="translate(2,2)"
- allow-overlap="true"
- />
- <MarkersSymbolizer
- fill="#ec3"
- width="10"
- stroke-width="0"
- allow-overlap="true"
- />
- </Rule>
- </Style>
-
- <Layer name="polygon" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>polygon</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt
-"POLYGON ((1 1, 4 1, 4 4, 1 4, 1 1), (2 2, 2 3, 3 3, 3 2, 2 2))"
- </Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="line" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>line</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt
-"LINESTRING (0.5 0.5, 4.5 4.5)"
- </Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>point</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt
-"POINT (1 4)"
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/geometry-transform-translate-patterns.xml b/tests/visual_tests/styles/geometry-transform-translate-patterns.xml
deleted file mode 100644
index 16702b9..0000000
--- a/tests/visual_tests/styles/geometry-transform-translate-patterns.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<Map background-color="#eee" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="polygon">
- <Rule>
- <PolygonPatternSymbolizer
- file="../../data/images/stripes_pattern.png"
- geometry-transform="translate(2,2)"
- />
- <PolygonPatternSymbolizer
- file="../data/pattern.png"
- />
- </Rule>
- </Style>
- <Style name="line">
- <Rule>
- <LinePatternSymbolizer
- file="../../data/images/stripes_pattern.png"
- geometry-transform="translate(-3,-3)"
- />
- <LinePatternSymbolizer
- file="../../data/images/stripes_pattern.png"
- geometry-transform="translate(3,3)"
- />
- </Rule>
- </Style>
- <Style name="point">
- <Rule>
- <MarkersSymbolizer
- fill="#437"
- width="10"
- stroke-width="0"
- transform="translate(2,2)"
- allow-overlap="true"
- />
- <MarkersSymbolizer
- fill="#ec3"
- width="10"
- stroke-width="0"
- allow-overlap="true"
- />
- </Rule>
- </Style>
-
- <Layer name="polygon" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>polygon</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt
-"POLYGON ((1 1, 4 1, 4 4, 1 4, 1 1), (2 2, 2 3, 3 3, 3 2, 2 2))"
- </Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="line" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>line</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt
-"LINESTRING (0.5 0.5, 4.5 4.5)"
- </Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>point</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt
-"POINT (1 4)"
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/geometry-transform-translate.xml b/tests/visual_tests/styles/geometry-transform-translate.xml
deleted file mode 100644
index e61bf5a..0000000
--- a/tests/visual_tests/styles/geometry-transform-translate.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<Map background-color="#eee" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="polygon">
- <Rule>
- <PolygonSymbolizer
- fill="#437"
- geometry-transform="translate(2,2)"
- />
- <PolygonSymbolizer
- fill="#ec3"
- />
- </Rule>
- </Style>
- <Style name="line">
- <Rule>
- <LineSymbolizer
- stroke="#437"
- stroke-width="3"
- geometry-transform="translate(2,2)"
- />
- <LineSymbolizer
- stroke="#ec3"
- stroke-width="3"
- />
- </Rule>
- </Style>
- <Style name="point">
- <Rule>
- <MarkersSymbolizer
- fill="#437"
- width="10"
- stroke-width="0"
- transform="translate(2,2)"
- allow-overlap="true"
- />
- <MarkersSymbolizer
- fill="#ec3"
- width="10"
- stroke-width="0"
- allow-overlap="true"
- />
- </Rule>
- </Style>
-
- <Layer name="polygon" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>polygon</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt
-"POLYGON ((1 1, 1 4, 4 4, 4 1, 1 1), (2 2, 3 2, 3 3, 2 3, 2 2))"
- </Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="line" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>line</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt
-"LINESTRING (0.5 0.5, 4.5 4.5)"
- </Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>point</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt
-"POINT (1 4)"
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/group-symbolizer-1.xml b/tests/visual_tests/styles/group-symbolizer-1.xml
deleted file mode 100644
index 5245dbd..0000000
--- a/tests/visual_tests/styles/group-symbolizer-1.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Without unlock-image -->
-<!DOCTYPE Map>
-<Map background-color="green" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="2.0.0">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>points</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long,name1,ref1,name2,ref2
-0,0,One,1,Two,2
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="points">
- <Rule>
- <GroupSymbolizer start-column="1" num-columns="2" placement="point" avoid-edges="false" minimum-distance="10" spacing="20" repeat-key="[name%]+'-'+[ref%]">
- <PairLayout item-margin="1"/>
- <GroupRule>
- <PointSymbolizer file="../../data/svg/rect.svg"/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="10">[name%]</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="-10">[ref%]</TextSymbolizer>
- </GroupRule>
- </GroupSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="layer2" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long,nr
--1,-1,0
--1,1,1
-1,-1,2
-1,1,3
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer/>
- </Rule>
- </Style>
-
- <Layer name="layer3" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>center</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long,nr
-0,0,0
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="center">
- <Rule>
- <PointSymbolizer allow-overlap="true" ignore-placement="true" file="../../data/raster/white-alpha.png"/>
- <DebugSymbolizer/>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/group-symbolizer-2.xml b/tests/visual_tests/styles/group-symbolizer-2.xml
deleted file mode 100644
index 45a3336..0000000
--- a/tests/visual_tests/styles/group-symbolizer-2.xml
+++ /dev/null
@@ -1,114 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Without unlock-image -->
-<!DOCTYPE Map>
-<Map background-color="green" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="2.0.0">
-
- <Layer name="obstacle" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>obstacle</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long,nr
-0.33,0.4,0
--0.33,0.4,1
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="obstacle">
- <Rule>
- <PointSymbolizer/>
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>grouped</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long,name1,ref1,name2,ref2
--0.33,-0.33,One,1,Two,2
--0.33,0.33,One,1,Two,2
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="grouped">
- <Rule>
- <GroupSymbolizer start-column="1" num-columns="2" placement="point" avoid-edges="false">
- <PairLayout item-margin="1"/>
- <GroupRule>
- <PointSymbolizer file="../../data/svg/rect.svg"/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="10">[name%]</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="-10">[ref%]</TextSymbolizer>
- </GroupRule>
- </GroupSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>non-grouped</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long,name1,ref1,name2,ref2
-0.33,-0.33,One,1,Two,2
-0.33,0.33,One,1,Two,2
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="non-grouped">
- <Rule>
- <ShieldSymbolizer face-name="DejaVu Sans Book" dx="-16.25" file="../../data/svg/rect.svg"/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="-0.25" dy="10">[name1]</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="-11.25" dy="-10">[ref1]</TextSymbolizer>
-
- <ShieldSymbolizer face-name="DejaVu Sans Book" dx="15" file="../../data/svg/rect.svg"/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="0.25" dy="10">[name2]</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="10" dy="-10">[ref2]</TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="layer2" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long,nr
--1,-1,0
--1,1,1
-1,-1,2
-1,1,3
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer/>
- </Rule>
- </Style>
-
- <Layer name="layer3" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>center</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long,nr
--0.33,-0.33,0
-0.33,-0.33,1
--0.33,0.33,2
-0.33,0.33,3
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="center">
- <Rule>
- <PointSymbolizer allow-overlap="true" ignore-placement="true" file="../../data/raster/white-alpha.png"/>
- <DebugSymbolizer />
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/group-symbolizer-3.xml b/tests/visual_tests/styles/group-symbolizer-3.xml
deleted file mode 100644
index b6d38e9..0000000
--- a/tests/visual_tests/styles/group-symbolizer-3.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Without unlock-image -->
-<!DOCTYPE Map>
-<Map background-color="green" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="2.0.0">
-
- <Layer name="obstacle" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>obstacle</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long
-0.2,-0.35
-0.2,0.35
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="obstacle">
- <Rule>
- <PointSymbolizer/>
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>grouped</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long,name1,ref1,name2,ref2,margin
-0,-0.35,One,1,Two,2,0
-0,0.35,One,1,Two,2,30
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="grouped">
- <Rule>
- <GroupSymbolizer start-column="1" num-columns="2" placement="point" avoid-edges="false" margin="[margin]">
- <PairLayout item-margin="1"/>
- <GroupRule>
- <PointSymbolizer file="../../data/svg/rect.svg"/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="10">[name%]</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="-10">[ref%]</TextSymbolizer>
- </GroupRule>
- </GroupSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long,nr
--0.5,-1,0
--0.5,1,1
-0.5,-1,2
-0.5,1,3
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer/>
- </Rule>
- </Style>
- <Layer name="layer3" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>center</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long
-0,-0.35
-0,0.35
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="center">
- <Rule>
- <PointSymbolizer allow-overlap="true" ignore-placement="true" file="../../data/raster/white-alpha.png"/>
- <DebugSymbolizer />
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/group-symbolizer-line-1.xml b/tests/visual_tests/styles/group-symbolizer-line-1.xml
deleted file mode 100644
index 4025c75..0000000
--- a/tests/visual_tests/styles/group-symbolizer-line-1.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Without unlock-image -->
-<!DOCTYPE Map>
-<Map background-color="green" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="2.0.0">
-
- <Layer name="alpha" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>alpha</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt,name1,ref1,name2,ref2
-"LINESTRING(0 0, 10 2)",One,1,Two,2
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="alpha">
- <Rule>
- <LineSymbolizer stroke-width="0.2" stroke="#ff0000"/>
- <GroupSymbolizer start-column="1" num-columns="2" placement="line" avoid-edges="false" repeat-distance="50" spacing="100" repeat-key="[name%]+'-'+[ref%]">
- <PairLayout item-margin="1"/>
- <GroupRule>
- <ShieldSymbolizer file="../../data/svg/rect.svg" face-name="DejaVu Sans Book" size="16" placement="point">
- <Format fill="#ffffff">[ref%]</Format>
- <Layout dy="10">[name%]</Layout>
- </ShieldSymbolizer>
- </GroupRule>
- </GroupSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="beta" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>beta</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt,name1,ref1,name2,ref2
-"LINESTRING(0 3, 10 5)",One,1,Two,2
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="beta">
- <Rule>
- <LineSymbolizer stroke-width="0.2" stroke="#ff0000"/>
- <GroupSymbolizer start-column="1" num-columns="2" placement="line" avoid-edges="false" repeat-distance="40" spacing="80" repeat-key="[name%]+'-'+[ref%]">
- <PairLayout item-margin="1"/>
- <GroupRule>
- <ShieldSymbolizer file="../../data/svg/rect.svg" face-name="DejaVu Sans Book" size="16" placement="point">
- <Format fill="#ffffff">[ref%]</Format>
- <Layout dy="10">[name%]</Layout>
- </ShieldSymbolizer>
- </GroupRule>
- </GroupSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="gamma" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>gamma</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt,name1,ref1,name2,ref2
-"LINESTRING(0 6, 10 8)",One,1,Two,2
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="gamma">
- <Rule>
- <LineSymbolizer stroke-width="0.2" stroke="#ff0000"/>
- <GroupSymbolizer start-column="1" num-columns="2" placement="line" avoid-edges="false" repeat-distance="30" spacing="60" repeat-key="[name%]+'-'+[ref%]">
- <PairLayout item-margin="1"/>
- <GroupRule>
- <ShieldSymbolizer file="../../data/svg/rect.svg" face-name="DejaVu Sans Book" size="16" placement="point">
- <Format fill="#ffffff">[ref%]</Format>
- <Layout dy="10">[name%]</Layout>
- </ShieldSymbolizer>
- </GroupRule>
- </GroupSymbolizer>
- <DebugSymbolizer/>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/group-symbolizer-line-2.xml b/tests/visual_tests/styles/group-symbolizer-line-2.xml
deleted file mode 100644
index d5de91a..0000000
--- a/tests/visual_tests/styles/group-symbolizer-line-2.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Without unlock-image -->
-<!DOCTYPE Map>
-<Map background-color="green" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="2.0.0">
-
-<!-- the aim here is to test the "repeat-key" parameter. it is
- supposed to stop collidable / placeable items from being
- too close, even if they're on different features. -->
-
- <Layer name="alpha" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>alpha</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt,key1,key2
-"POINT(3.3 0)",foo,1
-"POINT(6.7 0)",bar,2
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="alpha">
- <Rule>
- <PointSymbolizer ignore-placement="true"/>
- <GroupSymbolizer start-column="1" num-columns="1" placement="point" avoid-edges="false" repeat-key="[key%]">
- <PairLayout item-margin="1"/>
- <GroupRule>
- <ShieldSymbolizer file="../../data/svg/rect.svg" face-name="DejaVu Sans Book" size="10" minimum-distance="1" placement="point" dy="0" fill="#ff0000">[key%]</ShieldSymbolizer>
- </GroupRule>
- </GroupSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="beta" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>beta</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt,name1,ref1,name2,ref2
-"LINESTRING(0 -0.6, 10 -0.6)",One,1,Two,2
-"LINESTRING(0 -1.2, 10 -1.2)",One,1,Two,2
-"LINESTRING(0 -1.8, 10 -1.8)",One,1,Two,2
-"LINESTRING(0 -2.4, 10 -2.4)",One,1,Two,2
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="beta">
- <Rule>
- <GroupSymbolizer start-column="1" num-columns="1" placement="line" avoid-edges="false" repeat-distance="20" spacing="1" repeat-key="bar">
- <PairLayout item-margin="1"/>
- <GroupRule>
- <ShieldSymbolizer file="../../data/svg/rect.svg" face-name="DejaVu Sans Book" size="10" placement="point" dy="0" fill="#ffffff">bar</ShieldSymbolizer>
- </GroupRule>
- </GroupSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="gamma" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>gamma</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt,name1,ref1,name2,ref2
-"LINESTRING(0 0.6, 10 0.6)",One,1,Two,2
-"LINESTRING(0 1.2, 10 1.2)",One,1,Two,2
-"LINESTRING(0 1.8, 10 1.8)",One,1,Two,2
-"LINESTRING(0 2.4, 10 2.4)",One,1,Two,2
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="gamma">
- <Rule>
- <GroupSymbolizer start-column="1" num-columns="1" placement="line" avoid-edges="false" repeat-distance="20" spacing="1" repeat-key="foo">
- <PairLayout item-margin="1"/>
- <GroupRule>
- <ShieldSymbolizer file="../../data/svg/rect.svg" face-name="DejaVu Sans Book" size="10" placement="point" dy="0" fill="#000000">foo</ShieldSymbolizer>
- </GroupRule>
- </GroupSymbolizer>
- </Rule>
- </Style>
-
-<!-- for framing -->
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt,nr
-"POINT(0 5)",1
-"POINT(0 -5)",2
-"POINT(10 5)",3
-"POINT(10 -5)",4
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer/>
- <DebugSymbolizer/>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/halo-comp-op-on-satellite.xml b/tests/visual_tests/styles/halo-comp-op-on-satellite.xml
deleted file mode 100644
index 8694a3f..0000000
--- a/tests/visual_tests/styles/halo-comp-op-on-satellite.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
-<Style name="raster">
- <Rule>
- <RasterSymbolizer opacity="1" scaling="bilinear" comp-op="src-over"/>
- </Rule>
-</Style>
-<Layer name="raster"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>raster</StyleName>
- <Datasource>
- <Parameter name="file">../data/satellite.png</Parameter>
- <Parameter name="extent">0,0,10,10</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
-</Layer>
-
-<Style name="labels">
- <Rule>
- <Filter>[x]=2</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-opacity=".1"
- halo-radius="2"
- halo-rasterizer="fast"
- fill="#03080D"
- halo-comp-op="difference"
- >
- 'M a p n i k'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[x]=5</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-fill="gray"
- halo-opacity=".2"
- halo-radius="2"
- fill="#29471B"
- halo-comp-op="invert-rgb"
- >
- 'M a p n i k'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[x]=8</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-fill="gray"
- halo-opacity=".3"
- halo-radius="1"
- fill="#F6EDB7"
- halo-comp-op="invert"
- >
- 'M a p n i k'
- </TextSymbolizer>
- </Rule>
-</Style>
-
-<Layer name="labels" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>labels</StyleName>
- <Datasource>
- <Parameter name="inline">x,y
-2,1
-2,2
-2,3
-2,4
-2,5
-2,6
-2,7
-2,8
-2,9
-5,1
-5,2
-5,3
-5,4
-5,5
-5,6
-5,7
-5,8
-5,9
-8,1
-8,2
-8,3
-8,4
-8,5
-8,8
-8,6
-8,7
-8,8
-8,9
-</Parameter>
- <Parameter name="type">csv</Parameter>
- </Datasource>
-</Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/harfbuzz.xml b/tests/visual_tests/styles/harfbuzz.xml
deleted file mode 100644
index b1b9473..0000000
--- a/tests/visual_tests/styles/harfbuzz.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- <Parameter name="extent">-1,-1,1,1</Parameter>
- </Datasource>
- </Layer>
-
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer/>
- </Rule>
- <Rule>
- <!-- This is an easy test to ensure text shaping actually works. Ligatures are rendered when harfbuzz is used, but not with the old text rendering system. -->
- <Filter>[nr] = 3</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="-16">"Ligature: fi"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="16">"mixed نامجو Text"</TextSymbolizer>
- </Rule>
- <Rule>
- <!-- In addition to the problem mentioned in the bug report (which seems to be gone) this the position is calculated incorrectly -->
- <Filter>[nr] = 1</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="-16">"نامجو 17"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" dy="16">"#519"</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 6</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="36" placement="point" dy="-16">"زنقة الملاح"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" dy="16">"#1154"</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 9</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="36" placement="point" dy="-16">"أڭادير"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" dy="16">"#1146"</TextSymbolizer>
- </Rule>
- <Rule>
- <DebugSymbolizer />
- </Rule>
- </Style>
-</Map>
diff --git a/tests/visual_tests/styles/hb-fontsets.xml b/tests/visual_tests/styles/hb-fontsets.xml
deleted file mode 100644
index 6310edb..0000000
--- a/tests/visual_tests/styles/hb-fontsets.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=latlong +datum=WGS84"
- font-directory="../fonts/KhmerOS/">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- <Parameter name="extent">-0.05, -0.01, 0.95, 0.01</Parameter>
- </Datasource>
- </Layer>
-
- <FontSet name="dejavu-first">
- <Font face-name="DejaVu Sans Book" />
- <Font face-name="Khmer OS Regular" />
- </FontSet>
-
- <FontSet name="khmeros-first">
- <Font face-name="Khmer OS Regular" />
- <Font face-name="DejaVu Sans Book" />
- </FontSet>
-
-
- <Style name="My Style">
- <Rule>
- <Filter>[nr] = 2</Filter>
- <TextSymbolizer face-name="Khmer OS Regular" size="36" placement="point" dy="-16">"A:ស្ត្រី"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="9" placement="point" dy="16">"Khmer OS Regular"</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 4</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="36" placement="point" dy="-16">"B:ស្ត្រី"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="9" placement="point" dy="16">"DejaVu Sans Book"</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 6</Filter>
- <TextSymbolizer fontset-name="dejavu-first" size="36" placement="point" dy="-16">"C:ស្ត្រី"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="9" placement="point" dy="16">"FontSet: DejaVu first"</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 8</Filter>
- <TextSymbolizer fontset-name="khmeros-first" size="36" placement="point" dy="-16">"D:ស្ត្រី"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="9" placement="point" dy="16">"FontSet: Khmer OS first"</TextSymbolizer>
- </Rule>
- </Style>
-</Map>
diff --git a/tests/visual_tests/styles/image-filters-galore.xml b/tests/visual_tests/styles/image-filters-galore.xml
deleted file mode 100644
index 48e4028..0000000
--- a/tests/visual_tests/styles/image-filters-galore.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map background-color="#b8dee6" buffer-size="256" maximum-extent="-20037508.34,-20037508.34,20037508.34,20037508.34">
-
- <Style name="countries-mask" filter-mode="first" comp-op="difference">
- <Rule>
- <PolygonSymbolizer fill="#ffffff" fill-opacity="0.7" gamma="0" />
- </Rule>
- </Style>
- <Style name="countries" filter-mode="first" image-filters="agg-stack-blur(50,50),colorize-alpha(#ffff00,#008000,#4682b4),color-to-alpha(#008000)">
- <Rule>
- <PolygonSymbolizer fill="#ffffff" clip="false" />
- </Rule>
- </Style>
- <Style name="countries-outline" filter-mode="first">
- <Rule>
- <LineSymbolizer stroke="#ffffff" stroke-width="2" stroke-linejoin="round" comp-op="multiply" />
- </Rule>
- </Style>
- <Layer name="world"
- >
- <StyleName>countries-outline</StyleName>
- <StyleName>countries</StyleName>
- <StyleName>countries-mask</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/ne_110m_admin_0_countries.shp</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/image-filters-multi-blur-inflate.xml b/tests/visual_tests/styles/image-filters-multi-blur-inflate.xml
deleted file mode 100644
index ac68bba..0000000
--- a/tests/visual_tests/styles/image-filters-multi-blur-inflate.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map background-color="#b8dee6" buffer-size="256" maximum-extent="-20037508.34,-20037508.34,20037508.34,20037508.34">
-
- <Style name="countries-over" filter-mode="first">
- <Rule>
- <PolygonSymbolizer fill="rgba(255, 255, 255, 0.65)" />
- </Rule>
- </Style>
- <Style name="countries" filter-mode="first" image-filters="agg-stack-blur(15,15)" image-filters-inflate="true">
- <Rule>
- <PolygonSymbolizer fill="#ffffff" gamma="0" />
- </Rule>
- </Style>
- <Style name="countries-outline" filter-mode="first" image-filters="agg-stack-blur(200,200)" image-filters-inflate="true">
- <Rule>
- <LineSymbolizer stroke="#000000" stroke-width="20" stroke-linejoin="round" />
- </Rule>
- </Style>
- <Layer name="world"
- >
- <StyleName>countries-outline</StyleName>
- <StyleName>countries</StyleName>
- <StyleName>countries-over</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/ne_110m_admin_0_countries.shp</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/image-filters-multi-blur.xml b/tests/visual_tests/styles/image-filters-multi-blur.xml
deleted file mode 100644
index fd9b9bc..0000000
--- a/tests/visual_tests/styles/image-filters-multi-blur.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map background-color="#b8dee6" buffer-size="256" maximum-extent="-20037508.34,-20037508.34,20037508.34,20037508.34">
-
- <Style name="countries-over" filter-mode="first">
- <Rule>
- <PolygonSymbolizer fill="rgba(255, 255, 255, 0.65)" />
- </Rule>
- </Style>
- <Style name="countries" filter-mode="first" image-filters="agg-stack-blur(15,15)">
- <Rule>
- <PolygonSymbolizer fill="#ffffff" gamma="0" />
- </Rule>
- </Style>
- <Style name="countries-outline" filter-mode="first" image-filters="agg-stack-blur(200,200)">
- <Rule>
- <LineSymbolizer stroke="#000000" stroke-width="20" stroke-linejoin="round" />
- </Rule>
- </Style>
- <Layer name="world"
- >
- <StyleName>countries-outline</StyleName>
- <StyleName>countries</StyleName>
- <StyleName>countries-over</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/ne_110m_admin_0_countries.shp</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/jalign-auto.xml b/tests/visual_tests/styles/jalign-auto.xml
deleted file mode 100644
index 2ee79ed..0000000
--- a/tests/visual_tests/styles/jalign-auto.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[nr] = 5</Filter>
- <PointSymbolizer/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" dx="-30" dy="-30" justify-alignment="auto">'Text line 1
line 2'</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" dx="0" dy="-30" justify-alignment="auto">'Text line 1
line 2'</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" dx="30" dy="-30" justify-alignment="auto">'Text line 1
line 2'</TextSymbolizer>
-
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" dx="30" dy="0" justify-alignment="auto">'Text line 1
line 2'</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" dx="-30" dy="0" justify-alignment="auto">'Text line 1
line 2'</TextSymbolizer>
-
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" dx="-30" dy="30" justify-alignment="auto">'Text line 1
line 2'</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" dx="0" dy="30" justify-alignment="auto">'Text line 1
line 2'</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="point" dx="30" dy="30" justify-alignment="auto">'Text line 1
line 2'</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/khmer.xml b/tests/visual_tests/styles/khmer.xml
deleted file mode 100644
index 4d2eddc..0000000
--- a/tests/visual_tests/styles/khmer.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=latlong +datum=WGS84"
- font-directory="../fonts/KhmerOS/">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
- <Style name="My Style">
- <Rule>
- <PointSymbolizer/>
- </Rule>
- <Rule>
- <Filter>[nr] = 1</Filter>
- <TextSymbolizer face-name="Khmer OS Regular" size="20" placement="point" dy="16">"ព្រះរាជាណាចក្រកម្ពុជា"</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 3</Filter>
- <TextSymbolizer face-name="Khmer OS Regular" size="20" placement="point" dy="16">"ស្ត្រី"</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 5</Filter>
- <TextSymbolizer face-name="Khmer OS Regular" size="20" placement="point" dy="16">"ផ្លូវ ១២៣"</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 7</Filter>
- <TextSymbolizer face-name="Khmer OS Regular" size="20" placement="point" dy="-16">"ផផ្ទះសំណាក់សណ្ឋាគារមាស"</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 9</Filter>
- <TextSymbolizer face-name="Khmer OS Regular" size="20" placement="point" dy="16">"ផ្លូវ១២៣"</TextSymbolizer>
- </Rule>
- </Style>
-</Map>
diff --git a/tests/visual_tests/styles/line-offset.xml b/tests/visual_tests/styles/line-offset.xml
deleted file mode 100644
index 8f4dee7..0000000
--- a/tests/visual_tests/styles/line-offset.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/line-offset.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <LineSymbolizer/>
- </Rule>
- <Rule>
- <Filter>[ref]=1 or [ref]=3</Filter>
- <TextSymbolizer size="14" fill="#000" spacing="1" placement="line" face-name="DejaVu Sans Book" halo-radius="1" dy="-10" vertical-alignment="middle">'Some Text'</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[ref]=2 or [ref]=4</Filter>
- <TextSymbolizer size="14" fill="#000" spacing="1" placement="line" face-name="DejaVu Sans Book" halo-radius="1" dy="10" vertical-alignment="middle">'Some Text'</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[name]</Filter>
- <TextSymbolizer size="10" fill="#000" placement="line" face-name="DejaVu Sans Book" halo-radius="1">[name]</TextSymbolizer>
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/line-opacity-multi-render.xml b/tests/visual_tests/styles/line-opacity-multi-render.xml
deleted file mode 100644
index f4ad94d..0000000
--- a/tests/visual_tests/styles/line-opacity-multi-render.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<Map srs="+init=epsg:3857" maximum-extent="-20037508.34,-20037508.34,20037508.34,20037508.34">
- <Style name="polygon" filter-mode="first" >
- <Rule>
- <LineSymbolizer stroke-width="50" stroke-opacity="0.01" />
- </Rule>
- </Style>
-
- <Layer name="polygon" srs="+init=epsg:3857">
- <StyleName>polygon</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="extent"><![CDATA[-20037508.3,-20037508.3,20037508.3,20037508.3]]></Parameter>
- <Parameter name="inline">
-wkt
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))"
-"POLYGON((-14452779.6317309 -7962451.4552494,-14452779.6317309 12037548.5447506,5547220.36826906 12037548.5447506,5547220.36826906 -7962451.4552494,-14452779.6317309 -7962451.4552494))
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/line-pattern-smooth-and-offset.xml b/tests/visual_tests/styles/line-pattern-smooth-and-offset.xml
deleted file mode 100755
index 66f037d..0000000
--- a/tests/visual_tests/styles/line-pattern-smooth-and-offset.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Map background-color="white">
-
- <Style name="style">
- <Rule>
- <LineSymbolizer stroke="yellow" stroke-width="6" offset="30" smooth="1" simplify="50000" simplify-algorithm="radial-distance"/>
- <LineSymbolizer stroke="orange" stroke-width="6" offset="20" smooth="1"/>
- <LineSymbolizer stroke="red" stroke-width="6" offset="10" smooth="1"/>
- <LineSymbolizer stroke="green" stroke-width="6" offset="0" smooth="1"/>
- <LineSymbolizer stroke="blue" stroke-width="6" offset="-10" smooth="1"/>
- <LineSymbolizer stroke="purple" stroke-width="6" offset="-20" smooth="1"/>
- <LinePatternSymbolizer file="../../data/svg/octocat.svg" opacity=".1" comp-op="multiply" transform="scale(.05)" offset="30" smooth="1"/>
- <LinePatternSymbolizer file="../../data/svg/octocat.svg" opacity=".1" comp-op="multiply" transform="scale(.05) rotate(90)" offset="-20" smooth="1"/>
- <TextSymbolizer placement="line" size="14" simplify="50000" simplify-algorithm="radial-distance" halo-radius="1" character-spacing="3" spacing="25" face-name="DejaVu Sans Book" dy="10" smooth="1">'offset • +10'</TextSymbolizer>
- <TextSymbolizer placement="line" size="14" halo-radius="1" character-spacing="3" spacing="25" face-name="DejaVu Sans Book" dy="-18" smooth="1">'offset • -18'</TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="layer">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="type">shape</Parameter>
- <Parameter name="file">../data/line.shp</Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/styles/line-pattern-symbolizer-opacity.xml b/tests/visual_tests/styles/line-pattern-symbolizer-opacity.xml
deleted file mode 100644
index 82a92fb..0000000
--- a/tests/visual_tests/styles/line-pattern-symbolizer-opacity.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<Map
- background-color="green"
- background-image="../../data/images/checker.jpg"
- background-image-opacity=".5"
- background-image-comp-op="soft-light"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/line-offset.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <LinePatternSymbolizer file="../../data/raster/white-alpha.png" comp-op="difference"/>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/line-pattern-symbolizer.xml b/tests/visual_tests/styles/line-pattern-symbolizer.xml
deleted file mode 100644
index c1cd9b3..0000000
--- a/tests/visual_tests/styles/line-pattern-symbolizer.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/line-offset.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <LineSymbolizer stroke="#00FF00"/>
- </Rule>
- <Rule>
- <Filter>[ref]=1 or [ref]=3</Filter>
- <LinePatternSymbolizer file="../../data/pngsuite/linepattern.png"/>
- <LinePatternSymbolizer offset="-5" file="../../data/pngsuite/linepattern1.png"/>
- </Rule>
- <Rule>
- <Filter>[ref]=2 or [ref]=4</Filter>
- <LinePatternSymbolizer file="../../data/pngsuite/linepattern.png"/>
- <LinePatternSymbolizer offset="5" file="../../data/pngsuite/linepattern1.png"/>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/line-smooth-and-offset.xml b/tests/visual_tests/styles/line-smooth-and-offset.xml
deleted file mode 100755
index 172a3f7..0000000
--- a/tests/visual_tests/styles/line-smooth-and-offset.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Map background-color="white">
-
- <Style name="style">
- <Rule>
- <LineSymbolizer stroke="yellow" stroke-width="6" offset="30" smooth="1"/>
- <LineSymbolizer stroke="orange" stroke-width="6" offset="20" smooth="1"/>
- <LineSymbolizer stroke="red" stroke-width="6" offset="10" smooth="1"/>
- <LineSymbolizer stroke="green" stroke-width="6" offset="0" smooth="1"/>
- <LineSymbolizer stroke="blue" stroke-width="6" offset="-10" smooth="1"/>
- <LineSymbolizer stroke="purple" stroke-width="6" offset="-20" smooth="1" rasterizer="fast"/>
- </Rule>
- </Style>
-
- <Layer name="layer">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="type">shape</Parameter>
- <Parameter name="file">../data/line.shp</Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/styles/line-symbolizer-expressions-all.xml b/tests/visual_tests/styles/line-symbolizer-expressions-all.xml
deleted file mode 100644
index 880cfe1..0000000
--- a/tests/visual_tests/styles/line-symbolizer-expressions-all.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<Map
- background-color="#eee"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="bug">
- <Rule>
- <Filter>[id] = 'stroke'</Filter>
- <LineSymbolizer stroke-width='5' stroke='[value]' />
- </Rule>
- <Rule>
- <Filter>[id] = 'stroke-width'</Filter>
- <LineSymbolizer stroke-width='[value]' stroke='#ff0000' />
- </Rule>
- <Rule>
- <Filter>[id] = 'stroke-opacity'</Filter>
- <LineSymbolizer stroke-width='5' stroke='#ff0000' stroke-opacity="[value]" />
- </Rule>
- <Rule>
- <Filter>[id] = 'offset'</Filter>
- <LineSymbolizer stroke-width='5' stroke='#ff0000' offset="[value]" />
- </Rule>
- <Rule>
- <Filter>[id] = 'stroke-dasharray'</Filter>
- <LineSymbolizer stroke-width='5' stroke='#ff0000' stroke-dasharray="[value]" />
- </Rule>
- <Rule>
- <Filter>[id] = 'stroke-linejoin'</Filter>
- <LineSymbolizer stroke-width='5' stroke='#ff0000' stroke-linejoin="[value]" />
- </Rule>
- <Rule>
- <Filter>[id] = 'stroke-linecap'</Filter>
- <LineSymbolizer stroke-width='5' stroke='#ff0000' stroke-linecap="[value]" />
- </Rule>
- <Rule>
- <Filter>[id] = 'comp-op'</Filter>
- <LineSymbolizer stroke-width='5' stroke='#ff0000' comp-op="[value]" />
- </Rule>
-
- <Rule>
- <TextSymbolizer face-name='DejaVu Sans Book' dy='-5'>[id]</TextSymbolizer>
- </Rule>
- </Style>
-
- <Style name="frame">
- <Rule>
- <PolygonSymbolizer />
- </Rule>
- </Style>
-
- <!--
- frame is a layer with a single polygon that is used to ensure that m.zoom_all() will zoom the
- map to a reasonable bounding extent to make the test easy to view with tools like nik2img.py
- (which calls m.zoom_all() by default). Another approach in >= Mapnik 2.3.x is to just sent a
- manual `extent` for the CSV datasource.
- -->
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt|name
-Polygon((-180.0 -125.0, -180.0 125.0, 180.0 125.0, 180.0 -125.0, -180.0 -125.0))|bounds
- </Parameter>
- </Datasource>
- </Layer>
-
- <!--
- "bug" is a layer that should provide sample data that triggers the bug in question. It is
- listed after the "frame" layer so that it renders on top and is visible.
- -->
-
- <Layer name="bug" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>bug</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-id|value|wkt
-stroke|#ff0000|LineString(-160 -120,160 -120,160 -100)
-stroke-width|5|LineString(-160 -90,160 -90,160 -70)
-stroke-opacity|0.5|LineString(-160 -60,160 -60,160 -40)
-offset|3|LineString(-160 -30,160 -30,160 -10)
-stroke-dasharray|3,3|LineString(-160 0,160 0,160 20)
-stroke-linejoin|bevel|LineString(-160 30,160 30,160 50)
-stroke-linecap|round|LineString(-160 60,160 60,160 80)
-comp-op|minus|LineString(-160 90,160 90,160 110)
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/line-symbolizer-expressions.xml b/tests/visual_tests/styles/line-symbolizer-expressions.xml
deleted file mode 100644
index ff3cf79..0000000
--- a/tests/visual_tests/styles/line-symbolizer-expressions.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<Map
- background-color="#eee"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="bug">
- <Rule>
- <Filter>[id] = 'stroke'</Filter>
- <LineSymbolizer stroke-width='5' stroke='[value]' />
- </Rule>
- <Rule>
- <Filter>[id] = 'stroke-width'</Filter>
- <LineSymbolizer stroke-width='[value]' stroke='#ff0000' />
- </Rule>
- <Rule>
- <Filter>[id] = 'stroke-opacity'</Filter>
- <LineSymbolizer stroke-width='5' stroke='#ff0000' stroke-opacity="[value]" />
- </Rule>
- <Rule>
- <Filter>[id] = 'offset'</Filter>
- <LineSymbolizer stroke-width='5' stroke='#ff0000' offset="[value]" />
- </Rule>
-
- <Rule>
- <TextSymbolizer face-name='DejaVu Sans Book' dy='-5'>[id]</TextSymbolizer>
- </Rule>
- </Style>
-
- <Style name="frame">
- <Rule>
- <PolygonSymbolizer />
- </Rule>
- </Style>
-
- <!--
- frame is a layer with a single polygon that is used to ensure that m.zoom_all() will zoom the
- map to a reasonable bounding extent to make the test easy to view with tools like nik2img.py
- (which calls m.zoom_all() by default). Another approach in >= Mapnik 2.3.x is to just sent a
- manual `extent` for the CSV datasource.
- -->
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt|name
-Polygon((-180.0 -125.0, -180.0 125.0, 180.0 125.0, 180.0 -125.0, -180.0 -125.0))|bounds
- </Parameter>
- </Datasource>
- </Layer>
-
- <!--
- "bug" is a layer that should provide sample data that triggers the bug in question. It is
- listed after the "frame" layer so that it renders on top and is visible.
- -->
-
- <Layer name="bug" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>bug</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-id|value|wkt
-stroke|#ff0000|LineString(-160 -120,160 -120,160 -100)
-stroke-width|5|LineString(-160 -90,160 -90,160 -70)
-stroke-opacity|0.5|LineString(-160 -60,160 -60,160 -40)
-offset|3|LineString(-160 -30,160 -30,160 -10)
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/line_break.xml b/tests/visual_tests/styles/line_break.xml
deleted file mode 100644
index c39fd6c..0000000
--- a/tests/visual_tests/styles/line_break.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer/>
- </Rule>
- <Rule>
- <Filter>[nr] = 3</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="36" placement="point" dy="-16" allow-overlap="true" wrap-width="80">"Overflowing lines"</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 3</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="12" placement="point" dy="16" allow-overlap="true" wrap-width="300">"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas ac urna ornare sapien porta hendrerit. In ultricies luctus massa vitae aliquam. Pellentesque in mauris nec velit elementum rhoncus. Pellentesque diam sapien, volutpat ac sollicitudin volutpat, sagittis in sem. Pellentesque ut purus a neque dapibus sodales. Etiam pellentesque elementum ligula, [...]
- </Rule>
- <Rule>
- <Filter>[nr] = 8</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="12" placement="point" dy="16" allow-overlap="true" wrap-width="300" wrap-before="true">"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas ac urna ornare sapien porta hendrerit. In ultricies luctus massa vitae aliquam. Pellentesque in mauris nec velit elementum rhoncus. Pellentesque diam sapien, volutpat ac sollicitudin volutpat, sagittis in sem. Pellentesque ut purus a neque dapibus sodales. Etiam pellentesque [...]
- </Rule>
- <Rule>
- <Filter>[nr] = 7</Filter>
- <!-- Text from http://fa.wikipedia.org/wiki/راستبهچپ -->
- <TextSymbolizer face-name="DejaVu Sans Book" size="12" placement="point" dy="-16" wrap-width="80">
- "راستبهچپ یا به خطهایی گفته میشود که نوشتنشان از سمت راست صفحه آغاز شود و به سمت چپ ادامه یابد. خطهای راستبهچپ عبارتند از"</TextSymbolizer>
- </Rule>
- </Style>
-</Map>
diff --git a/tests/visual_tests/styles/lines-1.xml b/tests/visual_tests/styles/lines-1.xml
deleted file mode 100644
index 086f992..0000000
--- a/tests/visual_tests/styles/lines-1.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/lines.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[mapnik::geometry_type]=linestring</Filter>
- <LineSymbolizer stroke-width="12" stroke="red"/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="line">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/lines-2.xml b/tests/visual_tests/styles/lines-2.xml
deleted file mode 100644
index 9ea6e58..0000000
--- a/tests/visual_tests/styles/lines-2.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/lines.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[mapnik::geometry_type]=linestring</Filter>
- <LineSymbolizer stroke-width="12" stroke="red"/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="line">[name]<Format size="8" fill="blue">[name]</Format></TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/lines-3.xml b/tests/visual_tests/styles/lines-3.xml
deleted file mode 100644
index 3164b23..0000000
--- a/tests/visual_tests/styles/lines-3.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/lines.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[mapnik::geometry_type]=linestring</Filter>
- <LineSymbolizer stroke-width="12" stroke="red"/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="line" spacing="20">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/lines-4.xml b/tests/visual_tests/styles/lines-4.xml
deleted file mode 100644
index f65a4dc..0000000
--- a/tests/visual_tests/styles/lines-4.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- Upright test -->
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>lines</StyleName>
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/lines2.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="lines">
- <Rule>
- <LineSymbolizer stroke-width="12" stroke="red"/>
- </Rule>
- </Style>
-
- <Style name="text">
- <Rule>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="line" spacing="10" upright="left" max-char-angle-delta="0">"Some Text"</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/lines-5.xml b/tests/visual_tests/styles/lines-5.xml
deleted file mode 100644
index a8b91bf..0000000
--- a/tests/visual_tests/styles/lines-5.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- dy and multi lines test -->
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>lines</StyleName>
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/lines2.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="lines">
- <Rule>
- <LineSymbolizer stroke-width="12" stroke="green"/>
- <LineSymbolizer stroke-width="1" stroke="blue" offset="5"/>
- </Rule>
- </Style>
-
- <Style name="text">
- <Rule>
- <!-- note:
is an encoded \n -->
- <TextSymbolizer face-name="DejaVu Sans Book" size="12" placement="line" spacing="20" max-char-angle-delta="0" dy="6">
- "Hello
World!"
- </TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/lines-6.xml b/tests/visual_tests/styles/lines-6.xml
deleted file mode 100644
index 101cda1..0000000
--- a/tests/visual_tests/styles/lines-6.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- complex script on line test -->
-<Map background-color="white" srs="+proj=latlong +datum=WGS84"
- font-directory="../fonts/KhmerOS/">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>lines</StyleName>
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/lines2.csv</Parameter>
- </Datasource>
- </Layer>
-
- <FontSet name="dejavu-first">
- <Font face-name="DejaVu Sans Book" />
- <Font face-name="Khmer OS Regular" />
- </FontSet>
-
- <Style name="lines">
- <Rule>
- <LineSymbolizer stroke-width="12" stroke="green"/>
- <LineSymbolizer stroke-width="1" stroke="blue" offset="5"/>
- </Rule>
- </Style>
-
- <Style name="text">
- <Rule>
- <TextSymbolizer fontset-name="dejavu-first" size="12" placement="line" spacing="20" max-char-angle-delta="0">
- "ផ្លូវ១២៣ abcd"
- </TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/lines-7.xml b/tests/visual_tests/styles/lines-7.xml
deleted file mode 100644
index ae4faa5..0000000
--- a/tests/visual_tests/styles/lines-7.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- dy and multi lines test -->
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>lines</StyleName>
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt,nr
-"LINESTRING(-1.000 -1.000, -0.958 -0.646, -0.917 -0.331, -0.875 -0.055, -0.833 0.185, -0.792 0.390, -0.750 0.562, -0.708 0.703, -0.667 0.815, -0.625 0.898, -0.583 0.956, -0.542 0.989, -0.500 1.000, -0.458 0.990, -0.417 0.961, -0.375 0.914, -0.333 0.852, -0.292 0.776, -0.250 0.688, -0.208 0.589, -0.167 0.481, -0.125 0.367, -0.083 0.248, -0.042 0.125, 0.000 0.000, 0.042 -0.125, 0.083 -0.248, 0.125 -0.367, 0.167 -0.481, 0.208 -0.589, 0.250 -0.688, 0.292 -0.776, 0.333 -0.852, 0.375 -0.914, 0 [...]
-</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="lines">
- <Rule>
- <LineSymbolizer stroke-width="1" stroke="green"/>
- <LineSymbolizer stroke-width="1" stroke="lightblue" offset="12"/>
- <LineSymbolizer stroke-width="1" stroke="lightblue" offset="-12"/>
- </Rule>
- </Style>
-
- <Style name="text">
- <Rule>
- <!-- note:
is an encoded \n -->
- <TextSymbolizer face-name="DejaVu Sans Book" size="12" placement="line" spacing="10" max-char-angle-delta="180" dy="0" justify-alignment="center" allow-overlap="true">
- "u!__|__!u
m!__|__!m
b!__|__!b"
- </TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/lines-multi-layout-1.xml b/tests/visual_tests/styles/lines-multi-layout-1.xml
deleted file mode 100644
index 7a8f8d8..0000000
--- a/tests/visual_tests/styles/lines-multi-layout-1.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- Upright test -->
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>lines</StyleName>
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/lines2.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="lines">
- <Rule>
- <LineSymbolizer stroke-width="3" stroke="green"/>
- </Rule>
- </Style>
-
- <Style name="text">
- <Rule>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="line" spacing="25" fill="#00ff00" halo-radius="1" halo-fill="rgba(255,255,255,0.6)" max-char-angle-delta="90">
- <Layout dy="-3" vertical-alignment="top" wrap-width="33" wrap-before="true">
- <Format fill="#ff0000">"District One"</Format>
- </Layout>
- <Layout dy="5" vertical-alignment="bottom">
- <Format fill="#0000ff">"District Two"</Format>
- </Layout>
- </TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/lines-multi-layout-2.xml b/tests/visual_tests/styles/lines-multi-layout-2.xml
deleted file mode 100644
index c094457..0000000
--- a/tests/visual_tests/styles/lines-multi-layout-2.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- Upright test -->
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>lines</StyleName>
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt,nr
-"LINESTRING(1.000 1.000, 0.958 0.646, 0.917 0.331, 0.875 0.055, 0.833 -0.185, 0.792 -0.390, 0.750 -0.562, 0.708 -0.703, 0.667 -0.815, 0.625 -0.898, 0.583 -0.956, 0.542 -0.989, 0.500 -1.000, 0.458 -0.990, 0.417 -0.961, 0.375 -0.914, 0.333 -0.852, 0.292 -0.776, 0.250 -0.688, 0.208 -0.589, 0.167 -0.481, 0.125 -0.367, 0.083 -0.248, 0.042 -0.125, 0.000 0.000, -0.042 0.125, -0.083 0.248, -0.125 0.367, -0.167 0.481, -0.208 0.589, -0.250 0.688, -0.292 0.776, -0.333 0.852, -0.375 0.914, -0.417 0. [...]
-</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="lines">
- <Rule>
- <LineSymbolizer stroke-width="3" stroke="green"/>
- </Rule>
- </Style>
-
- <Style name="text">
- <Rule>
- <TextSymbolizer face-name="DejaVu Sans Book" size="14" placement="line" spacing="40" upright="left" max-char-angle-delta="45">
- <Layout dy="-5" horizontal-alignment="left">"Align Left"</Layout>
- <Layout dy="5" horizontal-alignment="right">"Align Right"</Layout>
- </TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/lines-multi-layout-shield.xml b/tests/visual_tests/styles/lines-multi-layout-shield.xml
deleted file mode 100644
index 708cac2..0000000
--- a/tests/visual_tests/styles/lines-multi-layout-shield.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- Upright test -->
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>lines</StyleName>
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/lines.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="lines">
- <Rule>
- <LineSymbolizer stroke-width="3" stroke="red"/>
- </Rule>
- </Style>
-
- <Style name="text">
- <Rule>
- <ShieldSymbolizer placement="line" spacing="60" minimum-distance="10" label-position-tolerance="0.5" face-name="DejaVu Sans Bold" size="14" fill="#ffffff" file="../../data/svg/rect.svg">
- [nr]
- <Format size="10" face-name="DejaVu Sans Book" fill="#000000" halo-fill="rgba(255,255,255,0.6)" halo-radius="1.5">
- <Layout dy="-10">"SOUTH"</Layout>
- <Layout dy="10">"ALT"</Layout>
- </Format>
- </ShieldSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/lines-shield.xml b/tests/visual_tests/styles/lines-shield.xml
deleted file mode 100644
index 6384399..0000000
--- a/tests/visual_tests/styles/lines-shield.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/lines.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[mapnik::geometry_type]=linestring</Filter>
- <LineSymbolizer stroke-width="1" stroke="blue"/>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="line" file="../../data/svg/crosshair16x16.svg" spacing="30">'X'</ShieldSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/list.xml b/tests/visual_tests/styles/list.xml
deleted file mode 100644
index d1332be..0000000
--- a/tests/visual_tests/styles/list.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dy="8" fill="blue" placement-type="list">[name]
- <Placement size="10" dy="-8" fill="red"/>
- <Placement fill="green">'S'+[nr]</Placement>
- <Placement fill="orange" dy="8">[nr]</Placement>
- </TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/map-background-image-compositing.xml b/tests/visual_tests/styles/map-background-image-compositing.xml
deleted file mode 100644
index 9bedf74..0000000
--- a/tests/visual_tests/styles/map-background-image-compositing.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
- background-color="green"
- background-image-opacity=".8"
- background-image-comp-op="screen"
- background-image="../data/pattern.png">
-
- <Style name="ellipse">
- <Rule>
- <MarkersSymbolizer
- width="240"
- height="240"
- fill="steelblue"
- fill-opacity=".2"
- stroke="yellow"
- stroke-width="16"
- stroke-opacity=".3"
- />
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>ellipse</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-2.5,2.5
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/marker-collide.xml b/tests/visual_tests/styles/marker-collide.xml
deleted file mode 100644
index de45a80..0000000
--- a/tests/visual_tests/styles/marker-collide.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<Map>
-
- <Style name="line">
- <Rule>
- <LineSymbolizer stroke="#000000" />
- </Rule>
- </Style>
-
- <Style name="text">
- <Rule>
- <TextSymbolizer spacing="10" size="14" halo-radius="2" face-name="DejaVu Sans Oblique" placement="line">'text'</TextSymbolizer>
- </Rule>
- </Style>
-
- <Style name="point-placement">
- <Rule>
- <MarkersSymbolizer placement="line" marker-type="ellipse" fill="blue" transform="scale(1.5,.3)" spacing="1" allow-overlap="false"/>
- <MarkersSymbolizer placement="line" marker-type="ellipse" fill="blue" transform="scale(.3,1.5)" spacing="1" allow-overlap="false"/>
- </Rule>
- </Style>
-
- <Layer name="one">
- <StyleName>line</StyleName>
- <StyleName>text</StyleName>
- <StyleName>point-placement</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-i|wkt
-1|LINESTRING(-98.465624973178 64.664065539837, -84.403124973178 49.195315539837, -72.449999973178 40.757815539837, -61.199999973178 29.507815539837, -60.496874973178 22.476565539837, -58.387499973178 4.1953155398369, -52.059374973178 -7.7578094601631, -41.512499973178 -34.476559460163, -27.449999973178 -45.023434460163, -14.090624973178 -52.054684460163, 7.0031250268221 -61.195309460163)
- </Parameter>
- <Parameter name="separator">|</Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="two">
- <StyleName>line</StyleName>
- <StyleName>text</StyleName>
- <StyleName>point-placement</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-i|wkt
-1|LINESTRING(-55.574999973178 68.882815539837, -51.356249973178 42.164065539837, -57.684374973178 33.023440539837, -64.012499973178 21.773440539837, -63.309374973178 3.4921905398369, -45.731249973178 -46.429684460163, -16.903124973178 -50.648434460163, -2.8406249731779 -50.648434460163, 14.737500026822 -50.648434460163, 46.378125026822 -41.507809460163, 78.721875026822 -17.601559460163)
-2|LINESTRING(-21.824999973178 69.585940539837, -108.30937497318 41.460940539837, -13.387499973178 24.585940539837, -108.30937497318 6.3046905398369, -19.012499973178 -2.1328094601631, -83.699999973178 -26.039059460163, 5.5968750268221 -26.039059460163, -30.262499973178 -63.304684460163, 40.050000026822 -19.710934460163, 62.550000026822 -61.195309460163)
-3|LINESTRING(-73.856249973178 77.320315539837, -11.278124973178 -61.898434460163, -112.52812497318 61.148440539837, 31.612500026822 -61.898434460163, 56.925000026822 -13.382809460163)
- </Parameter>
- <Parameter name="separator">|</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/marker-interior-position.xml b/tests/visual_tests/styles/marker-interior-position.xml
deleted file mode 100644
index 08945ef..0000000
--- a/tests/visual_tests/styles/marker-interior-position.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<Map
- background-color="#eee"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="poly">
- <Rule>
- <PolygonSymbolizer />
- <MarkersSymbolizer stroke-width="0" width="7" placement="interior" fill="blue" allow-overlap="true"/>
- <MarkersSymbolizer stroke-width="0" width="7" placement="point" fill="red" allow-overlap="true"/>
- <DebugSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="bug" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>poly</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="extent">-1 -1 11 11</Parameter>
- <Parameter name="inline">
- id|name|wkt
- 1|Example|Polygon((0 10, 0 0, 1 0, 1 7, 6 7, 6 0, 10 0, 10 10, 0 10))
- </Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/marker-multi-policy.xml b/tests/visual_tests/styles/marker-multi-policy.xml
deleted file mode 100644
index 937cc15..0000000
--- a/tests/visual_tests/styles/marker-multi-policy.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<Map maximum-extent="0,0,190,180">
-<Style name="each">
- <Rule>
- <Filter>[i] = 1</Filter>
- <MarkersSymbolizer placement="point" fill="red" width="30" allow-overlap="true"/>
- </Rule>
-</Style>
-<Style name="whole">
- <Rule>
- <Filter>[i] = 1</Filter>
- <MarkersSymbolizer placement="point" multi-policy="whole" fill="yellow" width="20" allow-overlap="true"/>
- </Rule>
-</Style>
-<Style name="largest">
- <Rule>
- <Filter>[i] = 2</Filter>
- <MarkersSymbolizer placement="point" multi-policy="largest" fill="blue" width="10" allow-overlap="true"/>
- </Rule>
-</Style>
-<Style name="boundary">
- <Rule>
- <LineSymbolizer />
- </Rule>
-</Style>
-<Layer name="multi">
- <StyleName>boundary</StyleName>
- <StyleName>each</StyleName>
- <StyleName>whole</StyleName>
- <StyleName>largest</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/marker-multi-policy.csv</Parameter>
- <Parameter name="separator">|</Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/styles/marker-on-hex-grid.xml b/tests/visual_tests/styles/marker-on-hex-grid.xml
deleted file mode 100644
index 4da597e..0000000
--- a/tests/visual_tests/styles/marker-on-hex-grid.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="white" srs="+init=epsg:4326" minimum-version="0.7.2">
- <Style name="1">
- <Rule>
- <LineSymbolizer stroke-width=".2" stroke="grey"/>
- <MarkersSymbolizer
- allow-overlap="true"
- clip="true"
- file="shape://arrow"
- transform="scale(.5,.5)"
- placement="line"
- spacing="50"
- />
- <DebugSymbolizer />
- </Rule>
- </Style>
- <Layer name="point" srs="+init=epsg:4326">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="type">shape</Parameter>
- <Parameter name="file">../data/hex.shp</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/marker-on-line-and-avoid-edges.xml b/tests/visual_tests/styles/marker-on-line-and-avoid-edges.xml
deleted file mode 100644
index e347b29..0000000
--- a/tests/visual_tests/styles/marker-on-line-and-avoid-edges.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<Map>
-<Style name="line" filter-mode="first" >
- <Rule>
- <LineSymbolizer stroke="#000000" />
- </Rule>
-</Style>
-<Style name="point-placement" filter-mode="first" >
- <Rule>
- <MarkersSymbolizer
- allow-overlap="true"
- file="shape://ellipse"
- placement="line"
- spacing="30"
- transform="scale(4,10)"
- fill="blue"
- avoid-edges="true"
- clip="false">
- </MarkersSymbolizer>
- <MarkersSymbolizer
- allow-overlap="true"
- file="shape://ellipse"
- placement="vertex-last"
- transform="scale(10,4)"
- fill="red"
- avoid-edges="true"
- clip="false">
- </MarkersSymbolizer>
- <MarkersSymbolizer
- allow-overlap="true"
- file="shape://ellipse"
- placement="vertex-first"
- transform="scale(10,4)"
- fill="red"
- avoid-edges="true"
- clip="false">
- </MarkersSymbolizer>
- <DebugSymbolizer />
- </Rule>
-</Style>
-<Layer name="carto_tests">
- <StyleName>line</StyleName>
- <StyleName>point-placement</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/marker-on-line.csv</Parameter>
- <Parameter name="separator">|</Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/styles/marker-on-line-and-line-placement.xml b/tests/visual_tests/styles/marker-on-line-and-line-placement.xml
deleted file mode 100644
index 6cbdceb..0000000
--- a/tests/visual_tests/styles/marker-on-line-and-line-placement.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<Map>
-<Style name="line" filter-mode="first" >
- <Rule>
- <LineSymbolizer stroke="red"/>
- <LineSymbolizer stroke="blue" smooth=".5"/>
- <LineSymbolizer stroke="orange" smooth="1"/>
- <LineSymbolizer stroke="green" smooth="1" geometry-transform="translate(10,10)" />
- </Rule>
-</Style>
-<Style name="point-placement" filter-mode="first" >
- <Rule>
- <MarkersSymbolizer stroke-width="0" allow-overlap="true" placement="line" marker-type="ellipse" fill="red" />
- <MarkersSymbolizer stroke-width="0" offset="-10" transform="translate(0,-10)" allow-overlap="true" placement="line" marker-type="ellipse" fill="darkred" />
- <MarkersSymbolizer stroke-width="0" allow-overlap="true" smooth=".5" transform="translate(10,10) translate(-10,-10)" placement="line" marker-type="ellipse" fill="blue" />
- <MarkersSymbolizer stroke-width="0" allow-overlap="true" smooth="1" placement="line" marker-type="ellipse" fill="orange" />
- <MarkersSymbolizer stroke-width="0" allow-overlap="true" smooth="1" geometry-transform="translate(10,10)" placement="line" marker-type="ellipse" fill="darkgreen" />
- </Rule>
-</Style>
-<Layer name="carto_tests">
- <StyleName>line</StyleName>
- <StyleName>point-placement</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/marker-on-line.csv</Parameter>
- <Parameter name="separator">|</Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/styles/marker-on-line-and-vertex-first-placement.xml b/tests/visual_tests/styles/marker-on-line-and-vertex-first-placement.xml
deleted file mode 100644
index e001cd4..0000000
--- a/tests/visual_tests/styles/marker-on-line-and-vertex-first-placement.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map>
- <Style name="lines">
- <Rule>
- <LineSymbolizer stroke="#000000" />
- </Rule>
- </Style>
- <Style name="markers">
- <Rule>
- <MarkersSymbolizer marker-type="ellipse" placement="[placement]" />
- <DebugSymbolizer />
- </Rule>
- </Style>
- <Layer name="layer">
- <StyleName>lines</StyleName>
- <StyleName>markers</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- wkt, placement
- "LINESTRING(0 0)", "vertex-first"
- "LINESTRING(0 1, 10 1)", "vertex-first"
- "LINESTRING(0 2, 2 3, 4 2, 6 3, 8 2, 10 3)", "vertex-first"
- </Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/styles/marker-on-line-and-vertex-last-placement.xml b/tests/visual_tests/styles/marker-on-line-and-vertex-last-placement.xml
deleted file mode 100644
index b35a65d..0000000
--- a/tests/visual_tests/styles/marker-on-line-and-vertex-last-placement.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map>
- <Style name="lines">
- <Rule>
- <LineSymbolizer stroke="#000000" />
- </Rule>
- </Style>
- <Style name="markers">
- <Rule>
- <MarkersSymbolizer marker-type="ellipse" placement="[placement]" />
- <DebugSymbolizer />
- </Rule>
- </Style>
- <Layer name="layer">
- <StyleName>lines</StyleName>
- <StyleName>markers</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- wkt, placement
- "LINESTRING(0 0)", "vertex-last"
- "LINESTRING(0 1, 10 1)", "vertex-last"
- "LINESTRING(0 2, 2 3, 4 2, 6 3, 8 2, 10 3)", "vertex-last"
- </Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/styles/marker-on-line-spacing-eq-width-overlap.xml b/tests/visual_tests/styles/marker-on-line-spacing-eq-width-overlap.xml
deleted file mode 100644
index 3b58e54..0000000
--- a/tests/visual_tests/styles/marker-on-line-spacing-eq-width-overlap.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>alpha</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- wkt
- "LINESTRING(0 0, 10 2)"
- </Parameter>
- </Datasource>
- </Layer>
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>beta</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- wkt
- "LINESTRING(0 2, 10 4)"
- </Parameter>
- </Datasource>
- </Layer>
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>gamma</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- wkt
- "LINESTRING(0 4, 10 6)"
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="alpha">
- <Rule>
- <MarkersSymbolizer file="shape://ellipse" allow-overlap="true" width="20" height="20" placement="line" spacing="25"/>
- <LineSymbolizer stroke-width="0.2" stroke="#ff0000" />
- </Rule>
- </Style>
- <Style name="beta">
- <Rule>
- <MarkersSymbolizer file="shape://ellipse" allow-overlap="true" width="20" height="20" placement="line" spacing="20"/>
- <LineSymbolizer stroke-width="0.2" stroke="#ff0000" />
- </Rule>
- </Style>
- <Style name="gamma">
- <Rule>
- <MarkersSymbolizer file="shape://ellipse" allow-overlap="true" width="20" height="20" placement="line" spacing="15"/>
- <LineSymbolizer stroke-width="0.2" stroke="#ff0000" />
- <DebugSymbolizer />
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/marker-on-line-spacing-eq-width.xml b/tests/visual_tests/styles/marker-on-line-spacing-eq-width.xml
deleted file mode 100644
index c4ad7d9..0000000
--- a/tests/visual_tests/styles/marker-on-line-spacing-eq-width.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>alpha</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- wkt
- "LINESTRING(0 0, 10 2)"
- </Parameter>
- </Datasource>
- </Layer>
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>beta</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- wkt
- "LINESTRING(0 2, 10 4)"
- </Parameter>
- </Datasource>
- </Layer>
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>gamma</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- wkt
- "LINESTRING(0 4, 10 6)"
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="alpha">
- <Rule>
- <MarkersSymbolizer file="shape://ellipse" allow-overlap="false" width="20" height="20" placement="line" spacing="25"/>
- <LineSymbolizer stroke-width="0.2" stroke="#ff0000" />
- </Rule>
- </Style>
- <Style name="beta">
- <Rule>
- <MarkersSymbolizer file="shape://ellipse" allow-overlap="false" width="20" height="20" placement="line" spacing="20"/>
- <LineSymbolizer stroke-width="0.2" stroke="#ff0000" />
- </Rule>
- </Style>
- <Style name="gamma">
- <Rule>
- <MarkersSymbolizer file="shape://ellipse" allow-overlap="false" width="20" height="20" placement="line" spacing="15"/>
- <LineSymbolizer stroke-width="0.2" stroke="#ff0000" />
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/marker-on-line.xml b/tests/visual_tests/styles/marker-on-line.xml
deleted file mode 100644
index 42f67a4..0000000
--- a/tests/visual_tests/styles/marker-on-line.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<Map>
-<Style name="line" filter-mode="first" >
- <Rule>
- <LineSymbolizer stroke="#000000" />
- </Rule>
-</Style>
-<Style name="point-placement" filter-mode="first" >
- <Rule>
- <MarkersSymbolizer placement="point" marker-type="ellipse" fill="blue" />
- <DebugSymbolizer />
- </Rule>
-</Style>
-<Layer name="carto_tests">
- <StyleName>line</StyleName>
- <StyleName>point-placement</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/marker-on-line.csv</Parameter>
- <Parameter name="separator">|</Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/styles/marker-path-expression.xml b/tests/visual_tests/styles/marker-path-expression.xml
deleted file mode 100644
index 561edc2..0000000
--- a/tests/visual_tests/styles/marker-path-expression.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="ellipse">
- <Rule>
- <MarkersSymbolizer file="../../data/svg/[FILENAME].[FILETYPE]" />
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>ellipse</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y,FILENAME,FILETYPE
-2.5,2.5,rect2,svg
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- <DebugSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/marker-recenter-collide.xml b/tests/visual_tests/styles/marker-recenter-collide.xml
deleted file mode 100644
index 3f22b24..0000000
--- a/tests/visual_tests/styles/marker-recenter-collide.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="point">
- <Rule>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" dx="[offset]" dy="[offset]">"I"</TextSymbolizer>
- <MarkersSymbolizer file="shape://arrow"/>
- <DebugSymbolizer/>
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>point</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- lat,lon,offset
- 0,-0.35,10
- 0,0.35,0
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/marker-svg-empty-g-element.xml b/tests/visual_tests/styles/marker-svg-empty-g-element.xml
deleted file mode 100644
index 8fe2464..0000000
--- a/tests/visual_tests/styles/marker-svg-empty-g-element.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<Map srs="+init=epsg:4326">
-
- <Style name="svg">
- <Rule>
- <MarkersSymbolizer file="../../data/svg/place-of-worship-24.svg"/>
- </Rule>
- </Style>
-
- <Layer name="svg" srs="+init=epsg:4326">
- <StyleName>svg</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-2.5,2.5
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- <DebugSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+init=epsg:4326">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/marker-svg-opacity.xml b/tests/visual_tests/styles/marker-svg-opacity.xml
deleted file mode 100644
index 43a0046..0000000
--- a/tests/visual_tests/styles/marker-svg-opacity.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="ellipse">
- <Rule>
- <Filter>[id]=1</Filter>
- <MarkersSymbolizer file="../../data/svg/rect2.svg" />
- </Rule>
- <Rule>
- <Filter>[id]=2</Filter>
- <MarkersSymbolizer opacity=".5" file="../../data/svg/rect2.svg" />
- </Rule>
- <Rule>
- <Filter>[id]=3</Filter>
- <MarkersSymbolizer fill-opacity=".5" file="../../data/svg/rect2.svg" />
- </Rule>
- <Rule>
- <Filter>[id]=4</Filter>
- <MarkersSymbolizer stroke-opacity=".5" file="../../data/svg/rect2.svg" />
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>ellipse</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y,id
-1,1,1
-2,2,2
-3,3,3
-4,4,4
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/marker-svg-opacity2.xml b/tests/visual_tests/styles/marker-svg-opacity2.xml
deleted file mode 100644
index 620b491..0000000
--- a/tests/visual_tests/styles/marker-svg-opacity2.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<Map srs="+init=epsg:4326" background-color="black">
-
- <Style name="svg">
- <Rule>
- <MarkersSymbolizer file="../../data/svg/box.svg"/>
- </Rule>
- </Style>
-
- <Layer name="svg" srs="+init=epsg:4326">
- <StyleName>svg</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-2.5,2.5
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+init=epsg:4326">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/marker-symbolizer-expressions-all.xml b/tests/visual_tests/styles/marker-symbolizer-expressions-all.xml
deleted file mode 100644
index f488668..0000000
--- a/tests/visual_tests/styles/marker-symbolizer-expressions-all.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<Map
- background-color="#eee"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="bug">
- <Rule>
- <Filter>[id] = 'file'</Filter>
- <MarkersSymbolizer file="[value]" />
- </Rule>
- <Rule>
- <Filter>[id] = 'allow-overlap'</Filter>
- <MarkersSymbolizer allow-overlap="[value]" file="../../data/images/crosshair16x16.png" />
- </Rule>
- <Rule>
- <Filter>[id] = 'opacity'</Filter>
- <MarkersSymbolizer opacity="[value]" file="../../data/images/crosshair16x16.png" />
- </Rule>
- <Rule>
- <Filter>[id] = 'transform'</Filter>
- <MarkersSymbolizer transform="scale([value],[value])" file="../../data/images/crosshair16x16.png" />
- </Rule>
- <Rule>
- <Filter>[id] = 'ignore-placement'</Filter>
- <MarkersSymbolizer ignore-placement="[value]" file="../../data/images/crosshair16x16.png" />
- </Rule>
- <Rule>
- <Filter>[id] = 'comp-op'</Filter>
- <MarkersSymbolizer comp-op="[value]" file="../../data/images/crosshair16x16.png" />
- </Rule>
- <Rule>
- <TextSymbolizer dy='-20' face-name='DejaVu Sans Book' halo-fill='#ffffff' halo-radius='1'>[id]</TextSymbolizer>
- <DebugSymbolizer />
- </Rule>
- </Style>
-
- <Style name="frame">
- <Rule>
- <PolygonSymbolizer />
- </Rule>
- </Style>
-
- <!--
- frame is a layer with a single polygon that is used to ensure that m.zoom_all() will zoom the
- map to a reasonable bounding extent to make the test easy to view with tools like nik2img.py
- (which calls m.zoom_all() by default). Another approach in >= Mapnik 2.3.x is to just sent a
- manual `extent` for the CSV datasource.
- -->
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt|name
-Polygon((-180.0 -125.0, -180.0 125.0, 180.0 125.0, 180.0 -125.0, -180.0 -125.0))|bounds
- </Parameter>
- </Datasource>
- </Layer>
-
- <!--
- "bug" is a layer that should provide sample data that triggers the bug in question. It is
- listed after the "frame" layer so that it renders on top and is visible.
- -->
-
- <Layer name="bug" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>bug</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-id|value|wkt
-file|../../data/images/crosshair16x16.png|Point(-130 -70)
-allow-overlap|true|Point(0 -70)
-opacity|.5|Point(130 -70)
-transform|1.2|Point(-130 30)
-ignore-placement|true|Point(0 30)
-comp-op|src-over|Point(130 30)
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/marker-vs-point.xml b/tests/visual_tests/styles/marker-vs-point.xml
deleted file mode 100644
index 361f43e..0000000
--- a/tests/visual_tests/styles/marker-vs-point.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
- background-color="green"
- background-image-opacity="0.8"
- background-image-comp-op="screen"
- background-image="../data/pattern.png">
-
- <Style name="markers">
- <Rule>
- <MarkersSymbolizer
- width="60"
- height="60"
- file="../../data/svg/transparent_circle.svg"
- />
- </Rule>
- </Style>
-
- <Style name="points">
- <Rule>
- <PointSymbolizer
- file="../../data/svg/transparent_circle.svg"
- />
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>markers</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
--2.5,3
--2.5,0
--2.5,-3
- </Parameter>
- </Datasource>
- </Layer>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>points</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-2.5,3
-2.5,0
-2.5,-3
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- <DebugSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
--5,-5
-5,-5
--5,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/marker-whole-multi-polygon.xml b/tests/visual_tests/styles/marker-whole-multi-polygon.xml
deleted file mode 100644
index 110ef7f..0000000
--- a/tests/visual_tests/styles/marker-whole-multi-polygon.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <Style name="style">
- <Rule>
- <PolygonSymbolizer fill="white"/>
- <MarkersSymbolizer width="10" stroke-width="0" fill="yellow" allow-overlap="true" ignore-placement="true" multi-policy="each"/>
- <MarkersSymbolizer width="5" stroke-width="0" fill="green" allow-overlap="true" ignore-placement="true" multi-policy="whole"/>
- <MarkersSymbolizer width="3" stroke-width="0" fill="red" allow-overlap="true" ignore-placement="true" multi-policy="largest"/>
- </Rule>
- </Style>
- <Layer name="world" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/world_merc</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/marker-with-background-image-and-hsla-transform.xml b/tests/visual_tests/styles/marker-with-background-image-and-hsla-transform.xml
deleted file mode 100644
index 96a0756..0000000
--- a/tests/visual_tests/styles/marker-with-background-image-and-hsla-transform.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-image="../../data/images/checker.jpg">
-
- <Style name="ellipse"
- direct-image-filters="scale-hsla(0,1,0,1,0,1,0,.5)"
- image-filters="scale-hsla(.1,.9,.5,1,.5,1,.2,1)"
- >
- <Rule>
- <MarkersSymbolizer
- width="240"
- height="240"
- fill="steelblue"
- fill-opacity=".7"
- stroke="yellow"
- stroke-width="16"
- stroke-opacity=".3"
- />
- <MarkersSymbolizer
- width="100"
- opacity=".5"
- fill="darkorange"
- comp-op="multiply"
- transform="skewX(50)"
- allow-overlap="true"
- />
- <MarkersSymbolizer
- width="100"
- opacity=".5"
- fill="darkred"
- comp-op="color-burn"
- transform="skewX(-50)"
- allow-overlap="true"
- />
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>ellipse</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-2.5,2.5
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/marker-with-background-image-linear-comp-op.xml b/tests/visual_tests/styles/marker-with-background-image-linear-comp-op.xml
deleted file mode 100644
index 58df8a1..0000000
--- a/tests/visual_tests/styles/marker-with-background-image-linear-comp-op.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-image="../../data/images/checker.jpg">
-
- <Style name="ellipse">
- <Rule>
- <MarkersSymbolizer
- width="240"
- height="240"
- fill="white"
- fill-opacity=".7"
- comp-op="linear-dodge"
- stroke="yellow"
- stroke-width="16"
- stroke-opacity=".3"
- />
- <MarkersSymbolizer
- width="100"
- opacity=".5"
- fill="white"
- comp-op="divide"
- transform="skewX(50)"
- allow-overlap="true"
- />
- <MarkersSymbolizer
- width="100"
- opacity=".5"
- fill="white"
- comp-op="linear-burn"
- transform="skewX(-50)"
- allow-overlap="true"
- />
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>ellipse</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-2.5,2.5
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/marker-with-background-image.xml b/tests/visual_tests/styles/marker-with-background-image.xml
deleted file mode 100644
index 9eff84b..0000000
--- a/tests/visual_tests/styles/marker-with-background-image.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-image="../../data/images/checker.jpg">
-
- <Style name="ellipse">
- <Rule>
- <MarkersSymbolizer
- width="240"
- height="240"
- fill="steelblue"
- fill-opacity=".7"
- stroke="yellow"
- stroke-width="16"
- stroke-opacity=".3"
- />
- <MarkersSymbolizer
- width="100"
- opacity=".5"
- fill="darkorange"
- comp-op="multiply"
- transform="skewX(50)"
- allow-overlap="true"
- />
- <MarkersSymbolizer
- width="100"
- opacity=".5"
- fill="darkred"
- comp-op="color-burn"
- transform="skewX(-50)"
- allow-overlap="true"
- />
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>ellipse</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-2.5,2.5
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/marker_line_placement_on_points.xml b/tests/visual_tests/styles/marker_line_placement_on_points.xml
deleted file mode 100644
index cd6f6ee..0000000
--- a/tests/visual_tests/styles/marker_line_placement_on_points.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
-
- <Style name="1">
- <Rule>
- <Filter>[id]=1</Filter>
- <MarkersSymbolizer fill="darkgreen" opacity=".7" width="15" height="10" stroke="green" stroke-width="7" stroke-opacity=".2" placement="line" marker-type="ellipse"/>
- </Rule>
- <Rule>
- <Filter>[id]=2</Filter>
- <MarkersSymbolizer fill="darkorange" opacity=".7" width="20" height="10" stroke="orange" stroke-width="7" stroke-opacity=".2" placement="line" marker-type="ellipse"/>
- </Rule>
- <Rule>
- <Filter>[id]=3</Filter>
- <MarkersSymbolizer fill="darkred" opacity=".7" width="20" height="10" stroke="orange" stroke-width="7" stroke-opacity=".2" placement="line" marker-type="ellipse"/>
- </Rule>
- </Style>
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- x,y,id
- 0,0,1
- 5,0,1
- 5,5,1
- 0,5,1
- 2.5,2.5,2
- 2.5,3,3
- 2.5,2,3
- 3,2.5,3
- 2,2.5,3
- </Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/orientation.xml b/tests/visual_tests/styles/orientation.xml
deleted file mode 100644
index e0e283b..0000000
--- a/tests/visual_tests/styles/orientation.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[nr] = 1</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" orientation="45">"XYZ"</TextSymbolizer>
- <PointSymbolizer allow-overlap="true"/>
- </Rule>
- <Rule>
- <Filter>[nr] = 2</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" orientation="90">"XYZ"</TextSymbolizer>
- <PointSymbolizer allow-overlap="true"/>
- </Rule>
- <Rule>
- <Filter>[nr] = 3</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" orientation="180">"XYZ"</TextSymbolizer>
- <PointSymbolizer allow-overlap="true"/>
- </Rule>
- <Rule>
- <Filter>[nr] = 4</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" orientation="45" dy="10">"Line
break"</TextSymbolizer>
- <PointSymbolizer allow-overlap="true"/>
- </Rule>
- <Rule>
- <Filter>[nr] = 5</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" orientation="45" dy="10">"XYZ"</TextSymbolizer>
- <PointSymbolizer allow-overlap="true"/>
- </Rule>
- <Rule>
- <Filter>[nr] = 6</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" orientation="90" dy="10">"XYZ"</TextSymbolizer>
- <PointSymbolizer allow-overlap="true"/>
- </Rule>
- <Rule>
- <Filter>[nr] = 7</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" orientation="180" dy="10">"XYZ"</TextSymbolizer>
- <PointSymbolizer allow-overlap="true"/>
- </Rule>
- <Rule>
- <Filter>[nr] = 8</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" orientation="0" horizontal-alignment="right" vertical-alignment="top" rotate-displacement="true">"XYZ"</TextSymbolizer>
- <PointSymbolizer allow-overlap="true"/>
- </Rule>
- <Rule>
- <Filter>[nr] = 9</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" orientation="90" horizontal-alignment="right" vertical-alignment="top" rotate-displacement="true">"XYZ"</TextSymbolizer>
- <PointSymbolizer allow-overlap="true"/>
- </Rule>
- <Rule>
- <Filter>[nr] = 10</Filter>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" orientation="180" horizontal-alignment="right" vertical-alignment="top" rotate-displacement="true">"XYZ"</TextSymbolizer>
- <PointSymbolizer allow-overlap="true"/>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/point-symbolizer-expressions-all.xml b/tests/visual_tests/styles/point-symbolizer-expressions-all.xml
deleted file mode 100644
index e9cf2a1..0000000
--- a/tests/visual_tests/styles/point-symbolizer-expressions-all.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<Map
- background-color="#eee"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="bug">
- <Rule>
- <Filter>[id] = 'file'</Filter>
- <PointSymbolizer file="[value]" />
- </Rule>
- <Rule>
- <Filter>[id] = 'allow-overlap'</Filter>
- <PointSymbolizer allow-overlap="[value]" file="../../data/images/crosshair16x16.png" />
- </Rule>
- <Rule>
- <Filter>[id] = 'opacity'</Filter>
- <PointSymbolizer opacity="[value]" file="../../data/images/crosshair16x16.png" />
- </Rule>
- <Rule>
- <Filter>[id] = 'transform'</Filter>
- <PointSymbolizer transform="scale([value],[value])" file="../../data/images/crosshair16x16.png" />
- </Rule>
- <Rule>
- <Filter>[id] = 'ignore-placement'</Filter>
- <PointSymbolizer ignore-placement="[value]" file="../../data/images/crosshair16x16.png" />
- </Rule>
- <Rule>
- <Filter>[id] = 'comp-op'</Filter>
- <PointSymbolizer comp-op="[value]" file="../../data/images/crosshair16x16.png" />
- </Rule>
- <Rule>
- <TextSymbolizer dy='-16' face-name='DejaVu Sans Book' halo-fill='#ffffff' halo-radius='1'>[id]</TextSymbolizer>
- </Rule>
- </Style>
-
- <Style name="frame">
- <Rule>
- <PolygonSymbolizer />
- </Rule>
- </Style>
-
- <!--
- frame is a layer with a single polygon that is used to ensure that m.zoom_all() will zoom the
- map to a reasonable bounding extent to make the test easy to view with tools like nik2img.py
- (which calls m.zoom_all() by default). Another approach in >= Mapnik 2.3.x is to just sent a
- manual `extent` for the CSV datasource.
- -->
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt|name
-Polygon((-180.0 -125.0, -180.0 125.0, 180.0 125.0, 180.0 -125.0, -180.0 -125.0))|bounds
- </Parameter>
- </Datasource>
- </Layer>
-
- <!--
- "bug" is a layer that should provide sample data that triggers the bug in question. It is
- listed after the "frame" layer so that it renders on top and is visible.
- -->
-
- <Layer name="bug" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>bug</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-id|value|wkt
-file|../../data/images/crosshair16x16.png|Point(-130 -70)
-allow-overlap|true|Point(0 -70)
-opacity|.5|Point(130 -70)
-transform|1.2|Point(-130 30)
-ignore-placement|true|Point(0 30)
-comp-op|src-over|Point(130 30)
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/point-symbolizer-expressions.xml b/tests/visual_tests/styles/point-symbolizer-expressions.xml
deleted file mode 100644
index bab6fb9..0000000
--- a/tests/visual_tests/styles/point-symbolizer-expressions.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<Map
- background-color="#eee"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="bug">
- <Rule>
- <Filter>[id] = 'file'</Filter>
- <PointSymbolizer file="[value]" />
- </Rule>
-
- <Rule>
- <TextSymbolizer dy='-16' face-name='DejaVu Sans Book' halo-fill='#ffffff' halo-radius='1'>[id]</TextSymbolizer>
- </Rule>
- </Style>
-
- <Style name="frame">
- <Rule>
- <PolygonSymbolizer />
- </Rule>
- </Style>
-
- <!--
- frame is a layer with a single polygon that is used to ensure that m.zoom_all() will zoom the
- map to a reasonable bounding extent to make the test easy to view with tools like nik2img.py
- (which calls m.zoom_all() by default). Another approach in >= Mapnik 2.3.x is to just sent a
- manual `extent` for the CSV datasource.
- -->
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt|name
-Polygon((-180.0 -125.0, -180.0 125.0, 180.0 125.0, 180.0 -125.0, -180.0 -125.0))|bounds
- </Parameter>
- </Datasource>
- </Layer>
-
- <!--
- "bug" is a layer that should provide sample data that triggers the bug in question. It is
- listed after the "frame" layer so that it renders on top and is visible.
- -->
-
- <Layer name="bug" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>bug</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-id|value|wkt
-file|../../data/images/crosshair16x16.png|Point(-130 -70)
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/point-symbolizer-overlap-placement-expr.xml b/tests/visual_tests/styles/point-symbolizer-overlap-placement-expr.xml
deleted file mode 100644
index e39d56e..0000000
--- a/tests/visual_tests/styles/point-symbolizer-overlap-placement-expr.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <FontSet name="book">
- <Font face-name="DejaVu Sans Book"/>
- </FontSet>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
-<Parameter name="inline">
-lat,long,overlap,placement
- 0.33,-0.36,noexpr-true,noexpr-false
- 0.33,-0.34,noexpr-true,noexpr-false
- 0.33,-0.13,noexpr-false,noexpr-false
- 0.33,-0.11,noexpr-false,noexpr-false
- 0.33, 0.10,noexpr-true,noexpr-false
- 0.33, 0.12,noexpr-false,noexpr-false
- 0.33, 0.34,noexpr-false,noexpr-false
- 0.33, 0.36,noexpr-true,noexpr-false
-
- 0.11,-0.36,true,false
- 0.11,-0.34,true,false
- 0.11,-0.13,false,false
- 0.11,-0.11,false,false
- 0.11, 0.10,true,false
- 0.11, 0.12,false,false
- 0.11, 0.34,false,false
- 0.11, 0.36,true,false
-
--0.11,-0.36,noexpr-false,noexpr-true
--0.11,-0.34,noexpr-false,noexpr-true
--0.11,-0.13,noexpr-false,noexpr-false
--0.11,-0.11,noexpr-false,noexpr-false
--0.11, 0.10,noexpr-false,noexpr-true
--0.11, 0.12,noexpr-false,noexpr-false
--0.11, 0.34,noexpr-false,noexpr-false
--0.11, 0.36,noexpr-false,noexpr-true
-
--0.33,-0.36,false,true
--0.33,-0.34,false,true
--0.33,-0.13,false,false
--0.33,-0.11,false,false
--0.33, 0.10,false,true
--0.33, 0.12,false,false
--0.33, 0.34,false,false
--0.33, 0.36,false,true
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style" filter-mode="first">
- <Rule>
- <Filter>[overlap] = "noexpr-true" and [placement] = "noexpr-true"</Filter>
- <PointSymbolizer allow-overlap="true" ignore-placement="true" file="../../data/svg/point_sm.svg" />
- </Rule>
- <Rule>
- <Filter>[overlap] = "noexpr-true" and [placement] = "noexpr-false"</Filter>
- <PointSymbolizer allow-overlap="true" ignore-placement="false" file="../../data/svg/point_sm.svg" />
- </Rule>
- <Rule>
- <Filter>[overlap] = "noexpr-false" and [placement] = "noexpr-false"</Filter>
- <PointSymbolizer allow-overlap="false" ignore-placement="false" file="../../data/svg/point_sm.svg" />
- </Rule>
- <Rule>
- <Filter>[overlap] = "noexpr-false" and [placement] = "noexpr-true"</Filter>
- <PointSymbolizer allow-overlap="false" ignore-placement="true" file="../../data/svg/point_sm.svg" />
- </Rule>
- <Rule>
- <PointSymbolizer allow-overlap="[overlap]" ignore-placement="[placement]" file="../../data/svg/point_sm.svg" />
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/polygon-symbolizer-expressions-all.xml b/tests/visual_tests/styles/polygon-symbolizer-expressions-all.xml
deleted file mode 100644
index e80d67b..0000000
--- a/tests/visual_tests/styles/polygon-symbolizer-expressions-all.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<Map
- background-color="#eee"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="bug">
- <Rule>
- <Filter>[id] = 'fill'</Filter>
- <PolygonSymbolizer fill='[value]' />
- </Rule>
- <Rule>
- <Filter>[id] = 'fill-opacity'</Filter>
- <PolygonSymbolizer fill='#0000ff' fill-opacity='[value]' />
- </Rule>
- <Rule>
- <Filter>[id] = 'gamma'</Filter>
- <PolygonSymbolizer fill='#0000ff' gamma='[value]' />
- </Rule>
- <Rule>
- <Filter>[id] = 'comp-op'</Filter>
- <PolygonSymbolizer fill='#0000ff' comp-op='[value]' />
- </Rule>
-
- <Rule>
- <TextSymbolizer face-name='DejaVu Sans Book' halo-fill='#ffffff' halo-radius='1'>[id]</TextSymbolizer>
- </Rule>
- </Style>
-
- <Style name="frame">
- <Rule>
- <PolygonSymbolizer />
- </Rule>
- </Style>
-
- <!--
- frame is a layer with a single polygon that is used to ensure that m.zoom_all() will zoom the
- map to a reasonable bounding extent to make the test easy to view with tools like nik2img.py
- (which calls m.zoom_all() by default). Another approach in >= Mapnik 2.3.x is to just sent a
- manual `extent` for the CSV datasource.
- -->
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt|name
-Polygon((-180.0 -125.0, -180.0 125.0, 180.0 125.0, 180.0 -125.0, -180.0 -125.0))|bounds
- </Parameter>
- </Datasource>
- </Layer>
-
- <!--
- "bug" is a layer that should provide sample data that triggers the bug in question. It is
- listed after the "frame" layer so that it renders on top and is visible.
- -->
-
- <Layer name="bug" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>bug</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-id|value|wkt
-fill|#0000ff|Polygon((-160 -120,-20 -120,-40 -80,-100 -90,-160 -120))
-fill-opacity|0.5|Polygon((-160 -70,-20 -70,-40 -30,-100 -40,-160 -70))
-gamma|1.0|Polygon((-160 -20,-20 -20,-40 20,-100 10,-160 -20))
-comp-op|minus|Polygon((-160 30,-20 30,-40 70,-100 60,-160 30))
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/polygon-symbolizer-expressions.xml b/tests/visual_tests/styles/polygon-symbolizer-expressions.xml
deleted file mode 100644
index 916f30a..0000000
--- a/tests/visual_tests/styles/polygon-symbolizer-expressions.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<Map
- background-color="#eee"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="bug">
- <Rule>
- <Filter>[id] = 'fill'</Filter>
- <PolygonSymbolizer fill='[value]' />
- </Rule>
- <Rule>
- <Filter>[id] = 'fill-opacity'</Filter>
- <PolygonSymbolizer fill='#0000ff' fill-opacity='[value]' />
- </Rule>
- <Rule>
- <Filter>[id] = 'gamma'</Filter>
- <PolygonSymbolizer fill='#0000ff' gamma='[value]' />
- </Rule>
-
- <Rule>
- <TextSymbolizer face-name='DejaVu Sans Book' halo-fill='#ffffff' halo-radius='1'>[id]</TextSymbolizer>
- </Rule>
- </Style>
-
- <Style name="frame">
- <Rule>
- <PolygonSymbolizer />
- </Rule>
- </Style>
-
- <!--
- frame is a layer with a single polygon that is used to ensure that m.zoom_all() will zoom the
- map to a reasonable bounding extent to make the test easy to view with tools like nik2img.py
- (which calls m.zoom_all() by default). Another approach in >= Mapnik 2.3.x is to just sent a
- manual `extent` for the CSV datasource.
- -->
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt|name
-Polygon((-180.0 -125.0, -180.0 125.0, 180.0 125.0, 180.0 -125.0, -180.0 -125.0))|bounds
- </Parameter>
- </Datasource>
- </Layer>
-
- <!--
- "bug" is a layer that should provide sample data that triggers the bug in question. It is
- listed after the "frame" layer so that it renders on top and is visible.
- -->
-
- <Layer name="bug" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>bug</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-id|value|wkt
-fill|#0000ff|Polygon((-160 -120,-20 -120,-40 -80,-100 -90,-160 -120))
-fill-opacity|0.5|Polygon((-160 -70,-20 -70,-40 -30,-100 -40,-160 -70))
-gamma|1.0|Polygon((-160 -20,-20 -20,-40 20,-100 10,-160 -20))
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/polygon-winding-order.xml b/tests/visual_tests/styles/polygon-winding-order.xml
deleted file mode 100644
index e949e7d..0000000
--- a/tests/visual_tests/styles/polygon-winding-order.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<Map
- background-color="#000"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="polygon">
- <Rule>
- <PolygonSymbolizer fill="#800000" />
- <LineSymbolizer stroke="#ff0000" stroke-width="2" offset="4" />
- </Rule>
- </Style>
-
- <Style name="frame">
- <Rule>
- <PolygonSymbolizer />
- </Rule>
- </Style>
- <!--
- frame is a layer with a single polygon that is used to ensure that
- m.zoom_all() will zoom the map to a reasonable bounding extent
- -->
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-wkt|name
-Polygon((-75.0 -75.0, -75.0 75.0, 35.0 75.0, 35.0 -75.0, -75.0 -75.0))|bounds
- </Parameter>
- </Datasource>
- </Layer>
-
- <!--
- The inline GeoJSON has two polygons with different winding order
- (clockwise and counterclockwise), and each of those has two inner rings
- (again, one clockwise and one counterclockwise)
- -->
-
- <Layer name="bug" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>polygon</StyleName>
- <Datasource>
- <Parameter name="type">geojson</Parameter>
- <Parameter name="inline">{
-"type": "FeatureCollection",
-"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
-
-"features": [
-{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates":
- [ [ [ 30, -20 ], [ -70, -20 ], [ -70, -70 ], [ 30, -70 ], [ 30, -20 ] ],
- [ [ -60, -30 ], [ -30, -30 ], [ -30, -60 ], [ -60, -60 ], [ -60, -30 ] ],
- [ [ -10, -30 ], [ -10, -60 ], [ 20, -60 ], [ 20, -30 ], [ -10, -30 ] ]
- ] } },
-{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates":
- [ [ [ -70, 70 ], [ 30, 70 ], [ 30, 20 ], [ -70, 20 ], [ -70, 70 ] ],
- [ [ -60, 60 ], [ -30, 60 ], [ -30, 30 ], [ -60, 30 ], [ -60, 60 ] ],
- [ [ 20, 30 ], [ 20, 60 ], [ -10, 60 ], [ -10, 30 ], [ 20, 30 ] ]
- ] } }
-]
-}</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/postgis-inline.xml b/tests/visual_tests/styles/postgis-inline.xml
deleted file mode 100644
index 7b24b72..0000000
--- a/tests/visual_tests/styles/postgis-inline.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<Map srs="+init=epsg:3857" maximum-extent="-20037508.34,-20037508.34,20037508.34,20037508.34">
-<Style name="carto_tests" filter-mode="first" >
- <Rule>
- <LineSymbolizer stroke="[stroke]" />
- <TextSymbolizer
- size="[size]"
- fill="[fill]"
- placement="[placement]"
- face-name="DejaVu Sans Book"
- halo-radius="[halo_radius]"
- placement-type="list">
- [name]
- <Placement>[abbr1]</Placement>
- <Placement>[abbr2]</Placement>
- <Placement>[abbr3]</Placement>
- </TextSymbolizer>
- </Rule>
-</Style>
-<Layer name="carto_tests"
- srs="+init=epsg:3857" status="on">
- <StyleName>carto_tests</StyleName>
- <Datasource>
- <Parameter name="type"><![CDATA[postgis]]></Parameter>
- <Parameter name="dbname">template_postgis</Parameter>
- <Parameter name="extent_from_subquery">true</Parameter>
- <Parameter name="simplify"><![CDATA[true]]></Parameter>
- <Parameter name="geometry_field"><![CDATA[geom]]></Parameter>
- <Parameter name="srid"><![CDATA[3857]]></Parameter>
- <Parameter name="table"><![CDATA[
- (SELECT
- 'name' as name,
- 'abbr1' as abbr1,
- 'abbr2' as abbr2,
- 'abbr3' as abbr3,
- '#000000' as stroke,
- 9 as size,
- '#000000' as fill,
- 'line' as placement,
- 1 as halo_radius,
- (ST_Dump('0102000020E61000009D0000005C8FC2753A6345418FC2F5907E246041A4703D4A0963454152B81E858424604114AE47C100634541CDCCCCEC84246041A4703DAAC46245413333339386246041B81E856BB862454114AE47A98724604185EB5178AD624541AE47E15A8924604152B81EC5A4624541666666EE8B2460416666664696624541000000D8902460413333333385624541D7A370F5952460415C8FC2157A62454185EB51609824604152B81E256062454148E17AA49C24604114AE47A12B62454166666656A424604152B81EA51C6245417B14AE4FA6246041B81E85CB0E6245418FC2F550A [...]
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/raster-color-to-alpha1.xml b/tests/visual_tests/styles/raster-color-to-alpha1.xml
deleted file mode 100644
index 5a66751..0000000
--- a/tests/visual_tests/styles/raster-color-to-alpha1.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over"
->
-
-<Style name="style" image-filters="color-to-alpha(#00BDFF)">
- <Rule>
- <RasterSymbolizer opacity="1"/>
- </Rule>
-</Style>
-<Layer name="raster"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <Datasource>
- <!-- https://github.com/mapnik/mapnik/issues/1471 -->
- <Parameter name="file">../../data/raster/nodata-edge.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/raster-color-to-alpha2.xml b/tests/visual_tests/styles/raster-color-to-alpha2.xml
deleted file mode 100644
index cd0206e..0000000
--- a/tests/visual_tests/styles/raster-color-to-alpha2.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over"
- background-color="steelblue"
->
-
-<Style name="style" image-filters="color-to-alpha(#BCDAF5)">
- <Rule>
- <RasterSymbolizer opacity="1" scaling="quadric"/>
- </Rule>
-</Style>
-<Layer name="raster"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <Datasource>
- <!-- https://github.com/mapnik/mapnik/issues/1471 -->
- <Parameter name="file">../../data/raster/river_merc.tiff</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/raster-color-to-alpha3.xml b/tests/visual_tests/styles/raster-color-to-alpha3.xml
deleted file mode 100644
index 393e506..0000000
--- a/tests/visual_tests/styles/raster-color-to-alpha3.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over"
- background-color="steelblue"
->
-
-<Style name="style" image-filters="color-to-alpha(black)">
- <Rule>
- <RasterSymbolizer opacity="1" scaling="quadric"/>
- </Rule>
-</Style>
-<Layer name="raster"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <Datasource>
- <!-- https://github.com/mapnik/mapnik/issues/1471 -->
- <Parameter name="file">../../data/raster/transp.tiff</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/raster-color-to-alpha4.xml b/tests/visual_tests/styles/raster-color-to-alpha4.xml
deleted file mode 100644
index 40fbdc0..0000000
--- a/tests/visual_tests/styles/raster-color-to-alpha4.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<Map background-color="white" srs="+init=epsg:32630" minimum-version="0.7.2">
-
- <Style name="DISCRETE RAINBOW" direct-image-filters="color-to-alpha(white)" image-filters="color-to-alpha(yellow),color-to-alpha(blue)">
- <Rule>
- <RasterSymbolizer>
- <RasterColorizer default-mode="discrete" default-color="white">
- <stop color="red" value="0"/>
- <stop color="orange" value="5"/>
- <stop color="yellow" value="10"/>
- <stop color="green" value="15"/>
- <stop color="blue" value="20"/>
- <stop color="indigo" value="25"/>
- </RasterColorizer>
- </RasterSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="dataraster" srs="+init=epsg:32630">
- <StyleName>DISCRETE RAINBOW</StyleName>
- <Datasource>
- <Parameter name="file">../../data/raster/dataraster.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- <Parameter name="band">1</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/raster-color-to-alpha5.xml b/tests/visual_tests/styles/raster-color-to-alpha5.xml
deleted file mode 100644
index 6a2f4ad..0000000
--- a/tests/visual_tests/styles/raster-color-to-alpha5.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<Map background-color="white" srs="+init=epsg:32630" minimum-version="0.7.2">
-
- <Style name="DISCRETE RAINBOW" image-filters="color-to-alpha(black)">
- <Rule>
- <RasterSymbolizer>
- <RasterColorizer default-mode="discrete" default-color="white">
- <stop color="red" value="0"/>
- <stop color="orange" value="5"/>
- <stop color="yellow" value="10"/>
- <stop color="green" value="15"/>
- <stop color="blue" value="20"/>
- <stop color="indigo" value="25"/>
- </RasterColorizer>
- </RasterSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="dataraster" srs="+init=epsg:32630">
- <StyleName>DISCRETE RAINBOW</StyleName>
- <Datasource>
- <Parameter name="file">../../data/raster/dataraster.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- <Parameter name="band">1</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/raster_colorizer.xml b/tests/visual_tests/styles/raster_colorizer.xml
deleted file mode 100644
index 8c1c918..0000000
--- a/tests/visual_tests/styles/raster_colorizer.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<Map background-color="white" srs="+init=epsg:32630" minimum-version="0.7.2">
-
-<!-- blue yellow orange indigo green red transparent black white -->
-
- <Style name="DISCRETE RAINBOW">
- <Rule>
- <RasterSymbolizer>
- <RasterColorizer default-mode="discrete" default-color="white">
- <stop color="red" value="0"/>
- <stop color="orange" value="5"/>
- <stop color="yellow" value="10"/>
- <stop color="green" value="15"/>
- <stop color="blue" value="20"/>
- <stop color="indigo" value="25"/>
- </RasterColorizer>
- </RasterSymbolizer>
- </Rule>
- </Style>
-
- <Style name="LINEAR BLEND">
- <Rule>
- <RasterSymbolizer>
- <RasterColorizer default-mode="discrete" default-color="white">
- <stop color="#222222" value="0" mode="linear"/>
- <stop color="#EEEEEE" value="25"/>
- </RasterColorizer>
- </RasterSymbolizer>
- </Rule>
- </Style>
-
- <Style name="BANDED">
- <Rule>
- <RasterSymbolizer>
- <RasterColorizer default-mode="discrete" default-color="white">
- <stop color="red" value="0" mode="exact"/>
- <stop color="orange" value="2" mode="exact"/>
- <stop color="yellow" value="4" mode="exact"/>
- <stop color="green" value="6" mode="exact"/>
- <stop color="blue" value="8" mode="exact"/>
- <stop color="indigo" value="10" mode="exact"/>
- <stop color="violet" value="12" mode="exact"/>
- </RasterColorizer>
- </RasterSymbolizer>
- </Rule>
- </Style>
-
- <Style name="MIXED">
- <Rule>
- <RasterSymbolizer>
- <RasterColorizer default-mode="discrete" default-color="white">
- <stop color="red" value="0"/>
- <stop color="orange" value="5"/>
- <stop color="yellow" value="10" mode="exact"/>
- <stop color="green" value="13" mode="exact"/>
- <stop color="#222222" value="15" mode="linear"/>
- <stop color="#EEEEEE" value="25"/>
- </RasterColorizer>
- </RasterSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="dataraster" srs="+init=epsg:32630">
- <StyleName>DISCRETE RAINBOW</StyleName>
- <Datasource>
- <Parameter name="file">../../data/raster/dataraster.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- <Parameter name="band">1</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/raster_symbolizer.xml b/tests/visual_tests/styles/raster_symbolizer.xml
deleted file mode 100644
index 14632b1..0000000
--- a/tests/visual_tests/styles/raster_symbolizer.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<Map background-color="white" srs="+init=epsg:32630" minimum-version="0.7.2">
-
- <Style name="two-value">
- <Rule>
- <RasterSymbolizer opacity="1">
- <RasterColorizer default-mode="discrete" default-color="#000000">
- <stop value="0" color="yellow"/>
- <stop value="26" color="purple"/>
- </RasterColorizer>
- </RasterSymbolizer>
- </Rule>
- </Style>
-
- <Style name="ramped">
- <Rule>
- <RasterSymbolizer>
- <RasterColorizer default-mode="linear" default-color="#000000">
- <stop value="0" color="red"/>
- <stop value="26" color="green"/>
- </RasterColorizer>
- </RasterSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="dataraster" srs="+init=epsg:32630">
- <StyleName>ramped</StyleName>
- <Datasource>
- <!-- get stats on this file with gdalinfo ../raster/dataraster.tif -stats -->
- <Parameter name="file">../../data/raster/dataraster.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- <Parameter name="band">1</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/repeat-labels-1.xml b/tests/visual_tests/styles/repeat-labels-1.xml
deleted file mode 100644
index 1938a6a..0000000
--- a/tests/visual_tests/styles/repeat-labels-1.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="line">
- <Rule>
- <LineSymbolizer stroke-width="8" stroke="orange"/>
- </Rule>
- </Style>
-
- <Style name="marker">
- <Rule>
- <Filter>[type] = 'poi'</Filter>
- <MarkersSymbolizer />
- </Rule>
- </Style>
-
- <Style name="shield">
- <Rule>
- <Filter>[type] = 'motorway'</Filter>
- <ShieldSymbolizer minimum-distance="50" spacing="120" placement="line" face-name="DejaVu Sans Book" size="10" fill="white" file="../../data/svg/rect.svg" transform="scale(0.75)">[ref]</ShieldSymbolizer>
- </Rule>
- </Style>
-
- <Style name="text">
- <Rule>
- <Filter>[type] != 'poi'</Filter>
- <TextSymbolizer minimum-distance="50" spacing="70" placement="line" face-name="DejaVu Sans Book" size="12">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>line</StyleName>
- <StyleName>marker</StyleName>
- <StyleName>shield</StyleName>
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/repeat-labels.csv</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/repeat-labels-2.xml b/tests/visual_tests/styles/repeat-labels-2.xml
deleted file mode 100644
index 64b359c..0000000
--- a/tests/visual_tests/styles/repeat-labels-2.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="line">
- <Rule>
- <LineSymbolizer stroke-width="8" stroke="orange"/>
- </Rule>
- </Style>
-
- <Style name="marker">
- <Rule>
- <Filter>[type] = 'poi'</Filter>
- <MarkersSymbolizer />
- </Rule>
- </Style>
-
- <Style name="shield">
- <Rule>
- <Filter>[type] = 'motorway'</Filter>
- <ShieldSymbolizer margin="60" spacing="120" placement="line" face-name="DejaVu Sans Book" size="10" fill="white" file="../../data/svg/rect.svg" transform="scale(0.75)">[ref]</ShieldSymbolizer>
- </Rule>
- </Style>
-
- <Style name="text">
- <Rule>
- <Filter>[type] != 'poi'</Filter>
- <TextSymbolizer margin="50" spacing="70" placement="line" face-name="DejaVu Sans Book" size="12">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>line</StyleName>
- <StyleName>marker</StyleName>
- <StyleName>shield</StyleName>
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/repeat-labels.csv</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/repeat-labels-3.xml b/tests/visual_tests/styles/repeat-labels-3.xml
deleted file mode 100644
index e767c00..0000000
--- a/tests/visual_tests/styles/repeat-labels-3.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="line">
- <Rule>
- <LineSymbolizer stroke-width="8" stroke="orange"/>
- </Rule>
- </Style>
-
- <Style name="marker">
- <Rule>
- <Filter>[type] = 'poi'</Filter>
- <MarkersSymbolizer />
- </Rule>
- </Style>
-
- <Style name="shield">
- <Rule>
- <Filter>[type] = 'motorway'</Filter>
- <ShieldSymbolizer margin="0" repeat-distance="60" spacing="120" placement="line" face-name="DejaVu Sans Book" size="10" fill="white" file="../../data/svg/rect.svg" transform="scale(0.75)">[ref]</ShieldSymbolizer>
- </Rule>
- </Style>
-
- <Style name="text">
- <Rule>
- <Filter>[type] != 'poi'</Filter>
- <TextSymbolizer margin="0" repeat-distance="40" spacing="70" placement="line" face-name="DejaVu Sans Book" size="12">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>line</StyleName>
- <StyleName>marker</StyleName>
- <StyleName>shield</StyleName>
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/repeat-labels.csv</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/repeat-labels-4.xml b/tests/visual_tests/styles/repeat-labels-4.xml
deleted file mode 100644
index 88476f3..0000000
--- a/tests/visual_tests/styles/repeat-labels-4.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Style name="line">
- <Rule>
- <LineSymbolizer stroke-width="8" stroke="orange"/>
- </Rule>
- </Style>
-
- <Style name="marker">
- <Rule>
- <Filter>[type] = 'poi'</Filter>
- <MarkersSymbolizer />
- </Rule>
- </Style>
-
- <Style name="shield">
- <Rule>
- <Filter>[type] = 'motorway'</Filter>
- <ShieldSymbolizer margin="10" repeat-distance="60" spacing="120" placement="line" face-name="DejaVu Sans Book" size="10" fill="white" file="../../data/svg/rect.svg" transform="scale(0.75)">[ref]</ShieldSymbolizer>
- </Rule>
- </Style>
-
- <Style name="text">
- <Rule>
- <Filter>[type] != 'poi'</Filter>
- <TextSymbolizer margin="3" repeat-distance="40" spacing="70" placement="line" face-name="DejaVu Sans Book" size="12">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>line</StyleName>
- <StyleName>marker</StyleName>
- <StyleName>shield</StyleName>
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/repeat-labels.csv</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
diff --git a/tests/visual_tests/styles/road-casings-grouped-rendering.xml b/tests/visual_tests/styles/road-casings-grouped-rendering.xml
deleted file mode 100644
index 49b490e..0000000
--- a/tests/visual_tests/styles/road-casings-grouped-rendering.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="#dfd8c9">
-
-<Style name="marking" filter-mode="first">
- <Rule>
- <Filter>([class] = 'railways')</Filter>
- <LineSymbolizer stroke="#ffffff" stroke-width="1.8" stroke-dasharray="5, 5" />
- </Rule>
-</Style>
-<Style name="fill" filter-mode="first">
- <Rule>
- <Filter>([class] = 'minorroads')</Filter>
- <LineSymbolizer stroke-width="2.5" stroke="#ffffff" stroke-linecap="round" />
- </Rule>
- <Rule>
- <Filter>([class] = 'mainroads')</Filter>
- <LineSymbolizer stroke-width="4" stroke="#ff9999" stroke-linecap="round" />
- </Rule>
- <Rule>
- <Filter>([class] = 'motorways')</Filter>
- <LineSymbolizer stroke-width="6" stroke="#ff6666" stroke-linecap="round" />
- </Rule>
- <Rule>
- <Filter>([class] = 'railways')</Filter>
- <LineSymbolizer stroke-width="3" stroke="#333333" stroke-linecap="round" />
- </Rule>
-</Style>
-<Style name="bridge" filter-mode="first">
- <Rule>
- <Filter>([class] = 'railways') and ([bridge] = 1)</Filter>
- <LineSymbolizer stroke-width="6" stroke="#ffffff" />
- </Rule>
-</Style>
-<Style name="casing" filter-mode="first">
- <Rule>
- <Filter>([class] = 'railways') and ([bridge] = 1)</Filter>
- <LineSymbolizer stroke-width="8" stroke="#333333" />
- </Rule>
- <Rule>
- <Filter>([class] = 'minorroads')</Filter>
- <LineSymbolizer stroke-width="3" stroke="#a69269" />
- </Rule>
- <Rule>
- <Filter>([class] = 'mainroads')</Filter>
- <LineSymbolizer stroke-width="5" stroke="#ff0000" />
- </Rule>
- <Rule>
- <Filter>([class] = 'motorways')</Filter>
- <LineSymbolizer stroke-width="8" stroke="#990000" />
- </Rule>
-</Style>
-<Layer name="layer"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over"
- group-by="z"
- >
- <StyleName>casing</StyleName>
- <StyleName>bridge</StyleName>
- <StyleName>fill</StyleName>
- <StyleName>marking</StyleName>
- <Datasource>
- <Parameter name="file">../data/grouped-rendering.sqlite</Parameter>
- <Parameter name="table">(SELECT fid, geometry, type, tunnel, bridge, oneway, class, z_order, CAST((z_order / 10.0) AS INTEGER) AS z
-FROM roads ORDER BY z_order) AS road</Parameter>
- <Parameter name="type">sqlite</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/road-casings-non-grouped-rendering.xml b/tests/visual_tests/styles/road-casings-non-grouped-rendering.xml
deleted file mode 100644
index 3d29d93..0000000
--- a/tests/visual_tests/styles/road-casings-non-grouped-rendering.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="#dfd8c9">
-
-<Style name="marking" filter-mode="first">
- <Rule>
- <Filter>([class] = 'railways')</Filter>
- <LineSymbolizer stroke="#ffffff" stroke-width="1.8" stroke-dasharray="5, 5" />
- </Rule>
-</Style>
-<Style name="fill" filter-mode="first">
- <Rule>
- <Filter>([class] = 'minorroads')</Filter>
- <LineSymbolizer stroke-width="2.5" stroke="#ffffff" stroke-linecap="round" />
- </Rule>
- <Rule>
- <Filter>([class] = 'mainroads')</Filter>
- <LineSymbolizer stroke-width="4" stroke="#ff9999" stroke-linecap="round" />
- </Rule>
- <Rule>
- <Filter>([class] = 'motorways')</Filter>
- <LineSymbolizer stroke-width="6" stroke="#ff6666" stroke-linecap="round" />
- </Rule>
- <Rule>
- <Filter>([class] = 'railways')</Filter>
- <LineSymbolizer stroke-width="3" stroke="#333333" stroke-linecap="round" />
- </Rule>
-</Style>
-<Style name="bridge" filter-mode="first">
- <Rule>
- <Filter>([class] = 'railways') and ([bridge] = 1)</Filter>
- <LineSymbolizer stroke-width="6" stroke="#ffffff" />
- </Rule>
-</Style>
-<Style name="casing" filter-mode="first">
- <Rule>
- <Filter>([class] = 'railways') and ([bridge] = 1)</Filter>
- <LineSymbolizer stroke-width="8" stroke="#333333" />
- </Rule>
- <Rule>
- <Filter>([class] = 'minorroads')</Filter>
- <LineSymbolizer stroke-width="3" stroke="#a69269" />
- </Rule>
- <Rule>
- <Filter>([class] = 'mainroads')</Filter>
- <LineSymbolizer stroke-width="5" stroke="#ff0000" />
- </Rule>
- <Rule>
- <Filter>([class] = 'motorways')</Filter>
- <LineSymbolizer stroke-width="8" stroke="#990000" />
- </Rule>
-</Style>
-<Layer name="layer"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>casing</StyleName>
- <StyleName>bridge</StyleName>
- <StyleName>fill</StyleName>
- <StyleName>marking</StyleName>
- <Datasource>
- <Parameter name="file">../data/grouped-rendering.sqlite</Parameter>
- <Parameter name="table">(SELECT fid, geometry, type, tunnel, bridge, oneway, class, z_order, CAST((z_order / 10.0) AS INTEGER) AS z
-FROM roads ORDER BY z_order) AS road</Parameter>
- <Parameter name="type">sqlite</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/rtl-point.xml b/tests/visual_tests/styles/rtl-point.xml
deleted file mode 100644
index 5236f94..0000000
--- a/tests/visual_tests/styles/rtl-point.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[nr]=5</Filter>
- <PointSymbolizer/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="0" dy="16" wrap-width="10">'مخيّم دير البلح'</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/shield-on-line-and-avoid-edges.xml b/tests/visual_tests/styles/shield-on-line-and-avoid-edges.xml
deleted file mode 100644
index 22dd1f4..0000000
--- a/tests/visual_tests/styles/shield-on-line-and-avoid-edges.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<Map>
-<Style name="line" filter-mode="first" >
- <Rule>
- <LineSymbolizer stroke="#000000" />
- </Rule>
-</Style>
-<Style name="point-placement" filter-mode="first" >
- <Rule>
- <ShieldSymbolizer
- allow-overlap="true"
- face-name="DejaVu Sans Book"
- file="shape://ellipse"
- placement="line"
- spacing="30"
- transform="scale(4,10)"
- fill="blue"
- avoid-edges="true"
- minimum-padding="5"
- clip="false">
- </ShieldSymbolizer>
- <DebugSymbolizer />
- </Rule>
-</Style>
-<Layer name="carto_tests">
- <StyleName>line</StyleName>
- <StyleName>point-placement</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/marker-on-line.csv</Parameter>
- <Parameter name="separator">|</Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/styles/shield-on-line-spacing-eq-width.xml b/tests/visual_tests/styles/shield-on-line-spacing-eq-width.xml
deleted file mode 100644
index 0ae09da..0000000
--- a/tests/visual_tests/styles/shield-on-line-spacing-eq-width.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<Map background-color="steelblue" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>alpha</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- wkt,halo-opacity,text-opacity,opacity
- "LINESTRING(0 0, 10 2)",.1,.1,.1
- </Parameter>
- </Datasource>
- </Layer>
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>beta</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- wkt,halo-opacity,text-opacity,opacity
- "LINESTRING(0 2, 10 4)",1,1,1
- </Parameter>
- </Datasource>
- </Layer>
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>gamma</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
- wkt,halo-opacity,text-opacity,opacity
- "LINESTRING(0 4, 10 6)",1,1,1
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="alpha">
- <Rule>
- <ShieldSymbolizer
- file="../../data/svg/rect.svg"
- placement="point"
- face-name="DejaVu Sans Book"
- halo-fill="white"
- halo-radius="2"
- spacing="1"
- halo-opacity="[halo-opacity]"
- text-opacity="[text-opacity]"
- opacity="[opacity]"
- minimum-distance="20">
- 'hi'
- </ShieldSymbolizer>
- <TextSymbolizer
- placement="line"
- face-name="DejaVu Sans Book"
- halo-fill="black"
- fill="white"
- size="20"
- halo-radius="2"
- halo-rasterizer="fast"
- halo-opacity="[halo-opacity]"
- opacity="[opacity]"
- spacing="15">
- 'there'
- </TextSymbolizer>
- <LineSymbolizer stroke-width="0.2" stroke="#ff0000" />
- </Rule>
- </Style>
- <Style name="beta">
- <Rule>
- <ShieldSymbolizer
- file="../../data/svg/rect.svg"
- placement="line"
- face-name="DejaVu Sans Book"
- halo-fill="white"
- halo-radius="2"
- halo-opacity="[halo-opacity]"
- text-opacity="[text-opacity]"
- opacity="[opacity]"
- spacing="20">
- 'hi'
- </ShieldSymbolizer>
- <LineSymbolizer stroke-width="0.2" stroke="#ff0000" />
- </Rule>
- </Style>
- <Style name="gamma">
- <Rule>
- <ShieldSymbolizer
- file="../../data/svg/rect.svg"
- placement="line"
- face-name="DejaVu Sans Book"
- halo-fill="white"
- halo-radius="2"
- halo-rasterizer="fast"
- halo-opacity="[halo-opacity]"
- text-opacity="[text-opacity]"
- opacity="[opacity]"
- spacing="15">
- 'hi'
- </ShieldSymbolizer>
- <LineSymbolizer stroke-width="0.2" stroke="#ff0000" />
- </Rule>
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/shield-on-polygon.xml b/tests/visual_tests/styles/shield-on-polygon.xml
deleted file mode 100644
index c4f2f9e..0000000
--- a/tests/visual_tests/styles/shield-on-polygon.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map srs="+init=epsg:4326" background-color="#b8dee6">
-
-<Parameters>
- <Parameter name="bounds">-180,-85.05112877980659,180,85.05112877980659</Parameter>
- <Parameter name="center">0,0,2</Parameter>
- <Parameter name="format">png</Parameter>
- <Parameter name="minzoom">0</Parameter>
- <Parameter name="maxzoom">22</Parameter>
-</Parameters>
-
-
-<Style name="countries" filter-mode="first">
- <Rule>
- <PolygonSymbolizer fill="#ffffff" />
- </Rule>
-</Style>
-<Style name="countries-outline" filter-mode="first">
- <Rule>
- <LineSymbolizer stroke="#85c5d3" stroke-width="2" stroke-linejoin="round" />
- </Rule>
-</Style>
-<Layer name="countries"
- srs="+init=epsg:4326">
- <StyleName>countries-outline</StyleName>
- <StyleName>countries</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/new_zealand/ne_50m_land.shp</Parameter>
- <Parameter name="type"><![CDATA[shape]]></Parameter>
- </Datasource>
- </Layer>
-
-<Style name="places" filter-mode="first">
- <Rule>
- <ShieldSymbolizer avoid-edges="true" fill="#000000" face-name="DejaVu Sans Book" horizontal-alignment="right" dx="15" halo-fill="#ffffff" halo-radius="1" file="../../data/svg/ellipses.svg" size="12" minimum-distance="1" unlock-image="true" placement-type="simple" placements="E,NE,SE,W,NW,SW" ><![CDATA[[NAME]]]></ShieldSymbolizer>
- <DebugSymbolizer />
- </Rule>
-</Style>
-<Layer name="places"
- srs="+init=epsg:4326">
- <StyleName>places</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/new_zealand/ne_50m_populated_places_simple.shp</Parameter>
- <Parameter name="type"><![CDATA[shape]]></Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/shieldsymbolizer-1.xml b/tests/visual_tests/styles/shieldsymbolizer-1.xml
deleted file mode 100644
index 0af9659..0000000
--- a/tests/visual_tests/styles/shieldsymbolizer-1.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Without unlock-image -->
-<!DOCTYPE Map>
-<Map background-color="green" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="2.0.0">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[nr] = 1</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 2</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" horizontal-alignment="middle" dx="5">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 3</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" vertical-alignment="middle" dy="5">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 4</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" dy="0" vertical-alignment="bottom">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 5</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" vertical-alignment="top">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 6</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" horizontal-alignment="left">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 7</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" horizontal-alignment="right">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 8</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg">'X
X
X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 9</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg">'XXX'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 10</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/images/crosshair16x16.png">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <PointSymbolizer allow-overlap="true" file="../../data/raster/white-alpha.png"/>
- </Rule>
-</Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/shieldsymbolizer-2.xml b/tests/visual_tests/styles/shieldsymbolizer-2.xml
deleted file mode 100644
index 7acf427..0000000
--- a/tests/visual_tests/styles/shieldsymbolizer-2.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- With unlock-image -->
-<!DOCTYPE Map>
-<Map background-color="green" srs="+proj=latlong +datum=WGS84" minimum-version="2.0.0">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[nr] = 1</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" unlock-image="true">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 2</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" horizontal-alignment="middle" dx="5" unlock-image="true">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 3</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" vertical-alignment="middle" dy="5" unlock-image="true">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 4</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" dy="0" vertical-alignment="bottom" unlock-image="true">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 5</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" vertical-alignment="top" unlock-image="true">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 6</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" horizontal-alignment="left" unlock-image="true">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 7</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" horizontal-alignment="right" unlock-image="true">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 8</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" unlock-image="true">'X
X
X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 9</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" unlock-image="true">'XXX'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 10</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/images/crosshair16x16.png" unlock-image="true">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <PointSymbolizer allow-overlap="true" file="../../data/raster/white-alpha.png"/>
- </Rule>
-</Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/shieldsymbolizer-3.xml b/tests/visual_tests/styles/shieldsymbolizer-3.xml
deleted file mode 100644
index 01e3dc1..0000000
--- a/tests/visual_tests/styles/shieldsymbolizer-3.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Without unlock-image, with shield-dx -->
-<!DOCTYPE Map>
-<Map background-color="green" srs="+proj=latlong +datum=WGS84" minimum-version="2.0.0">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[nr] = 1</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" unlock-image="false" shield-dx="15">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 2</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" horizontal-alignment="middle" dx="5" unlock-image="false" shield-dx="15">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 3</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" vertical-alignment="middle" dy="5" unlock-image="false" shield-dx="15">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 4</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" dy="0" vertical-alignment="bottom" unlock-image="false" shield-dx="15">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 5</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" vertical-alignment="top" unlock-image="false" shield-dx="15">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 6</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" horizontal-alignment="left" unlock-image="false" shield-dx="15">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 7</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" horizontal-alignment="right" unlock-image="false" shield-dx="15">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 8</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" unlock-image="false" shield-dx="15">'X
X
X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 9</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" unlock-image="false" shield-dx="15">'XXX'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 10</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/images/crosshair16x16.png" unlock-image="false" shield-dx="15" dy="20">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <PointSymbolizer allow-overlap="true" file="../../data/raster/white-alpha.png"/>
- </Rule>
-</Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/shieldsymbolizer-4.xml b/tests/visual_tests/styles/shieldsymbolizer-4.xml
deleted file mode 100644
index 14fe55e..0000000
--- a/tests/visual_tests/styles/shieldsymbolizer-4.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- With unlock-image and shield-dx -->
-<!DOCTYPE Map>
-<Map background-color="green" srs="+proj=latlong +datum=WGS84" minimum-version="2.0.0">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[nr] = 1</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" unlock-image="true" shield-dx="15">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 2</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" horizontal-alignment="middle" dx="5" unlock-image="true" shield-dx="15">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 3</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" vertical-alignment="middle" dy="5" unlock-image="true" shield-dx="15">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 4</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" dy="0" vertical-alignment="bottom" unlock-image="true" shield-dx="15">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 5</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" vertical-alignment="top" unlock-image="true" shield-dx="15">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 6</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" horizontal-alignment="left" unlock-image="true" shield-dx="15">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 7</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" allow-overlap="true" horizontal-alignment="right" unlock-image="true" shield-dx="15">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 8</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" unlock-image="true" shield-dx="15">'X
X
X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 9</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/svg/crosshair16x16.svg" unlock-image="true" shield-dx="15">'XXX'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 10</Filter>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" file="../../data/images/crosshair16x16.png" unlock-image="true" shield-dx="15" dy="20">'X'</ShieldSymbolizer>
- </Rule>
- <Rule>
- <PointSymbolizer allow-overlap="true" file="../../data/raster/white-alpha.png"/>
- </Rule>
- <Rule>
- <DebugSymbolizer />
- </Rule>
-</Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/simple-E.xml b/tests/visual_tests/styles/simple-E.xml
deleted file mode 100644
index d937efa..0000000
--- a/tests/visual_tests/styles/simple-E.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[name] = 'Test five'</Filter>
- <PointSymbolizer/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="10" dy="10" placement-type="simple" placements="E">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/simple-N.xml b/tests/visual_tests/styles/simple-N.xml
deleted file mode 100644
index a5e6eeb..0000000
--- a/tests/visual_tests/styles/simple-N.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[name] = 'Test five'</Filter>
- <PointSymbolizer/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="10" dy="10" placement-type="simple" placements="N">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/simple-NE.xml b/tests/visual_tests/styles/simple-NE.xml
deleted file mode 100644
index 8589c77..0000000
--- a/tests/visual_tests/styles/simple-NE.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[name] = 'Test five'</Filter>
- <PointSymbolizer/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="-10" dy="-10" placement-type="simple" placements="NE">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/simple-NW.xml b/tests/visual_tests/styles/simple-NW.xml
deleted file mode 100644
index c133eb1..0000000
--- a/tests/visual_tests/styles/simple-NW.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[name] = 'Test five'</Filter>
- <PointSymbolizer/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="10" dy="10" placement-type="simple" placements="NW">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/simple-S.xml b/tests/visual_tests/styles/simple-S.xml
deleted file mode 100644
index 2ceb0c5..0000000
--- a/tests/visual_tests/styles/simple-S.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[name] = 'Test five'</Filter>
- <PointSymbolizer/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="10" dy="10" placement-type="simple" placements="S">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/simple-SE.xml b/tests/visual_tests/styles/simple-SE.xml
deleted file mode 100644
index eea79a6..0000000
--- a/tests/visual_tests/styles/simple-SE.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[name] = 'Test five'</Filter>
- <PointSymbolizer/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="10" dy="10" placement-type="simple" placements="SE">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/simple-SW.xml b/tests/visual_tests/styles/simple-SW.xml
deleted file mode 100644
index d7038b3..0000000
--- a/tests/visual_tests/styles/simple-SW.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[name] = 'Test five'</Filter>
- <PointSymbolizer/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="10" dy="10" placement-type="simple" placements="SW">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/simple-W.xml b/tests/visual_tests/styles/simple-W.xml
deleted file mode 100644
index ea82589..0000000
--- a/tests/visual_tests/styles/simple-W.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[name] = 'Test five'</Filter>
- <PointSymbolizer/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="10" dy="10" placement-type="simple" placements="W">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/simple-shield.xml b/tests/visual_tests/styles/simple-shield.xml
deleted file mode 100644
index 80efe2c..0000000
--- a/tests/visual_tests/styles/simple-shield.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long,name,nr,color,type,empty-string
-0,0,Test one,1,#ff0000,svg,
-0,0.1,Test two,2,red,svg,
-0,0.2,Test three,3,#00ff00,svg,
-0,0.3,Test four,4,green,svg,
-0,0.4,Test five,5,#0000ff,svg,
-0,0.5,Test six,6,blue,svg,
-0,0.6,Test seven,7,#000000,svg,
-0,0.7,Test eight,8,black,svg,
-0,0.8,Test nine,9,#ffffff,svg,
-0,0.9,Test ten,10,white,svg,
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <ShieldSymbolizer face-name="DejaVu Sans Book" size="16" placement="point" dx="5" dy="16" file="../../data/[type]/[empty-string]crosshair16x16.svg" horizontal-alignment="middle" vertical-alignment="middle" placement-type="simple" placements="N,S,E,W,SW,10,5">[name]</ShieldSymbolizer>
- <PointSymbolizer allow-overlap="true"/>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/simple.xml b/tests/visual_tests/styles/simple.xml
deleted file mode 100644
index a10fbda..0000000
--- a/tests/visual_tests/styles/simple.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer clip="false" />
- <TextSymbolizer clip="false" face-name="DejaVu Sans Book" size="16" placement="point" dx="5" dy="16" placement-type="simple" placements="N,S,E,W,SW,10,5">[name]</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/style-level-compositing-tiled-0,0.xml b/tests/visual_tests/styles/style-level-compositing-tiled-0,0.xml
deleted file mode 100644
index a3d8f32..0000000
--- a/tests/visual_tests/styles/style-level-compositing-tiled-0,0.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="purple">
- <Style name="style" direct-image-filters="agg-stack-blur(5,5)" image-filters-inflate="true">
- <Rule>
- <PolygonSymbolizer fill="yellow" fill-opacity=".6"/>
- </Rule>
- </Style>
- <Layer name="world" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/world_merc</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="mask" image-filters="agg-stack-blur(5,5)" opacity=".8" comp-op="dst-in" image-filters-inflate="true">
- <Rule>
- <PolygonSymbolizer />
- </Rule>
- </Style>
- <Layer name="mask" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>mask</StyleName>
- <Datasource>
- <Parameter name="inline">
- wkt,name
- "Polygon((-10000000 -5000000, -10000000 10000000, -5000000 10000000, -5000000 -5000000, -10000000 -5000000))","bounds"
- </Parameter>
- <Parameter name="type">csv</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/style-level-compositing-tiled-0,1.xml b/tests/visual_tests/styles/style-level-compositing-tiled-0,1.xml
deleted file mode 100644
index a3d8f32..0000000
--- a/tests/visual_tests/styles/style-level-compositing-tiled-0,1.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="purple">
- <Style name="style" direct-image-filters="agg-stack-blur(5,5)" image-filters-inflate="true">
- <Rule>
- <PolygonSymbolizer fill="yellow" fill-opacity=".6"/>
- </Rule>
- </Style>
- <Layer name="world" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/world_merc</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="mask" image-filters="agg-stack-blur(5,5)" opacity=".8" comp-op="dst-in" image-filters-inflate="true">
- <Rule>
- <PolygonSymbolizer />
- </Rule>
- </Style>
- <Layer name="mask" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>mask</StyleName>
- <Datasource>
- <Parameter name="inline">
- wkt,name
- "Polygon((-10000000 -5000000, -10000000 10000000, -5000000 10000000, -5000000 -5000000, -10000000 -5000000))","bounds"
- </Parameter>
- <Parameter name="type">csv</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/style-level-compositing-tiled-1,0.xml b/tests/visual_tests/styles/style-level-compositing-tiled-1,0.xml
deleted file mode 100644
index a3d8f32..0000000
--- a/tests/visual_tests/styles/style-level-compositing-tiled-1,0.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="purple">
- <Style name="style" direct-image-filters="agg-stack-blur(5,5)" image-filters-inflate="true">
- <Rule>
- <PolygonSymbolizer fill="yellow" fill-opacity=".6"/>
- </Rule>
- </Style>
- <Layer name="world" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/world_merc</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="mask" image-filters="agg-stack-blur(5,5)" opacity=".8" comp-op="dst-in" image-filters-inflate="true">
- <Rule>
- <PolygonSymbolizer />
- </Rule>
- </Style>
- <Layer name="mask" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>mask</StyleName>
- <Datasource>
- <Parameter name="inline">
- wkt,name
- "Polygon((-10000000 -5000000, -10000000 10000000, -5000000 10000000, -5000000 -5000000, -10000000 -5000000))","bounds"
- </Parameter>
- <Parameter name="type">csv</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/style-level-compositing-tiled-1,1.xml b/tests/visual_tests/styles/style-level-compositing-tiled-1,1.xml
deleted file mode 100644
index 55177a9..0000000
--- a/tests/visual_tests/styles/style-level-compositing-tiled-1,1.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="purple">
- <Style name="style" direct-image-filters="agg-stack-blur(5,5)" image-filters-inflate="true">
- <Rule>
- <PolygonSymbolizer fill="yellow" fill-opacity=".6"/>
- </Rule>
- </Style>
- <Layer name="world" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="file">../../data/shp/world_merc</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="mask" image-filters="agg-stack-blur(5,5)" opacity=".8" comp-op="dst-in">
- <Rule>
- <PolygonSymbolizer />
- </Rule>
- </Style>
- <Layer name="mask" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>mask</StyleName>
- <Datasource>
- <Parameter name="inline">
- wkt,name
- "Polygon((-10000000 -5000000, -10000000 10000000, -5000000 10000000, -5000000 -5000000, -10000000 -5000000))","bounds"
- </Parameter>
- <Parameter name="type">csv</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/text-allow-overlap-expr.xml b/tests/visual_tests/styles/text-allow-overlap-expr.xml
deleted file mode 100644
index ee85083..0000000
--- a/tests/visual_tests/styles/text-allow-overlap-expr.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <FontSet name="book">
- <Font face-name="DejaVu Sans Book"/>
- </FontSet>
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
-<Parameter name="inline">
-lat,long,test,text
- 0.25,-0.35,noexpr-true,ABC
- 0.25,-0.35,noexpr-true,XYZ
- 0.25,-0.12,noexpr-false,ABC
- 0.25,-0.12,noexpr-false,XYZ
- 0.25, 0.11,noexpr-true,ABC
- 0.25, 0.11,noexpr-false,XYZ
- 0.25, 0.35,noexpr-false,ABC
- 0.25, 0.35,noexpr-true,XYZ
- 0 ,-0.35,true,ABC
- 0 ,-0.35,true,XYZ
- 0 ,-0.12,false,ABC
- 0 ,-0.12,false,XYZ
- 0 , 0.11,true,ABC
- 0 , 0.11,false,XYZ
- 0 , 0.35,false,ABC
- 0 , 0.35,true,XYZ
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style" filter-mode="first">
- <Rule>
- <Filter>[test] = "noexpr-true"</Filter>
- <TextSymbolizer fontset-name="book" size="16" placement="point" dx="0" dy="0" allow-overlap="true">[text]</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[test] = "noexpr-false"</Filter>
- <TextSymbolizer fontset-name="book" size="16" placement="point" dx="0" dy="0" allow-overlap="false">[text]</TextSymbolizer>
- </Rule>
- <Rule>
- <TextSymbolizer fontset-name="book" size="16" placement="point" dx="0" dy="0" allow-overlap="[test]">[text]</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/text-bengali.xml b/tests/visual_tests/styles/text-bengali.xml
deleted file mode 100644
index e21f6df..0000000
--- a/tests/visual_tests/styles/text-bengali.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!--
- Lohit bengali from https://fedorahosted.org/releases/l/o/lohit/lohit-bengali-ttf-2.5.3.tar.gz
- via https://fedorahosted.org/lohit/
--->
-<Map background-color="white" srs="+proj=latlong +datum=WGS84"
- font-directory="../fonts/lohit-bengali-ttf-2.5.3/">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- <Parameter name="extent">-1,-1,1,1</Parameter>
- </Datasource>
- </Layer>
- <Style name="My Style">
- <Rule>
- <Filter>[nr] = 3</Filter>
- <TextSymbolizer face-name="Lohit Bengali Regular" size="8" placement="point">"গোপালগঞ্জ"</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 5</Filter>
- <TextSymbolizer face-name="Lohit Bengali Regular" size="8" placement="point">"ঝিনাইদহ"</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 7</Filter>
- <TextSymbolizer face-name="Lohit Bengali Regular" size="8" placement="point">"কুষ্টিয়া"</TextSymbolizer>
- </Rule>
- </Style>
-</Map>
diff --git a/tests/visual_tests/styles/text-bug1532.xml b/tests/visual_tests/styles/text-bug1532.xml
deleted file mode 100644
index 0c0130e..0000000
--- a/tests/visual_tests/styles/text-bug1532.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- Minimal testcase for bug #1523. -->
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="extent">0.0121962878686,0.14886974508,0.906367305121,0.389927385014</Parameter>
- <Parameter name="file">../data/bug1532.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <Filter>[wrap] = "yes" and [type] = "line"</Filter>
- <LineSymbolizer stroke-width="1" stroke="red"/>
- <!-- Font and size don't matter as long as text length is > wrap_width -->
- <TextSymbolizer face-name="DejaVu Sans Bold" size="15" placement="line" wrap-width="35">"abcdefgh"</TextSymbolizer>
- </Rule>
-
- <Rule>
- <Filter>[wrap] = "no" and [type] = "line"</Filter>
- <LineSymbolizer stroke-width="1" stroke="blue"/>
- <TextSymbolizer face-name="DejaVu Sans Bold" size="15" placement="line">"abcdefgh"</TextSymbolizer>
- </Rule>
-
- <Rule>
- <Filter>[wrap] = "yes" and [type] = "point"</Filter>
- <PointSymbolizer ignore-placement="true"/>
- <TextSymbolizer face-name="DejaVu Sans Bold" size="15" placement="point" wrap-width="35">"abcdefgh"</TextSymbolizer>
- </Rule>
-
- <Rule>
- <Filter>[wrap] = "no" and [type] = "point"</Filter>
- <PointSymbolizer ignore-placement="true"/>
- <TextSymbolizer face-name="DejaVu Sans Bold" size="15" placement="point">"abcdefgh"</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/text-bug1533.xml b/tests/visual_tests/styles/text-bug1533.xml
deleted file mode 100644
index 986b15a..0000000
--- a/tests/visual_tests/styles/text-bug1533.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- Minimal testcase for bug #1533. -->
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="extent">0.011974068267,-0.211219329615,0.906589524723,0.389705170555</Parameter>
- <Parameter name="file">../data/bug1533.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <LineSymbolizer stroke-width="1" stroke="red"/>
- <MarkersSymbolizer file="shape://arrow" placement="line" transform="scale(.5,.5)"/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="line" upright="right" dy="10" allow-overlap="true">"right: -->"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="line" upright="left" dy="-10" allow-overlap="true">"left: <--"</TextSymbolizer>
- <TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="line" upright="left_only" allow-overlap="true"
- placement-type="list">"left only <--"
- <Placement upright="right_only">"right only -->"</Placement>
- <Placement upright="right_only">"-->"</Placement>
- <Placement upright="left_only">"<--"</Placement>
- </TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/text-bug1820+0.xml b/tests/visual_tests/styles/text-bug1820+0.xml
deleted file mode 100644
index eed6d35..0000000
--- a/tests/visual_tests/styles/text-bug1820+0.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- Minimal testcase for bug #1523. -->
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer opacity="0.5" ignore-placement="true"/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" wrap-width="4" placement="point" dx="0" dy="0"><Format line-spacing="[nr]*10+1">[name]</Format></TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/text-bug1820+1.xml b/tests/visual_tests/styles/text-bug1820+1.xml
deleted file mode 100644
index 563516a..0000000
--- a/tests/visual_tests/styles/text-bug1820+1.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- Minimal testcase for bug #1523. -->
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer opacity="0.5" ignore-placement="true"/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" wrap-width="4" placement="point" dx="0" dy="1"><Format line-spacing="[nr]*10+1">[name]</Format></TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/text-bug1820-1.xml b/tests/visual_tests/styles/text-bug1820-1.xml
deleted file mode 100644
index ec4984f..0000000
--- a/tests/visual_tests/styles/text-bug1820-1.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- Minimal testcase for bug #1523. -->
-<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer opacity="0.5" ignore-placement="true"/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" wrap-width="4" placement="point" dx="0" dy="-1"><Format line-spacing="[nr]*10+1">[name]</Format></TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/text-bug2037.xml b/tests/visual_tests/styles/text-bug2037.xml
deleted file mode 100644
index c960137..0000000
--- a/tests/visual_tests/styles/text-bug2037.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
- <Style name="My Style">
- <Rule>
- <Filter>[nr] = 3</Filter>
- <TextSymbolizer wrap-width="20" face-name="DejaVu Sans Book" size="9" wrap-before="true">"abcdef
ghijkl
mnopq
stuv
wxyz"</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 4</Filter>
- <TextSymbolizer wrap-width="20" face-name="DejaVu Sans Book" size="9" wrap-before="false">"abcdef
ghijkl
mnopq
stuv
wxyz"</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 7</Filter>
- <TextSymbolizer wrap-width="30" face-name="DejaVu Sans Book" size="9" wrap-before="true">"Some test text with
forced
line breaks"</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[nr] = 8</Filter>
- <TextSymbolizer wrap-width="30" face-name="DejaVu Sans Book" size="9" wrap-before="false">"Some test text with
forced
line breaks"</TextSymbolizer>
- </Rule>
-
- </Style>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/text-charplacement.xml b/tests/visual_tests/styles/text-charplacement.xml
deleted file mode 100644
index 5a8a705..0000000
--- a/tests/visual_tests/styles/text-charplacement.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="rgb(255,100,100)">
- <Style name="road">
- <Rule>
- <LineSymbolizer stroke="rgb(255,255,255)" stroke-opacity="0.7"/>
- </Rule>
- <Rule>
- <TextSymbolizer placement="line" label-position-tolerance="50" spacing="20" minimum-distance="5" face-name="DejaVu Sans Book" size="20" halo-radius="1" halo-fill="rgb(255,255,0)">[NAME]</TextSymbolizer>
- </Rule>
- </Style>
- <Layer name="road" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>road</StyleName>
- <Datasource>
- <Parameter name="file">../data/charplacement</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/styles/text-data-binding.xml b/tests/visual_tests/styles/text-data-binding.xml
deleted file mode 100644
index fa3b26a..0000000
--- a/tests/visual_tests/styles/text-data-binding.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="l1" srs="+proj=latlong +datum=WGS84">
- <StyleName>text</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../data/text-data-binding.sqlite</Parameter>
- <Parameter name="table">text_layer</Parameter>
- <Parameter name="extent">-1,-1,1,1</Parameter>
- </Datasource>
- </Layer>
- <Layer name="l2" srs="+proj=latlong +datum=WGS84">
- <StyleName>circular</StyleName>
- <Datasource>
- <Parameter name="type">sqlite</Parameter>
- <Parameter name="file">../data/text-data-binding.sqlite</Parameter>
- <Parameter name="table">circular_layer</Parameter>
- <Parameter name="extent">-1,-1,1,1</Parameter>
- </Datasource>
- </Layer>
- <Style name="circular">
- <Rule>
- <LineSymbolizer
- stroke-width="[double] * 2"
- stroke="[color2]" />
- <TextSymbolizer
- placement="[placement]"
- face-name="DejaVu Serif Book"
- spacing="[double] * 2"
- repeat-distance="[double] * 2"
- fill="[color1]"
- >
- [text1]
- </TextSymbolizer>
- <TextSymbolizer
- geometry-transform="scale(0.7)"
- placement="[placement]"
- face-name="DejaVu Sans Book"
- spacing="[double]"
- >
- [text1]
- </TextSymbolizer>
- <LineSymbolizer
- stroke-width="[double] * 2"
- geometry-transform="scale(0.25) translate(300, 300)"
- stroke="[color2]" />
- <TextSymbolizer
- geometry-transform="scale(0.25) translate(300, 300)"
- size="[double] * 2"
- placement="[placement]"
- face-name="DejaVu Sans Book"
- horizontal-alignment="[alignment]"
- allow-overlap="[bool]"
- max-char-angle-delta="[double] * 0"
- fill="[color3]"
- >
- [text2]
- </TextSymbolizer>
- </Rule>
- </Style>
- <Style name="text">
- <Rule>
- <TextSymbolizer
- face-name="DejaVu Serif Book"
- size="[double] * 1.5"
- placement="[placement1]"
- vertical-alignment="[alignment1]"
- horizontal-alignment="[alignment1]"
- margin="[double] * 5"
- upright="[upright]"
- >
- <Layout wrap-before="[bool]" wrap-width="[double] * 40" justify-alignment="[alignment2]">
- <Format line-spacing="[double] * 3">[text1]</Format>" "
- <Format fill="[color1]" font-feature-settings="[features]">[text2]</Format>" "
- <Format halo-fill="[color2]" halo-radius="[double] * 0.8" size="[double] * 3">[text3]</Format>" "
- <Format face-name="DejaVu Serif Bold">[text4]</Format>" "
- <Format face-name="DejaVu Sans Mono Bold" character-spacing="[double] * 0.8">[text5]</Format>" "
- <Format>[text6]</Format>" "
- <Format>[text7]</Format>" "
- <Format>[text8]</Format>" "
- <Format>[text9]</Format>
- </Layout>
- <Layout dy="[double] * 5" dx="[double] * 2" rotate-displacement="[bool]" orientation="[double] * 1.25">
- <Format>[text10]</Format>" "
- <Format face-name="DejaVu Sans Book">[text11]</Format>" "
- <Format text-transform="[text_transform]">[text12]</Format>
- </Layout>
- <Layout dy="[double] * 15" dx="[double] * -5" wrap-width="[double]" wrap-character="[wrap_char]">
- <Format>[text13]</Format>" "
- </Layout>
- <Layout dy="[double] * 15" dx="[double] * 5" wrap-width="[double]" wrap-character="[wrap_char]" repeat-wrap-character="[bool]">
- <Format>[text13]</Format>" "
- </Layout>
- </TextSymbolizer>
- </Rule>
- </Style>
-</Map>
diff --git a/tests/visual_tests/styles/text-displacement.xml b/tests/visual_tests/styles/text-displacement.xml
deleted file mode 100644
index 0a63dd8..0000000
--- a/tests/visual_tests/styles/text-displacement.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="rgb(255,100,100)">
- <Style name="road">
- <Rule>
- <LineSymbolizer stroke="rgb(255,255,255)" />
- <MarkersSymbolizer placement="vertex-first" file="shape://arrow" ignore-placement="true" transform="scale(0.7)" />
- <TextSymbolizer dy="5" placement="line" label-position-tolerance="5" spacing="60" face-name="DejaVu Sans Book" halo-radius="1" halo-fill="rgb(255,255,0)">[NAME]</TextSymbolizer>
- </Rule>
- </Style>
- <Layer name="road" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>road</StyleName>
- <Datasource>
- <Parameter name="file">../data/displacement</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/styles/text-expressionformat-color.xml b/tests/visual_tests/styles/text-expressionformat-color.xml
deleted file mode 100644
index 2eec041..0000000
--- a/tests/visual_tests/styles/text-expressionformat-color.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="orange" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
-
- <Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <PointSymbolizer/>
- <TextSymbolizer allow-overlap="true" face-name="DejaVu Sans Book" size="16" placement="point" dy="5">
- <Format fill="'#ff0000'">"red text"+'
'</Format>
- <Format fill="[color]">"test"</Format>
- </TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/text-font-features.xml b/tests/visual_tests/styles/text-font-features.xml
deleted file mode 100644
index 59c0147..0000000
--- a/tests/visual_tests/styles/text-font-features.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="extent">-1,-1,1,1</Parameter>
- <Parameter name="inline">
- id, lat, long, features, text, spacing
- 1, 0.6, 0, "", "The first floor", 10
- 2, 0.4, 0, "kern 0, liga 0", "The first floor", 10
- 3, 0.2, 0, "liga 1, dlig 1", "The first floor", 0
- 4, 0.0, 0, "smcp 1", "The first floor", 0
- 5, -0.2, 0, "frac 1, numr 1, dnom 1", "1⁄2 1⁄3 1⁄4", 0
- 6, -0.4, 0, "zero 1, onum 1", "0123456789", 0
- 7, -0.6, 0, "subs[1] 1, subs[4] 1", "H2SO4", 0
- </Parameter>
- </Datasource>
- </Layer>
- <Style name="My Style">
- <Rule>
- <TextSymbolizer
- face-name="DejaVu Serif Book"
- size="15"
- placement="point"
- character-spacing="[spacing]"
- font-feature-settings="[features]"
- >[text]</TextSymbolizer>
- </Rule>
- </Style>
-</Map>
diff --git a/tests/visual_tests/styles/text-halign-adjust-multiline.xml b/tests/visual_tests/styles/text-halign-adjust-multiline.xml
deleted file mode 100644
index 0654bb1..0000000
--- a/tests/visual_tests/styles/text-halign-adjust-multiline.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- Upright test -->
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/lines2.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <LineSymbolizer
- stroke-width="12"
- stroke="red"
- />
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="16"
- placement="line"
- max-char-angle-delta="0"
- horizontal-alignment="adjust"
- >"Adjust\nmultiline"</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/text-halign-adjust.xml b/tests/visual_tests/styles/text-halign-adjust.xml
deleted file mode 100644
index 039f760..0000000
--- a/tests/visual_tests/styles/text-halign-adjust.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- Upright test -->
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/lines2.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <LineSymbolizer
- stroke-width="12"
- stroke="red"
- />
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="16"
- placement="line"
- max-char-angle-delta="0"
- horizontal-alignment="adjust"
- >"Adjust"</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/text-halign.xml b/tests/visual_tests/styles/text-halign.xml
deleted file mode 100644
index d0e67dd..0000000
--- a/tests/visual_tests/styles/text-halign.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- Upright test -->
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/lines2.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <LineSymbolizer stroke-width="12" stroke="red"/>
- <TextSymbolizer face-name="DejaVu Sans Book" size="16" placement="line" upright="auto" max-char-angle-delta="0" horizontal-alignment="left" label-position-tolerance="0.0001">"horizontal-alignment=left"</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/text-halo-opacity.xml b/tests/visual_tests/styles/text-halo-opacity.xml
deleted file mode 100644
index d8cca19..0000000
--- a/tests/visual_tests/styles/text-halo-opacity.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="steelblue" minimum-version="3.0.0">
-
- <Style name="labels">
- <Rule>
- <Filter>([id]=1)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius="4"
- halo-opacity="1.0"
- >
- 'halo-opacity = 1.0'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=2)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius="4"
- halo-opacity="0.75"
- >
- 'halo-opacity = 0.75'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=3)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius="4"
- halo-opacity="0.5"
- >
- 'halo-opacity = 0.5'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=4)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius="4"
- halo-opacity="0.25"
- >
- 'halo-opacity = 0.25'
- </TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>labels</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-id,x,y
-1,1.5,4.5
-2,1.5,3.5
-3,1.5,2.5
-4,1.5,1.5
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/styles/text-halo-rasterizer.xml b/tests/visual_tests/styles/text-halo-rasterizer.xml
deleted file mode 100644
index cefcadb..0000000
--- a/tests/visual_tests/styles/text-halo-rasterizer.xml
+++ /dev/null
@@ -1,224 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="steelblue" minimum-version="0.7.2">
-
- <Style name="labels">
- <Rule>
- <Filter>([id]=0.1)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius=".1"
- >
- 'fast .1'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=0.3)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius=".3"
- >
- 'fast .3'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=0.5)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius=".5"
- >
- 'fast .5'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=0.7)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius=".7"
- >
- 'fast .7'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=1.0)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius="1"
- >
- 'fast 1'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=1.5)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius="1.5"
- >
- 'fast 1.5'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=2.5)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius="2.5"
- >
- 'fast 2.5'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=4)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius="4"
- >
- 'fast 4'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=100.1)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius=".1"
- >
- 'full .1'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=100.3)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius=".3"
- >
- 'full .3'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=100.5)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius=".5"
- >
- 'full .5'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=100.7)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius=".7"
- >
- 'full .7'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=101)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius="1"
- >
- 'full 1'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=101.5)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius="1.5"
- >
- 'full 1.5'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=102.5)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius="2.5"
- >
- 'full 2.5'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=104)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius="4"
- >
- 'full 4'
- </TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>labels</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-id,x,y
-0.1,1.5,4.5
-0.3,1.5,4
-0.5,1.5,3.5
-0.7,1.5,3
-1,1.5,2.5
-1.5,1.5,2
-2.5,1.5,1.5
-4,1.5,1
-
-100.1,3.5,4.5
-100.3,3.5,4
-100.5,3.5,3.5
-100.7,3.5,3
-101,3.5,2.5
-101.5,3.5,2
-102.5,3.5,1.5
-104,3.5,1
-
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/text-halo-transform.xml b/tests/visual_tests/styles/text-halo-transform.xml
deleted file mode 100644
index bcbbdd4..0000000
--- a/tests/visual_tests/styles/text-halo-transform.xml
+++ /dev/null
@@ -1,240 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="steelblue" minimum-version="0.7.2">
-
- <Style name="labels">
- <Rule>
- <Filter>([id]=0.1)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius=".1"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'fast .1'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=0.3)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius=".3"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'fast .3'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=0.5)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius=".5"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'fast .5'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=0.7)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius=".7"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'fast .7'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=1.0)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius="1"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'fast 1'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=1.5)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius="1.5"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'fast 1.5'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=2.5)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius="2.5"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'fast 2.5'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=4)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-rasterizer="fast"
- halo-radius="4"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'fast 4'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=100.1)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius=".1"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'full .1'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=100.3)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius=".3"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'full .3'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=100.5)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius=".5"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'full .5'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=100.7)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius=".7"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'full .7'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=101)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius="1"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'full 1'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=101.5)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius="1.5"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'full 1.5'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=102.5)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius="2.5"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'full 2.5'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>([id]=104)</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="15"
- halo-radius="4"
- halo-transform="rotate(-3.14159*[x]*[y]) translate([x],[y])"
- >
- 'full 4'
- </TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>labels</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-id,x,y
-0.1,1.5,4.5
-0.3,1.5,4
-0.5,1.5,3.5
-0.7,1.5,3
-1,1.5,2.5
-1.5,1.5,2
-2.5,1.5,1.5
-4,1.5,1
-
-100.1,3.5,4.5
-100.3,3.5,4
-100.5,3.5,3.5
-100.7,3.5,3
-101,3.5,2.5
-101.5,3.5,2
-102.5,3.5,1.5
-104,3.5,1
-
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/text-line-wrap.xml b/tests/visual_tests/styles/text-line-wrap.xml
deleted file mode 100644
index bb0f874..0000000
--- a/tests/visual_tests/styles/text-line-wrap.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<!DOCTYPE Map>
-<Map background-color="#b5d0d0" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="0.7.2">
- <Style name="1">
- <Rule>
- <TextSymbolizer
- size="15"
- dy="-5"
- allow-overlap="true"
- face-name="DejaVu Sans Book"
- wrap-width=".1"
- repeat-wrap-character="[repeat-wrap-character]"
- wrap-character="[wrap-character]"
- halo-radius="1">[label]</TextSymbolizer>
- <PointSymbolizer allow-overlap="true" />
- </Rule>
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>1</StyleName>
- <Datasource>
- <Parameter name="inline">
-
- {
- "type": "FeatureCollection",
-
- "features": [
-
- { "type": "Feature",
- "properties": {
- "label": "this,that",
- "wrap-character":",",
- "repeat-wrap-character":true
- },
- "geometry" : { "type": "Point", "coordinates": [ 2.5, 2.5 ] }
- },
- { "type": "Feature",
- "properties": {
- "label": "this-that",
- "wrap-character":"-",
- "repeat-wrap-character":true
- },
- "geometry" : { "type": "Point", "coordinates": [ 0, 5 ] }
- }
- ]
- }
-
- </Parameter>
- <Parameter name="type">geojson</Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
--1,-1
-6,-1
--1,6
-6,6
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/text-malayalam.xml b/tests/visual_tests/styles/text-malayalam.xml
deleted file mode 100644
index 48b24c9..0000000
--- a/tests/visual_tests/styles/text-malayalam.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="white" srs="+proj=latlong +datum=WGS84"
- font-directory="../fonts/Rachana/">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/points.csv</Parameter>
- <Parameter name="extent">-1,-1,1,1</Parameter>
- </Datasource>
- </Layer>
- <Style name="My Style">
- <Rule>
- <Filter>[nr] = 5</Filter>
- <TextSymbolizer face-name="Rachana Book" size="30" placement="point" dy="0">"ഇന്ത്യ"</TextSymbolizer>
- </Rule>
- </Style>
-</Map>
diff --git a/tests/visual_tests/styles/text-multi-layout-1.xml b/tests/visual_tests/styles/text-multi-layout-1.xml
deleted file mode 100644
index 46cb7db..0000000
--- a/tests/visual_tests/styles/text-multi-layout-1.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="green" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="2.0.0">
-
- <Layer name="obstacle" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>obstacle</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long,nr
--0.5,0.5,0
-0.5,-0.5,1
-0.5,0.5,2
--0.5,-0.5,3
-0.08,0,4
--0.08,0,5
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="obstacle">
- <Rule>
- <PointSymbolizer file="../../data/svg/crosshair16x16.svg" transform="scale(0.5)"/>
- </Rule>
- </Style>
-
- <Layer name="layer1" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>points</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long,nr,ref
--0.45,-0.45,0,first
-0.45,-0.45,1,second
-0.45,0.45,2,third
--0.45,0.45,3,fourth
-0,0,4,fifth
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="points">
- <Rule>
- <PointSymbolizer allow-overlap="true" ignore-placement="true" file="../../data/raster/white-alpha.png"/>
- <TextSymbolizer face-name="DejaVu Sans Book" placement="point" placement-type="list" size="16" dx="-4" dy="-8">
- "test "+[nr]
- <Layout dx="0" dy="8" horizontal-alignment="right">
- <Format fill="red">[ref]</Format>
- </Layout>
- <Placement size="14" dy="8">
- "test "+[nr]
- <Format fill="blue">
- <Layout dx="0" dy="-8" horizontal-alignment="right">[ref]</Layout>
- </Format>
- </Placement>
- <Placement dx="0" dy="0">
- "test "+[nr]
- <Format fill="yellow">" ("+[ref]+")"</Format>
- </Placement>
- </TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
-
diff --git a/tests/visual_tests/styles/text-multi-layout-2.xml b/tests/visual_tests/styles/text-multi-layout-2.xml
deleted file mode 100644
index 513dd72..0000000
--- a/tests/visual_tests/styles/text-multi-layout-2.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<Map background-color="green" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" minimum-version="2.0.0">
-
- <Layer name="layer1" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>points</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-lat,long
-0,0
- </Parameter>
- </Datasource>
- </Layer>
-
- <Style name="points">
- <Rule>
- <PointSymbolizer allow-overlap="true" ignore-placement="true" file="../../data/raster/white-alpha.png"/>
- <TextSymbolizer face-name="DejaVu Sans Bold" size="16" wrap-width="60" placement="point" dx="-15" dy="-10">
- "Symbolizer Base Text"
- <Format face-name="DejaVu Sans Book" size="12">
- <Layout orientation="45" dx="25">
- "Rotated Layout with "
- <Format fill="blue">
- "Blue Format Child Node"
- <Layout vertical-alignment="top" rotate-displacement="true" dy="-5">
- "Rotated child layout with rotate-displacement"
- </Layout>
- </Format>
- </Layout>
- <Layout wrap-width="100" wrap-before="true" dy="30">
- <Format halo-radius="1.5">
- "South Offset Layout"
- <Layout dx="30" horizontal-alignment="middle" justify-alignment="center">
- <Format halo-fill="turquoise">"South offset child layout, centered"</Format>
- </Layout>
- <Layout dx="75" wrap-width="20" horizontal-alignment="right" justify-alignment="right">
- <Format face-name="DejaVu Sans Oblique">"South offset child layout, right"</Format>
- </Layout>
- </Format>
- </Layout>
- </Format>
- </TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
-
diff --git a/tests/visual_tests/styles/text-overlap.xml b/tests/visual_tests/styles/text-overlap.xml
deleted file mode 100644
index 08ad675..0000000
--- a/tests/visual_tests/styles/text-overlap.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="rgb(255,100,100)">
- <Style name="road">
- <Rule>
- <LineSymbolizer stroke="rgb(255,255,255)" stroke-width="12" stroke-opacity="0.7"/>
- </Rule>
- <Rule>
- <TextSymbolizer placement="line" label-position-tolerance="50" spacing="60" minimum-distance="5" face-name="DejaVu Sans Book" halo-radius="1" halo-fill="rgb(255,255,0)">[NAME]</TextSymbolizer>
- </Rule>
- </Style>
- <Layer name="road" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>road</StyleName>
- <Datasource>
- <Parameter name="file">../data/overlap</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/styles/text-spacing.xml b/tests/visual_tests/styles/text-spacing.xml
deleted file mode 100644
index 265f80f..0000000
--- a/tests/visual_tests/styles/text-spacing.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="rgb(255,100,100)">
- <Style name="road">
- <Rule>
- <LineSymbolizer stroke="rgb(255,255,255)" stroke-width="12" stroke-linejoin="round" stroke-linecap="round"/>
- </Rule>
- <Rule>
- <TextSymbolizer placement="line" label-position-tolerance="5" spacing="80" face-name="DejaVu Sans Book" halo-radius="1" halo-fill="rgb(255,255,0)">[NAME]</TextSymbolizer>
- </Rule>
- </Style>
- <Layer name="road" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>road</StyleName>
- <Datasource>
- <Parameter name="file">../data/textspacing</Parameter>
- <Parameter name="type">shape</Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/styles/text-ttc-font.xml b/tests/visual_tests/styles/text-ttc-font.xml
deleted file mode 100644
index 98f36b8..0000000
--- a/tests/visual_tests/styles/text-ttc-font.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="steelblue" font-directory="../../data/fonts/NotoSans-Regular.ttc">
-
- <Style name="labels">
- <Rule>
- <Filter>[x]=1.5</Filter>
- <TextSymbolizer
- face-name="Noto Sans UI Regular"
- size="[id]*5.5"
- allow-overlap="true"
- halo-rasterizer="full"
- halo-radius="[id]/6.0"
- opacity="[id]/8.0"
- >'Noto Sans'
- </TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[x]=3.5</Filter>
- <TextSymbolizer
- face-name="Noto Sans Regular"
- size="[id]*5.5"
- allow-overlap="true"
- halo-rasterizer="fast"
- halo-radius="[id]/6.0"
- opacity="[id]/8.0"
- >'Noto Sans'
- </TextSymbolizer>
- </Rule>
- </Style>
-
- <Layer name="point" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>labels</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-id,x,y
-1,1.5,4.5
-2,1.5,4
-3,1.5,3.5
-4,1.5,3
-5,1.5,2.5
-6,1.5,2
-7,1.5,1.5
-8,1.5,1
-
-1,3.5,4.5
-2,3.5,4
-3,3.5,3.5
-4,3.5,3
-5,3.5,2.5
-6.5,3.5,2
-7,3.5,1.5
-8,3.5,1
-
- </Parameter>
- </Datasource>
- </Layer>
-
- <!-- points to frame data view -->
-
- <Style name="frame">
- <Rule>
- <PointSymbolizer />
- </Rule>
- </Style>
-
- <Layer name="frame" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>frame</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-x,y
-0,0
-5,0
-0,5
-5,5
- </Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/text-typographic.xml b/tests/visual_tests/styles/text-typographic.xml
deleted file mode 100644
index 7ef23d7..0000000
--- a/tests/visual_tests/styles/text-typographic.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<Map>
- <Style name="lines" filter-mode="first">
- <Rule>
- <Filter>[id]=1</Filter>
- <LineSymbolizer stroke="blue" />
- <LineSymbolizer stroke="darkblue" stroke-width="3" geometry-transform="translate(15,15)"/>
- </Rule>
- <Rule>
- <Filter>[id]=2</Filter>
- <LineSymbolizer stroke="red" geometry-transform="rotate(90,256,256)"/>
- <LineSymbolizer stroke="darkred" stroke-width="3" geometry-transform="rotate(90,256,256) translate(15,15)"/>
- </Rule>
- </Style>
- <Style name="texts">
- <Rule>
- <Filter>[id]=1</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="12"
- halo-radius="2"
- placement="line"
- allow-overlap="true"
- spacing="1"
- max-char-angle-delta="0"
- upright="right"
- text-transform="uppercase"
- >'Cádiz España • '</TextSymbolizer>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="12"
- halo-radius="2"
- placement="line"
- allow-overlap="true"
- spacing="1"
- max-char-angle-delta="0"
- upright="right"
- geometry-transform="translate(15,15)"
- >'Cádiz España • '</TextSymbolizer>
- </Rule>
- <Rule>
- <Filter>[id]=2</Filter>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="12"
- halo-radius="2"
- placement="line"
- allow-overlap="true"
- spacing="1"
- max-char-angle-delta="0"
- geometry-transform="rotate(90,256,256)"
- upright="left"
- text-transform="uppercase"
- >'Brückenstraße • '</TextSymbolizer>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="12"
- halo-radius="2"
- placement="line"
- allow-overlap="true"
- spacing="1"
- max-char-angle-delta="0"
- geometry-transform="rotate(90,256,256) translate(15,15)"
- upright="left"
- >'Brückenstraße • '</TextSymbolizer>
- </Rule>
- </Style>
- <Layer name="layer">
- <StyleName>lines</StyleName>
- <StyleName>texts</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="inline">
-id,wkt
-1,"LINESTRING(0 0, 1 0, 1 1, 2 1, 2 2, 3 2, 3 3, 4 3, 4 4, 5 4, 5 5, 6 5, 6 6, 7 6, 7 7, 8 7, 8 8, 9 8, 9 9, 10 9, 10 10)"
-2,"LINESTRING(10 10, 10 9, 9 9, 9 8, 8 8, 8 7, 7 7, 7 6, 6 6, 6 5, 5 5, 5 4, 4 4, 4 3, 3 3, 3 2, 2 2, 2 1, 1 1, 1 0, 0 0)"
- </Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/text-vertical-alignment.xml b/tests/visual_tests/styles/text-vertical-alignment.xml
deleted file mode 100644
index b980105..0000000
--- a/tests/visual_tests/styles/text-vertical-alignment.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map>
-<!-- Upright test -->
-<Map background-color="white" srs="+proj=latlong +datum=WGS84">
-
- <Layer name="layer" srs="+proj=latlong +datum=WGS84">
- <StyleName>My Style</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/lines2.csv</Parameter>
- </Datasource>
- </Layer>
-
- <Style name="My Style">
- <Rule>
- <LineSymbolizer stroke-width="12" stroke="red" />
- <MarkersSymbolizer placement="vertex-first" file="shape://arrow" ignore-placement="true" />
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="16"
- placement="line"
- max-char-angle-delta="0"
- allow-overlap="true"
- vertical-alignment="top"
- >"vertical-alignment=top"</TextSymbolizer>
- <TextSymbolizer
- face-name="DejaVu Sans Book"
- size="16"
- placement="line"
- max-char-angle-delta="0"
- allow-overlap="true"
- vertical-alignment="bottom"
- >"vertical-alignment=bottom"</TextSymbolizer>
- </Rule>
- </Style>
-
-</Map>
diff --git a/tests/visual_tests/styles/tiff-alpha-broken-assoc-alpha-gdal.xml b/tests/visual_tests/styles/tiff-alpha-broken-assoc-alpha-gdal.xml
deleted file mode 100644
index 6dae4a4..0000000
--- a/tests/visual_tests/styles/tiff-alpha-broken-assoc-alpha-gdal.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="red">
-
-<Style name="white">
- <Rule>
- <RasterSymbolizer />
- </Rule>
-</Style>
-<Layer name="white"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>white</StyleName>
- <Datasource>
- <!-- tiffinfo data/raster/white-alpha-assoc-alpha-wrong.tiff reports 'Extra Samples: 1<assoc-alpha>' which is incorrect -->
- <!-- https://github.com/mapnik/mapnik/issues/1511 -->
- <Parameter name="file">../../data/raster/white-alpha-assoc-alpha-wrong.tiff</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-alpha-broken-assoc-alpha-raster.xml b/tests/visual_tests/styles/tiff-alpha-broken-assoc-alpha-raster.xml
deleted file mode 100644
index c759ff0..0000000
--- a/tests/visual_tests/styles/tiff-alpha-broken-assoc-alpha-raster.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="red">
-
-<Style name="white">
- <Rule>
- <RasterSymbolizer premultiplied="false"/>
- </Rule>
-</Style>
-<Layer name="white"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>white</StyleName>
- <Datasource>
- <!-- tiffinfo data/raster/white-alpha-assoc-alpha-wrong.tiff reports 'Extra Samples: 1<assoc-alpha>' which is incorrect -->
- <!-- https://github.com/mapnik/mapnik/issues/1511 -->
- <Parameter name="file">../../data/raster/white-alpha-assoc-alpha-wrong.tiff</Parameter>
- <Parameter name="type">raster</Parameter>
- <Parameter name="extent">1001859.9561,5922814.94334,1021141.75555,5942096.74279</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-alpha-gdal.xml b/tests/visual_tests/styles/tiff-alpha-gdal.xml
deleted file mode 100644
index ce42b1a..0000000
--- a/tests/visual_tests/styles/tiff-alpha-gdal.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="red">
-
-<Style name="white">
- <Rule>
- <RasterSymbolizer opacity="1" scaling="bilinear" comp-op="src-over"/>
- </Rule>
-</Style>
-<Layer name="white"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>white</StyleName>
- <Datasource>
- <Parameter name="file">../../data/raster/white-alpha-assoc-alpha-correct.tiff</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-alpha-gradient-gdal.xml b/tests/visual_tests/styles/tiff-alpha-gradient-gdal.xml
deleted file mode 100644
index 7730bba..0000000
--- a/tests/visual_tests/styles/tiff-alpha-gradient-gdal.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="blue">
-
-<Style name="transp">
- <Rule>
- <RasterSymbolizer opacity="1" scaling="bilinear" />
- </Rule>
-</Style>
-<Layer name="transp"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>transp</StyleName>
- <Datasource>
- <Parameter name="file">../../data/raster/transp.tiff</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-alpha-gradient-raster.xml b/tests/visual_tests/styles/tiff-alpha-gradient-raster.xml
deleted file mode 100644
index 485a5fc..0000000
--- a/tests/visual_tests/styles/tiff-alpha-gradient-raster.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="blue">
-
-<Style name="transp">
- <Rule>
- <RasterSymbolizer opacity="1" scaling="bilinear" />
- </Rule>
-</Style>
-<Layer name="transp"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>transp</StyleName>
- <Datasource>
- <Parameter name="file">../../data/raster/transp.tiff</Parameter>
- <Parameter name="type">raster</Parameter>
- <Parameter name="extent">0,0,256,256</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-alpha-raster.xml b/tests/visual_tests/styles/tiff-alpha-raster.xml
deleted file mode 100644
index a86c760..0000000
--- a/tests/visual_tests/styles/tiff-alpha-raster.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="red">
-
-<Style name="white">
- <Rule>
- <RasterSymbolizer opacity="1" scaling="bilinear" comp-op="src-over"/>
- </Rule>
-</Style>
-<Layer name="white"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>white</StyleName>
- <Datasource>
- <Parameter name="file">../../data/raster/white-alpha-assoc-alpha-correct.tiff</Parameter>
- <Parameter name="type">raster</Parameter>
- <Parameter name="extent">1001859.9561,5922814.94334,1021141.75555,5942096.74279</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-edge-alignment-gdal1.xml b/tests/visual_tests/styles/tiff-edge-alignment-gdal1.xml
deleted file mode 100644
index 0c18e08..0000000
--- a/tests/visual_tests/styles/tiff-edge-alignment-gdal1.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="white">
-
-<Style name="test">
- <Rule>
- <RasterSymbolizer scaling="bilinear" />
- </Rule>
-</Style>
-
-<Layer name="test" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>test</StyleName>
- <Datasource>
- <Parameter name="file">../data/Yosemite_L9.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
-</Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-edge-alignment-gdal2.xml b/tests/visual_tests/styles/tiff-edge-alignment-gdal2.xml
deleted file mode 100644
index 0c18e08..0000000
--- a/tests/visual_tests/styles/tiff-edge-alignment-gdal2.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="white">
-
-<Style name="test">
- <Rule>
- <RasterSymbolizer scaling="bilinear" />
- </Rule>
-</Style>
-
-<Layer name="test" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>test</StyleName>
- <Datasource>
- <Parameter name="file">../data/Yosemite_L9.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
-</Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-nodata-edge-gdal.xml b/tests/visual_tests/styles/tiff-nodata-edge-gdal.xml
deleted file mode 100644
index 21ed737..0000000
--- a/tests/visual_tests/styles/tiff-nodata-edge-gdal.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="#F0CCAC">
-
-<Style name="style" >
- <Rule>
- <RasterSymbolizer opacity="1" />
- </Rule>
-</Style>
-<Layer name="raster"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <Datasource>
- <!-- https://github.com/mapnik/mapnik/issues/1471 -->
- <Parameter name="file">../../data/raster/nodata-edge.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-nodata-edge-raster.xml b/tests/visual_tests/styles/tiff-nodata-edge-raster.xml
deleted file mode 100644
index 8305953..0000000
--- a/tests/visual_tests/styles/tiff-nodata-edge-raster.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="#F0CCAC">
-
-<Style name="style" >
- <Rule>
- <RasterSymbolizer opacity="1" />
- </Rule>
-</Style>
-<Layer name="raster"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <Datasource>
- <!-- https://github.com/mapnik/mapnik/issues/1508 -->
- <!-- note: this mis-reports it is premultiplied - it is not -->
- <Parameter name="file">../../data/raster/nodata-edge.tif</Parameter>
- <Parameter name="type">raster</Parameter>
- <Parameter name="extent">-12329035.765216826,4508650.398543958,-12328653.027947057,4508957.346255356</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-nodata-edge-rgba.xml b/tests/visual_tests/styles/tiff-nodata-edge-rgba.xml
deleted file mode 100644
index 4d56afb..0000000
--- a/tests/visual_tests/styles/tiff-nodata-edge-rgba.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="steelblue">
-<Style name="heat">
- <Rule>
- <RasterSymbolizer opacity="1" scaling="bilinear"/>
- </Rule>
-</Style>
-<Layer name="heat"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>heat</StyleName>
- <Datasource>
- <Parameter name="file">../data/aerial_rgba.tiff</Parameter>
- <Parameter name="type">gdal</Parameter>
- <Parameter name="nodata">255</Parameter>
- <Parameter name="nodata_tolerance">5</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-nodata-rgb.xml b/tests/visual_tests/styles/tiff-nodata-rgb.xml
deleted file mode 100644
index decad10..0000000
--- a/tests/visual_tests/styles/tiff-nodata-rgb.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="steelblue">
-<Style name="heat">
- <Rule>
- <RasterSymbolizer opacity="1" scaling="bilinear"/>
- </Rule>
-</Style>
-<Layer name="heat"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>heat</StyleName>
- <Datasource>
- <!-- created with nearblack -o r.tif -of GTiff -white tests/visual_tests/data/heat.tif -setmask tests/visual_tests/data/heat_rgb.tif -->
- <Parameter name="file">../data/heat_rgb.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- <Parameter name="nodata">255</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-nodata-rgba.xml b/tests/visual_tests/styles/tiff-nodata-rgba.xml
deleted file mode 100644
index 80e674e..0000000
--- a/tests/visual_tests/styles/tiff-nodata-rgba.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="steelblue">
-<Style name="heat">
- <Rule>
- <RasterSymbolizer opacity="1" scaling="bilinear"/>
- </Rule>
-</Style>
-<Layer name="heat"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>heat</StyleName>
- <Datasource>
- <!-- created with gdal_translate tests/visual_tests/data/heat.tif -a_nodata 255 tests/visual_tests/data/heat_nodata.tif -->
- <Parameter name="file">../data/heat_nodata.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-nodata-tolerance.xml b/tests/visual_tests/styles/tiff-nodata-tolerance.xml
deleted file mode 100644
index 05956a1..0000000
--- a/tests/visual_tests/styles/tiff-nodata-tolerance.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="white">
-
-<Style name="test">
- <Rule>
- <RasterSymbolizer scaling="bilinear" />
- </Rule>
-</Style>
-
-<Layer name="test" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>test</StyleName>
- <Datasource>
- <Parameter name="file">../data/Yosemite_L9.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- <Parameter name="nodata">255</Parameter>
- <Parameter name="nodata_tolerance">100</Parameter>
- </Datasource>
-</Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-opaque-edge-gdal.xml b/tests/visual_tests/styles/tiff-opaque-edge-gdal.xml
deleted file mode 100644
index 336e9f3..0000000
--- a/tests/visual_tests/styles/tiff-opaque-edge-gdal.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="white">
-
-<Style name="test">
- <Rule>
- <RasterSymbolizer scaling="bilinear" />
- </Rule>
-</Style>
-
-<Layer name="test" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>test</StyleName>
- <Datasource>
- <!-- https://github.com/mapnik/mapnik/issues/1508 -->
- <!-- note: this mis-reports it is premultiplied - it is not -->
- <Parameter name="file">../../data/raster/river_wgs.tiff</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
-</Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-opaque-edge-gdal2.xml b/tests/visual_tests/styles/tiff-opaque-edge-gdal2.xml
deleted file mode 100644
index 1248499..0000000
--- a/tests/visual_tests/styles/tiff-opaque-edge-gdal2.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="rgba(255,255,255,1)">
-<Style name="testmerc" filter-mode="first" >
- <Rule>
- <RasterSymbolizer opacity="1" scaling="bilinear" />
- </Rule>
-</Style>
-<Layer name="testmerc"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>testmerc</StyleName>
- <Datasource>
- <!-- https://github.com/mapnik/mapnik/issues/1508 -->
- <!-- note: this mis-reports it is premultiplied - it is not -->
- <Parameter name="file">../../data/raster/river_merc.tiff</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-opaque-edge-raster.xml b/tests/visual_tests/styles/tiff-opaque-edge-raster.xml
deleted file mode 100644
index 580c8d4..0000000
--- a/tests/visual_tests/styles/tiff-opaque-edge-raster.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<Map srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" background-color="white">
-
-<Style name="test">
- <Rule>
- <RasterSymbolizer scaling="bilinear" />
- </Rule>
-</Style>
-
-<Layer name="test" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>test</StyleName>
- <Datasource>
- <Parameter name="file">../../data/raster/river_wgs.tiff</Parameter>
- <Parameter name="type">raster</Parameter>
- <Parameter name="extent">0,0,256,210</Parameter>
- </Datasource>
-</Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-opaque-edge-raster2.xml b/tests/visual_tests/styles/tiff-opaque-edge-raster2.xml
deleted file mode 100644
index 948bccf..0000000
--- a/tests/visual_tests/styles/tiff-opaque-edge-raster2.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="rgba(255,255,255,1)">
-<Style name="testmerc" filter-mode="first" >
- <Rule>
- <RasterSymbolizer opacity="1" scaling="bilinear" />
- </Rule>
-</Style>
-<Layer name="testmerc"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>testmerc</StyleName>
- <Datasource>
- <!-- https://github.com/mapnik/mapnik/issues/1508 -->
- <!-- note: this mis-reports it is premultiplied - it is not -->
- <Parameter name="file">../../data/raster/river_merc.tiff</Parameter>
- <Parameter name="extent">-8249238.098993212,-486119.1339340762,-8024337.037783274,-302066.9754826002</Parameter>
- <Parameter name="type">raster</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-reprojection-1.xml b/tests/visual_tests/styles/tiff-reprojection-1.xml
deleted file mode 100644
index 66519f9..0000000
--- a/tests/visual_tests/styles/tiff-reprojection-1.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="#b8dee6" maximum-extent="-20037508.34,-20037508.34,20037508.34,20037508.34">
-<Style name="heat" filter-mode="first" >
- <Rule>
- <RasterSymbolizer opacity="1" scaling="bilinear"/>
- </Rule>
-</Style>
-<Layer name="heat"
- srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
- <StyleName>heat</StyleName>
- <Datasource>
- <Parameter name="file">../data/heat.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-reprojection-2.xml b/tests/visual_tests/styles/tiff-reprojection-2.xml
deleted file mode 100644
index 0c3520c..0000000
--- a/tests/visual_tests/styles/tiff-reprojection-2.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE Map[]>
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="#b8dee6" maximum-extent="-20037508.34,-20037508.34,20037508.34,20037508.34">
-
-<Style name="samp1" filter-mode="first">
- <Rule>
- <RasterSymbolizer opacity="1" />
- </Rule>
-</Style>
-<Layer name="samp1"
- srs="+init=epsg:26910">
- <StyleName>samp1</StyleName>
- <Datasource>
- <Parameter name="file">../data/lower_columbia.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff-resampling.xml b/tests/visual_tests/styles/tiff-resampling.xml
deleted file mode 100644
index 7dfefaf..0000000
--- a/tests/visual_tests/styles/tiff-resampling.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="#ffffff">
-
-<Style name="style">
- <Rule>
- <RasterSymbolizer opacity="0.1" scaling="spline36" />
- </Rule>
-</Style>
-
-<Layer name="layer"
- srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
- <StyleName>style</StyleName>
- <Datasource>
- <Parameter name="file">../data/snow-cover.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
- </Layer>
-
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff_colortable.xml b/tests/visual_tests/styles/tiff_colortable.xml
deleted file mode 100644
index daf2aa4..0000000
--- a/tests/visual_tests/styles/tiff_colortable.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Map srs="+init=epsg:32630" background-color="steelblue">
- <Style name="2011_5km_vrt_nodata_style">
- <Rule>
- <RasterSymbolizer/>
- </Rule>
- </Style>
- <Layer name="2011_5km_vrt_nodata" srs="+init=epsg:32630">
- <StyleName>2011_5km_vrt_nodata_style</StyleName>
- <Datasource>
- <Parameter name="file">../../data/raster/dataraster.tif</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/tiff_colortable_custom_nodata.xml b/tests/visual_tests/styles/tiff_colortable_custom_nodata.xml
deleted file mode 100644
index f663d75..0000000
--- a/tests/visual_tests/styles/tiff_colortable_custom_nodata.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Map srs="+init=epsg:32630" background-color="steelblue">
- <Style name="2011_5km_vrt_nodata_style">
- <Rule>
- <RasterSymbolizer/>
- </Rule>
- </Style>
- <Layer name="2011_5km_vrt_nodata" srs="+init=epsg:32630">
- <StyleName>2011_5km_vrt_nodata_style</StyleName>
- <Datasource>
- <Parameter name="file">../../data/raster/dataraster.tif</Parameter>
- <Parameter name="nodata">20</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/vrt_colortable.xml b/tests/visual_tests/styles/vrt_colortable.xml
deleted file mode 100644
index f510883..0000000
--- a/tests/visual_tests/styles/vrt_colortable.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Map srs="+init=epsg:32630" background-color="rgb(255,255,255)">
- <Style name="2011_5km_vrt_nodata_style">
- <Rule>
- <RasterSymbolizer/>
- </Rule>
- </Style>
- <Layer name="2011_5km_vrt_nodata" srs="+init=epsg:32630">
- <StyleName>2011_5km_vrt_nodata_style</StyleName>
- <Datasource>
- <Parameter name="file">../../data/raster/dataraster.vrt</Parameter>
- <Parameter name="type">gdal</Parameter>
- </Datasource>
- </Layer>
-</Map>
\ No newline at end of file
diff --git a/tests/visual_tests/styles/whole-centroid.xml b/tests/visual_tests/styles/whole-centroid.xml
deleted file mode 100644
index ed692a8..0000000
--- a/tests/visual_tests/styles/whole-centroid.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<Map maximum-extent="736908, 4390316, 2060771, 5942346">
-<Style name="whole">
- <Rule>
- <MarkersSymbolizer placement="point" multi-policy="whole" fill="yellow" width="20" allow-overlap="true"/>
- </Rule>
-</Style>
-<Style name="boundary">
- <Rule>
- <LineSymbolizer />
- </Rule>
-</Style>
-<Layer name="multi">
- <StyleName>boundary</StyleName>
- <StyleName>whole</StyleName>
- <Datasource>
- <Parameter name="type">csv</Parameter>
- <Parameter name="file">../data/whole-centroid.csv</Parameter>
- <Parameter name="separator">|</Parameter>
- </Datasource>
- </Layer>
-</Map>
diff --git a/tests/visual_tests/test.py b/tests/visual_tests/test.py
deleted file mode 100755
index 40e1472..0000000
--- a/tests/visual_tests/test.py
+++ /dev/null
@@ -1,502 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import sys
-import mapnik
-#mapnik.logger.set_severity(mapnik.severity_type.None)
-#mapnik.logger.set_severity(mapnik.severity_type.Debug)
-import shutil
-import os.path
-from compare import compare, compare_grids
-import platform
-
-try:
- import json
-except ImportError:
- import simplejson as json
-
-visual_output_dir = "/tmp/mapnik-visual-images"
-
-defaults = {
- 'sizes': [(500, 100)],
- 'scales':[1.0,2.0],
- 'agg': True,
- 'cairo': mapnik.has_cairo(),
- 'grid': mapnik.has_grid_renderer()
-}
-
-cairo_threshold = 10
-agg_threshold = 0
-grid_threshold = 5
-if 'Linux' == platform.uname()[0]:
- # we assume if linux then you are running packaged cairo
- # which is older than the 1.12.14 version we used on OS X
- # to generate the expected images, so we'll rachet back the threshold
- # https://github.com/mapnik/mapnik/issues/1868
- cairo_threshold = 230
- agg_threshold = 12
- grid_threshold = 6
-
-def render_cairo(m, output, scale_factor):
- mapnik.render_to_file(m, output, 'ARGB32', scale_factor)
- # open and re-save as png8 to save space
- new_im = mapnik.Image.open(output)
- new_im.save(output, 'png8:m=h')
-
-def render_grid(m, output, scale_factor):
- grid = mapnik.Grid(m.width, m.height)
- mapnik.render_layer(m, grid, layer=0, scale_factor=scale_factor)
- utf1 = grid.encode('utf', resolution=4)
- open(output,'wb').write(json.dumps(utf1, indent=1))
-
-def render_agg(m, output, scale_factor):
- mapnik.render_to_file(m, output, 'png8:m=h', scale_factor),
-
-renderers = [
- { 'name': 'agg',
- 'render': render_agg,
- 'compare': lambda actual, reference: compare(actual, reference, alpha=True),
- 'threshold': agg_threshold,
- 'filetype': 'png',
- 'dir': 'images'
- },
- { 'name': 'cairo',
- 'render': render_cairo,
- 'compare': lambda actual, reference: compare(actual, reference, alpha=False),
- 'threshold': cairo_threshold,
- 'filetype': 'png',
- 'dir': 'images'
- },
- { 'name': 'grid',
- 'render': render_grid,
- 'compare': lambda actual, reference: compare_grids(actual, reference, alpha=False),
- 'threshold': grid_threshold,
- 'filetype': 'json',
- 'dir': 'grids'
- }
-]
-
-sizes_many_in_big_range = [(800, 100), (600, 100), (400, 100),
- (300, 100), (250, 100), (150, 100), (100, 100)]
-
-sizes_few_square = [(800, 800), (600, 600), (400, 400), (200, 200)]
-sizes_many_in_small_range = [(490, 100), (495, 100), (497, 100), (498, 100),
- (499, 100), (500, 100), (501, 100), (502, 100), (505, 100), (510, 100)]
-
-default_text_box = mapnik.Box2d(-0.05, -0.01, 0.95, 0.01)
-large_text_box = mapnik.Box2d(-0.5, -0.5, 0.5, 0.5)
-
-merc_z1_bboxes = {
- '0,0':mapnik.Box2d(-20037508.342,0,0,20037508.342), # upper left
- '1,0':mapnik.Box2d(0,0,20037508.342,20037508.342), # upper right
- '0,1':mapnik.Box2d(-20037508.342,-20037508.342,0,0), # lower left
- '1,1':mapnik.Box2d(0,-20037508.342,20037508.342,0) # lower right
-}
-
-dirname = os.path.dirname(__file__)
-
-files = {
- 'list': {'sizes': sizes_many_in_big_range,'bbox':default_text_box},
- 'simple': {'sizes': sizes_many_in_big_range,'bbox':default_text_box},
- 'lines-1': {'sizes': sizes_few_square,'bbox':default_text_box},
- 'lines-2': {'sizes': sizes_few_square,'bbox':default_text_box},
- 'lines-3': {'sizes': sizes_few_square,'bbox':default_text_box},
- 'lines-4': {'sizes': sizes_few_square,'bbox':default_text_box},
- 'lines-5': {'sizes': sizes_few_square,'bbox':default_text_box},
- 'lines-6': {'sizes': sizes_few_square,'bbox':default_text_box},
- 'lines-7': {'sizes': sizes_few_square,'bbox':mapnik.Box2d(-1.2, -1.2, 1.2, 1.2)},
- 'lines-multi-layout-1': {'sizes': [(800,800)],'bbox':default_text_box},
- 'lines-multi-layout-2': {'sizes': [(800,800)],'bbox':mapnik.Box2d(-1.2, -1.2, 1.2, 1.2)},
- 'lines-multi-layout-shield': {'sizes': [(800,800)],'bbox':default_text_box},
- 'lines-shield': {'sizes': sizes_few_square,'bbox':default_text_box},
- 'collision': {'sizes':[(600,400)]},
- 'simple-shield': {'sizes':[(600,400)]},
- 'shield-on-polygon': {'sizes':[(600,400)]},
- 'shield-on-line-spacing-eq-width': {'sizes':[(600,400)]},
- 'geometry-transform-translate': {'sizes':[(200,200)]},
- 'geometry-transform-translate-patterns': {'sizes':[(200,200)]},
- 'geometry-transform-translate-patterns-svg': {'sizes':[(200,200)]},
- 'geometry-transform-scale': {'sizes': [(500, 500)]},
- 'geometry-transform-scale-patterns': {'sizes': [(500, 500)]},
- 'marker-interior-position': {'sizes':[(600,400)]},
- 'marker-svg-opacity':{},
- 'marker-svg-opacity2':{},
- 'marker-svg-empty-g-element':{},
- 'marker-multi-policy': {'sizes':[(600,400)]},
- 'marker-on-line': {'sizes':[(600,400)],
- 'bbox': mapnik.Box2d(-10, 0, 15, 20)},
- 'marker-on-line-and-line-placement': {'sizes':[(600,400)],
- 'bbox': mapnik.Box2d(-10, 0, 15, 20)},
- 'marker-on-line-spacing-eq-width': {'sizes':[(600,400)]},
- 'marker-on-line-spacing-eq-width-overlap': {'sizes':[(600,400)]},
- 'marker_line_placement_on_points':{},
- 'marker-on-line-and-vertex-first-placement':{'sizes':[(600,400)],
- 'bbox': mapnik.Box2d(-1, -1, 11, 4)},
- 'marker-on-line-and-vertex-last-placement':{'sizes':[(600,400)],
- 'bbox': mapnik.Box2d(-1, -1, 11, 4)},
- 'marker-with-background-image-linear-comp-op': {},
- 'marker-with-background-image': {'sizes':[(600,400),(400,600),(257,256)]},
- 'marker-with-background-image-and-hsla-transform': {'sizes':[(600,400),(400,600),(257,256)]},
- 'marker-on-hex-grid': {'sizes':[(600,400),(400,600),(257,256)]},
- 'whole-centroid': {'sizes':[(600,400)],
- 'bbox': mapnik.Box2d(736908, 4390316, 2060771, 5942346)},
- 'text-halo-rasterizer': {'sizes':[(600,400)]},
- 'text-halo-transform': {'sizes':[(600,400)]},
- 'text-ttc-font': {'sizes':[(600,400)]},
- 'simple-E': {'bbox':mapnik.Box2d(-0.05, -0.01, 0.95, 0.01)},
- 'simple-NE': {'bbox':default_text_box},
- 'simple-NW': {'bbox':default_text_box},
- 'simple-N': {'bbox':default_text_box},
- 'simple-SE': {'bbox':default_text_box},
- 'simple-SW': {'bbox':default_text_box},
- 'simple-S': {'bbox':default_text_box},
- 'simple-W': {'bbox':default_text_box},
- 'formatting-1': {'bbox':default_text_box},
- 'formatting-2': {'bbox':default_text_box},
- 'formatting-3': {'bbox':default_text_box},
- 'formatting-4': {'bbox':default_text_box},
- 'formatting-5': {'bbox':default_text_box},
- 'formatting-6': {'bbox':default_text_box},
- 'formatting-7': {'bbox':default_text_box},
- 'formatting-8': {'bbox':default_text_box},
- 'formatting-expr-alignment': {'bbox':large_text_box, 'sizes': [(500, 500)]},
- 'expressionformat': {'bbox':default_text_box},
- 'shieldsymbolizer-1': {'sizes': sizes_many_in_small_range,'bbox':default_text_box},
- 'shieldsymbolizer-2': {'sizes': sizes_many_in_small_range,'bbox':default_text_box},
- 'shieldsymbolizer-3': {'sizes': sizes_many_in_small_range,'bbox':default_text_box},
- 'shieldsymbolizer-4': {'sizes': sizes_many_in_small_range,'bbox':default_text_box},
- 'orientation': {'sizes': [(800, 200)], 'bbox': default_text_box},
- 'harfbuzz': {'sizes': [(800, 200)], 'bbox': default_text_box},
- 'hb-fontsets': {'sizes': [(800, 200)], 'bbox': default_text_box},
- 'khmer': {'sizes': [(800, 200)], 'bbox': default_text_box},
- 'charspacing': {'sizes': [(200, 400)], 'bbox': default_text_box},
- 'charspacing-lines': {'sizes': [(300, 300)], 'bbox': default_text_box},
- 'line_break': {'sizes': [(800, 800)], 'bbox': default_text_box},
- 'rtl-point': {'sizes': [(200, 200)],'bbox':default_text_box},
- 'jalign-auto': {'sizes': [(200, 200)],'bbox':default_text_box},
- 'line-offset': {'sizes':[(900, 250)],'bbox': mapnik.Box2d(-5.192, 50.189, -5.174, 50.195)},
- 'repeat-labels-1': {'sizes': [(750,250)],'bbox':mapnik.Box2d(-12, -4, 12, 4)},
- 'repeat-labels-2': {'sizes': [(750,250)],'bbox':mapnik.Box2d(-12, -4, 12, 4)},
- 'repeat-labels-3': {'sizes': [(750,250)],'bbox':mapnik.Box2d(-12, -4, 12, 4)},
- 'repeat-labels-4': {'sizes': [(750,250)],'bbox':mapnik.Box2d(-12, -4, 12, 4)},
- 'text-bug1532': {'sizes': [(600, 165)]},
- 'text-bug1533': {'sizes': [(600, 600)]},
- 'text-bug1820-1': {'sizes': [(600, 300)], 'bbox': default_text_box},
- 'text-bug1820+0': {'sizes': [(600, 300)], 'bbox': default_text_box},
- 'text-bug1820+1': {'sizes': [(600, 300)], 'bbox': default_text_box},
- 'text-bug2037': {'sizes': [(800, 300)], 'bbox': default_text_box},
- 'text-expressionformat-color': {'sizes': [(800, 100)], 'bbox': default_text_box},
- 'text-halign': {'sizes': [(800,800)], 'bbox': default_text_box},
- 'text-halign-adjust': {'sizes': [(800,800)], 'bbox': default_text_box},
- 'text-halign-adjust-multiline': {'sizes': [(800,800)], 'bbox': default_text_box},
- 'text-vertical-alignment': {'sizes': [(800,800)], 'bbox': default_text_box},
- 'text-malayalam': {'sizes': [(800, 100)], 'bbox': default_text_box},
- 'text-bengali': {'sizes': [(800, 100)], 'bbox': default_text_box},
- 'text-font-features': {'sizes': [(500, 500)]},
- 'text-multi-layout-1': {'sizes': [(512,512)], 'bbox':mapnik.Box2d(-1, -1, 1, 1)},
- 'text-multi-layout-2': {'sizes': [(512,512)], 'bbox':mapnik.Box2d(-1, -1, 1, 1)},
- 'line-pattern-symbolizer': {'sizes':[(900, 250)],'bbox': mapnik.Box2d(-5.192, 50.189, -5.174, 50.195)},
- 'tiff-alpha-gdal': {'sizes':[(600,400)]},
- 'tiff-alpha-broken-assoc-alpha-gdal': {'sizes':[(600,400)]},
- 'tiff-alpha-gradient-gdal': {'sizes':[(600,400)]},
- 'tiff-nodata-edge-gdal': {'sizes':[(600,400),(969,793)]},
- 'tiff-opaque-edge-gdal': {'sizes':[(256,256),(969,793)]},
- 'tiff-opaque-edge-gdal2': {'sizes':[(600,400),(969,793)]},
- 'tiff-opaque-edge-raster2': {'sizes':[(600,400),(969,793)]},
- 'tiff-resampling': {'sizes':[(600,400)]},
- 'gdal-filter-factor': {'sizes':[(600,400)]},
- # https://github.com/mapnik/mapnik/issues/1622
- 'tiff-edge-alignment-gdal1': {'sizes':[(256,256),(255,257)],
- 'bbox':mapnik.Box2d(-13267022.12540147,4618019.500877209,-13247454.246160466,4637587.380118214)
- },
- 'tiff-edge-alignment-gdal2': {'sizes':[(256,256),(255,257)],
- 'bbox':mapnik.Box2d(-13267022.12540147,4598451.621636203,-13247454.246160466,4618019.500877209)
- },
- 'tiff-reprojection-1': {'sizes':[(250,250)]},
- # https://github.com/mapnik/mapnik/issues/1520
- # commented because these are not critical failures
- #'tiff-alpha-raster': {'sizes':[(600,400)]},
- #'tiff-alpha-broken-assoc-alpha-raster': {'sizes':[(600,400)]},
- #'tiff-nodata-edge-raster': {'sizes':[(600,400)]},
- #'tiff-opaque-edge-raster': {'sizes':[(256,256)]},
- # https://github.com/mapnik/mapnik/issues/2438
- #'tiff-reprojection-2': {'sizes':[(250,250)]},
- 'road-casings-grouped-rendering': {'sizes':[(600,600)],
- 'bbox':mapnik.Box2d(1477001.12245,6890242.37746,1480004.49012,6892244.62256)
- },
- 'road-casings-non-grouped-rendering': {'sizes':[(600,600)],
- 'bbox':mapnik.Box2d(1477001.12245,6890242.37746,1480004.49012,6892244.62256)
- },
- 'style-level-compositing-tiled-0,0':{'sizes':[(512,512)],'bbox':merc_z1_bboxes['0,0']},
- 'style-level-compositing-tiled-1,0':{'sizes':[(512,512)],'bbox':merc_z1_bboxes['1,0']},
- 'style-level-compositing-tiled-0,1':{'sizes':[(512,512)],'bbox':merc_z1_bboxes['0,1']},
- 'style-level-compositing-tiled-1,1':{'sizes':[(512,512)],'bbox':merc_z1_bboxes['1,1']},
- 'marker-path-expression':{},
- 'map-background-image-compositing':{'sizes':[(512,512)]},
- 'building-symbolizer-opacity':{'sizes':[(512,512)]},
- 'line-pattern-symbolizer-opacity':{'sizes':[(512,512)]},
- 'dst-over-compositing':{'sizes':[(512,512)]},
- 'tiff_colortable':{'sizes':[(256,256)]},
- 'tiff_colortable_custom_nodata':{'sizes':[(256,256)]},
- 'vrt_colortable':{'sizes':[(256,256)]},
- 'raster_colorizer':{'sizes':[(512,512)]},
- 'raster_symbolizer':{'sizes':[(512,512)]},
- 'raster-color-to-alpha1':{'sizes':[(512,512)]},
- 'raster-color-to-alpha2':{'sizes':[(512,512)]},
- 'raster-color-to-alpha3':{'sizes':[(512,512)]},
- 'raster-color-to-alpha4':{'sizes':[(512,512)]},
- 'raster-color-to-alpha5':{'sizes':[(512,512)]},
- 'colorize-alpha1':{'sizes':[(512,512)]},
- 'colorize-alpha2':{'sizes':[(512,512)]},
- 'colorize-alpha3':{'sizes':[(512,512)]},
- 'image-filters-galore':{'sizes':[(512,512)]},
- 'image-filters-multi-blur':{'sizes':[(512,512)]},
- 'image-filters-multi-blur-inflate':{'sizes':[(512,512)]},
- 'line-opacity-multi-render':{'sizes':[(512,512)]},
- 'tiff-nodata-rgb':{'sizes':[(512,512)]},
- 'tiff-nodata-rgba':{'sizes':[(512,512)]},
- 'tiff-nodata-tolerance':{'sizes':[(512,512)]},
- 'tiff-nodata-edge-rgba':{'sizes':[(512,512)]},
- 'marker-vs-point':{'sizes':[(512,512)]},
- 'line-symbolizer-expressions':{'sizes':[(256,256)]},
- 'line-symbolizer-expressions-all':{'sizes':[(256,256)]},
- 'point-symbolizer-expressions':{'sizes':[(256,256)]},
- 'point-symbolizer-expressions-all':{'sizes':[(256,256)]},
- 'point-symbolizer-overlap-placement-expr': {'bbox':large_text_box, 'sizes': [(500, 500)]},
- 'text-allow-overlap-expr': {'bbox':large_text_box, 'sizes': [(500, 500)]},
- 'marker-symbolizer-expressions-all':{'sizes':[(256,256)]},
- 'polygon-symbolizer-expressions':{'sizes':[(256,256)]},
- 'polygon-symbolizer-expressions-all':{'sizes':[(256,256)]},
- 'polygon-winding-order': {'sizes':[(300,300)]},
- 'group-symbolizer-1':{'sizes':[(512,512)]},
- 'group-symbolizer-2':{'sizes':[(512,512)]},
- 'group-symbolizer-3':{'sizes':[(512,256)]},
- 'group-symbolizer-line-1':{'sizes':[(512,512)]},
- 'group-symbolizer-line-2':{'sizes':[(512,512)]},
- 'text-charplacement':{'sizes':[(512,512)]},
- 'text-displacement':{'sizes':[(512,512)]},
- 'text-overlap':{'sizes':[(512,512)]},
- 'text-spacing':{'sizes':[(512,512)]},
- 'text-halo-opacity':{'sizes':[(512,512)]},
- # https://github.com/mapnik/mapnik/issues/2202
- 'line-smooth-and-offset':{'sizes':[(512,512)]},
- 'line-pattern-smooth-and-offset':{'sizes':[(512,512)]},
- 'halo-comp-op-on-satellite':{'sizes':[(450,450)]},
- 'marker-whole-multi-polygon':{'sizes':[(512,512)]},
- 'shield-on-line-and-avoid-edges':{'sizes':[(512,512)]},
- 'marker-on-line-and-avoid-edges':{'sizes':[(512,512)]},
- 'text-typographic':{'sizes':[(512,512)]},
- 'functional-expressions':{'sizes':[(256,256)], 'bbox':mapnik.Box2d(-10,-10,10,10)},
- 'functional-expressions-length':{'sizes':[(512,512)], 'bbox':mapnik.Box2d(-15,-15,15,15)},
- 'marker-collide':{'sizes':[(512,512)]},
- 'marker-recenter-collide':{'sizes':[(256,128)], 'bbox':mapnik.Box2d(-1,-0.5,1,0.5)},
- 'postgis-inline':{'sizes':[(512,512)]},
- 'text-line-wrap':{'sizes':[(512,512)]},
- 'text-data-binding': {'sizes': [(500, 500)]},
- }
-
-class Reporting:
- DIFF = 1
- NOT_FOUND = 2
- OTHER = 3
- REPLACE = 4
- def __init__(self, quiet, overwrite_failures = False):
- self.quiet = quiet
- self.passed = 0
- self.failed = 0
- self.overwrite_failures = overwrite_failures
- self.errors = [ #(type, actual, expected, diff, message)
- ]
-
- def result_fail(self, actual, expected, diff):
- self.failed += 1
- if self.quiet:
- if platform.uname()[0] == 'Windows':
- sys.stderr.write('.')
- else:
- sys.stderr.write('\x1b[31m.\x1b[0m')
- else:
- print '\x1b[31m✘\x1b[0m (\x1b[34m%u different pixels\x1b[0m)' % diff
-
- if self.overwrite_failures:
- self.errors.append((self.REPLACE, actual, expected, diff, None))
- contents = open(actual, 'r').read()
- open(expected, 'wb').write(contents)
- else:
- self.errors.append((self.DIFF, actual, expected, diff, None))
-
- def result_pass(self, actual, expected, diff):
- self.passed += 1
- if self.quiet:
- if platform.uname()[0] == 'Windows':
- sys.stderr.write('.')
- else:
- sys.stderr.write('\x1b[32m.\x1b[0m')
- else:
- if platform.uname()[0] == 'Windows':
- print '\x1b[32m✓\x1b[0m'
- else:
- print '✓'
-
- def not_found(self, actual, expected):
- self.failed += 1
- self.errors.append((self.NOT_FOUND, actual, expected, 0, None))
- if self.quiet:
- sys.stderr.write('\x1b[33m.\x1b[0m')
- else:
- print '\x1b[33m?\x1b[0m (\x1b[34mReference file not found, creating\x1b[0m)'
- contents = open(actual, 'r').read()
- open(expected, 'wb').write(contents)
-
- def other_error(self, expected, message):
- self.failed += 1
- self.errors.append((self.OTHER, None, expected, 0, message))
- if self.quiet:
- sys.stderr.write('\x1b[31m.\x1b[0m')
- else:
- print '\x1b[31m✘\x1b[0m (\x1b[34m%s\x1b[0m)' % message
-
- def make_html_item(self,actual,expected,diff):
- item = '''
- <div class="expected">
- <a href="%s">
- <img src="%s" width="100%s">
- </a>
- </div>
- ''' % (expected,expected,'%')
- item += '<div class="text">%s</div>' % (diff)
- item += '''
- <div class="actual">
- <a href="%s">
- <img src="%s" width="100%s">
- </a>
- </div>
- ''' % (actual,actual,'%')
- return item
-
- def summary(self):
- if len(self.errors) == 0:
- print '\nAll %s visual tests passed: \x1b[1;32m✓ \x1b[0m' % self.passed
- return 0
- sortable_errors = []
- print "\nVisual rendering: %s failed / %s passed" % (len(self.errors), self.passed)
- for idx, error in enumerate(self.errors):
- if error[0] == self.OTHER:
- print str(idx+1) + ") \x1b[31mfailure to run test:\x1b[0m %s (\x1b[34m%s\x1b[0m)" % (error[2],error[4])
- elif error[0] == self.NOT_FOUND:
- print str(idx+1) + ") Generating reference image: '%s'" % error[2]
- continue
- elif error[0] == self.DIFF:
- print str(idx+1) + ") \x1b[34m%s different pixels\x1b[0m:\n\t%s (\x1b[31mactual\x1b[0m)\n\t%s (\x1b[32mexpected\x1b[0m)" % (error[3], error[1], error[2])
- if '.png' in error[1]: # ignore grids
- sortable_errors.append((error[3],error))
- elif error[0] == self.REPLACE:
- print str(idx+1) + ") \x1b[31mreplaced reference with new version:\x1b[0m %s" % error[2]
- if len(sortable_errors):
- # drop failure results in folder
- vdir = os.path.join(visual_output_dir,'visual-test-results')
- if not os.path.exists(vdir):
- os.makedirs(vdir)
- html_template = open(os.path.join(dirname,'html_report_template.html'),'r').read()
- name = 'comparison.html'
- failures_realpath = os.path.join(vdir,name)
- html_out = open(failures_realpath,'w+')
- sortable_errors.sort(reverse=True)
- html_body = ''
- for item in sortable_errors:
- # copy images into single directory
- actual = item[1][1]
- expected = item[1][2]
- diff = item[0]
- actual_new = os.path.join(vdir,os.path.basename(actual))
- shutil.copy(actual,actual_new)
- expected_new = os.path.join(vdir,os.path.basename(expected))
- shutil.copy(expected,expected_new)
- html_body += self.make_html_item(os.path.relpath(actual_new,vdir),os.path.relpath(expected_new,vdir),diff)
- html_out.write(html_template.replace('{{RESULTS}}',html_body))
- print 'View failures by opening %s' % failures_realpath
- return 1
-
-def render(filename,config, width, height, bbox, scale_factor, reporting):
- m = mapnik.Map(width, height)
- postfix = "%s-%d-%d-%s" % (filename, width, height, scale_factor)
-
- try:
- mapnik.load_map(m, os.path.join(dirname, "styles", "%s.xml" % filename), True)
- if bbox is not None:
- m.zoom_to_box(bbox)
- else:
- m.zoom_all()
- except Exception, e:
- if 'Could not create datasource' in str(e) \
- or 'Bad connection' in str(e):
- return m
- reporting.other_error(filename, repr(e))
- return m
-
- for renderer in renderers:
- if config.get(renderer['name'], True):
- expected = os.path.join(dirname, renderer['dir'], '%s-%s-reference.%s' %
- (postfix, renderer['name'], renderer['filetype']))
- actual = os.path.join(visual_output_dir, '%s-%s.%s' %
- (postfix, renderer['name'], renderer['filetype']))
- if not quiet:
- print "\"%s\" with %s..." % (postfix, renderer['name']),
- try:
- renderer['render'](m, actual, scale_factor)
- if not os.path.exists(expected):
- reporting.not_found(actual, expected)
- else:
- diff = renderer['compare'](actual, expected)
- if diff > renderer['threshold']:
- reporting.result_fail(actual, expected, diff)
- else:
- reporting.result_pass(actual, expected, diff)
- except Exception, e:
- reporting.other_error(expected, repr(e))
- return m
-
-if __name__ == "__main__":
- if '-q' in sys.argv:
- quiet = True
- sys.argv.remove('-q')
- else:
- quiet = False
-
- if '--overwrite' in sys.argv:
- overwrite_failures = True
- sys.argv.remove('--overwrite')
- else:
- overwrite_failures = False
-
- select_files = {}
- if len(sys.argv) > 1:
- for name in sys.argv[1:]:
- if name in files:
- select_files[name]=files[name]
- else:
- select_files[name]={}
- if len(select_files) > 0:
- files = select_files
-
- if not os.path.exists(visual_output_dir):
- os.makedirs(visual_output_dir)
-
- reporting = Reporting(quiet, overwrite_failures)
- try:
- for filename in files:
- config = dict(defaults)
- config.update(files[filename])
- for size in config['sizes']:
- for scale_factor in config['scales']:
- m = render(filename,
- config,
- size[0],
- size[1],
- config.get('bbox'),
- scale_factor,
- reporting)
- #mapnik.save_map(m, os.path.join(dirname, 'xml_output', "%s-out.xml" % filename))
- except KeyboardInterrupt:
- pass
- sys.exit(reporting.summary())
diff --git a/tests/visual_tests/test_python.py b/tests/visual_tests/test_python.py
deleted file mode 100755
index 301017b..0000000
--- a/tests/visual_tests/test_python.py
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/usr/bin/env python
-import mapnik
-import sys
-import os.path
-from compare import compare
-
-dirname = os.path.dirname(__file__)
-visual_output_dir = "/tmp/mapnik-visual-images"
-
-class MyText(mapnik.FormattingNode):
- def __init__(self):
- mapnik.FormattingNode.__init__(self)
- self.expr = mapnik.Expression("[name]")
- self.expr_nr = mapnik.Expression("[nr]")
-
- def apply(self, properties, feature, output):
- colors = [mapnik.Color('red'),
- mapnik.Color('green'),
- mapnik.Color('blue')]
- text = self.expr.evaluate(feature)
- if int(feature['nr']) > 5:
- i = 0
- my_properties = mapnik.CharProperties(properties)
- for char in text:
- my_properties.fill = colors[i % len(colors)]
- output.append(my_properties, char)
- i += 1
- else:
- output.append(properties, text)
-
- def add_expressions(self, output):
- output.insert(self.expr)
- output.insert(self.expr_nr)
-
-
-class IfElse(mapnik.FormattingNode):
- def __init__(self, condition, if_node, else_node):
- mapnik.FormattingNode.__init__(self)
- self.condition = mapnik.Expression(condition)
- self.if_node = if_node
- self.else_node = else_node
-
- def apply(self, properties, feature, output):
- c = self.condition.evaluate(feature)
- if c:
- self.if_node.apply(properties, feature, output)
- else:
- self.else_node.apply(properties, feature, output)
-
- def add_expressions(self, output):
- output.insert(self.condition)
- self.if_node.add_expressions(output)
- self.else_node.add_expressions(output)
-
-m = mapnik.Map(600, 100)
-m.background = mapnik.Color('white')
-
-text = mapnik.TextSymbolizer()
-text.placements.defaults.displacement = (0, 5)
-text.placements.defaults.format.face_name = 'DejaVu Sans Book'
-
-point = mapnik.PointSymbolizer()
-
-rule = mapnik.Rule()
-rule.symbols.append(text)
-rule.symbols.append(point)
-
-style = mapnik.Style()
-style.rules.append(rule)
-
-m.append_style('Style', style)
-
-
-layer = mapnik.Layer('Layer')
-layer.datasource = mapnik.Datasource(**{'type':'csv','file':os.path.join(dirname,"data/points.csv")})
-layer.styles.append('Style')
-m.layers.append(layer)
-
-bbox = mapnik.Box2d(-0.05, -0.01, 0.95, 0.01)
-m.zoom_to_box(bbox)
-
-formatnode = mapnik.FormattingFormat()
-formatnode.child = mapnik.FormattingText("[name]")
-formatnode.fill = mapnik.Color("green")
-
-format_trees = [
- ('TextNode', mapnik.FormattingText("[name]")),
- ('MyText', MyText()),
- ('IfElse', IfElse("[nr] != 5",
- mapnik.FormattingText("[name]"),
- mapnik.FormattingText("'SPECIAL!'"))),
- ('Format', formatnode),
- ('List', mapnik.FormattingList([
- mapnik.FormattingText("[name]+'\n'"),
- MyText()
- ])
- )
-]
-
-
-for format_tree in format_trees:
- text.placements.defaults.format_tree = format_tree[1]
- actual = os.path.join(visual_output_dir, 'python-%s.png' % format_tree[0])
- expected = os.path.join(dirname,"images", 'python-%s-reference.png' % format_tree[0])
- mapnik.render_to_file(m, actual, 'png8:m=h')
- diff = compare(actual,expected)
- if diff > 0:
- print 'comparision failed between:\n %s (actual)\n %s (expected)' % (actual,expected)
-
diff --git a/tests/visual_tests/xml_output/.gitignore b/tests/visual_tests/xml_output/.gitignore
deleted file mode 100644
index 6722cd9..0000000
--- a/tests/visual_tests/xml_output/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.xml
diff --git a/utils/geometry_to_wkb/Jamroot b/utils/geometry_to_wkb/Jamroot
index 92c6686..edb1527 100644
--- a/utils/geometry_to_wkb/Jamroot
+++ b/utils/geometry_to_wkb/Jamroot
@@ -1,12 +1,12 @@
######################################################################
-MAPNIK_INCLUDE_DIR = "/opt/mapnik/include" ;
+MAPNIK_INCLUDE_DIR = "/Users/artem/Projects/mapnik/include" ;
MAPNIK_LIB_DIR = "/opt/mapnik/lib" ;
-BOOST_INCLUDE_DIR = "/opt/boost_1_48_0/include" ;
-
+BOOST_INCLUDE_DIR = "/opt/boost/include" ;
+ICU_DIR = "/opt/icu" ;
lib mapnik : : <name>mapnik <search>$(MAPNIK_LIB_DIR) ;
-lib icu : : <name>icuuc <search>/usr/local/lib ;
+lib icu : : <name>icuuc <search>$(ICU_DIR)/lib ;
exe to_wkb :
main.cpp
@@ -14,6 +14,6 @@ exe to_wkb :
.//icu
:
<include>$(MAPNIK_INCLUDE_DIR)
- <include>$(BOOST_INCLUDE_DIR)
+ <include>$(BOOST_INCLUDE_DIR)
+ <include>$(ICU_DIR)/include
;
-
diff --git a/utils/geometry_to_wkb/main.cpp b/utils/geometry_to_wkb/main.cpp
index 76396ff..1b0056a 100644
--- a/utils/geometry_to_wkb/main.cpp
+++ b/utils/geometry_to_wkb/main.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2011 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,12 +26,12 @@
#include <mapnik/geometry.hpp>
#include <mapnik/feature.hpp>
+#include <mapnik/params.hpp>
+#include <mapnik/datasource.hpp>
#include <mapnik/datasource_cache.hpp>
#include <mapnik/util/geometry_to_wkb.hpp>
-
-
int main (int argc, char ** argv )
{
@@ -81,21 +81,17 @@ int main (int argc, char ** argv )
while(f)
{
std::cerr << *f << std::endl;
- mapnik::geometry_container const& paths = f->paths();
- for (mapnik::geometry_type const& geom : paths)
+ mapnik::geometry::geometry<double> const& geom = f->get_geometry();
+ // NDR
{
- // NDR
- {
- mapnik::util::wkb_buffer_ptr wkb = mapnik::util::to_wkb(geom,mapnik::util::wkbNDR);
- std::cerr << mapnik::util::to_hex(wkb->buffer(),wkb->size()) << std::endl;
- }
- // XDR
- {
- mapnik::util::wkb_buffer_ptr wkb = mapnik::util::to_wkb(geom,mapnik::util::wkbXDR);
- std::cerr << mapnik::util::to_hex(wkb->buffer(),wkb->size()) << std::endl;
- }
+ mapnik::util::wkb_buffer_ptr wkb = mapnik::util::to_wkb(geom,mapnik::wkbNDR);
+ std::cerr << mapnik::util::detail::to_hex(wkb->buffer(),wkb->size()) << std::endl;
+ }
+ // XDR
+ {
+ mapnik::util::wkb_buffer_ptr wkb = mapnik::util::to_wkb(geom,mapnik::wkbXDR);
+ std::cerr << mapnik::util::detail::to_hex(wkb->buffer(),wkb->size()) << std::endl;
}
-
f = fs->next();
}
}
diff --git a/utils/mapnik-config/build.py b/utils/mapnik-config/build.py
index 31fd9ed..d21b2a7 100644
--- a/utils/mapnik-config/build.py
+++ b/utils/mapnik-config/build.py
@@ -50,6 +50,9 @@ CONFIG_MAPNIK_INCLUDE="${CONFIG_PREFIX}/include -I${CONFIG_PREFIX}/include/mapni
CONFIG_DEP_INCLUDES="%(dep_includes)s"
CONFIG_CXXFLAGS="%(cxxflags)s"
CONFIG_CXX='%(cxx)s'
+CONFIG_MAPNIK_GDAL_DATA='%(mapnik_bundled_gdal_data)s'
+CONFIG_MAPNIK_PROJ_LIB='%(mapnik_bundled_proj_data)s'
+CONFIG_MAPNIK_ICU_DATA='%(mapnik_bundled_icu_data)s'
'''
@@ -107,6 +110,15 @@ if lib_root in inputpluginspath:
lib_path = "${CONFIG_PREFIX}/" + config_env['LIBDIR_SCHEMA']
+mapnik_bundled_gdal_data = ''
+mapnik_bundled_proj_data = ''
+mapnik_bundled_icu_data = ''
+
+if config_env.get('MAPNIK_BUNDLED_SHARE_DIRECTORY'):
+ mapnik_bundled_gdal_data = 'lib/mapnik/share/gdal'
+ mapnik_bundled_proj_data = 'lib/mapnik/share/proj'
+ mapnik_bundled_icu_data = 'lib/mapnik/share/icu'
+
configuration = {
"git_revision": git_revision,
"git_describe": git_describe,
@@ -121,7 +133,10 @@ configuration = {
"input_plugins": inputpluginspath,
"defines":defines,
"cxxflags":cxxflags,
- "cxx":env['CXX']
+ "cxx":env['CXX'],
+ "mapnik_bundled_gdal_data":mapnik_bundled_gdal_data,
+ "mapnik_bundled_proj_data":mapnik_bundled_proj_data,
+ "mapnik_bundled_icu_data":mapnik_bundled_icu_data,
}
## if we are statically linking depedencies
diff --git a/utils/mapnik-config/mapnik-config.template.sh b/utils/mapnik-config/mapnik-config.template.sh
index a71fdf6..27dc32c 100755
--- a/utils/mapnik-config/mapnik-config.template.sh
+++ b/utils/mapnik-config/mapnik-config.template.sh
@@ -27,6 +27,9 @@ Known values for OPTION are:
--cflags all include paths, compiler flags, and pre-processor defines (for back-compatibility)
--cxx c++ compiler used to build mapnik (new in 2.2.0)
--all-flags all compile and link flags (new in 2.2.0)
+ --gdal-data path to GDAL_DATA directory, if known (relevant only for packaged builds of Mapnik) (new in 3.0.0)
+ --proj-lib path to PROJ_LIB directory, if known (relevant only for packaged builds of Mapnik) (new in 3.0.0)
+ --icu-data path to ICU_DATA directory, if known (relevant only for packaged builds of Mapnik) (new in 3.0.0)
EOF
exit $1
@@ -128,6 +131,18 @@ while test $# -gt 0; do
echo -I${CONFIG_MAPNIK_INCLUDE} ${CONFIG_DEP_INCLUDES} ${CONFIG_MAPNIK_DEFINES} ${CONFIG_CXXFLAGS} -L${CONFIG_MAPNIK_LIBPATH} -l${CONFIG_MAPNIK_LIBNAME} ${CONFIG_MAPNIK_LDFLAGS} ${CONFIG_DEP_LIBS}
;;
+ --gdal-data)
+ if [[ ${CONFIG_MAPNIK_GDAL_DATA:-unset} != "unset" ]]; then echo ${CONFIG_PREFIX}/${CONFIG_MAPNIK_GDAL_DATA}; fi;
+ ;;
+
+ --proj-lib)
+ if [[ ${CONFIG_MAPNIK_PROJ_LIB:-unset} != "unset" ]]; then echo ${CONFIG_PREFIX}/${CONFIG_MAPNIK_PROJ_LIB}; fi;
+ ;;
+
+ --icu-data)
+ if [[ ${CONFIG_MAPNIK_ICU_DATA:-unset} != "unset" ]]; then echo ${CONFIG_PREFIX}/${CONFIG_MAPNIK_ICU_DATA}; fi;
+ ;;
+
*)
# push to stderr any invalid options
echo "unknown option $1" 1>&2;
diff --git a/utils/nik2img/nik2img.cpp b/utils/nik2img/nik2img.cpp
index 2d4aceb..e223cf0 100644
--- a/utils/nik2img/nik2img.cpp
+++ b/utils/nik2img/nik2img.cpp
@@ -4,14 +4,13 @@
#include <mapnik/version.hpp>
#include <mapnik/debug.hpp>
#include <mapnik/image_util.hpp>
-#include <mapnik/graphics.hpp>
+#include <mapnik/unicode.hpp>
#include <mapnik/datasource_cache.hpp>
#include <mapnik/font_engine_freetype.hpp>
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#include <boost/tokenizer.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/program_options.hpp>
#pragma GCC diagnostic pop
@@ -27,6 +26,8 @@ int main (int argc,char** argv)
int return_value = 0;
std::string xml_file;
std::string img_file;
+ double scale_factor = 1;
+ bool params_as_variables = false;
mapnik::logger logger;
logger.set_severity(mapnik::logger::error);
@@ -40,6 +41,8 @@ int main (int argc,char** argv)
("open","automatically open the file after rendering (os x only)")
("xml",po::value<std::string>(),"xml map to read")
("img",po::value<std::string>(),"image to render")
+ ("scale-factor",po::value<double>(),"scale factor for rendering")
+ ("variables","make map parameters available as render-time variables")
;
po::positional_options_description p;
@@ -91,13 +94,49 @@ int main (int argc,char** argv)
return -1;
}
+ if (vm.count("scale-factor"))
+ {
+ scale_factor=vm["scale-factor"].as<double>();
+ }
+
+ if (vm.count("variables"))
+ {
+ params_as_variables = true;
+ }
+
mapnik::datasource_cache::instance().register_datasources("./plugins/input/");
mapnik::freetype_engine::register_fonts("./fonts",true);
mapnik::Map map(600,400);
mapnik::load_map(map,xml_file,true);
map.zoom_all();
- mapnik::image_32 im(map.width(),map.height());
- mapnik::agg_renderer<mapnik::image_32> ren(map,im);
+ mapnik::image_rgba8 im(map.width(),map.height());
+ mapnik::request req(map.width(),map.height(),map.get_current_extent());
+ req.set_buffer_size(map.buffer_size());
+ mapnik::attributes vars;
+ if (params_as_variables)
+ {
+ mapnik::transcoder tr("utf-8");
+ for (auto const& param : map.get_extra_parameters())
+ {
+ std::string const& name = param.first.substr(1);
+ if (!name.empty())
+ {
+ if (param.second.is<mapnik::value_integer>())
+ {
+ vars[name] = param.second.get<mapnik::value_integer>();
+ }
+ else if (param.second.is<mapnik::value_double>())
+ {
+ vars[name] = param.second.get<mapnik::value_double>();
+ }
+ else if (param.second.is<std::string>())
+ {
+ vars[name] = tr.transcode(param.second.get<std::string>().c_str());
+ }
+ }
+ }
+ }
+ mapnik::agg_renderer<mapnik::image_rgba8> ren(map,req,vars,im,scale_factor,0,0);
ren.apply();
mapnik::save_to_file(im,img_file);
if (auto_open)
diff --git a/utils/ogrindex/ogrindex.cpp b/utils/ogrindex/ogrindex.cpp
index 21906c6..7e34a65 100644
--- a/utils/ogrindex/ogrindex.cpp
+++ b/utils/ogrindex/ogrindex.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2006 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,6 @@
#include <vector>
#include <string>
-#include <boost/tokenizer.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/program_options.hpp>
@@ -216,4 +215,3 @@ int main (int argc,char** argv)
std::clog << "done!" << std::endl;
return 0;
}
-
diff --git a/utils/performance/build.py b/utils/performance/build.py
deleted file mode 100644
index 8fb7d6b..0000000
--- a/utils/performance/build.py
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2013 Artem Pavlenko
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-#
-#
-
-
-import os
-Import ('env')
-
-TARGET = 'mapnik-speed-check'
-
-if 'uninstall' not in COMMAND_LINE_TARGETS:
- env.Install(os.path.join(env['INSTALL_PREFIX'],'bin'), TARGET)
- env.Alias('install', os.path.join(env['INSTALL_PREFIX'],'bin'))
-
-env['create_uninstall_target'](env, os.path.join(env['INSTALL_PREFIX'],'bin',TARGET))
diff --git a/utils/performance/mapnik-speed-check b/utils/performance/mapnik-speed-check
deleted file mode 100755
index 44cf0bc..0000000
--- a/utils/performance/mapnik-speed-check
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-import mapnik
-#import mapnik
-from timeit import Timer, time
-
-if not len(sys.argv) >= 3:
- sys.exit('usage: mapnik-speed-check <stylesheet> <iterations> [minx,miny,maxx,maxy]')
-
-m = mapnik.Map(256,256)
-stylesheet = sys.argv[1]
-
-TOTAL_TIME = 0
-
-def load():
- global TOTAL_TIME
- global stylesheet
- start = time.time()
- m = mapnik.Map(256,256)
- mapnik.load_map(m,stylesheet)
- TOTAL_TIME += (time.time() - start)
-
-def init(stylesheet):
- mapnik.load_map(m,stylesheet)
- m.zoom_all()
-
-def render():
- global TOTAL_TIME
- start = time.time()
- im = mapnik.Image(m.width,m.height)
- mapnik.render(m,im)
- TOTAL_TIME += (time.time() - start)
-
-def f_(set):
- min_ = str(min(set)*1000)[:6]
- avg = str((sum(set)/len(set))*1000)[:6]
- print 'min: %sms | avg: %sms | total: %ss' % (min_,avg,str(TOTAL_TIME)[:6])
-
-if __name__=='__main__':
- # if passed, set up bbox
-
- #test_ = "load()"
- test_ = "render()"
- init(stylesheet)
-
- if len(sys.argv) == 4:
- bbox = sys.argv[3]
- if ',' in bbox:
- parts = bbox.split(',')
- else:
- parts = bbox.split(' ')
- env = mapnik.Box2d(*map(float,parts))
- m.zoom_to_box(env)
-
- # load once - making sure mmap'd shapefiles are loaded
- eval(test_)
- TOTAL_TIME = 0
-
- # now actually run the test
- t = Timer(test_, "from __main__ import %s" % test_.replace('()',''))
- iterations = int(sys.argv[2])
- f_(t.repeat(iterations,1))
\ No newline at end of file
diff --git a/utils/pgsql2sqlite/main.cpp b/utils/pgsql2sqlite/main.cpp
index 6325001..63d9b50 100644
--- a/utils/pgsql2sqlite/main.cpp
+++ b/utils/pgsql2sqlite/main.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2009 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/utils/pgsql2sqlite/pgsql2sqlite.hpp b/utils/pgsql2sqlite/pgsql2sqlite.hpp
index bdba8fa..78db58f 100644
--- a/utils/pgsql2sqlite/pgsql2sqlite.hpp
+++ b/utils/pgsql2sqlite/pgsql2sqlite.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2009 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -29,12 +29,18 @@
#include <mapnik/global.hpp>
#include <mapnik/sql_utils.hpp>
#include <mapnik/util/conversions.hpp>
+#include <mapnik/geometry_is_empty.hpp>
+#include <mapnik/geometry_envelope.hpp>
#include "connection_manager.hpp"
#include "cursorresultset.hpp"
// boost
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wunused-local-typedef"
#include <boost/algorithm/string.hpp>
+#pragma GCC diagnostic pop
//st
#include <cstdint>
@@ -383,21 +389,18 @@ void pgsql2sqlite(Connection conn,
if (oid == geometry_oid)
{
mapnik::Feature feat(ctx,pkid);
- if (geometry_utils::from_wkb(feat.paths(),buf,size,wkbGeneric)
- && feat.num_geometries() > 0)
+ mapnik::geometry::geometry<double> geom = geometry_utils::from_wkb(buf, size, wkbGeneric);
+ if (!mapnik::geometry::is_empty(geom))
{
- geometry_type const& geom=feat.get_geometry(0);
- box2d<double> bbox = geom.envelope();
+ box2d<double> bbox = mapnik::geometry::envelope(geom);
if (bbox.valid())
{
sqlite::record_type rec;
-
rec.push_back(sqlite::value_type(pkid));
rec.push_back(sqlite::value_type(bbox.minx()));
rec.push_back(sqlite::value_type(bbox.maxx()));
rec.push_back(sqlite::value_type(bbox.miny()));
rec.push_back(sqlite::value_type(bbox.maxy()));
-
spatial_index.insert_record(rec);
empty_geom = false;
}
diff --git a/utils/pgsql2sqlite/sqlite.cpp b/utils/pgsql2sqlite/sqlite.cpp
index 2da3fb1..61ef5b3 100644
--- a/utils/pgsql2sqlite/sqlite.cpp
+++ b/utils/pgsql2sqlite/sqlite.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2009 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/utils/pgsql2sqlite/sqlite.hpp b/utils/pgsql2sqlite/sqlite.hpp
index 3301b8e..fcafe21 100644
--- a/utils/pgsql2sqlite/sqlite.hpp
+++ b/utils/pgsql2sqlite/sqlite.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2009 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -20,7 +20,7 @@
*
*****************************************************************************/
-#include <mapnik/noncopyable.hpp>
+#include <mapnik/util/noncopyable.hpp>
#include <mapnik/util/variant.hpp>
// boost
#include <memory>
@@ -38,7 +38,7 @@
namespace mapnik { namespace sqlite {
- class database : private mapnik::noncopyable
+ class database : private util::noncopyable
{
friend class prepared_statement;
@@ -75,9 +75,9 @@ namespace mapnik { namespace sqlite {
using value_type = mapnik::util::variant<int,double,std::string, blob,null_type>;
using record_type = std::vector<value_type>;
- class prepared_statement : mapnik::noncopyable
+ class prepared_statement : util::noncopyable
{
- struct binder : public mapnik::util::static_visitor<bool>
+ struct binder
{
binder(sqlite3_stmt * stmt, unsigned index)
: stmt_(stmt), index_(index) {}
diff --git a/utils/shapeindex/quadtree.hpp b/utils/shapeindex/quadtree.hpp
index db64787..0ad2fd6 100644
--- a/utils/shapeindex/quadtree.hpp
+++ b/utils/shapeindex/quadtree.hpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2006 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/utils/shapeindex/shapeindex.cpp b/utils/shapeindex/shapeindex.cpp
index 0161ea8..bcf4a57 100644
--- a/utils/shapeindex/shapeindex.cpp
+++ b/utils/shapeindex/shapeindex.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2006 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -32,7 +32,6 @@
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
#pragma GCC diagnostic ignored "-Wunused-local-typedef"
-#include <boost/tokenizer.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/program_options.hpp>
#pragma GCC diagnostic pop
@@ -110,18 +109,18 @@ int main (int argc,char** argv)
clog << "max tree depth:" << depth << endl;
clog << "split ratio:" << ratio << endl;
- vector<string>::const_iterator itr = shape_files.begin();
- if (itr == shape_files.end())
+ //vector<string>::const_iterator itr = shape_files.begin();
+ if (shape_files.size() == 0)
{
clog << "no shape files to index" << endl;
return 0;
}
- while (itr != shape_files.end())
+ for (auto const& filename : shape_files)
{
- clog << "processing " << *itr << endl;
- std::string shapename (*itr++);
+ clog << "processing " << filename << endl;
+ std::string shapename (filename);
boost::algorithm::ireplace_last(shapename,".shp","");
- std::string shapename_full (shapename+".shp");
+ std::string shapename_full (shapename + ".shp");
if (! mapnik::util::exists (shapename_full))
{
@@ -165,17 +164,23 @@ int main (int argc,char** argv)
box2d<double> item_ext;
if (shape_type==shape_io::shape_null)
{
- // still need to increment pos, or the pos counter
- // won't indicate EOF until too late.
- pos+=4+content_length;
- continue;
+ if (pos >= file_length)
+ {
+ break;
+ }
+ else
+ {
+ // still need to increment pos, or the pos counter
+ // won't indicate EOF until too late.
+ pos+=4+content_length;
+ continue;
+ }
}
else if (shape_type==shape_io::shape_point)
{
double x=shp.read_double();
double y=shp.read_double();
item_ext=box2d<double>(x,y,x,y);
-
}
else if (shape_type==shape_io::shape_pointm)
{
@@ -184,7 +189,6 @@ int main (int argc,char** argv)
// skip m
shp.read_double();
item_ext=box2d<double>(x,y,x,y);
-
}
else if (shape_type==shape_io::shape_pointz)
{
@@ -192,31 +196,39 @@ int main (int argc,char** argv)
double y=shp.read_double();
// skip z
shp.read_double();
- //skip m if exists
- if ( content_length == 8 + 36)
+ // According to ESRI shapefile doc
+ // A PointZ consists of a triplet of double-precision coordinates in the order X, Y, Z plus a
+ // measure.
+ // PointZ
+ // {
+ // Double X // X coordinate
+ // Double Y // Y coordinate
+ // Double Z // Z coordinate
+ // Double M // Measure
+ // }
+ // But OGR creates shapefiles with M missing so we need to skip M only if present
+ // NOTE: content_length is in 16-bit words
+ if ( content_length == 18)
{
shp.read_double();
}
item_ext=box2d<double>(x,y,x,y);
}
-
else
{
shp.read_envelope(item_ext);
shp.skip(2*content_length-4*8-4);
}
-
tree.insert(offset,item_ext);
- if (verbose) {
+ if (verbose)
+ {
clog << "record number " << record_number << " box=" << item_ext << endl;
}
pos+=4+content_length;
++count;
- if (pos>=file_length) {
- break;
- }
+ if (pos >= file_length) break;
}
clog << " number shapes=" << count << endl;
@@ -239,4 +251,3 @@ int main (int argc,char** argv)
clog << "done!" << endl;
return 0;
}
-
diff --git a/utils/stats/mapdef_stats.py b/utils/stats/mapdef_stats.py
deleted file mode 100755
index df4fc18..0000000
--- a/utils/stats/mapdef_stats.py
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-from mapnik import *
-if __name__ == "__main__":
- if len(sys.argv) != 2:
- print "usage : ./mapdef_stats.py <mapdefinition file>"
- sys.exit(0)
-
- m = Map(100,100)
- styles = []
- num_rules = 0
- num_sym = 0
- load_map(m,sys.argv[1])
- for l in m.layers:
- print "Layer:%s" % l.name
- for s in l.styles:
- print " Style:%s" % s
- styles.append(s)
- style = m.find_style(s)
- num_rules += len(style.rules)
- for r in style.rules:
- print " Filter: %s" % r.filter
- num_sym += len(r.symbols)
-
- print "Total number of layers %s" % len(m.layers)
- print "Total number of styles %s" % len(set(styles)) # unique styles
- print "Total number of rules %s" % num_rules
- print "Total number of symbolizers %s" % num_sym
diff --git a/utils/svg2png/svg2png.cpp b/utils/svg2png/svg2png.cpp
index 796cd27..a5e8418 100644
--- a/utils/svg2png/svg2png.cpp
+++ b/utils/svg2png/svg2png.cpp
@@ -2,7 +2,7 @@
*
* This file is part of Mapnik (c++ mapping toolkit)
*
- * Copyright (C) 2010 Artem Pavlenko
+ * Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -30,7 +30,6 @@
#include <mapnik/marker.hpp>
#include <mapnik/marker_cache.hpp>
#include <mapnik/image_util.hpp>
-#include <mapnik/graphics.hpp>
#include <mapnik/svg/svg_path_adapter.hpp>
#include <mapnik/svg/svg_renderer_agg.hpp>
#include <mapnik/svg/svg_path_attributes.hpp>
@@ -51,6 +50,92 @@
#include <libxml/parser.h> // for xmlInitParser(), xmlCleanupParser()
+struct main_marker_visitor
+{
+ main_marker_visitor(std::string & svg_name,
+ int & return_value,
+ bool verbose,
+ bool auto_open)
+ : svg_name_(svg_name),
+ return_value_(return_value),
+ verbose_(verbose),
+ auto_open_(auto_open) {}
+
+ void operator() (mapnik::marker_null const&)
+ {
+ std::clog << "svg2png error: '" << svg_name_ << "' is not a valid vector!\n";
+ return_value_ = -1;
+ }
+
+ void operator() (mapnik::marker_rgba8 const&)
+ {
+ std::clog << "svg2png error: '" << svg_name_ << "' is not a valid vector!\n";
+ return_value_ = -1;
+ }
+
+ void operator() (mapnik::marker_svg const& marker)
+ {
+ using pixfmt = agg::pixfmt_rgba32_pre;
+ using renderer_base = agg::renderer_base<pixfmt>;
+ using renderer_solid = agg::renderer_scanline_aa_solid<renderer_base>;
+ agg::rasterizer_scanline_aa<> ras_ptr;
+ agg::scanline_u8 sl;
+
+ double opacity = 1;
+ int w = marker.width();
+ int h = marker.height();
+ if (verbose_)
+ {
+ std::clog << "found width of '" << w << "' and height of '" << h << "'\n";
+ }
+ // 10 pixel buffer to avoid edge clipping of 100% svg's
+ mapnik::image_rgba8 im(w+0,h+0);
+ agg::rendering_buffer buf(im.bytes(), im.width(), im.height(), im.row_size());
+ pixfmt pixf(buf);
+ renderer_base renb(pixf);
+
+ mapnik::box2d<double> const& bbox = marker.get_data()->bounding_box();
+ mapnik::coord<double,2> c = bbox.center();
+ // center the svg marker on '0,0'
+ agg::trans_affine mtx = agg::trans_affine_translation(-c.x,-c.y);
+ // render the marker at the center of the marker box
+ mtx.translate(0.5 * im.width(), 0.5 * im.height());
+
+ mapnik::svg::vertex_stl_adapter<mapnik::svg::svg_path_storage> stl_storage(marker.get_data()->source());
+ mapnik::svg::svg_path_adapter svg_path(stl_storage);
+ mapnik::svg::svg_renderer_agg<mapnik::svg::svg_path_adapter,
+ agg::pod_bvector<mapnik::svg::path_attributes>,
+ renderer_solid,
+ agg::pixfmt_rgba32_pre > svg_renderer_this(svg_path,
+ marker.get_data()->attributes());
+
+ svg_renderer_this.render(ras_ptr, sl, renb, mtx, opacity, bbox);
+
+ boost::algorithm::ireplace_last(svg_name_,".svg",".png");
+ demultiply_alpha(im);
+ mapnik::save_to_file<mapnik::image_rgba8>(im,svg_name_,"png");
+ if (auto_open_)
+ {
+ std::ostringstream s;
+#ifdef DARWIN
+ s << "open " << svg_name_;
+#else
+ s << "xdg-open " << svg_name_;
+#endif
+ int ret = system(s.str().c_str());
+ if (ret != 0)
+ return_value_ = ret;
+ }
+ std::clog << "rendered to: " << svg_name_ << "\n";
+
+ }
+
+ private:
+ std::string & svg_name_;
+ int & return_value_;
+ bool verbose_;
+ bool auto_open_;
+};
int main (int argc,char** argv)
{
@@ -128,74 +213,9 @@ int main (int argc,char** argv)
std::clog << "found: " << svg_name << "\n";
}
- boost::optional<mapnik::marker_ptr> marker_ptr =
- mapnik::marker_cache::instance().find(svg_name, false);
- if (!marker_ptr)
- {
- std::clog << "svg2png error: could not open: '" << svg_name << "'\n";
- return_value = -1;
- continue;
- }
- mapnik::marker marker = **marker_ptr;
- if (!marker.is_vector())
- {
- std::clog << "svg2png error: '" << svg_name << "' is not a valid vector!\n";
- return_value = -1;
- continue;
- }
-
- using pixfmt = agg::pixfmt_rgba32_pre;
- using renderer_base = agg::renderer_base<pixfmt>;
- using renderer_solid = agg::renderer_scanline_aa_solid<renderer_base>;
- agg::rasterizer_scanline_aa<> ras_ptr;
- agg::scanline_u8 sl;
-
- double opacity = 1;
- int w = marker.width();
- int h = marker.height();
- if (verbose)
- {
- std::clog << "found width of '" << w << "' and height of '" << h << "'\n";
- }
- // 10 pixel buffer to avoid edge clipping of 100% svg's
- mapnik::image_32 im(w+0,h+0);
- agg::rendering_buffer buf(im.raw_data(), im.width(), im.height(), im.width() * 4);
- pixfmt pixf(buf);
- renderer_base renb(pixf);
-
- mapnik::box2d<double> const& bbox = (*marker.get_vector_data())->bounding_box();
- mapnik::coord<double,2> c = bbox.center();
- // center the svg marker on '0,0'
- agg::trans_affine mtx = agg::trans_affine_translation(-c.x,-c.y);
- // render the marker at the center of the marker box
- mtx.translate(0.5 * im.width(), 0.5 * im.height());
-
- mapnik::svg::vertex_stl_adapter<mapnik::svg::svg_path_storage> stl_storage((*marker.get_vector_data())->source());
- mapnik::svg::svg_path_adapter svg_path(stl_storage);
- mapnik::svg::svg_renderer_agg<mapnik::svg::svg_path_adapter,
- agg::pod_bvector<mapnik::svg::path_attributes>,
- renderer_solid,
- agg::pixfmt_rgba32_pre > svg_renderer_this(svg_path,
- (*marker.get_vector_data())->attributes());
-
- svg_renderer_this.render(ras_ptr, sl, renb, mtx, opacity, bbox);
-
- boost::algorithm::ireplace_last(svg_name,".svg",".png");
- im.demultiply();
- mapnik::save_to_file<mapnik::image_data_32>(im.data(),svg_name,"png");
- if (auto_open)
- {
- std::ostringstream s;
-#ifdef DARWIN
- s << "open " << svg_name;
-#else
- s << "xdg-open " << svg_name;
-#endif
- int ret = system(s.str().c_str());
- if (ret != 0)
- return_value = ret;
- }
- std::clog << "rendered to: " << svg_name << "\n";
+ std::shared_ptr<mapnik::marker const> marker = mapnik::marker_cache::instance().find(svg_name, false);
+ main_marker_visitor visitor(svg_name, return_value, verbose, auto_open);
+ mapnik::util::apply_visitor(visitor, *marker);
}
}
catch (...)
diff --git a/utils/upgrade_map_xml/build.py b/utils/upgrade_map_xml/build.py
deleted file mode 100644
index 648130f..0000000
--- a/utils/upgrade_map_xml/build.py
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-# This file is part of Mapnik (c++ mapping toolkit)
-#
-# Copyright (C) 2013 Artem Pavlenko
-#
-# Mapnik is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-#
-#
-
-import os
-Import ('env')
-
-target = os.path.join(env['INSTALL_PREFIX'],'bin')
-
-if 'uninstall' not in COMMAND_LINE_TARGETS:
- env.Install(target,'upgrade_map_xml.py')
- env.Alias('install', os.path.join(env['INSTALL_PREFIX'],'bin'))
-
-env['create_uninstall_target'](env, os.path.join(target,'upgrade_map_xml.py'))
diff --git a/utils/upgrade_map_xml/upgrade_map_xml.py b/utils/upgrade_map_xml/upgrade_map_xml.py
deleted file mode 100755
index f69131b..0000000
--- a/utils/upgrade_map_xml/upgrade_map_xml.py
+++ /dev/null
@@ -1,275 +0,0 @@
-#!/usr/bin/env python
-
-import os
-import re
-import sys
-import optparse
-import tempfile
-
-__version__ = '0.1.0'
-
-HAS_LXML = False
-
-try:
- import lxml.etree as etree
- HAS_LXML = True
-except ImportError:
- try:
- import elementtree.ElementTree as etree
- except ImportError:
- import xml.etree.ElementTree as etree
-
-def color_text(color, text):
- if os.name == 'nt':
- return text
- return "\033[9%sm%s\033[0m" % (color,text)
-
-def indent(elem, level=0):
- """ http://infix.se/2007/02/06/gentlemen-indent-your-xml
- """
- i = "\n" + level*" "
- if len(elem):
- if not elem.text or not elem.text.strip():
- elem.text = i + " "
- for e in elem:
- indent(e, level+1)
- if not e.tail or not e.tail.strip():
- e.tail = i + " "
- if not e.tail or not e.tail.strip():
- e.tail = i
- else:
- if level and (not elem.tail or not elem.tail.strip()):
- elem.tail = i
-
-def name2expr(sym):
- if 'name' not in sym.attrib: return
- name = sym.attrib['name']
- if re.match('^\[.*\]',name) is None \
- and '[' not in name \
- and ']' not in name \
- and not name.startswith("'") \
- and not name.endswith("'") \
- and re.match("^\'.*\'",name) is None:
- print>>sys.stderr,"Fixing %s" % name
- name = '[%s]' % name
- sym.attrib.pop('name')
- sym.text = name
-
-def handle_attr_changes(sym):
- # http://www.w3schools.com/css/pr_text_text-transform.asp
- # http://code.google.com/p/mapnik-utils/issues/detail?id=32&colspec=ID%20Type%20Status%20Priority%20Component%20Owner%20Summary
- text_convert = sym.attrib.get('text_convert',sym.attrib.get('text_transform',sym.attrib.get('text_transform')))
- if text_convert:
- # note: css supports text-transform:capitalize but Mapnik does not (yet)
- t_ = {'tolower':'lowercase','toupper':'uppercase','none':'none'}
- new = t_.get(text_convert)
- if new:
- sym.attrib['text-transform'] = new
- else:
- sym.attrib['text-transform'] = text_convert
- if sym.attrib.get('text_convert'):
- sym.attrib.pop('text_convert')
- if sym.attrib.get('text_transform'):
- sym.attrib.pop('text_transform')
-
- # https://github.com/mapnik/mapnik/issues/807
- justify_alignment = sym.attrib.get('justify_alignment',sym.attrib.get('justify-alignment'))
- if justify_alignment and justify_alignment == "middle":
- sym.attrib['justify-alignment'] = 'center'
-
- minimum_distance = sym.attrib.get('min_distance')
- if minimum_distance:
- sym.attrib['minimum-distance'] = minimum_distance
- sym.attrib.pop('min_distance')
-
- minimum_padding = sym.attrib.get('min_padding')
- if minimum_padding:
- sym.attrib['minimum-padding'] = minimum_padding
- sym.attrib.pop('min_padding')
-
-def fixup_sym_with_image(sym):
- if sym.attrib.get('width'):
- sym.attrib.pop('width')
- if sym.attrib.get('height'):
- sym.attrib.pop('height')
- if sym.attrib.get('type'):
- sym.attrib.pop('type')
-
-def fixup_sym_attributes(sym):
- if len(sym.findall('CssParameter')):
- # copy, so we don't loose after clear()
- attrib = dict(sym.attrib)
- for css in sym.findall('CssParameter'):
- key = css.attrib.get('name')
- value = css.text
- attrib[key] = value
- sym.clear() # remove CssParameter elements
- for k,v in attrib.items(): # insert attributes instead
- sym.attrib[k] = v
-
-def underscore2dash(elem):
- for i in elem.attrib.items():
- if '_' in i[0]:
- new = i[0].replace('_','-')
- old = i[0]
- elem.attrib[new] = i[1]
- elem.attrib.pop(old)
- print>>sys.stderr,"Changing %s to %s" % (old,new)
-
-
-def upgrade(input_xml,output_xml=None,indent_xml=True):
-
- if not os.path.exists(input_xml):
- sys.stderr.write('input xml "%s" does not exist' % input_xml)
- sys.exit(1)
-
- pre_read = open(input_xml,'r')
- if '!ENTITY' in pre_read.read() and not HAS_LXML:
- sys.stderr.write('\nSorry, it appears the xml you are trying to upgrade has entities, which requires lxml (python bindings to libxml2)\n')
- sys.stderr.write('Install lxml with: "easy_install lxml" or download from http://codespeak.net/lxml/\n')
-
- sys.exit(1)
-
- try:
- tree = etree.parse(input_xml)
- except:
- print 'Could not parse "%s" invalid XML' % input_xml
- return
-
- if hasattr(tree,'xinclude'):
- tree.xinclude()
- root = tree.getroot()
-
- # rename 'bgcolor' to 'background-color'
- if root.attrib.get('bgcolor'):
- root.attrib['background-color'] = root.attrib.get('bgcolor')
- root.attrib.pop('bgcolor')
-
- # underscores to spaces for <Map ..>
- underscore2dash(root)
-
- root.set('minimum-version', '0.7.2')
-
- # underscores to spaces for <FontSet ..>
- fontset = root.findall('FontSet') or root.findall('*/FontSet')
- for f in fontset:
- font = f.findall('Font')
- for f_ in font:
- underscore2dash(f_)
-
- # underscores to spaces for <Layer ..>
- layers = root.findall('Layer') or root.findall('*/Layer')
- for l in layers:
- underscore2dash(l)
-
-
- styles = root.findall('Style') or root.findall('*/Style')
- if not len(styles):
- sys.stderr.write('### Warning, no styles encountered and nothing able to be upgraded!\n')
- else:
- for style in styles:
- for rule in style.findall('Rule'):
- for sym in rule.findall('TextSymbolizer') or []:
- name2expr(sym)
- handle_attr_changes(sym)
- fixup_sym_attributes(sym)
- underscore2dash(sym)
- for sym in rule.findall('ShieldSymbolizer') or []:
- name2expr(sym)
- handle_attr_changes(sym)
- fixup_sym_attributes(sym)
- underscore2dash(sym)
- fixup_sym_with_image(sym)
- for sym in rule.findall('PointSymbolizer') or []:
- fixup_sym_with_image(sym)
- fixup_sym_attributes(sym)
- underscore2dash(sym)
- for sym in rule.findall('PolygonPatternSymbolizer') or []:
- fixup_sym_with_image(sym)
- fixup_sym_attributes(sym)
- underscore2dash(sym)
- for sym in rule.findall('LinePatternSymbolizer') or []:
- fixup_sym_with_image(sym)
- fixup_sym_attributes(sym)
- underscore2dash(sym)
- for sym in rule.findall('LineSymbolizer') or []:
- fixup_sym_attributes(sym)
- underscore2dash(sym)
- for sym in rule.findall('PolygonSymbolizer') or []:
- fixup_sym_attributes(sym)
- underscore2dash(sym)
- for sym in rule.findall('RasterSymbolizer') or []:
- fixup_sym_attributes(sym)
- underscore2dash(sym)
- for sym in rule.findall('BuildingSymbolizer') or []:
- fixup_sym_attributes(sym)
- underscore2dash(sym)
- for sym in rule.findall('MarkersSymbolizer') or []:
- fixup_sym_attributes(sym)
- underscore2dash(sym)
-
- if indent_xml:
- indent(root)
-
- if output_xml:
- tree.write(output_xml)
- else:
- tree.write(input_xml)
-
-parser = optparse.OptionParser(usage="""%prog <input xml> [options]
-
-Upgrade a Mapnik XML stylesheet to Mapnik 2.0
-
-Full help:
- $ %prog -h (or --help for possible options)
-
-Read 'map.xml' and write new 'map2.xml'
- $ %prog map.xml map2.xml
-
-Update 'map.xml' in place (*Careful*)
- $ %prog map.xml --in-place
-
-""", version='%prog ' + __version__)
-
-parser.add_option('--indent',
- dest='indent_xml',
- action='store_true',
- default=False,
- help='Indent the resulting XML')
-
-parser.add_option('--in-place',
- dest='update_in_place',
- action='store_true',
- default=False,
- help='Update and overwrite the map in place')
-
-if __name__ == "__main__":
-
- (options, args) = parser.parse_args()
- if not len(args) > 0:
- parser.error("Please provide the path to a map.xml and a new xml to write")
-
- input_xml = args[0]
- output_xml = None
-
- if len(args) < 3 and not options.update_in_place:
- if len(args) == 2:
- output_xml = args[1]
-
- if (len(args) == 1) or (input_xml == output_xml):
- parser.error(color_text(1,'\n\nAre you sure you want to overwrite "%s"?\nIf so, then pass --in-place to confirm.\nOtherwise pass a different filename to write an upgraded copy to.\n' % input_xml))
-
- print 'Upgrading "%s" to "%s"...' % (input_xml,output_xml)
- upgrade(input_xml,output_xml=output_xml,indent_xml=options.indent_xml)
-
- elif len(args) == 1:
- print 'Upgrading "%s"...' % (input_xml)
- upgrade(input_xml,output_xml=output_xml,indent_xml=options.indent_xml)
-
- elif len(args) > 1: # assume a list of inputs
- found = []
- for input_xml in args:
- if os.path.exists(input_xml) and input_xml not in found:
- print 'Upgrading "%s" in place...' % input_xml
- found.append(input_xml)
- upgrade(input_xml,output_xml=None,indent_xml=options.indent_xml)
diff --git a/utils/upgrade_map_xml/upgrade_map_xml_keep_ent.py b/utils/upgrade_map_xml/upgrade_map_xml_keep_ent.py
deleted file mode 100755
index 31885c0..0000000
--- a/utils/upgrade_map_xml/upgrade_map_xml_keep_ent.py
+++ /dev/null
@@ -1,194 +0,0 @@
-#!/usr/bin/env python
-import os
-import sys
-from lxml import etree
-from lxml import objectify
-import re
-import StringIO
-
-# APPROACH:
-# There is no way get the original DOCTYPE declaration with lxml, thus
-# first I have to get it with regular expressions, after updating
-# the xml it is appended under the xml declaration
-#
-# A dummy_map tree is created to resolve some layers entities.
-#
-# That is, the script looks into the includes folder and resolves the layer
-# entities manually to append them at the end of the xml tree
-# and update them.
-
-# NOTE: It will only resolve entities that are declared like
-# <!ENTITY layer{-amenity-symbols} SYSTEM "layer-amenity-symbols.xml.inc">
-#
-# If your entity name starts with `layer', the script will try to
-# find a file where to extract from the layers to be updated
-dummy_map = """
-<Map>
-%s
-</Map>
-"""
-
-def name2expr(sym):
- if 'name' not in sym.attrib: return
- name = sym.attrib['name']
- if re.match('^\[.*\]$',name) is None \
- and '[' not in name \
- and ']' not in name \
- and not name.startswith("'") \
- and not name.endswith("'") \
- and re.match("^\'.*\'",name) is None:
- print >> sys.stderr,"Fixing %s" % name
- name = '[%s]' % name
- sym.attrib.pop('name')
- sym._setText(name)
-
-def fixup_pointsym(sym):
- if sym.attrib.get('width'):
- sym.attrib.pop('width')
- if sym.attrib.get('height'):
- sym.attrib.pop('height')
- if sym.attrib.get('type'):
- sym.attrib.pop('type')
-
-def fixup_sym_attributes(sym):
- if not hasattr(sym,'CssParameter'):
- return
- attrib = {}
- for css in sym.CssParameter:
- key = css.attrib.get('name')
- value = css.text
- attrib[key] = value
- sym.clear() # remove CssParameter elements
- for k,v in attrib.items(): # insert attributes instead
- sym.attrib[k] = v
-
-
-if __name__ == "__main__":
-
- # Required parameters:
- # map_xml_file: outdated stylesheet file
- # output_file: new stylesheet file
- # includes folder
-
- if len(sys.argv) < 4:
- print >> sys.stderr,'Usage: %s <map_xml_file> <output_file> <includes_folder>' % sys.argv[0]
- sys.exit(1)
- xml = sys.argv[1]
-
- if sys.argv[3] is not None:
- includes_folder = sys.argv[3]
-
- # Get the good doctype with the unresolved external entities
- # since it is forever lost once the xml is parsed
- file = open(xml, 'r')
- xml_string = file.read()
- file.close()
- match = re.match(r'(?ims).*DOCTYPE.*\[.*\]\>', xml_string)
- good_doctype = ""
- if match:
- good_doctype = match.group()
-
- # Two trees. One with the unresolved entities...
- parser = objectify.makeparser(resolve_entities=False)
- # tree = objectify.parse(xml, parser=parser)
- # root = tree.getroot()
-
- # ...and another with the entities resolved.
- # This dummy tree expands the entities that I found and puts them
- # in a dictionary (entity) => resolved_entity
- # NOTE: `findall' makes the script very slow
-
- # First get the entities declared in the header
- temp_xml = ''.join([good_doctype, dummy_map % '<dummy_tag></dummy_tag>'])
- expanded_tree = objectify.parse(StringIO.StringIO(temp_xml))
- expanded_tree_string = etree.tostring(expanded_tree,
- pretty_print=True,
- xml_declaration=True,
- encoding="utf-8")
- match = re.match(r'(?ims).*DOCTYPE.*\[.*\]\>', expanded_tree_string)
- resolved_doctype = ""
- if match:
- resolved_doctype = match.group()
-
- doctype_entities = {}
- # e.g.:
- # <!ENTITY layer-amenity-symbols SYSTEM "layer-amenity-symbols.xml.inc">
- for line in StringIO.StringIO(resolved_doctype).readlines():
- entity_kv = re.match(r'(?ims)(.*ENTITY.*?(?P<entity_key>\b[a-z09].*?\b) .*\"(?P<entity_value>.*)\").*', line)
- # Only consider internal entities
- if (entity_kv is not None) and not (re.search("%", line)):
- doctype_entities[''.join(['&',entity_kv.groupdict()['entity_key']])] = entity_kv.groupdict()['entity_value']
-
- layer_entities = []
- for entity in doctype_entities:
- if re.search('layer', entity):
- layer_entities.append(entity)
-
-
- # Remove the layer entities
- fixed_xml_string = xml_string
- for layer in layer_entities:
- pattern = '(?ims)%s;' % layer
- fixed_xml_string = re.sub(pattern, '', fixed_xml_string)
- print "removed ", layer
-
- # Tree to be updated to be mapnik compliant
- tree = objectify.parse(StringIO.StringIO(fixed_xml_string), parser=parser)
- root = tree.getroot()
-
- for layer in layer_entities:
- file = open("%s/%s" % (includes_folder, doctype_entities[layer]))
- layer_xml_string = file.read()
- file.close()
-
- print "Found this layer:", layer
- # Parse without resolving entities
- layer_xml = ''.join([good_doctype, dummy_map % layer_xml_string])
- layer_tree = objectify.parse(StringIO.StringIO(layer_xml), parser=parser)
- layer_root = layer_tree.getroot()
- layer_children = layer_root.getchildren()
- # Append this layer's styles and layers to the tree to be updated
- # print layer_children
- root.extend(layer_children)
-
- # Update the styles
- for style in root.Style:
- if len(style.Rule):
- # fix [name] thing
- for rule in style.Rule:
- if hasattr(rule,'TextSymbolizer'):
- for sym in rule.TextSymbolizer:
- name2expr(sym)
- if hasattr(rule,'ShieldSymbolizer'):
- for sym in rule.ShieldSymbolizer:
- name2expr(sym)
- if hasattr(rule,'PointSymbolizer'):
- for sym in rule.PointSymbolizer:
- fixup_pointsym(sym)
- if hasattr(rule,'LineSymbolizer') :
- for sym in rule.LineSymbolizer:
- fixup_sym_attributes(sym)
- if hasattr(rule,'PolygonSymbolizer') :
- for sym in rule.PolygonSymbolizer:
- fixup_sym_attributes(sym)
- if hasattr(rule,'RasterSymbolizer') :
- for sym in rule.RasterSymbolizer:
- fixup_sym_attributes(sym)
- if hasattr(rule,'BuildingSymbolizer') :
- for sym in rule.BuildingSymbolizer:
- fixup_sym_attributes(sym)
-
- updated_xml = etree.tostring(tree,
- pretty_print=True,
- xml_declaration=True,
- encoding="utf-8",
- standalone=True)
-
- # Insert the original doctype declaration
- fixed_updated_xml = re.sub(r'(?ims)^.*DOCTYPE.*\[.*\]\>', good_doctype, updated_xml)
-
- output_file = open(sys.argv[2], 'w')
- output_file.write(fixed_updated_xml)
- output_file.close()
-
- # print fixed_updated_xml
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/mapnik.git
More information about the Pkg-grass-devel
mailing list